summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorGwendal Grignou <gwendal@chromium.org>2016-04-13 12:34:08 -0700
committerchrome-bot <chrome-bot@chromium.org>2016-04-15 13:40:17 -0700
commitde45353bbdf0c6c4afb88420d3cb2e182eae7450 (patch)
treec8679091de030c771b515fc96ac2b5c2e35fe14a
parentfef9abf3b3473dad728e2f2bd8557e230214f03d (diff)
downloadchrome-ec-de45353bbdf0c6c4afb88420d3cb2e182eae7450.tar.gz
ectool: Remove CROS_EC_DEV_IOCRDMEM
On !LPC EC, we can read memory via CROS_EC_DEV_IOCXCMD ioctl, using command EC_CMD_READ_MEMMAP. On platform that supports direct memory access (lpc), we access the memory directly, bypassing the ioctl. BUG=chromium:602832 TEST=On gnawty and veyron, check 'ectool battery' works. Verify that gnawty use io mapped registers. BRANCH=none Change-Id: I9bfcddcf450bf8df63ead78e1df97dd7392289e6 Signed-off-by: Gwendal Grignou <gwendal@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/338853 Reviewed-by: Randall Spangler <rspangler@chromium.org>
-rw-r--r--util/comm-dev.c68
-rw-r--r--util/comm-host.c11
-rw-r--r--util/comm-host.h11
-rw-r--r--util/comm-lpc.c19
4 files changed, 39 insertions, 70 deletions
diff --git a/util/comm-dev.c b/util/comm-dev.c
index 94a5cdde52..3b215d924d 100644
--- a/util/comm-dev.c
+++ b/util/comm-dev.c
@@ -91,31 +91,6 @@ 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,
@@ -156,8 +131,6 @@ 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;
}
}
@@ -166,31 +139,6 @@ 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.
@@ -221,7 +169,6 @@ 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;
@@ -248,15 +195,20 @@ 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_cmd_readmem(EC_MEMMAP_ID, 2, version) == 2 &&
- version[0] == 'E' && version[1] == 'C')
- ec_readmem = ec_cmd_readmem;
+ 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");
+ }
/*
* Set temporary size, will be updated later.
diff --git a/util/comm-host.c b/util/comm-host.c
index 31ad56343e..f7514904cd 100644
--- a/util/comm-host.c
+++ b/util/comm-host.c
@@ -25,10 +25,6 @@ void *ec_outbuf;
void *ec_inbuf;
static int command_offset;
-int comm_init_dev(const char *device_name) __attribute__((weak));
-int comm_init_lpc(void) __attribute__((weak));
-int comm_init_i2c(void) __attribute__((weak));
-
static int fake_readmem(int offset, int bytes, void *dest)
{
struct ec_params_read_memmap p;
@@ -92,16 +88,15 @@ int comm_init(int interfaces, const char *device_name)
}
/* Prefer new /dev method */
- if ((interfaces & COMM_DEV) && comm_init_dev &&
- !comm_init_dev(device_name))
+ if ((interfaces & COMM_DEV) && !comm_init_dev(device_name))
goto init_ok;
/* Fallback to direct LPC on x86 */
- if ((interfaces & COMM_LPC) && comm_init_lpc && !comm_init_lpc())
+ if ((interfaces & COMM_LPC) && !comm_init_lpc(0))
goto init_ok;
/* Fallback to direct i2c on ARM */
- if ((interfaces & COMM_I2C) && comm_init_i2c && !comm_init_i2c())
+ if ((interfaces & COMM_I2C) && !comm_init_i2c())
goto init_ok;
/* Give up */
diff --git a/util/comm-host.h b/util/comm-host.h
index 1d3cb9e36d..bfe99b2179 100644
--- a/util/comm-host.h
+++ b/util/comm-host.h
@@ -74,4 +74,15 @@ extern int (*ec_command_proto)(int command, int version,
*/
extern int (*ec_readmem)(int offset, int bytes, void *dest);
+/*
+ * Functions for initializing communication protocols.
+ * @param device_name: device name to open to access the ec.
+ * @param init_readmem_only:
+ * 1: init only ec_readmem
+ * 0: set ec_command_proto as well.
+ */
+int comm_init_dev(const char *device_name);
+int comm_init_lpc(int init_readmem_only);
+int comm_init_i2c(void);
+
#endif /* __UTIL_COMM_HOST_H */
diff --git a/util/comm-lpc.c b/util/comm-lpc.c
index 54f16b3ffc..27a32f3b69 100644
--- a/util/comm-lpc.c
+++ b/util/comm-lpc.c
@@ -246,7 +246,7 @@ static int ec_readmem_lpc(int offset, int bytes, void *dest)
return cnt;
}
-int comm_init_lpc(void)
+int comm_init_lpc(int init_readmem_only)
{
int i;
int byte = 0xff;
@@ -257,6 +257,13 @@ int comm_init_lpc(void)
return -3;
}
+ ec_readmem = ec_readmem_lpc;
+
+ if (init_readmem_only) {
+ /* Function to send commands already defined. */
+ return 0;
+ }
+
/*
* Test if the I/O port has been configured for Chromium EC LPC
* interface. Chromium EC guarantees that at least one status bit will
@@ -308,9 +315,13 @@ int comm_init_lpc(void)
return -5;
}
- /* Either one supports reading mapped memory directly. */
- ec_readmem = ec_readmem_lpc;
return 0;
}
-#endif
+#else /* defined(__i386__) || defined(__x86_64__) */
+#include <errno.h>
+int comm_init_lpc(int unused)
+{
+ return -EOPNOTSUPP;
+}
+#endif /* defined(__i386__) || defined(__x86_64__) */