summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-ast2500/recipes-bsp/u-boot/files/0025-Manufacturing-mode-physical-presence-detection.patch
blob: 76606db0a7f88cc90a86f1a00e05c15f4bac37ba (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
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
From 3ed477feebb959749bd20a22e3acd8b39e22c193 Mon Sep 17 00:00:00 2001
From: AppaRao Puli <apparao.puli@linux.intel.com>
Date: Thu, 20 Jun 2019 18:11:43 +0530
Subject: [PATCH] Manufacturing mode physical presence detection

Support for physical presence of manufacturing mode added.
Front panel power button press for 15 seconds will be detected
and marked as special mode for manufacturing request.
There will be 10 second Status LED blink for 10 seconds to
do the physical indication to the user. This indicates the
user that he has pressed power button long enough for
manufacturing mode detection.

Tested:
1. Verified by holding the power button when u-boot boots for
15 seconds, and confirmed that bootargs passed to linux has
special=mfg string and status led blink physical indication
has been provided
2. Verified in normal condition special=mfg string is not passed
and no physical indication has been provided

Change-Id: Id7e7c7e7860c7ef3ae8e3a7a7cfda7ff506c0f2b
Signed-off-by: Richard Marian Thomaiyar <richard.marian.thomaiyar@linux.intel.com>
Signed-off-by: AppaRao Puli <apparao.puli@linux.intel.com>
---
 board/aspeed/ast-g5/ast-g5-gpio.h  |  2 +-
 board/aspeed/ast-g5/ast-g5-intel.c | 42 ++++++++++++++++++++++++++++++
 board/aspeed/ast-g5/ast-g5.c       |  2 --
 common/autoboot.c                  | 16 ++++++++++--
 4 files changed, 57 insertions(+), 5 deletions(-)

diff --git a/board/aspeed/ast-g5/ast-g5-gpio.h b/board/aspeed/ast-g5/ast-g5-gpio.h
index 54b7388a22f5..8ccf4373460b 100644
--- a/board/aspeed/ast-g5/ast-g5-gpio.h
+++ b/board/aspeed/ast-g5/ast-g5-gpio.h
@@ -73,7 +73,7 @@
 #define AMB_LED_PORT_PIN PORT_PIN(GPIO_PORT_S, GPIO_PIN_5)
 #define FORCE_BMC_UPDATE_PORT_PIN PORT_PIN(GPIO_PORT_D, GPIO_PIN_0)
 #define TPM_EN_PULSE_PORT_PIN PORT_PIN(GPIO_PORT_D, GPIO_PIN_6)
-
+#define FP_PWR_BTN_PORT_PIN PORT_PIN(GPIO_PORT_E, GPIO_PIN_2)
 
 // GPIO Configuration Register bits
 #define GPCFG_EVENT_TO_SMI (1 << 7) // 1 == enabled
diff --git a/board/aspeed/ast-g5/ast-g5-intel.c b/board/aspeed/ast-g5/ast-g5-intel.c
index 45ecd83fd3f0..79de13caa0af 100644
--- a/board/aspeed/ast-g5/ast-g5-intel.c
+++ b/board/aspeed/ast-g5/ast-g5-intel.c
@@ -24,6 +24,7 @@ enum gpio_names {
 	GPIO_AMBER_LED,
 	GPIO_FF_UPD_JUMPER,
 	GPIO_ENABLE_TPM_PULSE,
+	GPIO_FP_PWR_BTN,
 };
 
 #define GPIO_CFG_DEFAULT (GPCFG_ACTIVE_HIGH | GPCFG_LEVEL_TRIG)
@@ -58,6 +59,10 @@ static const GPIOValue gpio_table[] = {
 	/* Enable Pulse -- pin D6 */
 	[GPIO_ENABLE_TPM_PULSE] = {TPM_EN_PULSE_PORT_PIN, GPCFG_OUTPUT_EN, 0,
 				   GPIO_DEBOUNCE_NONE},
+	/* Front Panel Power Button -- pin E2 */
+	[GPIO_FP_PWR_BTN] = {FP_PWR_BTN_PORT_PIN, GPIO_CFG_LOW_INPUT, 0,
+				   GPIO_DEBOUNCE_8MS},
+
 };
 
 #define LPC_SNOOP_ADDR 0x80
@@ -109,6 +114,8 @@ static const GPIOValue gpio_table[] = {
 #define HOST_SERIAL_A_HIGH_SPEED (1 << 0)
 #define HOST_SERIAL_B_HIGH_SPEED (1 << 1)
 
+#define POWERON_RESET_BIT BIT(0)
+
 static void sgpio_init(void)
 {
 	uint32_t value;
@@ -403,6 +410,30 @@ static void update_bootargs_cmd(const char *key, const char *value)
 	free(buf);
 }
 
+static bool is_mfg_mode_phy_req(void)
+{
+	/*
+	 * Assume mfg mode physical request is made, if power button
+	 * is pressed continously for 15 seconds, indicate the
+	 * same in bootargs
+	 */
+	const uint32_t delay_in_ms = 100;
+	const uint32_t read_count = ((15 * 1000) / delay_in_ms);
+	const uint32_t delay_for_indication = 10 * 1000;
+	for (uint32_t count = 0; count < read_count; ++count) {
+		if (!gpio_get_value(GPIO_FP_PWR_BTN))
+			return false;
+
+		mdelay(delay_in_ms);
+	}
+	debug("is_mfg_mode_phy_req : detected mfg mode request\n");
+	id_led_control(GPIO_GREEN_LED, EIDLED_Blink_3HZ);
+	/* Delay the boot to do physical indication for mfg mode */
+	mdelay(delay_for_indication);
+
+	return true;
+}
+
 void ast_g5_intel_late_init(void)
 {
 	char value[32];
@@ -450,6 +481,17 @@ void ast_g5_intel_late_init(void)
 	ast_scu_write(0, AST_SCU_SYS_CTRL);
 
 	update_bootargs_cmd("resetreason", value);
+
+	/* Update the special mode in bootargs */
+	if (reset_reason & POWERON_RESET_BIT && is_mfg_mode_phy_req())
+		update_bootargs_cmd("special", "mfg");
+	else
+		update_bootargs_cmd("special", NULL);
+}
+
+void board_pre_abort_autoboot(void)
+{
+	ast_enable_pass_through();
 }
 
 static void pwm_init(void)
diff --git a/board/aspeed/ast-g5/ast-g5.c b/board/aspeed/ast-g5/ast-g5.c
index d89a2b799a05..a4f3681c0602 100644
--- a/board/aspeed/ast-g5/ast-g5.c
+++ b/board/aspeed/ast-g5/ast-g5.c
@@ -28,8 +28,6 @@ int board_early_init_f(void)
 {
 	/* make sure uart5 is using 24MHz clock */
 	ast_config_uart5_clk();
-	/*enable pass through*/
-	ast_enable_pass_through();
 	arch_interrupt_init_early();
 
 	return 0;
diff --git a/common/autoboot.c b/common/autoboot.c
index d66c0fa63a3e..570d8956988c 100644
--- a/common/autoboot.c
+++ b/common/autoboot.c
@@ -256,13 +256,21 @@ static int __abortboot(int bootdelay)
 }
 # endif	/* CONFIG_AUTOBOOT_KEYED */
 
+/* Allow for board specific config when we check abort condition */
+__weak void board_pre_abort_autoboot(void)
+{
+	/* please define board specific board_pre_abort_autoboot() */
+}
+
 static int abortboot(int bootdelay)
 {
 	int abort = 0;
 
 # ifdef AST_G5_INTEL
-	if (intel_force_firmware_jumper_enabled())
-		return 1;
+	if (intel_force_firmware_jumper_enabled()) {
+		abort = 1;
+		goto exit;
+	}
 # endif
 
 	if (bootdelay >= 0)
@@ -273,6 +281,10 @@ static int abortboot(int bootdelay)
 		gd->flags &= ~GD_FLG_SILENT;
 #endif
 
+exit:
+	if (abort)
+		board_pre_abort_autoboot();
+
 	return abort;
 }
 
-- 
2.17.1