On Wed, Apr 08, 2020 at 08:58:10PM +0800, Yubo Miao wrote: > From: miaoyubo <miaoy...@huawei.com> > > Write the extra roots into the fw_cfg therefore the uefi could > get the extra roots. Only if the uefi know there are extra roots, > the config space of devices behind the root could be obtained. > > Signed-off-by: miaoyubo <miaoy...@huawei.com> > --- > hw/arm/virt.c | 23 +++++++++++++++++++++++ > 1 file changed, 23 insertions(+) > > diff --git a/hw/arm/virt.c b/hw/arm/virt.c > index 7dc96abf72..0fdfe4129c 100644 > --- a/hw/arm/virt.c > +++ b/hw/arm/virt.c > @@ -77,6 +77,7 @@ > #include "hw/acpi/generic_event_device.h" > #include "hw/virtio/virtio-iommu.h" > #include "hw/char/pl011.h" > +#include "hw/pci/pci_bus.h" > > #define DEFINE_VIRT_MACHINE_LATEST(major, minor, latest) \ > static void virt_##major##_##minor##_class_init(ObjectClass *oc, \ > @@ -1435,6 +1436,12 @@ void virt_machine_done(Notifier *notifier, void *data) > ARMCPU *cpu = ARM_CPU(first_cpu); > struct arm_boot_info *info = &vms->bootinfo; > AddressSpace *as = arm_boot_address_space(cpu, info); > + PCIHostState *s = OBJECT_CHECK(PCIHostState, > + object_resolve_path_type("", > + "pcie-host-bridge", NULL), > + TYPE_PCI_HOST_BRIDGE); > + > + PCIBus *bus = s->bus; > > /* > * If the user provided a dtb, we assume the dynamic sysbus nodes
Seems duplicated all over the place. Add an API for that? > @@ -1453,6 +1460,22 @@ void virt_machine_done(Notifier *notifier, void *data) > exit(1); > } > > + if (bus) { > + int extra_hosts = 0; > + QLIST_FOREACH(bus, &bus->child, sibling) { > + /* look for expander root buses */ > + if (pci_bus_is_root(bus)) { > + extra_hosts++; > + } > + } > + if (extra_hosts && vms->fw_cfg) { > + uint64_t *val = g_malloc(sizeof(*val)); > + *val = cpu_to_le64(extra_hosts); > + fw_cfg_add_file(vms->fw_cfg, > + "etc/extra-pci-roots", val, sizeof(*val)); > + } > + } > + > virt_acpi_setup(vms); > virt_build_smbios(vms); Duplicated from pc. Pls refactor. > } > -- > 2.19.1 >