ec/google/wilco/acpi: Add DPTF support

Add the support needed for DPTF.  This includes the methods to
write trip point values, read temperatures, and handle events.

This was tested on a sarien board by inspecting AML debug output
with the kernel while monitoring temperatures and trip points in
sysfs and controlling temperatures with a fan to ensure that when
a trip point is crossed an SCI is generated and the event is
handled properly.

Change-Id: I8d8570d176c0896fa709a6c782b319f58d3c1e52
Signed-off-by: Duncan Laurie <dlaurie@google.com>
Reviewed-on: https://review.coreboot.org/c/29761
Reviewed-by: Furquan Shaikh <furquan@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Duncan Laurie 2018-11-20 17:30:47 -08:00 committed by Duncan Laurie
parent 106a0823c9
commit 98d7de7ea9
4 changed files with 159 additions and 0 deletions

View File

@ -0,0 +1,134 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2018 Google LLC
*
* 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.
*/
/*
* Dynamic Platform Thermal Framework support
*/
External (\_SB.DPTF.CTOK, MethodObj)
External (\_SB.DPTF.KTOC, MethodObj)
External (\_SB.DPTF.TEVT, MethodObj)
/* Mutex for EC PAT interface */
Mutex (PATM, 1)
/* Read requested temperature sensor */
Method (TSRD, 1, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
/* Set sensor ID */
W (DWTI, ToInteger (Arg0))
Local0 = R (DRTV)
Release (^PATM)
Return (\_SB.DPTF.CTOK (Local0))
}
/*
* Set Aux Trip Point 0
* Arg0 = Temp Sensor ID
* Arg1 = Value to set
*/
Method (PAT0, 2, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
/* Set sensor ID */
W (DWTI, ToInteger (Arg0))
/* Set LOW trip point for this sensor */
W (DWTL, \_SB.DPTF.KTOC (Arg1))
Release (^PATM)
Return (1)
}
/*
* Set Aux Trip Point 1
* Arg0 = Temp Sensor ID
* Arg1 = Value to set
*/
Method (PAT1, 2, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
/* Set sensor ID */
W (DWTI, ToInteger (Arg0))
/* Set HIGH trip point for this sensor */
W (DWTH, \_SB.DPTF.KTOC (Arg1))
Release (^PATM)
Return (1)
}
/*
* Disable Aux Trip Points
* Arg0 = Temp Sensor ID
*/
Method (PATD, 1, Serialized)
{
If (Acquire (^PATM, 1000)) {
Return (0)
}
/* Set sensor ID */
W (DWTI, ToInteger (Arg0))
/* Disable LOW and HIGH trip points */
W (DWTL, 0xff)
W (DWTH, 0xff)
Release (^PATM)
Return (1)
}
/*
* Handle sensor trip events
*/
Method (PATX, 0, Serialized)
{
Local0 = R (DRTQ)
Local1 = Local0
Printf ("Sensor trip mask: %o", Local0)
If (LNot (Acquire (^PATM, 1000))) {
/* Handle bits that are set */
While (FindSetRightBit (Local1, Local2))
{
/* DPTF will Notify sensor devices */
\_SB.DPTF.TEVT (Local2)
/* Clear current sensor number */
Local1 &= ~(1 << (Local2 - 1))
}
Release (^PATM)
}
/* Clear sensor events */
W (DWTQ, Local0)
}

View File

@ -49,6 +49,11 @@ Device (EC0)
/* Tell EC to stop emulating PS/2 mouse */
W (PS2M, Zero)
/* Enable DPTF support if enabled in devicetree */
If (\DPTE == One) {
W (DWST, Arg1)
}
}
/*
@ -142,4 +147,5 @@ Device (EC0)
#include "event.asl"
#include "lid.asl"
#include "platform.asl"
#include "dptf.asl"
}

View File

@ -106,6 +106,14 @@ Name (BSBS, Package () { 0x2a, 0xff, RD }) /* BSTATIC: Battery String */
Name (QSEC, Package () { 0x2b, 0xff, RD }) /* QS Event Count */
Name (QSEB, Package () { 0x2c, 0xff, RD }) /* QS Event Byte */
Name (DRST, Package () { 0x32, 0xff, RD }) /* DPTF: Read State */
Name (DRTI, Package () { 0x33, 0xff, RD }) /* DPTF: Read Thermal Index */
Name (DRTV, Package () { 0x34, 0xff, RD }) /* DPTF: Read Thermal Value */
Name (DRTL, Package () { 0x35, 0xff, RD }) /* DPTF: Read Trip Low */
Name (DRTH, Package () { 0x36, 0xff, RD }) /* DPTF: Read Trip High */
Name (DRHY, Package () { 0x37, 0xff, RD }) /* DPTF: Read Hysteresis */
Name (DRTQ, Package () { 0x38, 0xff, RD }) /* DPTF: Read Trip Query */
Name (ORST, Package () { 0x39, 0xff, RD }) /* Orientation State */
Name (OREV, Package () { 0x3a, 0xff, RD }) /* Orientation Events */
Name (OECH, Package () { 0x3a, 0x01, RD }) /* Event: Orientation */
@ -128,3 +136,9 @@ Name (SSEL, Package () { 0x04, 0xff, WR }) /* Battery String Select */
Name (ERDY, Package () { 0x05, 0xff, WR }) /* EC Ready */
Name (FWAK, Package () { 0x06, 0xff, WR }) /* EC _WAK */
Name (PS2M, Package () { 0x20, 0xff, WR }) /* EC PS/2 Mouse Emulation */
Name (DWST, Package () { 0x32, 0xff, WR }) /* DPTF: Write State */
Name (DWTI, Package () { 0x33, 0xff, WR }) /* DPTF: Write Thermal Index */
Name (DWTL, Package () { 0x35, 0xff, WR }) /* DPTF: Write Trip Low */
Name (DWTH, Package () { 0x36, 0xff, WR }) /* DPTF: Write Trip High */
Name (DWHY, Package () { 0x37, 0xff, WR }) /* DPTF: Write Hysteresis */
Name (DWTQ, Package () { 0x38, 0xff, WR }) /* DPTF: Write Trip Query */

View File

@ -87,6 +87,11 @@ Method (ECQ2, 1, Serialized)
Method (ECQ3, 1, Serialized)
{
Printf ("EVT3: %o", Arg0)
/* Theraml Events */
If (EBIT (E3TH, Arg0)) {
^PATX ()
}
}
/* Handle events in PmEv4 */