cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

otg-fsm.h (8823B)


      1// SPDX-License-Identifier: GPL-2.0+
      2/* Copyright (C) 2007,2008 Freescale Semiconductor, Inc.
      3 *
      4 * This program is free software; you can redistribute  it and/or modify it
      5 * under  the terms of  the GNU General  Public License as published by the
      6 * Free Software Foundation;  either version 2 of the  License, or (at your
      7 * option) any later version.
      8 *
      9 * This program is distributed in the hope that it will be useful, but
     10 * WITHOUT ANY WARRANTY; without even the implied warranty of
     11 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
     12 * General Public License for more details.
     13 *
     14 * You should have received a copy of the  GNU General Public License along
     15 * with this program; if not, write  to the Free Software Foundation, Inc.,
     16 * 675 Mass Ave, Cambridge, MA 02139, USA.
     17 */
     18
     19#ifndef __LINUX_USB_OTG_FSM_H
     20#define __LINUX_USB_OTG_FSM_H
     21
     22#include <linux/mutex.h>
     23#include <linux/errno.h>
     24
     25#define PROTO_UNDEF	(0)
     26#define PROTO_HOST	(1)
     27#define PROTO_GADGET	(2)
     28
     29#define OTG_STS_SELECTOR	0xF000	/* OTG status selector, according to
     30					 * OTG and EH 2.0 Chapter 6.2.3
     31					 * Table:6-4
     32					 */
     33
     34#define HOST_REQUEST_FLAG	1	/* Host request flag, according to
     35					 * OTG and EH 2.0 Charpter 6.2.3
     36					 * Table:6-5
     37					 */
     38
     39#define T_HOST_REQ_POLL		(1500)	/* 1500ms, HNP polling interval */
     40
     41enum otg_fsm_timer {
     42	/* Standard OTG timers */
     43	A_WAIT_VRISE,
     44	A_WAIT_VFALL,
     45	A_WAIT_BCON,
     46	A_AIDL_BDIS,
     47	B_ASE0_BRST,
     48	A_BIDL_ADIS,
     49	B_AIDL_BDIS,
     50
     51	/* Auxiliary timers */
     52	B_SE0_SRP,
     53	B_SRP_FAIL,
     54	A_WAIT_ENUM,
     55	B_DATA_PLS,
     56	B_SSEND_SRP,
     57
     58	NUM_OTG_FSM_TIMERS,
     59};
     60
     61/**
     62 * struct otg_fsm - OTG state machine according to the OTG spec
     63 *
     64 * OTG hardware Inputs
     65 *
     66 *	Common inputs for A and B device
     67 * @id:		TRUE for B-device, FALSE for A-device.
     68 * @adp_change: TRUE when current ADP measurement (n) value, compared to the
     69 *		ADP measurement taken at n-2, differs by more than CADP_THR
     70 * @power_up:	TRUE when the OTG device first powers up its USB system and
     71 *		ADP measurement taken if ADP capable
     72 *
     73 *	A-Device state inputs
     74 * @a_srp_det:	TRUE if the A-device detects SRP
     75 * @a_vbus_vld:	TRUE when VBUS voltage is in regulation
     76 * @b_conn:	TRUE if the A-device detects connection from the B-device
     77 * @a_bus_resume: TRUE when the B-device detects that the A-device is signaling
     78 *		  a resume (K state)
     79 *	B-Device state inputs
     80 * @a_bus_suspend: TRUE when the B-device detects that the A-device has put the
     81 *		bus into suspend
     82 * @a_conn:	TRUE if the B-device detects a connection from the A-device
     83 * @b_se0_srp:	TRUE when the line has been at SE0 for more than the minimum
     84 *		time before generating SRP
     85 * @b_ssend_srp: TRUE when the VBUS has been below VOTG_SESS_VLD for more than
     86 *		 the minimum time before generating SRP
     87 * @b_sess_vld:	TRUE when the B-device detects that the voltage on VBUS is
     88 *		above VOTG_SESS_VLD
     89 * @test_device: TRUE when the B-device switches to B-Host and detects an OTG
     90 *		test device. This must be set by host/hub driver
     91 *
     92 *	Application inputs (A-Device)
     93 * @a_bus_drop:	TRUE when A-device application needs to power down the bus
     94 * @a_bus_req:	TRUE when A-device application wants to use the bus.
     95 *		FALSE to suspend the bus
     96 *
     97 *	Application inputs (B-Device)
     98 * @b_bus_req:	TRUE during the time that the Application running on the
     99 *		B-device wants to use the bus
    100 *
    101 *	Auxiliary inputs (OTG v1.3 only. Obsolete now.)
    102 * @a_sess_vld:	TRUE if the A-device detects that VBUS is above VA_SESS_VLD
    103 * @b_bus_suspend: TRUE when the A-device detects that the B-device has put
    104 *		the bus into suspend
    105 * @b_bus_resume: TRUE when the A-device detects that the B-device is signaling
    106 *		 resume on the bus
    107 *
    108 * OTG Output status. Read only for users. Updated by OTG FSM helpers defined
    109 * in this file
    110 *
    111 *	Outputs for Both A and B device
    112 * @drv_vbus:	TRUE when A-device is driving VBUS
    113 * @loc_conn:	TRUE when the local device has signaled that it is connected
    114 *		to the bus
    115 * @loc_sof:	TRUE when the local device is generating activity on the bus
    116 * @adp_prb:	TRUE when the local device is in the process of doing
    117 *		ADP probing
    118 *
    119 *	Outputs for B-device state
    120 * @adp_sns:	TRUE when the B-device is in the process of carrying out
    121 *		ADP sensing
    122 * @data_pulse: TRUE when the B-device is performing data line pulsing
    123 *
    124 * Internal Variables
    125 *
    126 * a_set_b_hnp_en: TRUE when the A-device has successfully set the
    127 *		b_hnp_enable bit in the B-device.
    128 *		   Unused as OTG fsm uses otg->host->b_hnp_enable instead
    129 * b_srp_done:	TRUE when the B-device has completed initiating SRP
    130 * b_hnp_enable: TRUE when the B-device has accepted the
    131 *		SetFeature(b_hnp_enable) B-device.
    132 *		Unused as OTG fsm uses otg->gadget->b_hnp_enable instead
    133 * a_clr_err:	Asserted (by application ?) to clear a_vbus_err due to an
    134 *		overcurrent condition and causes the A-device to transition
    135 *		to a_wait_vfall
    136 */
    137struct otg_fsm {
    138	/* Input */
    139	int id;
    140	int adp_change;
    141	int power_up;
    142	int a_srp_det;
    143	int a_vbus_vld;
    144	int b_conn;
    145	int a_bus_resume;
    146	int a_bus_suspend;
    147	int a_conn;
    148	int b_se0_srp;
    149	int b_ssend_srp;
    150	int b_sess_vld;
    151	int test_device;
    152	int a_bus_drop;
    153	int a_bus_req;
    154	int b_bus_req;
    155
    156	/* Auxiliary inputs */
    157	int a_sess_vld;
    158	int b_bus_resume;
    159	int b_bus_suspend;
    160
    161	/* Output */
    162	int drv_vbus;
    163	int loc_conn;
    164	int loc_sof;
    165	int adp_prb;
    166	int adp_sns;
    167	int data_pulse;
    168
    169	/* Internal variables */
    170	int a_set_b_hnp_en;
    171	int b_srp_done;
    172	int b_hnp_enable;
    173	int a_clr_err;
    174
    175	/* Informative variables. All unused as of now */
    176	int a_bus_drop_inf;
    177	int a_bus_req_inf;
    178	int a_clr_err_inf;
    179	int b_bus_req_inf;
    180	/* Auxiliary informative variables */
    181	int a_suspend_req_inf;
    182
    183	/* Timeout indicator for timers */
    184	int a_wait_vrise_tmout;
    185	int a_wait_vfall_tmout;
    186	int a_wait_bcon_tmout;
    187	int a_aidl_bdis_tmout;
    188	int b_ase0_brst_tmout;
    189	int a_bidl_adis_tmout;
    190
    191	struct otg_fsm_ops *ops;
    192	struct usb_otg *otg;
    193
    194	/* Current usb protocol used: 0:undefine; 1:host; 2:client */
    195	int protocol;
    196	struct mutex lock;
    197	u8 *host_req_flag;
    198	struct delayed_work hnp_polling_work;
    199	bool hnp_work_inited;
    200	bool state_changed;
    201};
    202
    203struct otg_fsm_ops {
    204	void	(*chrg_vbus)(struct otg_fsm *fsm, int on);
    205	void	(*drv_vbus)(struct otg_fsm *fsm, int on);
    206	void	(*loc_conn)(struct otg_fsm *fsm, int on);
    207	void	(*loc_sof)(struct otg_fsm *fsm, int on);
    208	void	(*start_pulse)(struct otg_fsm *fsm);
    209	void	(*start_adp_prb)(struct otg_fsm *fsm);
    210	void	(*start_adp_sns)(struct otg_fsm *fsm);
    211	void	(*add_timer)(struct otg_fsm *fsm, enum otg_fsm_timer timer);
    212	void	(*del_timer)(struct otg_fsm *fsm, enum otg_fsm_timer timer);
    213	int	(*start_host)(struct otg_fsm *fsm, int on);
    214	int	(*start_gadget)(struct otg_fsm *fsm, int on);
    215};
    216
    217
    218static inline int otg_chrg_vbus(struct otg_fsm *fsm, int on)
    219{
    220	if (!fsm->ops->chrg_vbus)
    221		return -EOPNOTSUPP;
    222	fsm->ops->chrg_vbus(fsm, on);
    223	return 0;
    224}
    225
    226static inline int otg_drv_vbus(struct otg_fsm *fsm, int on)
    227{
    228	if (!fsm->ops->drv_vbus)
    229		return -EOPNOTSUPP;
    230	if (fsm->drv_vbus != on) {
    231		fsm->drv_vbus = on;
    232		fsm->ops->drv_vbus(fsm, on);
    233	}
    234	return 0;
    235}
    236
    237static inline int otg_loc_conn(struct otg_fsm *fsm, int on)
    238{
    239	if (!fsm->ops->loc_conn)
    240		return -EOPNOTSUPP;
    241	if (fsm->loc_conn != on) {
    242		fsm->loc_conn = on;
    243		fsm->ops->loc_conn(fsm, on);
    244	}
    245	return 0;
    246}
    247
    248static inline int otg_loc_sof(struct otg_fsm *fsm, int on)
    249{
    250	if (!fsm->ops->loc_sof)
    251		return -EOPNOTSUPP;
    252	if (fsm->loc_sof != on) {
    253		fsm->loc_sof = on;
    254		fsm->ops->loc_sof(fsm, on);
    255	}
    256	return 0;
    257}
    258
    259static inline int otg_start_pulse(struct otg_fsm *fsm)
    260{
    261	if (!fsm->ops->start_pulse)
    262		return -EOPNOTSUPP;
    263	if (!fsm->data_pulse) {
    264		fsm->data_pulse = 1;
    265		fsm->ops->start_pulse(fsm);
    266	}
    267	return 0;
    268}
    269
    270static inline int otg_start_adp_prb(struct otg_fsm *fsm)
    271{
    272	if (!fsm->ops->start_adp_prb)
    273		return -EOPNOTSUPP;
    274	if (!fsm->adp_prb) {
    275		fsm->adp_sns = 0;
    276		fsm->adp_prb = 1;
    277		fsm->ops->start_adp_prb(fsm);
    278	}
    279	return 0;
    280}
    281
    282static inline int otg_start_adp_sns(struct otg_fsm *fsm)
    283{
    284	if (!fsm->ops->start_adp_sns)
    285		return -EOPNOTSUPP;
    286	if (!fsm->adp_sns) {
    287		fsm->adp_sns = 1;
    288		fsm->ops->start_adp_sns(fsm);
    289	}
    290	return 0;
    291}
    292
    293static inline int otg_add_timer(struct otg_fsm *fsm, enum otg_fsm_timer timer)
    294{
    295	if (!fsm->ops->add_timer)
    296		return -EOPNOTSUPP;
    297	fsm->ops->add_timer(fsm, timer);
    298	return 0;
    299}
    300
    301static inline int otg_del_timer(struct otg_fsm *fsm, enum otg_fsm_timer timer)
    302{
    303	if (!fsm->ops->del_timer)
    304		return -EOPNOTSUPP;
    305	fsm->ops->del_timer(fsm, timer);
    306	return 0;
    307}
    308
    309static inline int otg_start_host(struct otg_fsm *fsm, int on)
    310{
    311	if (!fsm->ops->start_host)
    312		return -EOPNOTSUPP;
    313	return fsm->ops->start_host(fsm, on);
    314}
    315
    316static inline int otg_start_gadget(struct otg_fsm *fsm, int on)
    317{
    318	if (!fsm->ops->start_gadget)
    319		return -EOPNOTSUPP;
    320	return fsm->ops->start_gadget(fsm, on);
    321}
    322
    323int otg_statemachine(struct otg_fsm *fsm);
    324
    325#endif /* __LINUX_USB_OTG_FSM_H */