Attempt to fix power_peci_limit issues

- Return false when power_peci_limit fails
- Allow power_peci_limit to be retried indefinitely from power_set_limit
This commit is contained in:
Jeremy Soller
2021-09-07 16:45:58 -06:00
committed by Jeremy Soller
parent f55e493001
commit 646a6436a7

View File

@@ -358,20 +358,19 @@ void power_off_s5(void) {
} }
#ifdef HAVE_DGPU #ifdef HAVE_DGPU
static void power_peci_limit(bool ac) { static bool power_peci_limit(bool ac) {
uint8_t watts = ac ? POWER_LIMIT_AC : POWER_LIMIT_DC; uint8_t watts = ac ? POWER_LIMIT_AC : POWER_LIMIT_DC;
// Retry, timeout errors happen occasionally
for (uint8_t i = 16; i != 0; i--) {
// Set PL4 using PECI // Set PL4 using PECI
int16_t res = peci_wr_pkg_config(60, 0, ((uint32_t)watts) * 8); int16_t res = peci_wr_pkg_config(60, 0, ((uint32_t)watts) * 8);
DEBUG("power_peci_limit %d = %d\n", watts, res); DEBUG("power_peci_limit %d = %d\n", watts, res);
if (res == 0x40) { if (res == 0x40) {
break; return true;
} else if (res < 0) { } else if (res < 0) {
ERROR("power_peci_limit failed: 0x%02X\n", -res); ERROR("power_peci_limit failed: 0x%02X\n", -res);
return false;
} else { } else {
ERROR("power_peci_limit unknown response: 0x%02X\n", res); ERROR("power_peci_limit unknown response: 0x%02X\n", res);
} return false;
} }
} }
@@ -386,15 +385,15 @@ void power_set_limit(void) {
#endif #endif
bool ac = !gpio_get(&ACIN_N); bool ac = !gpio_get(&ACIN_N);
if (last_power_limit_ac != ac) { if (last_power_limit_ac != ac) {
power_peci_limit(ac); if (power_peci_limit(ac)) {
last_power_limit_ac = ac; last_power_limit_ac = ac;
} }
}
} else { } else {
last_power_limit_ac = true; last_power_limit_ac = true;
} }
} }
#else #else
static void power_peci_limit(bool ac) { ac = ac; }
void power_set_limit(void) {} void power_set_limit(void) {}
#endif // HAVE_DGPU #endif // HAVE_DGPU
@@ -426,7 +425,7 @@ void power_event(void) {
static bool ac_last = true; static bool ac_last = true;
bool ac_new = gpio_get(&ACIN_N); bool ac_new = gpio_get(&ACIN_N);
if (ac_new != ac_last) { if (ac_new != ac_last) {
power_peci_limit(!ac_new); power_set_limit();
DEBUG("Power adapter "); DEBUG("Power adapter ");
if (ac_new) { if (ac_new) {