@@ -105,6 +105,8 @@ typedef struct AcpiPmInfo {
uint16_t cpu_hp_io_len;
uint16_t mem_hp_io_base;
uint16_t mem_hp_io_len;
+ uint16_t pcihp_io_base;
+ uint16_t pcihp_io_len;
} AcpiPmInfo;
typedef struct AcpiMiscInfo {
@@ -182,6 +184,10 @@ static void acpi_get_pm_info(AcpiPmInfo *pm)
if (piix) {
obj = piix;
pm->cpu_hp_io_base = PIIX4_CPU_HOTPLUG_IO_BASE;
+ pm->pcihp_io_base =
+ object_property_get_int(obj, ACPI_PCIHP_IO_BASE_PROP, NULL);
+ pm->pcihp_io_len =
+ object_property_get_int(obj, ACPI_PCIHP_IO_LEN_PROP, NULL);
}
if (lpc) {
obj = lpc;
@@ -700,6 +706,25 @@ build_ssdt(GArray *table_data, GArray *linker,
patch_pci_windows(pci, ssdt_ptr, sizeof(ssdp_misc_aml));
+ scope = acpi_scope("\\_SB.PCI0");
+ /* reserve PCIHP resources */
+ if (pm->pcihp_io_len) {
+ dev = acpi_device("PHPR");
+ aml_append(&dev, acpi_name_decl("_HID", acpi_string("PNP0A06")));
+ aml_append(&dev,
+ acpi_name_decl("_UID", acpi_string("PCI Hotplug resources")));
+ /* device present, functioning, decoding, not shown in UI */
+ aml_append(&dev, acpi_name_decl("_STA", acpi_int(0xB)));
+ crs = acpi_resource_template();
+ aml_append(&crs,
+ acpi_io(acpi_decode16, pm->pcihp_io_base, pm->pcihp_io_base,
+ 1, pm->pcihp_io_len)
+ );
+ aml_append(&dev, acpi_name_decl("_CRS", crs));
+ aml_append(&scope, dev);
+ }
+ aml_append(&table_aml, scope);
+
/* create S3_ / S4_ / S5_ packages if necessary */
scope = acpi_scope("\\");
if (!pm->s3_disabled) {
Signed-off-by: Igor Mammedov <imammedo@redhat.com> --- hw/i386/acpi-build.c | 25 +++++++++++++++++++++++++ 1 file changed, 25 insertions(+)