[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