summaryrefslogtreecommitdiff
path: root/include/linux/sprd_iommu.h
diff options
context:
space:
mode:
Diffstat (limited to 'include/linux/sprd_iommu.h')
-rw-r--r--include/linux/sprd_iommu.h91
1 files changed, 91 insertions, 0 deletions
diff --git a/include/linux/sprd_iommu.h b/include/linux/sprd_iommu.h
new file mode 100644
index 00000000..884790f0
--- /dev/null
+++ b/include/linux/sprd_iommu.h
@@ -0,0 +1,91 @@
+#ifndef _SPRD_IOMMU_H
+#define _SPRD_IOMMU_H
+
+#include <linux/scatterlist.h>
+#include <linux/miscdevice.h>
+
+#ifdef CONFIG_HAS_EARLYSUSPEND
+#include <linux/earlysuspend.h>
+#endif
+
+struct sprd_iommu_init_data {
+ int id; /* iommu id */
+ char *name; /* iommu name */
+
+ unsigned long iova_base; /* io virtual address base */
+ size_t iova_size; /* io virtual address size */
+ unsigned long pgt_base; /* iommu page table base address */
+ size_t pgt_size; /* iommu page table array size */
+ unsigned long ctrl_reg; /* iommu control register */
+ unsigned long fault_page;
+ unsigned long re_route_page;
+ unsigned int iommu_rev;
+};
+
+struct sprd_iommu_dev {
+ struct miscdevice misc_dev;
+ struct sprd_iommu_init_data *init_data;
+ struct gen_pool *pool;
+ struct sprd_iommu_ops *ops;
+ unsigned long pgt;
+ struct mutex mutex_pgt;
+ struct clk* mmu_mclock;
+ struct clk* mmu_pclock;
+ struct clk* mmu_clock;
+ struct clk* mmu_axiclock;
+#ifdef CONFIG_HAS_EARLYSUSPEND
+ struct early_suspend early_suspend;
+#endif
+ void *private;
+ unsigned int map_count;
+ struct mutex mutex_map;
+ unsigned int div2_frq;
+ bool light_sleep_en;
+};
+
+struct sprd_iommu_ops {
+ int (*init)(struct sprd_iommu_dev *dev, struct sprd_iommu_init_data *data);
+ int (*exit)(struct sprd_iommu_dev *dev);
+ unsigned long (*iova_alloc)(struct sprd_iommu_dev *dev, size_t iova_length);
+ void (*iova_free)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length);
+ int (*iova_map)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length, struct sg_table *table);
+ int (*iova_unmap)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length);
+ int (*backup)(struct sprd_iommu_dev *dev);
+ int (*restore)(struct sprd_iommu_dev *dev);
+ void (*enable)(struct sprd_iommu_dev *dev);
+ void (*disable)(struct sprd_iommu_dev *dev);
+ int (*dump)(struct sprd_iommu_dev *dev, unsigned long iova, size_t iova_length);
+ void (*open)(struct sprd_iommu_dev *dev);
+ void (*release)(struct sprd_iommu_dev *dev);
+};
+
+enum IOMMU_ID {
+ IOMMU_GSP = 0,
+ IOMMU_MM,
+ /*for whale iommu*/
+ IOMMU_VSP,
+ IOMMU_DCAM,
+ IOMMU_DISPC,
+ IOMMU_GSP0,
+ IOMMU_GSP1,
+ IOMMU_VPP,
+ IOMMU_MAX,
+};
+
+extern struct sprd_iommu_ops iommu_gsp_ops;
+extern struct sprd_iommu_ops iommu_mm_ops;
+/*for whale iommu*/
+extern struct sprd_iommu_ops iommu_vsp_ops;
+extern struct sprd_iommu_ops iommu_dcam_ops;
+extern struct sprd_iommu_ops iommu_dispc_ops;
+extern struct sprd_iommu_ops iommu_gsp0_ops;
+extern struct sprd_iommu_ops iommu_gsp1_ops;
+extern struct sprd_iommu_ops iommu_vpp_ops;
+
+extern unsigned long sprd_iova_alloc(int iommu_id, unsigned long iova_length);
+extern void sprd_iova_free(int iommu_id, unsigned long iova, unsigned long iova_length);
+extern int sprd_iova_map(int iommu_id, unsigned long iova, unsigned long iova_length, struct sg_table *table);
+extern int sprd_iova_unmap(int iommu_id, unsigned long iova, unsigned long iova_length);
+extern void sprd_iommu_module_enable(uint32_t iommu_id);
+extern void sprd_iommu_module_disable(uint32_t iommu_id);
+#endif