qcacld-3.0: add pld_smmu_unmap support for BENGAL

Add support for pld_smmu_unmap and enable it for
BENGAL target.

Change-Id: I7f6d6f965b7664342bca29b49f05f8eb62737a0c
CRs-Fixed: 2642663
diff --git a/Kbuild b/Kbuild
index 68ae6cc..6869ad9 100644
--- a/Kbuild
+++ b/Kbuild
@@ -3246,6 +3246,7 @@
 cppflags-$(CONFIG_WLAN_SEND_DSCP_UP_MAP_TO_FW) += -DWLAN_SEND_DSCP_UP_MAP_TO_FW
 
 cppflags-$(CONFIG_HIF_CPU_PERF_AFFINE_MASK) += -DHIF_CPU_PERF_AFFINE_MASK
+cppflags-$(CONFIG_SMMU_S1_UNMAP) += -DCONFIG_SMMU_S1_UNMAP
 
 KBUILD_CPPFLAGS += $(cppflags-y)
 
diff --git a/configs/default_defconfig b/configs/default_defconfig
index e510f6c..6439a45 100644
--- a/configs/default_defconfig
+++ b/configs/default_defconfig
@@ -623,6 +623,10 @@
 CONFIG_WLAN_CUSTOM_DSCP_UP_MAP := y
 endif
 
+ifeq ($(CONFIG_ARCH_BENGAL), y)
+CONFIG_SMMU_S1_UNMAP := y
+endif
+
 ifeq ($(CONFIG_ROME_IF), sdio)
 CONFIG_PKTLOG_LEGACY := y
 endif
diff --git a/core/dp/txrx/ol_txrx_ipa.c b/core/dp/txrx/ol_txrx_ipa.c
index 45f588f..8f74d3a 100644
--- a/core/dp/txrx/ol_txrx_ipa.c
+++ b/core/dp/txrx/ol_txrx_ipa.c
@@ -637,6 +637,31 @@
 QDF_STATUS ol_txrx_ipa_cleanup(uint32_t tx_pipe_handle, uint32_t rx_pipe_handle)
 {
 	int ret;
+	struct ol_txrx_ipa_resources *ipa_res;
+	struct ol_txrx_soc_t *soc = cds_get_context(QDF_MODULE_ID_SOC);
+	qdf_device_t osdev = cds_get_context(QDF_MODULE_ID_QDF_DEVICE);
+	ol_txrx_pdev_handle pdev =
+		ol_txrx_get_pdev_from_pdev_id(soc, OL_TXRX_PDEV_ID);
+
+	if (!pdev) {
+		ol_txrx_err("%s invalid instance", __func__);
+		return QDF_STATUS_E_FAILURE;
+	}
+
+	ipa_res = &pdev->ipa_resource;
+	if (osdev->smmu_s1_enabled) {
+		ret = pld_smmu_unmap(osdev->dev,
+				     ipa_res->rx_ready_doorbell_dmaaddr,
+				     sizeof(uint32_t));
+		if (ret)
+			ol_txrx_err("%s rx_ready, smmu unmap failed", __func__);
+
+		ret = pld_smmu_unmap(osdev->dev,
+				     ipa_res->tx_comp_doorbell_dmaaddr,
+				     sizeof(uint32_t));
+		if (ret)
+			ol_txrx_err("%s tx_comp, smmu unmap failed", __func__);
+	}
 
 	QDF_TRACE(QDF_MODULE_ID_TXRX, QDF_TRACE_LEVEL_DEBUG,
 		  "%s: Disconnect IPA pipe", __func__);
diff --git a/core/pld/inc/pld_common.h b/core/pld/inc/pld_common.h
index 527d63f..6411cde 100644
--- a/core/pld/inc/pld_common.h
+++ b/core/pld/inc/pld_common.h
@@ -666,6 +666,16 @@
 #endif
 int pld_smmu_map(struct device *dev, phys_addr_t paddr,
 		 uint32_t *iova_addr, size_t size);
+#ifdef CONFIG_SMMU_S1_UNMAP
+int pld_smmu_unmap(struct device *dev,
+		   uint32_t iova_addr, size_t size);
+#else
+static inline int pld_smmu_unmap(struct device *dev,
+				 uint32_t iova_addr, size_t size)
+{
+	return 0;
+}
+#endif
 int pld_get_user_msi_assignment(struct device *dev, char *user_name,
 				int *num_vectors, uint32_t *user_base_data,
 				uint32_t *base_vector);
diff --git a/core/pld/src/pld_common.c b/core/pld/src/pld_common.c
index e859c9a..79966d2 100644
--- a/core/pld/src/pld_common.c
+++ b/core/pld/src/pld_common.c
@@ -1818,6 +1818,42 @@
 	return ret;
 }
 
+#ifdef CONFIG_SMMU_S1_UNMAP
+/**
+ * pld_smmu_unmap() - Unmap SMMU
+ * @dev: device
+ * @iova_addr: IOVA address to be unmapped
+ * @size: size to be unmapped
+ *
+ * Return: 0 for success
+ *         Non zero failure code for errors
+ */
+int pld_smmu_unmap(struct device *dev,
+		   uint32_t iova_addr, size_t size)
+{
+	int ret = 0;
+	enum pld_bus_type type = pld_get_bus_type(dev);
+
+	switch (type) {
+	case PLD_BUS_TYPE_SNOC:
+		ret = pld_snoc_smmu_unmap(dev, iova_addr, size);
+		break;
+	case PLD_BUS_TYPE_PCIE_FW_SIM:
+	case PLD_BUS_TYPE_SNOC_FW_SIM:
+	case PLD_BUS_TYPE_IPCI:
+	case PLD_BUS_TYPE_PCIE:
+		pr_err("Not supported on type %d\n", type);
+		break;
+	default:
+		pr_err("Invalid device type %d\n", type);
+		ret = -EINVAL;
+		break;
+	}
+
+	return ret;
+}
+#endif
+
 /**
  * pld_get_user_msi_assignment() - Get MSI assignment information
  * @dev: device structure
diff --git a/core/pld/src/pld_snoc.h b/core/pld/src/pld_snoc.h
index f965c8c..b1c9806 100644
--- a/core/pld/src/pld_snoc.h
+++ b/core/pld/src/pld_snoc.h
@@ -114,6 +114,13 @@
 {
 	return 0;
 }
+
+static inline int pld_snoc_smmu_unmap(struct device *dev,
+				      uint32_t iova_addr, size_t size)
+{
+	return 0;
+}
+
 static inline
 unsigned int pld_snoc_socinfo_get_serial_number(struct device *dev)
 {
@@ -281,6 +288,22 @@
 {
 	return icnss_smmu_map(dev, paddr, iova_addr, size);
 }
+
+#ifdef CONFIG_SMMU_S1_UNMAP
+static inline int pld_snoc_smmu_unmap(struct device *dev,
+				      uint32_t iova_addr, size_t size)
+{
+	return icnss_smmu_unmap(dev, iova_addr, size);
+}
+
+#else
+static inline int pld_snoc_smmu_unmap(struct device *dev,
+				      uint32_t iova_addr, size_t size)
+{
+	return 0;
+}
+#endif
+
 static inline
 unsigned int pld_snoc_socinfo_get_serial_number(struct device *dev)
 {