mirror of
https://github.com/Telecominfraproject/OpenCellular.git
synced 2025-12-27 18:25:05 +00:00
Fix flash_overwrite unit test
This also moves flash related tests to use new 'hostcmd' console command. BUG=chrome-os-partner:10262 TEST=Test passed BRANCH=none Change-Id: I5616bfa93bcde0beb4cb2baf2d38e8b5d827c275 Signed-off-by: Vic Yang <victoryang@chromium.org> Reviewed-on: https://gerrit.chromium.org/gerrit/30665 Reviewed-by: Vincent Palatin <vpalatin@chromium.org>
This commit is contained in:
@@ -57,7 +57,17 @@ int flash_physical_get_protect(int block)
|
||||
return mock_protect[block];
|
||||
}
|
||||
|
||||
int flash_physical_pre_init(void)
|
||||
uint32_t flash_get_protect(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int flash_set_protect(uint32_t mask, uint32_t flags)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
int flash_pre_init(void)
|
||||
{
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
|
||||
154
test/flash.c
154
test/flash.c
@@ -21,157 +21,3 @@ DECLARE_CONSOLE_COMMAND(rosize, ro_image_size,
|
||||
NULL,
|
||||
"Report size of RO image",
|
||||
NULL);
|
||||
|
||||
/* TODO(victoryang@): We should introduce a function to send fake host command
|
||||
* just like ec_command in ectool. See crosbug/p/11350 */
|
||||
static int hc_flash_info(int argc, char **argv)
|
||||
{
|
||||
uint8_t data[EC_HOST_PARAM_SIZE];
|
||||
enum ec_status res;
|
||||
struct ec_response_flash_info *r;
|
||||
struct host_cmd_handler_args args =
|
||||
{ .command = EC_CMD_FLASH_INFO,
|
||||
.version = 0,
|
||||
.params = NULL,
|
||||
.params_size = 0,
|
||||
.response = data,
|
||||
.response_size = EC_HOST_PARAM_SIZE };
|
||||
|
||||
res = host_command_process(&args);
|
||||
if (res != EC_RES_SUCCESS)
|
||||
return EC_ERROR_UNKNOWN;
|
||||
r = (struct ec_response_flash_info *)args.response;
|
||||
uart_printf("flash_size = %d\n", r->flash_size);
|
||||
uart_printf("write_block_size = %d\n", r->write_block_size);
|
||||
uart_printf("erase_block_size = %d\n", r->erase_block_size);
|
||||
uart_printf("protect_block_size = %d\n", r->protect_block_size);
|
||||
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
DECLARE_CONSOLE_COMMAND(hcflashinfo, hc_flash_info,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
static int hc_flash_read(int argc, char **argv)
|
||||
{
|
||||
uint8_t data[EC_HOST_PARAM_SIZE];
|
||||
enum ec_status res;
|
||||
struct ec_params_flash_read *p =
|
||||
(struct ec_params_flash_read *)data;
|
||||
struct host_cmd_handler_args args =
|
||||
{ .command = EC_CMD_FLASH_READ,
|
||||
.version = 0,
|
||||
.params = data,
|
||||
.params_size = EC_HOST_PARAM_SIZE,
|
||||
.response = data,
|
||||
.response_size = EC_HOST_PARAM_SIZE };
|
||||
char *e;
|
||||
int i, size;
|
||||
|
||||
if (argc != 3)
|
||||
return EC_ERROR_PARAM_COUNT;
|
||||
|
||||
p->offset = strtoi(argv[1], &e, 0);
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM1;
|
||||
size = strtoi(argv[2], &e, 0);
|
||||
p->size = size;
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM2;
|
||||
|
||||
res = host_command_process(&args);
|
||||
if (res != EC_RES_SUCCESS)
|
||||
return EC_ERROR_UNKNOWN;
|
||||
for (i = 0; i < size; ++i) {
|
||||
uart_printf("%02x", args.response[i]);
|
||||
if ((i & 31) == 31)
|
||||
uart_puts("\n");
|
||||
}
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
DECLARE_CONSOLE_COMMAND(hcflashread, hc_flash_read,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
static int hc_flash_write(int argc, char **argv)
|
||||
{
|
||||
uint8_t data[EC_HOST_PARAM_SIZE];
|
||||
enum ec_status res;
|
||||
struct ec_params_flash_write *p =
|
||||
(struct ec_params_flash_write *)data;
|
||||
struct host_cmd_handler_args args =
|
||||
{ .command = EC_CMD_FLASH_WRITE,
|
||||
.version = 0,
|
||||
.params = data,
|
||||
.params_size = EC_HOST_PARAM_SIZE,
|
||||
.response = data,
|
||||
.response_size = EC_HOST_PARAM_SIZE };
|
||||
char *e;
|
||||
int i, size;
|
||||
int seed, mult, add;
|
||||
|
||||
if (argc != 6)
|
||||
return EC_ERROR_PARAM_COUNT;
|
||||
|
||||
p->offset = strtoi(argv[1], &e, 0);
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM1;
|
||||
size = strtoi(argv[2], &e, 0);
|
||||
p->size = size;
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM2;
|
||||
seed = strtoi(argv[3], &e, 0);
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM3;
|
||||
mult = strtoi(argv[4], &e, 0);
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM4;
|
||||
add = strtoi(argv[5], &e, 0);
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM5;
|
||||
|
||||
for (i = 0; i < size; ++i) {
|
||||
p->data[i] = (uint8_t)(seed & 0xff);
|
||||
seed = seed * mult + add;
|
||||
}
|
||||
|
||||
res = host_command_process(&args);
|
||||
if (res != EC_RES_SUCCESS)
|
||||
return EC_ERROR_UNKNOWN;
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
DECLARE_CONSOLE_COMMAND(hcflashwrite, hc_flash_write,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
static int hc_flash_erase(int argc, char **argv)
|
||||
{
|
||||
uint8_t data[EC_HOST_PARAM_SIZE];
|
||||
enum ec_status res;
|
||||
struct ec_params_flash_erase *p =
|
||||
(struct ec_params_flash_erase *)data;
|
||||
struct host_cmd_handler_args args =
|
||||
{ .command = EC_CMD_FLASH_ERASE,
|
||||
.version = 0,
|
||||
.params = data,
|
||||
.params_size = EC_HOST_PARAM_SIZE,
|
||||
.response = data,
|
||||
.response_size = EC_HOST_PARAM_SIZE };
|
||||
char *e;
|
||||
int size;
|
||||
|
||||
if (argc != 3)
|
||||
return EC_ERROR_PARAM_COUNT;
|
||||
|
||||
p->offset = strtoi(argv[1], &e, 0);
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM1;
|
||||
size = strtoi(argv[2], &e, 0);
|
||||
p->size = size;
|
||||
if (*e)
|
||||
return EC_ERROR_PARAM2;
|
||||
|
||||
res = host_command_process(&args);
|
||||
if (res != EC_RES_SUCCESS)
|
||||
return EC_ERROR_UNKNOWN;
|
||||
return EC_SUCCESS;
|
||||
}
|
||||
DECLARE_CONSOLE_COMMAND(hcflasherase, hc_flash_erase,
|
||||
NULL, NULL, NULL);
|
||||
|
||||
@@ -23,12 +23,12 @@ def test(helper):
|
||||
rosize = get_ro_size(helper)
|
||||
|
||||
# We are in RO now. Writing to RO should fail.
|
||||
test_write(helper, rosize / 2, 0x30, expect_fail=True)
|
||||
test_write(helper, rosize / 2, 0x10, expect_fail=True)
|
||||
|
||||
# Writing to RW should succeed.
|
||||
test_write(helper, rosize, 0x30) # begin of RW
|
||||
test_write(helper, (rosize + flashsize) / 2, 0x30) # mid-point of RW
|
||||
test_write(helper, flashsize - 0x30, 0x30) # end of flash
|
||||
test_write(helper, rosize, 0x10) # begin of RW
|
||||
test_write(helper, (rosize + flashsize) / 2, 0x10) # mid-point of RW
|
||||
test_write(helper, flashsize - 0x10, 0x10) # end of flash
|
||||
|
||||
# Jump to RW-A
|
||||
helper.ec_command("sysjump a")
|
||||
@@ -36,11 +36,11 @@ def test(helper):
|
||||
time.sleep(0.5)
|
||||
|
||||
# We are in RW now. Writing to RO should succeed.
|
||||
test_write(helper, 0, 0x30) # begin of RO
|
||||
test_write(helper, rosize / 2, 0x30) # mid-point of RO
|
||||
test_write(helper, rosize - 0x30, 0x30) # end of RO
|
||||
test_write(helper, 0, 0x10) # begin of RO
|
||||
test_write(helper, rosize / 2, 0x10) # mid-point of RO
|
||||
test_write(helper, rosize - 0x10, 0x10) # end of RO
|
||||
|
||||
# Writing to RW-A should fail.
|
||||
test_write(helper, rosize, 0x30, expect_fail=True)
|
||||
test_write(helper, rosize, 0x10, expect_fail=True)
|
||||
|
||||
return True
|
||||
|
||||
@@ -7,13 +7,28 @@
|
||||
|
||||
import random
|
||||
import re
|
||||
import struct
|
||||
|
||||
# Fixed random seed.
|
||||
random.seed(1234)
|
||||
|
||||
def hex_to_byte(text):
|
||||
return ''.join(["%c" % chr(int(text[i:i+2], 16))
|
||||
for i in range(0, len(text), 2)])
|
||||
|
||||
def byte_to_hex(byte_arr):
|
||||
return ''.join(["%02x" % ord(c) for c in byte_arr])
|
||||
|
||||
def offset_size_pair(offset, size):
|
||||
return byte_to_hex(struct.pack("II", offset, size))
|
||||
|
||||
def get_flash_info(helper):
|
||||
helper.ec_command("hostcmd 0x10 0 00")
|
||||
resp = helper.wait_output("Response: (?P<r>.{32,32})", use_re=True)["r"]
|
||||
return struct.unpack("IIII", hex_to_byte(resp))
|
||||
|
||||
def get_flash_size(helper):
|
||||
helper.ec_command("hcflashinfo")
|
||||
return int(helper.wait_output("flash_size = (?P<f>\d+)", use_re=True)["f"])
|
||||
return get_flash_info(helper)[0]
|
||||
|
||||
def get_ro_size(helper):
|
||||
helper.ec_command("rosize")
|
||||
@@ -28,7 +43,7 @@ def xor_sum(size, seed, mult, add):
|
||||
return ret
|
||||
|
||||
def test_erase(helper, offset, size):
|
||||
helper.ec_command("hcflasherase %d %d" % (offset, size))
|
||||
helper.ec_command("hostcmd 0x13 0 %s" % offset_size_pair(offset, size))
|
||||
helper.wait_output("Flash erase at %x size %x" % (offset, size))
|
||||
|
||||
def _get_read_ref(helper, offset, size):
|
||||
@@ -38,7 +53,7 @@ def _get_read_ref(helper, offset, size):
|
||||
while size > 0:
|
||||
helper.ec_command("rw %d" % offset)
|
||||
h = helper.wait_output("read.*=\s+0x(?P<h>[0-9a-f]+)", use_re=True)["h"]
|
||||
# Change endianess here
|
||||
# Change endianess here
|
||||
retsub.append(re.sub('(..)(..)(..)(..)', r'\4\3\2\1', h))
|
||||
if len(retsub) == 8:
|
||||
ret.append(''.join(retsub))
|
||||
@@ -51,18 +66,28 @@ def _get_read_ref(helper, offset, size):
|
||||
|
||||
def test_read(helper, offset, size):
|
||||
ref = _get_read_ref(helper, offset, size)
|
||||
helper.ec_command("hcflashread %d %d" % (offset, size))
|
||||
helper.ec_command("hostcmd 0x11 0 %s" % offset_size_pair(offset, size))
|
||||
for line in ref:
|
||||
helper.wait_output(line)
|
||||
|
||||
def _gen_data(size, seed, mult, add):
|
||||
data = []
|
||||
for i in xrange(size):
|
||||
data.append("%02x" % (seed & 255))
|
||||
seed = (seed * mult + add) & 4294967295;
|
||||
return ''.join(data)
|
||||
|
||||
def test_write(helper, offset, size, expect_fail=False):
|
||||
assert size <= 16
|
||||
seed = random.randint(2, 10000)
|
||||
mult = random.randint(2, 10000)
|
||||
add = random.randint(2, 10000)
|
||||
helper.ec_command("hcflashwrite %d %d %d %d %d" %
|
||||
(offset, size, seed, mult, add))
|
||||
data = _gen_data(size, seed, mult, add)
|
||||
payload = byte_to_hex(struct.pack("II", offset, size))
|
||||
helper.ec_command("hostcmd 0x12 0 %s%s" %
|
||||
(offset_size_pair(offset, size), data))
|
||||
if expect_fail:
|
||||
helper.wait_output("Command returned error")
|
||||
helper.wait_output("Command returned \d+", use_re=True)
|
||||
else:
|
||||
expected_sum = xor_sum(size, seed, mult, add)
|
||||
helper.wait_output("Flash write at %x size %x XOR %x" %
|
||||
|
||||
Reference in New Issue
Block a user