mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-12-23 19:14:30 +08:00
86c639ce08
Make 'struct mmc_request' contain a pointer to the request's 'struct bio_crypt_ctx' directly, instead of extracting a 32-bit DUN from it which is a cqhci-crypto specific detail. This keeps the cqhci crypto specific details in the cqhci module, and it makes mmc_core and mmc_block ready for MMC crypto hardware that accepts the DUN and/or key in a way that is more flexible than that which will be specified by the eMMC v5.2 standard. Exynos SoCs are an example of such hardware, as their inline encryption hardware takes keys directly (it has no concept of keyslots) and supports 128-bit DUNs. Note that the 32-bit DUN length specified by the standard is very restrictive, so it is likely that more hardware will support longer DUNs despite it not following the standard. Thus, limiting the scope of the 32-bit DUN assumption to the place that actually needs it is warranted. Signed-off-by: Eric Biggers <ebiggers@google.com> Link: https://lore.kernel.org/r/20210721154738.3966463-1-ebiggers@kernel.org Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
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);
|