From b835c2feb06e72b48ef82845e114bb8af5d7145e Mon Sep 17 00:00:00 2001 From: "Thejaswani Puta thejaswani.putta@intel.com" Date: Wed, 20 Jan 2021 15:22:01 -0800 Subject: CBI: Add rework_id field This field will be used to describe all the reworks performed on a board which includes the mandatory, optional and feature reworks. Also modified existing command handlers under ectool and cbi-util tool to support 64 bit length data. Includes build fix for targets where long int is not 64 bits. BUG: b:170385859 BUILD TEST: make BOARD= -j; make runfuzztests make runhosttests setup_board, cros_workon & emerge-<32-bit target> ec-utils TEST: ./cbi-util create --file ~/cbi_image --board_version 1 --oem_id 2 --sku_id 255 --dram_part_num "01654329efghac" --model_id 15 --rework_id 123456789123456712 --size 256 CBI image is created successfully TEST: ./cbi-util show --file ~/cbi_image CBI image: /home/thejaswani/cbi_image TOTAL_SIZE: 47 Data Field: name: value (hex, tag, size) BOARD_VERSION: 1 (0x1, 0, 1) OEM_ID: 2 (0x2, 1, 1) SKU_ID: 255 (0xff, 2, 1) MODEL_ID: 15 (0xf, 5, 1) REWORK_ID: 123456789123456712 (0x1b69b4bacd05ec8, 9, 8) DRAM_PART_NUM: 01654329efghac (3, 15) Data validated successfully TEST: hexdump -C ~/cbi_image 00000000 43 42 49 1e 00 00 2f 00 00 01 01 01 01 02 02 01 |CBI.../.........| 00000010 ff 05 01 0f 09 08 c8 5e d0 ac 4b 9b b6 01 03 0f |.......^..K.....| 00000020 30 31 36 35 34 33 32 39 65 66 67 68 61 63 00 ff |01654329efghac..| 00000030 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| * 00000100 TEST: localhost ~ # ectool cbi set 9 98765432 8 localhost ~ # ectool cbi get 9 As uint: 98765432 (0x5e30a78) As binary: 78 0a e3 05 00 00 00 00 localhost ~ # ectool cbi set 9 123456789123456712 8 localhost ~ # ectool cbi get 9 As uint: 123456789123456712 (0x1b69b4bacd05ec8) As binary: c8 5e d0 ac 4b 9b b6 01 localhost ~ # ectool cbi set 9 1234 2 localhost ~ # ectool cbi get 9 As uint: 1234 (0x4d2) As binary: d2 04 TEST: > cbi(from EC Console) 2021-01-19 20:59:56 [80.979692 CBI Reading board info] 2021-01-19 20:59:56 CBI_VERSION: 0x0000 2021-01-19 20:59:56 TOTAL_SIZE: 54 2021-01-19 20:59:56 BOARD_VERSION: 1 (0x1) 2021-01-19 20:59:56 OEM_ID: (Error 1) 2021-01-19 20:59:56 MODEL_ID: (Error 1) 2021-01-19 20:59:56 SKU_ID: 655361 (0xa0001) 2021-01-19 20:59:56 FW_CONFIG: 199683 (0x30c03) 2021-01-19 20:59:56 PCB_SUPPLIER: (Error 1) 2021-01-19 20:59:56 SSFC: (Error 1) 2021-01-19 20:59:56 REWORK_ID: 1234 (0x4d2) 2021-01-19 20:59:56 43 42 49 8c 00 00 36 00 00 01 01 02 04 01 00 0a |CBI...6.........| 2021-01-19 20:59:56 00 06 04 03 0c 03 00 03 19 4d 54 35 33 45 35 31 |.........MT53E51| 2021-01-19 20:59:56 32 4d 36 34 44 34 4e 57 2d 30 34 36 20 57 54 3a |2M64D4NW-046 WT:| 2021-01-19 20:59:56 45 00 09 02 d2 04 ff ff ff ff ff 7f ff ff ff ff |E...............| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2020-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| 2021-01-19 20:59:56 ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff ff |................| Signed-off-by: Thejaswani Puta Change-Id: I073a119d43c94cd266503a0fc972a62134b3385f Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2693746 Tested-by: Thejaswani Putta Commit-Queue: Thejaswani Putta Reviewed-by: Peter Marheine Reviewed-by: Daisuke Nojiri --- util/ectool.c | 41 +++++++++++++++++++++++++++-------------- 1 file changed, 27 insertions(+), 14 deletions(-) (limited to 'util/ectool.c') diff --git a/util/ectool.c b/util/ectool.c index a5d156129d..a85166ebe7 100644 --- a/util/ectool.c +++ b/util/ectool.c @@ -8106,6 +8106,7 @@ static void cmd_cbi_help(char *cmd) " 6: FW_CONFIG\n" " 7: PCB_VENDOR\n" " 8: SSFC\n" + " 9: REWORK_ID\n" " is the size of the data in byte. It should be zero for\n" " string types.\n" " is an integer or a string to be set\n" @@ -8171,16 +8172,13 @@ static int cmd_cbi(int argc, char *argv[]) printf("%.*s", rv, (const char *)ec_inbuf); } else { const uint8_t * const buffer = ec_inbuf; + uint64_t int_value = 0; + for(i = 0; i < rv; i++) + int_value |= (uint64_t)buffer[i] << (i * 8); - if (rv <= sizeof(uint32_t)) { - uint32_t int_value = 0; - - for (i = 0; i < rv; i++) - int_value |= buffer[i] << (i * 8); - - printf("As uint: %u (0x%x)\n", int_value, - int_value); - } + printf("As uint: %llu (0x%llx)\n", + (unsigned long long)int_value, + (unsigned long long)int_value); printf("As binary:"); for (i = 0; i < rv; i++) { if (i % 32 == 31) @@ -8194,8 +8192,9 @@ static int cmd_cbi(int argc, char *argv[]) struct ec_params_set_cbi *p = (struct ec_params_set_cbi *)ec_outbuf; void *val_ptr; - uint32_t val; + uint64_t val = 0; uint8_t size; + uint8_t bad_size = 0; if (argc < 5) { fprintf(stderr, "Invalid number of params\n"); cmd_cbi_help(argv[0]); @@ -8208,17 +8207,31 @@ static int cmd_cbi(int argc, char *argv[]) val_ptr = argv[3]; size = strlen(val_ptr) + 1; } else { - val = strtol(argv[3], &e, 0); - if (e && *e) { + val = strtoul(argv[3], &e, 0); + /* strtoul sets an errno for invalid input. If the value + * read is out of range of representable values by an + * unsigned long int, the function returns ULONG_MAX + * or ULONG_MIN and the errno is set to ERANGE. + */ + if ((e && *e) || errno == ERANGE) { fprintf(stderr, "Bad value\n"); return -1; } size = strtol(argv[4], &e, 0); - if ((e && *e) || size < 1 || 4 < size || - val >= (1ull << size*8)) { + if (tag == CBI_TAG_REWORK_ID) { + if ((e && *e) || size < 1 || size > 8 || + (size < 8 && val >= (1ull << size*8))) + bad_size = 1; + } else { + if ((e && *e) || size < 1 || 4 < size || + val >= (1ull << size*8)) + bad_size = 1; + } + if (bad_size == 1) { fprintf(stderr, "Bad size: %d\n", size); return -1; } + val_ptr = &val; } -- cgit v1.2.1