summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAndrew McRae <amcrae@google.com>2020-05-21 17:17:12 +1000
committerCommit Bot <commit-bot@chromium.org>2020-05-27 03:36:33 +0000
commit85d87528a69a65f2c4b50ccd3e8357db14453020 (patch)
treee6cb6ca0ee6bf79c7bb8c5c463fed07a11618213
parent8f409a3716c4bdb8e288e54a559da75ff30f375b (diff)
downloadchrome-ec-85d87528a69a65f2c4b50ccd3e8357db14453020.tar.gz
Extend the tcpci register dump.
Extend the tcpci register dump command to allow chip specific register dumps to be displayed. BUG=b:157206143 TEST=Display ANX3447 registers on Puff. BRANCH=none Change-Id: Ib2bf1adcbe3bce75ff54c36c4306b17356eae96f Signed-off-by: Andrew McRae <amcrae@google.com> Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/ec/+/2208344 Tested-by: Andrew McRae <amcrae@chromium.org> Auto-Submit: Andrew McRae <amcrae@chromium.org> Reviewed-by: Peter Marheine <pmarheine@chromium.org> Reviewed-by: Jett Rink <jettrink@chromium.org> Commit-Queue: Andrew McRae <amcrae@chromium.org>
-rw-r--r--baseboard/trogdor/baseboard.h2
-rw-r--r--baseboard/volteer/baseboard.h2
-rw-r--r--baseboard/zork/baseboard.h2
-rw-r--r--board/puff/board.h2
-rw-r--r--board/waddledoo/board.h2
-rw-r--r--common/usb_common.c48
-rw-r--r--driver/tcpm/anx7447.c69
-rw-r--r--driver/tcpm/tcpci.c175
-rw-r--r--driver/tcpm/tcpm.h10
-rw-r--r--include/config.h2
-rw-r--r--include/usb_pd_tcpm.h35
11 files changed, 255 insertions, 94 deletions
diff --git a/baseboard/trogdor/baseboard.h b/baseboard/trogdor/baseboard.h
index 47deb36c54..8923022c56 100644
--- a/baseboard/trogdor/baseboard.h
+++ b/baseboard/trogdor/baseboard.h
@@ -104,7 +104,7 @@
#define CONFIG_USB_PD_PORT_MAX_COUNT 2
#define CONFIG_USB_PD_TCPM_MUX
#define CONFIG_USB_PD_TCPM_TCPCI
-#define CONFIG_CMD_TCPCI_DUMP
+#define CONFIG_CMD_TCPC_DUMP
#define CONFIG_USB_PD_TRY_SRC
#define CONFIG_USB_PD_VBUS_DETECT_TCPC
#define CONFIG_USB_PD_5V_EN_CUSTOM
diff --git a/baseboard/volteer/baseboard.h b/baseboard/volteer/baseboard.h
index e5db524f0f..292a938d41 100644
--- a/baseboard/volteer/baseboard.h
+++ b/baseboard/volteer/baseboard.h
@@ -144,7 +144,7 @@
#define CONFIG_USB_PD_REV30
#endif
-#define CONFIG_CMD_TCPCI_DUMP
+#define CONFIG_CMD_TCPC_DUMP
#define CONFIG_USB_POWER_DELIVERY
#define CONFIG_USB_PD_TCPMV1
diff --git a/baseboard/zork/baseboard.h b/baseboard/zork/baseboard.h
index d753e2d7b1..e8efdea7ff 100644
--- a/baseboard/zork/baseboard.h
+++ b/baseboard/zork/baseboard.h
@@ -138,7 +138,7 @@
#endif
#define CONFIG_HOSTCMD_PD_CONTROL
-#define CONFIG_CMD_TCPCI_DUMP
+#define CONFIG_CMD_TCPC_DUMP
#define CONFIG_USB_CHARGER
#define CONFIG_USB_POWER_DELIVERY
#define CONFIG_USB_PD_ALT_MODE
diff --git a/board/puff/board.h b/board/puff/board.h
index 2d2ec31cf3..b8ffc965d3 100644
--- a/board/puff/board.h
+++ b/board/puff/board.h
@@ -64,7 +64,7 @@
#define CONFIG_HOSTCMD_PD_CONTROL
#undef CONFIG_CMD_PWR_AVG
#define CONFIG_CMD_PPC_DUMP
-#define CONFIG_CMD_TCPCI_DUMP
+#define CONFIG_CMD_TCPC_DUMP
#ifdef SECTION_IS_RO
/* Reduce RO size by removing less-relevant commands. */
#undef CONFIG_CMD_APTHROTTLE
diff --git a/board/waddledoo/board.h b/board/waddledoo/board.h
index ed765eedea..bb531c89a3 100644
--- a/board/waddledoo/board.h
+++ b/board/waddledoo/board.h
@@ -24,7 +24,7 @@
#define CONFIG_CHARGER_SENSE_RESISTOR 10
/* EC console commands */
-#define CONFIG_CMD_TCPCI_DUMP
+#define CONFIG_CMD_TCPC_DUMP
/* Keyboard */
#define CONFIG_PWM_KBLIGHT
diff --git a/common/usb_common.c b/common/usb_common.c
index f3607f7aa5..156dc816cb 100644
--- a/common/usb_common.c
+++ b/common/usb_common.c
@@ -727,3 +727,51 @@ int pd_is_vbus_present(int port)
{
return pd_check_vbus_level(port, VBUS_PRESENT);
}
+
+#ifdef CONFIG_CMD_TCPC_DUMP
+/*
+ * Dump TCPC registers.
+ */
+void tcpc_dump_registers(int port, const struct tcpc_reg_dump_map *reg,
+ int count)
+{
+ int i, val;
+
+ for (i = 0; i < count; i++, reg++) {
+ switch (reg->size) {
+ case 1:
+ tcpc_read(port, reg->addr, &val);
+ ccprintf(" %-30s(0x%02x) = 0x%02x\n",
+ reg->name, reg->addr, (uint8_t)val);
+ break;
+ case 2:
+ tcpc_read16(port, reg->addr, &val);
+ ccprintf(" %-30s(0x%02x) = 0x%04x\n",
+ reg->name, reg->addr, (uint16_t)val);
+ break;
+ }
+ cflush();
+ }
+
+}
+
+static int command_tcpc_dump(int argc, char **argv)
+{
+ int port;
+
+ if (argc < 2)
+ return EC_ERROR_PARAM_COUNT;
+
+ port = atoi(argv[1]);
+ if ((port < 0) || (port >= board_get_usb_pd_port_count())) {
+ CPRINTS("%s(%d) Invalid port!", __func__, port);
+ return EC_ERROR_INVAL;
+ }
+ /* Dump TCPC registers. */
+ tcpm_dump_registers(port);
+
+ return EC_SUCCESS;
+}
+DECLARE_CONSOLE_COMMAND(tcpci_dump, command_tcpc_dump, "<Type-C port>",
+ "dump the TCPC regs");
+#endif /* defined(CONFIG_CMD_TCPC_DUMP) */
diff --git a/driver/tcpm/anx7447.c b/driver/tcpm/anx7447.c
index aee839936d..b43455a3ac 100644
--- a/driver/tcpm/anx7447.c
+++ b/driver/tcpm/anx7447.c
@@ -739,6 +739,72 @@ static int anx7447_set_polarity(int port,
? MASK_SET : MASK_CLR);
}
+#ifdef CONFIG_CMD_TCPC_DUMP
+static const struct tcpc_reg_dump_map anx7447_regs[] = {
+ {
+ .addr = ANX7447_REG_STATUS,
+ .name = "ANX7447_STATUS",
+ .size = 1,
+ },
+ {
+ .addr = ANX7447_REG_ADC_CTRL_1,
+ .name = "ADC_CTRL_1",
+ .size = 1,
+ },
+ {
+ .addr = ANX7447_REG_ANALOG_CTRL_8,
+ .name = "ANALOG_CTRL_8",
+ .size = 1,
+ },
+ {
+ .addr = ANX7447_REG_ANALOG_CTRL_10,
+ .name = "ANALOG_CTRL_10",
+ .size = 1,
+ },
+ {
+ .addr = ANX7447_REG_TCPC_CTRL_2,
+ .name = "TCPC_CTRL_2",
+ .size = 1,
+ },
+};
+
+const struct {
+ const char *name;
+ uint8_t addr;
+} anx7447_alt_regs[] = {
+ {
+ .addr = ANX7447_REG_HPD,
+ .name = "HPD",
+ },
+ {
+ .name = "HPD_CTRL_0",
+ .addr = ANX7447_REG_HPD_CTRL_0,
+ },
+ {
+ .name = "HPD_DEGLITCH_H",
+ .addr = ANX7447_REG_HPD_DEGLITCH_H,
+ },
+};
+
+/*
+ * Dump registers for debug command.
+ */
+static void anx7447_dump_registers(int port)
+{
+ int i, val;
+
+ tcpc_dump_std_registers(port);
+ tcpc_dump_registers(port, anx7447_regs, ARRAY_SIZE(anx7447_regs));
+ for (i = 0; i < ARRAY_SIZE(anx7447_alt_regs); i++) {
+ anx7447_reg_read(port, anx7447_alt_regs[i].addr, &val);
+ ccprintf(" %-26s(ALT/0x%02x) = 0x%02x\n",
+ anx7447_alt_regs[i].name,
+ anx7447_alt_regs[i].addr, (uint8_t)val);
+ cflush();
+ }
+}
+#endif /* defined(CONFIG_CMD_TCPC_DUMP) */
+
/*
* ANX7447 is a TCPCI compatible port controller, with some caveats.
* It seems to require both CC lines to be set always, instead of just
@@ -776,6 +842,9 @@ const struct tcpm_drv anx7447_tcpm_drv = {
#ifdef CONFIG_USB_PD_TCPC_LOW_POWER
.enter_low_power_mode = &tcpci_enter_low_power_mode,
#endif
+#ifdef CONFIG_CMD_TCPC_DUMP
+ .dump_registers = &anx7447_dump_registers,
+#endif
};
#ifdef CONFIG_USB_PD_TCPM_MUX
diff --git a/driver/tcpm/tcpci.c b/driver/tcpm/tcpci.c
index 85eab7c521..90a51ed971 100644
--- a/driver/tcpm/tcpci.c
+++ b/driver/tcpm/tcpci.c
@@ -1456,207 +1456,203 @@ const struct usb_mux_driver tcpci_tcpm_usb_mux_driver = {
#endif /* CONFIG_USB_PD_TCPM_MUX */
-#ifdef CONFIG_CMD_TCPCI_DUMP
-struct tcpci_reg {
- const char *name;
- uint8_t size;
-};
-
-static const struct tcpci_reg tcpci_regs[] = {
- [TCPC_REG_VENDOR_ID] = {
+#ifdef CONFIG_CMD_TCPC_DUMP
+static const struct tcpc_reg_dump_map tcpc_regs[] = {
+ {
+ .addr = TCPC_REG_VENDOR_ID,
.name = "VENDOR_ID",
.size = 2,
},
- [TCPC_REG_PRODUCT_ID] = {
+ {
+ .addr = TCPC_REG_PRODUCT_ID,
.name = "PRODUCT_ID",
.size = 2,
},
- [TCPC_REG_BCD_DEV] = {
+ {
+ .addr = TCPC_REG_BCD_DEV,
.name = "BCD_DEV",
.size = 2,
},
- [TCPC_REG_TC_REV] = {
+ {
+ .addr = TCPC_REG_TC_REV,
.name = "TC_REV",
.size = 2,
},
- [TCPC_REG_PD_REV] = {
+ {
+ .addr = TCPC_REG_PD_REV,
.name = "PD_REV",
.size = 2,
},
- [TCPC_REG_PD_INT_REV] = {
+ {
+ .addr = TCPC_REG_PD_INT_REV,
.name = "PD_INT_REV",
.size = 2,
},
- [TCPC_REG_ALERT] = {
+ {
+ .addr = TCPC_REG_ALERT,
.name = "ALERT",
.size = 2,
},
- [TCPC_REG_ALERT_MASK] = {
+ {
+ .addr = TCPC_REG_ALERT_MASK,
.name = "ALERT_MASK",
.size = 2,
},
- [TCPC_REG_POWER_STATUS_MASK] = {
+ {
+ .addr = TCPC_REG_POWER_STATUS_MASK,
.name = "POWER_STATUS_MASK",
.size = 1,
},
- [TCPC_REG_FAULT_STATUS_MASK] = {
+ {
+ .addr = TCPC_REG_FAULT_STATUS_MASK,
.name = "FAULT_STATUS_MASK",
.size = 1,
},
- [TCPC_REG_EXT_STATUS_MASK] = {
+ {
+ .addr = TCPC_REG_EXT_STATUS_MASK,
.name = "EXT_STATUS_MASK",
- .size = 1 },
- [TCPC_REG_ALERT_EXTENDED_MASK] = {
+ .size = 1
+ },
+ {
+ .addr = TCPC_REG_ALERT_EXTENDED_MASK,
.name = "ALERT_EXTENDED_MASK",
.size = 1,
},
- [TCPC_REG_CONFIG_STD_OUTPUT] = {
+ {
+ .addr = TCPC_REG_CONFIG_STD_OUTPUT,
.name = "CONFIG_STD_OUTPUT",
.size = 1,
},
- [TCPC_REG_TCPC_CTRL] = {
+ {
+ .addr = TCPC_REG_TCPC_CTRL,
.name = "TCPC_CTRL",
.size = 1,
},
- [TCPC_REG_ROLE_CTRL] = {
+ {
+ .addr = TCPC_REG_ROLE_CTRL,
.name = "ROLE_CTRL",
.size = 1,
},
- [TCPC_REG_FAULT_CTRL] = {
+ {
+ .addr = TCPC_REG_FAULT_CTRL,
.name = "FAULT_CTRL",
.size = 1,
},
- [TCPC_REG_POWER_CTRL] = {
+ {
+ .addr = TCPC_REG_POWER_CTRL,
.name = "POWER_CTRL",
.size = 1,
},
- [TCPC_REG_CC_STATUS] = {
+ {
+ .addr = TCPC_REG_CC_STATUS,
.name = "CC_STATUS",
.size = 1,
},
- [TCPC_REG_POWER_STATUS] = {
+ {
+ .addr = TCPC_REG_POWER_STATUS,
.name = "POWER_STATUS",
.size = 1,
},
- [TCPC_REG_FAULT_STATUS] = {
+ {
+ .addr = TCPC_REG_FAULT_STATUS,
.name = "FAULT_STATUS",
.size = 1,
},
- [TCPC_REG_EXT_STATUS] = {
+ {
+ .addr = TCPC_REG_EXT_STATUS,
.name = "EXT_STATUS",
.size = 1,
},
- [TCPC_REG_ALERT_EXT] = {
+ {
+ .addr = TCPC_REG_ALERT_EXT,
.name = "ALERT_EXT",
.size = 1,
},
- [TCPC_REG_DEV_CAP_1] = {
+ {
+ .addr = TCPC_REG_DEV_CAP_1,
.name = "DEV_CAP_1",
.size = 2,
},
- [TCPC_REG_DEV_CAP_2] = {
+ {
+ .addr = TCPC_REG_DEV_CAP_2,
.name = "DEV_CAP_2",
.size = 2,
},
- [TCPC_REG_STD_INPUT_CAP] = {
+ {
+ .addr = TCPC_REG_STD_INPUT_CAP,
.name = "STD_INPUT_CAP",
.size = 1,
},
- [TCPC_REG_STD_OUTPUT_CAP] = {
+ {
+ .addr = TCPC_REG_STD_OUTPUT_CAP,
.name = "STD_OUTPUT_CAP",
.size = 1,
},
- [TCPC_REG_CONFIG_EXT_1] = {
+ {
+ .addr = TCPC_REG_CONFIG_EXT_1,
.name = "CONFIG_EXT_1",
.size = 1,
},
- [TCPC_REG_MSG_HDR_INFO] = {
+ {
+ .addr = TCPC_REG_MSG_HDR_INFO,
.name = "MSG_HDR_INFO",
.size = 1,
},
- [TCPC_REG_RX_DETECT] = {
+ {
+ .addr = TCPC_REG_RX_DETECT,
.name = "RX_DETECT",
.size = 1,
},
- [TCPC_REG_RX_BYTE_CNT] = {
+ {
+ .addr = TCPC_REG_RX_BYTE_CNT,
.name = "RX_BYTE_CNT",
.size = 1,
},
- [TCPC_REG_RX_BUF_FRAME_TYPE] = {
+ {
+ .addr = TCPC_REG_RX_BUF_FRAME_TYPE,
.name = "RX_BUF_FRAME_TYPE",
.size = 1,
},
- [TCPC_REG_TRANSMIT] = {
+ {
+ .addr = TCPC_REG_TRANSMIT,
.name = "TRANSMIT",
.size = 1,
},
- [TCPC_REG_VBUS_VOLTAGE] = {
+ {
+ .addr = TCPC_REG_VBUS_VOLTAGE,
.name = "VBUS_VOLTAGE",
.size = 2,
},
- [TCPC_REG_VBUS_SINK_DISCONNECT_THRESH] = {
+ {
+ .addr = TCPC_REG_VBUS_SINK_DISCONNECT_THRESH,
.name = "VBUS_SINK_DISCONNECT_THRESH",
.size = 2,
},
- [TCPC_REG_VBUS_STOP_DISCHARGE_THRESH] = {
+ {
+ .addr = TCPC_REG_VBUS_STOP_DISCHARGE_THRESH,
.name = "VBUS_STOP_DISCHARGE_THRESH",
.size = 2,
},
- [TCPC_REG_VBUS_VOLTAGE_ALARM_HI_CFG] = {
+ {
+ .addr = TCPC_REG_VBUS_VOLTAGE_ALARM_HI_CFG,
.name = "VBUS_VOLTAGE_ALARM_HI_CFG",
.size = 2,
},
- [TCPC_REG_VBUS_VOLTAGE_ALARM_LO_CFG] = {
+ {
+ .addr = TCPC_REG_VBUS_VOLTAGE_ALARM_LO_CFG,
.name = "VBUS_VOLTAGE_ALARM_LO_CFG",
.size = 2,
},
};
-static int command_tcpci_dump(int argc, char **argv)
+/*
+ * Dump standard TCPC registers.
+ */
+void tcpc_dump_std_registers(int port)
{
- int port;
- int i;
- int val;
-
- if (argc < 2)
- return EC_ERROR_PARAM_COUNT;
-
- port = atoi(argv[1]);
- if ((port < 0) || (port >= board_get_usb_pd_port_count())) {
- CPRINTS("%s(%d) Invalid port!", __func__, port);
- return EC_ERROR_INVAL;
- }
-
- for (i = 0; i < ARRAY_SIZE(tcpci_regs); i++) {
- switch (tcpci_regs[i].size) {
- case 1:
- tcpc_read(port, i, &val);
- ccprintf(" %-30s(0x%02x) = 0x%02x\n",
- tcpci_regs[i].name, i, (uint8_t)val);
- break;
- case 2:
- tcpc_read16(port, i, &val);
- ccprintf(" %-30s(0x%02x) = 0x%04x\n",
- tcpci_regs[i].name, i, (uint16_t)val);
- break;
- default:
- /*
- * The tcpci_regs[] array is indexed by the register
- * offset. Unused registers are zero initialized so we
- * skip any entries that have the size field set to
- * zero.
- */
- break;
- }
- cflush();
- }
-
- return EC_SUCCESS;
+ tcpc_dump_registers(port, tcpc_regs, ARRAY_SIZE(tcpc_regs));
}
-DECLARE_CONSOLE_COMMAND(tcpci_dump, command_tcpci_dump, "<Type-C port>",
- "dump the TCPCI regs");
-#endif /* defined(CONFIG_CMD_TCPCI_DUMP) */
-
+#endif
const struct tcpm_drv tcpci_tcpm_drv = {
.init = &tcpci_tcpm_init,
@@ -1688,4 +1684,7 @@ const struct tcpm_drv tcpci_tcpm_drv = {
#ifdef CONFIG_USB_PD_TCPC_LOW_POWER
.enter_low_power_mode = &tcpci_enter_low_power_mode,
#endif
+#ifdef CONFIG_CMD_TCPC_DUMP
+ .dump_registers = &tcpc_dump_std_registers,
+#endif
};
diff --git a/driver/tcpm/tcpm.h b/driver/tcpm/tcpm.h
index f97bb39b9c..889e396cb7 100644
--- a/driver/tcpm/tcpm.h
+++ b/driver/tcpm/tcpm.h
@@ -468,4 +468,14 @@ static inline void tcpm_set_frs_enable(int port, int enable)
tcpc->set_frs_enable(port, enable);
}
+#ifdef CONFIG_CMD_TCPC_DUMP
+static inline void tcpm_dump_registers(int port)
+{
+ const struct tcpm_drv *tcpc = tcpc_config[port].drv;
+
+ if (tcpc->dump_registers)
+ tcpc->dump_registers(port);
+}
+#endif /* defined(CONFIG_CMD_TCPC_DUMP) */
+
#endif
diff --git a/include/config.h b/include/config.h
index 2370e3d77e..bdd3bcd251 100644
--- a/include/config.h
+++ b/include/config.h
@@ -1280,7 +1280,7 @@
#define CONFIG_CMD_SYSLOCK
#undef CONFIG_CMD_TASK_RESET
#undef CONFIG_CMD_TASKREADY
-#undef CONFIG_CMD_TCPCI_DUMP
+#undef CONFIG_CMD_TCPC_DUMP
#define CONFIG_CMD_TEMP_SENSOR
#define CONFIG_CMD_TIMERINFO
#define CONFIG_CMD_TYPEC
diff --git a/include/usb_pd_tcpm.h b/include/usb_pd_tcpm.h
index 60a50f0f2e..0e686d35d4 100644
--- a/include/usb_pd_tcpm.h
+++ b/include/usb_pd_tcpm.h
@@ -424,6 +424,15 @@ struct tcpm_drv {
* @return EC_SUCCESS or error
*/
int (*handle_fault)(int port, int fault);
+
+#ifdef CONFIG_CMD_TCPC_DUMP
+ /**
+ * Dump TCPC registers
+ *
+ * @param port Type-C port number
+ */
+ void (*dump_registers)(int port);
+#endif /* defined(CONFIG_CMD_TCPC_DUMP) */
};
/*
@@ -529,4 +538,30 @@ void board_pd_vconn_ctrl(int port, enum usbpd_cc_pin cc_pin, int enabled);
*/
int tcpc_get_vbus_voltage(int port);
+#ifdef CONFIG_CMD_TCPC_DUMP
+struct tcpc_reg_dump_map {
+ uint8_t addr;
+ uint8_t size;
+ const char *name;
+};
+
+/**
+ * Dump the standard TCPC registers.
+ *
+ * @param port Type-C port number
+ *
+ */
+void tcpc_dump_std_registers(int port);
+
+/**
+ * Dump chip specific TCPC registers.
+ *
+ * @param port Type-C port number
+ * @param pointer to table of registers and names
+ * @param count of registers to dump
+ *
+ */
+void tcpc_dump_registers(int port, const struct tcpc_reg_dump_map *reg,
+ int count);
+#endif
#endif /* __CROS_EC_USB_PD_TCPM_H */