• Home
  • History
  • Annotate
  • Line#
  • Navigate
  • Raw
  • Download
  • only in /netgear-R7000-V1.0.7.12_1.2.5/components/opensource/linux/linux-2.6.36/arch/arm/plat-omap/include/plat/
1/*
2 * omap iommu: simple virtual address space management
3 *
4 * Copyright (C) 2008-2009 Nokia Corporation
5 *
6 * Written by Hiroshi DOYU <Hiroshi.DOYU@nokia.com>
7 *
8 * This program is free software; you can redistribute it and/or modify
9 * it under the terms of the GNU General Public License version 2 as
10 * published by the Free Software Foundation.
11 */
12
13#ifndef __IOMMU_MMAP_H
14#define __IOMMU_MMAP_H
15
16struct iovm_struct {
17	struct iommu		*iommu;	/* iommu object which this belongs to */
18	u32			da_start; /* area definition */
19	u32			da_end;
20	u32			flags; /* IOVMF_: see below */
21	struct list_head	list; /* linked in ascending order */
22	const struct sg_table	*sgt; /* keep 'page' <-> 'da' mapping */
23	void			*va; /* mpu side mapped address */
24};
25
26/*
27 * IOVMF_FLAGS: attribute for iommu virtual memory area(iovma)
28 *
29 * lower 16 bit is used for h/w and upper 16 bit is for s/w.
30 */
31#define IOVMF_SW_SHIFT		16
32#define IOVMF_HW_SIZE		(1 << IOVMF_SW_SHIFT)
33#define IOVMF_HW_MASK		(IOVMF_HW_SIZE - 1)
34#define IOVMF_SW_MASK		(~IOVMF_HW_MASK)UL
35
36/*
37 * iovma: h/w flags derived from cam and ram attribute
38 */
39#define IOVMF_CAM_MASK		(~((1 << 10) - 1))
40#define IOVMF_RAM_MASK		(~IOVMF_CAM_MASK)
41
42#define IOVMF_PGSZ_MASK		(3 << 0)
43#define IOVMF_PGSZ_1M		MMU_CAM_PGSZ_1M
44#define IOVMF_PGSZ_64K		MMU_CAM_PGSZ_64K
45#define IOVMF_PGSZ_4K		MMU_CAM_PGSZ_4K
46#define IOVMF_PGSZ_16M		MMU_CAM_PGSZ_16M
47
48#define IOVMF_ENDIAN_MASK	(1 << 9)
49#define IOVMF_ENDIAN_BIG	MMU_RAM_ENDIAN_BIG
50#define IOVMF_ENDIAN_LITTLE	MMU_RAM_ENDIAN_LITTLE
51
52#define IOVMF_ELSZ_MASK		(3 << 7)
53#define IOVMF_ELSZ_8		MMU_RAM_ELSZ_8
54#define IOVMF_ELSZ_16		MMU_RAM_ELSZ_16
55#define IOVMF_ELSZ_32		MMU_RAM_ELSZ_32
56#define IOVMF_ELSZ_NONE		MMU_RAM_ELSZ_NONE
57
58#define IOVMF_MIXED_MASK	(1 << 6)
59#define IOVMF_MIXED		MMU_RAM_MIXED
60
61/*
62 * iovma: s/w flags, used for mapping and umapping internally.
63 */
64#define IOVMF_MMIO		(1 << IOVMF_SW_SHIFT)
65#define IOVMF_ALLOC		(2 << IOVMF_SW_SHIFT)
66#define IOVMF_ALLOC_MASK	(3 << IOVMF_SW_SHIFT)
67
68/* "superpages" is supported just with physically linear pages */
69#define IOVMF_DISCONT		(1 << (2 + IOVMF_SW_SHIFT))
70#define IOVMF_LINEAR		(2 << (2 + IOVMF_SW_SHIFT))
71#define IOVMF_LINEAR_MASK	(3 << (2 + IOVMF_SW_SHIFT))
72
73#define IOVMF_DA_FIXED		(1 << (4 + IOVMF_SW_SHIFT))
74#define IOVMF_DA_ANON		(2 << (4 + IOVMF_SW_SHIFT))
75#define IOVMF_DA_MASK		(3 << (4 + IOVMF_SW_SHIFT))
76
77
78extern struct iovm_struct *find_iovm_area(struct iommu *obj, u32 da);
79extern u32 iommu_vmap(struct iommu *obj, u32 da,
80			const struct sg_table *sgt, u32 flags);
81extern struct sg_table *iommu_vunmap(struct iommu *obj, u32 da);
82extern u32 iommu_vmalloc(struct iommu *obj, u32 da, size_t bytes,
83			   u32 flags);
84extern void iommu_vfree(struct iommu *obj, const u32 da);
85extern u32 iommu_kmap(struct iommu *obj, u32 da, u32 pa, size_t bytes,
86			u32 flags);
87extern void iommu_kunmap(struct iommu *obj, u32 da);
88extern u32 iommu_kmalloc(struct iommu *obj, u32 da, size_t bytes,
89			   u32 flags);
90extern void iommu_kfree(struct iommu *obj, u32 da);
91
92extern void *da_to_va(struct iommu *obj, u32 da);
93
94#endif /* __IOMMU_MMAP_H */
95