1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
|
From 562a6d31576b91d1c7f2c9df0d12966a1f034ac6 Mon Sep 17 00:00:00 2001
From: Saravanan Palanisamy <saravanan.palanisamy@intel.com>
Date: Wed, 23 Sep 2020 19:23:37 +0000
Subject: [PATCH] Handle pending eSPI HOST, OOB RESET VW events.
Add support for handling of HOST_RESET_WARN, OOB_RESET_WARN VW events received
before espi-ISR is registered.
Without this support, SoC does not boot to BIOS and wait for ACK endlessly
for these events. These events can be induced in some platforms in ME-recovery
mode.
Tested:
1. Test: Induce HOST_RESET_WARN event before BMC uboot espi is initialized.
Expected: BMC should send HOST_RESET_ACK from uboot. PASS.
2. Test: Disable the HOST_RESET_WARN ACK support for early events in uboot,
and repeat test case 1.
Expected: BMC should send HOST_RESET_ACK from kernel(this change). PASS.
Signed-off-by: Saravanan Palanisamy <saravanan.palanisamy@intel.com>
Signed-off-by: Richard Marian Thomaiyar <richard.marian.thomaiyar@linux.intel.com>
---
drivers/misc/aspeed-espi-slave.c | 18 ++++++++++++++++++
1 file changed, 18 insertions(+)
diff --git a/drivers/misc/aspeed-espi-slave.c b/drivers/misc/aspeed-espi-slave.c
index cb8ed585c69f..ed7bff4d5046 100644
--- a/drivers/misc/aspeed-espi-slave.c
+++ b/drivers/misc/aspeed-espi-slave.c
@@ -179,6 +179,24 @@ static void aspeed_espi_boot_ack(struct aspeed_espi *priv)
evt | ASPEED_ESPI_SYSEVT1_SUS_ACK);
dev_dbg(priv->dev, "Boot SYSEVT1_SUS_WARN: acked\n");
}
+
+ regmap_read(priv->map, ASPEED_ESPI_SYSEVT, &evt);
+ if (evt & ASPEED_ESPI_SYSEVT_HOST_RST_WARN &&
+ !(evt & ASPEED_ESPI_SYSEVT_HOST_RST_ACK)) {
+ regmap_write_bits(priv->map, ASPEED_ESPI_SYSEVT,
+ ASPEED_ESPI_SYSEVT_HOST_RST_ACK,
+ ASPEED_ESPI_SYSEVT_HOST_RST_ACK);
+ dev_dbg(priv->dev, "Boot SYSEVT_HOST_RST_WARN: acked\n");
+ }
+
+ regmap_read(priv->map, ASPEED_ESPI_SYSEVT, &evt);
+ if (evt & ASPEED_ESPI_SYSEVT_OOB_RST_WARN &&
+ !(evt & ASPEED_ESPI_SYSEVT_OOB_RST_ACK)) {
+ regmap_write_bits(priv->map, ASPEED_ESPI_SYSEVT,
+ ASPEED_ESPI_SYSEVT_OOB_RST_ACK,
+ ASPEED_ESPI_SYSEVT_OOB_RST_ACK);
+ dev_dbg(priv->dev, "Boot SYSEVT_OOB_RST_WARN: acked\n");
+ }
}
static irqreturn_t aspeed_espi_irq(int irq, void *arg)
--
2.17.1
|