// SPDX-License-Identifier: GPL-2.0-only /* * CQHCI crypto engine (inline encryption) support * * Copyright 2020 Google LLC */ #include <linux/blk-crypto.h> #include <linux/blk-crypto-profile.h> #include <linux/mmc/host.h> #include "cqhci-crypto.h" /* Map from blk-crypto modes to CQHCI crypto algorithm IDs and key sizes */ static const struct cqhci_crypto_alg_entry { … } cqhci_crypto_algs[BLK_ENCRYPTION_MODE_MAX] = …; static inline struct cqhci_host * cqhci_host_from_crypto_profile(struct blk_crypto_profile *profile) { … } static int cqhci_crypto_program_key(struct cqhci_host *cq_host, const union cqhci_crypto_cfg_entry *cfg, int slot) { … } static int cqhci_crypto_keyslot_program(struct blk_crypto_profile *profile, const struct blk_crypto_key *key, unsigned int slot) { … } static int cqhci_crypto_clear_keyslot(struct cqhci_host *cq_host, int slot) { … } static int cqhci_crypto_keyslot_evict(struct blk_crypto_profile *profile, const struct blk_crypto_key *key, unsigned int slot) { … } /* * The keyslot management operations for CQHCI crypto. * * Note that the block layer ensures that these are never called while the host * controller is runtime-suspended. However, the CQE won't necessarily be * "enabled" when these are called, i.e. CQHCI_ENABLE might not be set in the * CQHCI_CFG register. But the hardware allows that. */ static const struct blk_crypto_ll_ops cqhci_crypto_ops = …; static enum blk_crypto_mode_num cqhci_find_blk_crypto_mode(union cqhci_crypto_cap_entry cap) { … } /** * cqhci_crypto_init - initialize CQHCI crypto support * @cq_host: a cqhci host * * If the driver previously set MMC_CAP2_CRYPTO and the CQE declares * CQHCI_CAP_CS, initialize the crypto support. This involves reading the * crypto capability registers, initializing the blk_crypto_profile, clearing * all keyslots, and enabling 128-bit task descriptors. * * Return: 0 if crypto was initialized or isn't supported; whether * MMC_CAP2_CRYPTO remains set indicates which one of those cases it is. * Also can return a negative errno value on unexpected error. */ int cqhci_crypto_init(struct cqhci_host *cq_host) { … }