[Qemu-devel] [RFC v3 3/6] i386/acpi-build: describe new pci domain in AML
Describe new pci segments of host bridges in AML as new pci devices, with _SEG and _BBN to let them be in DSDT Signed-off-by: Zihan Yang --- hw/i386/acpi-build.c | 78 +++- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 30bd0d5..4b6ef78 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1832,6 +1832,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, aml_append(dev, aml_name_decl("_UID", aml_int(1))); aml_append(dev, build_q35_osc_method()); aml_append(sb_scope, dev); + aml_append(dsdt, sb_scope); build_hpet_aml(dsdt); @@ -1875,6 +1876,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, crs_range_set_init(_range_set); bus = PC_MACHINE(machine)->bus; +i = 1; // PCI0 is q35 host, pxb starts from 1 if (bus) { QLIST_FOREACH(bus, >child, sibling) { uint8_t bus_num = pci_bus_num(bus); @@ -1890,10 +1892,9 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, } scope = aml_scope("\\_SB"); -dev = aml_device("PC%.02X", bus_num); +dev = aml_device("PCI%d", i++); aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03"))); -aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); if (pci_bus_is_express(bus)) { aml_append(dev, build_q35_osc_method()); } @@ -2125,36 +2126,63 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, sb_scope = aml_scope("\\_SB"); { Object *pci_host; +QObject *o; PCIBus *bus = NULL; +uint32_t domain_nr; +uint8_t bus_nr; +int index = 0; pci_host = acpi_get_i386_pci_host(); -if (pci_host) { +while (pci_host) { +Object *obj = object_property_get_link(pci_host, + PROP_PXB_PCIE_DEV, NULL); +if (!obj) { +/* we are in q35 host */ +obj = pci_host; +} +o = object_property_get_qobject(obj, PROP_PXB_PCIE_DOMAIN_NR, NULL); +assert(o); +domain_nr = qnum_get_uint(qobject_to(QNum, o)); +qobject_unref(o); + +o = object_property_get_qobject(pci_host, "bus_nr", NULL); +if (!o) { +/* we are in q35 host */ +bus_nr = 0; +} else { +bus_nr = qnum_get_uint(qobject_to(QNum, o)); +qobject_unref(o); +} + bus = PCI_HOST_BRIDGE(pci_host)->bus; -} +if (bus) { +Aml *scope = aml_scope("PCI%d", index); +aml_append(scope, aml_name_decl("_SEG", aml_int(domain_nr))); +aml_append(scope, aml_name_decl("_BBN", aml_int(bus_nr))); +/* Scan all PCI buses. Generate tables to support hotplug. */ +build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en); -if (bus) { -Aml *scope = aml_scope("PCI0"); -/* Scan all PCI buses. Generate tables to support hotplug. */ -build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en); +/* Only add TPM once */ +if (index++ == 0 && TPM_IS_TIS(tpm_find())) { +dev = aml_device("ISA.TPM"); +aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C31"))); +aml_append(dev, aml_name_decl("_STA", aml_int(0xF))); +crs = aml_resource_template(); +aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, + TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); +/* +FIXME: TPM_TIS_IRQ=5 conflicts with PNP0C0F irqs, +Rewrite to take IRQ from TPM device model and +fix default IRQ value there to use some unused IRQ + */ +/* aml_append(crs, aml_irq_no_flags(TPM_TIS_IRQ)); */ +aml_append(dev, aml_name_decl("_CRS", crs)); +aml_append(scope, dev); +} -if (TPM_IS_TIS(tpm_find())) { -dev = aml_device("ISA.TPM"); -aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C31"))); -aml_append(dev, aml_name_decl("_STA", aml_int(0xF))); -crs = aml_resource_template(); -aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, - TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); -/* -FIXME: TPM_TIS_IRQ=5 conflicts with PNP0C0F irqs, -Rewrite to take IRQ from TPM device model and -fix default IRQ value
[Qemu-devel] [RFC v3 3/6] i386/acpi-build: describe new pci domain in AML
Describe new pci segments of host bridges in AML as new pci devices, with _SEG and _BBN to let them be in DSDT Signed-off-by: Zihan Yang --- hw/i386/acpi-build.c | 78 +++- 1 file changed, 53 insertions(+), 25 deletions(-) diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c index 30bd0d5..4b6ef78 100644 --- a/hw/i386/acpi-build.c +++ b/hw/i386/acpi-build.c @@ -1832,6 +1832,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, aml_append(dev, aml_name_decl("_UID", aml_int(1))); aml_append(dev, build_q35_osc_method()); aml_append(sb_scope, dev); + aml_append(dsdt, sb_scope); build_hpet_aml(dsdt); @@ -1875,6 +1876,7 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, crs_range_set_init(_range_set); bus = PC_MACHINE(machine)->bus; +i = 1; // PCI0 is q35 host, pxb starts from 1 if (bus) { QLIST_FOREACH(bus, >child, sibling) { uint8_t bus_num = pci_bus_num(bus); @@ -1890,10 +1892,9 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, } scope = aml_scope("\\_SB"); -dev = aml_device("PC%.02X", bus_num); +dev = aml_device("PCI%d", i++); aml_append(dev, aml_name_decl("_UID", aml_int(bus_num))); aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0A03"))); -aml_append(dev, aml_name_decl("_BBN", aml_int(bus_num))); if (pci_bus_is_express(bus)) { aml_append(dev, build_q35_osc_method()); } @@ -2125,36 +2126,63 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, sb_scope = aml_scope("\\_SB"); { Object *pci_host; +QObject *o; PCIBus *bus = NULL; +uint32_t domain_nr; +uint8_t bus_nr; +int index = 0; pci_host = acpi_get_i386_pci_host(); -if (pci_host) { +while (pci_host) { +Object *obj = object_property_get_link(pci_host, + PROP_PXB_PCIE_DEV, NULL); +if (!obj) { +/* we are in q35 host */ +obj = pci_host; +} +o = object_property_get_qobject(obj, PROP_PXB_PCIE_DOMAIN_NR, NULL); +assert(o); +domain_nr = qnum_get_uint(qobject_to(QNum, o)); +qobject_unref(o); + +o = object_property_get_qobject(pci_host, "bus_nr", NULL); +if (!o) { +/* we are in q35 host */ +bus_nr = 0; +} else { +bus_nr = qnum_get_uint(qobject_to(QNum, o)); +qobject_unref(o); +} + bus = PCI_HOST_BRIDGE(pci_host)->bus; -} +if (bus) { +Aml *scope = aml_scope("PCI%d", index); +aml_append(scope, aml_name_decl("_SEG", aml_int(domain_nr))); +aml_append(scope, aml_name_decl("_BBN", aml_int(bus_nr))); +/* Scan all PCI buses. Generate tables to support hotplug. */ +build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en); -if (bus) { -Aml *scope = aml_scope("PCI0"); -/* Scan all PCI buses. Generate tables to support hotplug. */ -build_append_pci_bus_devices(scope, bus, pm->pcihp_bridge_en); +/* Only add TPM once */ +if (index++ == 0 && TPM_IS_TIS(tpm_find())) { +dev = aml_device("ISA.TPM"); +aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C31"))); +aml_append(dev, aml_name_decl("_STA", aml_int(0xF))); +crs = aml_resource_template(); +aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, + TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); +/* +FIXME: TPM_TIS_IRQ=5 conflicts with PNP0C0F irqs, +Rewrite to take IRQ from TPM device model and +fix default IRQ value there to use some unused IRQ + */ +/* aml_append(crs, aml_irq_no_flags(TPM_TIS_IRQ)); */ +aml_append(dev, aml_name_decl("_CRS", crs)); +aml_append(scope, dev); +} -if (TPM_IS_TIS(tpm_find())) { -dev = aml_device("ISA.TPM"); -aml_append(dev, aml_name_decl("_HID", aml_eisaid("PNP0C31"))); -aml_append(dev, aml_name_decl("_STA", aml_int(0xF))); -crs = aml_resource_template(); -aml_append(crs, aml_memory32_fixed(TPM_TIS_ADDR_BASE, - TPM_TIS_ADDR_SIZE, AML_READ_WRITE)); -/* -FIXME: TPM_TIS_IRQ=5 conflicts with PNP0C0F irqs, -Rewrite to take IRQ from TPM device model and -fix default IRQ value