ec/google/chromeec: Introduce SKU_ID helpers

The following introduces helpers that, by default,
accommodate a larger SKU id space. The following
is the rational for that:

 Allow INT32_MAX SKU id encodings beyond UINT8_MAX.
 This allows for the SKU id to accommodate up to 4 bytes
 however we reserve the highest bit for SKU_UNKNOWN to be encoded.

However, the legacy UINT8_MAX encoding is supported by leveraging
the Kconfig by overriding it with the legacy max of 0xff.

Follow ups migrate boards to this common framework.

V.2: Fixup array size && drop sku_id SKU_UNKNOWN check and pass
     whatever is set to userspace as firmware doesn't care about
     the value.
V.3: Use SPDX-License header.

BUG=b:149348474
BRANCH=none
TEST=tested on hatch.

Change-Id: I805b25465a3b4ee3dc0cbda5feb9e9ea2493ff9e
Signed-off-by: Edward O'Callaghan <quasisec@google.com>
Reviewed-on: https://review.coreboot.org/c/coreboot/+/39018
Tested-by: build bot (Jenkins) <no-reply@coreboot.org>
Reviewed-by: Furquan Shaikh <furquan@google.com>
This commit is contained in:
Edward O'Callaghan 2020-02-20 13:38:49 +11:00 committed by Edward O'Callaghan
parent a5f8b8c806
commit 9ed10bff31
4 changed files with 47 additions and 0 deletions

View File

@ -100,6 +100,11 @@ config EC_GOOGLE_CHROMEEC_SPI_CHIP
hex
default 0x0
config EC_GOOGLE_CHROMEEC_SKUID
def_bool n
help
Provides common routine for reporting the skuid to ChromeOS.
config EC_GOOGLE_CHROMEEC_BOARDNAME
depends on EC_GOOGLE_CHROMEEC
string "Chrome EC board name for EC"

View File

@ -6,6 +6,9 @@ romstage-$(CONFIG_EC_GOOGLE_CHROMEEC_BOARDID) += ec_boardid.c
ramstage-$(CONFIG_EC_GOOGLE_CHROMEEC_BOARDID) += ec_boardid.c
smm-$(CONFIG_EC_GOOGLE_CHROMEEC_BOARDID) += ec_boardid.c
romstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SKUID) += ec_skuid.c
ramstage-$(CONFIG_EC_GOOGLE_CHROMEEC_SKUID) += ec_skuid.c
bootblock-y += ec.c
bootblock-$(CONFIG_EC_GOOGLE_CHROMEEC_LPC) += ec_lpc.c
ramstage-y += ec.c crosec_proto.c vstore.c

View File

@ -89,6 +89,9 @@ int google_chromeec_cbi_get_fw_config(uint32_t *fw_config);
int google_chromeec_cbi_get_dram_part_num(char *buf, size_t bufsize);
int google_chromeec_cbi_get_oem_name(char *buf, size_t bufsize);
uint32_t google_chromeec_get_board_sku(void);
const char *google_chromeec_smbios_system_sku(void);
/* MEC uses 0x800/0x804 as register/index pair, thus an 8-byte resource. */
#define MEC_EMI_BASE 0x800
#define MEC_EMI_SIZE 8

View File

@ -0,0 +1,36 @@
/*
* This file is part of the coreboot project.
*
* Copyright 2020 The coreboot project Authors.
*
* SPDX-License-Identifier: GPL-2.0-or-later
*/
#include <stddef.h>
#include <boardid.h>
#include <ec/google/chromeec/ec.h>
#include <console/console.h>
#include <string.h>
#define SKU_UNKNOWN 0xFFFFFFFF
uint32_t google_chromeec_get_board_sku(void)
{
MAYBE_STATIC_NONZERO uint32_t sku_id = SKU_UNKNOWN;
if (sku_id != SKU_UNKNOWN)
return sku_id;
if (google_chromeec_cbi_get_sku_id(&sku_id))
sku_id = SKU_UNKNOWN;
return sku_id;
}
const char *google_chromeec_smbios_system_sku(void)
{
static char sku_str[14]; /* sku{0..2147483647} */
uint32_t sku_id = google_chromeec_get_board_sku();
snprintf(sku_str, sizeof(sku_str), "sku%u", sku_id);
return sku_str;
}