Modify the DSDT ACPI table to enable ACPI PCI hotplug.
Signed-off-by: Eric Auger <eric.auger@redhat.com>
---
v2 -> v3:
- use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
- use cihp_state->use_acpi_hotplug_bridge
---
include/hw/acpi/pcihp.h | 2 ++
include/hw/arm/virt.h | 1 +
hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
hw/arm/virt.c | 2 ++
hw/arm/Kconfig | 2 ++
5 files changed, 29 insertions(+)
diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
index 5506a58862..9ff548650b 100644
--- a/include/hw/acpi/pcihp.h
+++ b/include/hw/acpi/pcihp.h
@@ -38,6 +38,8 @@
#define ACPI_PCIHP_SEJ_BASE 0x8
#define ACPI_PCIHP_BNMR_BASE 0x10
+#define ACPI_PCIHP_SIZE 0x0018
+
typedef struct AcpiPciHpPciStatus {
uint32_t up;
uint32_t down;
diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
index 9a1b0f53d2..0ed2e6b732 100644
--- a/include/hw/arm/virt.h
+++ b/include/hw/arm/virt.h
@@ -79,6 +79,7 @@ enum {
VIRT_ACPI_GED,
VIRT_NVDIMM_ACPI,
VIRT_PVTIME,
+ VIRT_ACPI_PCIHP,
VIRT_LOWMEMMAP_LAST,
};
diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
index d7547c8d3b..a2e58288f8 100644
--- a/hw/arm/virt-acpi-build.c
+++ b/hw/arm/virt-acpi-build.c
@@ -34,6 +34,7 @@
#include "hw/core/cpu.h"
#include "hw/acpi/acpi-defs.h"
#include "hw/acpi/acpi.h"
+#include "hw/acpi/pcihp.h"
#include "hw/nvram/fw_cfg_acpi.h"
#include "hw/acpi/bios-linker-loader.h"
#include "hw/acpi/aml-build.h"
@@ -809,6 +810,8 @@ static void
build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
{
VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
+ AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
+ AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
Aml *scope, *dsdt;
MachineState *ms = MACHINE(vms);
const MemMapEntry *memmap = vms->memmap;
@@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
aml_append(dsdt, scope);
+ if (pcihp_state->use_acpi_hotplug_bridge) {
+ Aml *pci0_scope = aml_scope("\\_SB.PCI0");
+
+ aml_append(pci0_scope, aml_pci_edsm());
+ build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
+ memmap[VIRT_ACPI_PCIHP].base);
+ build_append_pcihp_resources(pci0_scope,
+ memmap[VIRT_ACPI_PCIHP].base,
+ memmap[VIRT_ACPI_PCIHP].size);
+
+ /* Scan all PCI buses. Generate tables to support hotplug. */
+ build_append_pci_bus_devices(pci0_scope, vms->bus);
+ if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
+ build_append_pcihp_slots(pci0_scope, vms->bus);
+ }
+ build_append_notification_callback(pci0_scope, vms->bus);
+ aml_append(dsdt, pci0_scope);
+ }
+
/* copy AML table into ACPI tables blob */
g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
diff --git a/hw/arm/virt.c b/hw/arm/virt.c
index 9a6cd085a3..08bd808499 100644
--- a/hw/arm/virt.c
+++ b/hw/arm/virt.c
@@ -75,6 +75,7 @@
#include "standard-headers/linux/input.h"
#include "hw/arm/smmuv3.h"
#include "hw/acpi/acpi.h"
+#include "hw/acpi/pcihp.h"
#include "target/arm/cpu-qom.h"
#include "target/arm/internals.h"
#include "target/arm/multiprocessing.h"
@@ -183,6 +184,7 @@ static const MemMapEntry base_memmap[] = {
[VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
[VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
[VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
+ [VIRT_ACPI_PCIHP] = { 0x090c0000, ACPI_PCIHP_SIZE },
[VIRT_MMIO] = { 0x0a000000, 0x00000200 },
/* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
[VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
index f543d944c3..dee4d6dd25 100644
--- a/hw/arm/Kconfig
+++ b/hw/arm/Kconfig
@@ -34,6 +34,8 @@ config ARM_VIRT
select ACPI_HW_REDUCED
select ACPI_APEI
select ACPI_VIOT
+ select ACPI_PCIHP
+ select ACPI_PCI_BRIDGE
select VIRTIO_MEM_SUPPORTED
select ACPI_CXL
select ACPI_HMAT
--
2.49.0
On Mon, 16 Jun 2025 11:46:46 +0200
Eric Auger <eric.auger@redhat.com> wrote:
> Modify the DSDT ACPI table to enable ACPI PCI hotplug.
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>
> ---
> v2 -> v3:
> - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
> - use cihp_state->use_acpi_hotplug_bridge
> ---
> include/hw/acpi/pcihp.h | 2 ++
> include/hw/arm/virt.h | 1 +
> hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
> hw/arm/virt.c | 2 ++
> hw/arm/Kconfig | 2 ++
> 5 files changed, 29 insertions(+)
>
> diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
> index 5506a58862..9ff548650b 100644
> --- a/include/hw/acpi/pcihp.h
> +++ b/include/hw/acpi/pcihp.h
> @@ -38,6 +38,8 @@
> #define ACPI_PCIHP_SEJ_BASE 0x8
> #define ACPI_PCIHP_BNMR_BASE 0x10
>
> +#define ACPI_PCIHP_SIZE 0x0018
> +
> typedef struct AcpiPciHpPciStatus {
> uint32_t up;
> uint32_t down;
> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> index 9a1b0f53d2..0ed2e6b732 100644
> --- a/include/hw/arm/virt.h
> +++ b/include/hw/arm/virt.h
> @@ -79,6 +79,7 @@ enum {
> VIRT_ACPI_GED,
> VIRT_NVDIMM_ACPI,
> VIRT_PVTIME,
> + VIRT_ACPI_PCIHP,
> VIRT_LOWMEMMAP_LAST,
> };
>
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index d7547c8d3b..a2e58288f8 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -34,6 +34,7 @@
> #include "hw/core/cpu.h"
> #include "hw/acpi/acpi-defs.h"
> #include "hw/acpi/acpi.h"
> +#include "hw/acpi/pcihp.h"
> #include "hw/nvram/fw_cfg_acpi.h"
> #include "hw/acpi/bios-linker-loader.h"
> #include "hw/acpi/aml-build.h"
> @@ -809,6 +810,8 @@ static void
> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
> {
> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
> + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
> + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
> Aml *scope, *dsdt;
> MachineState *ms = MACHINE(vms);
> const MemMapEntry *memmap = vms->memmap;
> @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>
> aml_append(dsdt, scope);
>
> + if (pcihp_state->use_acpi_hotplug_bridge) {
ditto, use property accessor
> + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
> +
> + aml_append(pci0_scope, aml_pci_edsm());
> + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
> + memmap[VIRT_ACPI_PCIHP].base);
> + build_append_pcihp_resources(pci0_scope,
> + memmap[VIRT_ACPI_PCIHP].base,
> + memmap[VIRT_ACPI_PCIHP].size);
> +
> + /* Scan all PCI buses. Generate tables to support hotplug. */
> + build_append_pci_bus_devices(pci0_scope, vms->bus);
> + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
> + build_append_pcihp_slots(pci0_scope, vms->bus);
> + }
> + build_append_notification_callback(pci0_scope, vms->bus);
> + aml_append(dsdt, pci0_scope);
> + }
> +
> /* copy AML table into ACPI tables blob */
> g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
>
> diff --git a/hw/arm/virt.c b/hw/arm/virt.c
> index 9a6cd085a3..08bd808499 100644
> --- a/hw/arm/virt.c
> +++ b/hw/arm/virt.c
> @@ -75,6 +75,7 @@
> #include "standard-headers/linux/input.h"
> #include "hw/arm/smmuv3.h"
> #include "hw/acpi/acpi.h"
> +#include "hw/acpi/pcihp.h"
> #include "target/arm/cpu-qom.h"
> #include "target/arm/internals.h"
> #include "target/arm/multiprocessing.h"
> @@ -183,6 +184,7 @@ static const MemMapEntry base_memmap[] = {
> [VIRT_NVDIMM_ACPI] = { 0x09090000, NVDIMM_ACPI_IO_LEN},
> [VIRT_PVTIME] = { 0x090a0000, 0x00010000 },
> [VIRT_SECURE_GPIO] = { 0x090b0000, 0x00001000 },
> + [VIRT_ACPI_PCIHP] = { 0x090c0000, ACPI_PCIHP_SIZE },
> [VIRT_MMIO] = { 0x0a000000, 0x00000200 },
> /* ...repeating for a total of NUM_VIRTIO_TRANSPORTS, each of that size */
> [VIRT_PLATFORM_BUS] = { 0x0c000000, 0x02000000 },
> diff --git a/hw/arm/Kconfig b/hw/arm/Kconfig
> index f543d944c3..dee4d6dd25 100644
> --- a/hw/arm/Kconfig
> +++ b/hw/arm/Kconfig
> @@ -34,6 +34,8 @@ config ARM_VIRT
> select ACPI_HW_REDUCED
> select ACPI_APEI
> select ACPI_VIOT
> + select ACPI_PCIHP
> + select ACPI_PCI_BRIDGE
> select VIRTIO_MEM_SUPPORTED
> select ACPI_CXL
> select ACPI_HMAT
On Mon, 16 Jun 2025 11:46:46 +0200
Eric Auger <eric.auger@redhat.com> wrote:
> Modify the DSDT ACPI table to enable ACPI PCI hotplug.
>
> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>
> ---
> v2 -> v3:
> - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
> - use cihp_state->use_acpi_hotplug_bridge
pcihp_state
Takes a bit of searching to find the various bits of the
same support on x86 but this seems to match up.
Exactly when things are built does vary but not I think
in a way that matters. e.g. I think on x86 the
EDSM stuff is built whether or not we have pcihp enabled
whereas here you've made it conditional on using acpi
hp. Perhaps a tiny bit more description on that would be
useful if you do a v4?
Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
> ---
> include/hw/acpi/pcihp.h | 2 ++
> include/hw/arm/virt.h | 1 +
> hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
> hw/arm/virt.c | 2 ++
> hw/arm/Kconfig | 2 ++
> 5 files changed, 29 insertions(+)
>
> diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
> index 5506a58862..9ff548650b 100644
> --- a/include/hw/acpi/pcihp.h
> +++ b/include/hw/acpi/pcihp.h
> @@ -38,6 +38,8 @@
> #define ACPI_PCIHP_SEJ_BASE 0x8
> #define ACPI_PCIHP_BNMR_BASE 0x10
>
> +#define ACPI_PCIHP_SIZE 0x0018
> +
> typedef struct AcpiPciHpPciStatus {
> uint32_t up;
> uint32_t down;
> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> index 9a1b0f53d2..0ed2e6b732 100644
> --- a/include/hw/arm/virt.h
> +++ b/include/hw/arm/virt.h
> @@ -79,6 +79,7 @@ enum {
> VIRT_ACPI_GED,
> VIRT_NVDIMM_ACPI,
> VIRT_PVTIME,
> + VIRT_ACPI_PCIHP,
> VIRT_LOWMEMMAP_LAST,
> };
>
> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> index d7547c8d3b..a2e58288f8 100644
> --- a/hw/arm/virt-acpi-build.c
> +++ b/hw/arm/virt-acpi-build.c
> @@ -34,6 +34,7 @@
> #include "hw/core/cpu.h"
> #include "hw/acpi/acpi-defs.h"
> #include "hw/acpi/acpi.h"
> +#include "hw/acpi/pcihp.h"
> #include "hw/nvram/fw_cfg_acpi.h"
> #include "hw/acpi/bios-linker-loader.h"
> #include "hw/acpi/aml-build.h"
> @@ -809,6 +810,8 @@ static void
> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
> {
> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
> + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
> + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
> Aml *scope, *dsdt;
> MachineState *ms = MACHINE(vms);
> const MemMapEntry *memmap = vms->memmap;
> @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>
> aml_append(dsdt, scope);
>
> + if (pcihp_state->use_acpi_hotplug_bridge) {
> + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
> +
> + aml_append(pci0_scope, aml_pci_edsm());
> + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
> + memmap[VIRT_ACPI_PCIHP].base);
> + build_append_pcihp_resources(pci0_scope,
> + memmap[VIRT_ACPI_PCIHP].base,
> + memmap[VIRT_ACPI_PCIHP].size);
> +
> + /* Scan all PCI buses. Generate tables to support hotplug. */
> + build_append_pci_bus_devices(pci0_scope, vms->bus);
> + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
> + build_append_pcihp_slots(pci0_scope, vms->bus);
> + }
> + build_append_notification_callback(pci0_scope, vms->bus);
> + aml_append(dsdt, pci0_scope);
> + }
> +
> /* copy AML table into ACPI tables blob */
> g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
>
On Fri, 20 Jun 2025 10:35:38 +0100
Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
> On Mon, 16 Jun 2025 11:46:46 +0200
> Eric Auger <eric.auger@redhat.com> wrote:
>
> > Modify the DSDT ACPI table to enable ACPI PCI hotplug.
> >
> > Signed-off-by: Eric Auger <eric.auger@redhat.com>
> >
> > ---
> > v2 -> v3:
> > - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
> > - use cihp_state->use_acpi_hotplug_bridge
>
> pcihp_state
>
> Takes a bit of searching to find the various bits of the
> same support on x86 but this seems to match up.
> Exactly when things are built does vary but not I think
> in a way that matters. e.g. I think on x86 the
> EDSM stuff is built whether or not we have pcihp enabled
> whereas here you've made it conditional on using acpi
> hp. Perhaps a tiny bit more description on that would be
> useful if you do a v4?
edsm should be built regardless of pcihp
(well intention was there, whether I messed it up or not I don't know)
idea is that non hotplug ports can have a static acpi-index,
so it doesn't depend on pcihp.
>
> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
>
>
> > ---
> > include/hw/acpi/pcihp.h | 2 ++
> > include/hw/arm/virt.h | 1 +
> > hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
> > hw/arm/virt.c | 2 ++
> > hw/arm/Kconfig | 2 ++
> > 5 files changed, 29 insertions(+)
> >
> > diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
> > index 5506a58862..9ff548650b 100644
> > --- a/include/hw/acpi/pcihp.h
> > +++ b/include/hw/acpi/pcihp.h
> > @@ -38,6 +38,8 @@
> > #define ACPI_PCIHP_SEJ_BASE 0x8
> > #define ACPI_PCIHP_BNMR_BASE 0x10
> >
> > +#define ACPI_PCIHP_SIZE 0x0018
> > +
> > typedef struct AcpiPciHpPciStatus {
> > uint32_t up;
> > uint32_t down;
> > diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> > index 9a1b0f53d2..0ed2e6b732 100644
> > --- a/include/hw/arm/virt.h
> > +++ b/include/hw/arm/virt.h
> > @@ -79,6 +79,7 @@ enum {
> > VIRT_ACPI_GED,
> > VIRT_NVDIMM_ACPI,
> > VIRT_PVTIME,
> > + VIRT_ACPI_PCIHP,
> > VIRT_LOWMEMMAP_LAST,
> > };
> >
> > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> > index d7547c8d3b..a2e58288f8 100644
> > --- a/hw/arm/virt-acpi-build.c
> > +++ b/hw/arm/virt-acpi-build.c
> > @@ -34,6 +34,7 @@
> > #include "hw/core/cpu.h"
> > #include "hw/acpi/acpi-defs.h"
> > #include "hw/acpi/acpi.h"
> > +#include "hw/acpi/pcihp.h"
> > #include "hw/nvram/fw_cfg_acpi.h"
> > #include "hw/acpi/bios-linker-loader.h"
> > #include "hw/acpi/aml-build.h"
> > @@ -809,6 +810,8 @@ static void
> > build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
> > {
> > VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
> > + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
> > + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
> > Aml *scope, *dsdt;
> > MachineState *ms = MACHINE(vms);
> > const MemMapEntry *memmap = vms->memmap;
> > @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
> >
> > aml_append(dsdt, scope);
> >
> > + if (pcihp_state->use_acpi_hotplug_bridge) {
> > + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
> > +
> > + aml_append(pci0_scope, aml_pci_edsm());
> > + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
> > + memmap[VIRT_ACPI_PCIHP].base);
> > + build_append_pcihp_resources(pci0_scope,
> > + memmap[VIRT_ACPI_PCIHP].base,
> > + memmap[VIRT_ACPI_PCIHP].size);
> > +
> > + /* Scan all PCI buses. Generate tables to support hotplug. */
> > + build_append_pci_bus_devices(pci0_scope, vms->bus);
> > + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
> > + build_append_pcihp_slots(pci0_scope, vms->bus);
> > + }
> > + build_append_notification_callback(pci0_scope, vms->bus);
> > + aml_append(dsdt, pci0_scope);
> > + }
> > +
> > /* copy AML table into ACPI tables blob */
> > g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
> >
>
On 6/20/25 2:38 PM, Igor Mammedov wrote:
> On Fri, 20 Jun 2025 10:35:38 +0100
> Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
>
>> On Mon, 16 Jun 2025 11:46:46 +0200
>> Eric Auger <eric.auger@redhat.com> wrote:
>>
>>> Modify the DSDT ACPI table to enable ACPI PCI hotplug.
>>>
>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>
>>> ---
>>> v2 -> v3:
>>> - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
>>> - use cihp_state->use_acpi_hotplug_bridge
>> pcihp_state
>>
>> Takes a bit of searching to find the various bits of the
>> same support on x86 but this seems to match up.
>> Exactly when things are built does vary but not I think
>> in a way that matters. e.g. I think on x86 the
>> EDSM stuff is built whether or not we have pcihp enabled
>> whereas here you've made it conditional on using acpi
>> hp. Perhaps a tiny bit more description on that would be
>> useful if you do a v4?
> edsm should be built regardless of pcihp
> (well intention was there, whether I messed it up or not I don't know)
>
> idea is that non hotplug ports can have a static acpi-index,
> so it doesn't depend on pcihp.
OK I can make it unconditional. The drawback is that it will oblige to
rebuild reference blobs again with native pci hotplug.
Eric
>
>> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
>>
>>
>>> ---
>>> include/hw/acpi/pcihp.h | 2 ++
>>> include/hw/arm/virt.h | 1 +
>>> hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
>>> hw/arm/virt.c | 2 ++
>>> hw/arm/Kconfig | 2 ++
>>> 5 files changed, 29 insertions(+)
>>>
>>> diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
>>> index 5506a58862..9ff548650b 100644
>>> --- a/include/hw/acpi/pcihp.h
>>> +++ b/include/hw/acpi/pcihp.h
>>> @@ -38,6 +38,8 @@
>>> #define ACPI_PCIHP_SEJ_BASE 0x8
>>> #define ACPI_PCIHP_BNMR_BASE 0x10
>>>
>>> +#define ACPI_PCIHP_SIZE 0x0018
>>> +
>>> typedef struct AcpiPciHpPciStatus {
>>> uint32_t up;
>>> uint32_t down;
>>> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
>>> index 9a1b0f53d2..0ed2e6b732 100644
>>> --- a/include/hw/arm/virt.h
>>> +++ b/include/hw/arm/virt.h
>>> @@ -79,6 +79,7 @@ enum {
>>> VIRT_ACPI_GED,
>>> VIRT_NVDIMM_ACPI,
>>> VIRT_PVTIME,
>>> + VIRT_ACPI_PCIHP,
>>> VIRT_LOWMEMMAP_LAST,
>>> };
>>>
>>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
>>> index d7547c8d3b..a2e58288f8 100644
>>> --- a/hw/arm/virt-acpi-build.c
>>> +++ b/hw/arm/virt-acpi-build.c
>>> @@ -34,6 +34,7 @@
>>> #include "hw/core/cpu.h"
>>> #include "hw/acpi/acpi-defs.h"
>>> #include "hw/acpi/acpi.h"
>>> +#include "hw/acpi/pcihp.h"
>>> #include "hw/nvram/fw_cfg_acpi.h"
>>> #include "hw/acpi/bios-linker-loader.h"
>>> #include "hw/acpi/aml-build.h"
>>> @@ -809,6 +810,8 @@ static void
>>> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>>> {
>>> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
>>> + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
>>> + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
>>> Aml *scope, *dsdt;
>>> MachineState *ms = MACHINE(vms);
>>> const MemMapEntry *memmap = vms->memmap;
>>> @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>>>
>>> aml_append(dsdt, scope);
>>>
>>> + if (pcihp_state->use_acpi_hotplug_bridge) {
>>> + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
>>> +
>>> + aml_append(pci0_scope, aml_pci_edsm());
>>> + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
>>> + memmap[VIRT_ACPI_PCIHP].base);
>>> + build_append_pcihp_resources(pci0_scope,
>>> + memmap[VIRT_ACPI_PCIHP].base,
>>> + memmap[VIRT_ACPI_PCIHP].size);
>>> +
>>> + /* Scan all PCI buses. Generate tables to support hotplug. */
>>> + build_append_pci_bus_devices(pci0_scope, vms->bus);
>>> + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
>>> + build_append_pcihp_slots(pci0_scope, vms->bus);
>>> + }
>>> + build_append_notification_callback(pci0_scope, vms->bus);
>>> + aml_append(dsdt, pci0_scope);
>>> + }
>>> +
>>> /* copy AML table into ACPI tables blob */
>>> g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
>>>
On Fri, 20 Jun 2025 14:38:22 +0200
Igor Mammedov <imammedo@redhat.com> wrote:
> On Fri, 20 Jun 2025 10:35:38 +0100
> Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
>
> > On Mon, 16 Jun 2025 11:46:46 +0200
> > Eric Auger <eric.auger@redhat.com> wrote:
> >
> > > Modify the DSDT ACPI table to enable ACPI PCI hotplug.
> > >
> > > Signed-off-by: Eric Auger <eric.auger@redhat.com>
> > >
> > > ---
> > > v2 -> v3:
> > > - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
> > > - use cihp_state->use_acpi_hotplug_bridge
> >
> > pcihp_state
> >
> > Takes a bit of searching to find the various bits of the
> > same support on x86 but this seems to match up.
> > Exactly when things are built does vary but not I think
> > in a way that matters. e.g. I think on x86 the
> > EDSM stuff is built whether or not we have pcihp enabled
> > whereas here you've made it conditional on using acpi
> > hp. Perhaps a tiny bit more description on that would be
> > useful if you do a v4?
>
> edsm should be built regardless of pcihp
> (well intention was there, whether I messed it up or not I don't know)
>
> idea is that non hotplug ports can have a static acpi-index,
> so it doesn't depend on pcihp.
That makes sense - so here should that edsm feature be enabled whether
or not we have pcihp_state->use_acpi_hotplug_bridge == true
i.e. is it really a separate thing from the rest of this series?
Thanks,
J
>
> >
> > Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
> >
> >
> > > ---
> > > include/hw/acpi/pcihp.h | 2 ++
> > > include/hw/arm/virt.h | 1 +
> > > hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
> > > hw/arm/virt.c | 2 ++
> > > hw/arm/Kconfig | 2 ++
> > > 5 files changed, 29 insertions(+)
> > >
> > > diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
> > > index 5506a58862..9ff548650b 100644
> > > --- a/include/hw/acpi/pcihp.h
> > > +++ b/include/hw/acpi/pcihp.h
> > > @@ -38,6 +38,8 @@
> > > #define ACPI_PCIHP_SEJ_BASE 0x8
> > > #define ACPI_PCIHP_BNMR_BASE 0x10
> > >
> > > +#define ACPI_PCIHP_SIZE 0x0018
> > > +
> > > typedef struct AcpiPciHpPciStatus {
> > > uint32_t up;
> > > uint32_t down;
> > > diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
> > > index 9a1b0f53d2..0ed2e6b732 100644
> > > --- a/include/hw/arm/virt.h
> > > +++ b/include/hw/arm/virt.h
> > > @@ -79,6 +79,7 @@ enum {
> > > VIRT_ACPI_GED,
> > > VIRT_NVDIMM_ACPI,
> > > VIRT_PVTIME,
> > > + VIRT_ACPI_PCIHP,
> > > VIRT_LOWMEMMAP_LAST,
> > > };
> > >
> > > diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
> > > index d7547c8d3b..a2e58288f8 100644
> > > --- a/hw/arm/virt-acpi-build.c
> > > +++ b/hw/arm/virt-acpi-build.c
> > > @@ -34,6 +34,7 @@
> > > #include "hw/core/cpu.h"
> > > #include "hw/acpi/acpi-defs.h"
> > > #include "hw/acpi/acpi.h"
> > > +#include "hw/acpi/pcihp.h"
> > > #include "hw/nvram/fw_cfg_acpi.h"
> > > #include "hw/acpi/bios-linker-loader.h"
> > > #include "hw/acpi/aml-build.h"
> > > @@ -809,6 +810,8 @@ static void
> > > build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
> > > {
> > > VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
> > > + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
> > > + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
> > > Aml *scope, *dsdt;
> > > MachineState *ms = MACHINE(vms);
> > > const MemMapEntry *memmap = vms->memmap;
> > > @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
> > >
> > > aml_append(dsdt, scope);
> > >
> > > + if (pcihp_state->use_acpi_hotplug_bridge) {
> > > + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
> > > +
> > > + aml_append(pci0_scope, aml_pci_edsm());
> > > + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
> > > + memmap[VIRT_ACPI_PCIHP].base);
> > > + build_append_pcihp_resources(pci0_scope,
> > > + memmap[VIRT_ACPI_PCIHP].base,
> > > + memmap[VIRT_ACPI_PCIHP].size);
> > > +
> > > + /* Scan all PCI buses. Generate tables to support hotplug. */
> > > + build_append_pci_bus_devices(pci0_scope, vms->bus);
> > > + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
> > > + build_append_pcihp_slots(pci0_scope, vms->bus);
> > > + }
> > > + build_append_notification_callback(pci0_scope, vms->bus);
> > > + aml_append(dsdt, pci0_scope);
> > > + }
> > > +
> > > /* copy AML table into ACPI tables blob */
> > > g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
> > >
> >
>
>
Hi Igor, Jonathan,
On 6/20/25 6:13 PM, Jonathan Cameron wrote:
> On Fri, 20 Jun 2025 14:38:22 +0200
> Igor Mammedov <imammedo@redhat.com> wrote:
>
>> On Fri, 20 Jun 2025 10:35:38 +0100
>> Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
>>
>>> On Mon, 16 Jun 2025 11:46:46 +0200
>>> Eric Auger <eric.auger@redhat.com> wrote:
>>>
>>>> Modify the DSDT ACPI table to enable ACPI PCI hotplug.
>>>>
>>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>>
>>>> ---
>>>> v2 -> v3:
>>>> - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
>>>> - use cihp_state->use_acpi_hotplug_bridge
>>> pcihp_state
>>>
>>> Takes a bit of searching to find the various bits of the
>>> same support on x86 but this seems to match up.
>>> Exactly when things are built does vary but not I think
>>> in a way that matters. e.g. I think on x86 the
>>> EDSM stuff is built whether or not we have pcihp enabled
>>> whereas here you've made it conditional on using acpi
>>> hp. Perhaps a tiny bit more description on that would be
>>> useful if you do a v4?
>> edsm should be built regardless of pcihp
>> (well intention was there, whether I messed it up or not I don't know)
>>
>> idea is that non hotplug ports can have a static acpi-index,
>> so it doesn't depend on pcihp.
> That makes sense - so here should that edsm feature be enabled whether
> or not we have pcihp_state->use_acpi_hotplug_bridge == true
>
> i.e. is it really a separate thing from the rest of this series?
Further studying this comment,
EDSM is invoked by code generated in aml_pci_static_endpoint_dsm() whcih
itself is invoked by build_append_pci_bus_devices()
So to me it means that if we generate edsm unconditionally we also need
to call the following block unconditionnally
+ aml_append(pci0_scope, build_pci_bridge_edsm());
+ build_append_pci_bus_devices(pci0_scope, vms->bus);
+ if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
+ build_append_pcihp_slots(pci0_scope, vms->bus);
+ }
which seems to be done that way in hw/i386/acpi-build.c/build_dsdt()
Igor, if I recall correctly you said that addition changes related to
"S%.02X" could change the guest ABI. And in that case this wouldn't be
guarded by any new option/compat. So that's annoying.
By the way I tested static acpi-index on ARM with resulting code and it
does not not seem to work - maybe I try with a wrong topology though
(pcie root port + virtio-net acpi-index)-. I have not checked on x86 yet.
So I wonder if it makes sense to do that refinement now. Maybe we can
check try to improve that afterwards?
What do you think?
Eric
>
> Thanks,
>
> J
>>> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
>>>
>>>
>>>> ---
>>>> include/hw/acpi/pcihp.h | 2 ++
>>>> include/hw/arm/virt.h | 1 +
>>>> hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
>>>> hw/arm/virt.c | 2 ++
>>>> hw/arm/Kconfig | 2 ++
>>>> 5 files changed, 29 insertions(+)
>>>>
>>>> diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
>>>> index 5506a58862..9ff548650b 100644
>>>> --- a/include/hw/acpi/pcihp.h
>>>> +++ b/include/hw/acpi/pcihp.h
>>>> @@ -38,6 +38,8 @@
>>>> #define ACPI_PCIHP_SEJ_BASE 0x8
>>>> #define ACPI_PCIHP_BNMR_BASE 0x10
>>>>
>>>> +#define ACPI_PCIHP_SIZE 0x0018
>>>> +
>>>> typedef struct AcpiPciHpPciStatus {
>>>> uint32_t up;
>>>> uint32_t down;
>>>> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
>>>> index 9a1b0f53d2..0ed2e6b732 100644
>>>> --- a/include/hw/arm/virt.h
>>>> +++ b/include/hw/arm/virt.h
>>>> @@ -79,6 +79,7 @@ enum {
>>>> VIRT_ACPI_GED,
>>>> VIRT_NVDIMM_ACPI,
>>>> VIRT_PVTIME,
>>>> + VIRT_ACPI_PCIHP,
>>>> VIRT_LOWMEMMAP_LAST,
>>>> };
>>>>
>>>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
>>>> index d7547c8d3b..a2e58288f8 100644
>>>> --- a/hw/arm/virt-acpi-build.c
>>>> +++ b/hw/arm/virt-acpi-build.c
>>>> @@ -34,6 +34,7 @@
>>>> #include "hw/core/cpu.h"
>>>> #include "hw/acpi/acpi-defs.h"
>>>> #include "hw/acpi/acpi.h"
>>>> +#include "hw/acpi/pcihp.h"
>>>> #include "hw/nvram/fw_cfg_acpi.h"
>>>> #include "hw/acpi/bios-linker-loader.h"
>>>> #include "hw/acpi/aml-build.h"
>>>> @@ -809,6 +810,8 @@ static void
>>>> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>>>> {
>>>> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
>>>> + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
>>>> + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
>>>> Aml *scope, *dsdt;
>>>> MachineState *ms = MACHINE(vms);
>>>> const MemMapEntry *memmap = vms->memmap;
>>>> @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>>>>
>>>> aml_append(dsdt, scope);
>>>>
>>>> + if (pcihp_state->use_acpi_hotplug_bridge) {
>>>> + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
>>>> +
>>>> + aml_append(pci0_scope, aml_pci_edsm());
>>>> + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
>>>> + memmap[VIRT_ACPI_PCIHP].base);
>>>> + build_append_pcihp_resources(pci0_scope,
>>>> + memmap[VIRT_ACPI_PCIHP].base,
>>>> + memmap[VIRT_ACPI_PCIHP].size);
>>>> +
>>>> + /* Scan all PCI buses. Generate tables to support hotplug. */
>>>> + build_append_pci_bus_devices(pci0_scope, vms->bus);
>>>> + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
>>>> + build_append_pcihp_slots(pci0_scope, vms->bus);
>>>> + }
>>>> + build_append_notification_callback(pci0_scope, vms->bus);
>>>> + aml_append(dsdt, pci0_scope);
>>>> + }
>>>> +
>>>> /* copy AML table into ACPI tables blob */
>>>> g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
>>>>
>>>
>>
Hi Igor,
On 6/25/25 5:23 PM, Eric Auger wrote:
> Hi Igor, Jonathan,
>
> On 6/20/25 6:13 PM, Jonathan Cameron wrote:
>> On Fri, 20 Jun 2025 14:38:22 +0200
>> Igor Mammedov <imammedo@redhat.com> wrote:
>>
>>> On Fri, 20 Jun 2025 10:35:38 +0100
>>> Jonathan Cameron <Jonathan.Cameron@huawei.com> wrote:
>>>
>>>> On Mon, 16 Jun 2025 11:46:46 +0200
>>>> Eric Auger <eric.auger@redhat.com> wrote:
>>>>
>>>>> Modify the DSDT ACPI table to enable ACPI PCI hotplug.
>>>>>
>>>>> Signed-off-by: Eric Auger <eric.auger@redhat.com>
>>>>>
>>>>> ---
>>>>> v2 -> v3:
>>>>> - use ACPI_PCIHP_SIZE instead of 0x1000 (Igor)
>>>>> - use cihp_state->use_acpi_hotplug_bridge
>>>> pcihp_state
>>>>
>>>> Takes a bit of searching to find the various bits of the
>>>> same support on x86 but this seems to match up.
>>>> Exactly when things are built does vary but not I think
>>>> in a way that matters. e.g. I think on x86 the
>>>> EDSM stuff is built whether or not we have pcihp enabled
>>>> whereas here you've made it conditional on using acpi
>>>> hp. Perhaps a tiny bit more description on that would be
>>>> useful if you do a v4?
>>> edsm should be built regardless of pcihp
>>> (well intention was there, whether I messed it up or not I don't know)
>>>
>>> idea is that non hotplug ports can have a static acpi-index,
>>> so it doesn't depend on pcihp.
>> That makes sense - so here should that edsm feature be enabled whether
>> or not we have pcihp_state->use_acpi_hotplug_bridge == true
>>
>> i.e. is it really a separate thing from the rest of this series?
>
> Further studying this comment,
>
> EDSM is invoked by code generated in aml_pci_static_endpoint_dsm() whcih
> itself is invoked by build_append_pci_bus_devices()
>
> So to me it means that if we generate edsm unconditionally we also need
> to call the following block unconditionnally
>
> + aml_append(pci0_scope, build_pci_bridge_edsm());
> + build_append_pci_bus_devices(pci0_scope, vms->bus);
> + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
> + build_append_pcihp_slots(pci0_scope, vms->bus);
> + }
>
> which seems to be done that way in hw/i386/acpi-build.c/build_dsdt()
>
> Igor, if I recall correctly you said that addition changes related to
> "S%.02X" could change the guest ABI. And in that case this wouldn't be
> guarded by any new option/compat. So that's annoying.
>
> By the way I tested static acpi-index on ARM with resulting code and it
> does not not seem to work - maybe I try with a wrong topology though
> (pcie root port + virtio-net acpi-index)-. I have not checked on x86 yet.
I tested on x86 and if you turn off acpi pci hotplug by setting
-global ICH9-LPC.acpi-pci-hotplug-with-bridge-support=off
and you statically instantiate a virtio-net-pci device on a pcie root
port with ,acpi-index=3, acpi-index does not work either.
guest exposes enp5s0.
if you remove the global prop setting (acpi pcihp enabled by default),
guest exposes eno3.
so static acpi-index also seems to be dependent on acpi-pcihp on x86.
So I intend to leave the code as is with edsm added within the
acpi_pcihp conditional block. It is also simpler in terms of ref blob
and most importantly with regards to compat handling.
Thanks
Eric
>
> So I wonder if it makes sense to do that refinement now. Maybe we can
> check try to improve that afterwards?
>
> What do you think?
>
> Eric
>
>
>
>>
>> Thanks,
>>
>> J
>>>> Reviewed-by: Jonathan Cameron <jonathan.cameron@huawei.com>
>>>>
>>>>
>>>>> ---
>>>>> include/hw/acpi/pcihp.h | 2 ++
>>>>> include/hw/arm/virt.h | 1 +
>>>>> hw/arm/virt-acpi-build.c | 22 ++++++++++++++++++++++
>>>>> hw/arm/virt.c | 2 ++
>>>>> hw/arm/Kconfig | 2 ++
>>>>> 5 files changed, 29 insertions(+)
>>>>>
>>>>> diff --git a/include/hw/acpi/pcihp.h b/include/hw/acpi/pcihp.h
>>>>> index 5506a58862..9ff548650b 100644
>>>>> --- a/include/hw/acpi/pcihp.h
>>>>> +++ b/include/hw/acpi/pcihp.h
>>>>> @@ -38,6 +38,8 @@
>>>>> #define ACPI_PCIHP_SEJ_BASE 0x8
>>>>> #define ACPI_PCIHP_BNMR_BASE 0x10
>>>>>
>>>>> +#define ACPI_PCIHP_SIZE 0x0018
>>>>> +
>>>>> typedef struct AcpiPciHpPciStatus {
>>>>> uint32_t up;
>>>>> uint32_t down;
>>>>> diff --git a/include/hw/arm/virt.h b/include/hw/arm/virt.h
>>>>> index 9a1b0f53d2..0ed2e6b732 100644
>>>>> --- a/include/hw/arm/virt.h
>>>>> +++ b/include/hw/arm/virt.h
>>>>> @@ -79,6 +79,7 @@ enum {
>>>>> VIRT_ACPI_GED,
>>>>> VIRT_NVDIMM_ACPI,
>>>>> VIRT_PVTIME,
>>>>> + VIRT_ACPI_PCIHP,
>>>>> VIRT_LOWMEMMAP_LAST,
>>>>> };
>>>>>
>>>>> diff --git a/hw/arm/virt-acpi-build.c b/hw/arm/virt-acpi-build.c
>>>>> index d7547c8d3b..a2e58288f8 100644
>>>>> --- a/hw/arm/virt-acpi-build.c
>>>>> +++ b/hw/arm/virt-acpi-build.c
>>>>> @@ -34,6 +34,7 @@
>>>>> #include "hw/core/cpu.h"
>>>>> #include "hw/acpi/acpi-defs.h"
>>>>> #include "hw/acpi/acpi.h"
>>>>> +#include "hw/acpi/pcihp.h"
>>>>> #include "hw/nvram/fw_cfg_acpi.h"
>>>>> #include "hw/acpi/bios-linker-loader.h"
>>>>> #include "hw/acpi/aml-build.h"
>>>>> @@ -809,6 +810,8 @@ static void
>>>>> build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>>>>> {
>>>>> VirtMachineClass *vmc = VIRT_MACHINE_GET_CLASS(vms);
>>>>> + AcpiGedState *acpi_ged_state = ACPI_GED(vms->acpi_dev);
>>>>> + AcpiPciHpState *pcihp_state = &acpi_ged_state->pcihp_state;
>>>>> Aml *scope, *dsdt;
>>>>> MachineState *ms = MACHINE(vms);
>>>>> const MemMapEntry *memmap = vms->memmap;
>>>>> @@ -868,6 +871,25 @@ build_dsdt(GArray *table_data, BIOSLinker *linker, VirtMachineState *vms)
>>>>>
>>>>> aml_append(dsdt, scope);
>>>>>
>>>>> + if (pcihp_state->use_acpi_hotplug_bridge) {
>>>>> + Aml *pci0_scope = aml_scope("\\_SB.PCI0");
>>>>> +
>>>>> + aml_append(pci0_scope, aml_pci_edsm());
>>>>> + build_acpi_pci_hotplug(dsdt, AML_SYSTEM_MEMORY,
>>>>> + memmap[VIRT_ACPI_PCIHP].base);
>>>>> + build_append_pcihp_resources(pci0_scope,
>>>>> + memmap[VIRT_ACPI_PCIHP].base,
>>>>> + memmap[VIRT_ACPI_PCIHP].size);
>>>>> +
>>>>> + /* Scan all PCI buses. Generate tables to support hotplug. */
>>>>> + build_append_pci_bus_devices(pci0_scope, vms->bus);
>>>>> + if (object_property_find(OBJECT(vms->bus), ACPI_PCIHP_PROP_BSEL)) {
>>>>> + build_append_pcihp_slots(pci0_scope, vms->bus);
>>>>> + }
>>>>> + build_append_notification_callback(pci0_scope, vms->bus);
>>>>> + aml_append(dsdt, pci0_scope);
>>>>> + }
>>>>> +
>>>>> /* copy AML table into ACPI tables blob */
>>>>> g_array_append_vals(table_data, dsdt->buf->data, dsdt->buf->len);
>>>>>
>>>>
>>>
>
© 2016 - 2025 Red Hat, Inc.