From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from foss.arm.com (foss.arm.com [217.140.110.172]) by mx.groups.io with SMTP id smtpd.web12.7167.1597359702140890521 for ; Thu, 13 Aug 2020 16:01:42 -0700 Authentication-Results: mx.groups.io; dkim=missing; spf=pass (domain: arm.com, ip: 217.140.110.172, mailfrom: jeremy.linton@arm.com) Received: from usa-sjc-imap-foss1.foss.arm.com (unknown [10.121.207.14]) by usa-sjc-mx-foss1.foss.arm.com (Postfix) with ESMTP id B8CB1113E; Thu, 13 Aug 2020 16:01:41 -0700 (PDT) Received: from u200856.usa.arm.com (unknown [172.31.20.19]) by usa-sjc-imap-foss1.foss.arm.com (Postfix) with ESMTPSA id 6BF8B3F22E; Thu, 13 Aug 2020 16:01:41 -0700 (PDT) From: "Jeremy Linton" To: devel@edk2.groups.io Cc: Jeremy Linton , Leif Lindholm , Pete Batard , Andrei Warkentin , Ard Biesheuvel , Samer El-Haj-Mahmoud Subject: [PATCH 2/3] Platform/RaspberryPi4: Create ACPI fan object Date: Thu, 13 Aug 2020 18:00:55 -0500 Message-Id: <20200813230056.40526-3-jeremy.linton@arm.com> X-Mailer: git-send-email 2.25.4 In-Reply-To: <20200813230056.40526-1-jeremy.linton@arm.com> References: <20200813230056.40526-1-jeremy.linton@arm.com> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Now that we have a thermal zone we can add active cooling by specifying active cooling points (_ACx) which can be tied to fan objects that turn fans on/off using GPIO pins. Cc: Leif Lindholm Cc: Pete Batard Cc: Andrei Warkentin Cc: Ard Biesheuvel Cc: Samer El-Haj-Mahmoud Signed-off-by: Jeremy Linton --- .../RaspberryPi/Drivers/ConfigDxe/SsdtThermal.asl | 83 ++++++++++++++++= ++++++ 1 file changed, 83 insertions(+) create mode 100644 Platform/RaspberryPi/Drivers/ConfigDxe/SsdtThermal.as= l diff --git a/Platform/RaspberryPi/Drivers/ConfigDxe/SsdtThermal.asl b/Pla= tform/RaspberryPi/Drivers/ConfigDxe/SsdtThermal.asl new file mode 100644 index 0000000000..c87bda6dbc --- /dev/null +++ b/Platform/RaspberryPi/Drivers/ConfigDxe/SsdtThermal.asl @@ -0,0 +1,83 @@ +/** @file + * + * Secondary System Description Table (SSDT) for active (fan) cooling + * + * Copyright (c) 2020, Arm Ltd. All rights reserved. + * + * SPDX-License-Identifier: BSD-2-Clause-Patent + * + **/ + +#include +#include +#include + +#include + +DefinitionBlock(__FILE__, "SSDT", 5, "RPIFDN", "RPITHFAN", 2) +{ +#if (GPIO_FAN_PIN !=3D 0) + External(\_SB_.EC0, DeviceObj) + External(\_SB_.EC0.TZ0, DeviceObj) + + Scope (\_SB_.EC0) + { + // Describe a fan + PowerResource(PFAN, 0, 0) { + OperationRegion (GPIO, SystemMemory, GPIO_BASE_ADDRESS, 0x1000) + Field (GPIO, DWordAcc, NoLock, Preserve) { + Offset(0x1C), + GPS0, 32, + GPS1, 32, + RES1, 32, + GPC0, 32, + GPC1, 32, + RES2, 32, + GPL1, 32, + GPL2, 32 + } + // We are hitting a GPIO pin to on/off the fan + // this assumes that UEFI has programmed the + // direction as OUT. + // (search "rpi gpio fan controller" for how to + // wire this up if your not electrically inclined + // the basic idea is to use a BJT/etc to switch a + // larger voltage through a fan where the GPIO pin + // feeds a NPN/PNP base. Thats because its unlikly + // that the fan can be driven directly from the GPIO + // pin due to hitting the current limit on the pins. + // Matching a resistor between the GPIO->Base can + // allow pretty much any random NPN with a reasonable + // EC current to work (to limit the GPIO current).) + Method (_STA) { + if ( GPL1 & (1 << GPIO_FAN_PIN) ) { + Return ( 1 ) // present and enabled + } + Return ( 0 ) + } + Method (_ON) { //turn fan on + Store((1 << GPIO_FAN_PIN), GPS0) + } + Method (_OFF) { //turn fan off + Store((1 << GPIO_FAN_PIN), GPC0) + } + } + Device(FAN) { + // Note, not currently an ACPIv4 fan + // the latter adds speed control/detection + // but in the case of linux needs FIF, FPS, FSL, and FST + Name(_HID, EISAID("PNP0C0B")) + Name(_PR0, Package() {PFAN}) + } + } + + // merge in an active cooling point. + Scope (\_SB_.EC0.TZ0) + { + Method(_AC0) { return(3332) } // (60K) active cooling trip po= int, + // if this is lower than PSV th= en we + // prefer active cooling + Name(_AL0, Package(){\_SB_.EC0.FAN}) // the fan used for AC0 above + } +#endif +} --=20 2.13.7