hdmi.c (52418B)
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 24#include <linux/bitops.h> 25#include <linux/bug.h> 26#include <linux/errno.h> 27#include <linux/export.h> 28#include <linux/hdmi.h> 29#include <linux/string.h> 30#include <linux/device.h> 31 32#define hdmi_log(fmt, ...) dev_printk(level, dev, fmt, ##__VA_ARGS__) 33 34static u8 hdmi_infoframe_checksum(const u8 *ptr, size_t size) 35{ 36 u8 csum = 0; 37 size_t i; 38 39 /* compute checksum */ 40 for (i = 0; i < size; i++) 41 csum += ptr[i]; 42 43 return 256 - csum; 44} 45 46static void hdmi_infoframe_set_checksum(void *buffer, size_t size) 47{ 48 u8 *ptr = buffer; 49 50 ptr[3] = hdmi_infoframe_checksum(buffer, size); 51} 52 53/** 54 * hdmi_avi_infoframe_init() - initialize an HDMI AVI infoframe 55 * @frame: HDMI AVI infoframe 56 */ 57void hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame) 58{ 59 memset(frame, 0, sizeof(*frame)); 60 61 frame->type = HDMI_INFOFRAME_TYPE_AVI; 62 frame->version = 2; 63 frame->length = HDMI_AVI_INFOFRAME_SIZE; 64} 65EXPORT_SYMBOL(hdmi_avi_infoframe_init); 66 67static int hdmi_avi_infoframe_check_only(const struct hdmi_avi_infoframe *frame) 68{ 69 if (frame->type != HDMI_INFOFRAME_TYPE_AVI || 70 frame->version != 2 || 71 frame->length != HDMI_AVI_INFOFRAME_SIZE) 72 return -EINVAL; 73 74 if (frame->picture_aspect > HDMI_PICTURE_ASPECT_16_9) 75 return -EINVAL; 76 77 return 0; 78} 79 80/** 81 * hdmi_avi_infoframe_check() - check a HDMI AVI infoframe 82 * @frame: HDMI AVI infoframe 83 * 84 * Validates that the infoframe is consistent and updates derived fields 85 * (eg. length) based on other fields. 86 * 87 * Returns 0 on success or a negative error code on failure. 88 */ 89int hdmi_avi_infoframe_check(struct hdmi_avi_infoframe *frame) 90{ 91 return hdmi_avi_infoframe_check_only(frame); 92} 93EXPORT_SYMBOL(hdmi_avi_infoframe_check); 94 95/** 96 * hdmi_avi_infoframe_pack_only() - write HDMI AVI infoframe to binary buffer 97 * @frame: HDMI AVI infoframe 98 * @buffer: destination buffer 99 * @size: size of buffer 100 * 101 * Packs the information contained in the @frame structure into a binary 102 * representation that can be written into the corresponding controller 103 * registers. Also computes the checksum as required by section 5.3.5 of 104 * the HDMI 1.4 specification. 105 * 106 * Returns the number of bytes packed into the binary buffer or a negative 107 * error code on failure. 108 */ 109ssize_t hdmi_avi_infoframe_pack_only(const struct hdmi_avi_infoframe *frame, 110 void *buffer, size_t size) 111{ 112 u8 *ptr = buffer; 113 size_t length; 114 int ret; 115 116 ret = hdmi_avi_infoframe_check_only(frame); 117 if (ret) 118 return ret; 119 120 length = HDMI_INFOFRAME_HEADER_SIZE + frame->length; 121 122 if (size < length) 123 return -ENOSPC; 124 125 memset(buffer, 0, size); 126 127 ptr[0] = frame->type; 128 ptr[1] = frame->version; 129 ptr[2] = frame->length; 130 ptr[3] = 0; /* checksum */ 131 132 /* start infoframe payload */ 133 ptr += HDMI_INFOFRAME_HEADER_SIZE; 134 135 ptr[0] = ((frame->colorspace & 0x3) << 5) | (frame->scan_mode & 0x3); 136 137 /* 138 * Data byte 1, bit 4 has to be set if we provide the active format 139 * aspect ratio 140 */ 141 if (frame->active_aspect & 0xf) 142 ptr[0] |= BIT(4); 143 144 /* Bit 3 and 2 indicate if we transmit horizontal/vertical bar data */ 145 if (frame->top_bar || frame->bottom_bar) 146 ptr[0] |= BIT(3); 147 148 if (frame->left_bar || frame->right_bar) 149 ptr[0] |= BIT(2); 150 151 ptr[1] = ((frame->colorimetry & 0x3) << 6) | 152 ((frame->picture_aspect & 0x3) << 4) | 153 (frame->active_aspect & 0xf); 154 155 ptr[2] = ((frame->extended_colorimetry & 0x7) << 4) | 156 ((frame->quantization_range & 0x3) << 2) | 157 (frame->nups & 0x3); 158 159 if (frame->itc) 160 ptr[2] |= BIT(7); 161 162 ptr[3] = frame->video_code & 0x7f; 163 164 ptr[4] = ((frame->ycc_quantization_range & 0x3) << 6) | 165 ((frame->content_type & 0x3) << 4) | 166 (frame->pixel_repeat & 0xf); 167 168 ptr[5] = frame->top_bar & 0xff; 169 ptr[6] = (frame->top_bar >> 8) & 0xff; 170 ptr[7] = frame->bottom_bar & 0xff; 171 ptr[8] = (frame->bottom_bar >> 8) & 0xff; 172 ptr[9] = frame->left_bar & 0xff; 173 ptr[10] = (frame->left_bar >> 8) & 0xff; 174 ptr[11] = frame->right_bar & 0xff; 175 ptr[12] = (frame->right_bar >> 8) & 0xff; 176 177 hdmi_infoframe_set_checksum(buffer, length); 178 179 return length; 180} 181EXPORT_SYMBOL(hdmi_avi_infoframe_pack_only); 182 183/** 184 * hdmi_avi_infoframe_pack() - check a HDMI AVI infoframe, 185 * and write it to binary buffer 186 * @frame: HDMI AVI infoframe 187 * @buffer: destination buffer 188 * @size: size of buffer 189 * 190 * Validates that the infoframe is consistent and updates derived fields 191 * (eg. length) based on other fields, after which it packs the information 192 * contained in the @frame structure into a binary representation that 193 * can be written into the corresponding controller registers. This function 194 * also computes the checksum as required by section 5.3.5 of the HDMI 1.4 195 * specification. 196 * 197 * Returns the number of bytes packed into the binary buffer or a negative 198 * error code on failure. 199 */ 200ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, 201 void *buffer, size_t size) 202{ 203 int ret; 204 205 ret = hdmi_avi_infoframe_check(frame); 206 if (ret) 207 return ret; 208 209 return hdmi_avi_infoframe_pack_only(frame, buffer, size); 210} 211EXPORT_SYMBOL(hdmi_avi_infoframe_pack); 212 213/** 214 * hdmi_spd_infoframe_init() - initialize an HDMI SPD infoframe 215 * @frame: HDMI SPD infoframe 216 * @vendor: vendor string 217 * @product: product string 218 * 219 * Returns 0 on success or a negative error code on failure. 220 */ 221int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame, 222 const char *vendor, const char *product) 223{ 224 size_t len; 225 226 memset(frame, 0, sizeof(*frame)); 227 228 frame->type = HDMI_INFOFRAME_TYPE_SPD; 229 frame->version = 1; 230 frame->length = HDMI_SPD_INFOFRAME_SIZE; 231 232 len = strlen(vendor); 233 memcpy(frame->vendor, vendor, min(len, sizeof(frame->vendor))); 234 len = strlen(product); 235 memcpy(frame->product, product, min(len, sizeof(frame->product))); 236 237 return 0; 238} 239EXPORT_SYMBOL(hdmi_spd_infoframe_init); 240 241static int hdmi_spd_infoframe_check_only(const struct hdmi_spd_infoframe *frame) 242{ 243 if (frame->type != HDMI_INFOFRAME_TYPE_SPD || 244 frame->version != 1 || 245 frame->length != HDMI_SPD_INFOFRAME_SIZE) 246 return -EINVAL; 247 248 return 0; 249} 250 251/** 252 * hdmi_spd_infoframe_check() - check a HDMI SPD infoframe 253 * @frame: HDMI SPD infoframe 254 * 255 * Validates that the infoframe is consistent and updates derived fields 256 * (eg. length) based on other fields. 257 * 258 * Returns 0 on success or a negative error code on failure. 259 */ 260int hdmi_spd_infoframe_check(struct hdmi_spd_infoframe *frame) 261{ 262 return hdmi_spd_infoframe_check_only(frame); 263} 264EXPORT_SYMBOL(hdmi_spd_infoframe_check); 265 266/** 267 * hdmi_spd_infoframe_pack_only() - write HDMI SPD infoframe to binary buffer 268 * @frame: HDMI SPD infoframe 269 * @buffer: destination buffer 270 * @size: size of buffer 271 * 272 * Packs the information contained in the @frame structure into a binary 273 * representation that can be written into the corresponding controller 274 * registers. Also computes the checksum as required by section 5.3.5 of 275 * the HDMI 1.4 specification. 276 * 277 * Returns the number of bytes packed into the binary buffer or a negative 278 * error code on failure. 279 */ 280ssize_t hdmi_spd_infoframe_pack_only(const struct hdmi_spd_infoframe *frame, 281 void *buffer, size_t size) 282{ 283 u8 *ptr = buffer; 284 size_t length; 285 int ret; 286 287 ret = hdmi_spd_infoframe_check_only(frame); 288 if (ret) 289 return ret; 290 291 length = HDMI_INFOFRAME_HEADER_SIZE + frame->length; 292 293 if (size < length) 294 return -ENOSPC; 295 296 memset(buffer, 0, size); 297 298 ptr[0] = frame->type; 299 ptr[1] = frame->version; 300 ptr[2] = frame->length; 301 ptr[3] = 0; /* checksum */ 302 303 /* start infoframe payload */ 304 ptr += HDMI_INFOFRAME_HEADER_SIZE; 305 306 memcpy(ptr, frame->vendor, sizeof(frame->vendor)); 307 memcpy(ptr + 8, frame->product, sizeof(frame->product)); 308 309 ptr[24] = frame->sdi; 310 311 hdmi_infoframe_set_checksum(buffer, length); 312 313 return length; 314} 315EXPORT_SYMBOL(hdmi_spd_infoframe_pack_only); 316 317/** 318 * hdmi_spd_infoframe_pack() - check a HDMI SPD infoframe, 319 * and write it to binary buffer 320 * @frame: HDMI SPD infoframe 321 * @buffer: destination buffer 322 * @size: size of buffer 323 * 324 * Validates that the infoframe is consistent and updates derived fields 325 * (eg. length) based on other fields, after which it packs the information 326 * contained in the @frame structure into a binary representation that 327 * can be written into the corresponding controller registers. This function 328 * also computes the checksum as required by section 5.3.5 of the HDMI 1.4 329 * specification. 330 * 331 * Returns the number of bytes packed into the binary buffer or a negative 332 * error code on failure. 333 */ 334ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, 335 void *buffer, size_t size) 336{ 337 int ret; 338 339 ret = hdmi_spd_infoframe_check(frame); 340 if (ret) 341 return ret; 342 343 return hdmi_spd_infoframe_pack_only(frame, buffer, size); 344} 345EXPORT_SYMBOL(hdmi_spd_infoframe_pack); 346 347/** 348 * hdmi_audio_infoframe_init() - initialize an HDMI audio infoframe 349 * @frame: HDMI audio infoframe 350 * 351 * Returns 0 on success or a negative error code on failure. 352 */ 353int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame) 354{ 355 memset(frame, 0, sizeof(*frame)); 356 357 frame->type = HDMI_INFOFRAME_TYPE_AUDIO; 358 frame->version = 1; 359 frame->length = HDMI_AUDIO_INFOFRAME_SIZE; 360 361 return 0; 362} 363EXPORT_SYMBOL(hdmi_audio_infoframe_init); 364 365static int hdmi_audio_infoframe_check_only(const struct hdmi_audio_infoframe *frame) 366{ 367 if (frame->type != HDMI_INFOFRAME_TYPE_AUDIO || 368 frame->version != 1 || 369 frame->length != HDMI_AUDIO_INFOFRAME_SIZE) 370 return -EINVAL; 371 372 return 0; 373} 374 375/** 376 * hdmi_audio_infoframe_check() - check a HDMI audio infoframe 377 * @frame: HDMI audio infoframe 378 * 379 * Validates that the infoframe is consistent and updates derived fields 380 * (eg. length) based on other fields. 381 * 382 * Returns 0 on success or a negative error code on failure. 383 */ 384int hdmi_audio_infoframe_check(struct hdmi_audio_infoframe *frame) 385{ 386 return hdmi_audio_infoframe_check_only(frame); 387} 388EXPORT_SYMBOL(hdmi_audio_infoframe_check); 389 390/** 391 * hdmi_audio_infoframe_pack_only() - write HDMI audio infoframe to binary buffer 392 * @frame: HDMI audio infoframe 393 * @buffer: destination buffer 394 * @size: size of buffer 395 * 396 * Packs the information contained in the @frame structure into a binary 397 * representation that can be written into the corresponding controller 398 * registers. Also computes the checksum as required by section 5.3.5 of 399 * the HDMI 1.4 specification. 400 * 401 * Returns the number of bytes packed into the binary buffer or a negative 402 * error code on failure. 403 */ 404ssize_t hdmi_audio_infoframe_pack_only(const struct hdmi_audio_infoframe *frame, 405 void *buffer, size_t size) 406{ 407 unsigned char channels; 408 u8 *ptr = buffer; 409 size_t length; 410 int ret; 411 412 ret = hdmi_audio_infoframe_check_only(frame); 413 if (ret) 414 return ret; 415 416 length = HDMI_INFOFRAME_HEADER_SIZE + frame->length; 417 418 if (size < length) 419 return -ENOSPC; 420 421 memset(buffer, 0, size); 422 423 if (frame->channels >= 2) 424 channels = frame->channels - 1; 425 else 426 channels = 0; 427 428 ptr[0] = frame->type; 429 ptr[1] = frame->version; 430 ptr[2] = frame->length; 431 ptr[3] = 0; /* checksum */ 432 433 /* start infoframe payload */ 434 ptr += HDMI_INFOFRAME_HEADER_SIZE; 435 436 ptr[0] = ((frame->coding_type & 0xf) << 4) | (channels & 0x7); 437 ptr[1] = ((frame->sample_frequency & 0x7) << 2) | 438 (frame->sample_size & 0x3); 439 ptr[2] = frame->coding_type_ext & 0x1f; 440 ptr[3] = frame->channel_allocation; 441 ptr[4] = (frame->level_shift_value & 0xf) << 3; 442 443 if (frame->downmix_inhibit) 444 ptr[4] |= BIT(7); 445 446 hdmi_infoframe_set_checksum(buffer, length); 447 448 return length; 449} 450EXPORT_SYMBOL(hdmi_audio_infoframe_pack_only); 451 452/** 453 * hdmi_audio_infoframe_pack() - check a HDMI Audio infoframe, 454 * and write it to binary buffer 455 * @frame: HDMI Audio infoframe 456 * @buffer: destination buffer 457 * @size: size of buffer 458 * 459 * Validates that the infoframe is consistent and updates derived fields 460 * (eg. length) based on other fields, after which it packs the information 461 * contained in the @frame structure into a binary representation that 462 * can be written into the corresponding controller registers. This function 463 * also computes the checksum as required by section 5.3.5 of the HDMI 1.4 464 * specification. 465 * 466 * Returns the number of bytes packed into the binary buffer or a negative 467 * error code on failure. 468 */ 469ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame, 470 void *buffer, size_t size) 471{ 472 int ret; 473 474 ret = hdmi_audio_infoframe_check(frame); 475 if (ret) 476 return ret; 477 478 return hdmi_audio_infoframe_pack_only(frame, buffer, size); 479} 480EXPORT_SYMBOL(hdmi_audio_infoframe_pack); 481 482/** 483 * hdmi_vendor_infoframe_init() - initialize an HDMI vendor infoframe 484 * @frame: HDMI vendor infoframe 485 * 486 * Returns 0 on success or a negative error code on failure. 487 */ 488int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame) 489{ 490 memset(frame, 0, sizeof(*frame)); 491 492 frame->type = HDMI_INFOFRAME_TYPE_VENDOR; 493 frame->version = 1; 494 495 frame->oui = HDMI_IEEE_OUI; 496 497 /* 498 * 0 is a valid value for s3d_struct, so we use a special "not set" 499 * value 500 */ 501 frame->s3d_struct = HDMI_3D_STRUCTURE_INVALID; 502 frame->length = HDMI_VENDOR_INFOFRAME_SIZE; 503 504 return 0; 505} 506EXPORT_SYMBOL(hdmi_vendor_infoframe_init); 507 508static int hdmi_vendor_infoframe_length(const struct hdmi_vendor_infoframe *frame) 509{ 510 /* for side by side (half) we also need to provide 3D_Ext_Data */ 511 if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) 512 return 6; 513 else if (frame->vic != 0 || frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID) 514 return 5; 515 else 516 return 4; 517} 518 519static int hdmi_vendor_infoframe_check_only(const struct hdmi_vendor_infoframe *frame) 520{ 521 if (frame->type != HDMI_INFOFRAME_TYPE_VENDOR || 522 frame->version != 1 || 523 frame->oui != HDMI_IEEE_OUI) 524 return -EINVAL; 525 526 /* only one of those can be supplied */ 527 if (frame->vic != 0 && frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID) 528 return -EINVAL; 529 530 if (frame->length != hdmi_vendor_infoframe_length(frame)) 531 return -EINVAL; 532 533 return 0; 534} 535 536/** 537 * hdmi_vendor_infoframe_check() - check a HDMI vendor infoframe 538 * @frame: HDMI infoframe 539 * 540 * Validates that the infoframe is consistent and updates derived fields 541 * (eg. length) based on other fields. 542 * 543 * Returns 0 on success or a negative error code on failure. 544 */ 545int hdmi_vendor_infoframe_check(struct hdmi_vendor_infoframe *frame) 546{ 547 frame->length = hdmi_vendor_infoframe_length(frame); 548 549 return hdmi_vendor_infoframe_check_only(frame); 550} 551EXPORT_SYMBOL(hdmi_vendor_infoframe_check); 552 553/** 554 * hdmi_vendor_infoframe_pack_only() - write a HDMI vendor infoframe to binary buffer 555 * @frame: HDMI infoframe 556 * @buffer: destination buffer 557 * @size: size of buffer 558 * 559 * Packs the information contained in the @frame structure into a binary 560 * representation that can be written into the corresponding controller 561 * registers. Also computes the checksum as required by section 5.3.5 of 562 * the HDMI 1.4 specification. 563 * 564 * Returns the number of bytes packed into the binary buffer or a negative 565 * error code on failure. 566 */ 567ssize_t hdmi_vendor_infoframe_pack_only(const struct hdmi_vendor_infoframe *frame, 568 void *buffer, size_t size) 569{ 570 u8 *ptr = buffer; 571 size_t length; 572 int ret; 573 574 ret = hdmi_vendor_infoframe_check_only(frame); 575 if (ret) 576 return ret; 577 578 length = HDMI_INFOFRAME_HEADER_SIZE + frame->length; 579 580 if (size < length) 581 return -ENOSPC; 582 583 memset(buffer, 0, size); 584 585 ptr[0] = frame->type; 586 ptr[1] = frame->version; 587 ptr[2] = frame->length; 588 ptr[3] = 0; /* checksum */ 589 590 /* HDMI OUI */ 591 ptr[4] = 0x03; 592 ptr[5] = 0x0c; 593 ptr[6] = 0x00; 594 595 if (frame->s3d_struct != HDMI_3D_STRUCTURE_INVALID) { 596 ptr[7] = 0x2 << 5; /* video format */ 597 ptr[8] = (frame->s3d_struct & 0xf) << 4; 598 if (frame->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) 599 ptr[9] = (frame->s3d_ext_data & 0xf) << 4; 600 } else if (frame->vic) { 601 ptr[7] = 0x1 << 5; /* video format */ 602 ptr[8] = frame->vic; 603 } else { 604 ptr[7] = 0x0 << 5; /* video format */ 605 } 606 607 hdmi_infoframe_set_checksum(buffer, length); 608 609 return length; 610} 611EXPORT_SYMBOL(hdmi_vendor_infoframe_pack_only); 612 613/** 614 * hdmi_vendor_infoframe_pack() - check a HDMI Vendor infoframe, 615 * and write it to binary buffer 616 * @frame: HDMI Vendor infoframe 617 * @buffer: destination buffer 618 * @size: size of buffer 619 * 620 * Validates that the infoframe is consistent and updates derived fields 621 * (eg. length) based on other fields, after which it packs the information 622 * contained in the @frame structure into a binary representation that 623 * can be written into the corresponding controller registers. This function 624 * also computes the checksum as required by section 5.3.5 of the HDMI 1.4 625 * specification. 626 * 627 * Returns the number of bytes packed into the binary buffer or a negative 628 * error code on failure. 629 */ 630ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame, 631 void *buffer, size_t size) 632{ 633 int ret; 634 635 ret = hdmi_vendor_infoframe_check(frame); 636 if (ret) 637 return ret; 638 639 return hdmi_vendor_infoframe_pack_only(frame, buffer, size); 640} 641EXPORT_SYMBOL(hdmi_vendor_infoframe_pack); 642 643static int 644hdmi_vendor_any_infoframe_check_only(const union hdmi_vendor_any_infoframe *frame) 645{ 646 if (frame->any.type != HDMI_INFOFRAME_TYPE_VENDOR || 647 frame->any.version != 1) 648 return -EINVAL; 649 650 return 0; 651} 652 653/** 654 * hdmi_drm_infoframe_init() - initialize an HDMI Dynaminc Range and 655 * mastering infoframe 656 * @frame: HDMI DRM infoframe 657 * 658 * Returns 0 on success or a negative error code on failure. 659 */ 660int hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *frame) 661{ 662 memset(frame, 0, sizeof(*frame)); 663 664 frame->type = HDMI_INFOFRAME_TYPE_DRM; 665 frame->version = 1; 666 frame->length = HDMI_DRM_INFOFRAME_SIZE; 667 668 return 0; 669} 670EXPORT_SYMBOL(hdmi_drm_infoframe_init); 671 672static int hdmi_drm_infoframe_check_only(const struct hdmi_drm_infoframe *frame) 673{ 674 if (frame->type != HDMI_INFOFRAME_TYPE_DRM || 675 frame->version != 1) 676 return -EINVAL; 677 678 if (frame->length != HDMI_DRM_INFOFRAME_SIZE) 679 return -EINVAL; 680 681 return 0; 682} 683 684/** 685 * hdmi_drm_infoframe_check() - check a HDMI DRM infoframe 686 * @frame: HDMI DRM infoframe 687 * 688 * Validates that the infoframe is consistent. 689 * Returns 0 on success or a negative error code on failure. 690 */ 691int hdmi_drm_infoframe_check(struct hdmi_drm_infoframe *frame) 692{ 693 return hdmi_drm_infoframe_check_only(frame); 694} 695EXPORT_SYMBOL(hdmi_drm_infoframe_check); 696 697/** 698 * hdmi_drm_infoframe_pack_only() - write HDMI DRM infoframe to binary buffer 699 * @frame: HDMI DRM infoframe 700 * @buffer: destination buffer 701 * @size: size of buffer 702 * 703 * Packs the information contained in the @frame structure into a binary 704 * representation that can be written into the corresponding controller 705 * registers. Also computes the checksum as required by section 5.3.5 of 706 * the HDMI 1.4 specification. 707 * 708 * Returns the number of bytes packed into the binary buffer or a negative 709 * error code on failure. 710 */ 711ssize_t hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *frame, 712 void *buffer, size_t size) 713{ 714 u8 *ptr = buffer; 715 size_t length; 716 int i; 717 718 length = HDMI_INFOFRAME_HEADER_SIZE + frame->length; 719 720 if (size < length) 721 return -ENOSPC; 722 723 memset(buffer, 0, size); 724 725 ptr[0] = frame->type; 726 ptr[1] = frame->version; 727 ptr[2] = frame->length; 728 ptr[3] = 0; /* checksum */ 729 730 /* start infoframe payload */ 731 ptr += HDMI_INFOFRAME_HEADER_SIZE; 732 733 *ptr++ = frame->eotf; 734 *ptr++ = frame->metadata_type; 735 736 for (i = 0; i < 3; i++) { 737 *ptr++ = frame->display_primaries[i].x; 738 *ptr++ = frame->display_primaries[i].x >> 8; 739 *ptr++ = frame->display_primaries[i].y; 740 *ptr++ = frame->display_primaries[i].y >> 8; 741 } 742 743 *ptr++ = frame->white_point.x; 744 *ptr++ = frame->white_point.x >> 8; 745 746 *ptr++ = frame->white_point.y; 747 *ptr++ = frame->white_point.y >> 8; 748 749 *ptr++ = frame->max_display_mastering_luminance; 750 *ptr++ = frame->max_display_mastering_luminance >> 8; 751 752 *ptr++ = frame->min_display_mastering_luminance; 753 *ptr++ = frame->min_display_mastering_luminance >> 8; 754 755 *ptr++ = frame->max_cll; 756 *ptr++ = frame->max_cll >> 8; 757 758 *ptr++ = frame->max_fall; 759 *ptr++ = frame->max_fall >> 8; 760 761 hdmi_infoframe_set_checksum(buffer, length); 762 763 return length; 764} 765EXPORT_SYMBOL(hdmi_drm_infoframe_pack_only); 766 767/** 768 * hdmi_drm_infoframe_pack() - check a HDMI DRM infoframe, 769 * and write it to binary buffer 770 * @frame: HDMI DRM infoframe 771 * @buffer: destination buffer 772 * @size: size of buffer 773 * 774 * Validates that the infoframe is consistent and updates derived fields 775 * (eg. length) based on other fields, after which it packs the information 776 * contained in the @frame structure into a binary representation that 777 * can be written into the corresponding controller registers. This function 778 * also computes the checksum as required by section 5.3.5 of the HDMI 1.4 779 * specification. 780 * 781 * Returns the number of bytes packed into the binary buffer or a negative 782 * error code on failure. 783 */ 784ssize_t hdmi_drm_infoframe_pack(struct hdmi_drm_infoframe *frame, 785 void *buffer, size_t size) 786{ 787 int ret; 788 789 ret = hdmi_drm_infoframe_check(frame); 790 if (ret) 791 return ret; 792 793 return hdmi_drm_infoframe_pack_only(frame, buffer, size); 794} 795EXPORT_SYMBOL(hdmi_drm_infoframe_pack); 796 797/* 798 * hdmi_vendor_any_infoframe_check() - check a vendor infoframe 799 */ 800static int 801hdmi_vendor_any_infoframe_check(union hdmi_vendor_any_infoframe *frame) 802{ 803 int ret; 804 805 ret = hdmi_vendor_any_infoframe_check_only(frame); 806 if (ret) 807 return ret; 808 809 /* we only know about HDMI vendor infoframes */ 810 if (frame->any.oui != HDMI_IEEE_OUI) 811 return -EINVAL; 812 813 return hdmi_vendor_infoframe_check(&frame->hdmi); 814} 815 816/* 817 * hdmi_vendor_any_infoframe_pack_only() - write a vendor infoframe to binary buffer 818 */ 819static ssize_t 820hdmi_vendor_any_infoframe_pack_only(const union hdmi_vendor_any_infoframe *frame, 821 void *buffer, size_t size) 822{ 823 int ret; 824 825 ret = hdmi_vendor_any_infoframe_check_only(frame); 826 if (ret) 827 return ret; 828 829 /* we only know about HDMI vendor infoframes */ 830 if (frame->any.oui != HDMI_IEEE_OUI) 831 return -EINVAL; 832 833 return hdmi_vendor_infoframe_pack_only(&frame->hdmi, buffer, size); 834} 835 836/* 837 * hdmi_vendor_any_infoframe_pack() - check a vendor infoframe, 838 * and write it to binary buffer 839 */ 840static ssize_t 841hdmi_vendor_any_infoframe_pack(union hdmi_vendor_any_infoframe *frame, 842 void *buffer, size_t size) 843{ 844 int ret; 845 846 ret = hdmi_vendor_any_infoframe_check(frame); 847 if (ret) 848 return ret; 849 850 return hdmi_vendor_any_infoframe_pack_only(frame, buffer, size); 851} 852 853/** 854 * hdmi_infoframe_check() - check a HDMI infoframe 855 * @frame: HDMI infoframe 856 * 857 * Validates that the infoframe is consistent and updates derived fields 858 * (eg. length) based on other fields. 859 * 860 * Returns 0 on success or a negative error code on failure. 861 */ 862int 863hdmi_infoframe_check(union hdmi_infoframe *frame) 864{ 865 switch (frame->any.type) { 866 case HDMI_INFOFRAME_TYPE_AVI: 867 return hdmi_avi_infoframe_check(&frame->avi); 868 case HDMI_INFOFRAME_TYPE_SPD: 869 return hdmi_spd_infoframe_check(&frame->spd); 870 case HDMI_INFOFRAME_TYPE_AUDIO: 871 return hdmi_audio_infoframe_check(&frame->audio); 872 case HDMI_INFOFRAME_TYPE_VENDOR: 873 return hdmi_vendor_any_infoframe_check(&frame->vendor); 874 default: 875 WARN(1, "Bad infoframe type %d\n", frame->any.type); 876 return -EINVAL; 877 } 878} 879EXPORT_SYMBOL(hdmi_infoframe_check); 880 881/** 882 * hdmi_infoframe_pack_only() - write a HDMI infoframe to binary buffer 883 * @frame: HDMI infoframe 884 * @buffer: destination buffer 885 * @size: size of buffer 886 * 887 * Packs the information contained in the @frame structure into a binary 888 * representation that can be written into the corresponding controller 889 * registers. Also computes the checksum as required by section 5.3.5 of 890 * the HDMI 1.4 specification. 891 * 892 * Returns the number of bytes packed into the binary buffer or a negative 893 * error code on failure. 894 */ 895ssize_t 896hdmi_infoframe_pack_only(const union hdmi_infoframe *frame, void *buffer, size_t size) 897{ 898 ssize_t length; 899 900 switch (frame->any.type) { 901 case HDMI_INFOFRAME_TYPE_AVI: 902 length = hdmi_avi_infoframe_pack_only(&frame->avi, 903 buffer, size); 904 break; 905 case HDMI_INFOFRAME_TYPE_DRM: 906 length = hdmi_drm_infoframe_pack_only(&frame->drm, 907 buffer, size); 908 break; 909 case HDMI_INFOFRAME_TYPE_SPD: 910 length = hdmi_spd_infoframe_pack_only(&frame->spd, 911 buffer, size); 912 break; 913 case HDMI_INFOFRAME_TYPE_AUDIO: 914 length = hdmi_audio_infoframe_pack_only(&frame->audio, 915 buffer, size); 916 break; 917 case HDMI_INFOFRAME_TYPE_VENDOR: 918 length = hdmi_vendor_any_infoframe_pack_only(&frame->vendor, 919 buffer, size); 920 break; 921 default: 922 WARN(1, "Bad infoframe type %d\n", frame->any.type); 923 length = -EINVAL; 924 } 925 926 return length; 927} 928EXPORT_SYMBOL(hdmi_infoframe_pack_only); 929 930/** 931 * hdmi_infoframe_pack() - check a HDMI infoframe, 932 * and write it to binary buffer 933 * @frame: HDMI infoframe 934 * @buffer: destination buffer 935 * @size: size of buffer 936 * 937 * Validates that the infoframe is consistent and updates derived fields 938 * (eg. length) based on other fields, after which it packs the information 939 * contained in the @frame structure into a binary representation that 940 * can be written into the corresponding controller registers. This function 941 * also computes the checksum as required by section 5.3.5 of the HDMI 1.4 942 * specification. 943 * 944 * Returns the number of bytes packed into the binary buffer or a negative 945 * error code on failure. 946 */ 947ssize_t 948hdmi_infoframe_pack(union hdmi_infoframe *frame, 949 void *buffer, size_t size) 950{ 951 ssize_t length; 952 953 switch (frame->any.type) { 954 case HDMI_INFOFRAME_TYPE_AVI: 955 length = hdmi_avi_infoframe_pack(&frame->avi, buffer, size); 956 break; 957 case HDMI_INFOFRAME_TYPE_DRM: 958 length = hdmi_drm_infoframe_pack(&frame->drm, buffer, size); 959 break; 960 case HDMI_INFOFRAME_TYPE_SPD: 961 length = hdmi_spd_infoframe_pack(&frame->spd, buffer, size); 962 break; 963 case HDMI_INFOFRAME_TYPE_AUDIO: 964 length = hdmi_audio_infoframe_pack(&frame->audio, buffer, size); 965 break; 966 case HDMI_INFOFRAME_TYPE_VENDOR: 967 length = hdmi_vendor_any_infoframe_pack(&frame->vendor, 968 buffer, size); 969 break; 970 default: 971 WARN(1, "Bad infoframe type %d\n", frame->any.type); 972 length = -EINVAL; 973 } 974 975 return length; 976} 977EXPORT_SYMBOL(hdmi_infoframe_pack); 978 979static const char *hdmi_infoframe_type_get_name(enum hdmi_infoframe_type type) 980{ 981 if (type < 0x80 || type > 0x9f) 982 return "Invalid"; 983 switch (type) { 984 case HDMI_INFOFRAME_TYPE_VENDOR: 985 return "Vendor"; 986 case HDMI_INFOFRAME_TYPE_AVI: 987 return "Auxiliary Video Information (AVI)"; 988 case HDMI_INFOFRAME_TYPE_SPD: 989 return "Source Product Description (SPD)"; 990 case HDMI_INFOFRAME_TYPE_AUDIO: 991 return "Audio"; 992 case HDMI_INFOFRAME_TYPE_DRM: 993 return "Dynamic Range and Mastering"; 994 } 995 return "Reserved"; 996} 997 998static void hdmi_infoframe_log_header(const char *level, 999 struct device *dev, 1000 const struct hdmi_any_infoframe *frame) 1001{ 1002 hdmi_log("HDMI infoframe: %s, version %u, length %u\n", 1003 hdmi_infoframe_type_get_name(frame->type), 1004 frame->version, frame->length); 1005} 1006 1007static const char *hdmi_colorspace_get_name(enum hdmi_colorspace colorspace) 1008{ 1009 switch (colorspace) { 1010 case HDMI_COLORSPACE_RGB: 1011 return "RGB"; 1012 case HDMI_COLORSPACE_YUV422: 1013 return "YCbCr 4:2:2"; 1014 case HDMI_COLORSPACE_YUV444: 1015 return "YCbCr 4:4:4"; 1016 case HDMI_COLORSPACE_YUV420: 1017 return "YCbCr 4:2:0"; 1018 case HDMI_COLORSPACE_RESERVED4: 1019 return "Reserved (4)"; 1020 case HDMI_COLORSPACE_RESERVED5: 1021 return "Reserved (5)"; 1022 case HDMI_COLORSPACE_RESERVED6: 1023 return "Reserved (6)"; 1024 case HDMI_COLORSPACE_IDO_DEFINED: 1025 return "IDO Defined"; 1026 } 1027 return "Invalid"; 1028} 1029 1030static const char *hdmi_scan_mode_get_name(enum hdmi_scan_mode scan_mode) 1031{ 1032 switch (scan_mode) { 1033 case HDMI_SCAN_MODE_NONE: 1034 return "No Data"; 1035 case HDMI_SCAN_MODE_OVERSCAN: 1036 return "Overscan"; 1037 case HDMI_SCAN_MODE_UNDERSCAN: 1038 return "Underscan"; 1039 case HDMI_SCAN_MODE_RESERVED: 1040 return "Reserved"; 1041 } 1042 return "Invalid"; 1043} 1044 1045static const char *hdmi_colorimetry_get_name(enum hdmi_colorimetry colorimetry) 1046{ 1047 switch (colorimetry) { 1048 case HDMI_COLORIMETRY_NONE: 1049 return "No Data"; 1050 case HDMI_COLORIMETRY_ITU_601: 1051 return "ITU601"; 1052 case HDMI_COLORIMETRY_ITU_709: 1053 return "ITU709"; 1054 case HDMI_COLORIMETRY_EXTENDED: 1055 return "Extended"; 1056 } 1057 return "Invalid"; 1058} 1059 1060static const char * 1061hdmi_picture_aspect_get_name(enum hdmi_picture_aspect picture_aspect) 1062{ 1063 switch (picture_aspect) { 1064 case HDMI_PICTURE_ASPECT_NONE: 1065 return "No Data"; 1066 case HDMI_PICTURE_ASPECT_4_3: 1067 return "4:3"; 1068 case HDMI_PICTURE_ASPECT_16_9: 1069 return "16:9"; 1070 case HDMI_PICTURE_ASPECT_64_27: 1071 return "64:27"; 1072 case HDMI_PICTURE_ASPECT_256_135: 1073 return "256:135"; 1074 case HDMI_PICTURE_ASPECT_RESERVED: 1075 return "Reserved"; 1076 } 1077 return "Invalid"; 1078} 1079 1080static const char * 1081hdmi_active_aspect_get_name(enum hdmi_active_aspect active_aspect) 1082{ 1083 if (active_aspect < 0 || active_aspect > 0xf) 1084 return "Invalid"; 1085 1086 switch (active_aspect) { 1087 case HDMI_ACTIVE_ASPECT_16_9_TOP: 1088 return "16:9 Top"; 1089 case HDMI_ACTIVE_ASPECT_14_9_TOP: 1090 return "14:9 Top"; 1091 case HDMI_ACTIVE_ASPECT_16_9_CENTER: 1092 return "16:9 Center"; 1093 case HDMI_ACTIVE_ASPECT_PICTURE: 1094 return "Same as Picture"; 1095 case HDMI_ACTIVE_ASPECT_4_3: 1096 return "4:3"; 1097 case HDMI_ACTIVE_ASPECT_16_9: 1098 return "16:9"; 1099 case HDMI_ACTIVE_ASPECT_14_9: 1100 return "14:9"; 1101 case HDMI_ACTIVE_ASPECT_4_3_SP_14_9: 1102 return "4:3 SP 14:9"; 1103 case HDMI_ACTIVE_ASPECT_16_9_SP_14_9: 1104 return "16:9 SP 14:9"; 1105 case HDMI_ACTIVE_ASPECT_16_9_SP_4_3: 1106 return "16:9 SP 4:3"; 1107 } 1108 return "Reserved"; 1109} 1110 1111static const char * 1112hdmi_extended_colorimetry_get_name(enum hdmi_extended_colorimetry ext_col) 1113{ 1114 switch (ext_col) { 1115 case HDMI_EXTENDED_COLORIMETRY_XV_YCC_601: 1116 return "xvYCC 601"; 1117 case HDMI_EXTENDED_COLORIMETRY_XV_YCC_709: 1118 return "xvYCC 709"; 1119 case HDMI_EXTENDED_COLORIMETRY_S_YCC_601: 1120 return "sYCC 601"; 1121 case HDMI_EXTENDED_COLORIMETRY_OPYCC_601: 1122 return "opYCC 601"; 1123 case HDMI_EXTENDED_COLORIMETRY_OPRGB: 1124 return "opRGB"; 1125 case HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM: 1126 return "BT.2020 Constant Luminance"; 1127 case HDMI_EXTENDED_COLORIMETRY_BT2020: 1128 return "BT.2020"; 1129 case HDMI_EXTENDED_COLORIMETRY_RESERVED: 1130 return "Reserved"; 1131 } 1132 return "Invalid"; 1133} 1134 1135static const char * 1136hdmi_quantization_range_get_name(enum hdmi_quantization_range qrange) 1137{ 1138 switch (qrange) { 1139 case HDMI_QUANTIZATION_RANGE_DEFAULT: 1140 return "Default"; 1141 case HDMI_QUANTIZATION_RANGE_LIMITED: 1142 return "Limited"; 1143 case HDMI_QUANTIZATION_RANGE_FULL: 1144 return "Full"; 1145 case HDMI_QUANTIZATION_RANGE_RESERVED: 1146 return "Reserved"; 1147 } 1148 return "Invalid"; 1149} 1150 1151static const char *hdmi_nups_get_name(enum hdmi_nups nups) 1152{ 1153 switch (nups) { 1154 case HDMI_NUPS_UNKNOWN: 1155 return "Unknown Non-uniform Scaling"; 1156 case HDMI_NUPS_HORIZONTAL: 1157 return "Horizontally Scaled"; 1158 case HDMI_NUPS_VERTICAL: 1159 return "Vertically Scaled"; 1160 case HDMI_NUPS_BOTH: 1161 return "Horizontally and Vertically Scaled"; 1162 } 1163 return "Invalid"; 1164} 1165 1166static const char * 1167hdmi_ycc_quantization_range_get_name(enum hdmi_ycc_quantization_range qrange) 1168{ 1169 switch (qrange) { 1170 case HDMI_YCC_QUANTIZATION_RANGE_LIMITED: 1171 return "Limited"; 1172 case HDMI_YCC_QUANTIZATION_RANGE_FULL: 1173 return "Full"; 1174 } 1175 return "Invalid"; 1176} 1177 1178static const char * 1179hdmi_content_type_get_name(enum hdmi_content_type content_type) 1180{ 1181 switch (content_type) { 1182 case HDMI_CONTENT_TYPE_GRAPHICS: 1183 return "Graphics"; 1184 case HDMI_CONTENT_TYPE_PHOTO: 1185 return "Photo"; 1186 case HDMI_CONTENT_TYPE_CINEMA: 1187 return "Cinema"; 1188 case HDMI_CONTENT_TYPE_GAME: 1189 return "Game"; 1190 } 1191 return "Invalid"; 1192} 1193 1194static void hdmi_avi_infoframe_log(const char *level, 1195 struct device *dev, 1196 const struct hdmi_avi_infoframe *frame) 1197{ 1198 hdmi_infoframe_log_header(level, dev, 1199 (const struct hdmi_any_infoframe *)frame); 1200 1201 hdmi_log(" colorspace: %s\n", 1202 hdmi_colorspace_get_name(frame->colorspace)); 1203 hdmi_log(" scan mode: %s\n", 1204 hdmi_scan_mode_get_name(frame->scan_mode)); 1205 hdmi_log(" colorimetry: %s\n", 1206 hdmi_colorimetry_get_name(frame->colorimetry)); 1207 hdmi_log(" picture aspect: %s\n", 1208 hdmi_picture_aspect_get_name(frame->picture_aspect)); 1209 hdmi_log(" active aspect: %s\n", 1210 hdmi_active_aspect_get_name(frame->active_aspect)); 1211 hdmi_log(" itc: %s\n", frame->itc ? "IT Content" : "No Data"); 1212 hdmi_log(" extended colorimetry: %s\n", 1213 hdmi_extended_colorimetry_get_name(frame->extended_colorimetry)); 1214 hdmi_log(" quantization range: %s\n", 1215 hdmi_quantization_range_get_name(frame->quantization_range)); 1216 hdmi_log(" nups: %s\n", hdmi_nups_get_name(frame->nups)); 1217 hdmi_log(" video code: %u\n", frame->video_code); 1218 hdmi_log(" ycc quantization range: %s\n", 1219 hdmi_ycc_quantization_range_get_name(frame->ycc_quantization_range)); 1220 hdmi_log(" hdmi content type: %s\n", 1221 hdmi_content_type_get_name(frame->content_type)); 1222 hdmi_log(" pixel repeat: %u\n", frame->pixel_repeat); 1223 hdmi_log(" bar top %u, bottom %u, left %u, right %u\n", 1224 frame->top_bar, frame->bottom_bar, 1225 frame->left_bar, frame->right_bar); 1226} 1227 1228static const char *hdmi_spd_sdi_get_name(enum hdmi_spd_sdi sdi) 1229{ 1230 if (sdi < 0 || sdi > 0xff) 1231 return "Invalid"; 1232 switch (sdi) { 1233 case HDMI_SPD_SDI_UNKNOWN: 1234 return "Unknown"; 1235 case HDMI_SPD_SDI_DSTB: 1236 return "Digital STB"; 1237 case HDMI_SPD_SDI_DVDP: 1238 return "DVD Player"; 1239 case HDMI_SPD_SDI_DVHS: 1240 return "D-VHS"; 1241 case HDMI_SPD_SDI_HDDVR: 1242 return "HDD Videorecorder"; 1243 case HDMI_SPD_SDI_DVC: 1244 return "DVC"; 1245 case HDMI_SPD_SDI_DSC: 1246 return "DSC"; 1247 case HDMI_SPD_SDI_VCD: 1248 return "Video CD"; 1249 case HDMI_SPD_SDI_GAME: 1250 return "Game"; 1251 case HDMI_SPD_SDI_PC: 1252 return "PC General"; 1253 case HDMI_SPD_SDI_BD: 1254 return "Blu-Ray Disc (BD)"; 1255 case HDMI_SPD_SDI_SACD: 1256 return "Super Audio CD"; 1257 case HDMI_SPD_SDI_HDDVD: 1258 return "HD DVD"; 1259 case HDMI_SPD_SDI_PMP: 1260 return "PMP"; 1261 } 1262 return "Reserved"; 1263} 1264 1265static void hdmi_spd_infoframe_log(const char *level, 1266 struct device *dev, 1267 const struct hdmi_spd_infoframe *frame) 1268{ 1269 u8 buf[17]; 1270 1271 hdmi_infoframe_log_header(level, dev, 1272 (const struct hdmi_any_infoframe *)frame); 1273 1274 memset(buf, 0, sizeof(buf)); 1275 1276 strncpy(buf, frame->vendor, 8); 1277 hdmi_log(" vendor: %s\n", buf); 1278 strncpy(buf, frame->product, 16); 1279 hdmi_log(" product: %s\n", buf); 1280 hdmi_log(" source device information: %s (0x%x)\n", 1281 hdmi_spd_sdi_get_name(frame->sdi), frame->sdi); 1282} 1283 1284static const char * 1285hdmi_audio_coding_type_get_name(enum hdmi_audio_coding_type coding_type) 1286{ 1287 switch (coding_type) { 1288 case HDMI_AUDIO_CODING_TYPE_STREAM: 1289 return "Refer to Stream Header"; 1290 case HDMI_AUDIO_CODING_TYPE_PCM: 1291 return "PCM"; 1292 case HDMI_AUDIO_CODING_TYPE_AC3: 1293 return "AC-3"; 1294 case HDMI_AUDIO_CODING_TYPE_MPEG1: 1295 return "MPEG1"; 1296 case HDMI_AUDIO_CODING_TYPE_MP3: 1297 return "MP3"; 1298 case HDMI_AUDIO_CODING_TYPE_MPEG2: 1299 return "MPEG2"; 1300 case HDMI_AUDIO_CODING_TYPE_AAC_LC: 1301 return "AAC"; 1302 case HDMI_AUDIO_CODING_TYPE_DTS: 1303 return "DTS"; 1304 case HDMI_AUDIO_CODING_TYPE_ATRAC: 1305 return "ATRAC"; 1306 case HDMI_AUDIO_CODING_TYPE_DSD: 1307 return "One Bit Audio"; 1308 case HDMI_AUDIO_CODING_TYPE_EAC3: 1309 return "Dolby Digital +"; 1310 case HDMI_AUDIO_CODING_TYPE_DTS_HD: 1311 return "DTS-HD"; 1312 case HDMI_AUDIO_CODING_TYPE_MLP: 1313 return "MAT (MLP)"; 1314 case HDMI_AUDIO_CODING_TYPE_DST: 1315 return "DST"; 1316 case HDMI_AUDIO_CODING_TYPE_WMA_PRO: 1317 return "WMA PRO"; 1318 case HDMI_AUDIO_CODING_TYPE_CXT: 1319 return "Refer to CXT"; 1320 } 1321 return "Invalid"; 1322} 1323 1324static const char * 1325hdmi_audio_sample_size_get_name(enum hdmi_audio_sample_size sample_size) 1326{ 1327 switch (sample_size) { 1328 case HDMI_AUDIO_SAMPLE_SIZE_STREAM: 1329 return "Refer to Stream Header"; 1330 case HDMI_AUDIO_SAMPLE_SIZE_16: 1331 return "16 bit"; 1332 case HDMI_AUDIO_SAMPLE_SIZE_20: 1333 return "20 bit"; 1334 case HDMI_AUDIO_SAMPLE_SIZE_24: 1335 return "24 bit"; 1336 } 1337 return "Invalid"; 1338} 1339 1340static const char * 1341hdmi_audio_sample_frequency_get_name(enum hdmi_audio_sample_frequency freq) 1342{ 1343 switch (freq) { 1344 case HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM: 1345 return "Refer to Stream Header"; 1346 case HDMI_AUDIO_SAMPLE_FREQUENCY_32000: 1347 return "32 kHz"; 1348 case HDMI_AUDIO_SAMPLE_FREQUENCY_44100: 1349 return "44.1 kHz (CD)"; 1350 case HDMI_AUDIO_SAMPLE_FREQUENCY_48000: 1351 return "48 kHz"; 1352 case HDMI_AUDIO_SAMPLE_FREQUENCY_88200: 1353 return "88.2 kHz"; 1354 case HDMI_AUDIO_SAMPLE_FREQUENCY_96000: 1355 return "96 kHz"; 1356 case HDMI_AUDIO_SAMPLE_FREQUENCY_176400: 1357 return "176.4 kHz"; 1358 case HDMI_AUDIO_SAMPLE_FREQUENCY_192000: 1359 return "192 kHz"; 1360 } 1361 return "Invalid"; 1362} 1363 1364static const char * 1365hdmi_audio_coding_type_ext_get_name(enum hdmi_audio_coding_type_ext ctx) 1366{ 1367 if (ctx < 0 || ctx > 0x1f) 1368 return "Invalid"; 1369 1370 switch (ctx) { 1371 case HDMI_AUDIO_CODING_TYPE_EXT_CT: 1372 return "Refer to CT"; 1373 case HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC: 1374 return "HE AAC"; 1375 case HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2: 1376 return "HE AAC v2"; 1377 case HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND: 1378 return "MPEG SURROUND"; 1379 case HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC: 1380 return "MPEG-4 HE AAC"; 1381 case HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2: 1382 return "MPEG-4 HE AAC v2"; 1383 case HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC: 1384 return "MPEG-4 AAC LC"; 1385 case HDMI_AUDIO_CODING_TYPE_EXT_DRA: 1386 return "DRA"; 1387 case HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND: 1388 return "MPEG-4 HE AAC + MPEG Surround"; 1389 case HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND: 1390 return "MPEG-4 AAC LC + MPEG Surround"; 1391 } 1392 return "Reserved"; 1393} 1394 1395static void hdmi_audio_infoframe_log(const char *level, 1396 struct device *dev, 1397 const struct hdmi_audio_infoframe *frame) 1398{ 1399 hdmi_infoframe_log_header(level, dev, 1400 (const struct hdmi_any_infoframe *)frame); 1401 1402 if (frame->channels) 1403 hdmi_log(" channels: %u\n", frame->channels - 1); 1404 else 1405 hdmi_log(" channels: Refer to stream header\n"); 1406 hdmi_log(" coding type: %s\n", 1407 hdmi_audio_coding_type_get_name(frame->coding_type)); 1408 hdmi_log(" sample size: %s\n", 1409 hdmi_audio_sample_size_get_name(frame->sample_size)); 1410 hdmi_log(" sample frequency: %s\n", 1411 hdmi_audio_sample_frequency_get_name(frame->sample_frequency)); 1412 hdmi_log(" coding type ext: %s\n", 1413 hdmi_audio_coding_type_ext_get_name(frame->coding_type_ext)); 1414 hdmi_log(" channel allocation: 0x%x\n", 1415 frame->channel_allocation); 1416 hdmi_log(" level shift value: %u dB\n", 1417 frame->level_shift_value); 1418 hdmi_log(" downmix inhibit: %s\n", 1419 frame->downmix_inhibit ? "Yes" : "No"); 1420} 1421 1422static void hdmi_drm_infoframe_log(const char *level, 1423 struct device *dev, 1424 const struct hdmi_drm_infoframe *frame) 1425{ 1426 int i; 1427 1428 hdmi_infoframe_log_header(level, dev, 1429 (struct hdmi_any_infoframe *)frame); 1430 hdmi_log("length: %d\n", frame->length); 1431 hdmi_log("metadata type: %d\n", frame->metadata_type); 1432 hdmi_log("eotf: %d\n", frame->eotf); 1433 for (i = 0; i < 3; i++) { 1434 hdmi_log("x[%d]: %d\n", i, frame->display_primaries[i].x); 1435 hdmi_log("y[%d]: %d\n", i, frame->display_primaries[i].y); 1436 } 1437 1438 hdmi_log("white point x: %d\n", frame->white_point.x); 1439 hdmi_log("white point y: %d\n", frame->white_point.y); 1440 1441 hdmi_log("max_display_mastering_luminance: %d\n", 1442 frame->max_display_mastering_luminance); 1443 hdmi_log("min_display_mastering_luminance: %d\n", 1444 frame->min_display_mastering_luminance); 1445 1446 hdmi_log("max_cll: %d\n", frame->max_cll); 1447 hdmi_log("max_fall: %d\n", frame->max_fall); 1448} 1449 1450static const char * 1451hdmi_3d_structure_get_name(enum hdmi_3d_structure s3d_struct) 1452{ 1453 if (s3d_struct < 0 || s3d_struct > 0xf) 1454 return "Invalid"; 1455 1456 switch (s3d_struct) { 1457 case HDMI_3D_STRUCTURE_FRAME_PACKING: 1458 return "Frame Packing"; 1459 case HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE: 1460 return "Field Alternative"; 1461 case HDMI_3D_STRUCTURE_LINE_ALTERNATIVE: 1462 return "Line Alternative"; 1463 case HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL: 1464 return "Side-by-side (Full)"; 1465 case HDMI_3D_STRUCTURE_L_DEPTH: 1466 return "L + Depth"; 1467 case HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH: 1468 return "L + Depth + Graphics + Graphics-depth"; 1469 case HDMI_3D_STRUCTURE_TOP_AND_BOTTOM: 1470 return "Top-and-Bottom"; 1471 case HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF: 1472 return "Side-by-side (Half)"; 1473 default: 1474 break; 1475 } 1476 return "Reserved"; 1477} 1478 1479static void 1480hdmi_vendor_any_infoframe_log(const char *level, 1481 struct device *dev, 1482 const union hdmi_vendor_any_infoframe *frame) 1483{ 1484 const struct hdmi_vendor_infoframe *hvf = &frame->hdmi; 1485 1486 hdmi_infoframe_log_header(level, dev, 1487 (const struct hdmi_any_infoframe *)frame); 1488 1489 if (frame->any.oui != HDMI_IEEE_OUI) { 1490 hdmi_log(" not a HDMI vendor infoframe\n"); 1491 return; 1492 } 1493 if (hvf->vic == 0 && hvf->s3d_struct == HDMI_3D_STRUCTURE_INVALID) { 1494 hdmi_log(" empty frame\n"); 1495 return; 1496 } 1497 1498 if (hvf->vic) 1499 hdmi_log(" HDMI VIC: %u\n", hvf->vic); 1500 if (hvf->s3d_struct != HDMI_3D_STRUCTURE_INVALID) { 1501 hdmi_log(" 3D structure: %s\n", 1502 hdmi_3d_structure_get_name(hvf->s3d_struct)); 1503 if (hvf->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) 1504 hdmi_log(" 3D extension data: %d\n", 1505 hvf->s3d_ext_data); 1506 } 1507} 1508 1509/** 1510 * hdmi_infoframe_log() - log info of HDMI infoframe 1511 * @level: logging level 1512 * @dev: device 1513 * @frame: HDMI infoframe 1514 */ 1515void hdmi_infoframe_log(const char *level, 1516 struct device *dev, 1517 const union hdmi_infoframe *frame) 1518{ 1519 switch (frame->any.type) { 1520 case HDMI_INFOFRAME_TYPE_AVI: 1521 hdmi_avi_infoframe_log(level, dev, &frame->avi); 1522 break; 1523 case HDMI_INFOFRAME_TYPE_SPD: 1524 hdmi_spd_infoframe_log(level, dev, &frame->spd); 1525 break; 1526 case HDMI_INFOFRAME_TYPE_AUDIO: 1527 hdmi_audio_infoframe_log(level, dev, &frame->audio); 1528 break; 1529 case HDMI_INFOFRAME_TYPE_VENDOR: 1530 hdmi_vendor_any_infoframe_log(level, dev, &frame->vendor); 1531 break; 1532 case HDMI_INFOFRAME_TYPE_DRM: 1533 hdmi_drm_infoframe_log(level, dev, &frame->drm); 1534 break; 1535 } 1536} 1537EXPORT_SYMBOL(hdmi_infoframe_log); 1538 1539/** 1540 * hdmi_avi_infoframe_unpack() - unpack binary buffer to a HDMI AVI infoframe 1541 * @frame: HDMI AVI infoframe 1542 * @buffer: source buffer 1543 * @size: size of buffer 1544 * 1545 * Unpacks the information contained in binary @buffer into a structured 1546 * @frame of the HDMI Auxiliary Video (AVI) information frame. 1547 * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4 1548 * specification. 1549 * 1550 * Returns 0 on success or a negative error code on failure. 1551 */ 1552static int hdmi_avi_infoframe_unpack(struct hdmi_avi_infoframe *frame, 1553 const void *buffer, size_t size) 1554{ 1555 const u8 *ptr = buffer; 1556 1557 if (size < HDMI_INFOFRAME_SIZE(AVI)) 1558 return -EINVAL; 1559 1560 if (ptr[0] != HDMI_INFOFRAME_TYPE_AVI || 1561 ptr[1] != 2 || 1562 ptr[2] != HDMI_AVI_INFOFRAME_SIZE) 1563 return -EINVAL; 1564 1565 if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(AVI)) != 0) 1566 return -EINVAL; 1567 1568 hdmi_avi_infoframe_init(frame); 1569 1570 ptr += HDMI_INFOFRAME_HEADER_SIZE; 1571 1572 frame->colorspace = (ptr[0] >> 5) & 0x3; 1573 if (ptr[0] & 0x10) 1574 frame->active_aspect = ptr[1] & 0xf; 1575 if (ptr[0] & 0x8) { 1576 frame->top_bar = (ptr[6] << 8) | ptr[5]; 1577 frame->bottom_bar = (ptr[8] << 8) | ptr[7]; 1578 } 1579 if (ptr[0] & 0x4) { 1580 frame->left_bar = (ptr[10] << 8) | ptr[9]; 1581 frame->right_bar = (ptr[12] << 8) | ptr[11]; 1582 } 1583 frame->scan_mode = ptr[0] & 0x3; 1584 1585 frame->colorimetry = (ptr[1] >> 6) & 0x3; 1586 frame->picture_aspect = (ptr[1] >> 4) & 0x3; 1587 frame->active_aspect = ptr[1] & 0xf; 1588 1589 frame->itc = ptr[2] & 0x80 ? true : false; 1590 frame->extended_colorimetry = (ptr[2] >> 4) & 0x7; 1591 frame->quantization_range = (ptr[2] >> 2) & 0x3; 1592 frame->nups = ptr[2] & 0x3; 1593 1594 frame->video_code = ptr[3] & 0x7f; 1595 frame->ycc_quantization_range = (ptr[4] >> 6) & 0x3; 1596 frame->content_type = (ptr[4] >> 4) & 0x3; 1597 1598 frame->pixel_repeat = ptr[4] & 0xf; 1599 1600 return 0; 1601} 1602 1603/** 1604 * hdmi_spd_infoframe_unpack() - unpack binary buffer to a HDMI SPD infoframe 1605 * @frame: HDMI SPD infoframe 1606 * @buffer: source buffer 1607 * @size: size of buffer 1608 * 1609 * Unpacks the information contained in binary @buffer into a structured 1610 * @frame of the HDMI Source Product Description (SPD) information frame. 1611 * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4 1612 * specification. 1613 * 1614 * Returns 0 on success or a negative error code on failure. 1615 */ 1616static int hdmi_spd_infoframe_unpack(struct hdmi_spd_infoframe *frame, 1617 const void *buffer, size_t size) 1618{ 1619 const u8 *ptr = buffer; 1620 int ret; 1621 1622 if (size < HDMI_INFOFRAME_SIZE(SPD)) 1623 return -EINVAL; 1624 1625 if (ptr[0] != HDMI_INFOFRAME_TYPE_SPD || 1626 ptr[1] != 1 || 1627 ptr[2] != HDMI_SPD_INFOFRAME_SIZE) { 1628 return -EINVAL; 1629 } 1630 1631 if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(SPD)) != 0) 1632 return -EINVAL; 1633 1634 ptr += HDMI_INFOFRAME_HEADER_SIZE; 1635 1636 ret = hdmi_spd_infoframe_init(frame, ptr, ptr + 8); 1637 if (ret) 1638 return ret; 1639 1640 frame->sdi = ptr[24]; 1641 1642 return 0; 1643} 1644 1645/** 1646 * hdmi_audio_infoframe_unpack() - unpack binary buffer to a HDMI AUDIO infoframe 1647 * @frame: HDMI Audio infoframe 1648 * @buffer: source buffer 1649 * @size: size of buffer 1650 * 1651 * Unpacks the information contained in binary @buffer into a structured 1652 * @frame of the HDMI Audio information frame. 1653 * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4 1654 * specification. 1655 * 1656 * Returns 0 on success or a negative error code on failure. 1657 */ 1658static int hdmi_audio_infoframe_unpack(struct hdmi_audio_infoframe *frame, 1659 const void *buffer, size_t size) 1660{ 1661 const u8 *ptr = buffer; 1662 int ret; 1663 1664 if (size < HDMI_INFOFRAME_SIZE(AUDIO)) 1665 return -EINVAL; 1666 1667 if (ptr[0] != HDMI_INFOFRAME_TYPE_AUDIO || 1668 ptr[1] != 1 || 1669 ptr[2] != HDMI_AUDIO_INFOFRAME_SIZE) { 1670 return -EINVAL; 1671 } 1672 1673 if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(AUDIO)) != 0) 1674 return -EINVAL; 1675 1676 ret = hdmi_audio_infoframe_init(frame); 1677 if (ret) 1678 return ret; 1679 1680 ptr += HDMI_INFOFRAME_HEADER_SIZE; 1681 1682 frame->channels = ptr[0] & 0x7; 1683 frame->coding_type = (ptr[0] >> 4) & 0xf; 1684 frame->sample_size = ptr[1] & 0x3; 1685 frame->sample_frequency = (ptr[1] >> 2) & 0x7; 1686 frame->coding_type_ext = ptr[2] & 0x1f; 1687 frame->channel_allocation = ptr[3]; 1688 frame->level_shift_value = (ptr[4] >> 3) & 0xf; 1689 frame->downmix_inhibit = ptr[4] & 0x80 ? true : false; 1690 1691 return 0; 1692} 1693 1694/** 1695 * hdmi_vendor_any_infoframe_unpack() - unpack binary buffer to a HDMI 1696 * vendor infoframe 1697 * @frame: HDMI Vendor infoframe 1698 * @buffer: source buffer 1699 * @size: size of buffer 1700 * 1701 * Unpacks the information contained in binary @buffer into a structured 1702 * @frame of the HDMI Vendor information frame. 1703 * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4 1704 * specification. 1705 * 1706 * Returns 0 on success or a negative error code on failure. 1707 */ 1708static int 1709hdmi_vendor_any_infoframe_unpack(union hdmi_vendor_any_infoframe *frame, 1710 const void *buffer, size_t size) 1711{ 1712 const u8 *ptr = buffer; 1713 size_t length; 1714 int ret; 1715 u8 hdmi_video_format; 1716 struct hdmi_vendor_infoframe *hvf = &frame->hdmi; 1717 1718 if (size < HDMI_INFOFRAME_HEADER_SIZE) 1719 return -EINVAL; 1720 1721 if (ptr[0] != HDMI_INFOFRAME_TYPE_VENDOR || 1722 ptr[1] != 1 || 1723 (ptr[2] != 4 && ptr[2] != 5 && ptr[2] != 6)) 1724 return -EINVAL; 1725 1726 length = ptr[2]; 1727 1728 if (size < HDMI_INFOFRAME_HEADER_SIZE + length) 1729 return -EINVAL; 1730 1731 if (hdmi_infoframe_checksum(buffer, 1732 HDMI_INFOFRAME_HEADER_SIZE + length) != 0) 1733 return -EINVAL; 1734 1735 ptr += HDMI_INFOFRAME_HEADER_SIZE; 1736 1737 /* HDMI OUI */ 1738 if ((ptr[0] != 0x03) || 1739 (ptr[1] != 0x0c) || 1740 (ptr[2] != 0x00)) 1741 return -EINVAL; 1742 1743 hdmi_video_format = ptr[3] >> 5; 1744 1745 if (hdmi_video_format > 0x2) 1746 return -EINVAL; 1747 1748 ret = hdmi_vendor_infoframe_init(hvf); 1749 if (ret) 1750 return ret; 1751 1752 hvf->length = length; 1753 1754 if (hdmi_video_format == 0x2) { 1755 if (length != 5 && length != 6) 1756 return -EINVAL; 1757 hvf->s3d_struct = ptr[4] >> 4; 1758 if (hvf->s3d_struct >= HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF) { 1759 if (length != 6) 1760 return -EINVAL; 1761 hvf->s3d_ext_data = ptr[5] >> 4; 1762 } 1763 } else if (hdmi_video_format == 0x1) { 1764 if (length != 5) 1765 return -EINVAL; 1766 hvf->vic = ptr[4]; 1767 } else { 1768 if (length != 4) 1769 return -EINVAL; 1770 } 1771 1772 return 0; 1773} 1774 1775/** 1776 * hdmi_drm_infoframe_unpack_only() - unpack binary buffer of CTA-861-G DRM 1777 * infoframe DataBytes to a HDMI DRM 1778 * infoframe 1779 * @frame: HDMI DRM infoframe 1780 * @buffer: source buffer 1781 * @size: size of buffer 1782 * 1783 * Unpacks CTA-861-G DRM infoframe DataBytes contained in the binary @buffer 1784 * into a structured @frame of the HDMI Dynamic Range and Mastering (DRM) 1785 * infoframe. 1786 * 1787 * Returns 0 on success or a negative error code on failure. 1788 */ 1789int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame, 1790 const void *buffer, size_t size) 1791{ 1792 const u8 *ptr = buffer; 1793 const u8 *temp; 1794 u8 x_lsb, x_msb; 1795 u8 y_lsb, y_msb; 1796 int ret; 1797 int i; 1798 1799 if (size < HDMI_DRM_INFOFRAME_SIZE) 1800 return -EINVAL; 1801 1802 ret = hdmi_drm_infoframe_init(frame); 1803 if (ret) 1804 return ret; 1805 1806 frame->eotf = ptr[0] & 0x7; 1807 frame->metadata_type = ptr[1] & 0x7; 1808 1809 temp = ptr + 2; 1810 for (i = 0; i < 3; i++) { 1811 x_lsb = *temp++; 1812 x_msb = *temp++; 1813 frame->display_primaries[i].x = (x_msb << 8) | x_lsb; 1814 y_lsb = *temp++; 1815 y_msb = *temp++; 1816 frame->display_primaries[i].y = (y_msb << 8) | y_lsb; 1817 } 1818 1819 frame->white_point.x = (ptr[15] << 8) | ptr[14]; 1820 frame->white_point.y = (ptr[17] << 8) | ptr[16]; 1821 1822 frame->max_display_mastering_luminance = (ptr[19] << 8) | ptr[18]; 1823 frame->min_display_mastering_luminance = (ptr[21] << 8) | ptr[20]; 1824 frame->max_cll = (ptr[23] << 8) | ptr[22]; 1825 frame->max_fall = (ptr[25] << 8) | ptr[24]; 1826 1827 return 0; 1828} 1829EXPORT_SYMBOL(hdmi_drm_infoframe_unpack_only); 1830 1831/** 1832 * hdmi_drm_infoframe_unpack() - unpack binary buffer to a HDMI DRM infoframe 1833 * @frame: HDMI DRM infoframe 1834 * @buffer: source buffer 1835 * @size: size of buffer 1836 * 1837 * Unpacks the CTA-861-G DRM infoframe contained in the binary @buffer into 1838 * a structured @frame of the HDMI Dynamic Range and Mastering (DRM) 1839 * infoframe. It also verifies the checksum as required by section 5.3.5 of 1840 * the HDMI 1.4 specification. 1841 * 1842 * Returns 0 on success or a negative error code on failure. 1843 */ 1844static int hdmi_drm_infoframe_unpack(struct hdmi_drm_infoframe *frame, 1845 const void *buffer, size_t size) 1846{ 1847 const u8 *ptr = buffer; 1848 int ret; 1849 1850 if (size < HDMI_INFOFRAME_SIZE(DRM)) 1851 return -EINVAL; 1852 1853 if (ptr[0] != HDMI_INFOFRAME_TYPE_DRM || 1854 ptr[1] != 1 || 1855 ptr[2] != HDMI_DRM_INFOFRAME_SIZE) 1856 return -EINVAL; 1857 1858 if (hdmi_infoframe_checksum(buffer, HDMI_INFOFRAME_SIZE(DRM)) != 0) 1859 return -EINVAL; 1860 1861 ret = hdmi_drm_infoframe_unpack_only(frame, ptr + HDMI_INFOFRAME_HEADER_SIZE, 1862 size - HDMI_INFOFRAME_HEADER_SIZE); 1863 return ret; 1864} 1865 1866/** 1867 * hdmi_infoframe_unpack() - unpack binary buffer to a HDMI infoframe 1868 * @frame: HDMI infoframe 1869 * @buffer: source buffer 1870 * @size: size of buffer 1871 * 1872 * Unpacks the information contained in binary buffer @buffer into a structured 1873 * @frame of a HDMI infoframe. 1874 * Also verifies the checksum as required by section 5.3.5 of the HDMI 1.4 1875 * specification. 1876 * 1877 * Returns 0 on success or a negative error code on failure. 1878 */ 1879int hdmi_infoframe_unpack(union hdmi_infoframe *frame, 1880 const void *buffer, size_t size) 1881{ 1882 int ret; 1883 const u8 *ptr = buffer; 1884 1885 if (size < HDMI_INFOFRAME_HEADER_SIZE) 1886 return -EINVAL; 1887 1888 switch (ptr[0]) { 1889 case HDMI_INFOFRAME_TYPE_AVI: 1890 ret = hdmi_avi_infoframe_unpack(&frame->avi, buffer, size); 1891 break; 1892 case HDMI_INFOFRAME_TYPE_DRM: 1893 ret = hdmi_drm_infoframe_unpack(&frame->drm, buffer, size); 1894 break; 1895 case HDMI_INFOFRAME_TYPE_SPD: 1896 ret = hdmi_spd_infoframe_unpack(&frame->spd, buffer, size); 1897 break; 1898 case HDMI_INFOFRAME_TYPE_AUDIO: 1899 ret = hdmi_audio_infoframe_unpack(&frame->audio, buffer, size); 1900 break; 1901 case HDMI_INFOFRAME_TYPE_VENDOR: 1902 ret = hdmi_vendor_any_infoframe_unpack(&frame->vendor, buffer, size); 1903 break; 1904 default: 1905 ret = -EINVAL; 1906 break; 1907 } 1908 1909 return ret; 1910} 1911EXPORT_SYMBOL(hdmi_infoframe_unpack);