[][openwrt][mt7988][crypto][Fix 3 PPE issue for IPSec]

[Description]
Fix 3 PPE issue for IPSec. In previous version, we'll use CLS rule to
set fport = PPE0 for ESP packets. However, in 3 PPE situation, it expect
the packet from GDM1 fport should be PPE0, GDM2 should use PPE1, GDM3
should use PPE2.
In this commit, we add parsing dts for PPE numbers to decide which PPE
should be set to CLS rule.

[Release-log]
N/A


Change-Id: I02c0e0b94f7214964a56bf56fb1f30ef9f67bd8a
Reviewed-on: https://gerrit.mediatek.inc/c/openwrt/feeds/mtk_openwrt_feeds/+/8713736
diff --git a/21.02/files/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7988.dtsi b/21.02/files/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7988.dtsi
index 620fff9..0fd2d47 100644
--- a/21.02/files/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7988.dtsi
+++ b/21.02/files/target/linux/mediatek/files-5.4/arch/arm64/boot/dts/mediatek/mt7988.dtsi
@@ -585,6 +585,7 @@
 		interrupt-names = "ring0", "ring1", "ring2", "ring3";
 		status = "okay";
 		eth = <&eth>;
+		hnat = <&hnat>;
 	};
 
 	afe: audio-controller@11210000 {
diff --git a/feed/kernel/crypto-eip/src/inc/crypto-eip/crypto-eip.h b/feed/kernel/crypto-eip/src/inc/crypto-eip/crypto-eip.h
index 24f6f91..524e4c6 100644
--- a/feed/kernel/crypto-eip/src/inc/crypto-eip/crypto-eip.h
+++ b/feed/kernel/crypto-eip/src/inc/crypto-eip/crypto-eip.h
@@ -37,6 +37,7 @@
 	struct mtk_eth *eth;
 	void __iomem *crypto_base;
 	void __iomem *eth_base;
+	u32 ppe_num;
 };
 
 struct mtk_xfrm_params {
@@ -49,6 +50,7 @@
 };
 
 void crypto_eth_write(u32 reg, u32 val);
+u32 mtk_crypto_ppe_get_num(void);
 
 /* xfrm callback functions */
 int mtk_xfrm_offload_state_add(struct xfrm_state *xs);
diff --git a/feed/kernel/crypto-eip/src/init.c b/feed/kernel/crypto-eip/src/init.c
index cc53a39..075ca69 100644
--- a/feed/kernel/crypto-eip/src/init.c
+++ b/feed/kernel/crypto-eip/src/init.c
@@ -64,6 +64,11 @@
 	return true;
 }
 
+u32 mtk_crypto_ppe_get_num(void)
+{
+	return mcrypto.ppe_num;
+}
+
 static const struct xfrmdev_ops mtk_xfrmdev_ops = {
 	.xdo_dev_state_add = mtk_xfrm_offload_state_add,
 	.xdo_dev_state_delete = mtk_xfrm_offload_state_delete,
@@ -151,6 +156,29 @@
 	return ret;
 }
 
+static int __init mtk_crypto_ppe_num_dts_init(struct platform_device *pdev)
+{
+	struct device_node *hnat = NULL;
+	u32 val = 0;
+	int ret = 0;
+
+	hnat = of_parse_phandle(pdev->dev.of_node, "hnat", 0);
+	if (!hnat) {
+		CRYPTO_ERR("can not find hnat node\n");
+		return -ENODEV;
+	}
+
+	ret = of_property_read_u32(hnat, "mtketh-ppe-num", &val);
+	if (ret)
+		mcrypto.ppe_num = 1;
+	else
+		mcrypto.ppe_num = val;
+
+	of_node_put(hnat);
+
+	return 0;
+}
+
 static int __init mtk_crypto_eip_dts_init(void)
 {
 	struct platform_device *crypto_pdev;
@@ -190,6 +218,10 @@
 	if (ret)
 		goto out;
 
+	ret = mtk_crypto_ppe_num_dts_init(crypto_pdev);
+	if (ret)
+		goto out;
+
 	crypto_dev = &crypto_pdev->dev;
 
 out:
diff --git a/feed/kernel/crypto-eip/src/xfrm-offload.c b/feed/kernel/crypto-eip/src/xfrm-offload.c
index 045002c..28f4555 100644
--- a/feed/kernel/crypto-eip/src/xfrm-offload.c
+++ b/feed/kernel/crypto-eip/src/xfrm-offload.c
@@ -83,7 +83,10 @@
 
 	cdesc = &xfrm_params->cdrt->cls->cdesc;
 
-	CLS_DESC_DATA(cdesc, fport, PSE_PORT_PPE0);
+	if (mtk_crypto_ppe_get_num() == 1)
+		CLS_DESC_DATA(cdesc, fport, PSE_PORT_PPE0);
+	else
+		CLS_DESC_DATA(cdesc, fport, PSE_PORT_PPE1);
 	CLS_DESC_DATA(cdesc, tport_idx, 0x2);
 	CLS_DESC_DATA(cdesc, cdrt_idx, xfrm_params->cdrt->idx);