提交 a7cd942b 编写于 作者: H Horia Geantă 提交者: Herbert Xu

crypto: caam/qi - DMA map keys using proper device

Currently there is a mismatch b/w the ICID (Isolation Context ID) used
for DMA mapping keys and ICID used for accessing them.
-keys are DMA mapped using a job ring device, thus a job ring ICID
-keys are accessed from descriptors enqueued via Queue Interface,
thus using QI ICID

[Note: ICIDs of JRs, QI are configured by U-boot / other entity by:
-fixing up the corresponding job ring and controller DT nodes
-setting up corresponding caam ICID registers]

In order to avoid IOMMU faults, DMA map the key using the controller
device instead of a job ring device.
Signed-off-by: NHoria Geantă <horia.geanta@nxp.com>
Signed-off-by: NHerbert Xu <herbert@gondor.apana.org.au>
上级 b2b2ee35
...@@ -237,7 +237,7 @@ static int aead_setkey(struct crypto_aead *aead, const u8 *key, ...@@ -237,7 +237,7 @@ static int aead_setkey(struct crypto_aead *aead, const u8 *key,
memcpy(ctx->key, keys.authkey, keys.authkeylen); memcpy(ctx->key, keys.authkey, keys.authkeylen);
memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey,
keys.enckeylen); keys.enckeylen);
dma_sync_single_for_device(jrdev, ctx->key_dma, dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
ctx->adata.keylen_pad + ctx->adata.keylen_pad +
keys.enckeylen, ctx->dir); keys.enckeylen, ctx->dir);
goto skip_split_key; goto skip_split_key;
...@@ -251,8 +251,9 @@ static int aead_setkey(struct crypto_aead *aead, const u8 *key, ...@@ -251,8 +251,9 @@ static int aead_setkey(struct crypto_aead *aead, const u8 *key,
/* postpend encryption key to auth split key */ /* postpend encryption key to auth split key */
memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen); memcpy(ctx->key + ctx->adata.keylen_pad, keys.enckey, keys.enckeylen);
dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->adata.keylen_pad + dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
keys.enckeylen, ctx->dir); ctx->adata.keylen_pad + keys.enckeylen,
ctx->dir);
#ifdef DEBUG #ifdef DEBUG
print_hex_dump(KERN_ERR, "ctx.key@" __stringify(__LINE__)": ", print_hex_dump(KERN_ERR, "ctx.key@" __stringify(__LINE__)": ",
DUMP_PREFIX_ADDRESS, 16, 4, ctx->key, DUMP_PREFIX_ADDRESS, 16, 4, ctx->key,
...@@ -392,7 +393,8 @@ static int gcm_setkey(struct crypto_aead *aead, ...@@ -392,7 +393,8 @@ static int gcm_setkey(struct crypto_aead *aead,
#endif #endif
memcpy(ctx->key, key, keylen); memcpy(ctx->key, key, keylen);
dma_sync_single_for_device(jrdev, ctx->key_dma, keylen, ctx->dir); dma_sync_single_for_device(jrdev->parent, ctx->key_dma, keylen,
ctx->dir);
ctx->cdata.keylen = keylen; ctx->cdata.keylen = keylen;
ret = gcm_set_sh_desc(aead); ret = gcm_set_sh_desc(aead);
...@@ -496,8 +498,8 @@ static int rfc4106_setkey(struct crypto_aead *aead, ...@@ -496,8 +498,8 @@ static int rfc4106_setkey(struct crypto_aead *aead,
* in the nonce. Update the AES key length. * in the nonce. Update the AES key length.
*/ */
ctx->cdata.keylen = keylen - 4; ctx->cdata.keylen = keylen - 4;
dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen, dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
ctx->dir); ctx->cdata.keylen, ctx->dir);
ret = rfc4106_set_sh_desc(aead); ret = rfc4106_set_sh_desc(aead);
if (ret) if (ret)
...@@ -600,8 +602,8 @@ static int rfc4543_setkey(struct crypto_aead *aead, ...@@ -600,8 +602,8 @@ static int rfc4543_setkey(struct crypto_aead *aead,
* in the nonce. Update the AES key length. * in the nonce. Update the AES key length.
*/ */
ctx->cdata.keylen = keylen - 4; ctx->cdata.keylen = keylen - 4;
dma_sync_single_for_device(jrdev, ctx->key_dma, ctx->cdata.keylen, dma_sync_single_for_device(jrdev->parent, ctx->key_dma,
ctx->dir); ctx->cdata.keylen, ctx->dir);
ret = rfc4543_set_sh_desc(aead); ret = rfc4543_set_sh_desc(aead);
if (ret) if (ret)
...@@ -2414,6 +2416,7 @@ static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam, ...@@ -2414,6 +2416,7 @@ static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
bool uses_dkp) bool uses_dkp)
{ {
struct caam_drv_private *priv; struct caam_drv_private *priv;
struct device *dev;
/* /*
* distribute tfms across job rings to ensure in-order * distribute tfms across job rings to ensure in-order
...@@ -2425,16 +2428,17 @@ static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam, ...@@ -2425,16 +2428,17 @@ static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
return PTR_ERR(ctx->jrdev); return PTR_ERR(ctx->jrdev);
} }
priv = dev_get_drvdata(ctx->jrdev->parent); dev = ctx->jrdev->parent;
priv = dev_get_drvdata(dev);
if (priv->era >= 6 && uses_dkp) if (priv->era >= 6 && uses_dkp)
ctx->dir = DMA_BIDIRECTIONAL; ctx->dir = DMA_BIDIRECTIONAL;
else else
ctx->dir = DMA_TO_DEVICE; ctx->dir = DMA_TO_DEVICE;
ctx->key_dma = dma_map_single(ctx->jrdev, ctx->key, sizeof(ctx->key), ctx->key_dma = dma_map_single(dev, ctx->key, sizeof(ctx->key),
ctx->dir); ctx->dir);
if (dma_mapping_error(ctx->jrdev, ctx->key_dma)) { if (dma_mapping_error(dev, ctx->key_dma)) {
dev_err(ctx->jrdev, "unable to map key\n"); dev_err(dev, "unable to map key\n");
caam_jr_free(ctx->jrdev); caam_jr_free(ctx->jrdev);
return -ENOMEM; return -ENOMEM;
} }
...@@ -2443,7 +2447,7 @@ static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam, ...@@ -2443,7 +2447,7 @@ static int caam_init_common(struct caam_ctx *ctx, struct caam_alg_entry *caam,
ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type; ctx->cdata.algtype = OP_TYPE_CLASS1_ALG | caam->class1_alg_type;
ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type; ctx->adata.algtype = OP_TYPE_CLASS2_ALG | caam->class2_alg_type;
ctx->qidev = ctx->jrdev->parent; ctx->qidev = dev;
spin_lock_init(&ctx->lock); spin_lock_init(&ctx->lock);
ctx->drv_ctx[ENCRYPT] = NULL; ctx->drv_ctx[ENCRYPT] = NULL;
...@@ -2477,7 +2481,8 @@ static void caam_exit_common(struct caam_ctx *ctx) ...@@ -2477,7 +2481,8 @@ static void caam_exit_common(struct caam_ctx *ctx)
caam_drv_ctx_rel(ctx->drv_ctx[ENCRYPT]); caam_drv_ctx_rel(ctx->drv_ctx[ENCRYPT]);
caam_drv_ctx_rel(ctx->drv_ctx[DECRYPT]); caam_drv_ctx_rel(ctx->drv_ctx[DECRYPT]);
dma_unmap_single(ctx->jrdev, ctx->key_dma, sizeof(ctx->key), ctx->dir); dma_unmap_single(ctx->jrdev->parent, ctx->key_dma, sizeof(ctx->key),
ctx->dir);
caam_jr_free(ctx->jrdev); caam_jr_free(ctx->jrdev);
} }
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册