<html><head><meta name="color-scheme" content="light dark"></head><body><pre style="word-wrap: break-word; white-space: pre-wrap;">From 7baac266ec5e64236ff94447286a9cc74815d259 Mon Sep 17 00:00:00 2001
From: Sam Shih &lt;sam.shih@mediatek.com&gt;
Date: Fri, 2 Jun 2023 13:06:28 +0800
Subject: [PATCH] 
 [networking][999-2706-crypto-add-eip197-inside-secure-support.patch]

---
 drivers/crypto/inside-secure/safexcel.c | 69 ++++++++++++++++++++++---
 drivers/crypto/inside-secure/safexcel.h | 15 ++++++
 2 files changed, 78 insertions(+), 6 deletions(-)

diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c
index 647c5a0c1..6f4fc15b7 100644
--- a/drivers/crypto/inside-secure/safexcel.c
+++ b/drivers/crypto/inside-secure/safexcel.c
@@ -304,6 +304,11 @@ static void eip197_init_firmware(struct safexcel_crypto_priv *priv)
 		/* Enable access to all IFPP program memories */
 		writel(EIP197_PE_ICE_RAM_CTRL_FPP_PROG_EN,
 		       EIP197_PE(priv) + EIP197_PE_ICE_RAM_CTRL(pe));
+
+		/* bypass the OCE, if present */
+		if (priv-&gt;flags &amp; EIP197_OCE)
+			writel(EIP197_DEBUG_OCE_BYPASS, EIP197_PE(priv) +
+							EIP197_PE_DEBUG(pe));
 	}
 
 }
@@ -403,13 +408,13 @@ static int eip197_load_firmwares(struct safexcel_crypto_priv *priv)
 	const struct firmware *fw[FW_NB];
 	char fw_path[37], *dir = NULL;
 	int i, j, ret = 0, pe;
-	int ipuesz, ifppsz, minifw = 0;
+	int ipuesz, ifppsz, minifw = 1;
 
 	if (priv-&gt;version == EIP197D_MRVL)
 		dir = "eip197d";
 	else if (priv-&gt;version == EIP197B_MRVL ||
 		 priv-&gt;version == EIP197_DEVBRD)
-		dir = "eip197b";
+		dir = "eip197_minifw";
 	else
 		return -ENODEV;
 
@@ -442,6 +447,9 @@ retry_fw:
 
 	ipuesz = eip197_write_firmware(priv, fw[FW_IPUE]);
 
+	for (j = 0; j &lt; i; j++)
+		release_firmware(fw[j]);
+
 	if (eip197_start_firmware(priv, ipuesz, ifppsz, minifw)) {
 		dev_dbg(priv-&gt;dev, "Firmware loaded successfully\n");
 		return 0;
@@ -592,6 +600,11 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
 	 */
 	if (priv-&gt;flags &amp; SAFEXCEL_HW_EIP197) {
 		val = readl(EIP197_HIA_AIC(priv) + EIP197_HIA_MST_CTRL);
+		/* Clear axi_burst_size and rx_burst_size */
+		val &amp;= 0xffffff00;
+		/* Set axi_burst_size = 3, rx_burst_size = 3 */
+		val |= EIP197_MST_CTRL_RD_CACHE(3);
+		val |= EIP197_MST_CTRL_WD_CACHE(3);
 		val |= EIP197_MST_CTRL_TX_MAX_CMD(5);
 		writel(val, EIP197_HIA_AIC(priv) + EIP197_HIA_MST_CTRL);
 	}
@@ -792,6 +805,12 @@ static int safexcel_hw_init(struct safexcel_crypto_priv *priv)
 			return ret;
 	}
 
+	/* Allow clocks to be forced on for EIP197 */
+	if (priv-&gt;flags &amp; SAFEXCEL_HW_EIP197) {
+		writel(0xffffffff, EIP197_HIA_GEN_CFG(priv) + EIP197_FORCE_CLOCK_ON);
+		writel(0xffffffff, EIP197_HIA_GEN_CFG(priv) + EIP197_FORCE_CLOCK_ON2);
+	}
+
 	return safexcel_hw_setup_cdesc_rings(priv) ?:
 	       safexcel_hw_setup_rdesc_rings(priv) ?:
 	       0;
