On 11/8/22 5:15 AM, Bjorn Helgaas wrote: > Capitalize subject line to match other commits: > > 930c6074d7dd ("PCI: loongson: Work around LS7A incorrect Interrupt Pin registers") > 2410e3301fcc ("PCI: loongson: Don't access non-existent devices") > cd89edda4002 ("PCI: loongson: Add ACPI init support") > dee449aafd48 ("PCI: loongson: Use generic 8/16/32-bit config ops on LS2K/LS7A") > OK, I will do this in the next version patch. > On Fri, Nov 04, 2022 at 06:53:40PM +0800, Liu Peibao wrote: >> The PCI Controller of 2k1000 could not mask devices by >> setting vender id or device id in configuration space header >> as invalid values. When there are pins shareble between >> the platform device and PCI device, if the platform device >> is preferred, we should not scan this PCI device. In the >> above scene, add `status = "disabled"` property in DT node >> of this PCI device. > > Rewrap this to fill 75 columns. > > s/id/ID/ > s/shareble/shareable/ > OK, I will take care in the next version patch. >> Signed-off-by: Liu Peibao <liupeibao@xxxxxxxxxxx> >> --- >> V2 -> V3: 1. use list_for_each_entry() for more clearly. >> 2. fix wrong use of sizeof(). >> V1 -> V2: use existing property "status" instead of adding new property. >> >> >> drivers/pci/controller/pci-loongson.c | 55 +++++++++++++++++++++++++++ >> 1 file changed, 55 insertions(+) >> >> diff --git a/drivers/pci/controller/pci-loongson.c b/drivers/pci/controller/pci-loongson.c >> index 05c50408f13b..c7dd88eac885 100644 >> --- a/drivers/pci/controller/pci-loongson.c >> +++ b/drivers/pci/controller/pci-loongson.c >> @@ -40,11 +40,21 @@ struct loongson_pci_data { >> struct pci_ops *ops; >> }; >> >> +#ifdef CONFIG_OF >> +struct mask_entry { >> + struct list_head entry; >> + unsigned int devfn; >> +}; >> +#endif >> + >> struct loongson_pci { >> void __iomem *cfg0_base; >> void __iomem *cfg1_base; >> struct platform_device *pdev; >> const struct loongson_pci_data *data; >> +#ifdef CONFIG_OF >> + struct list_head masklist; >> +#endif >> }; >> >> /* Fixup wrong class code in PCIe bridges */ >> @@ -194,6 +204,18 @@ static void __iomem *pci_loongson_map_bus(struct pci_bus *bus, >> return NULL; >> } >> >> +#ifdef CONFIG_OF >> + /* Don't access devices in masklist */ >> + if (pci_is_root_bus(bus)) { >> + struct mask_entry *entry; >> + >> + list_for_each_entry(entry, &priv->masklist, entry) { >> + if (devfn == entry->devfn) >> + return NULL; >> + } >> + } >> +#endif > > I would probably get rid of the masklist and just search for a disabled > property when reading config offset 0 (vendor ID). That's not a > performance path anyway. And this seems similar to the > FLAG_DEV_HIDDEN path where you probably don't need to do it for all > controllers. > Thanks for your idea! This really helps a lot! I will follow your idea and rework it. Yes, this is similar to the FLAG_DEV_HIDDEN path and currently, this path is only needed by 2K1000 PCI controller. BR, Peibao