From f5c49a72d38eb141511adfeb2f89b4ba20d1f1fb Mon Sep 17 00:00:00 2001 From: Rob Barnes Date: Wed, 19 May 2021 14:24:39 -0600 Subject: guybrush: Add CBI utility functions Add CBI utility functions. All values are cached. cbi_init prints the values and initializes the cache. Each function will also opportunistically initialize the cache in case it's accessed before cbi_init. BUG=None TEST=Boot guybrush, see CBI values printed BRANCH=None Signed-off-by: Rob Barnes Change-Id: I3e21a6792f4f0897019872201b2392f634c134ef Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2906313 Commit-Queue: Diana Z Reviewed-by: Diana Z --- baseboard/guybrush/baseboard.c | 14 ------ baseboard/guybrush/baseboard.h | 7 +++ baseboard/guybrush/build.mk | 3 +- baseboard/guybrush/cbi.c | 96 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 105 insertions(+), 15 deletions(-) create mode 100644 baseboard/guybrush/cbi.c (limited to 'baseboard') diff --git a/baseboard/guybrush/baseboard.c b/baseboard/guybrush/baseboard.c index 564133c55f..4a370143b7 100644 --- a/baseboard/guybrush/baseboard.c +++ b/baseboard/guybrush/baseboard.c @@ -956,17 +956,3 @@ void baseboard_en_pwr_s0(enum gpio_signal signal) /* Now chain off to the normal power signal interrupt handler. */ power_signal_interrupt(signal); } - -int get_fw_config_field(uint8_t offset, uint8_t width) -{ - static uint32_t cached_fw_config = UNINITIALIZED_FW_CONFIG; - - if (cached_fw_config == UNINITIALIZED_FW_CONFIG) { - uint32_t val; - - if (cbi_get_fw_config(&val) != EC_SUCCESS) - return -1; - cached_fw_config = val; - } - return (cached_fw_config >> offset) & ((1 << width) - 1); -} diff --git a/baseboard/guybrush/baseboard.h b/baseboard/guybrush/baseboard.h index aaaa7f895f..84a65e8508 100644 --- a/baseboard/guybrush/baseboard.h +++ b/baseboard/guybrush/baseboard.h @@ -348,6 +348,13 @@ void sbu_fault_interrupt(enum ioex_signal signal); void baseboard_en_pwr_pcore_s0(enum gpio_signal signal); void baseboard_en_pwr_s0(enum gpio_signal signal); +/* CBI utility functions */ +uint32_t get_sku_id(void); +uint32_t get_board_version(void); +uint32_t get_fw_config(void); +/* Board callback after CBI has been initialized */ +__overridable void board_cbi_init(void); + #endif /* !__ASSEMBLER__ */ #endif /* __CROS_EC_BASEBOARD_H */ diff --git a/baseboard/guybrush/build.mk b/baseboard/guybrush/build.mk index e1ccef48d9..d6849d3029 100644 --- a/baseboard/guybrush/build.mk +++ b/baseboard/guybrush/build.mk @@ -11,4 +11,5 @@ CHIP_FAMILY:=npcx9 CHIP_VARIANT:=npcx9m3f baseboard-y=baseboard.o -baseboard-$(CONFIG_USB_POWER_DELIVERY)+=usb_pd_policy.o \ No newline at end of file +baseboard-$(CONFIG_USB_POWER_DELIVERY)+=usb_pd_policy.o +baseboard-$(CONFIG_CROS_BOARD_INFO)+=cbi.o \ No newline at end of file diff --git a/baseboard/guybrush/cbi.c b/baseboard/guybrush/cbi.c new file mode 100644 index 0000000000..6d66b826dc --- /dev/null +++ b/baseboard/guybrush/cbi.c @@ -0,0 +1,96 @@ +/* Copyright 2021 The Chromium OS Authors. All rights reserved. + * Use of this source code is governed by a BSD-style license that can be + * found in the LICENSE file. + */ + +/* Guybrush CrOS Board Info(CBI) utilities */ + +#include "base_fw_config.h" +#include "console.h" +#include "common.h" +#include "cros_board_info.h" +#include "hooks.h" + +uint32_t get_sku_id(void) +{ + static uint32_t sku_id; + + if (sku_id == 0) { + uint32_t val; + + if (cbi_get_sku_id(&val) != EC_SUCCESS) + return 0; + sku_id = val; + } + return sku_id; +} + +uint32_t get_board_version(void) +{ + static uint32_t board_version; + + if (board_version == 0) { + uint32_t val; + + if (cbi_get_board_version(&val) != EC_SUCCESS) + return -1; + board_version = val; + } + return board_version; +} + +uint32_t get_fw_config(void) +{ + static uint32_t fw_config = UNINITIALIZED_FW_CONFIG; + + if (fw_config == UNINITIALIZED_FW_CONFIG) { + uint32_t val; + + if (cbi_get_fw_config(&val) != EC_SUCCESS) + return UNINITIALIZED_FW_CONFIG; + fw_config = val; + } + return fw_config; +} + + +int get_fw_config_field(uint8_t offset, uint8_t width) +{ + uint32_t fw_config = get_fw_config(); + + if (fw_config == UNINITIALIZED_FW_CONFIG) + return -1; + + return (fw_config >> offset) & ((1 << width) - 1); +} + + +__overridable void board_cbi_init(void) +{ +} + +static void cbi_init(void) +{ + uint32_t board_ver = get_board_version(); + uint32_t sku_id = get_sku_id(); + uint32_t fw_config = get_fw_config(); + + if (board_ver != 0) + ccprints("Board Version: %d (0x%x)", board_ver, board_ver); + else + ccprints("Board Version: not set in cbi"); + + if (sku_id != 0) + ccprints("SKU ID: %d (0x%x)", sku_id, sku_id); + else + ccprints("SKU ID: not set in cbi"); + + if (fw_config != UNINITIALIZED_FW_CONFIG) + ccprints("FW Config: %d (0x%x)", fw_config, fw_config); + else + ccprints("FW Config: not set in cbi"); + + /* Allow the board project to make runtime changes based on CBI data */ + board_cbi_init(); +} +DECLARE_HOOK(HOOK_INIT, cbi_init, HOOK_PRIO_INIT_I2C + 1); -- cgit v1.2.1