aboutsummaryrefslogtreecommitdiff
path: root/src/ec/google/chromeec/crosec_proto.c
diff options
context:
space:
mode:
authorAaron Durbin <adurbin@chromium.org>2014-08-06 14:34:57 -0500
committerPatrick Georgi <pgeorgi@google.com>2015-03-21 10:43:26 +0100
commit828272767d067cc215ff6c7dc93bd731a1a61765 (patch)
treea7b7b8078be296b2522d0f8b36ca78dfd43c64da /src/ec/google/chromeec/crosec_proto.c
parent3e49738baa84958e8f62211e676ad326682bc0bb (diff)
chromeec: allow transport implementation to provide buffers for proto v3
Depending on the transport mechanism for proto v3 different bytes need to be send and/or read before the request and response. Depending on the software and/or controller interface that requirement leads to needing to copy data into temporary buffers. Avoid this by allowing the transport mechanism to provide the request and response buffers. BUG=chrome-os-partner:31148 BRANCH=None TEST=Built for rush and ryu. Ran on ryu with i2c implementation. Also built for rambi to check x86 systems. Change-Id: I35d4d69bd1fa900fc0cfe3822496f381405bdcb1 Signed-off-by: Patrick Georgi <pgeorgi@chromium.org> Original-Commit-Id: c7224426e1d0bcf06ed010131a2462a6ca201d8b Original-Change-Id: Iad6cce566a253ca72e6f5009a97235ece0a6c1b5 Original-Signed-off-by: Aaron Durbin <adurbin@chromium.org> Original-Reviewed-on: https://chromium-review.googlesource.com/211138 Original-Reviewed-by: Furquan Shaikh <furquan@chromium.org> Reviewed-on: http://review.coreboot.org/8827 Tested-by: build bot (Jenkins) Reviewed-by: Stefan Reinauer <stefan.reinauer@coreboot.org>
Diffstat (limited to 'src/ec/google/chromeec/crosec_proto.c')
-rw-r--r--src/ec/google/chromeec/crosec_proto.c23
1 files changed, 16 insertions, 7 deletions
diff --git a/src/ec/google/chromeec/crosec_proto.c b/src/ec/google/chromeec/crosec_proto.c
index 42c7c2e35d..55a707db17 100644
--- a/src/ec/google/chromeec/crosec_proto.c
+++ b/src/ec/google/chromeec/crosec_proto.c
@@ -27,6 +27,11 @@
#include "ec_message.h"
/* Common utilities */
+void * __attribute__((weak)) crosec_get_buffer(size_t size, int req)
+{
+ printk(BIOS_DEBUG, "crosec_get_buffer() implementation required.\n");
+ return NULL;
+}
/* Dumps EC command / response data into debug output.
*
@@ -208,23 +213,27 @@ static int send_command_proto3(struct chromeec_command *cec_command,
{
int out_bytes, in_bytes;
int rv;
- struct ec_command_v3 cmd = { {0}, };
- struct ec_response_v3 resp = { {0}, };
+ struct ec_command_v3 *cmd;
+ struct ec_response_v3 *resp;
+
+ if ((cmd = crosec_get_buffer(sizeof(*cmd), 1)) == NULL)
+ return -EC_RES_ERROR;
+ if ((resp = crosec_get_buffer(sizeof(*resp), 0)) == NULL)
+ return -EC_RES_ERROR;
/* Create request packet */
- out_bytes = create_proto3_request(cec_command, &cmd);
+ out_bytes = create_proto3_request(cec_command, cmd);
if (out_bytes < 0) {
return out_bytes;
}
/* Prepare response buffer */
- in_bytes = prepare_proto3_response_buffer(cec_command, &resp);
+ in_bytes = prepare_proto3_response_buffer(cec_command, resp);
if (in_bytes < 0) {
return in_bytes;
}
- rv = crosec_io((uint8_t *)&cmd, out_bytes, (uint8_t *)&resp, in_bytes,
- context);
+ rv = crosec_io(out_bytes, in_bytes, context);
if (rv != 0) {
printk(BIOS_ERR, "%s: failed to complete I/O: Err = %#x.",
__func__, rv >= 0 ? rv : -rv);
@@ -232,7 +241,7 @@ static int send_command_proto3(struct chromeec_command *cec_command,
}
/* Process the response */
- return handle_proto3_response(&resp, cec_command);
+ return handle_proto3_response(resp, cec_command);
}
static int crosec_command_proto_v3(struct chromeec_command *cec_command,