cros_ec: Add support for reading the SKU ID

This allows reading strapping pins attached to the EC. Add an
implementation for this.

Signed-off-by: Simon Glass <sjg@chromium.org>
This commit is contained in:
Simon Glass 2021-01-16 14:52:25 -07:00
parent 698e30f7a8
commit 7791df576c
5 changed files with 55 additions and 0 deletions

View File

@ -352,6 +352,15 @@ static int do_cros_ec(struct cmd_tbl *cmdtp, int flag, int argc,
debug("%s: Could not access LDO%d\n", __func__, index);
return ret;
}
} else if (!strcmp("sku", cmd)) {
ret = cros_ec_get_sku_id(dev);
if (ret >= 0) {
printf("%d\n", ret);
ret = 0;
} else {
printf("Error: %d\n", ret);
}
} else {
return CMD_RET_USAGE;
}
@ -382,6 +391,7 @@ U_BOOT_CMD(
"crosec write <ro|rw> <addr> [<size>] Write EC image\n"
"crosec vbnvcontext [hexstring] Read [write] VbNvContext from EC\n"
"crosec ldo <idx> [<state>] Switch/Read LDO state\n"
"crosec sku Read board SKU ID\n"
"crosec test run tests on cros_ec\n"
"crosec version Read CROS-EC version"
);

View File

@ -1105,6 +1105,19 @@ int cros_ec_flash_update_rw(struct udevice *dev, const uint8_t *image,
return 0;
}
int cros_ec_get_sku_id(struct udevice *dev)
{
struct ec_sku_id_info *r;
int ret;
ret = ec_command_inptr(dev, EC_CMD_GET_SKU_ID, 0, NULL, 0,
(uint8_t **)&r, sizeof(*r));
if (ret != sizeof(*r))
return -ret;
return r->sku_id;
}
int cros_ec_read_nvdata(struct udevice *dev, uint8_t *block, int size)
{
struct ec_params_vbnvcontext p;

View File

@ -473,6 +473,13 @@ static int process_cmd(struct ec_state *ec,
len = sizeof(*resp);
break;
}
case EC_CMD_GET_SKU_ID: {
struct ec_sku_id_info *resp = resp_data;
resp->sku_id = 1234;
len = sizeof(*resp);
break;
}
default:
printf(" ** Unknown EC command %#02x\n", req_hdr->command);
return -1;

View File

@ -329,6 +329,14 @@ int cros_ec_flash_write(struct udevice *dev, const uint8_t *data,
int cros_ec_flash_offset(struct udevice *dev, enum ec_flash_region region,
uint32_t *offset, uint32_t *size);
/**
* cros_ec_get_sku_id() - Read the SKU ID
*
* @dev: CROS-EC device
* return SKU ID, or -ve on error
*/
int cros_ec_get_sku_id(struct udevice *dev);
/**
* Read/write non-volatile data from/to a CROS-EC device.
*

View File

@ -30,3 +30,20 @@ static int dm_test_cros_ec_hello(struct unit_test_state *uts)
return 0;
}
DM_TEST(dm_test_cros_ec_hello, UT_TESTF_SCAN_FDT);
static int dm_test_cros_ec_sku_id(struct unit_test_state *uts)
{
struct udevice *dev;
ut_assertok(uclass_first_device_err(UCLASS_CROS_EC, &dev));
ut_asserteq(1234, cros_ec_get_sku_id(dev));
/* try the command */
console_record_reset();
ut_assertok(run_command("crosec sku", 0));
ut_assert_nextline("1234");
ut_assert_console_end();
return 0;
}
DM_TEST(dm_test_cros_ec_sku_id, UT_TESTF_SCAN_FDT);