hwkm.h 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513
  1. /* SPDX-License-Identifier: GPL-2.0-only */
  2. /*
  3. * Copyright (c) 2022-2023 Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #ifndef __HWKM_H_
  6. #define __HWKM_H_
  7. #include <linux/types.h>
  8. #include <linux/tme_hwkm_master_defs.h>
  9. #include <linux/crypto-qti-common.h>
  10. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER)
  11. /* Maximum number of bytes in a key used in a KEY_SLOT_RDWR operation */
  12. #define HWKM_MAX_KEY_SIZE TME_PT_KEY_BYTES_MAX
  13. /* Maximum number of bytes in a SW ctx used in a SYSTEM_KDF operation */
  14. #define HWKM_MAX_CTX_SIZE TME_KDF_SW_CONTEXT_BYTES_MAX
  15. /* Maximum number of bytes in a WKB used in a key wrap or unwrap operation */
  16. #define HWKM_MAX_BLOB_SIZE TME_WK_CONTEXT_BYTES_MAX
  17. #define HWKM_TPKEY_SLOT_MASTER TME_KID_TP
  18. #define HWKM_TPKEY_SLOT_ICE 0x8C
  19. #define HWKM_EXPECTED_UNWRAP_KEY_SIZE 100
  20. #endif /* CONFIG_QTI_HW_KEY_MANAGER */
  21. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER_V1)
  22. /* Maximum number of bytes in a key used in a KEY_SLOT_RDWR operation */
  23. #define HWKM_MAX_KEY_SIZE 32
  24. /* Maximum number of bytes in a SW ctx used in a SYSTEM_KDF operation */
  25. #define HWKM_MAX_CTX_SIZE 64
  26. /* Maximum number of bytes in a WKB used in a key wrap or unwrap operation */
  27. #define HWKM_MAX_BLOB_SIZE 68
  28. #endif /* CONFIG_QTI_HW_KEY_MANAGER_V1 */
  29. /* Opcodes to be set in the op field of a command */
  30. enum hwkm_op {
  31. /* Opcode to generate a random key */
  32. NIST_KEYGEN = 0,
  33. /* Opcode to derive a key */
  34. SYSTEM_KDF,
  35. /* Used only by HW */
  36. QFPROM_KEY_RDWR,
  37. /* Opcode to wrap a key and export the wrapped key */
  38. KEY_WRAP_EXPORT,
  39. /*
  40. * Opcode to import a wrapped key and unwrap it in the
  41. * specified key slot
  42. */
  43. KEY_UNWRAP_IMPORT,
  44. /* Opcode to clear a slot */
  45. KEY_SLOT_CLEAR,
  46. /* Opcode to read or write a key from/to a slot */
  47. KEY_SLOT_RDWR,
  48. /*
  49. * Opcode to broadcast a TPKEY to all slaves configured
  50. * to receive a TPKEY.
  51. */
  52. SET_TPKEY,
  53. HWKM_MAX_OP,
  54. HWKM_UNDEF_OP = 0xFF
  55. };
  56. /*
  57. * Algorithm values which can be used in the alg_allowed field of the
  58. * key policy.
  59. */
  60. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER)
  61. enum hwkm_alg {
  62. /* Symmetric Algorithms */
  63. AES128_ECB = TME_KT_Symmetric | TME_KAL_AES128_ECB | TME_KL_128,
  64. AES256_ECB = TME_KT_Symmetric | TME_KAL_AES256_ECB | TME_KL_256,
  65. DES_ECB = TME_KT_Symmetric | TME_KAL_DES_ECB | TME_KL_64,
  66. TDES_ECB = TME_KT_Symmetric | TME_KAL_TDES_ECB | TME_KL_192,
  67. AES128_CBC = TME_KT_Symmetric | TME_KAL_AES128_CBC | TME_KL_128,
  68. AES256_CBC = TME_KT_Symmetric | TME_KAL_AES256_CBC | TME_KL_256,
  69. DES_CBC = TME_KT_Symmetric | TME_KAL_DES_CBC | TME_KL_64,
  70. TDES_CBC = TME_KT_Symmetric | TME_KAL_TDES_CBC | TME_KL_192,
  71. AES128_CCM_TC = TME_KT_Symmetric | TME_KAL_AES128_CCM_TC | TME_KL_128,
  72. AES128_CCM_NTC = TME_KT_Symmetric | TME_KAL_AES128_CCM_NTC | TME_KL_128,
  73. AES256_CCM_TC = TME_KT_Symmetric | TME_KAL_AES256_CCM_TC | TME_KL_256,
  74. AES256_CCM_NTC = TME_KT_Symmetric | TME_KAL_AES256_CCM_NTC | TME_KL_256,
  75. AES256_SIV = TME_KT_Symmetric | TME_KAL_AES256_SIV | TME_KL_512,
  76. AES128_CTR = TME_KT_Symmetric | TME_KAL_AES128_CTR | TME_KL_128,
  77. AES256_CTR = TME_KT_Symmetric | TME_KAL_AES256_CTR | TME_KL_256,
  78. AES128_XTS = TME_KT_Symmetric | TME_KAL_AES128_XTS | TME_KL_512,
  79. AES256_XTS = TME_KT_Symmetric | TME_KAL_AES256_XTS | TME_KL_512,
  80. SHA1_HMAC = TME_KT_Symmetric | TME_KAL_SHA1_HMAC | TME_KL_512,
  81. SHA256_HMAC = TME_KT_Symmetric | TME_KAL_SHA256_HMAC | TME_KL_512,
  82. AES128_CMAC = TME_KT_Symmetric | TME_KAL_AES128_CMAC | TME_KL_128,
  83. AES256_CMAC = TME_KT_Symmetric | TME_KAL_AES256_CMAC | TME_KL_256,
  84. SHA384_HMAC = TME_KT_Symmetric | TME_KAL_SHA384_HMAC | TME_KL_512,
  85. SHA512_HMAC = TME_KT_Symmetric | TME_KAL_SHA512_HMAC | TME_KL_512,
  86. AES128_GCM = TME_KT_Symmetric | TME_KAL_AES128_GCM | TME_KL_128,
  87. AES256_GCM = TME_KT_Symmetric | TME_KAL_AES256_GCM | TME_KL_256,
  88. // TODO: Verify Key Lengths for these algorithms
  89. KASUMI = TME_KT_Symmetric | TME_KAL_KASUMI | TME_KL_128,
  90. SNOW3G = TME_KT_Symmetric | TME_KAL_SNOW3G | TME_KL_128,
  91. ZUC = TME_KT_Symmetric | TME_KAL_ZUC | TME_KL_128,
  92. PRINCE = TME_KT_Symmetric | TME_KAL_PRINCE | TME_KL_128,
  93. SIPHASH = TME_KT_Symmetric | TME_KAL_SIPHASH | TME_KL_128,
  94. KDF_NIST = TME_KT_Symmetric | TME_KAL_KDF_NIST | TME_KL_512,
  95. KDF_HKDF = TME_KT_Symmetric | TME_KAL_KDF_HKDF,
  96. /* Asymmetric Algorithms */
  97. ECDSA_P224_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_224 |
  98. TME_KAL_ECC_CURVE_NIST,
  99. ECDSA_P256_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_256 |
  100. TME_KAL_ECC_CURVE_NIST,
  101. ECDSA_P384_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_384 |
  102. TME_KAL_ECC_CURVE_NIST,
  103. ECDSA_P521_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_521 |
  104. TME_KAL_ECC_CURVE_NIST,
  105. ECDSA_P224_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_224 |
  106. TME_KAL_ECC_CURVE_BPOOL,
  107. ECDSA_P256_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_256 |
  108. TME_KAL_ECC_CURVE_BPOOL,
  109. ECDSA_P384_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_384 |
  110. TME_KAL_ECC_CURVE_BPOOL,
  111. ECDSA_P512_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDSA | TME_KL_512 |
  112. TME_KAL_ECC_CURVE_BPOOL,
  113. ECDH_P224_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_224 |
  114. TME_KAL_ECC_CURVE_NIST,
  115. ECDH_P256_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_256 |
  116. TME_KAL_ECC_CURVE_NIST,
  117. ECDH_P384_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_384 |
  118. TME_KAL_ECC_CURVE_NIST,
  119. ECDH_P521_NIST = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_521 |
  120. TME_KAL_ECC_CURVE_NIST,
  121. ECDH_P224_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_224 |
  122. TME_KAL_ECC_CURVE_BPOOL,
  123. ECDH_P256_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_256 |
  124. TME_KAL_ECC_CURVE_BPOOL,
  125. ECDH_P384_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_384 |
  126. TME_KAL_ECC_CURVE_BPOOL,
  127. ECDH_P512_BP = TME_KT_Asymmetric_ECC | TME_KAL_ECC_ALGO_ECDH | TME_KL_512 |
  128. TME_KAL_ECC_CURVE_BPOOL,
  129. HWKM_UNDEF_ALG = 0xFFFFFFFF
  130. };
  131. /* Key type values which can be used in the key_type field of the key policy */
  132. enum hwkm_type {
  133. KEY_DERIVATION_KEY = TME_KP_KeyDerivation,
  134. KEY_WRAPPING_KEY = TME_KP_KWK_STORAGE,
  135. KEY_SWAPPING_KEY = TME_KP_KWK_SESSION,
  136. TRANSPORT_KEY = TME_KP_KWK_TRANSPORT,
  137. GENERIC_KEY = TME_KP_Generic,
  138. EXPORT_KEY = TME_KP_KWK_XPORT,
  139. HWKM_UNDEF_KEY_TYPE = 0xFFFFFFFF
  140. };
  141. // TODO: Handle v3 vs v4 gracefully
  142. /* Destinations which a context can use */
  143. enum hwkm_destination {
  144. KM_MASTER = TME_KD_TME_HW_V4,
  145. GPCE_SLAVE = TME_KD_GPCE_V4,
  146. MCE_SLAVE = TME_KD_MDM_CE_V4,
  147. ICE_SLAVE = TME_KD_ICE_V4,
  148. ICEMEM_SLAVE = 10,
  149. HWKM_UNDEF_DESTINATION = 0xFFFFFFFF
  150. };
  151. /*
  152. * Key security levels which can be set in the security_lvl field of
  153. * key policy.
  154. */
  155. enum hwkm_security_level {
  156. /* Can be read by SW in plaintext using KEY_SLOT_RDWR cmd. */
  157. SW_KEY = TME_KSL_SWKey,
  158. /* Imported key managed by HW. */
  159. MANAGED_KEY = TME_KSL_ImportKey,
  160. /* Key only known to HW. */
  161. HW_KEY = TME_KSL_HWKey,
  162. HWKM_UNDEF_SECURITY_LEVEL = 0xFFFFFFFF
  163. };
  164. enum hwkm_key_lineage {
  165. KEY_LINEAGE_NA = TME_KLI_NA,
  166. KEY_LINEAGE_NOT_PROVISIONED_UNIQUE = TME_KLI_NP_CU,
  167. KEY_LINEAGE_NOT_PROVISIONED_NOT_UNIQUE = TME_KLI_P_NCU,
  168. KEY_LINEAGE_PROVISIONED_UNIQUE = TME_KLI_P_CU,
  169. HWKM_UNDEF_KEY_LINEAGE = 0xFFFFFFFF
  170. };
  171. #define HWKM_CRED_SLOT_NONE TME_CRED_SLOT_ID_NONE
  172. #define HWKM_CRED_SLOT_1 TME_CRED_SLOT_ID_1
  173. #define HWKM_CRED_SLOT_2 TME_CRED_SLOT_ID_2
  174. /** Slots 18-25 are reserved for use by TZ in the TME key table */
  175. enum hwkm_master_key_slots {
  176. /** L2 KDKs, used to derive keys by SW. Cannot be used for crypto, only key derivation */
  177. TZ_NKDK_L2 = TME_KID_CHIP_FAM_L1,
  178. TZ_PKDK_L2 = TME_KID_CHIP_UNIQUE_SEED,
  179. TZ_SKDK_L2 = TME_KID_CHIP_UNIQUE_SEED,
  180. TZ_UKDK_L2 = TME_KID_CHIP_RAND_BASE,
  181. /** Slots reserved for TPKEY */
  182. TPKEY_SLOT = TME_KID_TP,
  183. /** Slots reserved for Swap key */
  184. TZ_SWAP_KEY_SLOT = 18,
  185. /** Reserved for wrapping keys to persist or unwrap keys */
  186. TZ_WRAP_KEY_SLOT = 19,
  187. /** Reserved for intermediate operations in IHWKeyFactory */
  188. TZ_GENERAL_PURPOSE_SLOT1 = 20,
  189. TZ_GENERAL_PURPOSE_SLOT2 = 21,
  190. /** Reserved for mixing keys in KDF */
  191. TZ_MIXING_KEY_SLOT = 22,
  192. /** Used for asymmetric operations */
  193. TZ_ASYMMETRIC_OPERATION_SLOT = 23,
  194. /**
  195. * Reserved for privileged use cases which need to persist a key
  196. * and share it between execution environments.
  197. *
  198. * WARNING: Modifying these values may cause issues in execution
  199. * environments which depend on these specific slots being used for
  200. * privileged persistent use cases.
  201. */
  202. PERSISTENT_SHARED_SLOT_PAIR1 = 24,
  203. PERSISTENT_SHARED_SLOT_PAIR2 = 25,
  204. MASTER_SLOT_MAX,
  205. UNDEF_SLOT = 0xFF
  206. };
  207. struct hwkm_key_policy_v2_extension {
  208. bool expand_allowed;
  209. bool extract_allowed;
  210. enum hwkm_key_lineage lineage;
  211. u32 credential_slot;
  212. bool export_key_wrap_allowed;
  213. };
  214. #endif
  215. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER_V1)
  216. enum hwkm_alg {
  217. AES128_ECB = 0,
  218. AES256_ECB = 1,
  219. DES_ECB = 2,
  220. TDES_ECB = 3,
  221. AES128_CBC = 4,
  222. AES256_CBC = 5,
  223. DES_CBC = 6,
  224. TDES_CBC = 7,
  225. AES128_CCM_TC = 8,
  226. AES128_CCM_NTC = 9,
  227. AES256_CCM_TC = 10,
  228. AES256_CCM_NTC = 11,
  229. AES256_SIV = 12,
  230. AES128_CTR = 13,
  231. AES256_CTR = 14,
  232. AES128_XTS = 15,
  233. AES256_XTS = 16,
  234. SHA1_HMAC = 17,
  235. SHA256_HMAC = 18,
  236. AES128_CMAC = 19,
  237. AES256_CMAC = 20,
  238. SHA384_HMAC = 21,
  239. SHA512_HMAC = 22,
  240. AES128_GCM = 23,
  241. AES256_GCM = 24,
  242. KASUMI = 25,
  243. SNOW3G = 26,
  244. ZUC = 27,
  245. PRINCE = 28,
  246. SIPHASH = 29,
  247. QARMA64 = 30,
  248. QARMA128 = 31,
  249. HWKM_ALG_MAX,
  250. HWKM_UNDEF_ALG = 0xFF
  251. };
  252. enum hwkm_type {
  253. KEY_DERIVATION_KEY = 0,
  254. KEY_WRAPPING_KEY = 1,
  255. KEY_SWAPPING_KEY = 2,
  256. TRANSPORT_KEY = 3,
  257. GENERIC_KEY = 4,
  258. HWKM_TYPE_MAX,
  259. HWKM_UNDEF_KEY_TYPE = 0xFF
  260. };
  261. /* Destinations which a context can use */
  262. enum hwkm_destination {
  263. KM_MASTER = 0,
  264. GPCE_SLAVE = 1,
  265. MCE_SLAVE = 2,
  266. PIMEM_SLAVE = 3,
  267. ICE0_SLAVE = 4,
  268. ICE1_SLAVE = 5,
  269. ICE2_SLAVE = 6,
  270. ICE3_SLAVE = 7,
  271. DP0_HDCP_SLAVE = 8,
  272. DP1_HDCP_SLAVE = 9,
  273. ICEMEM_SLAVE = 10,
  274. HWKM_DESTINATION_MAX,
  275. HWKM_UNDEF_DESTINATION = 0xFF
  276. };
  277. enum hwkm_security_level {
  278. /* Can be read by SW in plaintext using KEY_SLOT_RDWR cmd. */
  279. SW_KEY = 0,
  280. /* Usable by SW, but not readable in plaintext. */
  281. MANAGED_KEY = 1,
  282. /* Not usable by SW. */
  283. HW_KEY = 2,
  284. HWKM_SECURITY_LEVEL_MAX,
  285. HWKM_UNDEF_SECURITY_LEVEL = 0xFF
  286. };
  287. enum hwkm_master_key_slots {
  288. /** L1 KDKs. Not usable by SW. Used by HW to derive L2 KDKs */
  289. NKDK_L1 = 0,
  290. PKDK_L1 = 1,
  291. SKDK_L1 = 2,
  292. UKDK_L1 = 3,
  293. /*
  294. * L2 KDKs, used to derive keys by SW.
  295. * Cannot be used for crypto, only key derivation
  296. */
  297. TZ_NKDK_L2 = 4,
  298. TZ_PKDK_L2 = 5,
  299. TZ_SKDK_L2 = 6,
  300. MODEM_PKDK_L2 = 7,
  301. MODEM_SKDK_L2 = 8,
  302. TZ_UKDK_L2 = 9,
  303. /** Slots reserved for TPKEY */
  304. TPKEY_EVEN_SLOT = 10,
  305. TPKEY_KEY_ODD_SLOT = 11,
  306. /** First key slot available for general purpose use cases */
  307. MASTER_GENERIC_SLOTS_START,
  308. UNDEF_SLOT = 0xFF
  309. };
  310. #endif
  311. struct hwkm_key_policy {
  312. bool km_by_spu_allowed;
  313. bool km_by_modem_allowed;
  314. bool km_by_nsec_allowed;
  315. bool km_by_tz_allowed;
  316. enum hwkm_alg alg_allowed;
  317. bool enc_allowed;
  318. bool dec_allowed;
  319. enum hwkm_type key_type;
  320. u8 kdf_depth;
  321. bool wrap_export_allowed;
  322. bool swap_export_allowed;
  323. enum hwkm_security_level security_lvl;
  324. enum hwkm_destination hw_destination;
  325. bool wrap_with_tpk_allowed;
  326. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER)
  327. struct hwkm_key_policy_v2_extension v2;
  328. #endif
  329. };
  330. struct hwkm_bsve {
  331. bool enabled;
  332. bool km_key_policy_ver_en;
  333. bool km_apps_secure_en;
  334. bool km_msa_secure_en;
  335. bool km_lcm_fuse_en;
  336. bool km_boot_stage_otp_en;
  337. bool km_swc_en;
  338. bool km_child_key_policy_en;
  339. bool km_mks_en;
  340. u64 km_fuse_region_sha_digest_en;
  341. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER)
  342. bool km_oem_id_en;
  343. bool km_pkhash_en;
  344. bool km_oem_product_id_en;
  345. bool km_oem_product_seed_en;
  346. #endif
  347. };
  348. struct hwkm_keygen_cmd {
  349. u8 dks; /* Destination Key Slot */
  350. struct hwkm_key_policy policy; /* Key policy */
  351. };
  352. struct hwkm_rdwr_cmd {
  353. uint8_t slot; /* Key Slot */
  354. bool is_write; /* Write or read op */
  355. struct hwkm_key_policy policy; /* Key policy for write */
  356. uint8_t key[HWKM_MAX_KEY_SIZE]; /* Key for write */
  357. size_t sz; /* Length of key in bytes */
  358. };
  359. struct hwkm_kdf_cmd {
  360. uint8_t dks; /* Destination Key Slot */
  361. uint8_t kdk; /* Key Derivation Key Slot */
  362. uint8_t mks; /* Mixing key slot (bsve controlled) */
  363. struct hwkm_key_policy policy; /* Key policy. */
  364. struct hwkm_bsve bsve; /* Binding state vector */
  365. uint8_t ctx[HWKM_MAX_CTX_SIZE]; /* Context */
  366. size_t sz; /* Length of context in bytes */
  367. enum hwkm_alg parent_alg; /* Underlying KDF algorithm (required for TME) */
  368. };
  369. struct hwkm_set_tpkey_cmd {
  370. uint8_t sks; /* The slot to use as the TPKEY */
  371. };
  372. struct hwkm_unwrap_cmd {
  373. uint8_t dks; /* Destination Key Slot */
  374. uint8_t kwk; /* Key Wrapping Key Slot */
  375. uint8_t wkb[HWKM_MAX_BLOB_SIZE];/* Wrapped Key Blob */
  376. uint8_t sz; /* Length of WKB in bytes */
  377. };
  378. struct hwkm_wrap_cmd {
  379. uint8_t sks; /* Destination Key Slot */
  380. uint8_t kwk; /* Key Wrapping Key Slot */
  381. struct hwkm_bsve bsve; /* Binding state vector */
  382. };
  383. struct hwkm_clear_cmd {
  384. uint8_t dks; /* Destination key slot */
  385. bool is_double_key; /* Whether this is a double key */
  386. };
  387. struct hwkm_cmd {
  388. enum hwkm_op op; /* Operation */
  389. #if IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER)
  390. enum hwkm_destination dest;
  391. #endif
  392. union /* Structs with opcode specific parameters */
  393. {
  394. struct hwkm_keygen_cmd keygen;
  395. struct hwkm_rdwr_cmd rdwr;
  396. struct hwkm_kdf_cmd kdf;
  397. struct hwkm_set_tpkey_cmd set_tpkey;
  398. struct hwkm_unwrap_cmd unwrap;
  399. struct hwkm_wrap_cmd wrap;
  400. struct hwkm_clear_cmd clear;
  401. };
  402. };
  403. struct hwkm_rdwr_rsp {
  404. struct hwkm_key_policy policy; /* Key policy for read */
  405. uint8_t key[HWKM_MAX_KEY_SIZE]; /* Only available for read op */
  406. size_t sz; /* Length of the key (bytes) */
  407. };
  408. struct hwkm_wrap_rsp {
  409. uint8_t wkb[HWKM_MAX_BLOB_SIZE]; /* Wrapping key blob */
  410. size_t sz; /* key blob len (bytes) */
  411. };
  412. struct hwkm_rsp {
  413. u32 status;
  414. union /* Structs with opcode specific outputs */
  415. {
  416. struct hwkm_rdwr_rsp rdwr;
  417. struct hwkm_wrap_rsp wrap;
  418. };
  419. };
  420. #if (IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER) || IS_ENABLED(CONFIG_QTI_HW_KEY_MANAGER_V1))
  421. int qti_hwkm_handle_cmd(struct hwkm_cmd *cmd, struct hwkm_rsp *rsp);
  422. int qti_hwkm_clocks(bool on);
  423. int qti_hwkm_init(const struct ice_mmio_data *mmio_data);
  424. #else
  425. static inline int qti_hwkm_add_req(struct hwkm_cmd *cmd,
  426. struct hwkm_rsp *rsp)
  427. {
  428. return -EOPNOTSUPP;
  429. }
  430. static inline int qti_hwkm_clocks(bool on)
  431. {
  432. return -EOPNOTSUPP;
  433. }
  434. static inline int qti_hwkm_init(const struct ice_mmio_data *mmio_data)
  435. {
  436. return -EOPNOTSUPP;
  437. }
  438. #endif /* CONFIG_QTI_HW_KEY_MANAGER */
  439. #endif /* __HWKM_H_ */