summaryrefslogtreecommitdiff
path: root/include/usb_pd_dpm_sm.h
blob: 8fdd147be1f7e4a3bb7b67813fb3ed98df47b3be (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
/* Copyright 2020 The ChromiumOS Authors
 * Use of this source code is governed by a BSD-style license that can be
 * found in the LICENSE file.
 */

/*
 * Device Policy Manager implementation
 * Refer to USB PD 3.0 spec, version 2.0, sections 8.2 and 8.3
 */

#ifndef __CROS_EC_USB_DPM_H
#define __CROS_EC_USB_DPM_H

#include "ec_commands.h"
#include "usb_pd_tcpm.h"

/*
 * Initializes DPM state for a port.
 *
 * @param port USB-C port number
 */
void dpm_init(int port);

/**
 * Runs the Device Policy Manager State Machine
 *
 * @param port USB-C port number
 * @param evt  system event, ie: PD_EVENT_RX
 * @param en   0 to disable the machine, 1 to enable the machine
 */
void dpm_run(int port, int evt, int en);

/*
 * Informs the DPM that a mode exit is complete.
 *
 * @param port USB-C port number
 */
void dpm_mode_exit_complete(int port);

/*
 * Informs the DPM that Exit Mode request is received
 *
 * @param port USB-C port number
 */
void dpm_set_mode_exit_request(int port);

/* Informs the DPM that the PE has performed a Data Reset (or at least
 * determined that the port partner doesn't support one).
 *
 * @param port USB-C port number
 */
void dpm_data_reset_complete(int port);

/*
 * Informs the DPM that PE layer is in ready state so that data role can be
 * checked and DPM can know to exit the idle state.
 *
 * @param port USB-C port number
 */
void dpm_set_pe_ready(int port, bool enable);

/*
 * Informs the DPM that a VDM ACK was received.
 *
 * @param port      USB-C port number
 * @param type      Transmit type (SOP, SOP') for received ACK
 * @param vdo_count The number of VDOs in vdm; must be at least 1
 * @param vdm       The VDM payload of the ACK
 */
void dpm_vdm_acked(int port, enum tcpci_msg_type type, int vdo_count,
		   uint32_t *vdm);

/*
 * Informs the DPM that a VDM NAK was received. Also applies when a VDM request
 * received a Not Supported response or timed out waiting for a response.
 *
 * @param port    USB-C port number
 * @param type    Transmit type (SOP, SOP') for request
 * @param svid    The SVID of the request
 * @param vdm_cmd The VDM command of the request
 */
void dpm_vdm_naked(int port, enum tcpci_msg_type type, uint16_t svid,
		   uint8_t vdm_cmd);

/*
 * Determines the current allocation for the connection, past the basic
 * CONFIG_USB_PD_PULLUP value set by the TC (generally 1.5 A)
 *
 * @param port		USB-C port number
 * @param vsafe5v_pdo	Copy of first Sink_Capability PDO, which should
 *			represent the vSafe5V fixed PDO
 */
void dpm_evaluate_sink_fixed_pdo(int port, uint32_t vsafe5v_pdo);

/*
 * Registers port as a non-PD sink, so that can be taken into account when
 * allocating current.
 *
 * @param port		USB-C port number
 */
void dpm_add_non_pd_sink(int port);

/*
 * Evaluates the request from port partner
 *
 * @param port		USB-C port number
 * @param rdo		Request from port partner
 */
void dpm_evaluate_request_rdo(int port, uint32_t rdo);

/*
 * Remove this port as a sink, and reallocate maximum current as needed.
 *
 * @param port		USB-C port number
 */
void dpm_remove_sink(int port);

/*
 * Remove this port as a source, and reallocate reserved FRS maximum current
 * as needed.
 *
 * @param port		USB-C port number
 */
void dpm_remove_source(int port);

/*
 * Return the appropriate Source Capability PDO to offer this port
 *
 * @param src_pdo	Will point to appropriate PDO to offer
 * @param port		USB-C port number
 * @return		Number of PDOs
 */
int dpm_get_source_pdo(const uint32_t **src_pdo, const int port);

/*
 * Report offered source current for this port
 *
 * @param port		USB-C port number
 * @return		Current offered, in mA
 */
int dpm_get_source_current(const int port);

/*
 * Report we've been asked to enter BIST Shared Test Mode
 *
 * @param port		USB-C port number
 */
void dpm_bist_shared_mode_enter(int port);

/*
 * Report we've been asked to exit BIST Shared Test Mode
 *
 * @param port		USB-C port number
 */
void dpm_bist_shared_mode_exit(int port);

/*
 * Set BIST Shared Test Mode
 */
enum ec_status pd_set_bist_share_mode(uint8_t enable);

/*
 * Get BIST Shared Test Mode status
 */
uint8_t pd_get_bist_share_mode(void);
/*
 * Build SOP Status Data Block (SDB)
 *
 * @param port		USB-C port number
 * @param *msg		pointer to pd message
 * @param *len		pointer to uint32_t holding length of SDB
 */
int dpm_get_status_msg(int port, uint8_t *msg, uint32_t *len);

/*
 * DPM function to handle a received alert message
 *
 * @param port		USB-C port number
 * @param ado		Alert Data Object (ado) received from partner
 */
void dpm_handle_alert(int port, uint32_t ado);

/* Enum for modules to describe to the DPM their setup status */
enum dpm_msg_setup_status {
	MSG_SETUP_SUCCESS,
	MSG_SETUP_ERROR,
	MSG_SETUP_UNSUPPORTED,
	MSG_SETUP_MUX_WAIT,
};

/* Enum to describe current state of connected USB PD buttons */
enum dpm_pd_button_state {
	DPM_PD_BUTTON_IDLE,
	DPM_PD_BUTTON_PRESSED,
};
#endif /* __CROS_EC_USB_DPM_H */