From 0a4e0fd913006de8f5d0a4ea24e013f30243cf5c Mon Sep 17 00:00:00 2001 From: Arthur Heymans Date: Sat, 6 Jan 2018 18:40:23 +0100 Subject: cpu/intel/speedstep: Fix the PNOT ACPI method The PNOT method never notifies the CPU to update it's _CST methods due to reliance on inexisting variable (PDCx). Add a method in the speedstep ssdt generator to notify all available CPU nodes and hook this up in this file. The cpu.asl file is moved to cpu/intel/speedstep/acpi since it now relies on code generated in the speedstep ssdt generator. CPUs not using the speedstep code never included this PNOT method so this is a logical place for this code to be. Change-Id: Ie2ba5e07b401d6f7c80c31f2bfcd9ef3ac0c1ad1 Signed-off-by: Arthur Heymans Reviewed-on: https://review.coreboot.org/23144 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer --- src/arch/x86/include/arch/acpigen.h | 1 + src/cpu/intel/common/acpi/cpu.asl | 50 --------------------------- src/cpu/intel/speedstep/acpi.c | 13 +++++++ src/cpu/intel/speedstep/acpi/cpu.asl | 31 +++++++++++++++++ src/mainboard/apple/macbook21/dsdt.asl | 2 +- src/mainboard/asus/p5gc-mx/dsdt.asl | 2 +- src/mainboard/getac/p470/dsdt.asl | 2 +- src/mainboard/gigabyte/ga-945gcm-s2l/dsdt.asl | 2 +- src/mainboard/ibase/mb899/dsdt.asl | 2 +- src/mainboard/intel/d510mo/dsdt.asl | 2 +- src/mainboard/intel/d945gclf/dsdt.asl | 2 +- src/mainboard/kontron/986lcd-m/dsdt.asl | 2 +- src/mainboard/lenovo/t400/dsdt.asl | 2 +- src/mainboard/lenovo/t60/dsdt.asl | 2 +- src/mainboard/lenovo/x200/dsdt.asl | 2 +- src/mainboard/lenovo/x60/dsdt.asl | 2 +- src/mainboard/roda/rk886ex/dsdt.asl | 2 +- src/mainboard/roda/rk9/dsdt.asl | 2 +- 18 files changed, 59 insertions(+), 64 deletions(-) delete mode 100644 src/cpu/intel/common/acpi/cpu.asl create mode 100644 src/cpu/intel/speedstep/acpi/cpu.asl diff --git a/src/arch/x86/include/arch/acpigen.h b/src/arch/x86/include/arch/acpigen.h index 9ec6ee1bf3..a50a9004f6 100644 --- a/src/arch/x86/include/arch/acpigen.h +++ b/src/arch/x86/include/arch/acpigen.h @@ -82,6 +82,7 @@ enum { AND_OP = 0x7B, OR_OP = 0x7D, NOT_OP = 0x80, + NOTIFY_OP = 0x86, LEQUAL_OP = 0x93, LGREATER_OP = 0x94, LLESS_OP = 0x95, diff --git a/src/cpu/intel/common/acpi/cpu.asl b/src/cpu/intel/common/acpi/cpu.asl deleted file mode 100644 index 117ef468f9..0000000000 --- a/src/cpu/intel/common/acpi/cpu.asl +++ /dev/null @@ -1,50 +0,0 @@ -/* - * This file is part of the coreboot project. - * - * This program is free software; you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation; version 2 of the License. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - */ - -/* These come from the dynamically created CPU SSDT */ -External(PDC0) -External(PDC1) - -// Power notification - -External (\_PR_.CP00, DeviceObj) -External (\_PR_.CP01, DeviceObj) -External (\_PR_.CP00._PPC) -External (\_PR_.CP01._PPC) - -Method (PNOT) -{ - If (MPEN) { - If(And(PDC0, 0x08)) { - Notify (\_PR_.CP00, 0x80) // _PPC - - If (And(PDC0, 0x10)) { - Sleep(100) - Notify(\_PR_.CP00, 0x81) // _CST - } - } - - If(And(PDC1, 0x08)) { - Notify (\_PR_.CP01, 0x80) // _PPC - If (And(PDC1, 0x10)) { - Sleep(100) - Notify(\_PR_.CP01, 0x81) // _CST - } - } - - } Else { // UP - Notify (\_PR_.CP00, 0x80) - Sleep(0x64) - Notify(\_PR_.CP00, 0x81) - } -} diff --git a/src/cpu/intel/speedstep/acpi.c b/src/cpu/intel/speedstep/acpi.c index c154da0c29..73b7431608 100644 --- a/src/cpu/intel/speedstep/acpi.c +++ b/src/cpu/intel/speedstep/acpi.c @@ -23,6 +23,7 @@ #include #include #include +#include static int determine_total_number_of_cores(void) { @@ -164,4 +165,16 @@ void generate_cpu_entries(device_t device) /* PPKG is usually used for thermal management of the first and only package. */ acpigen_write_processor_package("PPKG", 0, cores_per_package); + + /* Add a method to notify processor nodes */ + acpigen_write_method("\\_PR.CNOT", 1); + for (coreID = 0; coreID < cores_per_package; coreID++) { + char buffer[DEVICE_PATH_MAX]; + snprintf(buffer, sizeof(buffer), "\\_PR.CP%c%c", + '0' + coreID / 10, '0' + coreID % 10); + acpigen_emit_byte(NOTIFY_OP); + acpigen_emit_namestring(buffer); + acpigen_emit_byte(ARG0_OP); + } + acpigen_pop_len(); } diff --git a/src/cpu/intel/speedstep/acpi/cpu.asl b/src/cpu/intel/speedstep/acpi/cpu.asl new file mode 100644 index 0000000000..9ff3f76727 --- /dev/null +++ b/src/cpu/intel/speedstep/acpi/cpu.asl @@ -0,0 +1,31 @@ +/* + * This file is part of the coreboot project. + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; version 2 of the License. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + */ + +/* These come from the dynamically created CPU SSDT */ +External (\_PR.CNOT, MethodObj) +External (\_PR_.CP00, DeviceObj) +External (\_PR_.CP00._PPC) +External (\_PR_.CP01._PPC) + +Method (PNOT) +{ + If (MPEN) { + \_PR.CNOT (0x80) // _PPC + Sleep(100) + \_PR.CNOT (0x81) // _CST + } Else { // UP + Notify (\_PR_.CP00, 0x80) + Sleep(0x64) + Notify(\_PR_.CP00, 0x81) + } +} diff --git a/src/mainboard/apple/macbook21/dsdt.asl b/src/mainboard/apple/macbook21/dsdt.asl index a70b01a486..2405c3e823 100644 --- a/src/mainboard/apple/macbook21/dsdt.asl +++ b/src/mainboard/apple/macbook21/dsdt.asl @@ -34,7 +34,7 @@ DefinitionBlock( #include #include - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/asus/p5gc-mx/dsdt.asl b/src/mainboard/asus/p5gc-mx/dsdt.asl index b55aa3fdfb..5eb55ea651 100644 --- a/src/mainboard/asus/p5gc-mx/dsdt.asl +++ b/src/mainboard/asus/p5gc-mx/dsdt.asl @@ -38,7 +38,7 @@ DefinitionBlock( // Thermal Zone //#include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/getac/p470/dsdt.asl b/src/mainboard/getac/p470/dsdt.asl index ada278c4b3..4b3ae14b19 100644 --- a/src/mainboard/getac/p470/dsdt.asl +++ b/src/mainboard/getac/p470/dsdt.asl @@ -43,7 +43,7 @@ DefinitionBlock( // Thermal Zone #include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/gigabyte/ga-945gcm-s2l/dsdt.asl b/src/mainboard/gigabyte/ga-945gcm-s2l/dsdt.asl index 187481a1e2..cbc1573a2e 100644 --- a/src/mainboard/gigabyte/ga-945gcm-s2l/dsdt.asl +++ b/src/mainboard/gigabyte/ga-945gcm-s2l/dsdt.asl @@ -38,7 +38,7 @@ DefinitionBlock( // Thermal Zone //#include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/ibase/mb899/dsdt.asl b/src/mainboard/ibase/mb899/dsdt.asl index 3d7589a126..6844bbd4bb 100644 --- a/src/mainboard/ibase/mb899/dsdt.asl +++ b/src/mainboard/ibase/mb899/dsdt.asl @@ -35,7 +35,7 @@ DefinitionBlock( //#include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/intel/d510mo/dsdt.asl b/src/mainboard/intel/d510mo/dsdt.asl index a7788bd483..621b87dc7a 100644 --- a/src/mainboard/intel/d510mo/dsdt.asl +++ b/src/mainboard/intel/d510mo/dsdt.asl @@ -26,7 +26,7 @@ DefinitionBlock( #include "acpi/platform.asl" #include - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/intel/d945gclf/dsdt.asl b/src/mainboard/intel/d945gclf/dsdt.asl index 187481a1e2..cbc1573a2e 100644 --- a/src/mainboard/intel/d945gclf/dsdt.asl +++ b/src/mainboard/intel/d945gclf/dsdt.asl @@ -38,7 +38,7 @@ DefinitionBlock( // Thermal Zone //#include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/kontron/986lcd-m/dsdt.asl b/src/mainboard/kontron/986lcd-m/dsdt.asl index e39d44d268..35264bd952 100644 --- a/src/mainboard/kontron/986lcd-m/dsdt.asl +++ b/src/mainboard/kontron/986lcd-m/dsdt.asl @@ -34,7 +34,7 @@ DefinitionBlock( //#include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/lenovo/t400/dsdt.asl b/src/mainboard/lenovo/t400/dsdt.asl index a0978aff11..6ba4774796 100644 --- a/src/mainboard/lenovo/t400/dsdt.asl +++ b/src/mainboard/lenovo/t400/dsdt.asl @@ -39,7 +39,7 @@ DefinitionBlock( // General Purpose Events #include "acpi/gpe.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/lenovo/t60/dsdt.asl b/src/mainboard/lenovo/t60/dsdt.asl index 684009ed2c..a13ac3c8e4 100644 --- a/src/mainboard/lenovo/t60/dsdt.asl +++ b/src/mainboard/lenovo/t60/dsdt.asl @@ -47,7 +47,7 @@ DefinitionBlock( #include "acpi/video.asl" } - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/lenovo/x200/dsdt.asl b/src/mainboard/lenovo/x200/dsdt.asl index 0706249afb..5452fe3664 100644 --- a/src/mainboard/lenovo/x200/dsdt.asl +++ b/src/mainboard/lenovo/x200/dsdt.asl @@ -39,7 +39,7 @@ DefinitionBlock( // General Purpose Events #include "acpi/gpe.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/lenovo/x60/dsdt.asl b/src/mainboard/lenovo/x60/dsdt.asl index e2292ff011..32223033f6 100644 --- a/src/mainboard/lenovo/x60/dsdt.asl +++ b/src/mainboard/lenovo/x60/dsdt.asl @@ -43,7 +43,7 @@ DefinitionBlock( // mainboard specific devices #include "acpi/mainboard.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/roda/rk886ex/dsdt.asl b/src/mainboard/roda/rk886ex/dsdt.asl index c68dc2506e..efb2f92a5e 100644 --- a/src/mainboard/roda/rk886ex/dsdt.asl +++ b/src/mainboard/roda/rk886ex/dsdt.asl @@ -39,7 +39,7 @@ DefinitionBlock( // Thermal Zone #include "acpi/thermal.asl" - #include + #include Scope (\_SB) { Device (PCI0) diff --git a/src/mainboard/roda/rk9/dsdt.asl b/src/mainboard/roda/rk9/dsdt.asl index e4a1f7c8ae..5c5ca2fda4 100644 --- a/src/mainboard/roda/rk9/dsdt.asl +++ b/src/mainboard/roda/rk9/dsdt.asl @@ -38,7 +38,7 @@ DefinitionBlock( // mainboard specific devices #include "acpi/mainboard.asl" - #include + #include // Thermal Zone #include "acpi/thermal.asl" -- cgit v1.2.3