diff options
author | Andrey Smirnov <andrew.smirnov@gmail.com> | 2019-08-20 16:23:59 -0400 |
---|---|---|
committer | Herbert Xu <herbert@gondor.apana.org.au> | 2019-08-30 04:05:30 -0400 |
commit | a1cf573ee95d5a15bdd1d33310d179d92b229dd1 (patch) | |
tree | 96a1ac431cc4109999c499f574b10684b39a7714 /drivers/crypto | |
parent | dff36801a9f0cca4f8b074b4c8229dcc0400acd1 (diff) |
crypto: caam - select DMA address size at runtime
i.MX8 mScale SoC still use 32-bit addresses in its CAAM implmentation,
so we can't rely on sizeof(dma_addr_t) to detemine CAAM pointer
size. Convert the code to query CTPR and MCFGR for that during driver
probing.
Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Cc: Chris Spencer <christopher.spencer@sea.co.uk>
Cc: Cory Tusar <cory.tusar@zii.aero>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Horia Geantă <horia.geanta@nxp.com>
Cc: Aymen Sghaier <aymen.sghaier@nxp.com>
Cc: Leonard Crestez <leonard.crestez@nxp.com>
Cc: linux-crypto@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/caam/caampkc.c | 8 | ||||
-rw-r--r-- | drivers/crypto/caam/ctrl.c | 5 | ||||
-rw-r--r-- | drivers/crypto/caam/desc_constr.h | 10 | ||||
-rw-r--r-- | drivers/crypto/caam/intern.h | 2 | ||||
-rw-r--r-- | drivers/crypto/caam/pdb.h | 16 | ||||
-rw-r--r-- | drivers/crypto/caam/pkc_desc.c | 8 | ||||
-rw-r--r-- | drivers/crypto/caam/regs.h | 40 |
7 files changed, 63 insertions, 26 deletions
diff --git a/drivers/crypto/caam/caampkc.c b/drivers/crypto/caam/caampkc.c index 5b12b232ee5e..83f96d4f86e0 100644 --- a/drivers/crypto/caam/caampkc.c +++ b/drivers/crypto/caam/caampkc.c | |||
@@ -17,13 +17,13 @@ | |||
17 | #include "sg_sw_sec4.h" | 17 | #include "sg_sw_sec4.h" |
18 | #include "caampkc.h" | 18 | #include "caampkc.h" |
19 | 19 | ||
20 | #define DESC_RSA_PUB_LEN (2 * CAAM_CMD_SZ + sizeof(struct rsa_pub_pdb)) | 20 | #define DESC_RSA_PUB_LEN (2 * CAAM_CMD_SZ + SIZEOF_RSA_PUB_PDB) |
21 | #define DESC_RSA_PRIV_F1_LEN (2 * CAAM_CMD_SZ + \ | 21 | #define DESC_RSA_PRIV_F1_LEN (2 * CAAM_CMD_SZ + \ |
22 | sizeof(struct rsa_priv_f1_pdb)) | 22 | SIZEOF_RSA_PRIV_F1_PDB) |
23 | #define DESC_RSA_PRIV_F2_LEN (2 * CAAM_CMD_SZ + \ | 23 | #define DESC_RSA_PRIV_F2_LEN (2 * CAAM_CMD_SZ + \ |
24 | sizeof(struct rsa_priv_f2_pdb)) | 24 | SIZEOF_RSA_PRIV_F2_PDB) |
25 | #define DESC_RSA_PRIV_F3_LEN (2 * CAAM_CMD_SZ + \ | 25 | #define DESC_RSA_PRIV_F3_LEN (2 * CAAM_CMD_SZ + \ |
26 | sizeof(struct rsa_priv_f3_pdb)) | 26 | SIZEOF_RSA_PRIV_F3_PDB) |
27 | #define CAAM_RSA_MAX_INPUT_SIZE 512 /* for a 4096-bit modulus */ | 27 | #define CAAM_RSA_MAX_INPUT_SIZE 512 /* for a 4096-bit modulus */ |
28 | 28 | ||
29 | /* buffer filled with zeros, used for padding */ | 29 | /* buffer filled with zeros, used for padding */ |
diff --git a/drivers/crypto/caam/ctrl.c b/drivers/crypto/caam/ctrl.c index 47b92451756f..4b7f95f64e34 100644 --- a/drivers/crypto/caam/ctrl.c +++ b/drivers/crypto/caam/ctrl.c | |||
@@ -602,7 +602,10 @@ static int caam_probe(struct platform_device *pdev) | |||
602 | caam_imx = (bool)imx_soc_match; | 602 | caam_imx = (bool)imx_soc_match; |
603 | 603 | ||
604 | comp_params = rd_reg32(&ctrl->perfmon.comp_parms_ms); | 604 | comp_params = rd_reg32(&ctrl->perfmon.comp_parms_ms); |
605 | caam_ptr_sz = sizeof(dma_addr_t); | 605 | if (comp_params & CTPR_MS_PS && rd_reg32(&ctrl->mcr) & MCFGR_LONG_PTR) |
606 | caam_ptr_sz = sizeof(u64); | ||
607 | else | ||
608 | caam_ptr_sz = sizeof(u32); | ||
606 | caam_dpaa2 = !!(comp_params & CTPR_MS_DPAA2); | 609 | caam_dpaa2 = !!(comp_params & CTPR_MS_DPAA2); |
607 | ctrlpriv->qi_present = !!(comp_params & CTPR_MS_QI_MASK); | 610 | ctrlpriv->qi_present = !!(comp_params & CTPR_MS_QI_MASK); |
608 | 611 | ||
diff --git a/drivers/crypto/caam/desc_constr.h b/drivers/crypto/caam/desc_constr.h index 89187831d74f..62ce6421bb3f 100644 --- a/drivers/crypto/caam/desc_constr.h +++ b/drivers/crypto/caam/desc_constr.h | |||
@@ -136,9 +136,15 @@ static inline void init_job_desc_pdb(u32 * const desc, u32 options, | |||
136 | 136 | ||
137 | static inline void append_ptr(u32 * const desc, dma_addr_t ptr) | 137 | static inline void append_ptr(u32 * const desc, dma_addr_t ptr) |
138 | { | 138 | { |
139 | dma_addr_t *offset = (dma_addr_t *)desc_end(desc); | 139 | if (caam_ptr_sz == sizeof(dma_addr_t)) { |
140 | dma_addr_t *offset = (dma_addr_t *)desc_end(desc); | ||
140 | 141 | ||
141 | *offset = cpu_to_caam_dma(ptr); | 142 | *offset = cpu_to_caam_dma(ptr); |
143 | } else { | ||
144 | u32 *offset = (u32 *)desc_end(desc); | ||
145 | |||
146 | *offset = cpu_to_caam_dma(ptr); | ||
147 | } | ||
142 | 148 | ||
143 | (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + | 149 | (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + |
144 | CAAM_PTR_SZ / CAAM_CMD_SZ); | 150 | CAAM_PTR_SZ / CAAM_CMD_SZ); |
diff --git a/drivers/crypto/caam/intern.h b/drivers/crypto/caam/intern.h index c00c7c84ec84..731b06becd9c 100644 --- a/drivers/crypto/caam/intern.h +++ b/drivers/crypto/caam/intern.h | |||
@@ -219,7 +219,7 @@ static inline u64 caam_get_dma_mask(struct device *dev) | |||
219 | { | 219 | { |
220 | struct device_node *nprop = dev->of_node; | 220 | struct device_node *nprop = dev->of_node; |
221 | 221 | ||
222 | if (sizeof(dma_addr_t) != sizeof(u64)) | 222 | if (caam_ptr_sz != sizeof(u64)) |
223 | return DMA_BIT_MASK(32); | 223 | return DMA_BIT_MASK(32); |
224 | 224 | ||
225 | if (caam_dpaa2) | 225 | if (caam_dpaa2) |
diff --git a/drivers/crypto/caam/pdb.h b/drivers/crypto/caam/pdb.h index 810f0bef0652..68c1fd5dee5d 100644 --- a/drivers/crypto/caam/pdb.h +++ b/drivers/crypto/caam/pdb.h | |||
@@ -512,7 +512,9 @@ struct rsa_pub_pdb { | |||
512 | dma_addr_t n_dma; | 512 | dma_addr_t n_dma; |
513 | dma_addr_t e_dma; | 513 | dma_addr_t e_dma; |
514 | u32 f_len; | 514 | u32 f_len; |
515 | } __packed; | 515 | }; |
516 | |||
517 | #define SIZEOF_RSA_PUB_PDB (2 * sizeof(u32) + 4 * caam_ptr_sz) | ||
516 | 518 | ||
517 | /** | 519 | /** |
518 | * RSA Decrypt PDB - Private Key Form #1 | 520 | * RSA Decrypt PDB - Private Key Form #1 |
@@ -528,7 +530,9 @@ struct rsa_priv_f1_pdb { | |||
528 | dma_addr_t f_dma; | 530 | dma_addr_t f_dma; |
529 | dma_addr_t n_dma; | 531 | dma_addr_t n_dma; |
530 | dma_addr_t d_dma; | 532 | dma_addr_t d_dma; |
531 | } __packed; | 533 | }; |
534 | |||
535 | #define SIZEOF_RSA_PRIV_F1_PDB (sizeof(u32) + 4 * caam_ptr_sz) | ||
532 | 536 | ||
533 | /** | 537 | /** |
534 | * RSA Decrypt PDB - Private Key Form #2 | 538 | * RSA Decrypt PDB - Private Key Form #2 |
@@ -554,7 +558,9 @@ struct rsa_priv_f2_pdb { | |||
554 | dma_addr_t tmp1_dma; | 558 | dma_addr_t tmp1_dma; |
555 | dma_addr_t tmp2_dma; | 559 | dma_addr_t tmp2_dma; |
556 | u32 p_q_len; | 560 | u32 p_q_len; |
557 | } __packed; | 561 | }; |
562 | |||
563 | #define SIZEOF_RSA_PRIV_F2_PDB (2 * sizeof(u32) + 7 * caam_ptr_sz) | ||
558 | 564 | ||
559 | /** | 565 | /** |
560 | * RSA Decrypt PDB - Private Key Form #3 | 566 | * RSA Decrypt PDB - Private Key Form #3 |
@@ -586,6 +592,8 @@ struct rsa_priv_f3_pdb { | |||
586 | dma_addr_t tmp1_dma; | 592 | dma_addr_t tmp1_dma; |
587 | dma_addr_t tmp2_dma; | 593 | dma_addr_t tmp2_dma; |
588 | u32 p_q_len; | 594 | u32 p_q_len; |
589 | } __packed; | 595 | }; |
596 | |||
597 | #define SIZEOF_RSA_PRIV_F3_PDB (2 * sizeof(u32) + 9 * caam_ptr_sz) | ||
590 | 598 | ||
591 | #endif | 599 | #endif |
diff --git a/drivers/crypto/caam/pkc_desc.c b/drivers/crypto/caam/pkc_desc.c index 2a8d87ea94bf..0d5ee762e036 100644 --- a/drivers/crypto/caam/pkc_desc.c +++ b/drivers/crypto/caam/pkc_desc.c | |||
@@ -13,7 +13,7 @@ | |||
13 | /* Descriptor for RSA Public operation */ | 13 | /* Descriptor for RSA Public operation */ |
14 | void init_rsa_pub_desc(u32 *desc, struct rsa_pub_pdb *pdb) | 14 | void init_rsa_pub_desc(u32 *desc, struct rsa_pub_pdb *pdb) |
15 | { | 15 | { |
16 | init_job_desc_pdb(desc, 0, sizeof(*pdb)); | 16 | init_job_desc_pdb(desc, 0, SIZEOF_RSA_PUB_PDB); |
17 | append_cmd(desc, pdb->sgf); | 17 | append_cmd(desc, pdb->sgf); |
18 | append_ptr(desc, pdb->f_dma); | 18 | append_ptr(desc, pdb->f_dma); |
19 | append_ptr(desc, pdb->g_dma); | 19 | append_ptr(desc, pdb->g_dma); |
@@ -26,7 +26,7 @@ void init_rsa_pub_desc(u32 *desc, struct rsa_pub_pdb *pdb) | |||
26 | /* Descriptor for RSA Private operation - Private Key Form #1 */ | 26 | /* Descriptor for RSA Private operation - Private Key Form #1 */ |
27 | void init_rsa_priv_f1_desc(u32 *desc, struct rsa_priv_f1_pdb *pdb) | 27 | void init_rsa_priv_f1_desc(u32 *desc, struct rsa_priv_f1_pdb *pdb) |
28 | { | 28 | { |
29 | init_job_desc_pdb(desc, 0, sizeof(*pdb)); | 29 | init_job_desc_pdb(desc, 0, SIZEOF_RSA_PRIV_F1_PDB); |
30 | append_cmd(desc, pdb->sgf); | 30 | append_cmd(desc, pdb->sgf); |
31 | append_ptr(desc, pdb->g_dma); | 31 | append_ptr(desc, pdb->g_dma); |
32 | append_ptr(desc, pdb->f_dma); | 32 | append_ptr(desc, pdb->f_dma); |
@@ -39,7 +39,7 @@ void init_rsa_priv_f1_desc(u32 *desc, struct rsa_priv_f1_pdb *pdb) | |||
39 | /* Descriptor for RSA Private operation - Private Key Form #2 */ | 39 | /* Descriptor for RSA Private operation - Private Key Form #2 */ |
40 | void init_rsa_priv_f2_desc(u32 *desc, struct rsa_priv_f2_pdb *pdb) | 40 | void init_rsa_priv_f2_desc(u32 *desc, struct rsa_priv_f2_pdb *pdb) |
41 | { | 41 | { |
42 | init_job_desc_pdb(desc, 0, sizeof(*pdb)); | 42 | init_job_desc_pdb(desc, 0, SIZEOF_RSA_PRIV_F2_PDB); |
43 | append_cmd(desc, pdb->sgf); | 43 | append_cmd(desc, pdb->sgf); |
44 | append_ptr(desc, pdb->g_dma); | 44 | append_ptr(desc, pdb->g_dma); |
45 | append_ptr(desc, pdb->f_dma); | 45 | append_ptr(desc, pdb->f_dma); |
@@ -56,7 +56,7 @@ void init_rsa_priv_f2_desc(u32 *desc, struct rsa_priv_f2_pdb *pdb) | |||
56 | /* Descriptor for RSA Private operation - Private Key Form #3 */ | 56 | /* Descriptor for RSA Private operation - Private Key Form #3 */ |
57 | void init_rsa_priv_f3_desc(u32 *desc, struct rsa_priv_f3_pdb *pdb) | 57 | void init_rsa_priv_f3_desc(u32 *desc, struct rsa_priv_f3_pdb *pdb) |
58 | { | 58 | { |
59 | init_job_desc_pdb(desc, 0, sizeof(*pdb)); | 59 | init_job_desc_pdb(desc, 0, SIZEOF_RSA_PRIV_F3_PDB); |
60 | append_cmd(desc, pdb->sgf); | 60 | append_cmd(desc, pdb->sgf); |
61 | append_ptr(desc, pdb->g_dma); | 61 | append_ptr(desc, pdb->g_dma); |
62 | append_ptr(desc, pdb->f_dma); | 62 | append_ptr(desc, pdb->f_dma); |
diff --git a/drivers/crypto/caam/regs.h b/drivers/crypto/caam/regs.h index 6dbb269a3e7e..05127b70527d 100644 --- a/drivers/crypto/caam/regs.h +++ b/drivers/crypto/caam/regs.h | |||
@@ -191,7 +191,8 @@ static inline u64 caam_dma64_to_cpu(u64 value) | |||
191 | 191 | ||
192 | static inline u64 cpu_to_caam_dma(u64 value) | 192 | static inline u64 cpu_to_caam_dma(u64 value) |
193 | { | 193 | { |
194 | if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT)) | 194 | if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) && |
195 | caam_ptr_sz == sizeof(u64)) | ||
195 | return cpu_to_caam_dma64(value); | 196 | return cpu_to_caam_dma64(value); |
196 | else | 197 | else |
197 | return cpu_to_caam32(value); | 198 | return cpu_to_caam32(value); |
@@ -199,7 +200,8 @@ static inline u64 cpu_to_caam_dma(u64 value) | |||
199 | 200 | ||
200 | static inline u64 caam_dma_to_cpu(u64 value) | 201 | static inline u64 caam_dma_to_cpu(u64 value) |
201 | { | 202 | { |
202 | if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT)) | 203 | if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) && |
204 | caam_ptr_sz == sizeof(u64)) | ||
203 | return caam_dma64_to_cpu(value); | 205 | return caam_dma64_to_cpu(value); |
204 | else | 206 | else |
205 | return caam32_to_cpu(value); | 207 | return caam32_to_cpu(value); |
@@ -213,13 +215,24 @@ static inline u64 caam_dma_to_cpu(u64 value) | |||
213 | static inline void jr_outentry_get(void *outring, int hw_idx, dma_addr_t *desc, | 215 | static inline void jr_outentry_get(void *outring, int hw_idx, dma_addr_t *desc, |
214 | u32 *jrstatus) | 216 | u32 *jrstatus) |
215 | { | 217 | { |
216 | struct { | ||
217 | dma_addr_t desc;/* Pointer to completed descriptor */ | ||
218 | u32 jrstatus; /* Status for completed descriptor */ | ||
219 | } __packed *outentry = outring; | ||
220 | 218 | ||
221 | *desc = outentry[hw_idx].desc; | 219 | if (caam_ptr_sz == sizeof(u32)) { |
222 | *jrstatus = outentry[hw_idx].jrstatus; | 220 | struct { |
221 | u32 desc; | ||
222 | u32 jrstatus; | ||
223 | } __packed *outentry = outring; | ||
224 | |||
225 | *desc = outentry[hw_idx].desc; | ||
226 | *jrstatus = outentry[hw_idx].jrstatus; | ||
227 | } else { | ||
228 | struct { | ||
229 | dma_addr_t desc;/* Pointer to completed descriptor */ | ||
230 | u32 jrstatus; /* Status for completed descriptor */ | ||
231 | } __packed *outentry = outring; | ||
232 | |||
233 | *desc = outentry[hw_idx].desc; | ||
234 | *jrstatus = outentry[hw_idx].jrstatus; | ||
235 | } | ||
223 | } | 236 | } |
224 | 237 | ||
225 | #define SIZEOF_JR_OUTENTRY (caam_ptr_sz + sizeof(u32)) | 238 | #define SIZEOF_JR_OUTENTRY (caam_ptr_sz + sizeof(u32)) |
@@ -246,9 +259,15 @@ static inline u32 jr_outentry_jrstatus(void *outring, int hw_idx) | |||
246 | 259 | ||
247 | static inline void jr_inpentry_set(void *inpring, int hw_idx, dma_addr_t val) | 260 | static inline void jr_inpentry_set(void *inpring, int hw_idx, dma_addr_t val) |
248 | { | 261 | { |
249 | dma_addr_t *inpentry = inpring; | 262 | if (caam_ptr_sz == sizeof(u32)) { |
263 | u32 *inpentry = inpring; | ||
250 | 264 | ||
251 | inpentry[hw_idx] = val; | 265 | inpentry[hw_idx] = val; |
266 | } else { | ||
267 | dma_addr_t *inpentry = inpring; | ||
268 | |||
269 | inpentry[hw_idx] = val; | ||
270 | } | ||
252 | } | 271 | } |
253 | 272 | ||
254 | #define SIZEOF_JR_INPENTRY caam_ptr_sz | 273 | #define SIZEOF_JR_INPENTRY caam_ptr_sz |
@@ -380,6 +399,7 @@ struct caam_perfmon { | |||
380 | u32 cha_rev_ls; /* CRNR - CHA Rev No. Least significant half*/ | 399 | u32 cha_rev_ls; /* CRNR - CHA Rev No. Least significant half*/ |
381 | #define CTPR_MS_QI_SHIFT 25 | 400 | #define CTPR_MS_QI_SHIFT 25 |
382 | #define CTPR_MS_QI_MASK (0x1ull << CTPR_MS_QI_SHIFT) | 401 | #define CTPR_MS_QI_MASK (0x1ull << CTPR_MS_QI_SHIFT) |
402 | #define CTPR_MS_PS BIT(17) | ||
383 | #define CTPR_MS_DPAA2 BIT(13) | 403 | #define CTPR_MS_DPAA2 BIT(13) |
384 | #define CTPR_MS_VIRT_EN_INCL 0x00000001 | 404 | #define CTPR_MS_VIRT_EN_INCL 0x00000001 |
385 | #define CTPR_MS_VIRT_EN_POR 0x00000002 | 405 | #define CTPR_MS_VIRT_EN_POR 0x00000002 |