diff options
author | Marco Chen <marcochen@google.com> | 2020-08-10 12:19:10 +0800 |
---|---|---|
committer | Commit Bot <commit-bot@chromium.org> | 2020-08-13 22:26:17 +0000 |
commit | 0212d4a3ce01452ddaba46f076f90e9a5e90e589 (patch) | |
tree | 9afc036ff84e5807f9bcd7faaf7e94e0bb3f7725 | |
parent | dc7e87f2503eab5ef0f5cf4d66286c52ec647751 (diff) | |
download | chrome-ec-0212d4a3ce01452ddaba46f076f90e9a5e90e589.tar.gz |
cbi: add Second Source Factory Cache (SSFC) CBI field
SSFC field will be leveraged to record what second source is used in the
DUT by probing components in the factory or RMA.
Firmware code should refer to this field to judge what driver should be
configured for a specific component. For example, the board code can
arrange what sensor driver should be set into motion_sensors array if
there are multiple sources of base or lid sensor.
As the definition of FW_CONFIG, it describe which "features" the
firmware code should enable or disable. For example, whether lid / base
sensors should be enabled or not but not care about what second source
is in this DUT.
BRANCH=none
BUG=b:163285687
TEST=call `cbi-util` to create the cbi image with SSFC and show created
content.
TEST=`make buildall -j`
TEST=`make runhosttests -j`
Change-Id: Icb4aa00ae47ab025198e7fd5edd6aab96a4bf53e
Signed-off-by: Marco Chen <marcochen@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2344268
Reviewed-by: Daisuke Nojiri <dnojiri@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Commit-Queue: Jett Rink <jettrink@chromium.org>
-rw-r--r-- | common/cbi.c | 9 | ||||
-rw-r--r-- | include/cros_board_info.h | 4 | ||||
-rw-r--r-- | include/ec_commands.h | 2 | ||||
-rw-r--r-- | test/cbi.c | 4 | ||||
-rw-r--r-- | util/cbi-util.c | 13 | ||||
-rw-r--r-- | util/ectool.c | 1 |
6 files changed, 31 insertions, 2 deletions
diff --git a/common/cbi.c b/common/cbi.c index 6918ad50dd..e30e35aad3 100644 --- a/common/cbi.c +++ b/common/cbi.c @@ -327,6 +327,14 @@ int cbi_get_fw_config(uint32_t *fw_config) &size); } +int cbi_get_ssfc(uint32_t *ssfc) +{ + uint8_t size = sizeof(*ssfc); + + return cbi_get_board_info(CBI_TAG_SSFC, (uint8_t *)ssfc, + &size); +} + int cbi_get_pcb_supplier(uint32_t *pcb_supplier) { uint8_t size = sizeof(*pcb_supplier); @@ -451,6 +459,7 @@ static void dump_cbi(void) print_tag("SKU_ID", cbi_get_sku_id(&val), &val); print_tag("FW_CONFIG", cbi_get_fw_config(&val), &val); print_tag("PCB_SUPPLIER", cbi_get_pcb_supplier(&val), &val); + print_tag("SSFC", cbi_get_ssfc(&val), &val); } static int cc_cbi(int argc, char **argv) diff --git a/include/cros_board_info.h b/include/cros_board_info.h index 57839ba4a5..ed5967b0d6 100644 --- a/include/cros_board_info.h +++ b/include/cros_board_info.h @@ -44,7 +44,8 @@ struct cbi_data { /** * Board info accessors * - * @param version/sku_id/oem_id/id/fw_config [OUT] Data read from EEPROM + * @param version/sku_id/oem_id/id/fw_config/pcb_supplier/ssfc [OUT] Data read + * from EEPROM * @return EC_SUCCESS on success or EC_ERROR_* otherwise. * EC_ERROR_BUSY to indicate data is not ready. */ @@ -54,6 +55,7 @@ int cbi_get_oem_id(uint32_t *oem_id); int cbi_get_model_id(uint32_t *id); int cbi_get_fw_config(uint32_t *fw_config); int cbi_get_pcb_supplier(uint32_t *pcb_supplier); +int cbi_get_ssfc(uint32_t *ssfc); /** * Get data from CBI store diff --git a/include/ec_commands.h b/include/ec_commands.h index 49e861b151..b9ef3f08ff 100644 --- a/include/ec_commands.h +++ b/include/ec_commands.h @@ -5734,6 +5734,8 @@ enum cbi_data_tag { CBI_TAG_MODEL_ID = 5, /* uint32_t or smaller */ CBI_TAG_FW_CONFIG = 6, /* uint32_t bit field */ CBI_TAG_PCB_SUPPLIER = 7, /* uint32_t or smaller */ + /* Second Source Factory Cache */ + CBI_TAG_SSFC = 8, /* uint32_t bit field */ CBI_TAG_COUNT, }; diff --git a/test/cbi.c b/test/cbi.c index df57febb6f..936dc204b8 100644 --- a/test/cbi.c +++ b/test/cbi.c @@ -140,6 +140,8 @@ static int test_all_tags(void) == EC_SUCCESS); TEST_ASSERT(cbi_set_board_info(CBI_TAG_PCB_SUPPLIER, &d8, sizeof(d8)) == EC_SUCCESS); + TEST_ASSERT(cbi_set_board_info(CBI_TAG_SSFC, &d8, sizeof(d8)) + == EC_SUCCESS); TEST_ASSERT(cbi_get_board_version(&d32) == EC_SUCCESS); TEST_EQ(d32, d8, "0x%x"); TEST_ASSERT(cbi_get_oem_id(&d32) == EC_SUCCESS); @@ -152,6 +154,8 @@ static int test_all_tags(void) TEST_EQ(d32, d8, "0x%x"); TEST_ASSERT(cbi_get_pcb_supplier(&d32) == EC_SUCCESS); TEST_EQ(d32, d8, "0x%x"); + TEST_ASSERT(cbi_get_ssfc(&d32) == EC_SUCCESS); + TEST_EQ(d32, d8, "0x%x"); /* Write protect */ gpio_set_level(GPIO_WP, 1); diff --git a/util/cbi-util.c b/util/cbi-util.c index 06dc909c20..3626b52859 100644 --- a/util/cbi-util.c +++ b/util/cbi-util.c @@ -39,6 +39,7 @@ enum { OPT_MODEL_ID, OPT_FW_CONFIG, OPT_PCB_SUPPLIER, + OPT_SSFC, OPT_SIZE, OPT_ERASE_BYTE, OPT_SHOW_ALL, @@ -55,6 +56,7 @@ static const struct option opts_create[] = { {"model_id", 1, 0, OPT_MODEL_ID}, {"fw_config", 1, 0, OPT_FW_CONFIG}, {"pcb_supplier", 1, 0, OPT_PCB_SUPPLIER}, + {"ssfc", 1, 0, OPT_SSFC}, {"size", 1, 0, OPT_SIZE}, {"erase_byte", 1, 0, OPT_ERASE_BYTE}, {NULL, 0, 0, 0} @@ -76,6 +78,7 @@ static const char *field_name[] = { "MODEL_ID", "FW_CONFIG", "PCB_SUPPLIER", + "SSFC", }; BUILD_ASSERT(ARRAY_SIZE(field_name) == CBI_TAG_COUNT); @@ -97,6 +100,7 @@ const char help_create[] = " --model_id <value> Model ID\n" " --fw_config <value> Firmware configuration bit-field\n" " --pcb_supplier <value> PCB supplier\n" + " --ssfc <value> Second Source Factory Cache bit-field\n" "\n" "<value> must be a positive integer <= 0XFFFFFFFF and field size can\n" " be optionally specified by <value:size> notation: e.g. 0xabcd:4.\n" @@ -256,6 +260,7 @@ static int cmd_create(int argc, char **argv) struct integer_field model; struct integer_field fw_config; struct integer_field pcb_supplier; + struct integer_field ssfc; const char *dram_part_num; const char *oem_name; } bi; @@ -332,6 +337,10 @@ static int cmd_create(int argc, char **argv) if (parse_integer_field(optarg, &bi.pcb_supplier)) return -1; break; + case OPT_SSFC: + if (parse_integer_field(optarg, &bi.ssfc)) + return -1; + break; } } @@ -362,6 +371,7 @@ static int cmd_create(int argc, char **argv) bi.fw_config.size); p = cbi_set_data(p, CBI_TAG_PCB_SUPPLIER, &bi.pcb_supplier.val, bi.pcb_supplier.size); + p = cbi_set_data(p, CBI_TAG_SSFC, &bi.ssfc.val, bi.ssfc.size); p = cbi_set_string(p, CBI_TAG_DRAM_PART_NUM, bi.dram_part_num); p = cbi_set_string(p, CBI_TAG_OEM_NAME, bi.oem_name); @@ -488,9 +498,10 @@ static int cmd_show(int argc, char **argv) print_integer(buf, CBI_TAG_SKU_ID); print_integer(buf, CBI_TAG_MODEL_ID); print_integer(buf, CBI_TAG_FW_CONFIG); + print_integer(buf, CBI_TAG_PCB_SUPPLIER); + print_integer(buf, CBI_TAG_SSFC); print_string(buf, CBI_TAG_DRAM_PART_NUM); print_string(buf, CBI_TAG_OEM_NAME); - print_integer(buf, CBI_TAG_PCB_SUPPLIER); free(buf); diff --git a/util/ectool.c b/util/ectool.c index 0273fa8849..17b72b836c 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -7849,6 +7849,7 @@ static void cmd_cbi_help(char *cmd) " 5: MODEL_ID\n" " 6: FW_CONFIG\n" " 7: PCB_VENDOR\n" + " 8: SSFC\n" " <size> is the size of the data in byte. It should be zero for\n" " string types.\n" " <value/string> is an integer or a string to be set\n" |