From f4fc88f0890494d32aa0ffa9bce883e61f6fe0c7 Mon Sep 17 00:00:00 2001 From: Wu Gao Date: Tue, 15 Jul 2025 02:53:03 -0700 Subject: [PATCH] cnss: Init reserved memory device If IOMMU is supported and enabled, it required to define IOMMU and init reversed memory device. Change-Id: I2bbd2f42333dca8a6bf7e608ce50e2c08fc0e8ba Signed-off-by: Wu Gao --- drivers/net/wireless/cnss/cnss_pci.c | 40 ++++++++++++++++++++++++++++ 1 file changed, 40 insertions(+) diff --git a/drivers/net/wireless/cnss/cnss_pci.c b/drivers/net/wireless/cnss/cnss_pci.c index 9d588b5ed6d8..623149274fa3 100644 --- a/drivers/net/wireless/cnss/cnss_pci.c +++ b/drivers/net/wireless/cnss/cnss_pci.c @@ -31,6 +31,8 @@ #include #include #include +#include +#include #include #include #include @@ -1618,6 +1620,43 @@ static void cnss_pcie_reset_platform_ops(struct device *dev) dev->platform_data = NULL; } +#if IS_ENABLED(CONFIG_ARCH_QCOM) +/** + * cnss_pci_of_reserved_mem_device_init() - Assign reserved memory region + * to given PCI device + * @pdev: context pointer of pdev + * + * This function shall call corresponding of_reserved_mem_device* API to + * assign reserved memory region to PCI device based on where the memory is + * defined and attached to (platform device of_node or PCI device of_node) + * in device tree. + * + * Return: 0 for success, negative value for error + */ +static int cnss_pci_of_reserved_mem_device_init(struct pci_dev *pdev) +{ + struct device *dev_pci = &pdev->dev; + int ret; + + /* Use of_reserved_mem_device_init_by_idx() if reserved memory is + * attached to platform device of_node. + */ + ret = of_reserved_mem_device_init(dev_pci); + if (ret) + pr_err("Failed to init reserved mem device, err = %d\n", + ret); + if (dev_pci->cma_area) + pr_debug("CMA area is %s\n", cma_get_name(dev_pci->cma_area)); + + return ret; +} +#else +static int cnss_pci_of_reserved_mem_device_init(struct pci_dev *pdev) +{ + return 0; +} +#endif + static int cnss_wlan_pci_probe(struct pci_dev *pdev, const struct pci_device_id *id) { @@ -1634,6 +1673,7 @@ static int cnss_wlan_pci_probe(struct pci_dev *pdev, atomic_set(&penv->fw_available, 0); penv->device_id = pdev->device; + cnss_pci_of_reserved_mem_device_init(pdev); if (penv->smmu_iova_len) { ret = cnss_smmu_init(&pdev->dev); if (ret) {