From 8228362c5d548fa3f05c7679fb0ec0822d6e40cb Mon Sep 17 00:00:00 2001 From: Jeremy Soller Date: Tue, 7 Mar 2023 09:18:54 -0700 Subject: [PATCH] Do not try to use peci between VW_HOST_RST_WARN and VW_PLTRST_N --- src/board/system76/common/espi.c | 10 ++++++++++ src/board/system76/common/include/board/espi.h | 4 ++++ src/board/system76/common/peci.c | 6 +++++- 3 files changed, 19 insertions(+), 1 deletion(-) diff --git a/src/board/system76/common/espi.c b/src/board/system76/common/espi.c index 8e81b16..61f426d 100644 --- a/src/board/system76/common/espi.c +++ b/src/board/system76/common/espi.c @@ -40,6 +40,8 @@ vw_set(&W, V); \ } +bool espi_host_reset = false; + void espi_init(void) { if (PLLFREQ != 0b0111) { // Workarounds to allow changing PLL @@ -144,6 +146,9 @@ void espi_event(void) { VW_SET_DEBUG(VW_RCIN_N, VWS_HIGH); power_cpu_reset(); + + // Host reset complete + espi_host_reset = false; } last_pltrst_n = wire; } @@ -154,6 +159,11 @@ void espi_event(void) { // Set HOST_RST_ACK to HOST_RST_WARN wire = vw_get(&VW_HOST_RST_WARN); if (wire != vw_get(&VW_HOST_RST_ACK)) { + if (wire == VWS_HIGH) { + // Host reset started + espi_host_reset = true; + } + VW_SET_DEBUG(VW_HOST_RST_ACK, wire); } } diff --git a/src/board/system76/common/include/board/espi.h b/src/board/system76/common/include/board/espi.h index 684ef53..f1bd91d 100644 --- a/src/board/system76/common/include/board/espi.h +++ b/src/board/system76/common/include/board/espi.h @@ -3,8 +3,12 @@ #ifndef _BOARD_ESPI_H #define _BOARD_ESPI_H +#include + #include +extern bool espi_host_reset; + void espi_init(void); void espi_reset(void); void espi_event(void); diff --git a/src/board/system76/common/peci.c b/src/board/system76/common/peci.c index e5fa19e..ad796dd 100644 --- a/src/board/system76/common/peci.c +++ b/src/board/system76/common/peci.c @@ -1,13 +1,13 @@ // SPDX-License-Identifier: GPL-3.0-only #include +#include #include #include #include #include #include #include -#include #include #include @@ -76,6 +76,10 @@ bool peci_available(void) { if (power_state != POWER_STATE_S0) return false; + // Currently waiting for host reset, PECI is not available + if (espi_host_reset) + return false; + // If VW_PLTRST_N virtual wire is not VWS_HIGH, PECI is not available // This is because the CPU has not yet exited reset if (vw_get(&VW_PLTRST_N) != VWS_HIGH)