summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-ast2600/recipes-bsp/u-boot/files/0024-fix-SUS_WARN-handling-logic.patch
blob: e8562a18422384b9357c32ce1b847812b55a1120 (plain)
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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
From e9a8a79453e23c86e7b086b1e752876c99bcf0b3 Mon Sep 17 00:00:00 2001
From: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
Date: Tue, 20 Oct 2020 15:49:26 -0700
Subject: [PATCH] fix SUS_WARN handling logic

This commit fixes SUS_WARN handling as dual-edge detection mode
to support deepsx entry event properly.

Signed-off-by: Jae Hyun Yoo <jae.hyun.yoo@linux.intel.com>
---
 board/aspeed/ast2600_intel/ast-espi.c | 62 ++++++++++++++-------------
 1 file changed, 32 insertions(+), 30 deletions(-)

diff --git a/board/aspeed/ast2600_intel/ast-espi.c b/board/aspeed/ast2600_intel/ast-espi.c
index a8b389f159ef..51fcc836cc6a 100644
--- a/board/aspeed/ast2600_intel/ast-espi.c
+++ b/board/aspeed/ast2600_intel/ast-espi.c
@@ -148,9 +148,9 @@ static void espi_irq_handler(void *cookie)
 {
 	uint32_t irq_status = readl(AST_ESPI_BASE + ESPI008);
 
-	DBG_ESPI("espi_irq_handler, ESPI008=0X%x, ESPI00c=0X%x,\
-		ESPI100=0X%x, ESPI11c=0X%x, ESPI094=0X%x,\
-		ESPI12c=0X%x, irq_status=0x%x\n",
+	DBG_ESPI("espi_irq_handler, ESPI008=0X%x, ESPI00c=0X%x, "
+		 "ESPI100=0X%x, ESPI11c=0X%x, ESPI094=0X%x, "
+		 "ESPI12c=0X%x, irq_status=0x%x\n",
 		readl(AST_ESPI_BASE + ESPI008),
 		readl(AST_ESPI_BASE + ESPI00C),
 		readl(AST_ESPI_BASE + ESPI100),
@@ -165,21 +165,23 @@ static void espi_irq_handler(void *cookie)
 		DBG_ESPI("sys_status : 0x%08X\n", sys_status);
 		if (sys_status & AST_ESPI_HOST_RST_WARN) {
 			DBG_ESPI("HOST_RST_WARN evt: 0x%08X\n", sys_event);
-			if (sys_event & AST_ESPI_HOST_RST_WARN) {
-				uint32_t v = readl(AST_ESPI_BASE + ESPI098) |
-					     AST_ESPI_HOST_RST_ACK;
-				writel(v, AST_ESPI_BASE + ESPI098);
-				DBG_ESPI("HOST_RST_WARN sent ack\n");
-			}
+			uint32_t v = readl(AST_ESPI_BASE + ESPI098);
+			if (sys_event & AST_ESPI_HOST_RST_WARN)
+				v |= AST_ESPI_HOST_RST_ACK;
+			else
+				v &= ~AST_ESPI_HOST_RST_ACK;
+			writel(v, AST_ESPI_BASE + ESPI098);
+			DBG_ESPI("HOST_RST_WARN sent ack\n");
 		}
 		if (sys_status & AST_ESPI_OOB_RST_WARN) {
 			DBG_ESPI("OOB_RST_WARN evt: 0x%08X\n", sys_event);
-			if (sys_event & AST_ESPI_OOB_RST_WARN) {
-				uint32_t v = readl(AST_ESPI_BASE + ESPI098) |
-					     AST_ESPI_OOB_RST_ACK;
-				writel(v, AST_ESPI_BASE + ESPI098);
-				DBG_ESPI("OOB_RST_WARN sent ack\n");
-			}
+			uint32_t v = readl(AST_ESPI_BASE + ESPI098);
+			if (sys_event & AST_ESPI_OOB_RST_WARN)
+				v |= AST_ESPI_OOB_RST_ACK;
+			else
+				v &= ~AST_ESPI_OOB_RST_ACK;
+			writel(v, AST_ESPI_BASE + ESPI098);
+			DBG_ESPI("OOB_RST_WARN sent ack\n");
 		}
 		if (sys_status & AST_ESPI_PLTRSTN) {
 			DBG_ESPI("PLTRSTN: %c, evt: 0x%08X\n",
@@ -196,12 +198,13 @@ static void espi_irq_handler(void *cookie)
 		DBG_ESPI("sys1_status : 0x%08X\n", sys1_status);
 		if (sys1_status & AST_ESPI_SUS_WARN) {
 			DBG_ESPI("SUS WARN evt: 0x%08X\n", sys1_event);
-			if (sys1_event & AST_ESPI_SUS_WARN) {
-				uint32_t v = readl(AST_ESPI_BASE + ESPI104) |
-					     AST_ESPI_SUS_ACK;
-				writel(v, AST_ESPI_BASE + ESPI104);
-				DBG_ESPI("SUS_WARN sent ack\n");
-			}
+			uint32_t v = readl(AST_ESPI_BASE + ESPI104);
+			if (sys1_event & AST_ESPI_SUS_WARN)
+				v |= AST_ESPI_SUS_ACK;
+			else
+				v &= ~AST_ESPI_SUS_ACK;
+			writel(v, AST_ESPI_BASE + ESPI104);
+			DBG_ESPI("SUS_WARN sent ack\n");
 		}
 		writel(sys1_status, AST_ESPI_BASE + ESPI12C); /* clear status */
 	}
@@ -219,9 +222,9 @@ static void espi_irq_handler(void *cookie)
 
 	writel(irq_status, AST_ESPI_BASE + ESPI008); /* clear irq_status */
 
-	DBG_ESPI("end espi_irq_handler, ESPI008=0X%x, ESPI00c=0X%x,\
-		ESPI100=0X%x, ESPI11c=0X%x, ESPI094=0X%x,\
-		ESPI12c=0X%x, irq_status=0X%x\n",
+	DBG_ESPI("end espi_irq_handler, ESPI008=0X%x, ESPI00c=0X%x, "
+		 "ESPI100=0X%x, ESPI11c=0X%x, ESPI094=0X%x, "
+		 "ESPI12c=0X%x, irq_status=0X%x\n",
 		readl(AST_ESPI_BASE + ESPI008),
 		readl(AST_ESPI_BASE + ESPI00C),
 		readl(AST_ESPI_BASE + ESPI100),
@@ -232,6 +235,7 @@ static void espi_irq_handler(void *cookie)
 
 static void espi_configure_irq(void)
 {
+	/* Dual-edge setting for HOST_RST_WARN and OOB_RST_WARN */
 	writel(0, AST_ESPI_BASE + ESPI110);
 	writel(0, AST_ESPI_BASE + ESPI114);
 	writel(AST_ESPI_HOST_RST_WARN | AST_ESPI_OOB_RST_WARN |
@@ -239,13 +243,11 @@ static void espi_configure_irq(void)
 	writel(AST_ESPI_HOST_RST_WARN | AST_ESPI_OOB_RST_WARN |
 	       AST_ESPI_PLTRSTN, AST_ESPI_BASE + ESPI094);
 
-	writel(AST_ESPI_SUS_WARN,
-	       AST_ESPI_BASE + ESPI120); /* int type 0 susp warn */
+	/* Dual-edge setting for SUS_WARN */
+	writel(0, AST_ESPI_BASE + ESPI120);
 	writel(0, AST_ESPI_BASE + ESPI124);
-	writel(0, AST_ESPI_BASE + ESPI128);
-	writel(AST_ESPI_SUS_WARN,
-	       AST_ESPI_BASE +
-			ESPI100); /* Enable sysev1 ints for susp warn */
+	writel(AST_ESPI_SUS_WARN, AST_ESPI_BASE + ESPI128);
+	writel(AST_ESPI_SUS_WARN, AST_ESPI_BASE + ESPI100);
 
 	writel(AST_ESPI_IEN_HW_RST | AST_ESPI_IEN_SYS1_EV |
 	       AST_ESPI_IEN_SYS_EV, AST_ESPI_BASE + ESPI00C);
-- 
2.17.1