hdmi.h 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. /*
  2. * Copyright (C) 2012 Avionic Design GmbH
  3. *
  4. * Permission is hereby granted, free of charge, to any person obtaining a
  5. * copy of this software and associated documentation files (the "Software"),
  6. * to deal in the Software without restriction, including without limitation
  7. * the rights to use, copy, modify, merge, publish, distribute, sub license,
  8. * and/or sell copies of the Software, and to permit persons to whom the
  9. * Software is furnished to do so, subject to the following conditions:
  10. *
  11. * The above copyright notice and this permission notice (including the
  12. * next paragraph) shall be included in all copies or substantial portions
  13. * of the Software.
  14. *
  15. * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
  18. * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
  20. * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
  21. * DEALINGS IN THE SOFTWARE.
  22. */
  23. #ifndef __LINUX_HDMI_H_
  24. #define __LINUX_HDMI_H_
  25. #include <linux/types.h>
  26. #include <linux/device.h>
  27. enum hdmi_packet_type {
  28. HDMI_PACKET_TYPE_NULL = 0x00,
  29. HDMI_PACKET_TYPE_AUDIO_CLOCK_REGEN = 0x01,
  30. HDMI_PACKET_TYPE_AUDIO_SAMPLE = 0x02,
  31. HDMI_PACKET_TYPE_GENERAL_CONTROL = 0x03,
  32. HDMI_PACKET_TYPE_ACP = 0x04,
  33. HDMI_PACKET_TYPE_ISRC1 = 0x05,
  34. HDMI_PACKET_TYPE_ISRC2 = 0x06,
  35. HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE = 0x07,
  36. HDMI_PACKET_TYPE_DST_AUDIO = 0x08,
  37. HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09,
  38. HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a,
  39. /* + enum hdmi_infoframe_type */
  40. };
  41. enum hdmi_infoframe_type {
  42. HDMI_INFOFRAME_TYPE_VENDOR = 0x81,
  43. HDMI_INFOFRAME_TYPE_AVI = 0x82,
  44. HDMI_INFOFRAME_TYPE_SPD = 0x83,
  45. HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
  46. HDMI_INFOFRAME_TYPE_DRM = 0x87,
  47. };
  48. #define HDMI_IEEE_OUI 0x000c03
  49. #define HDMI_FORUM_IEEE_OUI 0xc45dd8
  50. #define HDMI_INFOFRAME_HEADER_SIZE 4
  51. #define HDMI_AVI_INFOFRAME_SIZE 13
  52. #define HDMI_SPD_INFOFRAME_SIZE 25
  53. #define HDMI_AUDIO_INFOFRAME_SIZE 10
  54. #define HDMI_DRM_INFOFRAME_SIZE 26
  55. #define HDMI_VENDOR_INFOFRAME_SIZE 4
  56. #define HDMI_INFOFRAME_SIZE(type) \
  57. (HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
  58. struct hdmi_any_infoframe {
  59. enum hdmi_infoframe_type type;
  60. unsigned char version;
  61. unsigned char length;
  62. };
  63. enum hdmi_colorspace {
  64. HDMI_COLORSPACE_RGB,
  65. HDMI_COLORSPACE_YUV422,
  66. HDMI_COLORSPACE_YUV444,
  67. HDMI_COLORSPACE_YUV420,
  68. HDMI_COLORSPACE_RESERVED4,
  69. HDMI_COLORSPACE_RESERVED5,
  70. HDMI_COLORSPACE_RESERVED6,
  71. HDMI_COLORSPACE_IDO_DEFINED,
  72. };
  73. enum hdmi_scan_mode {
  74. HDMI_SCAN_MODE_NONE,
  75. HDMI_SCAN_MODE_OVERSCAN,
  76. HDMI_SCAN_MODE_UNDERSCAN,
  77. HDMI_SCAN_MODE_RESERVED,
  78. };
  79. enum hdmi_colorimetry {
  80. HDMI_COLORIMETRY_NONE,
  81. HDMI_COLORIMETRY_ITU_601,
  82. HDMI_COLORIMETRY_ITU_709,
  83. HDMI_COLORIMETRY_EXTENDED,
  84. };
  85. enum hdmi_picture_aspect {
  86. HDMI_PICTURE_ASPECT_NONE,
  87. HDMI_PICTURE_ASPECT_4_3,
  88. HDMI_PICTURE_ASPECT_16_9,
  89. HDMI_PICTURE_ASPECT_64_27,
  90. HDMI_PICTURE_ASPECT_256_135,
  91. HDMI_PICTURE_ASPECT_RESERVED,
  92. };
  93. enum hdmi_active_aspect {
  94. HDMI_ACTIVE_ASPECT_16_9_TOP = 2,
  95. HDMI_ACTIVE_ASPECT_14_9_TOP = 3,
  96. HDMI_ACTIVE_ASPECT_16_9_CENTER = 4,
  97. HDMI_ACTIVE_ASPECT_PICTURE = 8,
  98. HDMI_ACTIVE_ASPECT_4_3 = 9,
  99. HDMI_ACTIVE_ASPECT_16_9 = 10,
  100. HDMI_ACTIVE_ASPECT_14_9 = 11,
  101. HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,
  102. HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,
  103. HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,
  104. };
  105. enum hdmi_extended_colorimetry {
  106. HDMI_EXTENDED_COLORIMETRY_XV_YCC_601,
  107. HDMI_EXTENDED_COLORIMETRY_XV_YCC_709,
  108. HDMI_EXTENDED_COLORIMETRY_S_YCC_601,
  109. HDMI_EXTENDED_COLORIMETRY_OPYCC_601,
  110. HDMI_EXTENDED_COLORIMETRY_OPRGB,
  111. /* The following EC values are only defined in CEA-861-F. */
  112. HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM,
  113. HDMI_EXTENDED_COLORIMETRY_BT2020,
  114. HDMI_EXTENDED_COLORIMETRY_RESERVED,
  115. };
  116. enum hdmi_quantization_range {
  117. HDMI_QUANTIZATION_RANGE_DEFAULT,
  118. HDMI_QUANTIZATION_RANGE_LIMITED,
  119. HDMI_QUANTIZATION_RANGE_FULL,
  120. HDMI_QUANTIZATION_RANGE_RESERVED,
  121. };
  122. /* non-uniform picture scaling */
  123. enum hdmi_nups {
  124. HDMI_NUPS_UNKNOWN,
  125. HDMI_NUPS_HORIZONTAL,
  126. HDMI_NUPS_VERTICAL,
  127. HDMI_NUPS_BOTH,
  128. };
  129. enum hdmi_ycc_quantization_range {
  130. HDMI_YCC_QUANTIZATION_RANGE_LIMITED,
  131. HDMI_YCC_QUANTIZATION_RANGE_FULL,
  132. };
  133. enum hdmi_content_type {
  134. HDMI_CONTENT_TYPE_GRAPHICS,
  135. HDMI_CONTENT_TYPE_PHOTO,
  136. HDMI_CONTENT_TYPE_CINEMA,
  137. HDMI_CONTENT_TYPE_GAME,
  138. };
  139. enum hdmi_metadata_type {
  140. HDMI_STATIC_METADATA_TYPE1 = 1,
  141. };
  142. enum hdmi_eotf {
  143. HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
  144. HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
  145. HDMI_EOTF_SMPTE_ST2084,
  146. HDMI_EOTF_BT_2100_HLG,
  147. };
  148. struct hdmi_avi_infoframe {
  149. enum hdmi_infoframe_type type;
  150. unsigned char version;
  151. unsigned char length;
  152. enum hdmi_colorspace colorspace;
  153. enum hdmi_scan_mode scan_mode;
  154. enum hdmi_colorimetry colorimetry;
  155. enum hdmi_picture_aspect picture_aspect;
  156. enum hdmi_active_aspect active_aspect;
  157. bool itc;
  158. enum hdmi_extended_colorimetry extended_colorimetry;
  159. enum hdmi_quantization_range quantization_range;
  160. enum hdmi_nups nups;
  161. unsigned char video_code;
  162. enum hdmi_ycc_quantization_range ycc_quantization_range;
  163. enum hdmi_content_type content_type;
  164. unsigned char pixel_repeat;
  165. unsigned short top_bar;
  166. unsigned short bottom_bar;
  167. unsigned short left_bar;
  168. unsigned short right_bar;
  169. };
  170. /* DRM Infoframe as per CTA 861.G spec */
  171. struct hdmi_drm_infoframe {
  172. enum hdmi_infoframe_type type;
  173. unsigned char version;
  174. unsigned char length;
  175. enum hdmi_eotf eotf;
  176. enum hdmi_metadata_type metadata_type;
  177. struct {
  178. u16 x, y;
  179. } display_primaries[3];
  180. struct {
  181. u16 x, y;
  182. } white_point;
  183. u16 max_display_mastering_luminance;
  184. u16 min_display_mastering_luminance;
  185. u16 max_cll;
  186. u16 max_fall;
  187. };
  188. void hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame);
  189. ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
  190. size_t size);
  191. ssize_t hdmi_avi_infoframe_pack_only(const struct hdmi_avi_infoframe *frame,
  192. void *buffer, size_t size);
  193. int hdmi_avi_infoframe_check(struct hdmi_avi_infoframe *frame);
  194. int hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *frame);
  195. ssize_t hdmi_drm_infoframe_pack(struct hdmi_drm_infoframe *frame, void *buffer,
  196. size_t size);
  197. ssize_t hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *frame,
  198. void *buffer, size_t size);
  199. int hdmi_drm_infoframe_check(struct hdmi_drm_infoframe *frame);
  200. int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
  201. const void *buffer, size_t size);
  202. enum hdmi_spd_sdi {
  203. HDMI_SPD_SDI_UNKNOWN,
  204. HDMI_SPD_SDI_DSTB,
  205. HDMI_SPD_SDI_DVDP,
  206. HDMI_SPD_SDI_DVHS,
  207. HDMI_SPD_SDI_HDDVR,
  208. HDMI_SPD_SDI_DVC,
  209. HDMI_SPD_SDI_DSC,
  210. HDMI_SPD_SDI_VCD,
  211. HDMI_SPD_SDI_GAME,
  212. HDMI_SPD_SDI_PC,
  213. HDMI_SPD_SDI_BD,
  214. HDMI_SPD_SDI_SACD,
  215. HDMI_SPD_SDI_HDDVD,
  216. HDMI_SPD_SDI_PMP,
  217. };
  218. struct hdmi_spd_infoframe {
  219. enum hdmi_infoframe_type type;
  220. unsigned char version;
  221. unsigned char length;
  222. char vendor[8];
  223. char product[16];
  224. enum hdmi_spd_sdi sdi;
  225. };
  226. int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
  227. const char *vendor, const char *product);
  228. ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
  229. size_t size);
  230. ssize_t hdmi_spd_infoframe_pack_only(const struct hdmi_spd_infoframe *frame,
  231. void *buffer, size_t size);
  232. int hdmi_spd_infoframe_check(struct hdmi_spd_infoframe *frame);
  233. enum hdmi_audio_coding_type {
  234. HDMI_AUDIO_CODING_TYPE_STREAM,
  235. HDMI_AUDIO_CODING_TYPE_PCM,
  236. HDMI_AUDIO_CODING_TYPE_AC3,
  237. HDMI_AUDIO_CODING_TYPE_MPEG1,
  238. HDMI_AUDIO_CODING_TYPE_MP3,
  239. HDMI_AUDIO_CODING_TYPE_MPEG2,
  240. HDMI_AUDIO_CODING_TYPE_AAC_LC,
  241. HDMI_AUDIO_CODING_TYPE_DTS,
  242. HDMI_AUDIO_CODING_TYPE_ATRAC,
  243. HDMI_AUDIO_CODING_TYPE_DSD,
  244. HDMI_AUDIO_CODING_TYPE_EAC3,
  245. HDMI_AUDIO_CODING_TYPE_DTS_HD,
  246. HDMI_AUDIO_CODING_TYPE_MLP,
  247. HDMI_AUDIO_CODING_TYPE_DST,
  248. HDMI_AUDIO_CODING_TYPE_WMA_PRO,
  249. HDMI_AUDIO_CODING_TYPE_CXT,
  250. };
  251. enum hdmi_audio_sample_size {
  252. HDMI_AUDIO_SAMPLE_SIZE_STREAM,
  253. HDMI_AUDIO_SAMPLE_SIZE_16,
  254. HDMI_AUDIO_SAMPLE_SIZE_20,
  255. HDMI_AUDIO_SAMPLE_SIZE_24,
  256. };
  257. enum hdmi_audio_sample_frequency {
  258. HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM,
  259. HDMI_AUDIO_SAMPLE_FREQUENCY_32000,
  260. HDMI_AUDIO_SAMPLE_FREQUENCY_44100,
  261. HDMI_AUDIO_SAMPLE_FREQUENCY_48000,
  262. HDMI_AUDIO_SAMPLE_FREQUENCY_88200,
  263. HDMI_AUDIO_SAMPLE_FREQUENCY_96000,
  264. HDMI_AUDIO_SAMPLE_FREQUENCY_176400,
  265. HDMI_AUDIO_SAMPLE_FREQUENCY_192000,
  266. };
  267. enum hdmi_audio_coding_type_ext {
  268. /* Refer to Audio Coding Type (CT) field in Data Byte 1 */
  269. HDMI_AUDIO_CODING_TYPE_EXT_CT,
  270. /*
  271. * The next three CXT values are defined in CEA-861-E only.
  272. * They do not exist in older versions, and in CEA-861-F they are
  273. * defined as 'Not in use'.
  274. */
  275. HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC,
  276. HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2,
  277. HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND,
  278. /* The following CXT values are only defined in CEA-861-F. */
  279. HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC,
  280. HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2,
  281. HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC,
  282. HDMI_AUDIO_CODING_TYPE_EXT_DRA,
  283. HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND,
  284. HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10,
  285. };
  286. struct hdmi_audio_infoframe {
  287. enum hdmi_infoframe_type type;
  288. unsigned char version;
  289. unsigned char length;
  290. unsigned char channels;
  291. enum hdmi_audio_coding_type coding_type;
  292. enum hdmi_audio_sample_size sample_size;
  293. enum hdmi_audio_sample_frequency sample_frequency;
  294. enum hdmi_audio_coding_type_ext coding_type_ext;
  295. unsigned char channel_allocation;
  296. unsigned char level_shift_value;
  297. bool downmix_inhibit;
  298. };
  299. int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame);
  300. ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
  301. void *buffer, size_t size);
  302. ssize_t hdmi_audio_infoframe_pack_only(const struct hdmi_audio_infoframe *frame,
  303. void *buffer, size_t size);
  304. int hdmi_audio_infoframe_check(struct hdmi_audio_infoframe *frame);
  305. enum hdmi_3d_structure {
  306. HDMI_3D_STRUCTURE_INVALID = -1,
  307. HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
  308. HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
  309. HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
  310. HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
  311. HDMI_3D_STRUCTURE_L_DEPTH,
  312. HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
  313. HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
  314. HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
  315. };
  316. struct hdmi_vendor_infoframe {
  317. enum hdmi_infoframe_type type;
  318. unsigned char version;
  319. unsigned char length;
  320. unsigned int oui;
  321. u8 vic;
  322. enum hdmi_3d_structure s3d_struct;
  323. unsigned int s3d_ext_data;
  324. };
  325. /* HDR Metadata as per 861.G spec */
  326. struct hdr_static_metadata {
  327. __u8 eotf;
  328. __u8 metadata_type;
  329. __u16 max_cll;
  330. __u16 max_fall;
  331. __u16 min_cll;
  332. };
  333. /**
  334. * struct hdr_sink_metadata - HDR sink metadata
  335. *
  336. * Metadata Information read from Sink's EDID
  337. */
  338. struct hdr_sink_metadata {
  339. /**
  340. * @metadata_type: Static_Metadata_Descriptor_ID.
  341. */
  342. __u32 metadata_type;
  343. /**
  344. * @hdmi_type1: HDR Metadata Infoframe.
  345. */
  346. union {
  347. struct hdr_static_metadata hdmi_type1;
  348. };
  349. };
  350. int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame);
  351. ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
  352. void *buffer, size_t size);
  353. ssize_t hdmi_vendor_infoframe_pack_only(const struct hdmi_vendor_infoframe *frame,
  354. void *buffer, size_t size);
  355. int hdmi_vendor_infoframe_check(struct hdmi_vendor_infoframe *frame);
  356. union hdmi_vendor_any_infoframe {
  357. struct {
  358. enum hdmi_infoframe_type type;
  359. unsigned char version;
  360. unsigned char length;
  361. unsigned int oui;
  362. } any;
  363. struct hdmi_vendor_infoframe hdmi;
  364. };
  365. /**
  366. * union hdmi_infoframe - overall union of all abstract infoframe representations
  367. * @any: generic infoframe
  368. * @avi: avi infoframe
  369. * @spd: spd infoframe
  370. * @vendor: union of all vendor infoframes
  371. * @audio: audio infoframe
  372. * @drm: Dynamic Range and Mastering infoframe
  373. *
  374. * This is used by the generic pack function. This works since all infoframes
  375. * have the same header which also indicates which type of infoframe should be
  376. * packed.
  377. */
  378. union hdmi_infoframe {
  379. struct hdmi_any_infoframe any;
  380. struct hdmi_avi_infoframe avi;
  381. struct hdmi_spd_infoframe spd;
  382. union hdmi_vendor_any_infoframe vendor;
  383. struct hdmi_audio_infoframe audio;
  384. struct hdmi_drm_infoframe drm;
  385. };
  386. ssize_t hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer,
  387. size_t size);
  388. ssize_t hdmi_infoframe_pack_only(const union hdmi_infoframe *frame,
  389. void *buffer, size_t size);
  390. int hdmi_infoframe_check(union hdmi_infoframe *frame);
  391. int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
  392. const void *buffer, size_t size);
  393. void hdmi_infoframe_log(const char *level, struct device *dev,
  394. const union hdmi_infoframe *frame);
  395. #endif /* _DRM_HDMI_H */