diff options
author | Gwendal Grignou <gwendal@chromium.org> | 2016-04-22 11:09:33 -0700 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2016-04-22 17:17:56 -0700 |
commit | e54d1284ffbd1d7c3b1f77a2a696ce275c527de4 (patch) | |
tree | dba186d112dd55598819dd5c53db6e451d59407e /util/comm-dev.c | |
parent | 1546b4de0b6d8b443f6c8b3e49810010f896b40b (diff) | |
download | chrome-ec-e54d1284ffbd1d7c3b1f77a2a696ce275c527de4.tar.gz |
ectool: Revert "ectool: Remove CROS_EC_DEV_IOCRDMEM"
CROS_EC_DEV_IOCRDMEM must be used on architecture where legacy IO mapped
registers are accessed inderectly via EMI. The kernel is taking care of
the translation.
TEST=Check on reks that we need to use the IOCTL.
BUG=chrome-os-partner:52550,chromium:602832
BRANCH=none
This reverts commit de45353bbdf0 ("ectool: Remove CROS_EC_DEV_IOCRDMEM").
Change-Id: I8efad56df90c58c25bdc9ccd70a508547e629a77
Signed-off-by: Gwendal Grignou <gwendal@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/340348
Reviewed-by: Shawn N <shawnn@chromium.org>
Diffstat (limited to 'util/comm-dev.c')
-rw-r--r-- | util/comm-dev.c | 68 |
1 files changed, 58 insertions, 10 deletions
diff --git a/util/comm-dev.c b/util/comm-dev.c index 3b215d924d..94a5cdde52 100644 --- a/util/comm-dev.c +++ b/util/comm-dev.c @@ -91,6 +91,31 @@ static int ec_command_dev(int command, int version, return r; } +static int ec_readmem_dev(int offset, int bytes, void *dest) +{ + struct cros_ec_readmem s_mem; + struct ec_params_read_memmap r_mem; + int r; + static int fake_it; + + if (!fake_it) { + s_mem.offset = offset; + s_mem.bytes = bytes; + s_mem.buffer = dest; + r = ioctl(fd, CROS_EC_DEV_IOCRDMEM, &s_mem); + if (r < 0 && errno == ENOTTY) + fake_it = 1; + else + return r; + } + + r_mem.offset = offset; + r_mem.size = bytes; + return ec_command_dev(EC_CMD_READ_MEMMAP, 0, + &r_mem, sizeof(r_mem), + dest, bytes); +} + /* New ioctl format, used by Chrome OS 4.4 and later as well as upstream 4.0+ */ static int ec_command_dev_v2(int command, int version, @@ -131,6 +156,8 @@ static int ec_command_dev_v2(int command, int version, } else { memcpy(indata, s_cmd->data, MIN(r, insize)); if (s_cmd->result != EC_RES_SUCCESS) { + fprintf(stderr, "EC result %d (%s)\n", s_cmd->result, + strresult(s_cmd->result)); r = -EECRESULT - s_cmd->result; } } @@ -139,6 +166,31 @@ static int ec_command_dev_v2(int command, int version, return r; } +static int ec_readmem_dev_v2(int offset, int bytes, void *dest) +{ + struct cros_ec_readmem_v2 s_mem; + struct ec_params_read_memmap r_mem; + int r; + static int fake_it; + + if (!fake_it) { + s_mem.offset = offset; + s_mem.bytes = bytes; + r = ioctl(fd, CROS_EC_DEV_IOCRDMEM_V2, &s_mem); + if (r < 0 && errno == ENOTTY) { + fake_it = 1; + } else { + memcpy(dest, s_mem.buffer, bytes); + return r; + } + } + + r_mem.offset = offset; + r_mem.size = bytes; + return ec_command_dev(EC_CMD_READ_MEMMAP, 0, + &r_mem, sizeof(r_mem), + dest, bytes); +} /* * Attempt to communicate with kernel using old ioctl format. @@ -169,6 +221,7 @@ static int ec_dev_is_v2(void) int comm_init_dev(const char *device_name) { + int (*ec_cmd_readmem)(int offset, int bytes, void *dest); char version[80]; char device[80] = "/dev/"; int r; @@ -195,20 +248,15 @@ int comm_init_dev(const char *device_name) if (ec_dev_is_v2()) { ec_command_proto = ec_command_dev_v2; + ec_cmd_readmem = ec_readmem_dev_v2; } else { ec_command_proto = ec_command_dev; + ec_cmd_readmem = ec_readmem_dev; } - if (ec_readmem(EC_MEMMAP_ID, 2, version) < 0) { - /* - * Unable to read memory map through command protocol, - * assume LPC transport underneath. - */ - comm_init_lpc(1); - if (ec_readmem(EC_MEMMAP_ID, 2, version) < 0) - fprintf(stderr, - "Unable to read memory mapped registers.\n"); - } + if (ec_cmd_readmem(EC_MEMMAP_ID, 2, version) == 2 && + version[0] == 'E' && version[1] == 'C') + ec_readmem = ec_cmd_readmem; /* * Set temporary size, will be updated later. |