soc/amd/common/acpi, mb/google/skyrim: Implement DTTS Proposal

DTTS indicated Dynamic Thermal Table Switching.The proposal would like
to develop the schematic for switching 6 thermal table by lid status,
machine body mode and temperature. After entering the OS, the thermal
table would be table A. If the “Motion” or “Lid status change” is
detected. The thermal table would switch to laptop mode or lid close
mode.

Once the higher environment temperatures are detected,the thermal
table would switch to the corresponding power throttle table (B, D or
F). Based on these table switching mechanisms, no matter how the
end-user uses Chromebook,they could enjoy more humanized thermal
designs.

              Release     Over         Over      Release            .
              Temp.       Temp.        Temp.     Temp.              .
--------------------------------------------------------            .
Desktop mode  Table A     Table B      50C       45C                .
Lid open      (Default)                                             .
--------------------------------------------------------            .
Desktop mode  Table C     Table D      55C       50C                .
Lid close                                                           .
--------------------------------------------------------            .
Laptop mode   Table E     Table F      45C       40C                .
--------------------------------------------------------            .

On the proposal, the transmission rules are list below:
1. Table A is the default table after booting.
2. A, C, E (Release Temp) can switch to each other.
3. B, D, F (Over Temp) can switch to each other.
4. A and B, C and D, E and F can switch to each other.
5. If Lid open/close or mode switch event trigger, temperature release
tables will translation to each other, temperature over tables will
translation to each other.After that event trigger, EC will check the
new temperature condition and decide if the temperature need to be
trigger.For example, if table A will switch to table D, table A will
switch to C with Lid close event, if temperature is over 55C, EC will
trigger temperature to switch form table C to D.
6. EC will trigger 3 times body-detection events during power on boot
without any body-mode and lid status change. For this case if the
previous table label is on same group, we will based on the temperature
to decide the table.

For example, assume table A is current table. When the temperature
reaches 50C, than the table is switched from A to B. The current table
is B. When the temperature is downgrade below 45C, the table is
switched form B to A. The same rule is for C and D, E and F.

BRANCH=none
BUG=b:232946420
TEST=emerge-skyrim coreboot

Signed-off-by: EricKY Cheng <ericky_cheng@compal.corp-partner.google.com>
Change-Id: I866e5e497e2936984e713029b5f0b6d54cbc9622
Reviewed-on: https://review.coreboot.org/c/coreboot/+/68471
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Raul Rangel <rrangel@chromium.org>
Reviewed-by: Dtrain Hsu <dtrain_hsu@compal.corp-partner.google.com>
This commit is contained in:
EricKY Cheng 2022-10-17 15:09:43 +08:00 committed by Felix Held
parent 5d5efaa97c
commit 429b19962a
3 changed files with 123 additions and 0 deletions

View File

@ -14,6 +14,9 @@ DefinitionBlock (
{
#include <acpi/dsdt_top.asl>
#include <soc.asl>
#if CONFIG(FEATURE_DYNAMIC_DPTC)
#include <variant/acpi/dtts.asl>
#endif
/* ChromeOS Embedded Controller */
Scope (\_SB.PCI0.LPCB)

View File

@ -0,0 +1,116 @@
/* SPDX-License-Identifier: GPL-2.0-only */
External(\_SB.DTTB, MethodObj)
External(\_SB.DTTC, MethodObj)
External(\_SB.DTTD, MethodObj)
External(\_SB.DTTE, MethodObj)
External(\_SB.DTTF, MethodObj)
Scope (\_SB)
{
//---------------------------------------------
// Table | A | B | C | D | E | F | First boot |
//---------------------------------------------
// PRTN | 0 | 1 | 2 | 3 | 4 | 5 | 7 |
//---------------------------------------------
Name (PRTN, 7)
Method (DTTS, 0, Serialized)
{
// Set table A as default table after power on device
If (\_SB.PRTN == 7)
{
\_SB.DDEF()
Store (0, \_SB.PRTN)
Return (Zero)
}
If (\_SB.PCI0.LPCB.EC0.STTB == 0) { // Desktop
If (\_SB.PCI0.LPCB.EC0.LIDS == 1) { // Lid-open
// Table A/B
If ((\_SB.PRTN == 0) || (\_SB.PRTN == 1)) {
// AMB sensor trigger point
// 50C will store 123(0x7B) in mapped memory
// 50C=323K, 323-200(offset)=123(0x7B)
If (\_SB.PCI0.LPCB.EC0.TIN4 >= 123) {
\_SB.DTTB()
Store (1, \_SB.PRTN)
Return (Zero)
}
// AMB sensor release point
If ((\_SB.PCI0.LPCB.EC0.TIN4 <= 118)) {
\_SB.DDEF()
Store (0, \_SB.PRTN)
Return (Zero)
}
// Keep tht previous thermal table
Return (Zero)
} Else {
If (\_SB.PRTN == 3 || \_SB.PRTN == 5) {
\_SB.DTTB()
Store (1, \_SB.PRTN)
Return (Zero)
} Else {
\_SB.DDEF()
Store (0, \_SB.PRTN)
Return (Zero)
}
}
} Else { // Lid-close
// Table C/D
If (\_SB.PRTN == 2 || \_SB.PRTN == 3) {
If (\_SB.PCI0.LPCB.EC0.TIN4 >= 128) {
\_SB.DTTD()
Store (3, \_SB.PRTN)
Return (Zero)
}
If(\_SB.PCI0.LPCB.EC0.TIN4 <= 123) {
\_SB.DTTC()
Store (2, \_SB.PRTN)
Return (Zero)
}
// Keep tht previous thermal table
Return (Zero)
} Else {
If (\_SB.PRTN == 1 || \_SB.PRTN == 5) {
\_SB.DTTD()
Store (3, \_SB.PRTN)
Return (Zero)
} Else {
\_SB.DTTC()
Store (2, \_SB.PRTN)
Return (Zero)
}
}
}
} Else { // Laptop
// Table E/F
If (\_SB.PRTN == 4 || \_SB.PRTN == 5) {
// AMB sensor trigger point
If (\_SB.PCI0.LPCB.EC0.TIN4 >= 118) {
\_SB.DTTF()
Store (5, \_SB.PRTN)
Return (Zero)
}
// AMB sensor release point
If ((\_SB.PCI0.LPCB.EC0.TIN4 <= 113)) {
\_SB.DTTE()
Store (4, \_SB.PRTN)
Return (Zero)
}
// Keep tht previous thermal table
Return (Zero)
} Else {
If (\_SB.PRTN == 1 || \_SB.PRTN == 3) {
\_SB.DTTF()
Store (5, \_SB.PRTN)
Return (Zero)
} Else {
\_SB.DTTE()
Store (4, \_SB.PRTN)
Return (Zero)
}
}
} // Desktop/Laptop End
}
}

View File

@ -31,7 +31,11 @@ Scope (\_SB)
Return (Zero)
}
#if CONFIG(FEATURE_DYNAMIC_DPTC)
\_SB.DTTS()
#else
\_SB.DDEF()
#endif
Return (Zero)
}
}