cmdq_def.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381
  1. #ifndef __CMDQ_DEF_H__
  2. #define __CMDQ_DEF_H__
  3. #include <linux/kernel.h>
  4. #define CMDQ_DRIVER_DEVICE_NAME "mtk_cmdq"
  5. /* #define CMDQ_COMMON_ENG_SUPPORT */
  6. #ifdef CMDQ_COMMON_ENG_SUPPORT
  7. #include "cmdq_engine_common.h"
  8. #else
  9. #include "cmdq_engine.h"
  10. #endif
  11. #define CMDQ_SPECIAL_SUBSYS_ADDR (99)
  12. #define CMDQ_GPR_SUPPORT
  13. #define CMDQ_PROFILE_MARKER_SUPPORT
  14. #ifdef CMDQ_PROFILE_MARKER_SUPPORT
  15. #define CMDQ_MAX_PROFILE_MARKER_IN_TASK (5)
  16. #endif
  17. #define CMDQ_INVALID_THREAD (-1)
  18. #define CMDQ_MAX_THREAD_COUNT (16)
  19. #define CMDQ_MAX_TASK_IN_THREAD (16)
  20. #define CMDQ_MAX_READ_SLOT_COUNT (4)
  21. #define CMDQ_INIT_FREE_TASK_COUNT (8)
  22. #define CMDQ_MAX_HIGH_PRIORITY_THREAD_COUNT (7) /* Thread that are high-priority (display threads) */
  23. #define CMDQ_MIN_SECURE_THREAD_ID (12)
  24. #define CMDQ_MAX_SECURE_THREAD_COUNT (3)
  25. #define CMDQ_MAX_ERROR_COUNT (2)
  26. #define CMDQ_MAX_RETRY_COUNT (1)
  27. /* ram optimization related configuration */
  28. #ifdef CONFIG_MTK_GMO_RAM_OPTIMIZE
  29. #define CMDQ_MAX_RECORD_COUNT (100)
  30. #else
  31. #define CMDQ_MAX_RECORD_COUNT (1024)
  32. #endif
  33. #define CMDQ_INITIAL_CMD_BLOCK_SIZE (PAGE_SIZE)
  34. #define CMDQ_EMERGENCY_BLOCK_SIZE (256 * 1024) /* 256 KB command buffer */
  35. #define CMDQ_EMERGENCY_BLOCK_COUNT (4)
  36. #define CMDQ_INST_SIZE (2 * sizeof(uint32_t)) /* instruction is 64-bit */
  37. #define CMDQ_MAX_LOOP_COUNT (1000000)
  38. #define CMDQ_MAX_INST_CYCLE (27)
  39. #define CMDQ_MIN_AGE_VALUE (5)
  40. #define CMDQ_MAX_ERROR_SIZE (8 * 1024)
  41. #define CMDQ_MAX_TASK_IN_SECURE_THREAD (10)
  42. /* max value of CMDQ_THR_EXEC_CMD_CNT (value starts from 0) */
  43. #ifdef CMDQ_USE_LEGACY
  44. #define CMDQ_MAX_COOKIE_VALUE (0xFFFF)
  45. #else
  46. #define CMDQ_MAX_COOKIE_VALUE (0xFFFFFFFF)
  47. #endif
  48. #define CMDQ_ARG_A_SUBSYS_MASK (0x001F0000)
  49. #ifdef CONFIG_MTK_FPGA
  50. #define CMDQ_DEFAULT_TIMEOUT_MS (10000)
  51. #else
  52. #define CMDQ_DEFAULT_TIMEOUT_MS (1000)
  53. #endif
  54. #define CMDQ_ACQUIRE_THREAD_TIMEOUT_MS (2000)
  55. #define CMDQ_PREDUMP_TIMEOUT_MS (200)
  56. #define CMDQ_PREDUMP_RETRY_COUNT (5)
  57. #ifdef CONFIG_OF
  58. #define CMDQ_OF_SUPPORT /* enable device tree support */
  59. #else
  60. #undef CMDQ_OF_SUPPORT
  61. #endif
  62. #ifndef CONFIG_MTK_FPGA
  63. #define CMDQ_PWR_AWARE /* FPGA does not have ClkMgr */
  64. #else
  65. #undef CMDQ_PWR_AWARE
  66. #endif
  67. #ifdef CMDQ_SECURE_PATH_HW_LOCK
  68. #undef CMDQ_SECURE_PATH_NORMAL_IRQ
  69. #endif
  70. /* #define CMDQ_DUMP_GIC (0) */
  71. /* #define CMDQ_PROFILE_MMP (0) */
  72. #define CMDQ_DUMP_FIRSTERROR
  73. /* #define CMDQ_INSTRUCTION_COUNT */
  74. typedef enum CMDQ_HW_THREAD_PRIORITY_ENUM {
  75. CMDQ_THR_PRIO_SUPERLOW = 0, /* low priority monitor loop */
  76. CMDQ_THR_PRIO_NORMAL = 1, /* nomral priority */
  77. CMDQ_THR_PRIO_DISPLAY_TRIGGER = 2, /* trigger loop (enables display mutex) */
  78. /* display ESD check (every 2 secs) */
  79. #ifdef CMDQ_SPECIAL_ESD_PRIORITY
  80. CMDQ_THR_PRIO_DISPLAY_ESD = 3,
  81. #else
  82. CMDQ_THR_PRIO_DISPLAY_ESD = 4,
  83. #endif
  84. CMDQ_THR_PRIO_DISPLAY_CONFIG = 4, /* display config (every frame) */
  85. CMDQ_THR_PRIO_SUPERHIGH = 5, /* High priority monitor loop */
  86. CMDQ_THR_PRIO_MAX = 7, /* maximum possible priority */
  87. } CMDQ_HW_THREAD_PRIORITY_ENUM;
  88. typedef enum CMDQ_SCENARIO_ENUM {
  89. CMDQ_SCENARIO_JPEG_DEC = 0,
  90. CMDQ_SCENARIO_PRIMARY_DISP = 1,
  91. CMDQ_SCENARIO_PRIMARY_MEMOUT = 2,
  92. CMDQ_SCENARIO_PRIMARY_ALL = 3,
  93. CMDQ_SCENARIO_SUB_DISP = 4,
  94. CMDQ_SCENARIO_SUB_MEMOUT = 5,
  95. CMDQ_SCENARIO_SUB_ALL = 6,
  96. CMDQ_SCENARIO_MHL_DISP = 7,
  97. CMDQ_SCENARIO_RDMA0_DISP = 8,
  98. CMDQ_SCENARIO_RDMA0_COLOR0_DISP = 9,
  99. CMDQ_SCENARIO_RDMA1_DISP = 10,
  100. /* Trigger loop scenario does not enable HWs */
  101. CMDQ_SCENARIO_TRIGGER_LOOP = 11,
  102. /* client from user space, so the cmd buffer is in user space. */
  103. CMDQ_SCENARIO_USER_MDP = 12,
  104. CMDQ_SCENARIO_DEBUG = 13,
  105. CMDQ_SCENARIO_DEBUG_PREFETCH = 14,
  106. /* ESD check */
  107. CMDQ_SCENARIO_DISP_ESD_CHECK = 15,
  108. /* for screen capture to wait for RDMA-done without blocking config thread */
  109. CMDQ_SCENARIO_DISP_SCREEN_CAPTURE = 16,
  110. /* notifiy there are some tasks exec done in secure path */
  111. CMDQ_SCENARIO_SECURE_NOTIFY_LOOP = 17,
  112. CMDQ_SCENARIO_DISP_PRIMARY_DISABLE_SECURE_PATH = 18,
  113. CMDQ_SCENARIO_DISP_SUB_DISABLE_SECURE_PATH = 19,
  114. /* color path request from kernel */
  115. CMDQ_SCENARIO_DISP_COLOR = 20,
  116. /* color path request from user sapce */
  117. CMDQ_SCENARIO_USER_DISP_COLOR = 21,
  118. /* [phased out]client from user space, so the cmd buffer is in user space. */
  119. CMDQ_SCENARIO_USER_SPACE = 22,
  120. CMDQ_SCENARIO_DISP_MIRROR_MODE = 23,
  121. CMDQ_SCENARIO_DISP_CONFIG_AAL = 24,
  122. CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_GAMMA = 25,
  123. CMDQ_SCENARIO_DISP_CONFIG_SUB_GAMMA = 26,
  124. CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_DITHER = 27,
  125. CMDQ_SCENARIO_DISP_CONFIG_SUB_DITHER = 28,
  126. CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PWM = 29,
  127. CMDQ_SCENARIO_DISP_CONFIG_SUB_PWM = 30,
  128. CMDQ_SCENARIO_DISP_CONFIG_PRIMARY_PQ = 31,
  129. CMDQ_SCENARIO_DISP_CONFIG_SUB_PQ = 32,
  130. CMDQ_SCENARIO_DISP_CONFIG_OD = 33,
  131. CMDQ_SCENARIO_RDMA2_DISP = 34,
  132. CMDQ_SCENARIO_HIGHP_TRIGGER_LOOP = 35, /* for primary trigger loop enable pre-fetch usage */
  133. CMDQ_SCENARIO_LOWP_TRIGGER_LOOP = 36, /* for low priority monitor loop to polling bus status*/
  134. CMDQ_SCENARIO_KERNEL_CONFIG_GENERAL = 37,
  135. CMDQ_MAX_SCENARIO_COUNT /* ALWAYS keep at the end */
  136. } CMDQ_SCENARIO_ENUM;
  137. typedef enum CMDQ_DATA_REGISTER_ENUM {
  138. /* Value Reg, we use 32-bit */
  139. /* Address Reg, we use 64-bit */
  140. /* Note that R0-R15 and P0-P7 actullay share same memory */
  141. /* and R1 cannot be used. */
  142. CMDQ_DATA_REG_JPEG = 0x00, /* R0 */
  143. CMDQ_DATA_REG_JPEG_DST = 0x11, /* P1 */
  144. CMDQ_DATA_REG_PQ_COLOR = 0x04, /* R4 */
  145. CMDQ_DATA_REG_PQ_COLOR_DST = 0x13, /* P3 */
  146. CMDQ_DATA_REG_2D_SHARPNESS_0 = 0x05, /* R5 */
  147. CMDQ_DATA_REG_2D_SHARPNESS_0_DST = 0x14, /* P4 */
  148. CMDQ_DATA_REG_2D_SHARPNESS_1 = 0x0a, /* R10 */
  149. CMDQ_DATA_REG_2D_SHARPNESS_1_DST = 0x16, /* P6 */
  150. CMDQ_DATA_REG_DEBUG = 0x0b, /* R11 */
  151. CMDQ_DATA_REG_DEBUG_DST = 0x17, /* P7 */
  152. /* sentinel value for invalid register ID */
  153. CMDQ_DATA_REG_INVALID = -1,
  154. } CMDQ_DATA_REGISTER_ENUM;
  155. typedef enum CMDQ_MDP_PA_BASE_ENUM {
  156. CMDQ_MDP_PA_BASE_MM_MUTEX,
  157. CMDQ_MAX_MDP_PA_BASE_COUNT, /* ALWAYS keep at the end */
  158. } CMDQ_MDP_PA_BASE_ENUM;
  159. /* CMDQ Events */
  160. #undef DECLARE_CMDQ_EVENT
  161. #define DECLARE_CMDQ_EVENT(name_struct, val, dts_name) name_struct = val,
  162. typedef enum CMDQ_EVENT_ENUM {
  163. #include "cmdq_event_common.h"
  164. } CMDQ_EVENT_ENUM;
  165. #undef DECLARE_CMDQ_EVENT
  166. /* CMDQ subsys */
  167. #undef DECLARE_CMDQ_SUBSYS
  168. #define DECLARE_CMDQ_SUBSYS(name_struct, val, grp, dts_name) name_struct = val,
  169. typedef enum CMDQ_SUBSYS_ENUM {
  170. #include "cmdq_subsys_common.h"
  171. /* ALWAYS keep at the end */
  172. CMDQ_SUBSYS_MAX_COUNT
  173. } CMDQ_SUBSYS_ENUM;
  174. #undef DECLARE_CMDQ_SUBSYS
  175. #define CMDQ_SUBSYS_GRPNAME_MAX (30)
  176. /* GCE subsys information */
  177. typedef struct SubsysStruct {
  178. uint32_t msb;
  179. int32_t subsysID;
  180. uint32_t mask;
  181. char grpName[CMDQ_SUBSYS_GRPNAME_MAX];
  182. } SubsysStruct;
  183. typedef struct cmdqDTSDataStruct {
  184. /* [Out] GCE event table */
  185. int32_t eventTable[CMDQ_SYNC_TOKEN_MAX];
  186. /* [Out] GCE subsys ID table */
  187. SubsysStruct subsys[CMDQ_SUBSYS_MAX_COUNT];
  188. /* [Out] MDP Base address */
  189. uint32_t MDPBaseAddress[CMDQ_MAX_MDP_PA_BASE_COUNT];
  190. } cmdqDTSDataStruct;
  191. /* Custom "wide" pointer type for 64-bit job handle (pointer to VA) */
  192. typedef unsigned long long cmdqJobHandle_t;
  193. /* Custom "wide" pointer type for 64-bit compatibility. Always cast from uint32_t*. */
  194. typedef unsigned long long cmdqU32Ptr_t;
  195. #define CMDQ_U32_PTR(x) ((uint32_t *)(unsigned long)x)
  196. typedef struct cmdqReadRegStruct {
  197. uint32_t count; /* number of entries in regAddresses */
  198. cmdqU32Ptr_t regAddresses; /* an array of 32-bit register addresses (uint32_t) */
  199. } cmdqReadRegStruct;
  200. typedef struct cmdqRegValueStruct {
  201. /* number of entries in result */
  202. uint32_t count;
  203. /* array of 32-bit register values (uint32_t). */
  204. /* in the same order as cmdqReadRegStruct */
  205. cmdqU32Ptr_t regValues;
  206. } cmdqRegValueStruct;
  207. typedef struct cmdqReadAddressStruct {
  208. uint32_t count; /* [IN] number of entries in result. */
  209. /* [IN] array of physical addresses to read. */
  210. /* these value must allocated by CMDQ_IOCTL_ALLOC_WRITE_ADDRESS ioctl */
  211. /* */
  212. /* indeed param dmaAddresses should be UNSIGNED LONG type for 64 bit kernel. */
  213. /* Considering our plartform supports max 4GB RAM(upper-32bit don't care for SW) */
  214. /* and consistent common code interface, remain uint32_t type. */
  215. cmdqU32Ptr_t dmaAddresses;
  216. cmdqU32Ptr_t values; /* [OUT] uint32_t values that dmaAddresses point into */
  217. } cmdqReadAddressStruct;
  218. /*
  219. * Secure address metadata:
  220. * According to handle type, translate handle and replace (_d)th instruciton to
  221. * 1. sec_addr = hadnle_sec_base_addr(baseHandle) + offset(_b)
  222. * 2. sec_mva = mva( hadnle_sec_base_addr(baseHandle) + offset(_b) )
  223. * 3. secure world normal mva = map(baseHandle)
  224. * . pass normal mva to parameter baseHandle
  225. * . use case: OVL reads from secure and normal buffers at the same time)
  226. */
  227. typedef enum CMDQ_SEC_ADDR_METADATA_TYPE {
  228. CMDQ_SAM_H_2_PA = 0, /* sec handle to sec PA */
  229. CMDQ_SAM_H_2_MVA = 1, /* sec handle to sec MVA */
  230. CMDQ_SAM_NMVA_2_MVA = 2, /* map normal MVA to secure world */
  231. } CMDQ_SEC_ADDR_METADATA_TYPE;
  232. typedef struct cmdqSecAddrMetadataStruct {
  233. /* [IN]_d, index of instruction. Update its argB value to real PA/MVA in secure world */
  234. uint32_t instrIndex;
  235. CMDQ_SEC_ADDR_METADATA_TYPE type; /* [IN] addr handle type */
  236. uint32_t baseHandle; /* [IN]_h, secure address handle */
  237. uint32_t offset; /* [IN]_b, buffser offset to secure handle */
  238. uint32_t size; /* buffer size */
  239. uint32_t port; /* hw port id (i.e. M4U port id) */
  240. } cmdqSecAddrMetadataStruct;
  241. typedef struct cmdqSecDataStruct {
  242. bool isSecure; /* [IN]true for secure command */
  243. /* address metadata, used to translate secure buffer PA related instruction in secure world */
  244. uint32_t addrMetadataCount; /* [IN] count of element in addrList */
  245. cmdqU32Ptr_t addrMetadatas; /* [IN] array of cmdqSecAddrMetadataStruct */
  246. uint32_t addrMetadataMaxCount; /*[Reserved] */
  247. uint64_t enginesNeedDAPC;
  248. uint64_t enginesNeedPortSecurity;
  249. /* [Reserved] This is for CMDQ driver usage itself. Not for client. */
  250. int32_t waitCookie; /* task index in thread's tasklist. -1 for not in tasklist. */
  251. bool resetExecCnt; /* reset HW thread in SWd */
  252. } cmdqSecDataStruct;
  253. #ifdef CMDQ_PROFILE_MARKER_SUPPORT
  254. typedef struct cmdqProfileMarkerStruct {
  255. uint32_t count;
  256. long long hSlot; /* i.e. cmdqBackupSlotHandle, physical start address of backup slot */
  257. cmdqU32Ptr_t tag[CMDQ_MAX_PROFILE_MARKER_IN_TASK];
  258. } cmdqProfileMarkerStruct;
  259. #endif
  260. typedef struct cmdqCommandStruct {
  261. /* [IN] deprecated. will remove in the future. */
  262. uint32_t scenario;
  263. /* [IN] task schedule priority. this is NOT HW thread priority. */
  264. uint32_t priority;
  265. /* [IN] bit flag of engines used. */
  266. uint64_t engineFlag;
  267. /* [IN] pointer to instruction buffer. Use 64-bit for compatibility. */
  268. /* This must point to an 64-bit aligned uint32_t array */
  269. cmdqU32Ptr_t pVABase;
  270. /* [IN] size of instruction buffer, in bytes. */
  271. uint32_t blockSize;
  272. /* [IN] request to read register values at the end of command */
  273. cmdqReadRegStruct regRequest;
  274. /* [OUT] register values of regRequest */
  275. cmdqRegValueStruct regValue;
  276. /* [IN/OUT] physical addresses to read value */
  277. cmdqReadAddressStruct readAddress;
  278. /*[IN] secure execution data */
  279. cmdqSecDataStruct secData;
  280. /* [IN] set to non-zero to enable register debug dump. */
  281. uint32_t debugRegDump;
  282. /* [Reserved] This is for CMDQ driver usage itself. Not for client. Do not access this field from User Space */
  283. cmdqU32Ptr_t privateData;
  284. #ifdef CMDQ_PROFILE_MARKER_SUPPORT
  285. cmdqProfileMarkerStruct profileMarker;
  286. #endif
  287. } cmdqCommandStruct;
  288. typedef enum CMDQ_CAP_BITS {
  289. /* bit 0: TRUE if WFE instruction support is ready. FALSE if we need to POLL instead. */
  290. CMDQ_CAP_WFE = 0,
  291. } CMDQ_CAP_BITS;
  292. /**
  293. * reply struct for cmdq_sec_cancel_error_task
  294. */
  295. typedef struct {
  296. /* [OUT] */
  297. bool throwAEE;
  298. bool hasReset;
  299. int32_t irqFlag;
  300. uint32_t errInstr[2];
  301. uint32_t regValue;
  302. uint32_t pc;
  303. } cmdqSecCancelTaskResultStruct;
  304. #endif /* __CMDQ_DEF_H__ */