summaryrefslogtreecommitdiff
path: root/src/soc/amd/common/block/lpc
diff options
context:
space:
mode:
Diffstat (limited to 'src/soc/amd/common/block/lpc')
-rw-r--r--src/soc/amd/common/block/lpc/espi_util.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/src/soc/amd/common/block/lpc/espi_util.c b/src/soc/amd/common/block/lpc/espi_util.c
index 0878fb7663..152cdd9001 100644
--- a/src/soc/amd/common/block/lpc/espi_util.c
+++ b/src/soc/amd/common/block/lpc/espi_util.c
@@ -98,6 +98,27 @@ static int espi_get_unused_io_window(void)
return -1;
}
+void espi_clear_decodes(void)
+{
+ unsigned int idx;
+
+ /* First turn off all enable bits, then zero base, range, and size registers */
+ /*
+ * There is currently a bug where the SMU will lock up at times if the port80h enable
+ * bit is cleared. See b/183974365
+ */
+ espi_write16(ESPI_DECODE, (espi_read16(ESPI_DECODE) & ESPI_DECODE_IO_0x80_EN));
+
+ for (idx = 0; idx < ESPI_GENERIC_IO_WIN_COUNT; idx++) {
+ espi_write16(ESPI_IO_RANGE_BASE(idx), 0);
+ espi_write8(ESPI_IO_RANGE_SIZE(idx), 0);
+ }
+ for (idx = 0; idx < ESPI_GENERIC_MMIO_WIN_COUNT; idx++) {
+ espi_write32(ESPI_MMIO_RANGE_BASE(idx), 0);
+ espi_write16(ESPI_MMIO_RANGE_SIZE(idx), 0);
+ }
+}
+
/*
* Returns decode enable bits for standard IO port addresses. If port address is not supported
* by standard decode or if the size of window is not 1, then it returns -1.