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