diff options
author | Shawn Nematbakhsh <shawnn@chromium.org> | 2014-12-18 18:10:37 -0800 |
---|---|---|
committer | chrome-internal-fetch <chrome-internal-fetch@google.com> | 2014-12-20 08:54:18 +0000 |
commit | c69e9ceb31638b8f1dd42b82a903b4f7dfc27907 (patch) | |
tree | 66530af8ab32f81ed5432599e408e6fa867feedb | |
parent | f8019bff3a9a910f0e4a2b6da052c02ecba284e5 (diff) | |
download | chrome-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.c | 4 | ||||
-rw-r--r-- | board/ryu_p1/usb_pd_policy.c | 4 | ||||
-rw-r--r-- | board/samus_pd/usb_pd_policy.c | 12 | ||||
-rw-r--r-- | common/usb_pd_protocol.c | 14 | ||||
-rw-r--r-- | include/ec_commands.h | 2 | ||||
-rw-r--r-- | include/usb_pd.h | 10 | ||||
-rw-r--r-- | util/ectool.c | 2 |
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; |