diff options
author | Jett Rink <jettrink@chromium.org> | 2018-08-17 13:33:02 -0600 |
---|---|---|
committer | chrome-bot <chrome-bot@chromium.org> | 2018-09-07 18:36:36 -0700 |
commit | e8070b44b088e99e38ec741ed8091c7e4a033bef (patch) | |
tree | dedc7bce6201fba05b92f4e48ec4405366fbc76b /driver/tcpm/tcpm.h | |
parent | e6a13850e9b5a6b2889549c03caddf2944e7fc63 (diff) | |
download | chrome-ec-e8070b44b088e99e38ec741ed8091c7e4a033bef.tar.gz |
tcpm: add TCPC RX circular buffer in EC
The alert line for TCPC will stay asserted as long as there are RX
messages for the TCPM (i.e. EC) to pull from the TCPC. We should clear
all of the RX messages we know about during a single alert handling
session.
This CL can stand on its own, but it is a part of a CL stack that will
tighten the critical section of time between received messages from the
TCPC and sending follow up message out through the TCPC.
See go/usb-pd-slow-response-time for more details.
BRANCH=none
BUG=b:112088135,b:112344286,b:111909282,b:112848644,b:113124761
BUG=b:113057273,b:112825261
TEST=Reduces reset issue in most cases for phaser, bobba. Does not seem to
adversely affect state machine negotiation. Full CL stack consistently
sends a REQUEST at 18ms after a SRC_CAP GoodCRC, which is well below the
24 ms threshold we need to be under for USB PD spec compliance.
Also testing pd_suspend scenario manually and EC was responsive after
port 1 suspend because of "bad behavior"
Change-Id: I1654b46400e9881f2927a5f6d6ace589edd182de
Signed-off-by: Jett Rink <jettrink@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/1185727
Diffstat (limited to 'driver/tcpm/tcpm.h')
-rw-r--r-- | driver/tcpm/tcpm.h | 38 |
1 files changed, 22 insertions, 16 deletions
diff --git a/driver/tcpm/tcpm.h b/driver/tcpm/tcpm.h index 0ea0bf47a7..a25ef6508b 100644 --- a/driver/tcpm/tcpm.h +++ b/driver/tcpm/tcpm.h @@ -160,13 +160,14 @@ static inline int tcpm_set_rx_enable(int port, int enable) return tcpc_config[port].drv->set_rx_enable(port, enable); } -static inline int tcpm_get_message(int port, uint32_t *payload, int *head) -{ - return tcpc_config[port].drv->get_message(port, payload, head); -} +/** + * Reads a message using get_message_raw driver method and puts it into EC's + * cache. + */ +int tcpm_enqueue_message(int port); static inline int tcpm_transmit(int port, enum tcpm_transmit_type type, - uint16_t header, const uint32_t *data) + uint16_t header, const uint32_t *data) { return tcpc_config[port].drv->transmit(port, type, header, data); } @@ -333,17 +334,6 @@ int tcpm_set_msg_header(int port, int power_role, int data_role); int tcpm_set_rx_enable(int port, int enable); /** - * Read last received PD message. - * - * @param port Type-C port number - * @param payload Pointer to location to copy payload of message - * @param header of message - * - * @return EC_SUCCESS or error - */ -int tcpm_get_message(int port, uint32_t *payload, int *head); - -/** * Transmit PD message * * @param port Type-C port number @@ -366,4 +356,20 @@ void tcpc_alert(int port); #endif +/** + * Gets the next waiting RX message. + * + * @param port Type-C port number + * @param payload Pointer to location to copy payload of PD message + * @param header The header of PD message + * + * @return EC_SUCCESS or error + */ +int tcpm_dequeue_message(int port, uint32_t *payload, int *header); + +/** + * Returns true if the tcpm has RX messages waiting to be consumed. + */ +int tcpm_has_pending_message(int port); + #endif |