From b6f898ef15eede75700e9e13a8e0b69d88b12fd4 Mon Sep 17 00:00:00 2001 From: AppaRao Puli Date: Thu, 20 Jun 2019 18:11:43 +0530 Subject: [PATCH 15/30] 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 Signed-off-by: AppaRao Puli %% original patch: 0025-Manufacturing-mode-physical-presence-detection.patch --- 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) -- 2.17.1