aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorGilad Ben-Yossef <gilad@benyossef.com>2019-04-18 09:38:43 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-04-25 03:38:13 -0400
commit533edf9f93e84cabeae7c1acc8b3816c79f6f35a (patch)
treedd6df8810b64bfae7f8e34aeb3b3f8c829609b53
parentbee711fa354e03efab2862443c17b575b3671cbc (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.c42
-rw-r--r--drivers/crypto/ccree/cc_hw_queue_defs.h18
-rw-r--r--drivers/crypto/ccree/cc_kernel_regs.h6
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
549static 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
550static void cc_setup_key_desc(struct crypto_tfm *tfm, 563static 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 */
275static inline void set_cpp_crypto_key(struct cc_hw_desc *pdesc, 274static 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