1 | // SPDX-License-Identifier: GPL-2.0-only |
---|---|
2 | /* |
3 | * MMC crypto engine (inline encryption) support |
4 | * |
5 | * Copyright 2020 Google LLC |
6 | */ |
7 | |
8 | #include <linux/blk-crypto.h> |
9 | #include <linux/mmc/host.h> |
10 | |
11 | #include "core.h" |
12 | #include "crypto.h" |
13 | #include "queue.h" |
14 | |
15 | void mmc_crypto_set_initial_state(struct mmc_host *host) |
16 | { |
17 | /* Reset might clear all keys, so reprogram all the keys. */ |
18 | if (host->caps2 & MMC_CAP2_CRYPTO) |
19 | blk_crypto_reprogram_all_keys(profile: &host->crypto_profile); |
20 | } |
21 | |
22 | void mmc_crypto_setup_queue(struct request_queue *q, struct mmc_host *host) |
23 | { |
24 | if (host->caps2 & MMC_CAP2_CRYPTO) |
25 | blk_crypto_register(profile: &host->crypto_profile, q); |
26 | } |
27 | EXPORT_SYMBOL_GPL(mmc_crypto_setup_queue); |
28 | |
29 | void mmc_crypto_prepare_req(struct mmc_queue_req *mqrq) |
30 | { |
31 | struct request *req = mmc_queue_req_to_req(mqr: mqrq); |
32 | struct mmc_request *mrq = &mqrq->brq.mrq; |
33 | struct blk_crypto_keyslot *keyslot; |
34 | |
35 | if (!req->crypt_ctx) |
36 | return; |
37 | |
38 | mrq->crypto_ctx = req->crypt_ctx; |
39 | |
40 | keyslot = req->crypt_keyslot; |
41 | if (keyslot) |
42 | mrq->crypto_key_slot = blk_crypto_keyslot_index(slot: keyslot); |
43 | } |
44 | EXPORT_SYMBOL_GPL(mmc_crypto_prepare_req); |
45 |