4 #include <linux/scatterlist.h>
5 #include <linux/miscdevice.h>
7 #ifdef CONFIG_HAS_EARLYSUSPEND
8 #include <linux/earlysuspend.h>
11 struct sprd_iommu_init_data {
12 int id; /* iommu id */
13 char *name; /* iommu name */
15 unsigned long iova_base; /* io virtual address base */
16 size_t iova_size; /* io virtual address size */
17 unsigned long pgt_base; /* iommu page table base address */
18 size_t pgt_size; /* iommu page table array size */
19 unsigned long ctrl_reg; /* iommu control register */
20 unsigned long fault_page;
21 unsigned long re_route_page;
22 unsigned int iommu_rev;
25 struct sprd_iommu_dev {
26 struct miscdevice misc_dev;
27 struct sprd_iommu_init_data *init_data;
28 struct gen_pool *pool;
29 struct sprd_iommu_ops *ops;
31 struct mutex mutex_pgt;
32 struct clk* mmu_mclock;
33 struct clk* mmu_pclock;
34 struct clk* mmu_clock;
35 struct clk* mmu_axiclock;
36 #ifdef CONFIG_HAS_EARLYSUSPEND
37 struct early_suspend early_suspend;
40 unsigned int map_count;
41 struct mutex mutex_map;
42 unsigned int div2_frq;
46 struct sprd_iommu_ops {
47 int (*init)(struct sprd_iommu_dev *dev, struct sprd_iommu_init_data *data);
48 int (*exit)(struct sprd_iommu_dev *dev);
49 unsigned long (*iova_alloc)(struct sprd_iommu_dev *dev, size_t iova_length);
50 void (*iova_free)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length);
51 int (*iova_map)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length, struct sg_table *table);
52 int (*iova_unmap)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length);
53 int (*backup)(struct sprd_iommu_dev *dev);
54 int (*restore)(struct sprd_iommu_dev *dev);
55 void (*enable)(struct sprd_iommu_dev *dev);
56 void (*disable)(struct sprd_iommu_dev *dev);
57 int (*dump)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length);
58 void (*open)(struct sprd_iommu_dev *dev);
59 void (*release)(struct sprd_iommu_dev *dev);
75 extern struct sprd_iommu_ops iommu_gsp_ops;
76 extern struct sprd_iommu_ops iommu_mm_ops;
78 extern struct sprd_iommu_ops iommu_vsp_ops;
79 extern struct sprd_iommu_ops iommu_dcam_ops;
80 extern struct sprd_iommu_ops iommu_dispc_ops;
81 extern struct sprd_iommu_ops iommu_gsp0_ops;
82 extern struct sprd_iommu_ops iommu_gsp1_ops;
83 extern struct sprd_iommu_ops iommu_vpp_ops;
85 extern unsigned long sprd_iova_alloc(int iommu_id, unsigned long iova_length);
86 extern void sprd_iova_free(int iommu_id, unsigned long iova, unsigned long iova_length);
87 extern int sprd_iova_map(int iommu_id, unsigned long iova, unsigned long iova_length, struct sg_table *table);
88 extern int sprd_iova_unmap(int iommu_id, unsigned long iova, unsigned long iova_length);
89 extern void sprd_iommu_module_enable(uint32_t iommu_id);
90 extern void sprd_iommu_module_disable(uint32_t iommu_id);