From 124472212b51781c8ab8ad26131d8442cd049380 Mon Sep 17 00:00:00 2001
From: Kai Ye <yekai13@huawei.com>
Date: Thu, 10 Feb 2022 14:55:44 +0800
Subject: [PATCH 55/64] hisi-sec/v1: update the SEC BD1 mode configuration

Update SEC BD1 XTS mode CI_GEN config from 3 to 0, because
ZIP XTS LBA hardware accomplish is different from SEC XTS LBA.
So we config SEC BD1 XTS ci_gen=0, which means cipher_ivin_addr
mode.

Signed-off-by: Kai Ye <yekai13@huawei.com>
---
 v1/drv/hisi_sec_udrv.c | 15 +++++++++++----
 1 file changed, 11 insertions(+), 4 deletions(-)

diff --git a/v1/drv/hisi_sec_udrv.c b/v1/drv/hisi_sec_udrv.c
index 2d06bd7..7345baf 100644
--- a/v1/drv/hisi_sec_udrv.c
+++ b/v1/drv/hisi_sec_udrv.c
@@ -298,10 +298,11 @@ static int fill_cipher_bd1_type(struct wcrypto_cipher_msg *msg,
 
 	fill_bd_addr_type(msg->data_fmt, sqe);
 
-	if (msg->mode == WCRYPTO_CIPHER_XTS)
-		sqe->type1.ci_gen = CI_GEN_BY_LBA;
-	else
-		sqe->type1.ci_gen = CI_GEN_BY_ADDR;
+	/*
+	 * BD1 cipher only provides ci_gen=0 for compatibility, so user
+	 * should prepare iv[gran_num] and iv_bytes is sum of all grans
+	 */
+	sqe->type1.ci_gen = CI_GEN_BY_ADDR;
 
 	return WD_SUCCESS;
 }
@@ -1453,6 +1454,12 @@ static void parse_cipher_bd1(struct wd_queue *q, struct hisi_sec_sqe *sqe,
 			sqe->type1.c_key_addr_l);
 	drv_iova_unmap(q, cipher_msg->key, (void *)(uintptr_t)dma_addr,
 			cipher_msg->key_bytes);
+	if (cipher_msg->iv) {
+		dma_addr = DMA_ADDR(sqe->type1.c_ivin_addr_h,
+				sqe->type1.c_ivin_addr_l);
+		drv_iova_unmap(q, cipher_msg->iv, (void *)(uintptr_t)dma_addr,
+				cipher_msg->iv_bytes);
+	}
 }
 
 static void cipher_ofb_data_handle(struct wcrypto_cipher_msg *msg)
-- 
2.25.1

