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