aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/crypto
diff options
context:
space:
mode:
authorAndrey Smirnov <andrew.smirnov@gmail.com>2019-08-20 16:23:59 -0400
committerHerbert Xu <herbert@gondor.apana.org.au>2019-08-30 04:05:30 -0400
commita1cf573ee95d5a15bdd1d33310d179d92b229dd1 (patch)
tree96a1ac431cc4109999c499f574b10684b39a7714 /drivers/crypto
parentdff36801a9f0cca4f8b074b4c8229dcc0400acd1 (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.c8
-rw-r--r--drivers/crypto/caam/ctrl.c5
-rw-r--r--drivers/crypto/caam/desc_constr.h10
-rw-r--r--drivers/crypto/caam/intern.h2
-rw-r--r--drivers/crypto/caam/pdb.h16
-rw-r--r--drivers/crypto/caam/pkc_desc.c8
-rw-r--r--drivers/crypto/caam/regs.h40
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
137static inline void append_ptr(u32 * const desc, dma_addr_t ptr) 137static 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 */
14void init_rsa_pub_desc(u32 *desc, struct rsa_pub_pdb *pdb) 14void 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 */
27void init_rsa_priv_f1_desc(u32 *desc, struct rsa_priv_f1_pdb *pdb) 27void 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 */
40void init_rsa_priv_f2_desc(u32 *desc, struct rsa_priv_f2_pdb *pdb) 40void 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 */
57void init_rsa_priv_f3_desc(u32 *desc, struct rsa_priv_f3_pdb *pdb) 57void 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
192static inline u64 cpu_to_caam_dma(u64 value) 192static 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
200static inline u64 caam_dma_to_cpu(u64 value) 201static 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)
213static inline void jr_outentry_get(void *outring, int hw_idx, dma_addr_t *desc, 215static 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
247static inline void jr_inpentry_set(void *inpring, int hw_idx, dma_addr_t val) 260static 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