aspeed-hace.h 8.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298
  1. /* SPDX-License-Identifier: GPL-2.0+ */
  2. #ifndef __ASPEED_HACE_H__
  3. #define __ASPEED_HACE_H__
  4. #include <linux/interrupt.h>
  5. #include <linux/delay.h>
  6. #include <linux/err.h>
  7. #include <linux/fips.h>
  8. #include <linux/dma-mapping.h>
  9. #include <crypto/aes.h>
  10. #include <crypto/des.h>
  11. #include <crypto/scatterwalk.h>
  12. #include <crypto/internal/aead.h>
  13. #include <crypto/internal/akcipher.h>
  14. #include <crypto/internal/des.h>
  15. #include <crypto/internal/hash.h>
  16. #include <crypto/internal/kpp.h>
  17. #include <crypto/internal/skcipher.h>
  18. #include <crypto/algapi.h>
  19. #include <crypto/engine.h>
  20. #include <crypto/hmac.h>
  21. #include <crypto/sha1.h>
  22. #include <crypto/sha2.h>
  23. /*****************************
  24. * *
  25. * HACE register definitions *
  26. * *
  27. * ***************************/
  28. #define ASPEED_HACE_SRC 0x00 /* Crypto Data Source Base Address Register */
  29. #define ASPEED_HACE_DEST 0x04 /* Crypto Data Destination Base Address Register */
  30. #define ASPEED_HACE_CONTEXT 0x08 /* Crypto Context Buffer Base Address Register */
  31. #define ASPEED_HACE_DATA_LEN 0x0C /* Crypto Data Length Register */
  32. #define ASPEED_HACE_CMD 0x10 /* Crypto Engine Command Register */
  33. /* G5 */
  34. #define ASPEED_HACE_TAG 0x18 /* HACE Tag Register */
  35. /* G6 */
  36. #define ASPEED_HACE_GCM_ADD_LEN 0x14 /* Crypto AES-GCM Additional Data Length Register */
  37. #define ASPEED_HACE_GCM_TAG_BASE_ADDR 0x18 /* Crypto AES-GCM Tag Write Buff Base Address Reg */
  38. #define ASPEED_HACE_STS 0x1C /* HACE Status Register */
  39. #define ASPEED_HACE_HASH_SRC 0x20 /* Hash Data Source Base Address Register */
  40. #define ASPEED_HACE_HASH_DIGEST_BUFF 0x24 /* Hash Digest Write Buffer Base Address Register */
  41. #define ASPEED_HACE_HASH_KEY_BUFF 0x28 /* Hash HMAC Key Buffer Base Address Register */
  42. #define ASPEED_HACE_HASH_DATA_LEN 0x2C /* Hash Data Length Register */
  43. #define ASPEED_HACE_HASH_CMD 0x30 /* Hash Engine Command Register */
  44. /* crypto cmd */
  45. #define HACE_CMD_SINGLE_DES 0
  46. #define HACE_CMD_TRIPLE_DES BIT(17)
  47. #define HACE_CMD_AES_SELECT 0
  48. #define HACE_CMD_DES_SELECT BIT(16)
  49. #define HACE_CMD_ISR_EN BIT(12)
  50. #define HACE_CMD_CONTEXT_SAVE_ENABLE (0)
  51. #define HACE_CMD_CONTEXT_SAVE_DISABLE BIT(9)
  52. #define HACE_CMD_AES (0)
  53. #define HACE_CMD_DES (0)
  54. #define HACE_CMD_RC4 BIT(8)
  55. #define HACE_CMD_DECRYPT (0)
  56. #define HACE_CMD_ENCRYPT BIT(7)
  57. #define HACE_CMD_ECB (0x0 << 4)
  58. #define HACE_CMD_CBC (0x1 << 4)
  59. #define HACE_CMD_CFB (0x2 << 4)
  60. #define HACE_CMD_OFB (0x3 << 4)
  61. #define HACE_CMD_CTR (0x4 << 4)
  62. #define HACE_CMD_OP_MODE_MASK (0x7 << 4)
  63. #define HACE_CMD_AES128 (0x0 << 2)
  64. #define HACE_CMD_AES192 (0x1 << 2)
  65. #define HACE_CMD_AES256 (0x2 << 2)
  66. #define HACE_CMD_OP_CASCADE (0x3)
  67. #define HACE_CMD_OP_INDEPENDENT (0x1)
  68. /* G5 */
  69. #define HACE_CMD_RI_WO_DATA_ENABLE (0)
  70. #define HACE_CMD_RI_WO_DATA_DISABLE BIT(11)
  71. #define HACE_CMD_CONTEXT_LOAD_ENABLE (0)
  72. #define HACE_CMD_CONTEXT_LOAD_DISABLE BIT(10)
  73. /* G6 */
  74. #define HACE_CMD_AES_KEY_FROM_OTP BIT(24)
  75. #define HACE_CMD_GHASH_TAG_XOR_EN BIT(23)
  76. #define HACE_CMD_GHASH_PAD_LEN_INV BIT(22)
  77. #define HACE_CMD_GCM_TAG_ADDR_SEL BIT(21)
  78. #define HACE_CMD_MBUS_REQ_SYNC_EN BIT(20)
  79. #define HACE_CMD_DES_SG_CTRL BIT(19)
  80. #define HACE_CMD_SRC_SG_CTRL BIT(18)
  81. #define HACE_CMD_CTR_IV_AES_96 (0x1 << 14)
  82. #define HACE_CMD_CTR_IV_DES_32 (0x1 << 14)
  83. #define HACE_CMD_CTR_IV_AES_64 (0x2 << 14)
  84. #define HACE_CMD_CTR_IV_AES_32 (0x3 << 14)
  85. #define HACE_CMD_AES_KEY_HW_EXP BIT(13)
  86. #define HACE_CMD_GCM (0x5 << 4)
  87. /* interrupt status reg */
  88. #define HACE_CRYPTO_ISR BIT(12)
  89. #define HACE_HASH_ISR BIT(9)
  90. #define HACE_HASH_BUSY BIT(0)
  91. /* hash cmd reg */
  92. #define HASH_CMD_MBUS_REQ_SYNC_EN BIT(20)
  93. #define HASH_CMD_HASH_SRC_SG_CTRL BIT(18)
  94. #define HASH_CMD_SHA512_224 (0x3 << 10)
  95. #define HASH_CMD_SHA512_256 (0x2 << 10)
  96. #define HASH_CMD_SHA384 (0x1 << 10)
  97. #define HASH_CMD_SHA512 (0)
  98. #define HASH_CMD_INT_ENABLE BIT(9)
  99. #define HASH_CMD_HMAC (0x1 << 7)
  100. #define HASH_CMD_ACC_MODE (0x2 << 7)
  101. #define HASH_CMD_HMAC_KEY (0x3 << 7)
  102. #define HASH_CMD_SHA1 (0x2 << 4)
  103. #define HASH_CMD_SHA224 (0x4 << 4)
  104. #define HASH_CMD_SHA256 (0x5 << 4)
  105. #define HASH_CMD_SHA512_SER (0x6 << 4)
  106. #define HASH_CMD_SHA_SWAP (0x2 << 2)
  107. #define HASH_SG_LAST_LIST BIT(31)
  108. #define CRYPTO_FLAGS_BUSY BIT(1)
  109. #define SHA_OP_UPDATE 1
  110. #define SHA_OP_FINAL 2
  111. #define SHA_FLAGS_SHA1 BIT(0)
  112. #define SHA_FLAGS_SHA224 BIT(1)
  113. #define SHA_FLAGS_SHA256 BIT(2)
  114. #define SHA_FLAGS_SHA384 BIT(3)
  115. #define SHA_FLAGS_SHA512 BIT(4)
  116. #define SHA_FLAGS_SHA512_224 BIT(5)
  117. #define SHA_FLAGS_SHA512_256 BIT(6)
  118. #define SHA_FLAGS_HMAC BIT(8)
  119. #define SHA_FLAGS_FINUP BIT(9)
  120. #define SHA_FLAGS_MASK (0xff)
  121. #define ASPEED_CRYPTO_SRC_DMA_BUF_LEN 0xa000
  122. #define ASPEED_CRYPTO_DST_DMA_BUF_LEN 0xa000
  123. #define ASPEED_CRYPTO_GCM_TAG_OFFSET 0x9ff0
  124. #define ASPEED_HASH_SRC_DMA_BUF_LEN 0xa000
  125. #define ASPEED_HASH_QUEUE_LENGTH 50
  126. #define HACE_CMD_IV_REQUIRE (HACE_CMD_CBC | HACE_CMD_CFB | \
  127. HACE_CMD_OFB | HACE_CMD_CTR)
  128. struct aspeed_hace_dev;
  129. typedef int (*aspeed_hace_fn_t)(struct aspeed_hace_dev *);
  130. struct aspeed_sg_list {
  131. __le32 len;
  132. __le32 phy_addr;
  133. };
  134. struct aspeed_engine_hash {
  135. struct tasklet_struct done_task;
  136. unsigned long flags;
  137. struct ahash_request *req;
  138. /* input buffer */
  139. void *ahash_src_addr;
  140. dma_addr_t ahash_src_dma_addr;
  141. dma_addr_t src_dma;
  142. dma_addr_t digest_dma;
  143. size_t src_length;
  144. /* callback func */
  145. aspeed_hace_fn_t resume;
  146. aspeed_hace_fn_t dma_prepare;
  147. };
  148. struct aspeed_sha_hmac_ctx {
  149. struct crypto_shash *shash;
  150. u8 ipad[SHA512_BLOCK_SIZE];
  151. u8 opad[SHA512_BLOCK_SIZE];
  152. };
  153. struct aspeed_sham_ctx {
  154. struct crypto_engine_ctx enginectx;
  155. struct aspeed_hace_dev *hace_dev;
  156. unsigned long flags; /* hmac flag */
  157. struct aspeed_sha_hmac_ctx base[0];
  158. };
  159. struct aspeed_sham_reqctx {
  160. unsigned long flags; /* final update flag should no use*/
  161. unsigned long op; /* final or update */
  162. u32 cmd; /* trigger cmd */
  163. /* walk state */
  164. struct scatterlist *src_sg;
  165. int src_nents;
  166. unsigned int offset; /* offset in current sg */
  167. unsigned int total; /* per update length */
  168. size_t digsize;
  169. size_t block_size;
  170. size_t ivsize;
  171. const __be32 *sha_iv;
  172. /* remain data buffer */
  173. u8 buffer[SHA512_BLOCK_SIZE * 2];
  174. dma_addr_t buffer_dma_addr;
  175. size_t bufcnt; /* buffer counter */
  176. /* output buffer */
  177. u8 digest[SHA512_DIGEST_SIZE] __aligned(64);
  178. dma_addr_t digest_dma_addr;
  179. u64 digcnt[2];
  180. };
  181. struct aspeed_engine_crypto {
  182. struct tasklet_struct done_task;
  183. unsigned long flags;
  184. struct skcipher_request *req;
  185. /* context buffer */
  186. void *cipher_ctx;
  187. dma_addr_t cipher_ctx_dma;
  188. /* input buffer, could be single/scatter-gather lists */
  189. void *cipher_addr;
  190. dma_addr_t cipher_dma_addr;
  191. /* output buffer, only used in scatter-gather lists */
  192. void *dst_sg_addr;
  193. dma_addr_t dst_sg_dma_addr;
  194. /* callback func */
  195. aspeed_hace_fn_t resume;
  196. };
  197. struct aspeed_cipher_ctx {
  198. struct crypto_engine_ctx enginectx;
  199. struct aspeed_hace_dev *hace_dev;
  200. int key_len;
  201. u8 key[AES_MAX_KEYLENGTH];
  202. /* callback func */
  203. aspeed_hace_fn_t start;
  204. struct crypto_skcipher *fallback_tfm;
  205. };
  206. struct aspeed_cipher_reqctx {
  207. int enc_cmd;
  208. int src_nents;
  209. int dst_nents;
  210. struct skcipher_request fallback_req; /* keep at the end */
  211. };
  212. struct aspeed_hace_dev {
  213. void __iomem *regs;
  214. struct device *dev;
  215. int irq;
  216. struct clk *clk;
  217. unsigned long version;
  218. struct crypto_engine *crypt_engine_hash;
  219. struct crypto_engine *crypt_engine_crypto;
  220. struct aspeed_engine_hash hash_engine;
  221. struct aspeed_engine_crypto crypto_engine;
  222. };
  223. struct aspeed_hace_alg {
  224. struct aspeed_hace_dev *hace_dev;
  225. const char *alg_base;
  226. union {
  227. struct skcipher_alg skcipher;
  228. struct ahash_alg ahash;
  229. } alg;
  230. };
  231. enum aspeed_version {
  232. AST2500_VERSION = 5,
  233. AST2600_VERSION
  234. };
  235. #define ast_hace_write(hace, val, offset) \
  236. writel((val), (hace)->regs + (offset))
  237. #define ast_hace_read(hace, offset) \
  238. readl((hace)->regs + (offset))
  239. void aspeed_register_hace_hash_algs(struct aspeed_hace_dev *hace_dev);
  240. void aspeed_unregister_hace_hash_algs(struct aspeed_hace_dev *hace_dev);
  241. void aspeed_register_hace_crypto_algs(struct aspeed_hace_dev *hace_dev);
  242. void aspeed_unregister_hace_crypto_algs(struct aspeed_hace_dev *hace_dev);
  243. #endif