Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

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>

authored by

Andrey Smirnov and committed by
Herbert Xu
a1cf573e dff36801

+63 -26
+4 -4
drivers/crypto/caam/caampkc.c
··· 17 17 #include "sg_sw_sec4.h" 18 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 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 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 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 27 #define CAAM_RSA_MAX_INPUT_SIZE 512 /* for a 4096-bit modulus */ 28 28 29 29 /* buffer filled with zeros, used for padding */
+4 -1
drivers/crypto/caam/ctrl.c
··· 602 602 caam_imx = (bool)imx_soc_match; 603 603 604 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 609 caam_dpaa2 = !!(comp_params & CTPR_MS_DPAA2); 607 610 ctrlpriv->qi_present = !!(comp_params & CTPR_MS_QI_MASK); 608 611
+8 -2
drivers/crypto/caam/desc_constr.h
··· 136 136 137 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 149 (*desc) = cpu_to_caam32(caam32_to_cpu(*desc) + 144 150 CAAM_PTR_SZ / CAAM_CMD_SZ);
+1 -1
drivers/crypto/caam/intern.h
··· 219 219 { 220 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 223 return DMA_BIT_MASK(32); 224 224 225 225 if (caam_dpaa2)
+12 -4
drivers/crypto/caam/pdb.h
··· 512 512 dma_addr_t n_dma; 513 513 dma_addr_t e_dma; 514 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 520 * RSA Decrypt PDB - Private Key Form #1 ··· 530 528 dma_addr_t f_dma; 531 529 dma_addr_t n_dma; 532 530 dma_addr_t d_dma; 533 - } __packed; 531 + }; 532 + 533 + #define SIZEOF_RSA_PRIV_F1_PDB (sizeof(u32) + 4 * caam_ptr_sz) 534 534 535 535 /** 536 536 * RSA Decrypt PDB - Private Key Form #2 ··· 558 554 dma_addr_t tmp1_dma; 559 555 dma_addr_t tmp2_dma; 560 556 u32 p_q_len; 561 - } __packed; 557 + }; 558 + 559 + #define SIZEOF_RSA_PRIV_F2_PDB (2 * sizeof(u32) + 7 * caam_ptr_sz) 562 560 563 561 /** 564 562 * RSA Decrypt PDB - Private Key Form #3 ··· 592 586 dma_addr_t tmp1_dma; 593 587 dma_addr_t tmp2_dma; 594 588 u32 p_q_len; 595 - } __packed; 589 + }; 590 + 591 + #define SIZEOF_RSA_PRIV_F3_PDB (2 * sizeof(u32) + 9 * caam_ptr_sz) 596 592 597 593 #endif
+4 -4
drivers/crypto/caam/pkc_desc.c
··· 13 13 /* Descriptor for RSA Public operation */ 14 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 17 append_cmd(desc, pdb->sgf); 18 18 append_ptr(desc, pdb->f_dma); 19 19 append_ptr(desc, pdb->g_dma); ··· 26 26 /* Descriptor for RSA Private operation - Private Key Form #1 */ 27 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 30 append_cmd(desc, pdb->sgf); 31 31 append_ptr(desc, pdb->g_dma); 32 32 append_ptr(desc, pdb->f_dma); ··· 39 39 /* Descriptor for RSA Private operation - Private Key Form #2 */ 40 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 43 append_cmd(desc, pdb->sgf); 44 44 append_ptr(desc, pdb->g_dma); 45 45 append_ptr(desc, pdb->f_dma); ··· 56 56 /* Descriptor for RSA Private operation - Private Key Form #3 */ 57 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 60 append_cmd(desc, pdb->sgf); 61 61 append_ptr(desc, pdb->g_dma); 62 62 append_ptr(desc, pdb->f_dma);
+30 -10
drivers/crypto/caam/regs.h
··· 191 191 192 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 196 return cpu_to_caam_dma64(value); 196 197 else 197 198 return cpu_to_caam32(value); ··· 200 199 201 200 static inline u64 caam_dma_to_cpu(u64 value) 202 201 { 203 - if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT)) 202 + if (IS_ENABLED(CONFIG_ARCH_DMA_ADDR_T_64BIT) && 203 + caam_ptr_sz == sizeof(u64)) 204 204 return caam_dma64_to_cpu(value); 205 205 else 206 206 return caam32_to_cpu(value); ··· 215 213 static inline void jr_outentry_get(void *outring, int hw_idx, dma_addr_t *desc, 216 214 u32 *jrstatus) 217 215 { 218 - struct { 219 - dma_addr_t desc;/* Pointer to completed descriptor */ 220 - u32 jrstatus; /* Status for completed descriptor */ 221 - } __packed *outentry = outring; 222 216 223 - *desc = outentry[hw_idx].desc; 224 - *jrstatus = outentry[hw_idx].jrstatus; 217 + if (caam_ptr_sz == sizeof(u32)) { 218 + struct { 219 + u32 desc; 220 + u32 jrstatus; 221 + } __packed *outentry = outring; 222 + 223 + *desc = outentry[hw_idx].desc; 224 + *jrstatus = outentry[hw_idx].jrstatus; 225 + } else { 226 + struct { 227 + dma_addr_t desc;/* Pointer to completed descriptor */ 228 + u32 jrstatus; /* Status for completed descriptor */ 229 + } __packed *outentry = outring; 230 + 231 + *desc = outentry[hw_idx].desc; 232 + *jrstatus = outentry[hw_idx].jrstatus; 233 + } 225 234 } 226 235 227 236 #define SIZEOF_JR_OUTENTRY (caam_ptr_sz + sizeof(u32)) ··· 259 246 260 247 static inline void jr_inpentry_set(void *inpring, int hw_idx, dma_addr_t val) 261 248 { 262 - dma_addr_t *inpentry = inpring; 249 + if (caam_ptr_sz == sizeof(u32)) { 250 + u32 *inpentry = inpring; 263 251 264 - inpentry[hw_idx] = val; 252 + inpentry[hw_idx] = val; 253 + } else { 254 + dma_addr_t *inpentry = inpring; 255 + 256 + inpentry[hw_idx] = val; 257 + } 265 258 } 266 259 267 260 #define SIZEOF_JR_INPENTRY caam_ptr_sz ··· 399 380 u32 cha_rev_ls; /* CRNR - CHA Rev No. Least significant half*/ 400 381 #define CTPR_MS_QI_SHIFT 25 401 382 #define CTPR_MS_QI_MASK (0x1ull << CTPR_MS_QI_SHIFT) 383 + #define CTPR_MS_PS BIT(17) 402 384 #define CTPR_MS_DPAA2 BIT(13) 403 385 #define CTPR_MS_VIRT_EN_INCL 0x00000001 404 386 #define CTPR_MS_VIRT_EN_POR 0x00000002