tizen 2.4 release
[profile/mobile/platform/kernel/linux-3.10-sc7730.git] / include / linux / sprd_iommu.h
1 #ifndef _SPRD_IOMMU_H
2 #define _SPRD_IOMMU_H
3
4 #include <linux/scatterlist.h>
5 #include <linux/miscdevice.h>
6
7 #ifdef CONFIG_HAS_EARLYSUSPEND
8 #include <linux/earlysuspend.h>
9 #endif
10
11 struct sprd_iommu_init_data {
12         int id;                        /* iommu id */
13         char *name;                    /* iommu name */
14         
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;
23 };
24
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;
30         unsigned long pgt;
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;
38 #endif
39         void *private;
40         unsigned int map_count;
41         struct mutex mutex_map;
42         unsigned int div2_frq;
43         bool light_sleep_en;
44 };
45
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);
60 };
61
62 enum IOMMU_ID {
63         IOMMU_GSP = 0,
64         IOMMU_MM,
65         /*for whale iommu*/
66         IOMMU_VSP,
67         IOMMU_DCAM,
68         IOMMU_DISPC,
69         IOMMU_GSP0,
70         IOMMU_GSP1,
71         IOMMU_VPP,
72         IOMMU_MAX,
73 };
74
75 extern struct sprd_iommu_ops iommu_gsp_ops;
76 extern struct sprd_iommu_ops iommu_mm_ops;
77 /*for whale iommu*/
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;
84
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);
91 #endif