kvm.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: "Michael S. Tsirkin" <mst@redhat.com>
To: seabios@seabios.org
Cc: "Kevin O'Connor" <kevin@koconnor.net>,
	Gleb Natapov <gleb@redhat.com>,
	kvm@vger.kernel.org, Marcelo Tosatti <mtosatti@redhat.com>
Subject: [PATCH RFC] acpi: add ssdt for cpi hotplug
Date: Tue, 1 Nov 2011 21:11:40 +0200	[thread overview]
Message-ID: <20111101191139.GA18317@redhat.com> (raw)

So here's the plan: move all hotplug handling out
to ssdt, this way it'll keep working even with a
user-supplied dsdt. Next step we can patch
this ssdt at runtime.

There's little point in this change alone, so posting as RFC,
will repost with the patching part when it's ready,
posting now to present opportunity for early feedback.

Compiled only.

Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
---
 Makefile           |    2 +-
 src/acpi-dsdt.dsl  |  179 -------------------------------------------------
 src/acpi.c         |    4 +
 src/ssdt-pcihp.dsl |  188 ++++++++++++++++++++++++++++++++++++++++++++++++++++
 4 files changed, 193 insertions(+), 180 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..32eaeee 100644
--- a/src/acpi-dsdt.dsl
+++ b/src/acpi-dsdt.dsl
@@ -119,25 +119,6 @@ DefinitionBlock (
                prt_slot3(0x001f),
             })
 
-            OperationRegion(PCST, SystemIO, 0xae00, 0x08)
-            Field (PCST, DWordAcc, NoLock, WriteAsZeros)
-            {
-                PCIU, 32,
-                PCID, 32,
-            }
-
-            OperationRegion(SEJ, SystemIO, 0xae08, 0x04)
-            Field (SEJ, DWordAcc, NoLock, WriteAsZeros)
-            {
-                B0EJ, 32,
-            }
-
-            OperationRegion(RMVC, SystemIO, 0xae0c, 0x04)
-            Field(RMVC, DWordAcc, NoLock, WriteAsZeros)
-            {
-                PCRM, 32,
-            }
-
             Name (_CRS, ResourceTemplate ()
             {
                 WordBusNumber (ResourceProducer, MinFixed, MaxFixed, PosDecode,
@@ -458,162 +439,6 @@ DefinitionBlock (
 	    }
 	}
     }
-
-
-/****************************************************************
- * PCI hotplug
- ****************************************************************/
-
-    Scope(\_SB.PCI0) {
-        /* Methods called by bulk generated PCI devices below */
-        Method (PRMV, 1, NotSerialized) {
-            // _RMV method - check if device can be removed
-            If (And(\_SB.PCI0.PCRM, ShiftLeft(1, Arg0))) {
-                Return (0x1)
-            }
-            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 */
-        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)
-
-        /* PCI hotplug notify method */
-        Method(PCNF, 0) {
-            // Local0 = iterator
-            Store (Zero, Local0)
-            While (LLess(Local0, 31)) {
-                Increment(Local0)
-                If (And(PCIU, ShiftLeft(1, Local0))) {
-                    PCNT(Local0, 1)
-                }
-                If (And(PCID, ShiftLeft(1, Local0))) {
-                    PCNT(Local0, 3)
-                }
-            }
-            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)
-        }
-    }
-
-
 /****************************************************************
  * PCI IRQs
  ****************************************************************/
@@ -837,10 +662,6 @@ DefinitionBlock (
         Method(_L00) {
             Return(0x01)
         }
-        Method(_L01) {
-            // PCI hotplug event
-            Return(\_SB.PCI0.PCNF())
-        }
         Method(_L02) {
             // CPU hotplug event
             Return(\_SB.PRSC())
diff --git a/src/acpi.c b/src/acpi.c
index a3770ae..97cc6dd 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)
 {
@@ -633,6 +634,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 +667,7 @@ acpi_bios_init(void)
     ACPI_INIT_TABLE(build_madt());
     ACPI_INIT_TABLE(build_hpet());
     ACPI_INIT_TABLE(build_srat());
+    ACPI_INIT_TABLE(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..7ed7eef
--- /dev/null
+++ b/src/ssdt-pcihp.dsl
@@ -0,0 +1,188 @@
+ACPI_EXTRACT_ALL_CODE ssdp_pcihp_aml
+
+DefinitionBlock ("ssdt-pcihp.aml", "SSDT", 0x01, "BXPC", "BXSSDTPCIHP", 0x1)
+{
+
+/****************************************************************
+ * PCI hotplug
+ ****************************************************************/
+
+    External (\_SB.PCI0, DeviceObj)
+
+    Scope(\_SB.PCI0) {
+            OperationRegion(PCST, SystemIO, 0xae00, 0x08)
+            Field (PCST, DWordAcc, NoLock, WriteAsZeros)
+            {
+                PCIU, 32,
+                PCID, 32,
+            }
+
+            OperationRegion(SEJ, SystemIO, 0xae08, 0x04)
+            Field (SEJ, DWordAcc, NoLock, WriteAsZeros)
+            {
+                B0EJ, 32,
+            }
+
+            OperationRegion(RMVC, SystemIO, 0xae0c, 0x04)
+            Field(RMVC, DWordAcc, NoLock, WriteAsZeros)
+            {
+                PCRM, 32,
+            }
+
+        /* Methods called by bulk generated PCI devices below */
+        Method (PRMV, 1, NotSerialized) {
+            // _RMV method - check if device can be removed
+            If (And(\_SB.PCI0.PCRM, ShiftLeft(1, Arg0))) {
+                Return (0x1)
+            }
+            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 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)
+
+        /* Methods called by bulk generated hotplug devices below */
+        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)
+
+        /* PCI hotplug notify method */
+        Method(PCNF, 0) {
+            // Local0 = iterator
+            Store (Zero, Local0)
+            While (LLess(Local0, 31)) {
+                Increment(Local0)
+                If (And(PCIU, ShiftLeft(1, Local0))) {
+                    PCNT(Local0, 1)
+                }
+                If (And(PCID, ShiftLeft(1, Local0))) {
+                    PCNT(Local0, 3)
+                }
+            }
+            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)
+        }
+    }
+
+    Scope (\_GPE)
+    {
+        Method(_L01) {
+            // PCI hotplug event
+            Return(\_SB.PCI0.PCNF())
+        }
+    }
+
+}
-- 
1.7.5.53.gc233e

             reply	other threads:[~2011-11-01 19:10 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2011-11-01 19:11 Michael S. Tsirkin [this message]
2011-11-01 22:59 ` [PATCH RFC] acpi: add ssdt for cpi hotplug Kevin O'Connor
2011-11-02  8:54   ` Michael S. Tsirkin
2011-11-03  0:30     ` Kevin O'Connor
2011-11-03  1:04       ` [SeaBIOS] " Wen Congyang
2011-11-03  1:36         ` Kevin O'Connor
2011-11-03  2:14           ` [SeaBIOS] " Wen Congyang
2011-11-03 12:33           ` Michael S. Tsirkin
2011-11-03 12:31       ` Michael S. Tsirkin
2011-11-04  6:00         ` [SeaBIOS] " Isaku Yamahata
2011-11-02  6:08 ` Wen Congyang
2011-11-02  7:20   ` Wen Congyang

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20111101191139.GA18317@redhat.com \
    --to=mst@redhat.com \
    --cc=gleb@redhat.com \
    --cc=kevin@koconnor.net \
    --cc=kvm@vger.kernel.org \
    --cc=mtosatti@redhat.com \
    --cc=seabios@seabios.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).