m4u_priv.h 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353
  1. #ifndef __M4U_PRIV_H__
  2. #define __M4U_PRIV_H__
  3. #include <linux/ioctl.h>
  4. #include <linux/fs.h>
  5. #include <aee.h>
  6. #include <linux/debugfs.h>
  7. #include <linux/platform_device.h>
  8. #include <linux/miscdevice.h>
  9. #if defined(CONFIG_TRUSTONIC_TEE_SUPPORT) && defined(CONFIG_MTK_SEC_VIDEO_PATH_SUPPORT)
  10. #define M4U_TEE_SERVICE_ENABLE
  11. #endif
  12. #include "m4u.h"
  13. #include "m4u_reg.h"
  14. #include "../2.0/m4u_pgtable.h"
  15. #include "m4u_platform.h"
  16. #define M4UMSG(string, args...) pr_err("M4U"string, ##args)
  17. #define M4UINFO(string, args...) pr_debug("M4U"string, ##args)
  18. #include "m4u_hw.h"
  19. /* #define M4U_FPGAPORTING */
  20. #define M4U_PROFILE
  21. #define M4U_DVT 0
  22. #ifndef M4U_PROFILE
  23. #define MMProfileLogEx(...)
  24. #define MMProfileEnable(...)
  25. #define MMProfileStart(...)
  26. #define MMP_Event unsigned int
  27. #else
  28. #include <mmprofile.h>
  29. extern void MMProfileEnable(int enable);
  30. extern void MMProfileStart(int start);
  31. #endif
  32. #ifndef dmac_map_area
  33. #define dmac_map_area __dma_map_area
  34. #endif
  35. #ifndef dmac_unmap_area
  36. #define dmac_unmap_area __dma_unmap_area
  37. #endif
  38. #ifndef dmac_flush_range
  39. #define dmac_flush_range __dma_flush_range
  40. #endif
  41. #ifndef outer_clean_all
  42. #define outer_clean_all(...)
  43. #endif
  44. #ifndef outer_flush_all
  45. #define outer_flush_all(...)
  46. #endif
  47. #ifdef M4U_FPGAPORTING
  48. #define enable_clock(...)
  49. #define disable_clock(...)
  50. #define smp_inner_dcache_flush_all(...)
  51. #define register_larb_monitor(...)
  52. #endif
  53. #ifdef CONFIG_MTK_CLKMGR
  54. #include <mach/mt_clkmgr.h>
  55. #else
  56. #include <linux/clk.h>
  57. #endif
  58. #if !defined(CONFIG_MTK_CLKMGR)
  59. enum {
  60. SMI_COMMON_CLK,
  61. DISP0_SMI_LARB0_CLK,
  62. VDEC0_VDEC_CLK,
  63. VDEC1_LARB_CLK,
  64. LARB2_SMI_CLK,
  65. VENC_VENC_CLK,
  66. VENC_LARB_CLK,
  67. SMI_CLK_NUM,
  68. };
  69. #endif /* !defined(CONFIG_MTK_CLKMGR) */
  70. struct m4u_device {
  71. struct miscdevice dev;
  72. struct proc_dir_entry *m4u_dev_proc_entry;
  73. struct device *pDev[TOTAL_M4U_NUM];
  74. struct dentry *debug_root;
  75. unsigned long m4u_base[TOTAL_M4U_NUM];
  76. unsigned int irq_num[TOTAL_M4U_NUM];
  77. #if !defined(CONFIG_MTK_CLKMGR)
  78. struct clk *infra_m4u;
  79. struct clk *smi_clk[SMI_CLK_NUM];
  80. #endif
  81. };
  82. typedef struct {
  83. imu_pgd_t *pgd;
  84. dma_addr_t pgd_pa;
  85. struct mutex pgtable_mutex;
  86. unsigned int pgsize_bitmap;
  87. } m4u_domain_t;
  88. typedef struct {
  89. struct list_head link;
  90. unsigned long va;
  91. unsigned int mva;
  92. unsigned int size;
  93. M4U_PORT_ID port;
  94. unsigned int prot;
  95. unsigned int flags;
  96. struct sg_table *sg_table;
  97. unsigned int mva_align;
  98. unsigned int size_align;
  99. int seq_id;
  100. unsigned long mapped_kernel_va_for_debug;
  101. } m4u_buf_info_t;
  102. typedef struct _M4U_MAU {
  103. M4U_PORT_ID port;
  104. bool write;
  105. unsigned int mva;
  106. unsigned int size;
  107. bool enable;
  108. bool force;
  109. } M4U_MAU_STRUCT;
  110. typedef struct _M4U_TF {
  111. M4U_PORT_ID port;
  112. bool fgEnable;
  113. } M4U_TF_STRUCT;
  114. /* ================================ */
  115. /* === define in m4u_mva.c========= */
  116. typedef int (mva_buf_fn_t)(void *priv, unsigned int mva_start, unsigned int mva_end, void *data);
  117. void m4u_mvaGraph_init(void *priv_reserve);
  118. void m4u_mvaGraph_dump_raw(void);
  119. void m4u_mvaGraph_dump(void);
  120. void *mva_get_priv_ext(unsigned int mva);
  121. int mva_foreach_priv(mva_buf_fn_t *fn, void *data);
  122. void *mva_get_priv(unsigned int mva);
  123. unsigned int m4u_do_mva_alloc(unsigned long va, unsigned int size, void *priv);
  124. unsigned int m4u_do_mva_alloc_fix(unsigned int mva, unsigned int size, void *priv);
  125. int m4u_do_mva_free(unsigned int mva, unsigned int size);
  126. /* ================================= */
  127. /* ==== define in m4u_pgtable.c===== */
  128. void m4u_dump_pgtable(m4u_domain_t *domain, struct seq_file *seq);
  129. void m4u_dump_pte_nolock(m4u_domain_t *domain, unsigned int mva);
  130. int m4u_pte_invalid(m4u_domain_t *domain, unsigned int mva);
  131. void m4u_dump_pte(m4u_domain_t *domain, unsigned int mva);
  132. int m4u_pgtable_init(struct m4u_device *m4u_dev, m4u_domain_t *m4u_domain);
  133. int m4u_map_4K(m4u_domain_t *m4u_domain, unsigned int mva, unsigned long pa, unsigned int prot);
  134. int m4u_clean_pte(m4u_domain_t *domain, unsigned int mva, unsigned int size);
  135. unsigned long m4u_get_pte(m4u_domain_t *domain, unsigned int mva);
  136. /* ================================= */
  137. /* ==== define in m4u_hw.c ===== */
  138. void m4u_invalid_tlb_by_range(m4u_domain_t *m4u_domain, unsigned int mva_start, unsigned int mva_end);
  139. m4u_domain_t *m4u_get_domain_by_port(M4U_PORT_ID port);
  140. m4u_domain_t *m4u_get_domain_by_id(int id);
  141. int m4u_get_domain_nr(void);
  142. int m4u_reclaim_notify(int port, unsigned int mva, unsigned int size);
  143. int m4u_hw_init(struct m4u_device *m4u_dev, int m4u_id);
  144. int m4u_hw_deinit(struct m4u_device *m4u_dev, int m4u_id);
  145. int m4u_reg_backup(void);
  146. int m4u_reg_restore(void);
  147. int m4u_insert_seq_range(M4U_PORT_ID port, unsigned int MVAStart, unsigned int MVAEnd);
  148. int m4u_invalid_seq_range_by_id(int port, int seq_id);
  149. void m4u_print_port_status(struct seq_file *seq, int only_print_active);
  150. int m4u_dump_main_tlb(int m4u_id, int m4u_slave_id);
  151. int m4u_dump_pfh_tlb(int m4u_id);
  152. int m4u_domain_init(struct m4u_device *m4u_dev, void *priv_reserve);
  153. int config_mau(M4U_MAU_STRUCT mau);
  154. int m4u_enable_tf(int port, bool fgenable);
  155. extern int gM4U_4G_DRAM_Mode;
  156. /* ================================= */
  157. /* ==== define in m4u.c ===== */
  158. int m4u_dump_buf_info(struct seq_file *seq);
  159. int m4u_map_sgtable(m4u_domain_t *m4u_domain, unsigned int mva,
  160. struct sg_table *sg_table, unsigned int size, unsigned int prot);
  161. int m4u_unmap(m4u_domain_t *domain, unsigned int mva, unsigned int size);
  162. void m4u_get_pgd(m4u_client_t *client, M4U_PORT_ID port, void **pgd_va, void **pgd_pa, unsigned int *size);
  163. unsigned long m4u_mva_to_pa(m4u_client_t *client, M4U_PORT_ID port, unsigned int mva);
  164. int m4u_query_mva_info(unsigned int mva, unsigned int size, unsigned int *real_mva, unsigned int *real_size);
  165. /* ================================= */
  166. /* ==== define in m4u_debug.c ===== */
  167. int m4u_debug_init(struct m4u_device *m4u_dev);
  168. static inline dma_addr_t get_sg_phys(struct scatterlist *sg)
  169. {
  170. dma_addr_t pa;
  171. pa = sg_dma_address(sg);
  172. if (pa == 0)
  173. pa = sg_phys(sg);
  174. return pa;
  175. }
  176. #define M4U_PGD_SIZE (16*1024)
  177. #define M4U_LOG_LEVEL_HIGH 3
  178. #define M4U_LOG_LEVEL_MID 2
  179. #define M4U_LOG_LEVEL_LOW 1
  180. extern int gM4U_log_level;
  181. extern int gM4U_log_to_uart;
  182. #define _M4ULOG(level, string, args...) \
  183. do {\
  184. if (level > gM4U_log_level) {\
  185. if (level > gM4U_log_to_uart)\
  186. pr_warn("M4U"string, ##args);\
  187. else\
  188. pr_err("M4U"string, ##args);\
  189. } \
  190. } while (0)
  191. #define M4ULOG_LOW(string, args...) _M4ULOG(M4U_LOG_LEVEL_LOW, string, ##args)
  192. #define M4ULOG_MID(string, args...) _M4ULOG(M4U_LOG_LEVEL_MID, string, ##args)
  193. #define M4ULOG_HIGH(string, args...) _M4ULOG(M4U_LOG_LEVEL_HIGH, string, ##args)
  194. #define M4UERR(string, args...) pr_err("M4U error: "string, ##args)
  195. /*aee_kernel_exception("M4U", "[M4U] error:"string,##args); */
  196. #define m4u_aee_print(string, args...) do {\
  197. char m4u_name[100];\
  198. snprintf(m4u_name, 100, "[M4U]"string, ##args); \
  199. aee_kernel_warning_api(__FILE__, __LINE__, DB_OPT_MMPROFILE_BUFFER | DB_OPT_DUMP_DISPLAY, \
  200. m4u_name, "[M4U] error"string, ##args); \
  201. pr_err("M4U error: "string, ##args); \
  202. } while (0)
  203. /*aee_kernel_warning(m4u_name, "[M4U] error:"string,##args); */
  204. #define M4U_PRINT_LOG_OR_SEQ(seq_file, fmt, args...) \
  205. do {\
  206. if (seq_file)\
  207. seq_printf(seq_file, fmt, ##args);\
  208. else\
  209. pr_warn(fmt, ##args);\
  210. } while (0)
  211. /* ======================================= */
  212. /* ==== other macros ============ */
  213. #define M4U_GET_PAGE_NUM(va, size) ((((va)&(PAGE_SIZE-1))+(size)+(PAGE_SIZE-1))>>12)
  214. #define M4U_PAGE_MASK 0xfffL
  215. typedef enum {
  216. M4U_MMP_ALLOC_MVA = 0,
  217. M4U_MMP_DEALLOC_MVA,
  218. M4U_MMP_CONFIG_PORT,
  219. M4U_MMP_M4U_ERROR,
  220. M4U_MMP_CACHE_SYNC,
  221. M4U_MMP_TOGGLE_CG,
  222. M4U_MMP_MAX,
  223. } M4U_MMP_TYPE;
  224. typedef struct {
  225. M4U_PORT_ID port;
  226. unsigned long BufAddr;
  227. unsigned int BufSize;
  228. unsigned int prot;
  229. unsigned int MVAStart;
  230. unsigned int MVAEnd;
  231. unsigned int flags;
  232. } M4U_MOUDLE_STRUCT;
  233. typedef struct {
  234. M4U_PORT_ID port;
  235. M4U_CACHE_SYNC_ENUM eCacheSync;
  236. unsigned long va;
  237. unsigned int size;
  238. unsigned int mva;
  239. } M4U_CACHE_STRUCT;
  240. typedef struct _M4U_DMA {
  241. M4U_PORT_ID port;
  242. M4U_DMA_TYPE eDMAType;
  243. M4U_DMA_DIR eDMADir;
  244. unsigned long va;
  245. unsigned int size;
  246. unsigned int mva;
  247. } M4U_DMA_STRUCT;
  248. /* IOCTL commnad */
  249. #define MTK_M4U_MAGICNO 'g'
  250. #define MTK_M4U_T_POWER_ON _IOW(MTK_M4U_MAGICNO, 0, int)
  251. #define MTK_M4U_T_POWER_OFF _IOW(MTK_M4U_MAGICNO, 1, int)
  252. #define MTK_M4U_T_DUMP_REG _IOW(MTK_M4U_MAGICNO, 2, int)
  253. #define MTK_M4U_T_DUMP_INFO _IOW(MTK_M4U_MAGICNO, 3, int)
  254. #define MTK_M4U_T_ALLOC_MVA _IOWR(MTK_M4U_MAGICNO, 4, int)
  255. #define MTK_M4U_T_DEALLOC_MVA _IOW(MTK_M4U_MAGICNO, 5, int)
  256. #define MTK_M4U_T_INSERT_TLB_RANGE _IOW(MTK_M4U_MAGICNO, 6, int)
  257. #define MTK_M4U_T_INVALID_TLB_RANGE _IOW(MTK_M4U_MAGICNO, 7, int)
  258. #define MTK_M4U_T_INVALID_TLB_ALL _IOW(MTK_M4U_MAGICNO, 8, int)
  259. #define MTK_M4U_T_MANUAL_INSERT_ENTRY _IOW(MTK_M4U_MAGICNO, 9, int)
  260. #define MTK_M4U_T_CACHE_SYNC _IOW(MTK_M4U_MAGICNO, 10, int)
  261. #define MTK_M4U_T_CONFIG_PORT _IOW(MTK_M4U_MAGICNO, 11, int)
  262. #define MTK_M4U_T_CONFIG_ASSERT _IOW(MTK_M4U_MAGICNO, 12, int)
  263. #define MTK_M4U_T_INSERT_WRAP_RANGE _IOW(MTK_M4U_MAGICNO, 13, int)
  264. #define MTK_M4U_T_MONITOR_START _IOW(MTK_M4U_MAGICNO, 14, int)
  265. #define MTK_M4U_T_MONITOR_STOP _IOW(MTK_M4U_MAGICNO, 15, int)
  266. #define MTK_M4U_T_RESET_MVA_RELEASE_TLB _IOW(MTK_M4U_MAGICNO, 16, int)
  267. #define MTK_M4U_T_CONFIG_PORT_ROTATOR _IOW(MTK_M4U_MAGICNO, 17, int)
  268. #define MTK_M4U_T_QUERY_MVA _IOW(MTK_M4U_MAGICNO, 18, int)
  269. #define MTK_M4U_T_M4UDrv_CONSTRUCT _IOW(MTK_M4U_MAGICNO, 19, int)
  270. #define MTK_M4U_T_M4UDrv_DECONSTRUCT _IOW(MTK_M4U_MAGICNO, 20, int)
  271. #define MTK_M4U_T_DUMP_PAGETABLE _IOW(MTK_M4U_MAGICNO, 21, int)
  272. #define MTK_M4U_T_REGISTER_BUFFER _IOW(MTK_M4U_MAGICNO, 22, int)
  273. #define MTK_M4U_T_CACHE_FLUSH_ALL _IOW(MTK_M4U_MAGICNO, 23, int)
  274. #define MTK_M4U_T_CONFIG_PORT_ARRAY _IOW(MTK_M4U_MAGICNO, 26, int)
  275. #define MTK_M4U_T_CONFIG_MAU _IOW(MTK_M4U_MAGICNO, 27, int)
  276. #define MTK_M4U_T_CONFIG_TF _IOW(MTK_M4U_MAGICNO, 28, int)
  277. #define MTK_M4U_T_DMA_OP _IOW(MTK_M4U_MAGICNO, 29, int)
  278. #define MTK_M4U_T_SEC_INIT _IOW(MTK_M4U_MAGICNO, 50, int)
  279. #ifdef M4U_TEE_SERVICE_ENABLE
  280. int m4u_config_port_tee(M4U_PORT_STRUCT *pM4uPort);
  281. int m4u_larb_backup_sec(unsigned int larb_idx);
  282. int m4u_larb_restore_sec(unsigned int larb_idx);
  283. int m4u_config_port_array_tee(unsigned char *port_array);
  284. int m4u_sec_init(void);
  285. #endif
  286. /* #include <mmprofile.h> */
  287. extern MMP_Event M4U_MMP_Events[M4U_MMP_MAX];
  288. #if !defined(CONFIG_MTK_CLKMGR)
  289. extern const char *smi_clk_name[];
  290. #endif
  291. #endif