162306a36Sopenharmony_ci// SPDX-License-Identifier: GPL-2.0-only
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * MMC crypto engine (inline encryption) support
462306a36Sopenharmony_ci *
562306a36Sopenharmony_ci * Copyright 2020 Google LLC
662306a36Sopenharmony_ci */
762306a36Sopenharmony_ci
862306a36Sopenharmony_ci#include <linux/blk-crypto.h>
962306a36Sopenharmony_ci#include <linux/mmc/host.h>
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci#include "core.h"
1262306a36Sopenharmony_ci#include "crypto.h"
1362306a36Sopenharmony_ci#include "queue.h"
1462306a36Sopenharmony_ci
1562306a36Sopenharmony_civoid mmc_crypto_set_initial_state(struct mmc_host *host)
1662306a36Sopenharmony_ci{
1762306a36Sopenharmony_ci	/* Reset might clear all keys, so reprogram all the keys. */
1862306a36Sopenharmony_ci	if (host->caps2 & MMC_CAP2_CRYPTO)
1962306a36Sopenharmony_ci		blk_crypto_reprogram_all_keys(&host->crypto_profile);
2062306a36Sopenharmony_ci}
2162306a36Sopenharmony_ci
2262306a36Sopenharmony_civoid mmc_crypto_setup_queue(struct request_queue *q, struct mmc_host *host)
2362306a36Sopenharmony_ci{
2462306a36Sopenharmony_ci	if (host->caps2 & MMC_CAP2_CRYPTO)
2562306a36Sopenharmony_ci		blk_crypto_register(&host->crypto_profile, q);
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mmc_crypto_setup_queue);
2862306a36Sopenharmony_ci
2962306a36Sopenharmony_civoid mmc_crypto_prepare_req(struct mmc_queue_req *mqrq)
3062306a36Sopenharmony_ci{
3162306a36Sopenharmony_ci	struct request *req = mmc_queue_req_to_req(mqrq);
3262306a36Sopenharmony_ci	struct mmc_request *mrq = &mqrq->brq.mrq;
3362306a36Sopenharmony_ci	struct blk_crypto_keyslot *keyslot;
3462306a36Sopenharmony_ci
3562306a36Sopenharmony_ci	if (!req->crypt_ctx)
3662306a36Sopenharmony_ci		return;
3762306a36Sopenharmony_ci
3862306a36Sopenharmony_ci	mrq->crypto_ctx = req->crypt_ctx;
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_ci	keyslot = req->crypt_keyslot;
4162306a36Sopenharmony_ci	if (keyslot)
4262306a36Sopenharmony_ci		mrq->crypto_key_slot = blk_crypto_keyslot_index(keyslot);
4362306a36Sopenharmony_ci}
4462306a36Sopenharmony_ciEXPORT_SYMBOL_GPL(mmc_crypto_prepare_req);
45