summaryrefslogtreecommitdiff
path: root/src/soc/amd/common
diff options
context:
space:
mode:
authorFelix Held <felix-coreboot@felixheld.de>2021-12-18 00:41:23 +0100
committerFelix Held <felix-coreboot@felixheld.de>2022-01-07 13:20:00 +0000
commit5ba87a80921cc0ef3f164d30ef27d35244131a52 (patch)
tree618fce3249908eb2c00ada98da3ede2afb382070 /src/soc/amd/common
parente2192e6a82e37cb40216c98dfd0183dc146eac37 (diff)
soc/amd/common/lpc/espi_util: handle espi_get_configuration error
In espi_wait_channel_ready the return value of espi_get_configuration didn't get checked before. In the case of the espi_send_command call in espi_get_configuration returning CB_ERR, espi_get_configuration didn't write to the local config variable, so if this happens in the first pass of the do-while loop, the following espi_slave_is_channel_ready call would use the uninitialized local config variable as parameter. Fix this by checking the return value of espi_get_configuration. TEST=None Signed-off-by: Felix Held <felix-coreboot@felixheld.de> Change-Id: Iff1a0670e17b9d6c6f4daf2ea56badf6c428b8c9 Reviewed-on: https://review.coreboot.org/c/coreboot/+/60209 Tested-by: build bot (Jenkins) <no-reply@coreboot.org> Reviewed-by: Raul Rangel <rrangel@chromium.org>
Diffstat (limited to 'src/soc/amd/common')
-rw-r--r--src/soc/amd/common/block/lpc/espi_util.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/src/soc/amd/common/block/lpc/espi_util.c b/src/soc/amd/common/block/lpc/espi_util.c
index 1d7be67c66..d9b4715b5e 100644
--- a/src/soc/amd/common/block/lpc/espi_util.c
+++ b/src/soc/amd/common/block/lpc/espi_util.c
@@ -772,7 +772,8 @@ static enum cb_err espi_wait_channel_ready(uint16_t slave_reg_addr)
stopwatch_init_usecs_expire(&sw, ESPI_CH_READY_TIMEOUT_US);
do {
- espi_get_configuration(slave_reg_addr, &config);
+ if (espi_get_configuration(slave_reg_addr, &config) != CB_SUCCESS)
+ return CB_ERR;
if (espi_slave_is_channel_ready(config))
return CB_SUCCESS;
} while (!stopwatch_expired(&sw));