From c65ffbb853be7999cc24220c66da79e3ade4e857 Mon Sep 17 00:00:00 2001 From: Mary Ruthven Date: Thu, 13 Apr 2023 15:21:41 -0500 Subject: virtual_nvmem: add virtual nvmem factory_config support Add support for reading the factory config from virtual nvmem. This change uses the same index as ti50 --index=0x3fff06. There are two indices that are reserved, but not implemented for cr50. This change registers a REGISTER_DEPRECATED_CONFIG for VIRTUAL_NV_INDEX_RMA_BYTES and VIRTUAL_NV_INDEX_WV_UDS_BYTES. BUG=b:278118981,b:214065944 TEST=manual Set the factory config to 0xface Read the config from virtual nvmem tpm_manager_client read_space --index=0x3fff06 --file=/tmp/contents INFO tpm_manager_client: [main.cc(595)] ... result: NVRAM_RESULT_SUCCESS data: CEFA000000000000 } RMA_BYTES and the WV_UDS_BYTES index still return nothing tpm_manager_client read_space --index=0x3fff04 --file=/tmp/contents INFO tpm_manager_client: [main.cc(595)] ... result: NVRAM_RESULT_SUCCESS data: } tpm_manager_client read_space --index=0x3fff05 --file=/tmp/contents INFO tpm_manager_client: [main.cc(595)] ... result: NVRAM_RESULT_SUCCESS data: } Change-Id: I651f00851b1e60fe0f898fd75111be27b2bf497e Signed-off-by: Mary Ruthven Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/4424877 Reviewed-by: Vadim Bendebury --- board/cr50/tpm2/virtual_nvmem.c | 19 +++++++++++++++++++ board/cr50/tpm2/virtual_nvmem.h | 5 ++++- chip/g/factory_config.c | 2 +- chip/g/factory_config.h | 7 +++++++ 4 files changed, 31 insertions(+), 2 deletions(-) diff --git a/board/cr50/tpm2/virtual_nvmem.c b/board/cr50/tpm2/virtual_nvmem.c index 1eb00e5daa..e2a0b963c7 100644 --- a/board/cr50/tpm2/virtual_nvmem.c +++ b/board/cr50/tpm2/virtual_nvmem.c @@ -10,6 +10,7 @@ #include "board_id.h" #include "console.h" #include "dcrypto.h" +#include "factory_config.h" #include "link_defs.h" #include "rma_auth.h" #include "sn_bits.h" @@ -320,6 +321,18 @@ static void GetRSUDevID(BYTE *to, size_t offset, size_t size) } BUILD_ASSERT(VIRTUAL_NV_INDEX_RSU_DEV_ID_SIZE == SHA256_DIGEST_SIZE); +static void GetFactoryCfg(BYTE *to, size_t offset, size_t size) +{ + uint64_t fc; + + if (read_factory_config(&fc) != EC_SUCCESS) { + memset(to, 0, size); + return; + } + memcpy(to, ((BYTE *)&fc) + offset, size); +} +BUILD_ASSERT(VIRTUAL_NV_INDEX_FACTORY_CONFIG_SIZE == INFO_FACTORY_CFG_SIZE); + /* * Registration of current virtual indexes. * @@ -344,6 +357,12 @@ static const struct virtual_nv_index_cfg index_config[] = { REGISTER_CONFIG(VIRTUAL_NV_INDEX_RSU_DEV_ID, VIRTUAL_NV_INDEX_RSU_DEV_ID_SIZE, GetRSUDevID) + /* TODO(b/278118981): implement get RMA BYTES and WV UDS */ + REGISTER_DEPRECATED_CONFIG(VIRTUAL_NV_INDEX_RMA_BYTES_UNIMPLEMENTED) + REGISTER_DEPRECATED_CONFIG(VIRTUAL_NV_INDEX_WV_UDS_BYTES_UNIMPLEMENTED) + REGISTER_CONFIG(VIRTUAL_NV_INDEX_FACTORY_CONFIG, + VIRTUAL_NV_INDEX_FACTORY_CONFIG_SIZE, + GetFactoryCfg) }; /* Check validity check of above config. */ diff --git a/board/cr50/tpm2/virtual_nvmem.h b/board/cr50/tpm2/virtual_nvmem.h index 75fc24db06..f8b9f46169 100644 --- a/board/cr50/tpm2/virtual_nvmem.h +++ b/board/cr50/tpm2/virtual_nvmem.h @@ -27,7 +27,9 @@ enum virtual_nv_index { VIRTUAL_NV_INDEX_RSU_DEV_ID, /* Reserved for generic TPM2.0 stand-alone counter. */ /* TODO(b/191163997): support reading RMA bytes via this index. */ - /* VIRTUAL_NV_INDEX_RMA_BYTES = 0x013fff04, */ + VIRTUAL_NV_INDEX_RMA_BYTES_UNIMPLEMENTED, + VIRTUAL_NV_INDEX_WV_UDS_BYTES_UNIMPLEMENTED, + VIRTUAL_NV_INDEX_FACTORY_CONFIG, VIRTUAL_NV_INDEX_END, }; /* Reserved space for future virtual indexes; this is the last valid index. */ @@ -40,5 +42,6 @@ enum virtual_nv_index { #define VIRTUAL_NV_INDEX_SN_DATA_SIZE 16 #define VIRTUAL_NV_INDEX_G2F_CERT_SIZE 315 #define VIRTUAL_NV_INDEX_RSU_DEV_ID_SIZE 32 +#define VIRTUAL_NV_INDEX_FACTORY_CONFIG_SIZE INFO_FACTORY_CFG_SIZE #endif /* __EC_BOARD_CR50_TPM2_VIRTUAL_NVMEM_H */ diff --git a/chip/g/factory_config.c b/chip/g/factory_config.c index 4e30b79e8c..8ead8dae67 100644 --- a/chip/g/factory_config.c +++ b/chip/g/factory_config.c @@ -25,7 +25,7 @@ static int factory_config_is_blank(uint64_t fc) * @return EC_SUCCESS or an error code in cases of various failures to read the * flash space. */ -static int read_factory_config(uint64_t *fc) +int read_factory_config(uint64_t *fc) { uint32_t *fc_p; int i; diff --git a/chip/g/factory_config.h b/chip/g/factory_config.h index 26345c1eb9..4f0de5fc3a 100644 --- a/chip/g/factory_config.h +++ b/chip/g/factory_config.h @@ -13,4 +13,11 @@ */ void print_factory_config(void); +/** + * Read the INFO1 factory config value into fc. + * + * @return EC_SUCCESS or an error code in cases of various failures to read the + * flash space. + */ +int read_factory_config(uint64_t *fc); #endif /* ! __EC_CHIP_G_FACTORY_CONFIG_H */ -- cgit v1.2.1