162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2019 Google LLC
462306a36Sopenharmony_ci */
562306a36Sopenharmony_ci
662306a36Sopenharmony_ci#ifndef _UFSHCD_CRYPTO_H
762306a36Sopenharmony_ci#define _UFSHCD_CRYPTO_H
862306a36Sopenharmony_ci
962306a36Sopenharmony_ci#include <scsi/scsi_cmnd.h>
1062306a36Sopenharmony_ci#include <ufs/ufshcd.h>
1162306a36Sopenharmony_ci#include "ufshcd-priv.h"
1262306a36Sopenharmony_ci#include <ufs/ufshci.h>
1362306a36Sopenharmony_ci
1462306a36Sopenharmony_ci#ifdef CONFIG_SCSI_UFS_CRYPTO
1562306a36Sopenharmony_ci
1662306a36Sopenharmony_cistatic inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
1762306a36Sopenharmony_ci					      struct ufshcd_lrb *lrbp)
1862306a36Sopenharmony_ci{
1962306a36Sopenharmony_ci	if (!rq || !rq->crypt_keyslot) {
2062306a36Sopenharmony_ci		lrbp->crypto_key_slot = -1;
2162306a36Sopenharmony_ci		return;
2262306a36Sopenharmony_ci	}
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci	lrbp->crypto_key_slot = blk_crypto_keyslot_index(rq->crypt_keyslot);
2562306a36Sopenharmony_ci	lrbp->data_unit_num = rq->crypt_ctx->bc_dun[0];
2662306a36Sopenharmony_ci}
2762306a36Sopenharmony_ci
2862306a36Sopenharmony_cistatic inline void
2962306a36Sopenharmony_ciufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp,
3062306a36Sopenharmony_ci				   struct request_desc_header *h)
3162306a36Sopenharmony_ci{
3262306a36Sopenharmony_ci	if (lrbp->crypto_key_slot < 0)
3362306a36Sopenharmony_ci		return;
3462306a36Sopenharmony_ci	h->enable_crypto = 1;
3562306a36Sopenharmony_ci	h->cci = lrbp->crypto_key_slot;
3662306a36Sopenharmony_ci	h->dunl = cpu_to_le32(lower_32_bits(lrbp->data_unit_num));
3762306a36Sopenharmony_ci	h->dunu = cpu_to_le32(upper_32_bits(lrbp->data_unit_num));
3862306a36Sopenharmony_ci}
3962306a36Sopenharmony_ci
4062306a36Sopenharmony_cibool ufshcd_crypto_enable(struct ufs_hba *hba);
4162306a36Sopenharmony_ci
4262306a36Sopenharmony_ciint ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba);
4362306a36Sopenharmony_ci
4462306a36Sopenharmony_civoid ufshcd_init_crypto(struct ufs_hba *hba);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_civoid ufshcd_crypto_register(struct ufs_hba *hba, struct request_queue *q);
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci#else /* CONFIG_SCSI_UFS_CRYPTO */
4962306a36Sopenharmony_ci
5062306a36Sopenharmony_cistatic inline void ufshcd_prepare_lrbp_crypto(struct request *rq,
5162306a36Sopenharmony_ci					      struct ufshcd_lrb *lrbp) { }
5262306a36Sopenharmony_ci
5362306a36Sopenharmony_cistatic inline void
5462306a36Sopenharmony_ciufshcd_prepare_req_desc_hdr_crypto(struct ufshcd_lrb *lrbp,
5562306a36Sopenharmony_ci				   struct request_desc_header *h) { }
5662306a36Sopenharmony_ci
5762306a36Sopenharmony_cistatic inline bool ufshcd_crypto_enable(struct ufs_hba *hba)
5862306a36Sopenharmony_ci{
5962306a36Sopenharmony_ci	return false;
6062306a36Sopenharmony_ci}
6162306a36Sopenharmony_ci
6262306a36Sopenharmony_cistatic inline int ufshcd_hba_init_crypto_capabilities(struct ufs_hba *hba)
6362306a36Sopenharmony_ci{
6462306a36Sopenharmony_ci	return 0;
6562306a36Sopenharmony_ci}
6662306a36Sopenharmony_ci
6762306a36Sopenharmony_cistatic inline void ufshcd_init_crypto(struct ufs_hba *hba) { }
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_cistatic inline void ufshcd_crypto_register(struct ufs_hba *hba,
7062306a36Sopenharmony_ci					  struct request_queue *q) { }
7162306a36Sopenharmony_ci
7262306a36Sopenharmony_ci#endif /* CONFIG_SCSI_UFS_CRYPTO */
7362306a36Sopenharmony_ci
7462306a36Sopenharmony_ci#endif /* _UFSHCD_CRYPTO_H */
75