Catalin and Will, Appreciate it that you can have a look at this one and patch #4, note that there exists an alternative solution at[1]. The difference is the way used to pass the corresponding ACPI device pointers for PCI host bridges: currently pci_config_window->parent is used, and this patch and patch #4 allow the field to be NULL, because Hyper-V's PCI host bridges don't have ACPI devices, while [1] changes to use pci_host_bridge->private. And I'm OK with either way, I don't have a strong opinion here ;-) Looking forwards to your suggestion, Thanks! Regards, Boqun [1]: https://lore.kernel.org/lkml/20210811153619.88922-1-boqun.feng@xxxxxxxxx/ On Tue, Jul 27, 2021 at 02:06:53AM +0800, Boqun Feng wrote: > Currently at root bridge preparation, the corresponding ACPI device will > be set as the companion, however for a Hyper-V virtual PCI root bridge, > there is no corresponding ACPI device, because a Hyper-V virtual PCI > root bridge is discovered via VMBus rather than ACPI table. In order to > support this, we need to make pcibios_root_bridge_prepare() work with > cfg->parent being NULL. > > Use a NULL pointer as the ACPI device if there is no corresponding ACPI > device, and this is fine because: 1) ACPI_COMPANION_SET() can work with > the second parameter being NULL, 2) semantically, if a NULL pointer is > set via ACPI_COMPANION_SET(), ACPI_COMPANION() (the read API for this > field) will return NULL, and since ACPI_COMPANION() may return NULL, so > users must have handled the cases where it returns NULL, and 3) since > there is no corresponding ACPI device, it would be wrong to use any > other value here. > > Signed-off-by: Boqun Feng <boqun.feng@xxxxxxxxx> > --- > arch/arm64/kernel/pci.c | 12 +++++++++++- > 1 file changed, 11 insertions(+), 1 deletion(-) > > diff --git a/arch/arm64/kernel/pci.c b/arch/arm64/kernel/pci.c > index 5148ae242780..2276689b5411 100644 > --- a/arch/arm64/kernel/pci.c > +++ b/arch/arm64/kernel/pci.c > @@ -90,7 +90,17 @@ int pcibios_root_bridge_prepare(struct pci_host_bridge *bridge) > return 0; > > cfg = bridge->bus->sysdata; > - adev = to_acpi_device(cfg->parent); > + > + /* > + * On Hyper-V there is no corresponding ACPI device for a root bridge, > + * therefore ->parent is set as NULL by the driver. And set 'adev' as > + * NULL in this case because there is no proper ACPI device. > + */ > + if (!cfg->parent) > + adev = NULL; > + else > + adev = to_acpi_device(cfg->parent); > + > bus_dev = &bridge->bus->dev; > > ACPI_COMPANION_SET(&bridge->dev, adev); > -- > 2.32.0 >