[SeaBIOS] [SeaBIOS PATCH v2] hotplug: Add device per func in ACPI DSDT tables
Amos Kong
akong at redhat.com
Tue Sep 20 12:45:57 CEST 2011
>From 48ea1c9188334b89a60b4f9e853e86fc04fda4a5 Mon Sep 17 00:00:00 2001
From: Amos Kong <akong at redhat.com>
Date: Tue, 20 Sep 2011 15:38:43 +0800
Subject: [SeaBIOS PATCH v2] hotplug: Add device per func in ACPI DSDT tables
Only func 0 is registered to guest driver (we can
only found func 0 in slot->funcs list of driver),
the other functions could not be cleaned when
hot-removing the whole slot. This patch adds
device per function in ACPI DSDT tables.
Have tested with linux/winxp/win7, hot-adding/hot-remving,
single/multiple function device, they are all fine.
---
Changes from v1:
- cleanup the macros, bios.bin gets back to 128K
- notify only when func0 is added and removed
Signed-off-by: Amos Kong <akong at redhat.com>
Signed-off-by: Michael S. Tsirkin <mst at redhat.com>
---
src/acpi-dsdt.dsl | 106 ++++++++++++++++++++++++++++++----------------------
1 files changed, 61 insertions(+), 45 deletions(-)
diff --git a/src/acpi-dsdt.dsl b/src/acpi-dsdt.dsl
index 08412e2..707c3d6 100644
--- a/src/acpi-dsdt.dsl
+++ b/src/acpi-dsdt.dsl
@@ -128,9 +128,9 @@ DefinitionBlock (
PCRM, 32,
}
-#define hotplug_slot(name, nr) \
- Device (S##name) { \
- Name (_ADR, nr##0000) \
+#define hotplug_func(name, nr, adr, fn) \
+ Device (S##name##fn) { \
+ Name (_ADR, adr) \
Method (_EJ0,1) { \
Store(ShiftLeft(1, nr), B0EJ) \
Return (0x0) \
@@ -138,6 +138,16 @@ DefinitionBlock (
Name (_SUN, name) \
}
+#define hotplug_slot(name, nr) \
+ hotplug_func(name, nr, nr##0000, 0) \
+ hotplug_func(name, nr, nr##0001, 1) \
+ hotplug_func(name, nr, nr##0002, 2) \
+ hotplug_func(name, nr, nr##0003, 3) \
+ hotplug_func(name, nr, nr##0004, 4) \
+ hotplug_func(name, nr, nr##0005, 5) \
+ hotplug_func(name, nr, nr##0006, 6) \
+ hotplug_func(name, nr, nr##0007, 7)
+
hotplug_slot(1, 0x0001)
hotplug_slot(2, 0x0002)
hotplug_slot(3, 0x0003)
@@ -460,7 +470,7 @@ DefinitionBlock (
}
}
-#define gen_pci_device(name, nr) \
+#define gen_pci_device(name, nr) \
Device(SL##name) { \
Name (_ADR, nr##0000) \
Method (_RMV) { \
@@ -502,6 +512,52 @@ DefinitionBlock (
gen_pci_device(29, 0x001d)
gen_pci_device(30, 0x001e)
gen_pci_device(31, 0x001f)
+
+#define gen_pci_hotplug(nr) \
+ If (And(PCIU, ShiftLeft(1, nr))) { \
+ Notify(S##nr##0, 1) \
+ } \
+ If (And(PCID, ShiftLeft(1, nr))) { \
+ Notify(S##nr##0, 3) \
+ }
+
+ Method(HPLG) {
+ gen_pci_hotplug(1)
+ gen_pci_hotplug(2)
+ gen_pci_hotplug(3)
+ gen_pci_hotplug(4)
+ gen_pci_hotplug(5)
+ gen_pci_hotplug(6)
+ gen_pci_hotplug(7)
+ gen_pci_hotplug(8)
+ gen_pci_hotplug(9)
+ 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(20)
+ gen_pci_hotplug(21)
+ gen_pci_hotplug(22)
+ gen_pci_hotplug(23)
+ gen_pci_hotplug(24)
+ gen_pci_hotplug(25)
+ gen_pci_hotplug(26)
+ gen_pci_hotplug(27)
+ gen_pci_hotplug(28)
+ gen_pci_hotplug(29)
+ gen_pci_hotplug(30)
+ gen_pci_hotplug(31)
+
+ Return (0x01)
+ }
+
+
}
/* PCI IRQs */
@@ -842,49 +898,9 @@ DefinitionBlock (
Return(0x01)
}
-#define gen_pci_hotplug(nr) \
- If (And(\_SB.PCI0.PCIU, ShiftLeft(1, nr))) { \
- Notify(\_SB.PCI0.S##nr, 1) \
- } \
- If (And(\_SB.PCI0.PCID, ShiftLeft(1, nr))) { \
- Notify(\_SB.PCI0.S##nr, 3) \
- }
-
Method(_L01) {
- gen_pci_hotplug(1)
- gen_pci_hotplug(2)
- gen_pci_hotplug(3)
- gen_pci_hotplug(4)
- gen_pci_hotplug(5)
- gen_pci_hotplug(6)
- gen_pci_hotplug(7)
- gen_pci_hotplug(8)
- gen_pci_hotplug(9)
- 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(20)
- gen_pci_hotplug(21)
- gen_pci_hotplug(22)
- gen_pci_hotplug(23)
- gen_pci_hotplug(24)
- gen_pci_hotplug(25)
- gen_pci_hotplug(26)
- gen_pci_hotplug(27)
- gen_pci_hotplug(28)
- gen_pci_hotplug(29)
- gen_pci_hotplug(30)
- gen_pci_hotplug(31)
-
+ \_SB.PCI0.HPLG()
Return (0x01)
-
}
Method(_L02) {
// CPU hotplug event
--
1.7.6.1
More information about the SeaBIOS
mailing list