18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci/*
38c2ecf20Sopenharmony_ci * Copyright 2019 Google LLC
48c2ecf20Sopenharmony_ci */
58c2ecf20Sopenharmony_ci
68c2ecf20Sopenharmony_ci#ifndef _UFSHCD_CRYPTO_H
78c2ecf20Sopenharmony_ci#define _UFSHCD_CRYPTO_H
88c2ecf20Sopenharmony_ci
98c2ecf20Sopenharmony_ci#ifdef CONFIG_SCSI_UFS_CRYPTO
108c2ecf20Sopenharmony_ci#include "ufshcd.h"
118c2ecf20Sopenharmony_ci#include "ufshci.h"
128c2ecf20Sopenharmony_ci
138c2ecf20Sopenharmony_cistatic inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
148c2ecf20Sopenharmony_ci					      struct ufshcd_lrb *lrbp)
158c2ecf20Sopenharmony_ci{
168c2ecf20Sopenharmony_ci	if (!rq || !rq->crypt_keyslot) {
178c2ecf20Sopenharmony_ci		lrbp->crypto_key_slot = -1;
188c2ecf20Sopenharmony_ci		return;
198c2ecf20Sopenharmony_ci	}
208c2ecf20Sopenharmony_ci
218c2ecf20Sopenharmony_ci	lrbp->crypto_key_slot = blk_ksm_get_slot_idx(rq->crypt_keyslot);
228c2ecf20Sopenharmony_ci	lrbp->data_unit_num = rq->crypt_ctx->bc_dun[0];
238c2ecf20Sopenharmony_ci}
248c2ecf20Sopenharmony_ci
258c2ecf20Sopenharmony_cistatic inline void
268c2ecf20Sopenharmony_ciufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp, u32 *dword_0,
278c2ecf20Sopenharmony_ci				   u32 *dword_1, u32 *dword_3)
288c2ecf20Sopenharmony_ci{
298c2ecf20Sopenharmony_ci	if (lrbp->crypto_key_slot >= 0) {
308c2ecf20Sopenharmony_ci		*dword_0 |= UTP_REQ_DESC_CRYPTO_ENABLE_CMD;
318c2ecf20Sopenharmony_ci		*dword_0 |= lrbp->crypto_key_slot;
328c2ecf20Sopenharmony_ci		*dword_1 = lower_32_bits(lrbp->data_unit_num);
338c2ecf20Sopenharmony_ci		*dword_3 = upper_32_bits(lrbp->data_unit_num);
348c2ecf20Sopenharmony_ci	}
358c2ecf20Sopenharmony_ci}
368c2ecf20Sopenharmony_ci
378c2ecf20Sopenharmony_cibool ufshcd_crypto_enable(struct ufs_hba *hba);
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ciint ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba);
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_civoid ufshcd_init_crypto(struct ufs_hba *hba);
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_civoid ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
448c2ecf20Sopenharmony_ci					    struct request_queue *q);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_civoid ufshcd_crypto_destroy_keyslot_manager(struct ufs_hba *hba);
478c2ecf20Sopenharmony_ci
488c2ecf20Sopenharmony_ci#else /* CONFIG_SCSI_UFS_CRYPTO */
498c2ecf20Sopenharmony_ci
508c2ecf20Sopenharmony_cistatic inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
518c2ecf20Sopenharmony_ci					      struct ufshcd_lrb *lrbp) { }
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistatic inline void
548c2ecf20Sopenharmony_ciufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp, u32 *dword_0,
558c2ecf20Sopenharmony_ci				   u32 *dword_1, u32 *dword_3) { }
568c2ecf20Sopenharmony_ci
578c2ecf20Sopenharmony_cistatic inline bool ufshcd_crypto_enable(struct ufs_hba *hba)
588c2ecf20Sopenharmony_ci{
598c2ecf20Sopenharmony_ci	return false;
608c2ecf20Sopenharmony_ci}
618c2ecf20Sopenharmony_ci
628c2ecf20Sopenharmony_cistatic inline int ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba)
638c2ecf20Sopenharmony_ci{
648c2ecf20Sopenharmony_ci	return 0;
658c2ecf20Sopenharmony_ci}
668c2ecf20Sopenharmony_ci
678c2ecf20Sopenharmony_cistatic inline void ufshcd_init_crypto(struct ufs_hba *hba) { }
688c2ecf20Sopenharmony_ci
698c2ecf20Sopenharmony_cistatic inline void ufshcd_crypto_setup_rq_keyslot_manager(struct ufs_hba *hba,
708c2ecf20Sopenharmony_ci						struct request_queue *q) { }
718c2ecf20Sopenharmony_ci
728c2ecf20Sopenharmony_cistatic inline void ufshcd_crypto_destroy_keyslot_manager(struct ufs_hba *hba)
738c2ecf20Sopenharmony_ci{ }
748c2ecf20Sopenharmony_ci
758c2ecf20Sopenharmony_ci#endif /* CONFIG_SCSI_UFS_CRYPTO */
768c2ecf20Sopenharmony_ci
778c2ecf20Sopenharmony_ci#endif /* _UFSHCD_CRYPTO_H */
78