lkml.org 
[lkml]   [2021]   [Jul]   [26]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH v6 2/8] PCI: Support populating MSI domains of root buses via bridges
    Date
    Currently, at probing time, the MSI domains of root buses are populated
    if either the information of MSI domain is available from firmware (DT
    or ACPI), or arch-specific sysdata is used to pass the fwnode of the MSI
    domain. These two conditions don't cover all, e.g. Hyper-V virtual PCI
    on ARM64, which doesn't have the MSI information in the firmware and
    couldn't use arch-specific sysdata because running on an architecture
    with PCI_DOMAINS_GENERIC=y.

    To support populating MSI domains of the root buses at the probing when
    neither of the above condition is true, the ->msi_domain of the
    corresponding bridge device is used: in pci_host_bridge_msi_domain(),
    which should return the MSI domain of the root bus, the ->msi_domain of
    the corresponding bridge is fetched first as a potential value of the
    MSI domain of the root bus.

    In order to use the approach to populate MSI domains, the driver needs
    to dev_set_msi_domain() on the bridge before calling
    pci_register_host_bridge(), and makes sure GENERIC_MSI_IRQ_DOMAIN=y.

    Another advantage of this new approach is providing an arch-independent
    way to populate MSI domains, which allows sharing the driver code as
    much as possible between architectures.

    Originally-by: Arnd Bergmann <arnd@arndb.de>
    Signed-off-by: Boqun Feng <boqun.feng@gmail.com>
    ---
    drivers/pci/probe.c | 6 +++++-
    1 file changed, 5 insertions(+), 1 deletion(-)

    diff --git a/drivers/pci/probe.c b/drivers/pci/probe.c
    index 60c50d4f156f..ea7f2a57e2f5 100644
    --- a/drivers/pci/probe.c
    +++ b/drivers/pci/probe.c
    @@ -829,11 +829,15 @@ static struct irq_domain *pci_host_bridge_msi_domain(struct pci_bus *bus)
    {
    struct irq_domain *d;

    + /* If the host bridge driver sets a MSI domain of the bridge, use it */
    + d = dev_get_msi_domain(bus->bridge);
    +
    /*
    * Any firmware interface that can resolve the msi_domain
    * should be called from here.
    */
    - d = pci_host_bridge_of_msi_domain(bus);
    + if (!d)
    + d = pci_host_bridge_of_msi_domain(bus);
    if (!d)
    d = pci_host_bridge_acpi_msi_domain(bus);

    --
    2.32.0
    \
     
     \ /
      Last update: 2021-07-26 20:09    [W:3.102 / U:0.036 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site