cmdq_sec.h 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #ifndef __CMDQ_SEC_H__
  2. #define __CMDQ_SEC_H__
  3. #include <linux/slab.h>
  4. #include "cmdq_def.h"
  5. #include "cmdq_platform.h"
  6. #include "cmdq_device.h"
  7. #include "cmdq_core.h"
  8. #include "cmdq_reg.h"
  9. #ifdef CMDQ_SECURE_PATH_SUPPORT
  10. #include "cmdq_iwc_sec.h"
  11. #include "tz_cross/trustzone.h"
  12. #include "tz_cross/ta_mem.h"
  13. #include "trustzone/kree/system.h"
  14. #include "trustzone/kree/mem.h"
  15. #include "cmdq_sec_iwc_common.h"
  16. #include "cmdq_record.h"
  17. #endif
  18. /**
  19. * error code for CMDQ
  20. */
  21. #define CMDQ_ERR_NULL_SEC_CTX_HANDLE (6000)
  22. #define CMDQ_ERR_SEC_CTX_SETUP (6001)
  23. #define CMDQ_ERR_SEC_CTX_TEARDOWN (6002)
  24. #if 0
  25. /**
  26. * inter-world communication state
  27. */
  28. typedef enum {
  29. IWC_INIT = 0,
  30. IWC_MOBICORE_OPENED = 1,
  31. IWC_WSM_ALLOCATED = 2,
  32. IWC_SES_OPENED = 3,
  33. IWC_SES_MSG_PACKAGED = 4,
  34. IWC_SES_TRANSACTED = 5,
  35. IWC_SES_ON_TRANSACTED = 6,
  36. IWC_END_OF_ENUM = 7,
  37. } CMDQ_IWC_STATE_ENUM;
  38. /**
  39. * CMDQ secure context struct
  40. * note it is not global data, each process has its own CMDQ sec context
  41. */
  42. typedef struct cmdqSecContextStruct {
  43. struct list_head listEntry;
  44. /* basic info */
  45. uint32_t tgid; /* tgid of procexx context */
  46. uint32_t referCount; /* reference count for open cmdq device node */
  47. /* iwc state */
  48. CMDQ_IWC_STATE_ENUM state;
  49. /* iwc information */
  50. void *iwcMessage; /* message buffer */
  51. #if defined(CMDQ_SECURE_PATH_SUPPORT)
  52. KREE_SESSION_HANDLE sessionHandle;
  53. KREE_SESSION_HANDLE memSessionHandle;
  54. #endif
  55. } cmdqSecContextStruct, *cmdqSecContextHandle;
  56. /**
  57. * shared memory between normal and secure world
  58. */
  59. typedef struct cmdqSecSharedMemoryStruct {
  60. void *pVABase; /* virtual address of command buffer */
  61. dma_addr_t MVABase; /* physical address of command buffer */
  62. uint32_t size; /* buffer size */
  63. cmdqSecContextHandle handle; /* for alloc path */
  64. KREE_SHAREDMEM_HANDLE cmdq_share_cookie_handle;
  65. } cmdqSecSharedMemoryStruct, *cmdqSecSharedMemoryHandle;
  66. #endif
  67. #ifdef CMDQ_SECURE_PATH_SUPPORT
  68. /**
  69. * Callback to fill message buffer for secure task
  70. *
  71. * Params:
  72. * init32_t command id
  73. * void* the inter-world communication buffer
  74. * Return:
  75. * >=0 for success;
  76. */
  77. typedef int32_t(*CmdqSecFillIwcCB) (iwcCmdqMessage_t *_pIwc,
  78. uint32_t iwcCommand,
  79. struct TaskStruct *_pTask, int32_t thread);
  80. /**
  81. * submit task to secure world
  82. */
  83. int32_t cmdq_sec_cancel_error_task_unlocked(struct TaskStruct *pTask,
  84. int32_t thread,
  85. cmdqSecCancelTaskResultStruct *pResult);
  86. int32_t cmdq_sec_allocate_path_resource_unlocked(void);
  87. /**
  88. * secure context API
  89. */
  90. int32_t cmdq_sec_submit_to_secure_world_async_unlocked(uint32_t iwcCommand,
  91. struct TaskStruct *pTask,
  92. int32_t thread,
  93. CmdqSecFillIwcCB iwcFillCB, void *data);
  94. int32_t cmdq_sec_exec_task_async_unlocked(struct TaskStruct *pTask, int32_t thread);
  95. #endif
  96. cmdqSecContextHandle cmdq_sec_find_context_handle_unlocked(uint32_t tgid);
  97. cmdqSecContextHandle cmdq_sec_acquire_context_handle(uint32_t tgid);
  98. int32_t cmdq_sec_release_context_handle(uint32_t tgid);
  99. void cmdq_sec_dump_context_list(void);
  100. void cmdqSecInitialize(void);
  101. void cmdqSecDeInitialize(void);
  102. int32_t cmdq_sec_sync_handle_hdcp_unlock(struct cmdqSyncHandleHdcpStruct syncHandle);
  103. void cmdq_sec_init_secure_path(void);
  104. extern struct ContextStruct gCmdqContext;
  105. void cmdq_sec_set_commandId(uint32_t cmdId);
  106. const uint32_t cmdq_sec_get_commandId(void);
  107. int32_t cmdq_sec_init_share_memory(void);
  108. void cmdq_debug_set_sw_copy(int32_t value);
  109. int32_t cmdq_debug_get_sw_copy(void);
  110. cmdqSecContextHandle cmdq_sec_context_handle_create(uint32_t tgid);
  111. void cmdq_sec_lock_secure_path(void);
  112. void cmdq_sec_unlock_secure_path(void);
  113. /* add for universal communicate with TEE */
  114. struct transmitBufferStruct {
  115. void *pBuffer; /* the share memory */
  116. uint32_t size; /* share memory size */
  117. KREE_SHAREDMEM_HANDLE shareMemHandle;
  118. KREE_SESSION_HANDLE cmdqHandle;
  119. KREE_SESSION_HANDLE memSessionHandle;
  120. };
  121. #if defined(CMDQ_SECURE_PATH_SUPPORT)
  122. /* the session to communicate with TA */
  123. KREE_SESSION_HANDLE cmdq_session_handle(void);
  124. KREE_SESSION_HANDLE cmdq_mem_session_handle(void);
  125. int32_t cmdq_sec_create_shared_memory(cmdqSecSharedMemoryHandle *pHandle, const uint32_t size);
  126. int32_t cmdq_sec_destroy_shared_memory(cmdqSecSharedMemoryHandle handle);
  127. int32_t cmdqSecRegisterSecureBuffer(struct transmitBufferStruct *pSecureData);
  128. int32_t cmdqSecServiceCall(struct transmitBufferStruct *pSecureData, int32_t cmd);
  129. int32_t cmdqSecUnRegisterSecureBuffer(struct transmitBufferStruct *pSecureData);
  130. void cmdq_sec_register_secure_irq(void);
  131. #endif
  132. #endif /* __CMDQ_SEC_H__ */