Skip to content

Commit

Permalink
ANDROID: mmc: support hardware that takes key directly
Browse files Browse the repository at this point in the history
Currently when an MMC host driver declares crypto support, the MMC core
passes a keyslot and 32-bit DUN down to the driver in each request.

This is enough for the "standard" eMMC v5.2 crypto (cqhci-crypto).
However some SoCs don't follow this standard.  They don't have keyslots
but rather take keys directly, and they support longer DUNs.

To allow such hardware to be supported, modify the MMC core to pass a
pointer to the bio_crypt_ctx along with each request, replacing the
crypto_enabled and data_unit_num fields.  This way is more flexible.

Also update cqhci-crypto accordingly to keep it working.

(Not being sent upstream yet because this isn't really useful by itself;
it would need support for hardware that needs it to be upstreamed too.)

Bug: 180886435
Bug: 182283899
Change-Id: I8faf3135f570ca3f2798cf812b4245a5df5515ba
Signed-off-by: Eric Biggers <[email protected]>
  • Loading branch information
ebiggers committed Mar 16, 2021
1 parent e4636b4 commit 6c6fac8
Show file tree
Hide file tree
Showing 3 changed files with 10 additions and 15 deletions.
15 changes: 4 additions & 11 deletions drivers/mmc/core/crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -31,18 +31,11 @@ void mmc_crypto_prepare_req(struct mmc_queue_req *mqrq)
struct request *req = mmc_queue_req_to_req(mqrq);
struct mmc_request *mrq = &mqrq->brq.mrq;

if (!req->crypt_keyslot)
if (!req->crypt_ctx)
return;

mrq->crypto_enabled = true;
mrq->crypto_key_slot = blk_ksm_get_slot_idx(req->crypt_keyslot);

/*
* For now we assume that all MMC drivers set max_dun_bytes_supported=4,
* which is the limit for CQHCI crypto. So all DUNs should be 32-bit.
*/
WARN_ON_ONCE(req->crypt_ctx->bc_dun[0] > U32_MAX);

mrq->data_unit_num = req->crypt_ctx->bc_dun[0];
mrq->crypto_ctx = req->crypt_ctx;
if (req->crypt_keyslot)
mrq->crypto_key_slot = blk_ksm_get_slot_idx(req->crypt_keyslot);
}
EXPORT_SYMBOL_GPL(mmc_crypto_prepare_req);
7 changes: 5 additions & 2 deletions drivers/mmc/host/cqhci-crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -22,12 +22,15 @@ int cqhci_crypto_init(struct cqhci_host *host);
*/
static inline u64 cqhci_crypto_prep_task_desc(struct mmc_request *mrq)
{
if (!mrq->crypto_enabled)
if (!mrq->crypto_ctx)
return 0;

/* We set max_dun_bytes_supported=4, so all DUNs should be 32-bit. */
WARN_ON_ONCE(mrq->crypto_ctx->bc_dun[0] > U32_MAX);

return CQHCI_CRYPTO_ENABLE_BIT |
CQHCI_CRYPTO_KEYSLOT(mrq->crypto_key_slot) |
mrq->data_unit_num;
mrq->crypto_ctx->bc_dun[0];
}

#else /* CONFIG_MMC_CRYPTO */
Expand Down
3 changes: 1 addition & 2 deletions include/linux/mmc/core.h
Original file line number Diff line number Diff line change
Expand Up @@ -164,9 +164,8 @@ struct mmc_request {
int tag;

#ifdef CONFIG_MMC_CRYPTO
bool crypto_enabled;
const struct bio_crypt_ctx *crypto_ctx;
int crypto_key_slot;
u32 data_unit_num;
#endif
};

Expand Down

0 comments on commit 6c6fac8

Please sign in to comment.