From e54d1284ffbd1d7c3b1f77a2a696ce275c527de4 Mon Sep 17 00:00:00 2001 From: Gwendal Grignou Date: Fri, 22 Apr 2016 11:09:33 -0700 Subject: 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 Reviewed-on: https://chromium-review.googlesource.com/340348 Reviewed-by: Shawn N --- util/comm-dev.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 58 insertions(+), 10 deletions(-) (limited to 'util/comm-dev.c') 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. -- cgit v1.2.1