summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorShawn Nematbakhsh <shawnn@chromium.org>2014-12-18 18:10:37 -0800
committerchrome-internal-fetch <chrome-internal-fetch@google.com>2014-12-20 08:54:18 +0000
commitc69e9ceb31638b8f1dd42b82a903b4f7dfc27907 (patch)
tree66530af8ab32f81ed5432599e408e6fa867feedb
parentf8019bff3a9a910f0e4a2b6da052c02ecba284e5 (diff)
downloadchrome-ec-c69e9ceb31638b8f1dd42b82a903b4f7dfc27907.tar.gz
pd: Modify EC_CMD_USB_PD_RW_HASH_ENTRY to return PD device image type
This addition allows the AP to query whether the PD device is currently running from RO or RW FW. BUG=chrome-os-partner:34599 TEST=Manual on Samus. Run 'ectool --name cros_pd infopddev 0' and verify that correct RO/RW status of Zinger is printed. Verify that the output matches the index printed by "pd 1 hash" on samus_pd console. BRANCH=Samus Change-Id: I4266cae931f5c7855ca0531717c4a18b138b2d62 Signed-off-by: Shawn Nematbakhsh <shawnn@chromium.org> Reviewed-on: https://chromium-review.googlesource.com/236771 Reviewed-by: Alec Berg <alecaberg@chromium.org>
-rw-r--r--board/fruitpie/usb_pd_policy.c4
-rw-r--r--board/ryu_p1/usb_pd_policy.c4
-rw-r--r--board/samus_pd/usb_pd_policy.c12
-rw-r--r--common/usb_pd_protocol.c14
-rw-r--r--include/ec_commands.h2
-rw-r--r--include/usb_pd.h10
-rw-r--r--util/ectool.c2
7 files changed, 34 insertions, 14 deletions
diff --git a/board/fruitpie/usb_pd_policy.c b/board/fruitpie/usb_pd_policy.c
index 8844f16014..9a70c1b70a 100644
--- a/board/fruitpie/usb_pd_policy.c
+++ b/board/fruitpie/usb_pd_policy.c
@@ -9,6 +9,7 @@
#include "gpio.h"
#include "hooks.h"
#include "registers.h"
+#include "system.h"
#include "task.h"
#include "timer.h"
#include "util.h"
@@ -151,7 +152,8 @@ static int pd_custom_vdm(int port, int cnt, uint32_t *payload,
}
/* copy hash */
if (cnt >= 6)
- pd_dev_store_rw_hash(port, dev_id, payload + 1);
+ pd_dev_store_rw_hash(port, dev_id, payload + 1,
+ SYSTEM_IMAGE_UNKNOWN);
break;
}
diff --git a/board/ryu_p1/usb_pd_policy.c b/board/ryu_p1/usb_pd_policy.c
index 6877ab6803..fba4db9a4c 100644
--- a/board/ryu_p1/usb_pd_policy.c
+++ b/board/ryu_p1/usb_pd_policy.c
@@ -10,6 +10,7 @@
#include "hooks.h"
#include "host_command.h"
#include "registers.h"
+#include "system.h"
#include "task.h"
#include "timer.h"
#include "util.h"
@@ -146,7 +147,8 @@ static int pd_custom_vdm(int port, int cnt, uint32_t *payload,
}
/* copy hash */
if (cnt >= 6)
- pd_dev_store_rw_hash(port, dev_id, payload + 1);
+ pd_dev_store_rw_hash(port, dev_id, payload + 1,
+ SYSTEM_IMAGE_UNKNOWN);
break;
case VDO_CMD_CURRENT:
diff --git a/board/samus_pd/usb_pd_policy.c b/board/samus_pd/usb_pd_policy.c
index 89a7dad404..50aaceacde 100644
--- a/board/samus_pd/usb_pd_policy.c
+++ b/board/samus_pd/usb_pd_policy.c
@@ -12,6 +12,7 @@
#include "host_command.h"
#include "pi3usb9281.h"
#include "registers.h"
+#include "system.h"
#include "task.h"
#include "timer.h"
#include "util.h"
@@ -157,6 +158,7 @@ static int pd_custom_vdm(int port, int cnt, uint32_t *payload,
{
int cmd = PD_VDO_CMD(payload[0]);
uint16_t dev_id = 0;
+ int is_rw;
CPRINTF("VDM/%d [%d] %08x\n", cnt, cmd, payload[0]);
/* make sure we have some payload */
@@ -174,17 +176,21 @@ static int pd_custom_vdm(int port, int cnt, uint32_t *payload,
/* copy hash */
if (cnt == 7) {
dev_id = VDO_INFO_HW_DEV_ID(payload[6]);
- pd_dev_store_rw_hash(port, dev_id, payload + 1);
+ is_rw = VDO_INFO_IS_RW(payload[6]);
+ pd_dev_store_rw_hash(port, dev_id, payload + 1,
+ is_rw ? SYSTEM_IMAGE_RW :
+ SYSTEM_IMAGE_RO);
pd_send_host_event(PD_EVENT_UPDATE_DEVICE);
CPRINTF("DevId:%d.%d SW:%d RW:%d\n",
HW_DEV_ID_MAJ(dev_id),
HW_DEV_ID_MIN(dev_id),
VDO_INFO_SW_DBG_VER(payload[6]),
- VDO_INFO_IS_RW(payload[6]));
+ is_rw);
} else if (cnt == 6) {
/* really old devices don't have last byte */
- pd_dev_store_rw_hash(port, dev_id, payload + 1);
+ pd_dev_store_rw_hash(port, dev_id, payload + 1,
+ SYSTEM_IMAGE_UNKNOWN);
}
break;
case VDO_CMD_CURRENT:
diff --git a/common/usb_pd_protocol.c b/common/usb_pd_protocol.c
index 70ac88b5da..91aeb590d1 100644
--- a/common/usb_pd_protocol.c
+++ b/common/usb_pd_protocol.c
@@ -264,9 +264,10 @@ static struct pd_protocol {
uint32_t vdo_data[VDO_MAX_SIZE];
uint8_t vdo_count;
- /* Attached ChromeOS device id & RW hash */
+ /* Attached ChromeOS device id, RW hash, and current RO / RW image */
uint16_t dev_id;
uint32_t dev_rw_hash[PD_RW_HASH_SIZE/4];
+ enum ec_current_image current_image;
} pd[PD_PORT_COUNT];
/*
@@ -1358,12 +1359,14 @@ static inline void pd_dev_dump_info(uint16_t dev_id, uint8_t *hash)
ccprintf("\n");
}
-void pd_dev_store_rw_hash(int port, uint16_t dev_id, uint32_t *rw_hash)
+void pd_dev_store_rw_hash(int port, uint16_t dev_id, uint32_t *rw_hash,
+ uint32_t current_image)
{
pd[port].dev_id = dev_id;
memcpy(pd[port].dev_rw_hash, rw_hash, PD_RW_HASH_SIZE);
if (debug_level >= 1)
pd_dev_dump_info(dev_id, (uint8_t *)rw_hash);
+ pd[port].current_image = current_image;
}
#ifdef CONFIG_USB_PD_DUAL_ROLE
@@ -2622,11 +2625,12 @@ static int command_pd(int argc, char **argv)
} else if (!strncasecmp(argv[2], "hard", 4)) {
set_state(port, PD_STATE_HARD_RESET_SEND);
task_wake(PORT_TO_TASK_ID(port));
- } else if (!strncasecmp(argv[2], "hash", 4)) {
+ } else if (!strncasecmp(argv[2], "info", 4)) {
int i;
+ ccprintf("Hash ");
for (i = 0; i < PD_RW_HASH_SIZE / 4; i++)
ccprintf("%08x ", pd[port].dev_rw_hash[i]);
- ccprintf("\n");
+ ccprintf("\nImage %d\n", pd[port].current_image);
} else if (!strncasecmp(argv[2], "soft", 4)) {
set_state(port, PD_STATE_SOFT_RESET);
task_wake(PORT_TO_TASK_ID(port));
@@ -2947,6 +2951,8 @@ static int hc_remote_pd_dev_info(struct host_cmd_handler_args *args)
PD_RW_HASH_SIZE);
}
+ r->current_image = pd[*port].current_image;
+
args->response_size = sizeof(*r);
return EC_RES_SUCCESS;
}
diff --git a/include/ec_commands.h b/include/ec_commands.h
index e9087872a7..d10cd62d1d 100644
--- a/include/ec_commands.h
+++ b/include/ec_commands.h
@@ -2789,6 +2789,8 @@ struct ec_params_usb_pd_fw_update {
struct ec_params_usb_pd_rw_hash_entry {
uint16_t dev_id;
uint8_t dev_rw_hash[PD_RW_HASH_SIZE];
+ uint8_t reserved; /* For alignment of current_image */
+ uint32_t current_image; /* One of ec_current_image */
} __packed;
/* Read USB-PD Accessory info */
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 31ef9fb296..003698b027 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -877,11 +877,13 @@ int pd_exit_mode(int port, uint32_t *payload);
/**
* Store Device ID & RW hash of device
*
- * @param port USB-C port number
- * @param dev_id device identifier
- * @param rw_hash pointer to rw_hash
+ * @param port USB-C port number
+ * @param dev_id device identifier
+ * @param rw_hash pointer to rw_hash
+ * @param current_image current image: RW or RO
*/
-void pd_dev_store_rw_hash(int port, uint16_t dev_id, uint32_t *rw_hash);
+void pd_dev_store_rw_hash(int port, uint16_t dev_id, uint32_t *rw_hash,
+ uint32_t ec_current_image);
/**
* Send Vendor Defined Message
diff --git a/util/ectool.c b/util/ectool.c
index f049986bfb..7486580c0c 100644
--- a/util/ectool.c
+++ b/util/ectool.c
@@ -868,7 +868,7 @@ int cmd_pd_device_info(int argc, char *argv[])
rwp[0]);
rwp += 4;
}
- printf("\n");
+ printf(" CurImg:%s\n", image_names[r0->current_image]);
}
r1 = (struct ec_params_usb_pd_discovery_entry *)ec_inbuf;