summaryrefslogtreecommitdiff
path: root/meta-openbmc-mods/meta-ast2500/recipes-bsp/u-boot/files/0025-Manufacturing-mode-physical-presence-detection.patch
blob: 6932aebf0607e430b734014e9f97d8e763b50e33 (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
From 008edb2487358bb3f0f0ec1d753cc5bff7b08182 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 | 35 ++++++++++++++++++++++++++++++
 2 files changed, 36 insertions(+), 1 deletion(-)

diff --git a/board/aspeed/ast-g5/ast-g5-gpio.h b/board/aspeed/ast-g5/ast-g5-gpio.h
index 54b7388a22..8ccf437346 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 45ecd83fd3..efc3315caf 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
@@ -403,6 +408,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 +479,12 @@ 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 (is_mfg_mode_phy_req())
+		update_bootargs_cmd("special", "mfg");
+	else
+		update_bootargs_cmd("special", NULL);
 }
 
 static void pwm_init(void)