diff options
author | Aaron Durbin <adurbin@chromium.org> | 2018-08-07 11:29:28 -0600 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-08-08 13:45:46 -0700 |
commit | 6ece66961c1ea17f7f6868c41cc553b794623bb4 (patch) | |
tree | e6467333360405fc8ece28346bedc4695abb80f9 /util/ectool.c | |
parent | b80693e94e6e9aa0a382c39c20efba6f2c7403a9 (diff) | |
download | chrome-ec-6ece66961c1ea17f7f6868c41cc553b794623bb4.tar.gz |
Add DRAM part number support to CBI
Allow one to encode the DRAM part number in CBI. Both cbi-util and
ectool are updated.
$ cbi-util
create --file ~/cbi_image --board_version 0 --oem_id 6 --sku_id 255 --dram_part_num "012345679abcdef" --size 256
CBI image is created successfully
$ hexdump -C ~/cbi_image
00000000 43 42 49 47 00 00 23 00 00 01 00 01 01 06 02 01 |CBIG..#.........|
00000010 ff 03 10 30 31 32 33 34 35 36 37 39 61 62 63 64 |...012345679abcd|
00000020 65 66 00 ff ff ff ff ff ff ff ff ff ff ff ff ff |ef..............|
00000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................|
*
00000100
$ cbi-util show --file ~/cbi_image
CBI image: /home/adurbin/cbi_image
TOTAL_SIZE: 35
Data Field: name: value (hex, tag, size)
BOARD_VERSION: 0 (0x0, 0, 1)
OEM_ID: 6 (0x6, 1, 1)
SKU_ID: 255 (0xff, 2, 1)
DRAM_PART_NUM: 012345679abcdef (3, 16)
Data validated successfully
localhost /tmp # ./ectool cbi set 0 0 1 2
localhost /tmp # ./ectool cbi set 1 6 1 1
localhost /tmp # ./ectool cbi set 2 255 1 1
localhost /tmp # ./ectool cbi set 3 H9HCNNNBPUMLHR 0 0
localhost /tmp # ./ectool cbi get 0
As integer: 0 (0x0)
As binary: 00
localhost /tmp # ./ectool cbi get 1
As integer: 6 (0x6)
As binary: 06
localhost /tmp # ./ectool cbi get 2
As integer: 255 (0xff)
As binary: ff
localhost /tmp # ./ectool cbi get 3
H9HCNNNBPUMLHR
BUG=b:112203105
BRANCH=None
TEST=Commands executed above.
Change-Id: I2d519ad16a158db4e624d3a03912434d0e8fdd73
Signed-off-by: Aaron Durbin <adurbin@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1165622
Reviewed-by: Furquan Shaikh <furquan@chromium.org>
Reviewed-by: Jett Rink <jettrink@chromium.org>
Diffstat (limited to 'util/ectool.c')
-rw-r--r-- | util/ectool.c | 53 |
1 files changed, 36 insertions, 17 deletions
diff --git a/util/ectool.c b/util/ectool.c index 669cd09499..2af028b3ca 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -6613,8 +6613,9 @@ static void cmd_cbi_help(char *cmd) " 0: BOARD_VERSION\n" " 1: OEM_ID\n" " 2: SKU_ID\n" + " 3: DRAM_PART_NUM\n" " <size> is the size of the data in byte\n" - " <value> is integer to be set. No raw data support yet.\n" + " <value> is integer to be set, string for DRAM_PART_NUM\n" " [get_flag] is combination of:\n" " 01b: Invalidate cache and reload data from EEPROM\n" " [set_flag] is combination of:\n" @@ -6669,19 +6670,24 @@ static int cmd_cbi(int argc, char *argv[]) return -1; } r = ec_inbuf; - if (rv <= sizeof(uint32_t)) - printf("As integer: %u (0x%x)\n", r[0], r[0]); - printf("As binary:"); - for (i = 0; i < rv; i++) { - if (i % 32 == 31) - printf("\n"); - printf(" %02x", r[i]); + if (tag != CBI_TAG_DRAM_PART_NUM) { + if (rv <= sizeof(uint32_t)) + printf("As integer: %u (0x%x)\n", r[0], r[0]); + printf("As binary:"); + for (i = 0; i < rv; i++) { + if (i % 32 == 31) + printf("\n"); + printf(" %02x", r[i]); + } + } else { + printf("%.*s", rv, (const char *)r); } printf("\n"); return 0; } else if (!strcasecmp(argv[1], "set")) { struct ec_params_set_cbi *p = (struct ec_params_set_cbi *)ec_outbuf; + void *val_ptr; uint32_t val; uint8_t size; if (argc < 5) { @@ -6691,19 +6697,32 @@ static int cmd_cbi(int argc, char *argv[]) } memset(p, 0, ec_max_outsize); p->tag = tag; - val = strtol(argv[3], &e, 0); - if (e && *e) { - fprintf(stderr, "Bad value\n"); - return -1; + + if (tag != CBI_TAG_DRAM_PART_NUM) { + val = strtol(argv[3], &e, 0); + if (e && *e) { + fprintf(stderr, "Bad value\n"); + return -1; + } + size = strtol(argv[4], &e, 0); + if ((e && *e) || size < 1 || 4 < size || + val >= (1ull << size*8)) { + fprintf(stderr, "Bad size: %d\n", size); + return -1; + } + val_ptr = &val; + } else { + val_ptr = argv[3]; + size = strlen(val_ptr) + 1; } - size = strtol(argv[4], &e, 0); - if ((e && *e) || size < 1 || 4 < size || - val >= (1ull << size*8)) { - fprintf(stderr, "Bad size: %d\n", size); + + if (size > ec_max_outsize - sizeof(*p)) { + fprintf(stderr, "Size exceeds parameter buffer: %d\n", + size); return -1; } /* Little endian */ - memcpy(p->data, &val, size); + memcpy(p->data, val_ptr, size); p->size = size; if (argc > 5) { p->flag = strtol(argv[5], &e, 0); |