diff options
author | Gilad Ben-Yossef <gilad@benyossef.com> | 2019-04-18 09:38:43 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-04-25 03:38:13 -0400 |
commit | 533edf9f93e84cabeae7c1acc8b3816c79f6f35a (patch) | |
tree | dd6df8810b64bfae7f8e34aeb3b3f8c829609b53 | |
parent | bee711fa354e03efab2862443c17b575b3671cbc (diff) |
crypto: ccree - adapt CPP descriptor to new HW
Adapt the CPP descriptor to new HW interface.
Signed-off-by: Gilad Ben-Yossef <gilad@benyossef.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
-rw-r--r-- | drivers/crypto/ccree/cc_cipher.c | 42 | ||||
-rw-r--r-- | drivers/crypto/ccree/cc_hw_queue_defs.h | 18 | ||||
-rw-r--r-- | drivers/crypto/ccree/cc_kernel_regs.h | 6 |
3 files changed, 29 insertions, 37 deletions
diff --git a/drivers/crypto/ccree/cc_cipher.c b/drivers/crypto/ccree/cc_cipher.c index 8acedbafbcb3..4c7231d24631 100644 --- a/drivers/crypto/ccree/cc_cipher.c +++ b/drivers/crypto/ccree/cc_cipher.c | |||
@@ -546,6 +546,19 @@ static void cc_setup_state_desc(struct crypto_tfm *tfm, | |||
546 | } | 546 | } |
547 | } | 547 | } |
548 | 548 | ||
549 | static int cc_out_flow_mode(struct cc_cipher_ctx *ctx_p) | ||
550 | { | ||
551 | switch (ctx_p->flow_mode) { | ||
552 | case S_DIN_to_AES: | ||
553 | return DIN_AES_DOUT; | ||
554 | case S_DIN_to_DES: | ||
555 | return DIN_DES_DOUT; | ||
556 | case S_DIN_to_SM4: | ||
557 | return DIN_SM4_DOUT; | ||
558 | default: | ||
559 | return ctx_p->flow_mode; | ||
560 | } | ||
561 | } | ||
549 | 562 | ||
550 | static void cc_setup_key_desc(struct crypto_tfm *tfm, | 563 | static void cc_setup_key_desc(struct crypto_tfm *tfm, |
551 | struct cipher_req_ctx *req_ctx, | 564 | struct cipher_req_ctx *req_ctx, |
@@ -577,12 +590,15 @@ static void cc_setup_key_desc(struct crypto_tfm *tfm, | |||
577 | case DRV_CIPHER_ECB: | 590 | case DRV_CIPHER_ECB: |
578 | /* Load key */ | 591 | /* Load key */ |
579 | hw_desc_init(&desc[*seq_size]); | 592 | hw_desc_init(&desc[*seq_size]); |
593 | set_cipher_mode(&desc[*seq_size], cipher_mode); | ||
594 | set_cipher_config0(&desc[*seq_size], direction); | ||
595 | |||
580 | if (cc_key_type(tfm) == CC_POLICY_PROTECTED_KEY) { | 596 | if (cc_key_type(tfm) == CC_POLICY_PROTECTED_KEY) { |
581 | set_cpp_crypto_key(&desc[*seq_size], ctx_p->cpp.alg, | 597 | /* We use the AES key size coding for all CPP algs */ |
582 | cipher_mode, ctx_p->cpp.slot); | 598 | set_key_size_aes(&desc[*seq_size], key_len); |
599 | set_cpp_crypto_key(&desc[*seq_size], ctx_p->cpp.slot); | ||
600 | flow_mode = cc_out_flow_mode(ctx_p); | ||
583 | } else { | 601 | } else { |
584 | set_cipher_mode(&desc[*seq_size], cipher_mode); | ||
585 | set_cipher_config0(&desc[*seq_size], direction); | ||
586 | if (flow_mode == S_DIN_to_AES) { | 602 | if (flow_mode == S_DIN_to_AES) { |
587 | if (cc_key_type(tfm) == CC_HW_PROTECTED_KEY) { | 603 | if (cc_key_type(tfm) == CC_HW_PROTECTED_KEY) { |
588 | set_hw_crypto_key(&desc[*seq_size], | 604 | set_hw_crypto_key(&desc[*seq_size], |
@@ -606,9 +622,9 @@ static void cc_setup_key_desc(struct crypto_tfm *tfm, | |||
606 | key_dma_addr, key_len, NS_BIT); | 622 | key_dma_addr, key_len, NS_BIT); |
607 | set_key_size_des(&desc[*seq_size], key_len); | 623 | set_key_size_des(&desc[*seq_size], key_len); |
608 | } | 624 | } |
609 | set_flow_mode(&desc[*seq_size], flow_mode); | ||
610 | set_setup_mode(&desc[*seq_size], SETUP_LOAD_KEY0); | 625 | set_setup_mode(&desc[*seq_size], SETUP_LOAD_KEY0); |
611 | } | 626 | } |
627 | set_flow_mode(&desc[*seq_size], flow_mode); | ||
612 | (*seq_size)++; | 628 | (*seq_size)++; |
613 | break; | 629 | break; |
614 | case DRV_CIPHER_XTS: | 630 | case DRV_CIPHER_XTS: |
@@ -670,22 +686,8 @@ static void cc_setup_flow_desc(struct crypto_tfm *tfm, | |||
670 | { | 686 | { |
671 | struct cc_cipher_ctx *ctx_p = crypto_tfm_ctx(tfm); | 687 | struct cc_cipher_ctx *ctx_p = crypto_tfm_ctx(tfm); |
672 | struct device *dev = drvdata_to_dev(ctx_p->drvdata); | 688 | struct device *dev = drvdata_to_dev(ctx_p->drvdata); |
673 | unsigned int flow_mode = ctx_p->flow_mode; | 689 | unsigned int flow_mode = cc_out_flow_mode(ctx_p); |
674 | 690 | ||
675 | switch (ctx_p->flow_mode) { | ||
676 | case S_DIN_to_AES: | ||
677 | flow_mode = DIN_AES_DOUT; | ||
678 | break; | ||
679 | case S_DIN_to_DES: | ||
680 | flow_mode = DIN_DES_DOUT; | ||
681 | break; | ||
682 | case S_DIN_to_SM4: | ||
683 | flow_mode = DIN_SM4_DOUT; | ||
684 | break; | ||
685 | default: | ||
686 | dev_err(dev, "invalid flow mode, flow_mode = %d\n", flow_mode); | ||
687 | return; | ||
688 | } | ||
689 | /* Process */ | 691 | /* Process */ |
690 | if (req_ctx->dma_buf_type == CC_DMA_BUF_DLLI) { | 692 | if (req_ctx->dma_buf_type == CC_DMA_BUF_DLLI) { |
691 | dev_dbg(dev, " data params addr %pad length 0x%X\n", | 693 | dev_dbg(dev, " data params addr %pad length 0x%X\n", |
diff --git a/drivers/crypto/ccree/cc_hw_queue_defs.h b/drivers/crypto/ccree/cc_hw_queue_defs.h index 2c8cd907d8db..fd693681808e 100644 --- a/drivers/crypto/ccree/cc_hw_queue_defs.h +++ b/drivers/crypto/ccree/cc_hw_queue_defs.h | |||
@@ -55,8 +55,6 @@ | |||
55 | #define WORD4_DATA_FLOW_MODE CC_GENMASK(4, DATA_FLOW_MODE) | 55 | #define WORD4_DATA_FLOW_MODE CC_GENMASK(4, DATA_FLOW_MODE) |
56 | #define WORD4_KEY_SIZE CC_GENMASK(4, KEY_SIZE) | 56 | #define WORD4_KEY_SIZE CC_GENMASK(4, KEY_SIZE) |
57 | #define WORD4_SETUP_OPERATION CC_GENMASK(4, SETUP_OPERATION) | 57 | #define WORD4_SETUP_OPERATION CC_GENMASK(4, SETUP_OPERATION) |
58 | #define WORD4_CPP_ALG CC_GENMASK(4, CPP_ALG) | ||
59 | #define WORD4_CPP_SLOT CC_GENMASK(4, CPP_SLOT) | ||
60 | #define WORD5_DIN_ADDR_HIGH CC_GENMASK(5, DIN_ADDR_HIGH) | 58 | #define WORD5_DIN_ADDR_HIGH CC_GENMASK(5, DIN_ADDR_HIGH) |
61 | #define WORD5_DOUT_ADDR_HIGH CC_GENMASK(5, DOUT_ADDR_HIGH) | 59 | #define WORD5_DOUT_ADDR_HIGH CC_GENMASK(5, DOUT_ADDR_HIGH) |
62 | 60 | ||
@@ -202,7 +200,8 @@ enum cc_hash_cipher_pad { | |||
202 | HASH_CIPHER_DO_PADDING_RESERVE32 = S32_MAX, | 200 | HASH_CIPHER_DO_PADDING_RESERVE32 = S32_MAX, |
203 | }; | 201 | }; |
204 | 202 | ||
205 | #define CC_CPP_DESC_INDICATOR 0xFF0000UL | 203 | #define CC_CPP_DIN_ADDR 0xFF00FF00UL |
204 | #define CC_CPP_DIN_SIZE 0xFF00FFUL | ||
206 | 205 | ||
207 | /*****************************/ | 206 | /*****************************/ |
208 | /* Descriptor packing macros */ | 207 | /* Descriptor packing macros */ |
@@ -272,17 +271,14 @@ static inline void set_din_no_dma(struct cc_hw_desc *pdesc, u32 addr, u32 size) | |||
272 | * @slot: slot number | 271 | * @slot: slot number |
273 | * @ksize: key size | 272 | * @ksize: key size |
274 | */ | 273 | */ |
275 | static inline void set_cpp_crypto_key(struct cc_hw_desc *pdesc, | 274 | static inline void set_cpp_crypto_key(struct cc_hw_desc *pdesc, u8 slot) |
276 | enum cc_cpp_alg alg, | ||
277 | enum drv_cipher_mode mode, u8 slot) | ||
278 | { | 275 | { |
279 | u8 mode_val = (mode == DRV_CIPHER_CBC ? 0 : 1); | 276 | pdesc->word[0] |= CC_CPP_DIN_ADDR; |
280 | 277 | ||
281 | pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, CC_CPP_DESC_INDICATOR); | 278 | pdesc->word[1] |= FIELD_PREP(WORD1_DIN_SIZE, CC_CPP_DIN_SIZE); |
282 | pdesc->word[1] |= FIELD_PREP(WORD1_LOCK_QUEUE, 1); | 279 | pdesc->word[1] |= FIELD_PREP(WORD1_LOCK_QUEUE, 1); |
283 | pdesc->word[0] |= FIELD_PREP(WORD0_CPP_CIPHER_MODE, mode_val); | 280 | |
284 | pdesc->word[4] |= FIELD_PREP(WORD4_CPP_ALG, alg); | 281 | pdesc->word[4] |= FIELD_PREP(WORD4_SETUP_OPERATION, slot); |
285 | pdesc->word[4] |= FIELD_PREP(WORD4_CPP_SLOT, slot); | ||
286 | } | 282 | } |
287 | 283 | ||
288 | /* | 284 | /* |
diff --git a/drivers/crypto/ccree/cc_kernel_regs.h b/drivers/crypto/ccree/cc_kernel_regs.h index f148d13c4b65..8d7262a35156 100644 --- a/drivers/crypto/ccree/cc_kernel_regs.h +++ b/drivers/crypto/ccree/cc_kernel_regs.h | |||
@@ -31,8 +31,6 @@ | |||
31 | #define CC_DSCRPTR_QUEUE_WORD0_REG_OFFSET 0xE80UL | 31 | #define CC_DSCRPTR_QUEUE_WORD0_REG_OFFSET 0xE80UL |
32 | #define CC_DSCRPTR_QUEUE_WORD0_VALUE_BIT_SHIFT 0x0UL | 32 | #define CC_DSCRPTR_QUEUE_WORD0_VALUE_BIT_SHIFT 0x0UL |
33 | #define CC_DSCRPTR_QUEUE_WORD0_VALUE_BIT_SIZE 0x20UL | 33 | #define CC_DSCRPTR_QUEUE_WORD0_VALUE_BIT_SIZE 0x20UL |
34 | #define CC_DSCRPTR_QUEUE_WORD0_CPP_CIPHER_MODE_BIT_SHIFT 0x5UL | ||
35 | #define CC_DSCRPTR_QUEUE_WORD0_CPP_CIPHER_MODE_BIT_SIZE 0x3UL | ||
36 | #define CC_DSCRPTR_QUEUE_WORD1_REG_OFFSET 0xE84UL | 34 | #define CC_DSCRPTR_QUEUE_WORD1_REG_OFFSET 0xE84UL |
37 | #define CC_DSCRPTR_QUEUE_WORD1_DIN_DMA_MODE_BIT_SHIFT 0x0UL | 35 | #define CC_DSCRPTR_QUEUE_WORD1_DIN_DMA_MODE_BIT_SHIFT 0x0UL |
38 | #define CC_DSCRPTR_QUEUE_WORD1_DIN_DMA_MODE_BIT_SIZE 0x2UL | 36 | #define CC_DSCRPTR_QUEUE_WORD1_DIN_DMA_MODE_BIT_SIZE 0x2UL |
@@ -99,10 +97,6 @@ | |||
99 | #define CC_DSCRPTR_QUEUE_WORD4_WORD_SWAP_BIT_SIZE 0x1UL | 97 | #define CC_DSCRPTR_QUEUE_WORD4_WORD_SWAP_BIT_SIZE 0x1UL |
100 | #define CC_DSCRPTR_QUEUE_WORD4_BYTES_SWAP_BIT_SHIFT 0x1FUL | 98 | #define CC_DSCRPTR_QUEUE_WORD4_BYTES_SWAP_BIT_SHIFT 0x1FUL |
101 | #define CC_DSCRPTR_QUEUE_WORD4_BYTES_SWAP_BIT_SIZE 0x1UL | 99 | #define CC_DSCRPTR_QUEUE_WORD4_BYTES_SWAP_BIT_SIZE 0x1UL |
102 | #define CC_DSCRPTR_QUEUE_WORD4_CPP_SLOT_BIT_SHIFT 0xAUL | ||
103 | #define CC_DSCRPTR_QUEUE_WORD4_CPP_SLOT_BIT_SIZE 0x3UL | ||
104 | #define CC_DSCRPTR_QUEUE_WORD4_CPP_ALG_BIT_SHIFT 0xDUL | ||
105 | #define CC_DSCRPTR_QUEUE_WORD4_CPP_ALG_BIT_SIZE 0x1UL | ||
106 | #define CC_DSCRPTR_QUEUE_WORD5_REG_OFFSET 0xE94UL | 100 | #define CC_DSCRPTR_QUEUE_WORD5_REG_OFFSET 0xE94UL |
107 | #define CC_DSCRPTR_QUEUE_WORD5_DIN_ADDR_HIGH_BIT_SHIFT 0x0UL | 101 | #define CC_DSCRPTR_QUEUE_WORD5_DIN_ADDR_HIGH_BIT_SHIFT 0x0UL |
108 | #define CC_DSCRPTR_QUEUE_WORD5_DIN_ADDR_HIGH_BIT_SIZE 0x10UL | 102 | #define CC_DSCRPTR_QUEUE_WORD5_DIN_ADDR_HIGH_BIT_SIZE 0x10UL |