Re: [PATCH v3] PCI: loongson: skip scanning unavailable child device

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [DMA Engine]     [Linux Coverity]     [Linux USB]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Greybus]

  Powered by Linux