eavb_shared.h 9.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388
  1. /* SPDX-License-Identifier: GPL-2.0-only WITH Linux-syscall-note */
  2. /*
  3. * Copyright (c) 2024, Qualcomm Innovation Center, Inc. All rights reserved.
  4. */
  5. #ifndef __EAVB_SHARED_H__
  6. #define __EAVB_SHARED_H__
  7. #include <linux/types.h>
  8. #define EAVB_IOCTL_MAGIC 'B'
  9. /* ioctl request */
  10. /* EAVB_IOCTL_CREATE_STREAM DEPRECATED Do not use this in new code */
  11. #define EAVB_IOCTL_CREATE_STREAM \
  12. _IOWR(EAVB_IOCTL_MAGIC, 1, struct eavb_ioctl_create_stream)
  13. #define EAVB_IOCTL_GET_STREAM_INFO \
  14. _IOWR(EAVB_IOCTL_MAGIC, 2, struct eavb_ioctl_get_stream_info)
  15. #define EAVB_IOCTL_CONNECT_STREAM \
  16. _IOWR(EAVB_IOCTL_MAGIC, 3, struct eavb_ioctl_connect_stream)
  17. #define EAVB_IOCTL_RECEIVE \
  18. _IOWR(EAVB_IOCTL_MAGIC, 4, struct eavb_ioctl_receive)
  19. #define EAVB_IOCTL_RECV_DONE \
  20. _IOWR(EAVB_IOCTL_MAGIC, 5, struct eavb_ioctl_recv_done)
  21. #define EAVB_IOCTL_TRANSMIT \
  22. _IOWR(EAVB_IOCTL_MAGIC, 6, struct eavb_ioctl_transmit)
  23. #define EAVB_IOCTL_DISCONNECT_STREAM \
  24. _IOW(EAVB_IOCTL_MAGIC, 9, struct eavb_ioctl_disconnect_stream)
  25. #define EAVB_IOCTL_DESTROY_STREAM \
  26. _IOW(EAVB_IOCTL_MAGIC, 10, struct eavb_ioctl_destroy_stream)
  27. #define EAVB_IOCTL_CREATE_STREAM_WITH_PATH \
  28. _IOWR(EAVB_IOCTL_MAGIC, 11, struct eavb_ioctl_create_stream_with_path)
  29. #define EAVB_IOCTL_GET_CRF_TS \
  30. _IOWR(EAVB_IOCTL_MAGIC, 12, __u64)
  31. /* default value */
  32. #define STATION_ADDR_SIZE 8
  33. #define IF_NAMESIZE 16
  34. #define MAX_CONFIG_FILE_PATH 512
  35. /* Invalid value for config file */
  36. #define AVB_INVALID_ADDR (0xFF)
  37. #define AVB_INVALID_INTEGER (-1)
  38. #define AVB_INVALID_UINT (-1)
  39. enum avb_role {
  40. AVB_ROLE_TALKER = 0,
  41. AVB_ROLE_LISTENER,
  42. AVB_ROLE_CRF_TALKER,
  43. AVB_ROLE_INVALID = -1
  44. };
  45. enum stream_mapping_type {
  46. NONE = 0,
  47. PCM,
  48. H264,
  49. MPEG2TS,
  50. MJPEG,
  51. CRF,
  52. MAPPING_TYPE_INVALID = -1
  53. };
  54. enum ring_buffer_mode {
  55. /* Return error when new data doesn't fit in ring buffer */
  56. RING_BUFFER_MODE_FILL = 0,
  57. /* Drop oldest samples to make room for new data */
  58. RING_BUFFER_MODE_DROP_OLD = 1,
  59. /* Drop oldest samples to make room for new data */
  60. RING_BUFFER_MODE_INVALID = -1
  61. };
  62. enum avb_class {
  63. CLASS_A = 0,
  64. CLASS_B = 1,
  65. CLASS_AAF = 2,
  66. CLASS_INVALID = -1
  67. };
  68. enum data_endianness {
  69. ENDIAN_BIG = 0,
  70. ENDIAN_LITTLE = 1,
  71. ENDIAN_INVALID = -1
  72. };
  73. enum avb_ieee1722_version {
  74. QAVB_IEEE_1722_ver_2010 = 0,
  75. QAVB_IEEE_1722_ver_2016,
  76. QAVB_IEEE_1722_ver_INVALID = -1,
  77. };
  78. enum avtp_crf_mode {
  79. /* CRF disabled */
  80. QAVB_AVTP_CRF_MODE_DISABLED = 0,
  81. /* CRF talker */
  82. QAVB_AVTP_CRF_MODE_TALKER,
  83. /* CRF listener, PPM = local - remote */
  84. QAVB_AVTP_CRF_MODE_LISTENER,
  85. /* CRF listener, PPM = nominal - remote */
  86. QAVB_AVTP_CRF_MODE_LISTENER_NOMINAL,
  87. QAVB_AVTP_CRF_MODE_MAX
  88. };
  89. enum avtp_crf_type {
  90. /* user specified */
  91. QAVB_AVTP_CRF_TYPE_USER = 0,
  92. /* audio ample timestamp */
  93. QAVB_AVTP_CRF_TYPE_AUDIO_SAMPLE,
  94. /* video frame sync timestamp */
  95. QAVB_AVTP_CRF_TYPE_VIDEO_FRAME,
  96. /* video line timestamp */
  97. QAVB_AVTP_CRF_TYPE_VIDEO_LINE,
  98. /* machine cycle timestamp */
  99. QAVB_AVTP_CRF_TYPE_MACHINE_CYCLE,
  100. QAVB_AVTP_CRF_TYPE_MAX
  101. };
  102. enum avtp_crf_pull {
  103. /* Multiply base_frequency field by 1.0 */
  104. QAVB_AVTP_CRF_PULL_1_DIV_1_0 = 0,
  105. /* Multiply base_frequency field by 1/1.1001 */
  106. QAVB_AVTP_CRF_PULL_1_DIV_1_DOT_1001,
  107. /* Multiply base_frequency field by 1.1001 */
  108. QAVB_AVTP_CRF_PULL_1_DOT_1001,
  109. /* Multiply base_frequency field by 24/25 */
  110. QAVB_AVTP_CRF_PULL_24_DIV_25,
  111. /* Multiply base_frequency field by 25/24 */
  112. QAVB_AVTP_CRF_PULL_25_DIV_24,
  113. /* Multiply base_frequency field by 8 */
  114. QAVB_AVTP_CRF_PULL_8,
  115. QAVB_AVTP_CRF_PULL_MAX
  116. };
  117. struct eavb_ioctl_hdr {
  118. __u64 streamCtx;
  119. };
  120. /*
  121. * EAVB_IOCTL_CREATE_STREAM
  122. */
  123. /* DEPRECATED Do not use this in new code */
  124. struct eavb_ioctl_stream_config {
  125. __u16 stream_id;
  126. char eth_interface[IF_NAMESIZE];
  127. __u16 vlan_id;
  128. __u16 ring_buffer_elem_count;
  129. enum ring_buffer_mode ring_buffer_mode;
  130. /* talker = 0 or listener = 1 */
  131. enum avb_role avb_role;
  132. __u8 dest_macaddr[STATION_ADDR_SIZE];
  133. __u8 stream_addr[STATION_ADDR_SIZE];
  134. /* "crf_macaddr" or "crf_dest_macaddr" */
  135. __u8 crf_dest_macaddr[STATION_ADDR_SIZE];
  136. __u8 crf_stream_addr[STATION_ADDR_SIZE];
  137. enum stream_mapping_type mapping_type;
  138. int wakeup_interval; /* "wakeup_interval" or "tx_interval" */
  139. int tx_pkts_per_sec; /* if not set, do default */
  140. int max_stale_ms; /* int max_stale_ns = max_stale_ms*1000; */
  141. int presentation_time_ms; /* if not set, do default */
  142. int enforce_presentation_time;
  143. int sr_class_type; /* A = 0 B = 1 AAF = 2 */
  144. /* sets number of items to se sent on each tx / rx */
  145. int packing_factor;
  146. int bandwidth;
  147. /* H.264 */
  148. int max_payload; /* "max_payload" or "max_video_payload" */
  149. int mrp_enabled;
  150. /* Audio Specific */
  151. int pcm_bit_depth;
  152. int pcm_channels;
  153. int sample_rate; /* in hz */
  154. unsigned char endianness; /* 0 = big 1 = little */
  155. int ieee1722_standard;
  156. /* Thread priority in QNX side */
  157. int talker_priority;
  158. int listener_priority;
  159. int crf_priority;
  160. /* CRF */
  161. /* 0 - disabled
  162. * 1 - CRF talker (listener drives reference)
  163. * 2 - CRF with talker reference (talker has CRF talker)
  164. */
  165. int crf_mode;
  166. /* 0 - custom
  167. * 1- audio
  168. * 2- video frame
  169. * 3 - video line
  170. * 4 - machine cycle
  171. */
  172. int crf_type;
  173. /* time interval after how many events timestamp is to be produced
  174. * (base_frequency * pull) / timestamp_interval =
  175. * # of timestamps per second
  176. */
  177. int crf_timestamping_interval;
  178. int crf_timestamping_interval_remote;
  179. int crf_timestamping_interval_local;
  180. /* enables/disables dynamic IPG adjustments */
  181. int crf_allow_dynamic_tx_adjust;
  182. /* indicates how many CRF timestamps per each CRF packet */
  183. int crf_num_timestamps_per_pkt;
  184. __s64 crf_mcr_adjust_min_ppm;
  185. __s64 crf_mcr_adjust_max_ppm;
  186. __u16 crf_stream_id; /* CRF stream ID */
  187. __s32 crf_base_frequency; /* CRF base frequency */
  188. __s32 crf_listener_ts_smoothing;
  189. __s32 crf_talker_ts_smoothing;
  190. /* multiplier for the base frequency */
  191. int crf_pull;
  192. /* indicates how often to issue MCR callback events
  193. * how many packets will generate one callback.
  194. */
  195. int crf_event_callback_interval;
  196. /* Indicates how often to update IPG */
  197. int crf_dynamic_tx_adjust_interval;
  198. /* stats */
  199. __s32 enable_stats_reporting;
  200. __s32 stats_reporting_interval;
  201. __s32 stats_reporting_samples;
  202. /* packet tracking */
  203. __s32 enable_packet_tracking;
  204. __s32 packet_tracking_interval;
  205. int blocking_write_enabled;
  206. double blocking_write_fill_level;
  207. int app_tx_block_enabled;
  208. int stream_interleaving_enabled;
  209. int create_talker_thread;
  210. int create_crf_threads;
  211. int listener_bpf_pkts_per_buff;
  212. } __packed;
  213. /* DEPRECATED Do not use this in new code */
  214. struct eavb_ioctl_create_stream {
  215. struct eavb_ioctl_stream_config config; /* IN */
  216. struct eavb_ioctl_hdr hdr; /* OUT */
  217. };
  218. struct eavb_ioctl_create_stream_with_path {
  219. char path[MAX_CONFIG_FILE_PATH]; /* IN */
  220. struct eavb_ioctl_hdr hdr; /* OUT */
  221. };
  222. /*
  223. * EAVB_IOCTL_GET_STREAM_INFO
  224. */
  225. struct eavb_ioctl_stream_info {
  226. enum avb_role role;
  227. enum stream_mapping_type mapping_type;
  228. /* Max packet payload size */
  229. unsigned int max_payload;
  230. /* Number of packets sent per wake */
  231. unsigned int pkts_per_wake;
  232. /* Time to sleep between wakes */
  233. unsigned int wakeup_period_us;
  234. /* Audio Specific */
  235. /* Audio bit depth 8/16/24/32 */
  236. int pcm_bit_depth;
  237. /* Audio channels 1/2 */
  238. int num_pcm_channels;
  239. /* Audio sample rate in hz */
  240. int sample_rate;
  241. /* Audio sample endianness 0(big)/1(little) */
  242. unsigned char endianness;
  243. /* Max buffer size (Bytes) allowed */
  244. unsigned int max_buffer_size;
  245. /* qavb ring buffer size */
  246. __u32 ring_buffer_size;
  247. } __packed;
  248. struct eavb_ioctl_get_stream_info {
  249. struct eavb_ioctl_hdr hdr; /* IN */
  250. struct eavb_ioctl_stream_info info; /* OUT */
  251. };
  252. /*
  253. * EAVB_IOCTL_CONNECT_STREAM
  254. */
  255. struct eavb_ioctl_connect_stream {
  256. struct eavb_ioctl_hdr hdr; /* IN */
  257. };
  258. /*
  259. * EAVB_IOCTL_RECEIVE
  260. */
  261. struct eavb_ioctl_buf_hdr {
  262. /* This flag is used for H.264 and MJPEG streams:
  263. * 1. H.264: Set for the very last packet of an access unit.
  264. * 2. MJPEG Set the last packet of a video frame.
  265. */
  266. __u32 flag_end_of_frame:1;
  267. /* This flag is used in file transfer only:
  268. * Set for the last packet in the file
  269. */
  270. __u32 flag_end_of_file:1;
  271. __u32 flag_reserved:30;
  272. /* Audio event Layout D3scription Valid Channels
  273. * event value
  274. * 0 Static layout Based on config
  275. * 1 Mono 0
  276. * 2 Stereo 0, 1
  277. * 3 5.1 0,1,2,3,4,5
  278. * 4 7.1 0,1,2,3,4,5,6,7
  279. * 5-15 Custom Defined by System
  280. * Integrator
  281. */
  282. __u32 event;
  283. __u32 reserved;
  284. /* Size of the payload (bytes) */
  285. __u32 payload_size;
  286. __u32 buf_ele_count;
  287. } __packed;
  288. struct eavb_ioctl_buf_data {
  289. struct eavb_ioctl_buf_hdr hdr;
  290. /* virtual address of buffer */
  291. __u64 pbuf;
  292. } __packed;
  293. struct eavb_ioctl_receive {
  294. struct eavb_ioctl_hdr hdr; /* IN */
  295. struct eavb_ioctl_buf_data data; /* IN/OUT */
  296. __s32 received; /* OUT */
  297. };
  298. /*
  299. * EAVB_IOCTL_RECV_DONE
  300. */
  301. struct eavb_ioctl_recv_done {
  302. struct eavb_ioctl_hdr hdr; /* IN */
  303. struct eavb_ioctl_buf_data data; /* IN */
  304. };
  305. /*
  306. * EAVB_IOCTL_TRANSMIT
  307. */
  308. struct eavb_ioctl_transmit {
  309. struct eavb_ioctl_hdr hdr; /* IN */
  310. struct eavb_ioctl_buf_data data; /* IN/OUT */
  311. __s32 written;
  312. };
  313. /*
  314. * EAVB_IOCTL_DISCONNECT_STREAM
  315. */
  316. struct eavb_ioctl_disconnect_stream {
  317. struct eavb_ioctl_hdr hdr; /* IN */
  318. };
  319. /*
  320. * EAVB_IOCTL_DESTROY_STREAM
  321. */
  322. struct eavb_ioctl_destroy_stream {
  323. struct eavb_ioctl_hdr hdr; /* IN */
  324. };
  325. #endif /*__EAVB_SHARED_H__*/