summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--board/dingdong/usb_pd_policy.c10
-rw-r--r--board/hoho/usb_pd_policy.c10
-rw-r--r--common/usb_pd_policy.c41
-rw-r--r--include/usb_pd.h1
4 files changed, 41 insertions, 21 deletions
diff --git a/board/dingdong/usb_pd_policy.c b/board/dingdong/usb_pd_policy.c
index 8a0d736757..42b094fb1c 100644
--- a/board/dingdong/usb_pd_policy.c
+++ b/board/dingdong/usb_pd_policy.c
@@ -131,15 +131,15 @@ const uint32_t vdo_dp_mode[1] = {
static int svdm_response_modes(int port, uint32_t *payload)
{
+ int mode_cnt = ARRAY_SIZE(vdo_dp_mode);
+
if (PD_VDO_VID(payload[0]) != USB_SID_DISPLAYPORT) {
/* TODO(tbroch) USB billboard enabled here then */
return 1; /* will generate a NAK */
}
- memset(payload + 1, 0, sizeof(uint32_t) * PDO_MODES);
- payload[1] = vdo_dp_mode[0];
- /* TODO(tbroch) does spec have mechanism for identifying valid modes
- * returned for svid? */
- return PDO_MAX_OBJECTS;
+
+ memcpy(payload + 1, vdo_dp_mode, sizeof(vdo_dp_mode));
+ return mode_cnt + 1;
}
static int svdm_enter_mode(int port, uint32_t *payload)
diff --git a/board/hoho/usb_pd_policy.c b/board/hoho/usb_pd_policy.c
index 20097e80c1..b647219085 100644
--- a/board/hoho/usb_pd_policy.c
+++ b/board/hoho/usb_pd_policy.c
@@ -131,15 +131,15 @@ const uint32_t vdo_dp_mode[1] = {
static int svdm_response_modes(int port, uint32_t *payload)
{
+ int mode_cnt = ARRAY_SIZE(vdo_dp_mode);
+
if (PD_VDO_VID(payload[0]) != USB_SID_DISPLAYPORT) {
/* TODO(tbroch) USB billboard enabled here then */
return 1; /* will generate a NAK */
}
- memset(payload + 1, 0, sizeof(uint32_t) * PDO_MODES);
- payload[1] = vdo_dp_mode[0];
- /* TODO(tbroch) does spec have mechanism for identifying valid modes
- * returned for svid? */
- return PDO_MAX_OBJECTS;
+
+ memcpy(payload + 1, vdo_dp_mode, sizeof(vdo_dp_mode));
+ return mode_cnt + 1;
}
static int svdm_enter_mode(int port, uint32_t *payload)
diff --git a/common/usb_pd_policy.c b/common/usb_pd_policy.c
index d1f47b6254..2738a2f254 100644
--- a/common/usb_pd_policy.c
+++ b/common/usb_pd_policy.c
@@ -16,6 +16,8 @@
#include "usb_pd_config.h"
#include "version.h"
+#define CPRINTF(format, args...) cprintf(CC_USBPD, format, ## args)
+
#ifdef CONFIG_USB_PD_ALT_MODE
#ifdef CONFIG_USB_PD_ALT_MODE_DFP
@@ -90,10 +92,17 @@ static int dfp_discover_modes(int port, uint32_t *payload)
return 1;
}
-static int dfp_consume_modes(int port, uint32_t *payload)
+static int dfp_consume_modes(int port, int cnt, uint32_t *payload)
{
- memcpy(pe[port].svids[pe[port].svid_idx].mode_vdo, &payload[1],
- sizeof(uint32_t) * PDO_MODES);
+ int idx = pe[port].svid_idx;
+ pe[port].svids[idx].mode_cnt = cnt - 1;
+ if (pe[port].svids[idx].mode_cnt < 0) {
+ CPRINTF("PE ERR: no modes provided for SVID\n");
+ } else {
+ memcpy(pe[port].svids[pe[port].svid_idx].mode_vdo, &payload[1],
+ sizeof(uint32_t) * pe[port].svids[idx].mode_cnt);
+ }
+
pe[port].svid_idx++;
return (pe[port].svid_idx < pe[port].svid_cnt);
}
@@ -140,17 +149,26 @@ int pd_exit_mode(int port, uint32_t *payload)
static void dump_pe(int port)
{
int i, j;
- struct svdm_amode_data *modep = &pe[port].amode;
+
+ if (pe[port].svid_cnt < 1) {
+ ccprintf("No SVIDS discovered yet.\n");
+ return;
+ }
for (i = 0; i < pe[port].svid_cnt; i++) {
- ccprintf("SVID[%d]: %04x", i, pe[port].svids[i].svid);
- for (j = 0; j < (PDO_MAX_OBJECTS - 1); j++)
- ccprintf(" [%d] %08x", j,
+ ccprintf("SVID[%d]: %04x MODES:", i, pe[port].svids[i].svid);
+ for (j = 0; j < pe[port].svids[j].mode_cnt; j++)
+ ccprintf(" [%d] %08x", j + 1,
pe[port].svids[i].mode_vdo[j]);
ccprintf("\n");
}
- ccprintf("MODE[%d]: svid:%04x mode:%d caps:%08x\n", i,
- modep->fx->svid, modep->index + 1, modep->mode_caps);
+ if (pe[port].amode.index == -1) {
+ ccprintf("No mode chosen yet.\n");
+ return;
+ }
+
+ ccprintf("MODE[%d]: svid:%04x caps:%08x\n", pe[port].amode.index + 1,
+ pe[port].amode.fx->svid, pe[port].amode.mode_caps);
}
static int command_pe(int argc, char **argv)
@@ -234,13 +252,14 @@ int pd_svdm(int port, int cnt, uint32_t *payload, uint32_t **rpayload)
rsize = dfp_discover_modes(port, payload);
break;
case CMD_DISCOVER_MODES:
- if (dfp_consume_modes(port, payload))
+ if (dfp_consume_modes(port, cnt, payload))
rsize = dfp_discover_modes(port, payload);
else
rsize = dfp_enter_mode(port, payload);
break;
case CMD_ENTER_MODE:
- rsize = dfp_enter_mode(port, payload);
+ rsize = 0;
+ break;
case CMD_EXIT_MODE:
rsize = pd_exit_mode(port, payload);
break;
diff --git a/include/usb_pd.h b/include/usb_pd.h
index 201ad057bd..82fdaec122 100644
--- a/include/usb_pd.h
+++ b/include/usb_pd.h
@@ -117,6 +117,7 @@ struct svdm_response {
struct svdm_svid_data {
uint16_t svid;
+ int mode_cnt;
uint32_t mode_vdo[PDO_MODES];
};