[SeaBIOS] [Qemu-devel] [PATCH v5 for-2.3 26/28] acpi: restrict the aml emission to PXB host bridges

Marcel Apfelbaum marcel at redhat.com
Tue Mar 10 17:18:39 CET 2015


On 03/10/2015 05:41 PM, Michael S. Tsirkin wrote:
> On Tue, Mar 10, 2015 at 05:32:12PM +0200, Marcel Apfelbaum wrote:
>> Initial implementation assumed that the aml used for
>> any extra root buses would be generic, however this
>> is not always true. Restrict aml emission only to i440fx and
>> PXB because is the only supported combination for now.
>>
>> Signed-off-by: Marcel Apfelbaum <marcel at redhat.com>
>
> I was wondering about this too.
> Please split this up and squash into appropriate patches.
> I know it's more work but it's worth it.
Sure,

Thanks,
Marcel
>
>
>> ---
>>   hw/i386/acpi-build.c                | 56 ++++++++++++++++++++-----------------
>>   hw/pci-bridge/pci_expander_bridge.c |  1 -
>>   include/hw/pci/pci_host.h           |  2 ++
>>   3 files changed, 32 insertions(+), 27 deletions(-)
>>
>> diff --git a/hw/i386/acpi-build.c b/hw/i386/acpi-build.c
>> index ff18a07..2bc8a80 100644
>> --- a/hw/i386/acpi-build.c
>> +++ b/hw/i386/acpi-build.c
>> @@ -887,7 +887,7 @@ build_ssdt(GArray *table_data, GArray *linker,
>>       /* Reserve space for header */
>>       acpi_data_push(ssdt->buf, sizeof(AcpiTableHeader));
>>
>> -    {
>> +    if (find_i440fx()) {
>>           PciInfoList *info_list, *info;
>>           Error *err = NULL;
>>
>> @@ -901,37 +901,41 @@ build_ssdt(GArray *table_data, GArray *linker,
>>               PciInfo *bus_info = info->value;
>>               PCIHostState *host;
>>
>> -            if (bus_info->bus == 0) {
>> -                continue;
>> -            }
>> +            HOST_BRIDGE_FOREACH(host) {
>> +                int numa_node;
>>
>> -            if (bus_info->bus < root_bus_limit) {
>> -                root_bus_limit = bus_info->bus - 1;
>> -            }
>> +                if (!(pci_bus_num(host->bus) == bus_info->bus)) {
>> +                    continue;
>> +                }
>>
>> -            scope = aml_scope("\\_SB");
>> -            dev = aml_device("PC%.02X", (uint8_t)bus_info->bus);
>> -            aml_append(dev, aml_name_decl("_UID",
>> -                aml_string("PC%.02X", (uint8_t)bus_info->bus)));
>> -            aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A03")));
>> -            aml_append(dev,
>> -                aml_name_decl("_BBN", aml_int((uint8_t)bus_info->bus)));
>> +                if (!object_dynamic_cast(OBJECT(host), TYPE_PXB_HOST)) {
>> +                    break;
>> +                }
>
> Or you can check the device/vendor id if that's easier.
>
>>
>> -            HOST_BRIDGE_FOREACH(host) {
>> -                if (pci_bus_num(host->bus) == bus_info->bus) {
>> -                    int numa_node = pci_bus_numa_node(host->bus);
>> -                    if (numa_node != NUMA_NODE_UNASSIGNED) {
>> -                        aml_append(dev,
>> +                if (bus_info->bus < root_bus_limit) {
>> +                    root_bus_limit = bus_info->bus - 1;
>> +                }
>> +
>> +                scope = aml_scope("\\_SB");
>> +                dev = aml_device("PC%.02X", (uint8_t)bus_info->bus);
>> +                aml_append(dev, aml_name_decl("_UID",
>> +                            aml_string("PC%.02X", (uint8_t)bus_info->bus)));
>> +                aml_append(dev, aml_name_decl("_HID", aml_string("PNP0A03")));
>> +                aml_append(dev,
>> +                        aml_name_decl("_BBN", aml_int((uint8_t)bus_info->bus)));
>> +
>> +                numa_node = pci_bus_numa_node(host->bus);
>> +                if (numa_node != NUMA_NODE_UNASSIGNED) {
>> +                    aml_append(dev,
>>                               aml_name_decl("_PXM", aml_int(numa_node)));
>> -                    }
>>                   }
>> -            }
>>
>> -            aml_append(dev, build_prt());
>> -            crs = build_crs(pci, bus_info, &io_ranges, &mem_ranges);
>> -            aml_append(dev, aml_name_decl("_CRS", crs));
>> -            aml_append(scope, dev);
>> -            aml_append(ssdt, scope);
>> +                aml_append(dev, build_prt());
>> +                crs = build_crs(pci, bus_info, &io_ranges, &mem_ranges);
>> +                aml_append(dev, aml_name_decl("_CRS", crs));
>> +                aml_append(scope, dev);
>> +                aml_append(ssdt, scope);
>> +            }
>>           }
>>
>>           qapi_free_PciInfoList(info_list);
>> diff --git a/hw/pci-bridge/pci_expander_bridge.c b/hw/pci-bridge/pci_expander_bridge.c
>> index 9329aab..8e6740e 100644
>> --- a/hw/pci-bridge/pci_expander_bridge.c
>> +++ b/hw/pci-bridge/pci_expander_bridge.c
>> @@ -41,7 +41,6 @@ typedef struct PXBDev {
>>       uint16_t numa_node;
>>   } PXBDev;
>>
>> -#define TYPE_PXB_HOST "pxb-host"
>>
>>   static int pxb_bus_num(PCIBus *bus)
>>   {
>> diff --git a/include/hw/pci/pci_host.h b/include/hw/pci/pci_host.h
>> index ba5272f..9a35389 100644
>> --- a/include/hw/pci/pci_host.h
>> +++ b/include/hw/pci/pci_host.h
>> @@ -30,6 +30,8 @@
>>
>>   #include "hw/sysbus.h"
>>
>> +#define TYPE_PXB_HOST "pxb-host"
>> +
>
> That's a wrong place for it I think.
>
>>   /**
>>    * Marker interface for classes whose instances can
>>    * be main host bridges. It is intended to be used
>> --
>> 2.1.0




More information about the SeaBIOS mailing list