diff options
Diffstat (limited to 'arch/x86/cpu/qemu/acpi/cpu-hotplug.asl')
-rw-r--r-- | arch/x86/cpu/qemu/acpi/cpu-hotplug.asl | 80 |
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) + } + } +} |