From f38daf612e9bd788791191dfd17940d757d303fa Mon Sep 17 00:00:00 2001 From: Mary Ruthven Date: Thu, 1 Apr 2021 07:40:30 +1100 Subject: add 'atboot' arg to rddkeepalive Add 'atboot' arg to rddkeepalive that can be used to store rddkeepalive across cr50 resets. The atboot flag gets cleared with rddkeepalive disable. BUG=b:144724216 TEST=manual # Verify 'rddkeepalive disable' is unchanged rddkeepalive disable Using actual Rdd state rddkeepalive Rdd: connected # Verify 'rddkeepalive enable' is unchanged rddkeepalive enable Forcing Rdd detect keepalive rddkeepalive Rdd: keepalive # Verify 'rddkeepalive disable' disables keepalive rddkeepalive disable Using actual Rdd state rddkeepalive Rdd: connected ccd ... Flags: 0x000000 # Verify 'rddkeepalive enable atboot' enables keepalive and sets # the atboot flag. rddkeepalive enable atboot Forcing Rdd detect keepalive atboot. rddkeepalive Rdd: keepalive (atboot) # check the ccd rddkeepalive atboot flag (0x80000) ccd ... Flags: 0x080000 reboot ... rddkeepalive Rdd: keepalive (atboot) ccd ... Flags: 0x080000 # Verify this new string doesn't break dut-control dut-control cr50.ccd_keepalive_en ccd_keepalive_en:on # 'rddkeepalive enable' doesn't touch the atboot flag rddkeepalive enable Forcing Rdd detect keepalive rddkeepalive Rdd: keepalive (atboot) # 'rddkeepalive disable' clears it. rddkeepalive disable Using actual Rdd state rddkeepalive Rdd: connected Change-Id: I10227e335a5de6ed73290ff5be2e65892913de35 Signed-off-by: Mary Ruthven Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2799441 Reviewed-by: Namyoon Woo --- board/cr50/board.c | 1 + chip/g/rdd.c | 25 +++++++++++++++++++++---- common/ccd_config.c | 1 + include/ccd_config.h | 3 +++ 4 files changed, 26 insertions(+), 4 deletions(-) diff --git a/board/cr50/board.c b/board/cr50/board.c index 4dc20f8b8c..047613969a 100644 --- a/board/cr50/board.c +++ b/board/cr50/board.c @@ -849,6 +849,7 @@ static void board_init(void) * used for battery cutoff software support on detachable devices. */ init_ac_detect(); + /* Reads ccd_flag. Must be done after ccd_config_init. */ init_rdd_state(); /* Initialize write protect. Must be after CCD config init. */ diff --git a/chip/g/rdd.c b/chip/g/rdd.c index 4e17cab29a..140414ec3b 100644 --- a/chip/g/rdd.c +++ b/chip/g/rdd.c @@ -3,6 +3,7 @@ * found in the LICENSE file. */ +#include "ccd_config.h" #include "clock.h" #include "console.h" #include "gpio.h" @@ -54,8 +55,10 @@ uint8_t rdd_is_detected(void) void print_rdd_state(void) { - ccprintf("Rdd: %s\n", - force_detected ? "keepalive" : device_state_name(state)); + ccprintf("Rdd: %s%s\n", + force_detected ? "keepalive" : device_state_name(state), + ccd_get_flag(CCD_FLAG_RDDKEEPALIVE_AT_BOOT) ? " (atboot)" : + ""); } /** @@ -205,6 +208,12 @@ void init_rdd_state(void) task_enable_irq(GC_IRQNUM_RDD0_INTR_DEBUG_STATE_DETECTED_INT); GWRITE_FIELD(RDD, INT_STATE, INTR_DEBUG_STATE_DETECTED, 1); GWRITE_FIELD(RDD, INT_ENABLE, INTR_DEBUG_STATE_DETECTED, 1); + + /* Restore the rddkeepalive atboot state from the ccd flags. */ + force_detected = ccd_get_flag(CCD_FLAG_RDDKEEPALIVE_AT_BOOT); + + if (force_detected) + hook_call_deferred(&rdd_connect_data, 0); } static int command_rdd_keepalive(int argc, char **argv) @@ -219,15 +228,23 @@ static int command_rdd_keepalive(int argc, char **argv) if (force_detected) { /* Force Rdd detect */ - ccprintf("Forcing Rdd detect keepalive\n"); + ccprintf("Forcing Rdd detect keepalive"); + + if (argc > 2 && !strcasecmp(argv[2], "atboot")) { + /* Change rddkeeplalive at boot to match */ + ccprintf(" atboot"); + ccd_set_flag(CCD_FLAG_RDDKEEPALIVE_AT_BOOT, 1); + } + ccprintf("\n"); hook_call_deferred(&rdd_connect_data, 0); } else { /* Go back to actual hardware state */ ccprintf("Using actual Rdd state\n"); + ccd_set_flag(CCD_FLAG_RDDKEEPALIVE_AT_BOOT, 0); } return EC_SUCCESS; } DECLARE_SAFE_CONSOLE_COMMAND(rddkeepalive, command_rdd_keepalive, - "[BOOLEAN]", + "[BOOLEAN] [atboot]", "Get Rdd state or force keepalive"); diff --git a/common/ccd_config.c b/common/ccd_config.c index f83789a26f..5d9907a4b4 100644 --- a/common/ccd_config.c +++ b/common/ccd_config.c @@ -95,6 +95,7 @@ static const uint8_t k_ccd_config = NVMEM_VAR_CCD_CONFIG; /* Flags which can be set via ccd_set_flag() */ static const uint32_t k_public_flags = + CCD_FLAG_RDDKEEPALIVE_AT_BOOT | CCD_FLAG_OVERRIDE_WP_AT_BOOT | CCD_FLAG_OVERRIDE_WP_STATE_ENABLED | CCD_FLAG_OVERRIDE_BATT_AT_BOOT | diff --git a/include/ccd_config.h b/include/ccd_config.h index a3d4410244..60abe472e9 100644 --- a/include/ccd_config.h +++ b/include/ccd_config.h @@ -54,6 +54,9 @@ enum ccd_flag { * in ccd_config.c. */ + /* Enable Rddkeepalive at boot */ + CCD_FLAG_RDDKEEPALIVE_AT_BOOT = BIT(19), + /* Override BATT_PRES_L at boot */ CCD_FLAG_OVERRIDE_BATT_AT_BOOT = BIT(20), -- cgit v1.2.1