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

crypto: caam - keep both virtual and dma key addresses

Update alginfo struct to keep both virtual and dma key addresses,
so that descriptors have them at hand.
One example where this is needed is in the xcbc(aes) shared descriptors,
which are updated in current patch.
Another example is the upcoming fix for DKP.

Signed-off-by: Horia Geantă <horia.geanta@nxp.com>
Reviewed-by: Iuliana Prodan <iuliana.prodan@nxp.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>

authored by

Horia Geantă and committed by
Herbert Xu
a2fb864c d28a43ed

+24 -30
+17 -20
drivers/crypto/caam/caamhash.c
··· 95 95 dma_addr_t sh_desc_update_first_dma; 96 96 dma_addr_t sh_desc_fin_dma; 97 97 dma_addr_t sh_desc_digest_dma; 98 - dma_addr_t key_dma; 99 98 enum dma_data_direction dir; 100 99 struct device *jrdev; 101 100 int ctx_len; ··· 281 282 struct device *jrdev = ctx->jrdev; 282 283 u32 *desc; 283 284 284 - /* key is loaded from memory for UPDATE and FINALIZE states */ 285 - ctx->adata.key_dma = ctx->key_dma; 286 - 287 285 /* shared descriptor for ahash_update */ 288 286 desc = ctx->sh_desc_update; 289 287 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_UPDATE, 290 - ctx->ctx_len, ctx->ctx_len, 0); 288 + ctx->ctx_len, ctx->ctx_len); 291 289 dma_sync_single_for_device(jrdev, ctx->sh_desc_update_dma, 292 290 desc_bytes(desc), ctx->dir); 293 291 print_hex_dump_debug("axcbc update shdesc@" __stringify(__LINE__)" : ", ··· 294 298 /* shared descriptor for ahash_{final,finup} */ 295 299 desc = ctx->sh_desc_fin; 296 300 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_FINALIZE, 297 - digestsize, ctx->ctx_len, 0); 301 + digestsize, ctx->ctx_len); 298 302 dma_sync_single_for_device(jrdev, ctx->sh_desc_fin_dma, 299 303 desc_bytes(desc), ctx->dir); 300 304 print_hex_dump_debug("axcbc finup shdesc@" __stringify(__LINE__)" : ", ··· 307 311 /* shared descriptor for first invocation of ahash_update */ 308 312 desc = ctx->sh_desc_update_first; 309 313 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len, 310 - ctx->ctx_len, ctx->key_dma); 314 + ctx->ctx_len); 311 315 dma_sync_single_for_device(jrdev, ctx->sh_desc_update_first_dma, 312 316 desc_bytes(desc), ctx->dir); 313 317 print_hex_dump_debug("axcbc update first shdesc@" __stringify(__LINE__) ··· 317 321 /* shared descriptor for ahash_digest */ 318 322 desc = ctx->sh_desc_digest; 319 323 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INITFINAL, 320 - digestsize, ctx->ctx_len, 0); 324 + digestsize, ctx->ctx_len); 321 325 dma_sync_single_for_device(jrdev, ctx->sh_desc_digest_dma, 322 326 desc_bytes(desc), ctx->dir); 323 327 print_hex_dump_debug("axcbc digest shdesc@" __stringify(__LINE__)" : ", ··· 336 340 /* shared descriptor for ahash_update */ 337 341 desc = ctx->sh_desc_update; 338 342 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_UPDATE, 339 - ctx->ctx_len, ctx->ctx_len, 0); 343 + ctx->ctx_len, ctx->ctx_len); 340 344 dma_sync_single_for_device(jrdev, ctx->sh_desc_update_dma, 341 345 desc_bytes(desc), ctx->dir); 342 346 print_hex_dump_debug("acmac update shdesc@" __stringify(__LINE__)" : ", ··· 346 350 /* shared descriptor for ahash_{final,finup} */ 347 351 desc = ctx->sh_desc_fin; 348 352 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_FINALIZE, 349 - digestsize, ctx->ctx_len, 0); 353 + digestsize, ctx->ctx_len); 350 354 dma_sync_single_for_device(jrdev, ctx->sh_desc_fin_dma, 351 355 desc_bytes(desc), ctx->dir); 352 356 print_hex_dump_debug("acmac finup shdesc@" __stringify(__LINE__)" : ", ··· 356 360 /* shared descriptor for first invocation of ahash_update */ 357 361 desc = ctx->sh_desc_update_first; 358 362 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INIT, ctx->ctx_len, 359 - ctx->ctx_len, 0); 363 + ctx->ctx_len); 360 364 dma_sync_single_for_device(jrdev, ctx->sh_desc_update_first_dma, 361 365 desc_bytes(desc), ctx->dir); 362 366 print_hex_dump_debug("acmac update first shdesc@" __stringify(__LINE__) ··· 366 370 /* shared descriptor for ahash_digest */ 367 371 desc = ctx->sh_desc_digest; 368 372 cnstr_shdsc_sk_hash(desc, &ctx->adata, OP_ALG_AS_INITFINAL, 369 - digestsize, ctx->ctx_len, 0); 373 + digestsize, ctx->ctx_len); 370 374 dma_sync_single_for_device(jrdev, ctx->sh_desc_digest_dma, 371 375 desc_bytes(desc), ctx->dir); 372 376 print_hex_dump_debug("acmac digest shdesc@" __stringify(__LINE__)" : ", ··· 503 507 } 504 508 505 509 memcpy(ctx->key, key, keylen); 506 - dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, DMA_TO_DEVICE); 510 + dma_sync_single_for_device(jrdev, ctx->adata.key_dma, keylen, 511 + DMA_TO_DEVICE); 507 512 ctx->adata.keylen = keylen; 508 513 509 514 print_hex_dump_debug("axcbc ctx.key@" __stringify(__LINE__)" : ", ··· 1828 1831 ctx->adata.algtype = OP_TYPE_CLASS1_ALG | caam_hash->alg_type; 1829 1832 ctx->ctx_len = 48; 1830 1833 1831 - ctx->key_dma = dma_map_single_attrs(ctx->jrdev, ctx->key, 1832 - ARRAY_SIZE(ctx->key), 1833 - DMA_BIDIRECTIONAL, 1834 - DMA_ATTR_SKIP_CPU_SYNC); 1835 - if (dma_mapping_error(ctx->jrdev, ctx->key_dma)) { 1834 + ctx->adata.key_dma = dma_map_single_attrs(ctx->jrdev, ctx->key, 1835 + ARRAY_SIZE(ctx->key), 1836 + DMA_BIDIRECTIONAL, 1837 + DMA_ATTR_SKIP_CPU_SYNC); 1838 + if (dma_mapping_error(ctx->jrdev, ctx->adata.key_dma)) { 1836 1839 dev_err(ctx->jrdev, "unable to map key\n"); 1837 1840 caam_jr_free(ctx->jrdev); 1838 1841 return -ENOMEM; ··· 1856 1859 dev_err(ctx->jrdev, "unable to map shared descriptors\n"); 1857 1860 1858 1861 if (is_xcbc_aes(caam_hash->alg_type)) 1859 - dma_unmap_single_attrs(ctx->jrdev, ctx->key_dma, 1862 + dma_unmap_single_attrs(ctx->jrdev, ctx->adata.key_dma, 1860 1863 ARRAY_SIZE(ctx->key), 1861 1864 DMA_BIDIRECTIONAL, 1862 1865 DMA_ATTR_SKIP_CPU_SYNC); ··· 1892 1895 offsetof(struct caam_hash_ctx, key), 1893 1896 ctx->dir, DMA_ATTR_SKIP_CPU_SYNC); 1894 1897 if (is_xcbc_aes(ctx->adata.algtype)) 1895 - dma_unmap_single_attrs(ctx->jrdev, ctx->key_dma, 1898 + dma_unmap_single_attrs(ctx->jrdev, ctx->adata.key_dma, 1896 1899 ARRAY_SIZE(ctx->key), DMA_BIDIRECTIONAL, 1897 1900 DMA_ATTR_SKIP_CPU_SYNC); 1898 1901 caam_jr_free(ctx->jrdev);
+2 -3
drivers/crypto/caam/caamhash_desc.c
··· 83 83 * @state: algorithm state OP_ALG_AS_{INIT, FINALIZE, INITFINALIZE, UPDATE} 84 84 * @digestsize: algorithm's digest size 85 85 * @ctx_len: size of Context Register 86 - * @key_dma: I/O Virtual Address of the key 87 86 */ 88 87 void cnstr_shdsc_sk_hash(u32 * const desc, struct alginfo *adata, u32 state, 89 - int digestsize, int ctx_len, dma_addr_t key_dma) 88 + int digestsize, int ctx_len) 90 89 { 91 90 u32 *skip_key_load; 92 91 ··· 135 136 LDST_SRCDST_BYTE_CONTEXT); 136 137 if (is_xcbc_aes(adata->algtype) && state == OP_ALG_AS_INIT) 137 138 /* Save K1 */ 138 - append_fifo_store(desc, key_dma, adata->keylen, 139 + append_fifo_store(desc, adata->key_dma, adata->keylen, 139 140 LDST_CLASS_1_CCB | FIFOST_TYPE_KEY_KEK); 140 141 } 141 142 EXPORT_SYMBOL(cnstr_shdsc_sk_hash);
+1 -1
drivers/crypto/caam/caamhash_desc.h
··· 25 25 int digestsize, int ctx_len, bool import_ctx, int era); 26 26 27 27 void cnstr_shdsc_sk_hash(u32 * const desc, struct alginfo *adata, u32 state, 28 - int digestsize, int ctx_len, dma_addr_t key_dma); 28 + int digestsize, int ctx_len); 29 29 #endif /* _CAAMHASH_DESC_H_ */
+4 -6
drivers/crypto/caam/desc_constr.h
··· 457 457 * functions where it is used. 458 458 * @keylen: length of the provided algorithm key, in bytes 459 459 * @keylen_pad: padded length of the provided algorithm key, in bytes 460 - * @key: address where algorithm key resides; virtual address if key_inline 461 - * is true, dma (bus) address if key_inline is false. 460 + * @key_dma: dma (bus) address where algorithm key resides 461 + * @key_virt: virtual address where algorithm key resides 462 462 * @key_inline: true - key can be inlined in the descriptor; false - key is 463 463 * referenced by the descriptor 464 464 */ ··· 466 466 u32 algtype; 467 467 unsigned int keylen; 468 468 unsigned int keylen_pad; 469 - union { 470 - dma_addr_t key_dma; 471 - const void *key_virt; 472 - }; 469 + dma_addr_t key_dma; 470 + const void *key_virt; 473 471 bool key_inline; 474 472 }; 475 473