summaryrefslogtreecommitdiff
path: root/arch/x86/cpu/qemu/acpi/cpu-hotplug.asl
diff options
context:
space:
mode:
Diffstat (limited to 'arch/x86/cpu/qemu/acpi/cpu-hotplug.asl')
-rw-r--r--arch/x86/cpu/qemu/acpi/cpu-hotplug.asl80
1 files changed, 80 insertions, 0 deletions
diff --git a/arch/x86/cpu/qemu/acpi/cpu-hotplug.asl b/arch/x86/cpu/qemu/acpi/cpu-hotplug.asl
new file mode 100644
index 0000000..a290a4c
--- /dev/null
+++ b/arch/x86/cpu/qemu/acpi/cpu-hotplug.asl
@@ -0,0 +1,80 @@
+/* CPU hotplug */
+
+Scope(\_SB) {
+ /* Objects filled in by run-time generated SSDT */
+ External(NTFY, MethodObj)
+ External(CPON, PkgObj)
+
+ /* Methods called by run-time generated SSDT Processor objects */
+ Method(CPMA, 1, NotSerialized) {
+ /*
+ * _MAT method - create an madt apic buffer
+ * Arg0 = Processor ID = Local APIC ID
+ * Local0 = CPON flag for this cpu
+ */
+ Store(DerefOf(Index(CPON, Arg0)), Local0)
+ /* Local1 = Buffer (in madt apic form) to return */
+ Store(Buffer(8) {0x00, 0x08, 0x00, 0x00, 0x00, 0, 0, 0}, Local1)
+ /* Update the processor id, lapic id, and enable/disable status */
+ Store(Arg0, Index(Local1, 2))
+ Store(Arg0, Index(Local1, 3))
+ Store(Local0, Index(Local1, 4))
+ Return (Local1)
+ }
+ Method(CPST, 1, NotSerialized) {
+ /*
+ * _STA method - return ON status of cpu
+ * Arg0 = Processor ID = Local APIC ID
+ * Local0 = CPON flag for this cpu
+ */
+ Store(DerefOf(Index(CPON, Arg0)), Local0)
+ If (Local0) {
+ Return (0xf)
+ } Else {
+ Return (0x0)
+ }
+ }
+ Method(CPEJ, 2, NotSerialized) {
+ /* _EJ0 method - eject callback */
+ Sleep(200)
+ }
+
+ /* CPU hotplug notify method */
+ OperationRegion(PRST, SystemIO, 0xaf00, 32)
+ Field(PRST, ByteAcc, NoLock, Preserve) {
+ PRS, 256
+ }
+ Method(PRSC, 0) {
+ /* Local5 = active cpu bitmap */
+ Store(PRS, Local5)
+ /* Local2 = last read byte from bitmap */
+ Store(Zero, Local2)
+ /* Local0 = Processor ID / APIC ID iterator */
+ Store(Zero, Local0)
+ While (LLess(Local0, SizeOf(CPON))) {
+ /* Local1 = CPON flag for this cpu */
+ Store(DerefOf(Index(CPON, Local0)), Local1)
+ If (And(Local0, 0x07)) {
+ /* Shift down previously read bitmap byte */
+ ShiftRight(Local2, 1, Local2)
+ } Else {
+ /* Read next byte from cpu bitmap */
+ Store(DerefOf(Index(Local5, ShiftRight(Local0, 3))), Local2)
+ }
+ /* Local3 = active state for this cpu */
+ Store(And(Local2, 1), Local3)
+
+ If (LNotEqual(Local1, Local3)) {
+ /* State change - update CPON with new state */
+ Store(Local3, Index(CPON, Local0))
+ /* Do CPU notify */
+ If (LEqual(Local3, 1)) {
+ NTFY(Local0, 1)
+ } Else {
+ NTFY(Local0, 3)
+ }
+ }
+ Increment(Local0)
+ }
+ }
+}