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