[PATCH v3] PCI: use IDA to manage domain number if not getting it from DT
Shawn Lin
shawn.lin at rock-chips.com
Wed May 24 17:38:20 PDT 2017
Hi Bjorn,
On 2017/5/25 6:30, Bjorn Helgaas wrote:
> Hi Shawn,
>
> On Tue, May 23, 2017 at 03:45:11PM +0800, Shawn Lin wrote:
[...]
>> + domain = pci_get_new_domain_nr(bus);
>
> These comments and logic are too complicated for my puny brain. Much of
> this was pre-existing, of course. Surely there's a simpler way?
yup, I think we could simplify the code.
>
> 1) If we're using ACPI, every host bridge must have a _SEG method, and it
> supplies the domain. We ignore any bridge without _SEG.
>
> 2) If we're using DT, every host bridge must supply "linux,pci-domain", and
> it supplies the domain. We ignore any bridge without "linux,pci-domain".
>
> 3) Otherwise, we always use IDA.
I plan to create a new function to allocate domain number using IDA as
then we don't touch the logic of of_pci_bus_find_domain_nr, and the
name of of_pci_bus_find_domain_nr explicitly say that the domain number
comes from DT.
Then I could put the condition check inside the pci_bus_find_domain_nr
as your suggested.
Does it looks ok to you?
>
>> } else {
>> dev_err(parent, "Node %s has inconsistent \"linux,pci-domain\" property in DT\n",
[...]
>> pci_remove_bus_device(child);
>> +
>> + pci_put_old_domain_nr(bus);
>
> In your current patch, ida_domain defaults to true, and it is only set
> to false in of_pci_bus_find_domain_nr(), which is only called when
> ACPI is disabled. Therefore, ida_domain will be true when we're using
> ACPI, and I think pci_put_old_domain_nr() will erroneously remove
> domains from tha IDA.
>
woops, I forgot to check the ACPI cases.
>> pci_remove_bus(bus);
>> host_bridge->bus = NULL;
>>
>> diff --git a/include/linux/pci.h b/include/linux/pci.h
>> index 33c2b0b..9296e31 100644
>> --- a/include/linux/pci.h
>> +++ b/include/linux/pci.h
>> @@ -1445,13 +1445,17 @@ static inline int pci_enable_ptm(struct pci_dev *dev, u8 *granularity)
>> * configuration space.
>> */
>> #ifdef CONFIG_PCI_DOMAINS
>> +extern struct ida __domain_nr;
>> extern int pci_domains_supported;
>> -int pci_get_new_domain_nr(void);
>> +int pci_get_new_domain_nr(struct pci_bus *bus);
>> +void pci_put_old_domain_nr(struct pci_bus *bus);
>> #else
>> enum { pci_domains_supported = 0 };
>> static inline int pci_domain_nr(struct pci_bus *bus) { return 0; }
>> static inline int pci_proc_domain(struct pci_bus *bus) { return 0; }
>> -static inline int pci_get_new_domain_nr(void) { return -ENOSYS; }
>> +static inline int pci_get_new_domain_nr(struct pci_bus *bus)
>> +{ return -ENOSYS; }
>> +static inline void pci_put_old_domain_nr(struct pci_bus *bus) { }
>> #endif /* CONFIG_PCI_DOMAINS */
>>
>> /*
>> --
>> 1.9.1
>>
>>
>
>
>
More information about the Linux-rockchip
mailing list