hdmi.h revision 1.8 1 /* $NetBSD: hdmi.h,v 1.8 2021/12/19 01:55:05 riastradh Exp $ */
2
3 /*-
4 * Copyright (c) 2014 The NetBSD Foundation, Inc.
5 * All rights reserved.
6 *
7 * This code is derived from software contributed to The NetBSD Foundation
8 * by Taylor R. Campbell.
9 *
10 * Redistribution and use in source and binary forms, with or without
11 * modification, are permitted provided that the following conditions
12 * are met:
13 * 1. Redistributions of source code must retain the above copyright
14 * notice, this list of conditions and the following disclaimer.
15 * 2. Redistributions in binary form must reproduce the above copyright
16 * notice, this list of conditions and the following disclaimer in the
17 * documentation and/or other materials provided with the distribution.
18 *
19 * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
20 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
21 * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
22 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
23 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
24 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
25 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
26 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
27 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
28 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
29 * POSSIBILITY OF SUCH DAMAGE.
30 */
31
32 #ifndef _LINUX_HDMI_H_
33 #define _LINUX_HDMI_H_
34
35 #include <sys/types.h>
36 #include <sys/param.h>
37 #include <sys/errno.h>
38 #include <sys/systm.h>
39
40 enum hdmi_3d_structure {
41 HDMI_3D_STRUCTURE_INVALID = -1,
42 HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
43 HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE = 1,
44 HDMI_3D_STRUCTURE_LINE_ALTERNATIVE = 2,
45 HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL = 3,
46 HDMI_3D_STRUCTURE_L_DEPTH = 4,
47 HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH = 5,
48 HDMI_3D_STRUCTURE_TOP_AND_BOTTOM = 6,
49 HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
50 };
51
52 enum hdmi_active_aspect {
53 HDMI_ACTIVE_ASPECT_16_9_TOP = 2,
54 HDMI_ACTIVE_ASPECT_14_9_TOP = 3,
55 HDMI_ACTIVE_ASPECT_16_9_CENTER = 4,
56 HDMI_ACTIVE_ASPECT_PICTURE = 8,
57 HDMI_ACTIVE_ASPECT_4_3 = 9,
58 HDMI_ACTIVE_ASPECT_16_9 = 10,
59 HDMI_ACTIVE_ASPECT_14_9 = 11,
60 HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,
61 HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,
62 HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,
63 };
64
65 enum hdmi_audio_coding_type {
66 HDMI_AUDIO_CODING_TYPE_STREAM = 0,
67 HDMI_AUDIO_CODING_TYPE_PCM = 1,
68 HDMI_AUDIO_CODING_TYPE_AC3 = 2,
69 HDMI_AUDIO_CODING_TYPE_MPEG1 = 3,
70 HDMI_AUDIO_CODING_TYPE_MP3 = 4,
71 HDMI_AUDIO_CODING_TYPE_MPEG2 = 5,
72 HDMI_AUDIO_CODING_TYPE_AAC_LC = 6,
73 HDMI_AUDIO_CODING_TYPE_DTS = 7,
74 HDMI_AUDIO_CODING_TYPE_ATRAC = 8,
75 HDMI_AUDIO_CODING_TYPE_DSD = 9,
76 HDMI_AUDIO_CODING_TYPE_EAC3 = 10,
77 HDMI_AUDIO_CODING_TYPE_DTS_HD = 11,
78 HDMI_AUDIO_CODING_TYPE_MLP = 12,
79 HDMI_AUDIO_CODING_TYPE_DST = 13,
80 HDMI_AUDIO_CODING_TYPE_WMA_PRO = 14,
81 };
82
83 enum hdmi_audio_coding_type_ext {
84 HDMI_AUDIO_CODING_TYPE_EXT_STREAM = 0,
85 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC = 1,
86 HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2 = 2,
87 HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND = 3,
88 };
89
90 enum hdmi_audio_sample_frequency {
91 HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM = 0,
92 HDMI_AUDIO_SAMPLE_FREQUENCY_32000 = 1,
93 HDMI_AUDIO_SAMPLE_FREQUENCY_44100 = 2,
94 HDMI_AUDIO_SAMPLE_FREQUENCY_48000 = 3,
95 HDMI_AUDIO_SAMPLE_FREQUENCY_88200 = 4,
96 HDMI_AUDIO_SAMPLE_FREQUENCY_96000 = 5,
97 HDMI_AUDIO_SAMPLE_FREQUENCY_176400 = 6,
98 HDMI_AUDIO_SAMPLE_FREQUENCY_192000 = 7,
99 };
100
101 enum hdmi_audio_sample_size {
102 HDMI_AUDIO_SAMPLE_SIZE_STREAM = 0,
103 HDMI_AUDIO_SAMPLE_SIZE_16 = 1,
104 HDMI_AUDIO_SAMPLE_SIZE_20 = 2,
105 HDMI_AUDIO_SAMPLE_SIZE_24 = 3,
106 };
107
108 enum hdmi_colorimetry {
109 HDMI_COLORIMETRY_NONE = 0,
110 HDMI_COLORIMETRY_ITU_601 = 1,
111 HDMI_COLORIMETRY_ITU_709 = 2,
112 HDMI_COLORIMETRY_EXTENDED = 3,
113 };
114
115 enum hdmi_colorspace {
116 HDMI_COLORSPACE_RGB = 0,
117 HDMI_COLORSPACE_YUV422 = 1,
118 HDMI_COLORSPACE_YUV444 = 2,
119 };
120
121 enum hdmi_content_type {
122 HDMI_CONTENT_TYPE_GRAPHICS = 0,
123 HDMI_CONTENT_TYPE_PHOTO = 1,
124 HDMI_CONTENT_TYPE_CINEMA = 2,
125 HDMI_CONTENT_TYPE_GAME = 3,
126 };
127
128 enum hdmi_extended_colorimetry {
129 HDMI_EXTENDED_COLORIMETRY_XV_YCC_601 = 0,
130 HDMI_EXTENDED_COLORIMETRY_XV_YCC_709 = 1,
131 HDMI_EXTENDED_COLORIMETRY_S_YCC_601 = 2,
132 HDMI_EXTENDED_COLORIMETRY_ADOBE_YCC_601 = 3,
133 HDMI_EXTENDED_COLORIMETRY_ADOBE_RGB = 4,
134 };
135
136 enum hdmi_nups {
137 HDMI_NUPS_UNKNOWN = 0,
138 HDMI_NUPS_HORIZONTAL = 1,
139 HDMI_NUPS_VERTICAL = 2,
140 HDMI_NUPS_BOTH = 3,
141 };
142
143 enum hdmi_picture_aspect {
144 HDMI_PICTURE_ASPECT_NONE = 0,
145 HDMI_PICTURE_ASPECT_4_3 = 1,
146 HDMI_PICTURE_ASPECT_16_9 = 2,
147 HDMI_PICTURE_ASPECT_64_27 = 3,
148 HDMI_PICTURE_ASPECT_256_135 = 4,
149 HDMI_PICTURE_ASPECT_RESERVED = 5,
150 };
151
152 enum hdmi_quantization_range {
153 HDMI_QUANTIZATION_RANGE_DEFAULT = 0,
154 HDMI_QUANTIZATION_RANGE_LIMITED = 1,
155 HDMI_QUANTIZATION_RANGE_FULL = 2,
156 };
157
158 enum hdmi_scan_mode {
159 HDMI_SCAN_MODE_NONE = 0,
160 HDMI_SCAN_MODE_OVERSCAN = 1,
161 HDMI_SCAN_MODE_UNDERSCAN = 2,
162 };
163
164 enum hdmi_ycc_quantization_range {
165 HDMI_YCC_QUANTIZATION_RANGE_LIMITED = 0,
166 HDMI_YCC_QUANTIZATION_RANGE_FULL = 1,
167 };
168
169 enum hdmi_infoframe_type {
170 HDMI_INFOFRAME_TYPE_VENDOR = 0x81,
171 HDMI_INFOFRAME_TYPE_AVI = 0x82,
172 HDMI_INFOFRAME_TYPE_SPD = 0x83,
173 HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
174 };
175
176 #define HDMI_INFOFRAME_SIZE(TYPE) \
177 (HDMI_INFOFRAME_HEADER_SIZE + HDMI_##TYPE##_INFOFRAME_SIZE)
178
179 #define HDMI_INFOFRAME_HEADER_SIZE 4
180 struct hdmi_infoframe_header {
181 enum hdmi_infoframe_type type;
182 uint8_t version;
183 uint8_t length;
184 /* checksum */
185 };
186
187 static inline void
188 hdmi_infoframe_header_init(struct hdmi_infoframe_header *header,
189 enum hdmi_infoframe_type type, uint8_t vers, uint8_t length)
190 {
191
192 header->type = type;
193 header->version = vers;
194 header->length = length;
195 }
196
197 static inline int
198 hdmi_infoframe_header_pack(const struct hdmi_infoframe_header *header,
199 uint8_t length, void *buf, size_t size)
200 {
201 uint8_t *const p = buf;
202
203 if (length < HDMI_INFOFRAME_HEADER_SIZE)
204 return -ENOSPC;
205 if (size < length)
206 return -ENOSPC;
207
208 p[0] = header->type;
209 p[1] = header->version;
210 p[2] = (length - HDMI_INFOFRAME_HEADER_SIZE);
211 p[3] = 0; /* checksum */
212
213 return HDMI_INFOFRAME_HEADER_SIZE;
214 }
215
216 static inline void
217 hdmi_infoframe_checksum(void *buf, size_t length)
218 {
219 uint8_t *p = buf;
220 uint8_t checksum = 0;
221
222 while (length--)
223 checksum += *p++;
224
225 p = buf;
226 p[3] = (256 - checksum);
227 }
228
229 #define HDMI_AUDIO_INFOFRAME_SIZE 10
230 struct hdmi_audio_infoframe {
231 struct hdmi_infoframe_header header;
232 uint8_t channels;
233 enum hdmi_audio_coding_type coding_type;
234 enum hdmi_audio_sample_size sample_size;
235 enum hdmi_audio_sample_frequency sample_frequency;
236 enum hdmi_audio_coding_type_ext coding_type_ext;
237 uint8_t channel_allocation;
238 uint8_t level_shift_value;
239 bool downmix_inhibit;
240 };
241
242 static inline int
243 hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame)
244 {
245 static const struct hdmi_audio_infoframe zero_frame;
246
247 *frame = zero_frame;
248
249 hdmi_infoframe_header_init(&frame->header, HDMI_INFOFRAME_TYPE_AUDIO,
250 1, HDMI_AUDIO_INFOFRAME_SIZE);
251
252 return 0;
253 }
254
255 static inline ssize_t
256 hdmi_audio_infoframe_pack(const struct hdmi_audio_infoframe *frame, void *buf,
257 size_t size)
258 {
259 const size_t length = HDMI_INFOFRAME_HEADER_SIZE +
260 HDMI_AUDIO_INFOFRAME_SIZE;
261 uint8_t channels = 0;
262 uint8_t *p = buf;
263 int ret;
264
265 KASSERT(frame->header.length == HDMI_AUDIO_INFOFRAME_SIZE);
266
267 ret = hdmi_infoframe_header_pack(&frame->header, length, p, size);
268 if (ret < 0)
269 return ret;
270 KASSERT(ret == HDMI_INFOFRAME_HEADER_SIZE);
271 p += HDMI_INFOFRAME_HEADER_SIZE;
272 size -= HDMI_INFOFRAME_HEADER_SIZE;
273
274 if (frame->channels >= 2)
275 channels = frame->channels - 1;
276
277 p[0] = __SHIFTIN(frame->coding_type, __BITS(7,4));
278 p[0] |= __SHIFTIN(channels, __BITS(2,0));
279
280 p[1] = __SHIFTIN(frame->sample_frequency, __BITS(4,2));
281 p[1] |= __SHIFTIN(frame->sample_size, __BITS(1,0));
282
283 p[2] = __SHIFTIN(frame->coding_type_ext, __BITS(5,0));
284
285 p[3] = __SHIFTIN(frame->level_shift_value, __BITS(6, 3));
286
287 p[4] = __SHIFTIN(frame->downmix_inhibit? 1 : 0, __BIT(7));
288
289 /* PB6 to PB10 are reserved */
290 p[5] = 0;
291 p[6] = 0;
292 p[7] = 0;
293 p[8] = 0;
294 p[9] = 0;
295
296 CTASSERT(HDMI_AUDIO_INFOFRAME_SIZE == 10);
297
298 hdmi_infoframe_checksum(buf, length);
299
300 return length;
301 }
302
303 #define HDMI_AVI_INFOFRAME_SIZE 13
304 struct hdmi_avi_infoframe {
305 struct hdmi_infoframe_header header;
306 enum hdmi_colorspace colorspace;
307 enum hdmi_scan_mode scan_mode;
308 enum hdmi_colorimetry colorimetry;
309 enum hdmi_picture_aspect picture_aspect;
310 enum hdmi_active_aspect active_aspect;
311 bool itc;
312 enum hdmi_extended_colorimetry extended_colorimetry;
313 enum hdmi_quantization_range quantization_range;
314 enum hdmi_nups nups;
315 uint8_t video_code;
316 enum hdmi_ycc_quantization_range ycc_quantization_range;
317 enum hdmi_content_type content_type;
318 uint8_t pixel_repeat;
319 uint16_t top_bar;
320 uint16_t bottom_bar;
321 uint16_t left_bar;
322 uint16_t right_bar;
323 };
324
325 static inline int
326 hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame)
327 {
328 static const struct hdmi_avi_infoframe zero_frame;
329
330 *frame = zero_frame;
331
332 hdmi_infoframe_header_init(&frame->header, HDMI_INFOFRAME_TYPE_AVI, 2,
333 HDMI_AVI_INFOFRAME_SIZE);
334
335 return 0;
336 }
337
338 static inline ssize_t
339 hdmi_avi_infoframe_pack(const struct hdmi_avi_infoframe *frame, void *buf,
340 size_t size)
341 {
342 const size_t length = HDMI_INFOFRAME_HEADER_SIZE +
343 HDMI_AVI_INFOFRAME_SIZE;
344 uint8_t *p = buf;
345 int ret;
346
347 KASSERT(frame->header.length == HDMI_AVI_INFOFRAME_SIZE);
348
349 ret = hdmi_infoframe_header_pack(&frame->header, length, p, size);
350 if (ret < 0)
351 return ret;
352 KASSERT(ret == HDMI_INFOFRAME_HEADER_SIZE);
353 p += HDMI_INFOFRAME_HEADER_SIZE;
354 size -= HDMI_INFOFRAME_HEADER_SIZE;
355
356 p[0] = __SHIFTIN(frame->colorspace, __BITS(6,5));
357 p[0] |= __SHIFTIN(frame->active_aspect & 0xf? 1 : 0, __BIT(4));
358 p[0] |= __SHIFTIN(frame->top_bar || frame->bottom_bar, __BIT(3));
359 p[0] |= __SHIFTIN(frame->left_bar || frame->right_bar, __BIT(2));
360 p[0] |= __SHIFTIN(frame->scan_mode, __BITS(1,0));
361
362 p[1] = __SHIFTIN(frame->colorimetry, __BITS(7,6));
363 p[1] |= __SHIFTIN(frame->picture_aspect, __BITS(5,4));
364 p[1] |= __SHIFTIN(frame->active_aspect, __BITS(3,0));
365
366 p[2] = __SHIFTIN(frame->itc? 1 : 0, __BIT(7));
367 p[2] |= __SHIFTIN(frame->extended_colorimetry, __BITS(6,4));
368 p[2] |= __SHIFTIN(frame->quantization_range, __BITS(3,2));
369 p[2] |= __SHIFTIN(frame->nups, __BITS(1,0));
370
371 p[3] = frame->video_code;
372
373 p[4] = __SHIFTIN(frame->ycc_quantization_range, __BITS(7,6));
374 p[4] |= __SHIFTIN(frame->content_type, __BITS(5,4));
375 p[4] |= __SHIFTIN(frame->pixel_repeat, __BITS(3,0));
376
377 le16enc(&p[5], frame->top_bar);
378 le16enc(&p[7], frame->bottom_bar);
379 le16enc(&p[9], frame->left_bar);
380 le16enc(&p[11], frame->right_bar);
381 CTASSERT(HDMI_AVI_INFOFRAME_SIZE == 13);
382
383 hdmi_infoframe_checksum(buf, length);
384
385 return length;
386 }
387
388 #define HDMI_SPD_INFOFRAME_SIZE 25
389 struct hdmi_spd_infoframe {
390 struct hdmi_infoframe_header header;
391 char vendor[8];
392 char product[16];
393 enum hdmi_spd_sdi {
394 HDMI_SPD_SDI_UNKNOWN = 0,
395 HDMI_SPD_SDI_DSTB = 1,
396 HDMI_SPD_SDI_DVDP = 2,
397 HDMI_SPD_SDI_DVHS = 3,
398 HDMI_SPD_SDI_HDDVR = 4,
399 HDMI_SPD_SDI_DVC = 5,
400 HDMI_SPD_SDI_DSC = 6,
401 HDMI_SPD_SDI_VCD = 7,
402 HDMI_SPD_SDI_GAME = 8,
403 HDMI_SPD_SDI_PC = 9,
404 HDMI_SPD_SDI_BD = 10,
405 HDMI_SPD_SDI_SACD = 11,
406 HDMI_SPD_SDI_HDDVD = 12,
407 HDMI_SPD_SDI_PMP = 13,
408 } sdi;
409 };
410
411 static inline int
412 hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame, const char *vendor,
413 const char *product)
414 {
415 static const struct hdmi_spd_infoframe zero_frame;
416
417 *frame = zero_frame;
418
419 hdmi_infoframe_header_init(&frame->header, HDMI_INFOFRAME_TYPE_SPD,
420 1, HDMI_SPD_INFOFRAME_SIZE);
421
422 (void)strlcpy(frame->vendor, vendor, sizeof(frame->vendor));
423 (void)strlcpy(frame->product, product, sizeof(frame->product));
424
425 return 0;
426 }
427
428 static inline ssize_t
429 hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buf,
430 size_t size)
431 {
432 const size_t length = HDMI_INFOFRAME_HEADER_SIZE +
433 HDMI_SPD_INFOFRAME_SIZE;
434 uint8_t *p = buf;
435 int ret;
436
437 KASSERT(frame->header.length == HDMI_SPD_INFOFRAME_SIZE);
438
439 ret = hdmi_infoframe_header_pack(&frame->header, length, p, size);
440 if (ret < 0)
441 return ret;
442 KASSERT(ret == HDMI_INFOFRAME_HEADER_SIZE);
443 p += HDMI_INFOFRAME_HEADER_SIZE;
444 size -= HDMI_INFOFRAME_HEADER_SIZE;
445
446 (void)memcpy(&p[0], frame->vendor, 8);
447 (void)memcpy(&p[8], frame->product, 16);
448 p[24] = frame->sdi;
449
450 hdmi_infoframe_checksum(buf, length);
451
452 return length;
453 }
454
455 #define HDMI_IEEE_OUI 0x000c03
456 #define HDMI_FORUM_IEEE_OUI 0xc45dd8
457
458 struct hdmi_vendor_infoframe {
459 struct hdmi_infoframe_header header;
460 uint32_t oui;
461 uint8_t vic;
462 enum hdmi_3d_structure s3d_struct;
463 unsigned s3d_ext_data;
464 };
465
466 union hdmi_vendor_any_infoframe {
467 struct {
468 struct hdmi_infoframe_header header;
469 uint32_t oui;
470 } any;
471 struct hdmi_vendor_infoframe hdmi;
472 };
473
474 static inline int
475 hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame)
476 {
477 static const struct hdmi_vendor_infoframe zero_frame;
478
479 *frame = zero_frame;
480
481 hdmi_infoframe_header_init(&frame->header, HDMI_INFOFRAME_TYPE_VENDOR,
482 1, 0 /* depends on s3d_struct */);
483
484 frame->oui = HDMI_IEEE_OUI;
485 frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID;
486
487 return 0;
488 }
489
490 static inline int
491 hdmi_vendor_infoframe_pack(const struct hdmi_vendor_infoframe *frame,
492 void *buf, size_t size)
493 {
494 uint8_t *p = buf;
495 size_t length;
496 int ret;
497
498 /* Exactly one must be supplied. */
499 if ((frame->vic == 0) ==
500 (frame->s3d_struct == HDMI_3D_STRUCTURE_INVALID))
501 return -EINVAL;
502
503 length = HDMI_INFOFRAME_HEADER_SIZE + 6;
504 if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
505 length += 1;
506
507 ret = hdmi_infoframe_header_pack(&frame->header, length, p, size);
508 if (ret < 0)
509 return ret;
510 KASSERT(ret == HDMI_INFOFRAME_HEADER_SIZE);
511 p += HDMI_INFOFRAME_HEADER_SIZE;
512 size -= HDMI_INFOFRAME_HEADER_SIZE;
513
514 p[0] = 0x03;
515 p[1] = 0x0c;
516 p[2] = 0x00;
517
518 if (frame->vic == 0) {
519 p[3] = __SHIFTIN(0x2, __BITS(6,5));
520 p[4] = __SHIFTIN(frame->s3d_struct, __BITS(7,4));
521 if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF)
522 p[9] = __SHIFTIN(frame->s3d_ext_data, __BITS(7,4));
523 } else {
524 p[3] = __SHIFTIN(0x1, __BITS(6,5));
525 p[4] = frame->vic;
526 }
527
528 hdmi_infoframe_checksum(buf, length);
529
530 return length;
531 }
532
533 union hdmi_infoframe {
534 struct hdmi_infoframe_header any;
535 struct hdmi_avi_infoframe avi;
536 struct hdmi_spd_infoframe spd;
537 union hdmi_vendor_any_infoframe vendor;
538 };
539
540 static inline ssize_t
541 hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buf, size_t size)
542 {
543
544 switch (frame->any.type) {
545 case HDMI_INFOFRAME_TYPE_AVI:
546 return hdmi_avi_infoframe_pack(&frame->avi, buf, size);
547 case HDMI_INFOFRAME_TYPE_SPD:
548 return hdmi_spd_infoframe_pack(&frame->spd, buf, size);
549 case HDMI_INFOFRAME_TYPE_VENDOR:
550 return hdmi_vendor_infoframe_pack(&frame->vendor.hdmi, buf,
551 size);
552 default:
553 return -EINVAL;
554 }
555 }
556
557 struct hdr_sink_metadata {};
558 struct hdmi_drm_infoframe {};
559
560 #endif /* _LINUX_HDMI_H_ */
561