android_kernel_xiaomi_sm8450/drivers/mmc/host/cqhci-crypto.h
Eric Biggers 6c6fac8f39 ANDROID: mmc: support hardware that takes key directly
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>
2021-03-16 21:57:16 +00:00

51 lines
1.0 KiB
C

/* SPDX-License-Identifier: GPL-2.0-only */
/*
* CQHCI crypto engine (inline encryption) support
*
* Copyright 2020 Google LLC
*/
#ifndef LINUX_MMC_CQHCI_CRYPTO_H
#define LINUX_MMC_CQHCI_CRYPTO_H
#include <linux/mmc/host.h>
#include "cqhci.h"
#ifdef CONFIG_MMC_CRYPTO
int cqhci_crypto_init(struct cqhci_host *host);
/*
* Returns the crypto bits that should be set in bits 64-127 of the
* task descriptor.
*/
static inline u64 cqhci_crypto_prep_task_desc(struct mmc_request *mrq)
{
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->crypto_ctx->bc_dun[0];
}
#else /* CONFIG_MMC_CRYPTO */
static inline int cqhci_crypto_init(struct cqhci_host *host)
{
return 0;
}
static inline u64 cqhci_crypto_prep_task_desc(struct mmc_request *mrq)
{
return 0;
}
#endif /* !CONFIG_MMC_CRYPTO */
#endif /* LINUX_MMC_CQHCI_CRYPTO_H */