cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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);