[PATCHv4 1/3] acpi: add ssdt for pci hotplug

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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@xxxxxxxxxx>
---
 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

--
To unsubscribe from this list: send the line "unsubscribe kvm" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [KVM ARM]     [KVM ia64]     [KVM ppc]     [Virtualization Tools]     [Spice Development]     [Libvirt]     [Libvirt Users]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite Questions]     [Linux Kernel]     [Linux SCSI]     [XFree86]
  Powered by Linux