• 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: main structures
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 __MACH_IOMMU_H
14#define __MACH_IOMMU_H
15
16struct iotlb_entry {
17	u32 da;
18	u32 pa;
19	u32 pgsz, prsvd, valid;
20	union {
21		u16 ap;
22		struct {
23			u32 endian, elsz, mixed;
24		};
25	};
26};
27
28struct iommu {
29	const char	*name;
30	struct module	*owner;
31	struct clk	*clk;
32	void __iomem	*regbase;
33	struct device	*dev;
34
35	unsigned int	refcount;
36	struct mutex	iommu_lock;	/* global for this whole object */
37
38	/*
39	 * We don't change iopgd for a situation like pgd for a task,
40	 * but share it globally for each iommu.
41	 */
42	u32		*iopgd;
43	spinlock_t	page_table_lock; /* protect iopgd */
44
45	int		nr_tlb_entries;
46
47	struct list_head	mmap;
48	struct mutex		mmap_lock; /* protect mmap */
49
50	int (*isr)(struct iommu *obj);
51
52	void *ctx; /* iommu context: registres saved area */
53};
54
55struct cr_regs {
56	union {
57		struct {
58			u16 cam_l;
59			u16 cam_h;
60		};
61		u32 cam;
62	};
63	union {
64		struct {
65			u16 ram_l;
66			u16 ram_h;
67		};
68		u32 ram;
69	};
70};
71
72struct iotlb_lock {
73	short base;
74	short vict;
75};
76
77/* architecture specific functions */
78struct iommu_functions {
79	unsigned long	version;
80
81	int (*enable)(struct iommu *obj);
82	void (*disable)(struct iommu *obj);
83	void (*set_twl)(struct iommu *obj, bool on);
84	u32 (*fault_isr)(struct iommu *obj, u32 *ra);
85
86	void (*tlb_read_cr)(struct iommu *obj, struct cr_regs *cr);
87	void (*tlb_load_cr)(struct iommu *obj, struct cr_regs *cr);
88
89	struct cr_regs *(*alloc_cr)(struct iommu *obj, struct iotlb_entry *e);
90	int (*cr_valid)(struct cr_regs *cr);
91	u32 (*cr_to_virt)(struct cr_regs *cr);
92	void (*cr_to_e)(struct cr_regs *cr, struct iotlb_entry *e);
93	ssize_t (*dump_cr)(struct iommu *obj, struct cr_regs *cr, char *buf);
94
95	u32 (*get_pte_attr)(struct iotlb_entry *e);
96
97	void (*save_ctx)(struct iommu *obj);
98	void (*restore_ctx)(struct iommu *obj);
99	ssize_t (*dump_ctx)(struct iommu *obj, char *buf, ssize_t len);
100};
101
102struct iommu_platform_data {
103	const char *name;
104	const char *clk_name;
105	const int nr_tlb_entries;
106};
107
108#if defined(CONFIG_ARCH_OMAP1)
109#error "iommu for this processor not implemented yet"
110#else
111#include <plat/iommu2.h>
112#endif
113
114/*
115 * utilities for super page(16MB, 1MB, 64KB and 4KB)
116 */
117
118#define iopgsz_max(bytes)			\
119	(((bytes) >= SZ_16M) ? SZ_16M :		\
120	 ((bytes) >= SZ_1M)  ? SZ_1M  :		\
121	 ((bytes) >= SZ_64K) ? SZ_64K :		\
122	 ((bytes) >= SZ_4K)  ? SZ_4K  :	0)
123
124#define bytes_to_iopgsz(bytes)				\
125	(((bytes) == SZ_16M) ? MMU_CAM_PGSZ_16M :	\
126	 ((bytes) == SZ_1M)  ? MMU_CAM_PGSZ_1M  :	\
127	 ((bytes) == SZ_64K) ? MMU_CAM_PGSZ_64K :	\
128	 ((bytes) == SZ_4K)  ? MMU_CAM_PGSZ_4K  : -1)
129
130#define iopgsz_to_bytes(iopgsz)				\
131	(((iopgsz) == MMU_CAM_PGSZ_16M)	? SZ_16M :	\
132	 ((iopgsz) == MMU_CAM_PGSZ_1M)	? SZ_1M  :	\
133	 ((iopgsz) == MMU_CAM_PGSZ_64K)	? SZ_64K :	\
134	 ((iopgsz) == MMU_CAM_PGSZ_4K)	? SZ_4K  : 0)
135
136#define iopgsz_ok(bytes) (bytes_to_iopgsz(bytes) >= 0)
137
138/*
139 * global functions
140 */
141extern u32 iommu_arch_version(void);
142
143extern void iotlb_cr_to_e(struct cr_regs *cr, struct iotlb_entry *e);
144extern u32 iotlb_cr_to_virt(struct cr_regs *cr);
145
146extern int load_iotlb_entry(struct iommu *obj, struct iotlb_entry *e);
147extern void iommu_set_twl(struct iommu *obj, bool on);
148extern void flush_iotlb_page(struct iommu *obj, u32 da);
149extern void flush_iotlb_range(struct iommu *obj, u32 start, u32 end);
150extern void flush_iotlb_all(struct iommu *obj);
151
152extern int iopgtable_store_entry(struct iommu *obj, struct iotlb_entry *e);
153extern size_t iopgtable_clear_entry(struct iommu *obj, u32 iova);
154
155extern struct iommu *iommu_get(const char *name);
156extern void iommu_put(struct iommu *obj);
157
158extern void iommu_save_ctx(struct iommu *obj);
159extern void iommu_restore_ctx(struct iommu *obj);
160
161extern int install_iommu_arch(const struct iommu_functions *ops);
162extern void uninstall_iommu_arch(const struct iommu_functions *ops);
163
164extern int foreach_iommu_device(void *data,
165				int (*fn)(struct device *, void *));
166
167extern ssize_t iommu_dump_ctx(struct iommu *obj, char *buf, ssize_t len);
168extern size_t dump_tlb_entries(struct iommu *obj, char *buf, ssize_t len);
169
170#endif /* __MACH_IOMMU_H */
171