1 /*
2  * Copyright (C) 2018-2022 Intel Corporation.
3  *
4  * SPDX-License-Identifier: BSD-3-Clause
5  *
6  */
7 
8 #ifndef _IOC_H_
9 #define _IOC_H_
10 
11 #include <stdint.h>
12 #include <pthread.h>
13 
14 #include <sys/queue.h>
15 #include <sys/epoll.h>
16 
17 /*
18  * Carrier Board Communication(CBC) frame definition
19  * +---+---------+-----------+---------------+---------+----------+---------+
20  *
21  *                                          +---------------+-------------+
22  *                                          | ServiceHeader | DataPayload |
23  *                                          |      8b       | 24b...504b  |
24  *                                          ++--------------+-------------+
25  *                                                       Service Layer
26  *                                                     \               /
27  *                             +-------------+----------\-------------/
28  *                             | Multiplexer | Priority | UpperLayer  |
29  *                             |      5b     |    3b    |             |
30  *                             +-------------+------------------------+
31  *                                                     Address Layer
32  *                                                    \            /
33  * +---+---------+-----------+---------------+---------\----------/---------+
34  * |SOF|Extension|FrameLength|SequenceCounter|TimeStamp|UpperLayer|CheckSum |
35  * |8b |    1b   |   5b      |     2b        |32B(n/a) |          |    8b   |
36  * +---+---------+-----------+---------------+---------+----------+---------+
37  *                                Link Layer
38  *
39  */
40 
41 #define CBC_SOF_VALUE		0x05	/* CBC start of frame value */
42 #define CBC_EXT_VALUE		0x00	/* CBC extension bit value */
43 #define CBC_PRIO_MASK		0x07	/* CBC priority bitmask */
44 #define CBC_MUX_MASK		0x1F	/* CBC muxtiplexer bitmask */
45 #define CBC_LEN_MASK		0x1F	/* CBC frame length bitmask */
46 #define CBC_SEQ_MASK		0x03	/* CBC sequence bitmask */
47 #define CBC_EXT_MASK		0x01	/* CBC extension bits bitmask */
48 #define CBC_MUX_OFFSET		3	/* CBC muxtiplexer offset */
49 #define CBC_SEQ_OFFSET		0	/* CBC sequence offset */
50 #define CBC_LEN_OFFSET		2	/* CBC service frame length offset */
51 #define CBC_EXT_OFFSET		7	/* CBC extension bits offset */
52 #define CBC_LEN_UNIT		4	/* CBC frame content in block length */
53 #define CBC_PRIO_OFFSET	0	/* CBC priority offset */
54 #define CBC_CHKSUM_SIZE	1	/* CBC checksum size */
55 #define CBC_GRANULARITY	4	/* CBC frame alignment */
56 #define CBC_LINK_HDR_SIZE	3	/* CBC link layer header size */
57 #define CBC_ADDR_HDR_SIZE	1	/* CBC address layser header size */
58 #define CBC_SRV_HDR_SIZE	1	/* CBC service layer header size */
59 #define CBC_MAX_FRAME_SIZE	96	/* CBC maximum frame size */
60 #define CBC_MIN_FRAME_SIZE	8	/* CBC mininum frame size */
61 #define CBC_MAX_SERVICE_SIZE	64	/* CBC maximum service size */
62 
63 /*
64  * Define the start positions of each layer headers.
65  * CBC_SOF_POS: start of frame start byte position
66  * CBC_ELS_POS: externsion, frame length and sequence start byte position
67  * CBC_ADDR_POS: address protocol start byte postion
68  * CBC_SRV_POS: service protocol start byte position
69  * CBC_PAYLOAD_POS: CBC payload start byte position
70  */
71 #define CBC_SOF_POS		0
72 #define CBC_ELS_POS	(CBC_SOF_POS + 1)
73 #define CBC_ADDR_POS	(CBC_SOF_POS + CBC_LINK_HDR_SIZE - CBC_CHKSUM_SIZE)
74 #define CBC_SRV_POS	(CBC_ADDR_POS + CBC_ADDR_HDR_SIZE)
75 #define CBC_PAYLOAD_POS	(CBC_SRV_POS + CBC_SRV_HDR_SIZE)
76 
77 #define CBC_WK_RSN_BTN	(1 << 5)	/* CBC wakeup reason field button */
78 #define CBC_WK_RSN_RTC	(1 << 9)	/* CBC wakeup reason field rtc */
79 #define CBC_WK_RSN_DOR	(1 << 11)	/* CBC wakeup reason field cardoor */
80 #define CBC_WK_RSN_FS5	(1 << 22)	/* CBC wakeup reason field force S5 */
81 #define CBC_WK_RSN_SOC	(1 << 23)	/* CBC wakeup reason field soc */
82 /* CBC wakeup reason field debug channel */
83 #define CBC_WK_RSN_DGB  (1 << 24)
84 
85 /* CBC wakeup reason filed suspend or shutdown */
86 #define CBC_WK_RSN_SHUTDOWN	(0)
87 
88 /*
89  * IOC mediator permits ignition button, cardoor, RTC, SOC and force S5 wakeup
90  * reasons which comes from IOC firmware, others will be masked.
91  */
92 #define CBC_WK_RSN_ALL \
93 	(CBC_WK_RSN_BTN | CBC_WK_RSN_RTC | CBC_WK_RSN_DOR | CBC_WK_RSN_SOC | \
94 	 CBC_WK_RSN_FS5)
95 
96 /*
97  * CBC ring buffer is used to buffer bytes before build one complete CBC frame.
98  */
99 #define CBC_RING_BUFFER_SIZE	256
100 
101 /*
102  * Default whitelist node is NULL before whitelist initialization.
103  */
104 #define DEFAULT_WLIST_NODE	(0)
105 
106 /*
107  * Default IOC channels file descriptor is -1 before open.
108  */
109 #define IOC_INIT_FD	-1
110 
111 /*
112  * Maximum CBC requests number.
113  */
114 #define IOC_MAX_REQUESTS	200
115 
116 /*
117  * Maximum epoll events.
118  */
119 #define IOC_MAX_EVENTS	32
120 
121 /* IOC default path */
122 #define IOC_DP_NONE	""
123 
124 /*
125  * IOC native channel path definition.
126  */
127 #define IOC_NP_PMT	"/dev/cbc-pmt"
128 #define IOC_NP_LF	"/dev/cbc-lifecycle"
129 #define IOC_NP_SIG	"/dev/cbc-signals"
130 #define IOC_NP_ESIG	"/dev/cbc-early-signals"
131 #define IOC_NP_DIAG	"/dev/cbc-diagnosis"
132 #define IOC_NP_DLT	"/dev/cbc-dlt"
133 #define IOC_NP_LIND	"/dev/cbc-linda"
134 #define IOC_NP_RAW0	"/dev/cbc-raw0"
135 #define IOC_NP_RAW1	"/dev/cbc-raw1"
136 #define IOC_NP_RAW2	"/dev/cbc-raw2"
137 #define IOC_NP_RAW3	"/dev/cbc-raw3"
138 #define IOC_NP_RAW4	"/dev/cbc-raw4"
139 #define IOC_NP_RAW5	"/dev/cbc-raw5"
140 #define IOC_NP_RAW6	"/dev/cbc-raw6"
141 #define IOC_NP_RAW7	"/dev/cbc-raw7"
142 #define IOC_NP_RAW8	"/dev/cbc-raw8"
143 #define IOC_NP_RAW9	"/dev/cbc-raw9"
144 #define IOC_NP_RAW10	"/dev/cbc-raw10"
145 #define IOC_NP_RAW11	"/dev/cbc-raw11"
146 #define IOC_NP_FLF	"/tmp/ioc_fake_lifecycle"
147 #define IOC_NP_FSIG	"/tmp/ioc_fake_signal"
148 #define IOC_NP_FRAW	"/tmp/ioc_fake_raw11"
149 
150 /*
151  * CBC signal data command types.
152  * Signal Data Message
153  * +----------------+--------------+
154  * | SignalDataCMD  |   Payload    |
155  * |        8b      |    0~56b     |
156  * +----------------+--------------+
157  */
158 enum cbc_signal_data_command {
159 	CBC_SD_SINGLE_SIGNAL	= 1,	/* Single signal update */
160 	CBC_SD_MULTI_SIGNAL	= 2,	/* Multi signal update */
161 	CBC_SD_GROUP_SIGNAL	= 3,	/* Group signal update */
162 	CBC_SD_DEFAULT_VALUES	= 4,	/* Update default values */
163 	CBC_SD_UPDATE_SNA	= 5,	/* Update SNA values */
164 	CBC_SD_INVAL_SSIG	= 6,	/* Invalidate signal */
165 	CBC_SD_INVAL_MSIG	= 7,	/* Invalidate multi signals */
166 	CBC_SD_INVAL_SGRP	= 8,	/* Invalidate signal group */
167 	CBC_SD_INVAL_MGRP	= 9,	/* Invalidate muliti groups */
168 	CBC_SD_OPEN_CHANNEL	= 253,	/* Open signal channel */
169 	CBC_SD_CLOSE_CHANNEL	= 254,	/* Clsoe signal channel */
170 	CBC_SD_RESET_CHANNEL	= 255,	/* Reset signal channel */
171 	CBC_SD_MAX
172 };
173 
174 /*
175  * CBC system control command types.
176  * +------------------+------------+
177  * | SystemControlCMD |   Payload  |
178  * |        8b        |     24b    |
179  * +------------------+------------+
180  */
181 enum cbc_system_control_command {
182 	CBC_SC_WK_RSN	= 1,	/* Wakeup reasons */
183 	CBC_SC_HB	= 2,	/* Heartbeat */
184 	CBC_SC_BOOTSEL	= 3,	/* Boot selector */
185 	CBC_SC_SPRS_HB	= 4,	/* Suppress heartbeat check */
186 	CBC_SC_RTC 	= 5,	/* Set RTC wakeup timer */
187 	CBC_SC_MAX
188 };
189 
190 /*
191  * CBC system control - heartbeat: command types.
192  * Heartbeat Message
193  * +------------------+---------+-----------------+------+
194  * | SystemControlCMD | Command | SUS_STAT Action | Resv |
195  * |        8b        |   8b    |        8b       |  8b  |
196  * +------------------+---------+-----------------+------+
197  */
198 enum cbc_heartbeat_command {
199 	CBC_HB_SD_PREP,	/* Shutdown prepared */
200 	CBC_HB_ACTIVE,	/* Active */
201 	CBC_HB_SD_DLY,	/* Shutdown delay */
202 	CBC_HB_INITIAL,	/* Initial */
203 	CBC_HB_STANDBY,	/* Standby */
204 	CBC_HB_DIAG,	/* Diagnosis */
205 	CBC_HB_SD_REQ,	/* Cm shutdown request */
206 	CBC_HB_SD_EXE,	/* Shutdown execute */
207 	CBC_HB_EMG_SD,	/* Mmergency shutdown execute */
208 	CBC_HB_MAX
209 };
210 
211 /*
212  * CBC system control - heartbeat: suspend state action types.
213  */
214 enum cbc_sus_stat_action {
215 	CBC_SS_INVALID,	/* Invalid */
216 	CBC_SS_HALT_I0,	/* Halt */
217 	CBC_SS_REBOOT0,	/* Reboot */
218 	CBC_SS_HALT_I1,	/* Ignore once then halt */
219 	CBC_SS_REBOOT1,	/* Ignore once then reboot */
220 	CBC_SS_HALT_I2,	/* Ignore twice then halt */
221 	CBC_SS_REBOOT2,	/* Ignore twice then reboot */
222 	CBC_SS_REFRESH,	/* Ram refresh, S3 */
223 	CBC_SS_MAX
224 };
225 
226 /*
227  * CBC system control - RTC: command type.
228  * RTC Message
229  * +------------------+-------------+-------------+-------------+
230  * | SystemControlCMD | Timer value | Timer value | Granularity |
231  * | SVC-Header: 5    | Bits 0...7  | Bits 8...15 | 0 - seconds |
232  * |                  |             |             | 1 - minutes |
233  * |                  |             |             | 2 - hours   |
234  * |                  |             |             | 3 - days    |
235  * |                  |             |             | 4 - week    |
236  * |        8b        |     8b      |     8b      |     8b      |
237  * +------------------+-------------+-------------+-------------+
238  */
239 enum cbc_rtc_timer_unit {
240 	CBC_RTC_TIMER_U_SEC,
241 	CBC_RTC_TIMER_U_MIN,
242 	CBC_RTC_TIMER_U_HOUR,
243 	CBC_RTC_TIMER_U_DAY,
244 	CBC_RTC_TIMER_U_WEEK,
245 };
246 
247 /*
248  * CBC rx signal identity definition.
249  */
250 enum cbc_rx_signal_id {
251 	CBC_SIG_ID_STFR		= 20000,	/* SetTunerFrequency */
252 	CBC_SIG_ID_EGYO		= 20001,	/* EnableGyro */
253 	CBC_SIG_ID_WACS		= 20002,	/* WriteAmplifierConfigurationSequence*/
254 	CBC_SIG_ID_RIFC		= 20003,	/* RequestIocFblChecksum */
255 	CBC_SIG_ID_RIWC		= 20004,	/* RequestIocWfChecksum */
256 	CBC_SIG_ID_RIAC		= 20005,	/* RequestIocAppChecksum */
257 	CBC_SIG_ID_RIVS		= 20006,	/* RequestIocVersion */
258 	CBC_SIG_ID_RRMS		= 20007,	/* RequestRuntimeMeasurement */
259 	CBC_SIG_ID_MTAM		= 20008,	/* MuteAmplifier */
260 	CBC_SIG_ID_PBST		= 20009,	/* ParkingBrakeSetting */
261 	CBC_SIG_ID_PBAT		= 20010,	/* ParkingBrakeAutomaticSetting */
262 	CBC_SIG_ID_HFSS		= 20011,	/* HvacFanSpeedSetting */
263 	CBC_SIG_ID_HFDST	= 20012,	/* HvacFanDirectionSetting */
264 	CBC_SIG_ID_HVAST	= 20013,	/* HvacAcSetting */
265 	CBC_SIG_ID_HAMS		= 20014,	/* HvacAcMaxSetting */
266 	CBC_SIG_ID_HATST	= 20015,	/* HvacAutoSetting */
267 	CBC_SIG_ID_HDEFST 	= 20016,	/* HvacDefrostSetting */
268 	CBC_SIG_ID_HDMXST	= 20017,	/* HvacDefrostMaxSetting */
269 	CBC_SIG_ID_HDST		= 20018,	/* HvacDualSetting */
270 	CBC_SIG_ID_HHSMS	= 20019,	/* HvacHeatingSideMirrorSetting */
271 	CBC_SIG_ID_HHSWS	= 20020,	/* HvacHeatingSteeringWheelSetting */
272 	CBC_SIG_ID_HPWST	= 20021,	/* HvacPowerSetting */
273 	CBC_SIG_ID_HRCST	= 20022,	/* HvacRecirculationSetting */
274 	CBC_SIG_ID_HTCST	= 20023,	/* HvacTemperatureCabinSetting */
275 	CBC_SIG_ID_HTSST	= 20024,	/* HvacTemperatureSeatSetting */
276 	CBC_SIG_ID_HTUST	= 20025,	/* HvacTemperatureUnitsSetting */
277 	CBC_SIG_ID_HVSST	= 20026,	/* HvacVentilationSeatSetting */
278 	CBC_SIG_ID_HRAST	= 20027,	/* HvacRecirculationAutomaticSetting */
279 	CBC_SIG_ID_USBVBUS	= 20028,	/* SupportUsbOtgVbusControl */
280 	CBC_SIG_ID_VICL		= 651,		/* VideoInCtrl */
281 };
282 
283 /*
284  * CBC tx signal identity definition.
285  */
286 enum cbc_tx_signal_id {
287 	CBC_SIG_ID_MBV		= 501,	/* MainBatteryVoltage */
288 	CBC_SIG_ID_TSA		= 502,	/* TemperatureSensorAmplifier */
289 	CBC_SIG_ID_TSE		= 503,	/* TemperatureSensorEnvironment */
290 	CBC_SIG_ID_VSWA		= 701,	/* VehicleSteeringWheelAngle */
291 	CBC_SIG_ID_VSPD		= 702,	/* VehicleSpeed */
292 	CBC_SIG_ID_VESP		= 703,	/* VehicleEngineSpeed */
293 	CBC_SIG_ID_VECT		= 704,	/* VehicleEngineCoolantTemp */
294 	CBC_SIG_ID_VRGR		= 705,	/* VehicleReverseGear */
295 	CBC_SIG_ID_VPS		= 706,	/* VehiclePowerStatus */
296 	CBC_SIG_ID_VPM		= 707,	/* VehiclePowerMode */
297 	CBC_SIG_ID_VMD		= 708,	/* VehicleMode */
298 	CBC_SIG_ID_VIS		= 709,	/* VehicleImmobilizerState */
299 	CBC_SIG_ID_VGP		= 710,	/* VehicleGearshiftPosition */
300 	CBC_SIG_ID_VAG		= 711,	/* VehicleActualGear */
301 	CBC_SIG_ID_VFS		= 712,	/* VehicleFuelStatus */
302 	CBC_SIG_ID_VFL		= 713,	/* VehicleFuelLevel */
303 	CBC_SIG_ID_VDTE		= 714,	/* VehicleDistanceToEmpty */
304 	CBC_SIG_ID_SWUB		= 715,	/* SteeringWheelUpBtn */
305 	CBC_SIG_ID_SWRB		= 716,	/* SteeringWheelRightBtn */
306 	CBC_SIG_ID_SWPB		= 717,	/* SteeringWheelPrevBtn */
307 	CBC_SIG_ID_SWNB		= 718,	/* SteeringWheelNextBtn */
308 	CBC_SIG_ID_SWLB		= 719,	/* SteeringWheelLeftBtn */
309 	CBC_SIG_ID_SWDB		= 720,	/* SteeringWheelDownBtn */
310 	CBC_SIG_ID_SWVA		= 721,	/* SteeringWheelVolumeAdjust */
311 	CBC_SIG_ID_SWSCB	= 722,	/* SteeringWheelSpeechCtrlBtn */
312 	CBC_SIG_ID_SWPLB	= 723,	/* SteeringWheelPlayBtn */
313 	CBC_SIG_ID_SWPCB	= 724,	/* SteeringWheelPickupCallBtn */
314 	CBC_SIG_ID_SWPSB	= 725,	/* SteeringWheelPauseBtn */
315 	CBC_SIG_ID_SWHB		= 726,	/* SteeringWheelHomeBtn */
316 	CBC_SIG_ID_SWEB		= 727,	/* SteeringWheelEnterBtn */
317 	CBC_SIG_ID_SWECB	= 728,	/* SteeringWheelEndCallBtn */
318 	CBC_SIG_ID_SWCB		= 729,	/* SteeringWheelConfigBtn */
319 	CBC_SIG_ID_SWCLB	= 730,	/* SteeringWheelCancelBtn */
320 	CBC_SIG_ID_SWAMB	= 731,	/* SteeringWheelAudioMuteBtn */
321 	CBC_SIG_ID_RRSUB	= 732,	/* RightRearSeatUpBtn */
322 	CBC_SIG_ID_RRSRB	= 733,	/* RightRearSeatRightBtn */
323 	CBC_SIG_ID_RRSPB	= 734,	/* RightRearSeatPrevBtn */
324 	CBC_SIG_ID_RRSP9B	= 735,	/* RightRearSeatPosition9Btn */
325 	CBC_SIG_ID_RRSP8B	= 736,	/* RightRearSeatPosition8Btn */
326 	CBC_SIG_ID_RRSP7B	= 737,	/* RightRearSeatPosition7Btn */
327 	CBC_SIG_ID_RRSP6B	= 738,	/* RightRearSeatPosition6Btn */
328 	CBC_SIG_ID_RRSP5B	= 739,	/* RightRearSeatPosition5Btn */
329 	CBC_SIG_ID_RRSP4B	= 740,	/* RightRearSeatPosition4Btn */
330 	CBC_SIG_ID_RRSP3B	= 741,	/* RightRearSeatPosition3Btn */
331 	CBC_SIG_ID_RRSP2B	= 742,	/* RightRearSeatPosition2Btn */
332 	CBC_SIG_ID_RRSP1B	= 743,	/* RightRearSeatPosition1Btn */
333 	CBC_SIG_ID_RRSP0B	= 744,	/* RightRearSeatPosition0Btn */
334 	CBC_SIG_ID_RRSNB	= 745,	/* RightRearSeatNextBtn */
335 	CBC_SIG_ID_RRSLB	= 746,	/* RightRearSeatLeftBtn */
336 	CBC_SIG_ID_RRSDB	= 747,	/* RightRearSeatDownBtn */
337 	CBC_SIG_ID_RRSVA	= 748,	/* RightRearSeatVolumeAdjust */
338 	CBC_SIG_ID_RSSSB	= 749,	/* RightRearSeatStopBtn */
339 	CBC_SIG_ID_RRSSCB	= 750,	/* RightRearSeatSpeechCtrlBtn */
340 	CBC_SIG_ID_RRSSB	= 751,	/* RightRearSeatSearchBtn */
341 	CBC_SIG_ID_RRSRDB	= 752,	/* RightRearSeatRadioBtn */
342 	CBC_SIG_ID_RRSPLB	= 753,	/* RightRearSeatPlayBtn */
343 	CBC_SIG_ID_RRSPSB	= 754,	/* RightRearSeatPauseBtn */
344 	CBC_SIG_ID_RRSOMB	= 755,	/* RightRearSeatOpticalMediaBtn */
345 	CBC_SIG_ID_RRSHB	= 756,	/* RightRearSeatHomeBtn */
346 	CBC_SIG_ID_RRSHDB	= 757,	/* RightRearSeatHarddiskBtn */
347 	CBC_SIG_ID_RRSENB	= 758,	/* RightRearSeatEnterBtn */
348 	CBC_SIG_ID_RRSEJB	= 759,	/* RightRearSeatEjectBtn */
349 	CBC_SIG_ID_RRSCB	= 760,	/* RightRearSeatConfigBtn */
350 	CBC_SIG_ID_RRSCLB	= 761,	/* RightRearSeatCancelBtn */
351 	CBC_SIG_ID_RRSAMB	= 762,	/* RightRearSeatAudioMuteBtn */
352 	CBC_SIG_ID_RVCS		= 763,	/* RearViewCameraStatus */
353 	CBC_SIG_ID_PSS		= 764,	/* PdcSwitchStatus */
354 	CBC_SIG_ID_PUB		= 765,	/* PassengerUpBtn */
355 	CBC_SIG_ID_PRB		= 766,	/* PassengerRightBtn */
356 	CBC_SIG_ID_PPB		= 767,	/* PassengerPrevBtn */
357 	CBC_SIG_ID_PP9B		= 768,	/* PassengerPosition9Btn */
358 	CBC_SIG_ID_PP8B		= 769,	/* PassengerPosition8Btn */
359 	CBC_SIG_ID_PP7B		= 770,	/* PassengerPosition7Btn */
360 	CBC_SIG_ID_PP6B		= 771,	/* PassengerPosition6Btn */
361 	CBC_SIG_ID_PP5B		= 772,	/* PassengerPosition5Btn */
362 	CBC_SIG_ID_PP4B		= 773,	/* PassengerPosition4Btn */
363 	CBC_SIG_ID_PP3B		= 774,	/* PassengerPosition3Btn */
364 	CBC_SIG_ID_PP2B		= 775,	/* PassengerPosition2Btn */
365 	CBC_SIG_ID_PP1B		= 776,	/* PassengerPosition1Btn */
366 	CBC_SIG_ID_PP0B		= 777,	/* PassengerPosition0Btn */
367 	CBC_SIG_ID_PNB		= 778,	/* PassengerNextBtn */
368 	CBC_SIG_ID_PLB		= 779,	/* PassengerLeftBtn */
369 	CBC_SIG_ID_PDB		= 780,	/* PassengerDownBtn */
370 	CBC_SIG_ID_PVA		= 781,	/* PassengerVolumeAdjust */
371 	CBC_SIG_ID_PSB		= 782,	/* PassengerStopBtn */
372 	CBC_SIG_ID_PSCB		= 783,	/* PassengerSpeechCtrlBtn */
373 	CBC_SIG_ID_PSRB		= 784,	/* PassengerSearchBtn */
374 	CBC_SIG_ID_PRDB		= 785,	/* PassengerRadioBtn */
375 	CBC_SIG_ID_PPLB		= 786,	/* PassengerPlayBtn */
376 	CBC_SIG_ID_PPSB		= 787,	/* PassengerPauseBtn */
377 	CBC_SIG_ID_POMB		= 788,	/* PassengerOpticalMediaBtn */
378 	CBC_SIG_ID_PHMB		= 789,	/* PassengerHomeBtn */
379 	CBC_SIG_ID_PHDB		= 790,	/* PassengerHarddiskBtn */
380 	CBC_SIG_ID_PENB		= 791,	/* PassengerEnterBtn */
381 	CBC_SIG_ID_PEJB		= 792,	/* PassengerEjectBtn */
382 	CBC_SIG_ID_PCFB		= 793,	/* PassengerConfigBtn */
383 	CBC_SIG_ID_PCLB		= 794,	/* PassengerCancelBtn */
384 	CBC_SIG_ID_PAMB		= 795,	/* PassengerAudioMuteBtn */
385 	CBC_SIG_ID_LRSUB	= 796,	/* LeftRearSeatUpBtn */
386 	CBC_SIG_ID_LRSRB	= 797,	/* LeftRearSeatRightBtn */
387 	CBC_SIG_ID_LRSPB	= 798,	/* LeftRearSeatPrevBtn */
388 	CBC_SIG_ID_LRSP9B	= 799,	/* LeftRearSeatPosition9Btn */
389 	CBC_SIG_ID_LRSP8B	= 800,	/* LeftRearSeatPosition8Btn */
390 	CBC_SIG_ID_LRSP7B	= 801,	/* LeftRearSeatPosition7Btn */
391 	CBC_SIG_ID_LRSP6B	= 802,	/* LeftRearSeatPosition6Btn */
392 	CBC_SIG_ID_LRSP5B	= 803,	/* LeftRearSeatPosition5Btn */
393 	CBC_SIG_ID_LRSP4B	= 804,	/* LeftRearSeatPosition4Btn */
394 	CBC_SIG_ID_LRSP3B	= 805,	/* LeftRearSeatPosition3Btn */
395 	CBC_SIG_ID_LRSP2B	= 806,	/* LeftRearSeatPosition2Btn */
396 	CBC_SIG_ID_LRSP1B	= 807,	/* LeftRearSeatPosition1Btn */
397 	CBC_SIG_ID_LRSP0B	= 808,	/* LeftRearSeatPosition0Btn */
398 	CBC_SIG_ID_LRSNB	= 809,	/* LeftRearSeatNextBtn */
399 	CBC_SIG_ID_LRSLB	= 810,	/* LeftRearSeatLeftBtn */
400 	CBC_SIG_ID_LRSDB	= 811,	/* LeftRearSeatDownBtn */
401 	CBC_SIG_ID_LRSVA	= 812,	/* LeftRearSeatVolumeAdjust */
402 	CBC_SIG_ID_LRSAMB	= 813,	/* LeftRearSeatAudioMuteBtn */
403 	CBC_SIG_ID_LRSSB	= 814,	/* LeftRearSeatStopBtn */
404 	CBC_SIG_ID_LRSSCB	= 815,	/* LeftRearSeatSpeechCtrlBtn */
405 	CBC_SIG_ID_LRSSRB	= 816,	/* LeftRearSeatSearchBtn */
406 	CBC_SIG_ID_LRSRDB	= 817,	/* LeftRearSeatRadioBtn */
407 	CBC_SIG_ID_LRSPLB	= 818,	/* LeftRearSeatPlayBtn */
408 	CBC_SIG_ID_LRSPSB	= 819,	/* LeftRearSeatPauseBtn */
409 	CBC_SIG_ID_LRSOMB	= 820,	/* LeftRearSeatOpticalMediaBtn */
410 	CBC_SIG_ID_LRSHMB	= 821,	/* LeftRearSeatHomeBtn */
411 	CBC_SIG_ID_LRSHDB	= 822,	/* LeftRearSeatHarddiskBtn */
412 	CBC_SIG_ID_LRSENB	= 823,	/* LeftRearSeatEnterBtn */
413 	CBC_SIG_ID_LRSEJB	= 824,	/* LeftRearSeatEjectBtn */
414 	CBC_SIG_ID_LRSCFB	= 825,	/* LeftRearSeatConfigBtn */
415 	CBC_SIG_ID_LRSCLB	= 826,	/* LeftRearSeatCancelBtn */
416 	CBC_SIG_ID_DVA		= 827,	/* DriverVolumeAdjust */
417 	CBC_SIG_ID_DECSP	= 828,	/* DriverErgoCommanderSteps */
418 	CBC_SIG_ID_DECST	= 829,	/* DriverErgoCommanderStatus */
419 	CBC_SIG_ID_DAMB		= 830,	/* DriverAudioMuteBtn */
420 	CBC_SIG_ID_DNB		= 831,	/* DriverNextBtn */
421 	CBC_SIG_ID_DLB		= 832,	/* DriverLeftBtn */
422 	CBC_SIG_ID_DDB		= 833,	/* DriverDownBtn */
423 	CBC_SIG_ID_DUB		= 834,	/* DriverUpBtn */
424 	CBC_SIG_ID_DRB		= 835,	/* DriverRightBtn */
425 	CBC_SIG_ID_DPB		= 836,	/* DriverPrevBtn */
426 	CBC_SIG_ID_DP9B		= 837,	/* DriverPosition9Btn */
427 	CBC_SIG_ID_DP8B		= 838,	/* DriverPosition8Btn */
428 	CBC_SIG_ID_DP7B		= 839,	/* DriverPosition7Btn */
429 	CBC_SIG_ID_DP6B		= 840,	/* DriverPosition6Btn */
430 	CBC_SIG_ID_DP5B		= 841,	/* DriverPosition5Btn */
431 	CBC_SIG_ID_DP4B		= 842,	/* DriverPosition4Btn */
432 	CBC_SIG_ID_DP3B		= 843,	/* DriverPosition3Btn */
433 	CBC_SIG_ID_DP2B		= 844,	/* DriverPosition2Btn */
434 	CBC_SIG_ID_DP1B		= 845,	/* DriverPosition1Btn */
435 	CBC_SIG_ID_DP0B		= 846,	/* DriverPosition0Btn */
436 	CBC_SIG_ID_DSCB		= 847,	/* DriverSpeechCtrlBtn */
437 	CBC_SIG_ID_DSRB		= 848,	/* DriverSearchBtn */
438 	CBC_SIG_ID_DRDB		= 849,	/* DriverRadioBtn */
439 	CBC_SIG_ID_DSTB		= 850,	/* DriverStopBtn */
440 	CBC_SIG_ID_DPLB		= 851,	/* DriverPlayBtn */
441 	CBC_SIG_ID_DPSB		= 852,	/* DriverPauseBtn */
442 	CBC_SIG_ID_DOMB		= 853,	/* DriverOpticalMediaBtn */
443 	CBC_SIG_ID_DHMB		= 854,	/* DriverHomeBtn */
444 	CBC_SIG_ID_DHHB		= 855,	/* DriverHarddiskBtn */
445 	CBC_SIG_ID_DENB		= 856,	/* DriverEnterBtn */
446 	CBC_SIG_ID_DEJB		= 857,	/* DriverEjectBtn */
447 	CBC_SIG_ID_DCFB		= 858,	/* DriverConfigBtn */
448 	CBC_SIG_ID_DCLB		= 859,	/* DriverCancelBtn */
449 	CBC_SIG_ID_DSTG		= 860,	/* DoorStatusTailgate */
450 	CBC_SIG_ID_DSRR		= 861,	/* DoorStatusRightRear */
451 	CBC_SIG_ID_DSRF		= 862,	/* DoorStatusRightFront */
452 	CBC_SIG_ID_DSLR		= 863,	/* DoorStatusLeftRear */
453 	CBC_SIG_ID_DSLF		= 864,	/* DoorStatusLeftFront */
454 	CBC_SIG_ID_DSEH		= 865,	/* DoorStatusEngineHood */
455 	CBC_SIG_ID_CSSRRW	= 866,	/* ChildSafetyStatusRightRearWnd */
456 	CBC_SIG_ID_CSSRR	= 867,	/* ChildSafetyStatusRightRear */
457 	CBC_SIG_ID_CSSLRW	= 868,	/* ChildSafetyStatusLeftRearWnd */
458 	CBC_SIG_ID_CSSLR	= 869,	/* ChildSafetyStatusLeftRear */
459 	CBC_SIG_ID_ATEMP	= 870,	/* AmbientTemperature */
460 	CBC_SIG_ID_ANSL		= 871,	/* AmbientNoiseLevel */
461 	CBC_SIG_ID_ALTI		= 872,	/* AmbientLightIntensity */
462 	CBC_SIG_ID_VSA		= 873,	/* VehicleSteeringAngle */
463 	CBC_SIG_ID_LLAT		= 875,	/* LocationLatitude */
464 	CBC_SIG_ID_LLON		= 876,	/* LocationLongitude */
465 	CBC_SIG_ID_LALT		= 877,	/* LocationAltitude */
466 	CBC_SIG_ID_LACC		= 878,	/* LocationAccuracy */
467 	CBC_SIG_ID_LHED		= 879,	/* LocationHeading */
468 	CBC_SIG_ID_LSPD		= 880,	/* LocationSpeed */
469 	CBC_SIG_ID_LSRC		= 881,	/* LocationSource */
470 	CBC_SIG_ID_LSCT		= 882,	/* LocationSourceCount */
471 	CBC_SIG_ID_PDFB		= 884,	/* PdcDistanceFrontCenter */
472 	CBC_SIG_ID_PDFL1	= 885,	/* PdcDistanceFrontLeft1 */
473 	CBC_SIG_ID_PDFL2	= 886,	/* PdcDistanceFrontLeft2 */
474 	CBC_SIG_ID_PDFL3	= 887,	/* PdcDistanceFrontLeft3 */
475 	CBC_SIG_ID_PDFR1	= 888,	/* PdcDistanceFrontRight1 */
476 	CBC_SIG_ID_PDFR2	= 889,	/* PdcDistanceFrontRight2 */
477 	CBC_SIG_ID_PDFR3	= 890,	/* PdcDistanceFrontRight3 */
478 	CBC_SIG_ID_PDRC		= 892,	/* PdcDistanceRearCenter */
479 	CBC_SIG_ID_PDRL1	= 893,	/* PdcDistanceRearLeft1 */
480 	CBC_SIG_ID_PDRL2	= 894,	/* PdcDistanceRearLeft2 */
481 	CBC_SIG_ID_PDRL3	= 895,	/* PdcDistanceRearLeft3 */
482 	CBC_SIG_ID_PDRR1	= 896,	/* PdcDistanceRearRight1 */
483 	CBC_SIG_ID_PDRR2	= 897,	/* PdcDistanceRearRight2 */
484 	CBC_SIG_ID_PDRR3	= 898,	/* PdcDistanceRearRight3 */
485 	CBC_SIG_ID_VXA		= 900,	/* VehicleXAcceleration */
486 	CBC_SIG_ID_VYA		= 901,	/* VehicleYAcceleration */
487 	CBC_SIG_ID_VZA		= 902,	/* VehicleZAcceleration */
488 	CBC_SIG_ID_IACR		= 906,	/* IocAppChecksumResponse */
489 	CBC_SIG_ID_IWCR		= 907,	/* IocWfChecksumResponse */
490 	CBC_SIG_ID_IFCR		= 908,	/* IocFblChecksumResponse */
491 	CBC_SIG_ID_GYROX	= 911,	/* GyroX */
492 	CBC_SIG_ID_GYROY	= 912,	/* GyroY */
493 	CBC_SIG_ID_IAVB		= 915,	/* IocAppVersionBuild */
494 	CBC_SIG_ID_IAVMJ	= 916,	/* IocAppVersionMajor */
495 	CBC_SIG_ID_RAV		= 919,	/* RuntimeAverageValue */
496 	CBC_SIG_ID_RMAX		= 920,	/* RuntimeMaxValue */
497 	CBC_SIG_ID_RMIN		= 921,	/* RuntimeMinValue */
498 	CBC_SIG_ID_ACCX		= 924,	/* AccX */
499 	CBC_SIG_ID_ACCY		= 925,	/* AccY */
500 	CBC_SIG_ID_ACCZ		= 926,	/* AccZ */
501 	CBC_SIG_ID_MDS		= 927,	/* MrbDipSwitch */
502 	CBC_SIG_ID_FCP		= 928,	/* FanCurrentRpm */
503 	CBC_SIG_ID_GYROZ	= 929,	/* GyroZ */
504 	CBC_SIG_ID_IAVMN	= 930,	/* IocAppVersionMinor */
505 	CBC_SIG_ID_RTST		= 931,	/* RuntimeSamplesTaken */
506 	CBC_SIG_ID_PKBK		= 933,	/* ParkingBrake */
507 	CBC_SIG_ID_PKBKST	= 934,	/* ParkingBrakeSetting */
508 	CBC_SIG_ID_PKBKAT	= 935,	/* ParkingBrakeAutomatic */
509 	CBC_SIG_ID_PKBKAS	= 936,	/* ParkingBrakeAutomaticSetting */
510 	CBC_SIG_ID_HFSPD	= 937,	/* HvacFanSpeed */
511 	CBC_SIG_ID_HFSST	= 938,	/* HvacFanSpeedSetting */
512 	CBC_SIG_ID_HFDIR	= 939,	/* HvacFanDirection */
513 	CBC_SIG_ID_HFDSTT	= 940,	/* HvacFanDirectionSetting */
514 	CBC_SIG_ID_HVACA	= 941,	/* HvacAc */
515 	CBC_SIG_ID_HVASTT	= 942,	/* HvacAcSetting */
516 	CBC_SIG_ID_HAMAX	= 943,	/* HvacAcMax */
517 	CBC_SIG_ID_HVMST	= 944,	/* HvacAcMaxSetting */
518 	CBC_SIG_ID_HAUTO	= 945,	/* HvacAuto */
519 	CBC_SIG_ID_HATSTT	= 946,	/* HvacAutoSetting */
520 	CBC_SIG_ID_HVDEF	= 947,	/* HvacDefrost */
521 	CBC_SIG_ID_HDEFSTT	= 948,	/* HvacDefrostSetting */
522 	CBC_SIG_ID_HDFMAX	= 949,	/* HvacDefrostMax */
523 	CBC_SIG_ID_HDMXSTT	= 950,	/* HvacDefrostMaxSetting */
524 	CBC_SIG_ID_HDUAL	= 951,	/* HvacDual */
525 	CBC_SIG_ID_HDSTT	= 952,	/* HvacDualSetting */
526 	CBC_SIG_ID_HHSMR	= 953,	/* HvacHeatingSideMirror */
527 	CBC_SIG_ID_HHSMST	= 954,	/* HvacHeatingSideMirrorSetting */
528 	CBC_SIG_ID_HHSWL	= 955,	/* HvacHeatingSteeringWheel */
529 	CBC_SIG_ID_HHSWST	= 956,	/* HvacHeatingSteeringWheelSetting */
530 	CBC_SIG_ID_HPOWR	= 957,	/* HvacPower */
531 	CBC_SIG_ID_HPWSTT	= 958,	/* HvacPowerSetting */
532 	CBC_SIG_ID_HRECC	= 959,	/* HvacRecirculation */
533 	CBC_SIG_ID_HRECST	= 960,	/* HvacRecirculationSetting */
534 	CBC_SIG_ID_HTEMCB	= 961,	/* HvacTemperatureCabin */
535 	CBC_SIG_ID_HTCSTT	= 962,	/* HvacTemperatureCabinSetting */
536 	CBC_SIG_ID_HTMPST	= 963,	/* HvacTemperatureSeat */
537 	CBC_SIG_ID_HTSSTT	= 964,	/* HvacTemperatureSeatSetting */
538 	CBC_SIG_ID_HTMPU	= 965,	/* HvacTemperatureUnits */
539 	CBC_SIG_ID_HTUSTT	= 966,	/* HvacTemperatureUnitsSetting */
540 	CBC_SIG_ID_HVTST	= 967,	/* HvacVentilationSeat */
541 	CBC_SIG_ID_HVSSTT	= 968,	/* HvacVentilationSeatSetting */
542 	CBC_SIG_ID_HRCAT	= 969,	/* HvacRecirculationAutomatic */
543 	CBC_SIG_ID_HRASTT	= 970,	/* HvacRecirculationAutomaticSetting */
544 };
545 
546 /*
547  * CBC rx group identity definition.
548  */
549 enum cbc_rx_group_id {
550 	CBC_GRP_ID_0	= 0,
551 };
552 
553 /*
554  * CBC tx group identity definition.
555  */
556 enum cbc_tx_group_id {
557 	CBC_GRP_ID_LOC	= 874,	/* Location */
558 	CBC_GRP_ID_PDF	= 883,	/* PdcDistanceFront */
559 	CBC_GRP_ID_PDR	= 891,	/* PdcDistanceRear */
560 	CBC_GRP_ID_VAC	= 899,	/* VehicleAcceleration */
561 	CBC_GRP_ID_GAS	= 909,	/* GyroAbs */
562 	CBC_GRP_ID_IVR	= 913,	/* IocVersionResponse */
563 	CBC_GRP_ID_IRM	= 917,	/* IocRuntimeMeasurementResultsResponse */
564 	CBC_GRP_ID_GAC	= 922,	/* GyroAcc */
565 };
566 
567 /*
568  * IOC channels definition.
569  * Include all native CBC channels and one virtual UART
570  */
571 enum ioc_ch_id {
572 	IOC_NATIVE_PMT,		/* Native /dev/cbc-pmt */
573 	IOC_NATIVE_LFCC,	/* Native /dev/cbc-lifecycle */
574 	IOC_NATIVE_SIGNAL,	/* Native /dev/cbc-signals */
575 	IOC_NATIVE_ESIG,	/* Native /dev/cbc-early-signals */
576 	IOC_NATIVE_DIAG,	/* Native /dev/cbc-diagnosis */
577 	IOC_NATIVE_DLT,		/* Native /dev/cbc_dlt */
578 	IOC_NATIVE_LINDA,	/* Native /dev/cbc-lindata */
579 	IOC_NATIVE_RAW0,	/* Native /dev/cbc-raw0 */
580 	IOC_NATIVE_RAW1,	/* Native /dev/cbc-raw1 */
581 	IOC_NATIVE_RAW2,	/* Native /dev/cbc-raw2 */
582 	IOC_NATIVE_RAW3,	/* Native /dev/cbc-raw3 */
583 	IOC_NATIVE_RAW4,	/* Native /dev/cbc-raw4 */
584 	IOC_NATIVE_RAW5,	/* Native /dev/cbc-raw5 */
585 	IOC_NATIVE_RAW6,	/* Native /dev/cbc-raw6 */
586 	IOC_NATIVE_RAW7,	/* Native /dev/cbc-raw7 */
587 	IOC_NATIVE_RAW8,	/* Native /dev/cbc-raw8 */
588 	IOC_NATIVE_RAW9,	/* Native /dev/cbc-raw9 */
589 	IOC_NATIVE_RAW10,	/* Native /dev/cbc-raw10 */
590 	IOC_NATIVE_RAW11,	/* Native /dev/cbc-raw11 */
591 	IOC_VIRTUAL_UART,	/* Virtual UART */
592 	IOC_LOCAL_EVENT,	/* Local channel for IOC event */
593 	IOC_NATIVE_DUMMY0,	/* Native fake lifecycle channel */
594 	IOC_NATIVE_DUMMY1,	/* Native fake signal channel */
595 	IOC_NATIVE_DUMMY2,	/* Native Fake oem raw channel */
596 	IOC_CH_MAX
597 };
598 
599 /*
600  * CBC priority is used to pack CBC address layer header.
601  */
602 enum cbc_prio {
603 	CBC_PRIO_LOW	= 2,
604 	CBC_PRIO_MEDIUM	= 3,
605 	CBC_PRIO_HIGH	= 6
606 };
607 
608 /*
609  * CBC invalidation types.
610  */
611 enum cbc_inval_type {
612 	CBC_INVAL_T_SIGNAL,
613 	CBC_INVAL_T_GROUP
614 };
615 
616 /*
617  * CBC signal and group state flag.
618  */
619 enum cbc_flag {
620 	CBC_INACTIVE,
621 	CBC_ACTIVE
622 };
623 
624 /*
625  * CBC queue types.
626  * Rx queue buffers cbc_requests for virtual UART -> native CBC channels.
627  * Tx queue buffers cbc_requests for antive CBC cdevs -> virtual UART.
628  * Free queue buffers the cbc_requests that are not in rx/tx queues for new data
629  * comming.
630  */
631 enum cbc_queue_type {
632 	CBC_QUEUE_T_RX,
633 	CBC_QUEUE_T_TX,
634 	CBC_QUEUE_T_FREE
635 };
636 
637 /*
638  * CBC request types.
639  */
640 enum cbc_request_type {
641 	CBC_REQ_T_PROT,		/* CBC protocol request */
642 	CBC_REQ_T_SUSPEND,	/* CBC suspend request */
643 	CBC_REQ_T_SHUTDOWN,	/* CBC shutdown request */
644 	CBC_REQ_T_HB_INIT,	/* CBC Heartbeat init request */
645 	CBC_REQ_T_USER_VM_ACTIVE,	/* CBC User VM active request */
646 	CBC_REQ_T_USER_VM_INACTIVE	/* CBC User VM inactive request */
647 };
648 
649 /*
650  * Open the channel and add it into IOC epoll event data if the channel state
651  * is ON, otherwise ignore it.
652  */
653 enum ioc_ch_stat {
654 	IOC_CH_OFF,
655 	IOC_CH_ON
656 };
657 
658 struct cbc_signal {
659 	uint16_t id;		/* CBC signal id number */
660 	uint16_t len;		/* CBC signal length in bits not bytes */
661 	enum cbc_flag flag;	/* CBC signal active/inactive flag */
662 };
663 
664 struct cbc_group {
665 	uint16_t id;		/* CBC group id number */
666 	enum cbc_flag flag;	/* CBC group active/inactive flag */
667 };
668 
669 struct wlist_signal {
670 	uint16_t id;
671 	struct cbc_signal *sig;
672 };
673 
674 struct wlist_group {
675 	uint16_t id;
676 	struct cbc_group *grp;
677 };
678 
679 /*
680  * CBC ring is used to buffer bytes before build one complete CBC frame.
681  */
682 struct cbc_ring {
683 	uint32_t head;
684 	uint32_t tail;
685 	uint8_t buf[CBC_RING_BUFFER_SIZE];
686 };
687 
688 /*
689  * CBC configuration contains signal/group tables and whiltlist tables.
690  */
691 struct cbc_config {
692 	int32_t cbc_sig_num;			/* CBC signals number */
693 	int32_t cbc_grp_num;			/* CBC groups number */
694 	int32_t wlist_sig_num;			/* Whitelist signals number */
695 	int32_t wlist_grp_num;			/* Whitelist groups number */
696 	struct cbc_signal *cbc_sig_tbl;		/* CBC signals table */
697 	struct cbc_group *cbc_grp_tbl;		/* CBC groups table */
698 	struct wlist_signal *wlist_sig_tbl;	/* Whitelist signals table */
699 	struct wlist_group *wlist_grp_tbl;	/* Whitelist groups table */
700 };
701 
702 /*
703  * IOC channel information.
704  */
705 struct ioc_ch_info {
706 	int32_t fd;		/* IOC channel fd */
707 	char name[32];		/* IOC channel name */
708 	enum ioc_ch_id id;	/* IOC channel identity number */
709 	enum ioc_ch_stat stat;	/* IOC channel state */
710 };
711 
712 /*
713  * CBC request is mainly structure of communication between threads.
714  */
715 struct cbc_request {
716 	int32_t srv_len;		/* Service frame length */
717 	int32_t link_len;		/* Link frame length */
718 	enum ioc_ch_id id;		/* Channel id number */
719 	enum cbc_request_type rtype;	/* Request types */
720 	uint8_t buf[CBC_MAX_FRAME_SIZE];
721 
722 	SIMPLEQ_ENTRY(cbc_request) me_queue;
723 };
724 
725 /*
726  * IOC state types.
727  */
728 enum ioc_state_type {
729 	IOC_S_INIT,
730 	IOC_S_ACTIVE,
731 	IOC_S_SUSPENDING,
732 	IOC_S_SUSPENDED
733 };
734 
735 /*
736  * IOC event types.
737  */
738 enum ioc_event_type {
739 	IOC_E_INVALID,
740 	IOC_E_HB_ACTIVE,
741 	IOC_E_RAM_REFRESH,
742 	IOC_E_HB_INACTIVE,
743 	IOC_E_SHUTDOWN,
744 	IOC_E_RESUME,
745 	IOC_E_KNOCK,
746 };
747 
748 /*
749  * VM request types.
750  */
751 enum vm_request_type {
752 	VM_REQ_NONE,
753 	VM_REQ_STOP,
754 	VM_REQ_SUSPEND,
755 	VM_REQ_RESUME
756 };
757 
758 /*
759  * CBC packet is mainly structure for CBC protocol process.
760  */
761 struct cbc_pkt {
762 	bool user_vm_active;		/* Mark User VM active status */
763 	uint32_t reason;		/* Record current wakeup reason */
764 	struct cbc_request *req;	/* CBC packet data */
765 	struct cbc_config *cfg;		/* CBC and whitelist configurations */
766 	enum cbc_queue_type qtype;	/* Routes cbc_request to queue */
767 	enum ioc_event_type evt;	/* Record last event */
768 	struct ioc_dev *ioc;		/* IOC device */
769 };
770 
771 /*
772  * CBC simple queue head definition.
773  */
774 SIMPLEQ_HEAD(cbc_qhead, cbc_request);
775 
776 /*
777  * IOC device structure.
778  * IOC device is a virtual device and DM has virtual device data structure
779  * for virtual devices management in the further.
780  * So export the ioc_dev definition to the IOC header file.
781  */
782 struct ioc_dev {
783 	char name[16];			/* Core thread name */
784 	bool cbc_enable;		/* Tx and Rx protocol enable flag */
785 	int closing;			/* Close IOC mediator device flag */
786 	int epfd;			/* Epoll fd */
787 	int32_t evt_fd;			/* Pipe write fd to trigger one event */
788 	uint32_t boot_reason;		/* Boot or resume wakeup reason */
789 	enum vm_request_type vm_req;	/* Request from VM Manager (acrnctl) */
790 	enum ioc_state_type state;	/* IOC state type */
791 	struct epoll_event *evts;	/* Epoll events table */
792 	struct cbc_request *pool;	/* CBC requests pool */
793 	struct cbc_ring ring;		/* Ring buffer */
794 	pthread_t tid;			/* Core thread id */
795 	struct cbc_qhead free_qhead;	/* Free queue head */
796 	pthread_mutex_t free_mtx;	/* Free queue mutex */
797 
798 	char rx_name[16];		/* Rx thread name */
799 	struct cbc_qhead rx_qhead;	/* Rx queue head */
800 	struct cbc_config rx_config;	/* Rx configuration */
801 	pthread_t rx_tid;
802 	pthread_cond_t rx_cond;
803 	pthread_mutex_t rx_mtx;
804 	void (*ioc_dev_rx)(struct cbc_pkt *pkt);
805 
806 	char tx_name[16];		/* Tx thread name */
807 	struct cbc_qhead tx_qhead;	/* Tx queue head */
808 	struct cbc_config tx_config;	/* Tx configuration */
809 	pthread_t tx_tid;
810 	pthread_cond_t tx_cond;
811 	pthread_mutex_t tx_mtx;
812 	void (*ioc_dev_tx)(struct cbc_pkt *pkt);
813 };
814 
815 /*
816  * IOC state information.
817  */
818 struct ioc_state_info {
819 	enum ioc_state_type cur_stat;
820 	enum ioc_state_type next_stat;
821 	enum ioc_event_type evt;
822 	int32_t (*handler)(struct ioc_dev *ioc);
823 };
824 
825 /*
826  * obsolete interface
827  * Parse IOC parameters
828  */
829 int ioc_parse(const char *opts);
830 
831 struct vmctx;
832 
833 /* IOC mediator common ops */
834 int ioc_init(struct vmctx *ctx);
835 void ioc_deinit(struct vmctx *ctx);
836 
837 /* Build a cbc_request and send it to CBC protocol stack */
838 void ioc_build_request(struct ioc_dev *ioc, int32_t link_len, int32_t srv_len);
839 
840 /* Send data to native CBC cdevs and virtual PTY(UART DM) device */
841 int ioc_ch_xmit(enum ioc_ch_id id, const uint8_t *buf, size_t size);
842 
843 /* Main handlers of CBC protocol stack */
844 void cbc_rx_handler(struct cbc_pkt *pkt);
845 void cbc_tx_handler(struct cbc_pkt *pkt);
846 
847 /* Copy to buf to the ring buffer */
848 int cbc_copy_to_ring(const uint8_t *buf, size_t size, struct cbc_ring *ring);
849 
850 /* Build a cbc_request based on CBC link layer protocol */
851 void cbc_unpack_link(struct ioc_dev *ioc);
852 
853 /* Whitelist initialization */
854 void wlist_init_signal(struct cbc_signal *cbc_tbl, size_t cbc_size,
855 		struct wlist_signal *wlist_tbl, size_t wlist_size);
856 void wlist_init_group(struct cbc_group *cbc_tbl, size_t cbc_size,
857 		struct wlist_group *wlist_tbl, size_t wlist_size);
858 
859 /* Set CBC log file */
860 void cbc_set_log_file(FILE *f);
861 
862 /* Update IOC state by the event */
863 void ioc_update_event(int fd, enum ioc_event_type evt);
864 #endif
865