@@ -1498,6 +1517,9 @@ static int safexcel_probe_generic(void *pdev,
 	hwopt = readl(EIP197_GLOBAL(priv) + EIP197_OPTIONS);
 	hiaopt = readl(EIP197_HIA_AIC(priv) + EIP197_HIA_OPTIONS);
 
+	priv-&gt;hwconfig.icever = 0;
+	priv-&gt;hwconfig.ocever = 0;
+	priv-&gt;hwconfig.psever = 0;
 	if (priv-&gt;flags &amp; SAFEXCEL_HW_EIP197) {
 		/* EIP197 */
 		peopt = readl(EIP197_PE(priv) + EIP197_PE_OPTIONS(0));
@@ -1516,8 +1538,37 @@ static int safexcel_probe_generic(void *pdev,
 					    EIP197_N_RINGS_MASK;
 		if (hiaopt &amp; EIP197_HIA_OPT_HAS_PE_ARB)
 			priv-&gt;flags |= EIP197_PE_ARB;
-		if (EIP206_OPT_ICE_TYPE(peopt) == 1)
+		if (EIP206_OPT_ICE_TYPE(peopt) == 1) {
 			priv-&gt;flags |= EIP197_ICE;
+			/* Detect ICE EIP207 class. engine and version */
+			version = readl(EIP197_PE(priv) +
+				  EIP197_PE_ICE_VERSION(0));
+			if (EIP197_REG_LO16(version) != EIP207_VERSION_LE) {
+				dev_err(dev, "EIP%d: ICE EIP207 not detected.\n",
+					peid);
+				return -ENODEV;
+			}
+			priv-&gt;hwconfig.icever = EIP197_VERSION_MASK(version);
+		}
+		if (EIP206_OPT_OCE_TYPE(peopt) == 1) {
+			priv-&gt;flags |= EIP197_OCE;
+			/* Detect EIP96PP packet stream editor and version */
+			version = readl(EIP197_PE(priv) + EIP197_PE_PSE_VERSION(0));
+			if (EIP197_REG_LO16(version) != EIP96_VERSION_LE) {
+				dev_err(dev, "EIP%d: EIP96PP not detected.\n", peid);
+				return -ENODEV;
+			}
+			priv-&gt;hwconfig.psever = EIP197_VERSION_MASK(version);
+			/* Detect OCE EIP207 class. engine and version */
+			version = readl(EIP197_PE(priv) +
+				  EIP197_PE_ICE_VERSION(0));
+			if (EIP197_REG_LO16(version) != EIP207_VERSION_LE) {
+				dev_err(dev, "EIP%d: OCE EIP207 not detected.\n",
+					peid);
+				return -ENODEV;
+			}
+			priv-&gt;hwconfig.ocever = EIP197_VERSION_MASK(version);
+		}
 		/* If not a full TRC, then assume simple TRC */
 		if (!(hwopt &amp; EIP197_OPT_HAS_TRC))
 			priv-&gt;flags |= EIP197_SIMPLE_TRC;
@@ -1555,13 +1606,14 @@ static int safexcel_probe_generic(void *pdev,
 				    EIP197_PE_EIP96_OPTIONS(0));
 
 	/* Print single info line describing what we just detected */
-	dev_info(priv-&gt;dev, "EIP%d:%x(%d,%d,%d,%d)-HIA:%x(%d,%d,%d),PE:%x/%x,alg:%08x\n",
+	dev_info(priv-&gt;dev, "EIP%d:%x(%d,%d,%d,%d)-HIA:%x(%d,%d,%d),PE:%x/%x(alg:%08x)/%x/%x/%x\n",
 		 peid, priv-&gt;hwconfig.hwver, hwctg, priv-&gt;hwconfig.hwnumpes,
 		 priv-&gt;hwconfig.hwnumrings, priv-&gt;hwconfig.hwnumraic,
 		 priv-&gt;hwconfig.hiaver, priv-&gt;hwconfig.hwdataw,
 		 priv-&gt;hwconfig.hwcfsize, priv-&gt;hwconfig.hwrfsize,
 		 priv-&gt;hwconfig.ppver, priv-&gt;hwconfig.pever,
-		 priv-&gt;hwconfig.algo_flags);
+		 priv-&gt;hwconfig.algo_flags, priv-&gt;hwconfig.icever,
+		 priv-&gt;hwconfig.ocever, priv-&gt;hwconfig.psever);
 
 	safexcel_configure(priv);
 
@@ -1690,6 +1742,7 @@ static int safexcel_probe(struct platform_device *pdev)
 {
 	struct device *dev = &amp;pdev-&gt;dev;
 	struct safexcel_crypto_priv *priv;
+	struct resource *res;
 	int ret;
 
 	priv = devm_kzalloc(dev, sizeof(*priv), GFP_KERNEL);
@@ -1701,7 +1754,11 @@ static int safexcel_probe(struct platform_device *pdev)
 
 	platform_set_drvdata(pdev, priv);
 
-	priv-&gt;base = devm_platform_ioremap_resource(pdev, 0);
+	res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
+	if (!res)
+		return -EINVAL;
+
+	priv-&gt;base = devm_ioremap(dev, res-&gt;start, resource_size(res));
 	if (IS_ERR(priv-&gt;base)) {
 		dev_err(dev, "failed to get resource\n");
 		return PTR_ERR(priv-&gt;base);
diff --git a/drivers/crypto/inside-secure/safexcel.h b/drivers/crypto/inside-secure/safexcel.h
index c031c197e..e9909c336 100644
--- a/drivers/crypto/inside-secure/safexcel.h
+++ b/drivers/crypto/inside-secure/safexcel.h
@@ -22,6 +22,7 @@
 #define EIP96_VERSION_LE			0x9f60
 #define EIP201_VERSION_LE			0x36c9
 #define EIP206_VERSION_LE			0x31ce
+#define EIP207_VERSION_LE			0x30cf
 #define EIP197_REG_LO16(reg)			(reg &amp; 0xffff)
 #define EIP197_REG_HI16(reg)			((reg &gt;&gt; 16) &amp; 0xffff)
 #define EIP197_VERSION_MASK(reg)		((reg &gt;&gt; 16) &amp; 0xfff)
@@ -34,6 +35,7 @@
 
 /* EIP206 OPTIONS ENCODING */
 #define EIP206_OPT_ICE_TYPE(n)			((n&gt;&gt;8)&amp;3)
+#define EIP206_OPT_OCE_TYPE(n)			((n&gt;&gt;10)&amp;3)
 
 /* EIP197 OPTIONS ENCODING */
 #define EIP197_OPT_HAS_TRC			BIT(31)
@@ -168,6 +170,7 @@
 #define EIP197_PE_ICE_FPP_CTRL(n)		(0x0d80 + (0x2000 * (n)))
 #define EIP197_PE_ICE_PPTF_CTRL(n)		(0x0e00 + (0x2000 * (n)))
 #define EIP197_PE_ICE_RAM_CTRL(n)		(0x0ff0 + (0x2000 * (n)))
+#define EIP197_PE_ICE_VERSION(n)		(0x0ffc + (0x2000 * (n)))
 #define EIP197_PE_EIP96_TOKEN_CTRL(n)		(0x1000 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_FUNCTION_EN(n)		(0x1004 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_CONTEXT_CTRL(n)		(0x1008 + (0x2000 * (n)))
@@ -176,10 +179,15 @@
 #define EIP197_PE_EIP96_FUNCTION2_EN(n)		(0x1030 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_OPTIONS(n)		(0x13f8 + (0x2000 * (n)))
 #define EIP197_PE_EIP96_VERSION(n)		(0x13fc + (0x2000 * (n)))
+#define EIP197_PE_OCE_VERSION(n)		(0x1bfc + (0x2000 * (n)))
 #define EIP197_PE_OUT_DBUF_THRES(n)		(0x1c00 + (0x2000 * (n)))
 #define EIP197_PE_OUT_TBUF_THRES(n)		(0x1d00 + (0x2000 * (n)))
+#define EIP197_PE_PSE_VERSION(n)		(0x1efc + (0x2000 * (n)))
+#define EIP197_PE_DEBUG(n)			(0x1ff4 + (0x2000 * (n)))
 #define EIP197_PE_OPTIONS(n)			(0x1ff8 + (0x2000 * (n)))
 #define EIP197_PE_VERSION(n)			(0x1ffc + (0x2000 * (n)))
+#define EIP197_FORCE_CLOCK_ON2			0xffd8
+#define EIP197_FORCE_CLOCK_ON			0xffe8
 #define EIP197_MST_CTRL				0xfff4
 #define EIP197_OPTIONS				0xfff8
 #define EIP197_VERSION				0xfffc
@@ -353,6 +361,9 @@
 /* EIP197_PE_EIP96_TOKEN_CTRL2 */
 #define EIP197_PE_EIP96_TOKEN_CTRL2_CTX_DONE	BIT(3)
 
+/* EIP197_PE_DEBUG */
+#define EIP197_DEBUG_OCE_BYPASS			BIT(1)
+
 /* EIP197_STRC_CONFIG */
 #define EIP197_STRC_CONFIG_INIT			BIT(31)
 #define EIP197_STRC_CONFIG_LARGE_REC(s)		(s&lt;&lt;8)
@@ -777,6 +788,7 @@ enum safexcel_flags {
 	EIP197_PE_ARB		= BIT(2),
 	EIP197_ICE		= BIT(3),
 	EIP197_SIMPLE_TRC	= BIT(4),
+	EIP197_OCE		= BIT(5),
 };
 
 struct safexcel_hwconfig {
@@ -784,7 +796,10 @@ struct safexcel_hwconfig {
 	int hwver;
 	int hiaver;
 	int ppver;
+	int icever;
 	int pever;
+	int ocever;
+	int psever;
 	int hwdataw;
 	int hwcfsize;
 	int hwrfsize;
-- 
2.34.1

</pre></body></html>