From b5cb585ad2301f9477ecf3d207310d6ddf540888 Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Wed, 20 Aug 2025 16:36:12 +0800 Subject: [PATCH 1/4] [DM/PCI] Fixup the MSI info shuold free Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/include/drivers/pci_msi.h | 1 + components/drivers/pci/msi/irq.c | 39 ++++++++++++++++++++ components/drivers/pci/msi/msi.c | 2 + 3 files changed, 42 insertions(+) diff --git a/components/drivers/include/drivers/pci_msi.h b/components/drivers/include/drivers/pci_msi.h index b8238e6470b..4fe03ca07a0 100644 --- a/components/drivers/include/drivers/pci_msi.h +++ b/components/drivers/include/drivers/pci_msi.h @@ -177,6 +177,7 @@ struct rt_pci_msi_desc #define rt_pci_msix_table_size(flags) ((flags & PCIM_MSIXCTRL_TABLE_SIZE) + 1) rt_err_t rt_pci_msi_setup_irqs(struct rt_pci_device *pdev, int nvec, int type); +rt_err_t rt_pci_msi_cleanup_irqs(struct rt_pci_device *pdev); void rt_pci_msi_shutdown(struct rt_pci_device *pdev); void rt_pci_msix_shutdown(struct rt_pci_device *pdev); diff --git a/components/drivers/pci/msi/irq.c b/components/drivers/pci/msi/irq.c index dab8ee257a7..8e3b7333e0e 100644 --- a/components/drivers/pci/msi/irq.c +++ b/components/drivers/pci/msi/irq.c @@ -144,3 +144,42 @@ rt_err_t rt_pci_msi_setup_irqs(struct rt_pci_device *pdev, int nvec, int type) return err; } + +rt_err_t rt_pci_msi_cleanup_irqs(struct rt_pci_device *pdev) +{ + int type; + struct rt_pic *msi_pic; + struct rt_pci_msi_desc *desc; + + if (!pdev) + { + return -RT_EINVAL; + } + + msi_pic = pdev->msi_pic; + + if (!msi_pic) + { + return -RT_EINVAL; + } + + desc = rt_pci_msi_first_desc(pdev); + type = desc->is_msix ? PCIY_MSIX : PCIY_MSI; + + if (type == PCIY_MSI) + { + for (int idx = 0; idx < desc->vector_used; ++idx) + { + msi_pic->ops->irq_free_msi(msi_pic, desc->irq + idx); + } + } + else if (type == PCIY_MSIX) + { + rt_pci_msi_for_each_desc(pdev, desc) + { + msi_pic->ops->irq_free_msi(msi_pic, desc->irq); + } + } + + return RT_EOK; +} diff --git a/components/drivers/pci/msi/msi.c b/components/drivers/pci/msi/msi.c index eb0d578ed31..11ccdcb10c8 100644 --- a/components/drivers/pci/msi/msi.c +++ b/components/drivers/pci/msi/msi.c @@ -233,6 +233,8 @@ void rt_pci_msi_free_irqs(struct rt_pci_device *pdev) pdev->msix_base = RT_NULL; } + rt_pci_msi_cleanup_irqs(pdev); + rt_pci_msi_for_each_desc(pdev, desc) { /* To safety */ From faee3b3a7072ef6e957b1f0fdc389c4cf95ead2e Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Wed, 20 Aug 2025 16:37:16 +0800 Subject: [PATCH 2/4] [DM/PCI] Fixup the bus-range probe Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/pci/ofw.c | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/components/drivers/pci/ofw.c b/components/drivers/pci/ofw.c index 0207e7a87da..450402d6bda 100644 --- a/components/drivers/pci/ofw.c +++ b/components/drivers/pci/ofw.c @@ -284,7 +284,7 @@ rt_err_t rt_pci_ofw_parse_ranges(struct rt_ofw_node *dev_np, phy_addr_cells, phy_size_cells, cpu_addr_cells, &host_bridge->dma_regions, &host_bridge->dma_regions_nr); - if (err != -RT_EEMPTY) + if (err && err != -RT_EEMPTY) { rt_free(host_bridge->bus_regions); host_bridge->bus_regions_nr = 0; @@ -314,7 +314,10 @@ rt_err_t rt_pci_ofw_host_bridge_init(struct rt_ofw_node *dev_np, if (rt_ofw_prop_read_u32_array_index(dev_np, "bus-range", 0, 2, host_bridge->bus_range) < 0) { - return -RT_EIO; + host_bridge->bus_range[0] = 0x00; + host_bridge->bus_range[1] = 0xff; + LOG_I("%s: No \"%s\" found, using [%#02x, %#02x]", rt_ofw_node_full_name(dev_np), "bus-range", + host_bridge->bus_range[0], host_bridge->bus_range[1]); } propname = rt_ofw_get_prop_fuzzy_name(dev_np, ",pci-domain$"); From 2a2b469a9e3f5450a1f40bf41764e769f59b275d Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Wed, 20 Aug 2025 16:38:24 +0800 Subject: [PATCH 3/4] [DM/PCI] Fixup the DWC PCI resource release Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/pci/host/dw/pcie-dw_host.c | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/components/drivers/pci/host/dw/pcie-dw_host.c b/components/drivers/pci/host/dw/pcie-dw_host.c index 05a3dc77799..6b483318f2e 100644 --- a/components/drivers/pci/host/dw/pcie-dw_host.c +++ b/components/drivers/pci/host/dw/pcie-dw_host.c @@ -204,6 +204,7 @@ void dw_pcie_free_msi(struct dw_pcie_port *port) rt_dma_free_coherent(pci->dev, sizeof(rt_uint64_t), port->msi_data, port->msi_data_phy); + port->msi_data = RT_NULL; } } @@ -331,7 +332,8 @@ rt_err_t dw_pcie_host_init(struct dw_pcie_port *port) { LOG_E("Invalid count of irq = %d", port->irq_count); - return -RT_EINVAL; + err = -RT_EINVAL; + goto _err_free_cfg; } } @@ -341,7 +343,8 @@ rt_err_t dw_pcie_host_init(struct dw_pcie_port *port) if (!port->msi_pic) { - return -RT_ENOMEM; + err = -RT_ENOMEM; + goto _err_free_cfg; } port->msi_pic->priv_data = port; @@ -404,6 +407,13 @@ rt_err_t dw_pcie_host_init(struct dw_pcie_port *port) rt_pci_host_bridge_free(bridge); port->bridge = RT_NULL; +_err_free_cfg: + if (port->cfg0_base) + { + rt_iounmap(port->cfg0_base); + port->cfg0_base = RT_NULL; + } + return err; } From 4d454af8b73a1bd7f83a1ce1e0976ed1cfe223dc Mon Sep 17 00:00:00 2001 From: GuEe-GUI <2991707448@qq.com> Date: Wed, 20 Aug 2025 16:39:15 +0800 Subject: [PATCH 4/4] [DM/PCI] Add SoC PCI Kconfig import Signed-off-by: GuEe-GUI <2991707448@qq.com> --- components/drivers/pci/host/Kconfig | 2 ++ 1 file changed, 2 insertions(+) diff --git a/components/drivers/pci/host/Kconfig b/components/drivers/pci/host/Kconfig index 221c997ebcf..0b7cd2662a6 100644 --- a/components/drivers/pci/host/Kconfig +++ b/components/drivers/pci/host/Kconfig @@ -10,3 +10,5 @@ config RT_PCI_HOST_GENERIC default y rsource "dw/Kconfig" + +osource "$(SOC_DM_PCI_DIR)/Kconfig"