[SeaBIOS] [PATCHv4 1/3] acpi: add ssdt for pci hotplug
Michael S. Tsirkin
mst at redhat.com
Sun Nov 20 18:56:59 CET 2011
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 at 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)
+ }
+ }
+}
--
1.7.5.53.gc233e
More information about the SeaBIOS
mailing list