mb/google/nissa/var/telith: Reduce power limits

When battery is not present, reduce power limits,
avoid inability to enter the system.

This will check the current battery status and configure cpu power
limits using current PD power value.

BUG=b:384883899
BRANCH=none
TEST=built and verified PL4 values,power engineer verify pass.

Change-Id: I7e0c7289c20c4ce51eae2a48eb8f09acfcb9e958
Signed-off-by: Kun Liu <liukun11@huaqin.corp-partner.google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/85894
Reviewed-by: Subrata Banik <subratabanik@google.com>
Reviewed-by: Eric Lai <ericllai@google.com>
Reviewed-by: Kapil Porwal <kapilporwal@google.com>
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
This commit is contained in:
Kun Liu 2025-01-08 20:39:25 +08:00 committed by Subrata Banik
commit 0529c6d033
3 changed files with 93 additions and 0 deletions

View file

@ -2,8 +2,41 @@
#include <baseboard/gpio.h>
#include <baseboard/variants.h>
#include <device/pci_ops.h>
#include <gpio.h>
#include <soc/gpio.h>
#include <soc/ramstage.h>
#include <soc/pci_devs.h>
#include <static.h>
#include <intelblocks/power_limit.h>
struct soc_power_limits_config *variant_get_soc_power_limit_config(void)
{
config_t *config = config_of_soc();
size_t i;
struct device *sa = pcidev_path_on_root(SA_DEVFN_ROOT);
uint16_t sa_pci_id;
u8 tdp;
if (!sa)
return NULL;
sa_pci_id = pci_read_config16(sa, PCI_DEVICE_ID);
if (sa_pci_id == 0xffff)
return NULL;
tdp = get_cpu_tdp();
for (i = 0; i < ARRAY_SIZE(cpuid_to_adl); i++) {
if (sa_pci_id == cpuid_to_adl[i].cpu_id &&
tdp == cpuid_to_adl[i].cpu_tdp) {
return &config->power_limits_config[cpuid_to_adl[i].limits];
}
}
return NULL;
}
void variant_configure_pads(void)
{

View file

@ -4,5 +4,6 @@ bootblock-y += gpio.c
romstage-y += gpio.c
ramstage-y += gpio.c
ramstage-y += ramstage.c
ramstage-y += variant.c

View file

@ -0,0 +1,59 @@
/* SPDX-License-Identifier: GPL-2.0-or-later */
#include <baseboard/variants.h>
#include <chip.h>
#include <console/console.h>
#include <device/device.h>
#include <device/pci_ids.h>
#include <device/pci_ops.h>
#include <ec/google/chromeec/ec.h>
#include <intelblocks/power_limit.h>
#define NO_BATTERY_PL4_WATTS_LIMIT 45
static bool get_pd_power_watts(u32 *watts)
{
int rv;
enum usb_chg_type type = USB_CHG_TYPE_UNKNOWN;
u16 volts_mv, current_ma;
rv = google_chromeec_get_usb_pd_power_info(&type, &current_ma, &volts_mv);
if (rv == 0 && type == USB_CHG_TYPE_PD) {
/* Detected USB-PD. Base on max value of adapter */
*watts = ((u32)current_ma * volts_mv) / 1000000;
return true;
}
printk(BIOS_WARNING, "Cannot get PD power info. rv = %d, usb_chg_type: %d\n", rv, type);
return false;
}
void variant_devtree_update(void)
{
struct soc_power_limits_config *soc_config;
u32 watts;
u32 pl4_watts = NO_BATTERY_PL4_WATTS_LIMIT;
soc_config = variant_get_soc_power_limit_config();
if (soc_config == NULL)
return;
/*
* If battery is not present or battery level is at or below critical threshold
* to boot a platform with the power efficient configuration, limit PL4
* settings.
*/
if (!google_chromeec_is_battery_present()) {
/* Adjust PL4 values according to current PD power */
if (get_pd_power_watts(&watts)) {
if (watts < NO_BATTERY_PL4_WATTS_LIMIT)
pl4_watts = watts - 5;
else
pl4_watts = 40;
}
if (soc_config->tdp_pl4 > pl4_watts) {
printk(BIOS_INFO, "override PL4 settings to %d watts\n", pl4_watts);
soc_config->tdp_pl4 = pl4_watts;
}
}
}