blob: 83b0e50784472bedbb2ed27ec5915d62d0066412 [file] [log] [blame]
Satya Tangirala4bac1102019-10-24 14:44:27 -07001/* SPDX-License-Identifier: GPL-2.0 */
2/*
3 * Copyright 2019 Google LLC
4 */
5
6#ifndef _UFSHCD_CRYPTO_H
7#define _UFSHCD_CRYPTO_H
8
Satya Tangirala4bac1102019-10-24 14:44:27 -07009#ifdef CONFIG_SCSI_UFS_CRYPTO
Satya Tangiralaecdebfe2019-05-08 03:44:29 -070010#include "ufshcd.h"
Satya Tangirala4bac1102019-10-24 14:44:27 -070011#include "ufshci.h"
12
Eric Biggers27b2ed42020-07-14 09:31:24 -070013static inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
Eric Biggerse12d1272020-07-14 09:27:54 -070014 struct ufshcd_lrb *lrbp)
Satya Tangiralacfd7e6c2019-12-17 14:26:29 -080015{
Eric Biggers27b2ed42020-07-14 09:31:24 -070016 if (!rq || !rq->crypt_keyslot) {
Satya Tangiralac2b86b72020-06-16 14:33:37 -070017 lrbp->crypto_key_slot = -1;
Eric Biggers27b2ed42020-07-14 09:31:24 -070018 return;
19 }
20
21 lrbp->crypto_key_slot = blk_ksm_get_slot_idx(rq->crypt_keyslot);
22 lrbp->data_unit_num = rq->crypt_ctx->bc_dun[0];
23}
24
25static inline void
26ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp, u32 *dword_0,
27 u32 *dword_1, u32 *dword_3)
28{
29 if (lrbp->crypto_key_slot >= 0) {
30 *dword_0 |= UTP_REQ_DESC_CRYPTO_ENABLE_CMD;
31 *dword_0 |= lrbp->crypto_key_slot;
32 *dword_1 = lower_32_bits(lrbp->data_unit_num);
33 *dword_3 = upper_32_bits(lrbp->data_unit_num);
Satya Tangiralac2b86b72020-06-16 14:33:37 -070034 }
Satya Tangiralacfd7e6c2019-12-17 14:26:29 -080035}
Satya Tangirala4bac1102019-10-24 14:44:27 -070036
Eric Biggers4ad2fd52020-08-22 10:47:34 -070037static inline void ufshcd_crypto_clear_prdt(struct ufs_hba *hba,
38 struct ufshcd_lrb *lrbp)
39{
40 if (!(hba->quirks & UFSHCD_QUIRK_KEYS_IN_PRDT))
41 return;
42
43 if (!lrbp->cmd->request->crypt_ctx)
44 return;
45
46 memzero_explicit(lrbp->ucd_prdt_ptr,
47 hba->sg_entry_size * scsi_sg_count(lrbp->cmd));
48}
49
Satya Tangiralac2b86b72020-06-16 14:33:37 -070050bool ufshcd_crypto_enable(struct ufs_hba *hba);
Satya Tangirala4bac1102019-10-24 14:44:27 -070051
Eric Biggers27b2ed42020-07-14 09:31:24 -070052int ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba);
53
54void ufshcd_init_crypto(struct ufs_hba *hba);
Satya Tangirala4bac1102019-10-24 14:44:27 -070055
56void ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
57 struct request_queue *q);
58
Satya Tangirala4bac1102019-10-24 14:44:27 -070059#else /* CONFIG_SCSI_UFS_CRYPTO */
60
Eric Biggers27b2ed42020-07-14 09:31:24 -070061static inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
Satya Tangiralac2b86b72020-06-16 14:33:37 -070062 struct ufshcd_lrb *lrbp) { }
63
Eric Biggers27b2ed42020-07-14 09:31:24 -070064static inline void
65ufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp, u32 *dword_0,
66 u32 *dword_1, u32 *dword_3) { }
67
Eric Biggers4ad2fd52020-08-22 10:47:34 -070068static inline void ufshcd_crypto_clear_prdt(struct ufs_hba *hba,
69 struct ufshcd_lrb *lrbp) { }
70
Satya Tangiralac2b86b72020-06-16 14:33:37 -070071static inline bool ufshcd_crypto_enable(struct ufs_hba *hba)
Satya Tangirala4bac1102019-10-24 14:44:27 -070072{
73 return false;
74}
75
Eric Biggers27b2ed42020-07-14 09:31:24 -070076static inline int ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba)
Satya Tangirala4bac1102019-10-24 14:44:27 -070077{
78 return 0;
79}
80
Eric Biggers27b2ed42020-07-14 09:31:24 -070081static inline void ufshcd_init_crypto(struct ufs_hba *hba) { }
82
Satya Tangiralaecdebfe2019-05-08 03:44:29 -070083static inline void ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
84 struct request_queue *q) { }
Satya Tangirala4bac1102019-10-24 14:44:27 -070085
Satya Tangirala4bac1102019-10-24 14:44:27 -070086#endif /* CONFIG_SCSI_UFS_CRYPTO */
87
88#endif /* _UFSHCD_CRYPTO_H */