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 <ebiggers@google.com>
42 lines
1002 B
C
42 lines
1002 B
C
// SPDX-License-Identifier: GPL-2.0-only
|
|
/*
|
|
* MMC crypto engine (inline encryption) support
|
|
*
|
|
* Copyright 2020 Google LLC
|
|
*/
|
|
|
|
#include <linux/blk-crypto.h>
|
|
#include <linux/mmc/host.h>
|
|
|
|
#include "core.h"
|
|
#include "crypto.h"
|
|
#include "queue.h"
|
|
|
|
void mmc_crypto_set_initial_state(struct mmc_host *host)
|
|
{
|
|
/* Reset might clear all keys, so reprogram all the keys. */
|
|
if (host->caps2 & MMC_CAP2_CRYPTO)
|
|
blk_ksm_reprogram_all_keys(&host->ksm);
|
|
}
|
|
|
|
void mmc_crypto_setup_queue(struct request_queue *q, struct mmc_host *host)
|
|
{
|
|
if (host->caps2 & MMC_CAP2_CRYPTO)
|
|
blk_ksm_register(&host->ksm, q);
|
|
}
|
|
EXPORT_SYMBOL_GPL(mmc_crypto_setup_queue);
|
|
|
|
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_ctx)
|
|
return;
|
|
|
|
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);
|