The point of this split is to make runtime patching easier.
DSDT is required to supply: PCI0 - PCI root device object; PCEJ - Method object to eject a PCI slot. Additionally, SSDT is required to supply PCNT - Method object to notify OSPM of a PCI slot event.
Signed-off-by: Michael S. Tsirkin mst@redhat.com --- Makefile | 2 +- src/acpi-dsdt.dsl | 117 +-------------------------------------------- src/acpi.c | 12 +++++ src/ssdt-pcihp.dsl | 132 ++++++++++++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 148 insertions(+), 115 deletions(-) create mode 100644 src/ssdt-pcihp.dsl
diff --git a/Makefile b/Makefile index 540f1ea..ef8e15d 100644 --- a/Makefile +++ b/Makefile @@ -200,7 +200,7 @@ src/%.hex: src/%.dsl ./tools/acpi_extract_preprocess.py ./tools/acpi_extract.py $(Q)./tools/acpi_extract.py $(OUT)$*.lst > $(OUT)$*.off $(Q)cat $(OUT)$*.off > $@
-$(OUT)ccode32flat.o: src/acpi-dsdt.hex src/ssdt-proc.hex +$(OUT)ccode32flat.o: src/acpi-dsdt.hex src/ssdt-proc.hex src/ssdt-pcihp.hex
####### Kconfig rules export HOSTCC := $(CC) diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl index b9b06f2..f97d463 100644 --- a/src/acpi-dsdt.dsl +++ b/src/acpi-dsdt.dsl @@ -474,90 +474,15 @@ DefinitionBlock ( Return (0x0) }
-#define gen_pci_device(slot) \ - Device(SL##slot) { \ - Name (_ADR, 0x##slot##0000) \ - Method (_RMV) { Return (PRMV(0x##slot)) } \ - Name (_SUN, 0x##slot) \ - } - - /* VGA (slot 1) and ISA bus (slot 2) defined above */ - gen_pci_device(03) - gen_pci_device(04) - gen_pci_device(05) - gen_pci_device(06) - gen_pci_device(07) - gen_pci_device(08) - gen_pci_device(09) - gen_pci_device(0a) - gen_pci_device(0b) - gen_pci_device(0c) - gen_pci_device(0d) - gen_pci_device(0e) - gen_pci_device(0f) - gen_pci_device(10) - gen_pci_device(11) - gen_pci_device(12) - gen_pci_device(13) - gen_pci_device(14) - gen_pci_device(15) - gen_pci_device(16) - gen_pci_device(17) - gen_pci_device(18) - gen_pci_device(19) - gen_pci_device(1a) - gen_pci_device(1b) - gen_pci_device(1c) - gen_pci_device(1d) - gen_pci_device(1e) - gen_pci_device(1f) - - /* Methods called by bulk generated hotplug devices below */ + /* Methods called by hotplug devices */ Method (PCEJ, 1, NotSerialized) { // _EJ0 method - eject callback Store(ShiftLeft(1, Arg0), B0EJ) Return (0x0) }
- /* Bulk generated PCI hotplug devices */ -#define hotplug_slot(slot) \ - Device (S##slot) { \ - Name (_ADR, 0x##slot##0000) \ - Method (_EJ0, 1) { Return(PCEJ(0x##slot)) } \ - Name (_SUN, 0x##slot) \ - } - - hotplug_slot(01) - hotplug_slot(02) - hotplug_slot(03) - hotplug_slot(04) - hotplug_slot(05) - hotplug_slot(06) - hotplug_slot(07) - hotplug_slot(08) - hotplug_slot(09) - hotplug_slot(0a) - hotplug_slot(0b) - hotplug_slot(0c) - hotplug_slot(0d) - hotplug_slot(0e) - hotplug_slot(0f) - hotplug_slot(10) - hotplug_slot(11) - hotplug_slot(12) - hotplug_slot(13) - hotplug_slot(14) - hotplug_slot(15) - hotplug_slot(16) - hotplug_slot(17) - hotplug_slot(18) - hotplug_slot(19) - hotplug_slot(1a) - hotplug_slot(1b) - hotplug_slot(1c) - hotplug_slot(1d) - hotplug_slot(1e) - hotplug_slot(1f) + /* Hotplug notification method supplied by SSDT */ + External (_SB.PCI0.PCNT, MethodObj)
/* PCI hotplug notify method */ Method(PCNF, 0) { @@ -575,42 +500,6 @@ DefinitionBlock ( Return(One) }
-#define gen_pci_hotplug(slot) \ - If (LEqual(Arg0, 0x##slot)) { Notify(S##slot, Arg1) } - - Method(PCNT, 2) { - gen_pci_hotplug(01) - gen_pci_hotplug(02) - gen_pci_hotplug(03) - gen_pci_hotplug(04) - gen_pci_hotplug(05) - gen_pci_hotplug(06) - gen_pci_hotplug(07) - gen_pci_hotplug(08) - gen_pci_hotplug(09) - gen_pci_hotplug(0a) - gen_pci_hotplug(0b) - gen_pci_hotplug(0c) - gen_pci_hotplug(0d) - gen_pci_hotplug(0e) - gen_pci_hotplug(0f) - gen_pci_hotplug(10) - gen_pci_hotplug(11) - gen_pci_hotplug(12) - gen_pci_hotplug(13) - gen_pci_hotplug(14) - gen_pci_hotplug(15) - gen_pci_hotplug(16) - gen_pci_hotplug(17) - gen_pci_hotplug(18) - gen_pci_hotplug(19) - gen_pci_hotplug(1a) - gen_pci_hotplug(1b) - gen_pci_hotplug(1c) - gen_pci_hotplug(1d) - gen_pci_hotplug(1e) - gen_pci_hotplug(1f) - } }
diff --git a/src/acpi.c b/src/acpi.c index a3770ae..c5147d9 100644 --- a/src/acpi.c +++ b/src/acpi.c @@ -406,6 +406,7 @@ encodeLen(u8 *ssdt_ptr, int length, int bytes) #define SD_PROC (ssdp_proc_aml + *ssdt_proc_start)
#define SSDT_SIGNATURE 0x54445353 // SSDT + static void* build_ssdt(void) { @@ -483,6 +484,14 @@ build_ssdt(void) return ssdt; }
+static void* +copy_table(void *table, int size) +{ + u8 *copy = malloc_high(size); + memcpy(copy, table, size); + return copy; +} + #define HPET_SIGNATURE 0x54455048 // HPET static void* build_hpet(void) @@ -633,6 +642,8 @@ static const struct pci_device_id acpi_find_tbl[] = {
struct rsdp_descriptor *RsdpAddr;
+#include "ssdt-pcihp.hex" + #define MAX_ACPI_TABLES 20 void acpi_bios_init(void) @@ -664,6 +675,7 @@ acpi_bios_init(void) ACPI_INIT_TABLE(build_madt()); ACPI_INIT_TABLE(build_hpet()); ACPI_INIT_TABLE(build_srat()); + ACPI_INIT_TABLE(copy_table(ssdp_pcihp_aml, sizeof ssdp_pcihp_aml));
u16 i, external_tables = qemu_cfg_acpi_additional_tables();
diff --git a/src/ssdt-pcihp.dsl b/src/ssdt-pcihp.dsl new file mode 100644 index 0000000..72d1bb7 --- /dev/null +++ b/src/ssdt-pcihp.dsl @@ -0,0 +1,132 @@ +ACPI_EXTRACT_ALL_CODE ssdp_pcihp_aml + +DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1) +{ + +/**************************************************************** + * PCI hotplug + ****************************************************************/ + + /* Objects supplied by DSDT */ + External (_SB.PCI0, DeviceObj) + External (_SB.PCI0.PRMV, MethodObj) + External (_SB.PCI0.PCEJ, MethodObj) + + Scope(_SB.PCI0) { + +#define gen_pci_device(slot) \ + Device(SL##slot) { \ + Name (_ADR, 0x##slot##0000) \ + Method (_RMV) { Return (PRMV(0x##slot)) } \ + Name (_SUN, 0x##slot) \ + } + + /* VGA (slot 1) and ISA bus (slot 2) defined in DSDT */ + gen_pci_device(03) + gen_pci_device(04) + gen_pci_device(05) + gen_pci_device(06) + gen_pci_device(07) + gen_pci_device(08) + gen_pci_device(09) + gen_pci_device(0a) + gen_pci_device(0b) + gen_pci_device(0c) + gen_pci_device(0d) + gen_pci_device(0e) + gen_pci_device(0f) + gen_pci_device(10) + gen_pci_device(11) + gen_pci_device(12) + gen_pci_device(13) + gen_pci_device(14) + gen_pci_device(15) + gen_pci_device(16) + gen_pci_device(17) + gen_pci_device(18) + gen_pci_device(19) + gen_pci_device(1a) + gen_pci_device(1b) + gen_pci_device(1c) + gen_pci_device(1d) + gen_pci_device(1e) + gen_pci_device(1f) + + /* Bulk generated PCI hotplug devices */ +#define hotplug_slot(slot) \ + Device (S##slot) { \ + Name (_ADR, 0x##slot##0000) \ + Method (_EJ0, 1) { Return(PCEJ(0x##slot)) } \ + Name (_SUN, 0x##slot) \ + } + + hotplug_slot(01) + hotplug_slot(02) + hotplug_slot(03) + hotplug_slot(04) + hotplug_slot(05) + hotplug_slot(06) + hotplug_slot(07) + hotplug_slot(08) + hotplug_slot(09) + hotplug_slot(0a) + hotplug_slot(0b) + hotplug_slot(0c) + hotplug_slot(0d) + hotplug_slot(0e) + hotplug_slot(0f) + hotplug_slot(10) + hotplug_slot(11) + hotplug_slot(12) + hotplug_slot(13) + hotplug_slot(14) + hotplug_slot(15) + hotplug_slot(16) + hotplug_slot(17) + hotplug_slot(18) + hotplug_slot(19) + hotplug_slot(1a) + hotplug_slot(1b) + hotplug_slot(1c) + hotplug_slot(1d) + hotplug_slot(1e) + hotplug_slot(1f) + +#define gen_pci_hotplug(slot) \ + If (LEqual(Arg0, 0x##slot)) { Notify(S##slot, Arg1) } + + Method(PCNT, 2) { + gen_pci_hotplug(01) + gen_pci_hotplug(02) + gen_pci_hotplug(03) + gen_pci_hotplug(04) + gen_pci_hotplug(05) + gen_pci_hotplug(06) + gen_pci_hotplug(07) + gen_pci_hotplug(08) + gen_pci_hotplug(09) + gen_pci_hotplug(0a) + gen_pci_hotplug(0b) + gen_pci_hotplug(0c) + gen_pci_hotplug(0d) + gen_pci_hotplug(0e) + gen_pci_hotplug(0f) + gen_pci_hotplug(10) + gen_pci_hotplug(11) + gen_pci_hotplug(12) + gen_pci_hotplug(13) + gen_pci_hotplug(14) + gen_pci_hotplug(15) + gen_pci_hotplug(16) + gen_pci_hotplug(17) + gen_pci_hotplug(18) + gen_pci_hotplug(19) + gen_pci_hotplug(1a) + gen_pci_hotplug(1b) + gen_pci_hotplug(1c) + gen_pci_hotplug(1d) + gen_pci_hotplug(1e) + gen_pci_hotplug(1f) + } + } +}