Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Copyright (C) 2012 Avionic Design GmbH
0003  *
0004  * Permission is hereby granted, free of charge, to any person obtaining a
0005  * copy of this software and associated documentation files (the "Software"),
0006  * to deal in the Software without restriction, including without limitation
0007  * the rights to use, copy, modify, merge, publish, distribute, sub license,
0008  * and/or sell copies of the Software, and to permit persons to whom the
0009  * Software is furnished to do so, subject to the following conditions:
0010  *
0011  * The above copyright notice and this permission notice (including the
0012  * next paragraph) shall be included in all copies or substantial portions
0013  * of the Software.
0014  *
0015  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
0016  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
0017  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
0018  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
0019  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
0020  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
0021  * DEALINGS IN THE SOFTWARE.
0022  */
0023 
0024 #ifndef __LINUX_HDMI_H_
0025 #define __LINUX_HDMI_H_
0026 
0027 #include <linux/types.h>
0028 #include <linux/device.h>
0029 
0030 enum hdmi_packet_type {
0031     HDMI_PACKET_TYPE_NULL = 0x00,
0032     HDMI_PACKET_TYPE_AUDIO_CLOCK_REGEN = 0x01,
0033     HDMI_PACKET_TYPE_AUDIO_SAMPLE = 0x02,
0034     HDMI_PACKET_TYPE_GENERAL_CONTROL = 0x03,
0035     HDMI_PACKET_TYPE_ACP = 0x04,
0036     HDMI_PACKET_TYPE_ISRC1 = 0x05,
0037     HDMI_PACKET_TYPE_ISRC2 = 0x06,
0038     HDMI_PACKET_TYPE_ONE_BIT_AUDIO_SAMPLE = 0x07,
0039     HDMI_PACKET_TYPE_DST_AUDIO = 0x08,
0040     HDMI_PACKET_TYPE_HBR_AUDIO_STREAM = 0x09,
0041     HDMI_PACKET_TYPE_GAMUT_METADATA = 0x0a,
0042     /* + enum hdmi_infoframe_type */
0043 };
0044 
0045 enum hdmi_infoframe_type {
0046     HDMI_INFOFRAME_TYPE_VENDOR = 0x81,
0047     HDMI_INFOFRAME_TYPE_AVI = 0x82,
0048     HDMI_INFOFRAME_TYPE_SPD = 0x83,
0049     HDMI_INFOFRAME_TYPE_AUDIO = 0x84,
0050     HDMI_INFOFRAME_TYPE_DRM = 0x87,
0051 };
0052 
0053 #define HDMI_IEEE_OUI 0x000c03
0054 #define HDMI_FORUM_IEEE_OUI 0xc45dd8
0055 #define HDMI_INFOFRAME_HEADER_SIZE  4
0056 #define HDMI_AVI_INFOFRAME_SIZE    13
0057 #define HDMI_SPD_INFOFRAME_SIZE    25
0058 #define HDMI_AUDIO_INFOFRAME_SIZE  10
0059 #define HDMI_DRM_INFOFRAME_SIZE    26
0060 #define HDMI_VENDOR_INFOFRAME_SIZE  4
0061 
0062 #define HDMI_INFOFRAME_SIZE(type)   \
0063     (HDMI_INFOFRAME_HEADER_SIZE + HDMI_ ## type ## _INFOFRAME_SIZE)
0064 
0065 struct hdmi_any_infoframe {
0066     enum hdmi_infoframe_type type;
0067     unsigned char version;
0068     unsigned char length;
0069 };
0070 
0071 enum hdmi_colorspace {
0072     HDMI_COLORSPACE_RGB,
0073     HDMI_COLORSPACE_YUV422,
0074     HDMI_COLORSPACE_YUV444,
0075     HDMI_COLORSPACE_YUV420,
0076     HDMI_COLORSPACE_RESERVED4,
0077     HDMI_COLORSPACE_RESERVED5,
0078     HDMI_COLORSPACE_RESERVED6,
0079     HDMI_COLORSPACE_IDO_DEFINED,
0080 };
0081 
0082 enum hdmi_scan_mode {
0083     HDMI_SCAN_MODE_NONE,
0084     HDMI_SCAN_MODE_OVERSCAN,
0085     HDMI_SCAN_MODE_UNDERSCAN,
0086     HDMI_SCAN_MODE_RESERVED,
0087 };
0088 
0089 enum hdmi_colorimetry {
0090     HDMI_COLORIMETRY_NONE,
0091     HDMI_COLORIMETRY_ITU_601,
0092     HDMI_COLORIMETRY_ITU_709,
0093     HDMI_COLORIMETRY_EXTENDED,
0094 };
0095 
0096 enum hdmi_picture_aspect {
0097     HDMI_PICTURE_ASPECT_NONE,
0098     HDMI_PICTURE_ASPECT_4_3,
0099     HDMI_PICTURE_ASPECT_16_9,
0100     HDMI_PICTURE_ASPECT_64_27,
0101     HDMI_PICTURE_ASPECT_256_135,
0102     HDMI_PICTURE_ASPECT_RESERVED,
0103 };
0104 
0105 enum hdmi_active_aspect {
0106     HDMI_ACTIVE_ASPECT_16_9_TOP = 2,
0107     HDMI_ACTIVE_ASPECT_14_9_TOP = 3,
0108     HDMI_ACTIVE_ASPECT_16_9_CENTER = 4,
0109     HDMI_ACTIVE_ASPECT_PICTURE = 8,
0110     HDMI_ACTIVE_ASPECT_4_3 = 9,
0111     HDMI_ACTIVE_ASPECT_16_9 = 10,
0112     HDMI_ACTIVE_ASPECT_14_9 = 11,
0113     HDMI_ACTIVE_ASPECT_4_3_SP_14_9 = 13,
0114     HDMI_ACTIVE_ASPECT_16_9_SP_14_9 = 14,
0115     HDMI_ACTIVE_ASPECT_16_9_SP_4_3 = 15,
0116 };
0117 
0118 enum hdmi_extended_colorimetry {
0119     HDMI_EXTENDED_COLORIMETRY_XV_YCC_601,
0120     HDMI_EXTENDED_COLORIMETRY_XV_YCC_709,
0121     HDMI_EXTENDED_COLORIMETRY_S_YCC_601,
0122     HDMI_EXTENDED_COLORIMETRY_OPYCC_601,
0123     HDMI_EXTENDED_COLORIMETRY_OPRGB,
0124 
0125     /* The following EC values are only defined in CEA-861-F. */
0126     HDMI_EXTENDED_COLORIMETRY_BT2020_CONST_LUM,
0127     HDMI_EXTENDED_COLORIMETRY_BT2020,
0128     HDMI_EXTENDED_COLORIMETRY_RESERVED,
0129 };
0130 
0131 enum hdmi_quantization_range {
0132     HDMI_QUANTIZATION_RANGE_DEFAULT,
0133     HDMI_QUANTIZATION_RANGE_LIMITED,
0134     HDMI_QUANTIZATION_RANGE_FULL,
0135     HDMI_QUANTIZATION_RANGE_RESERVED,
0136 };
0137 
0138 /* non-uniform picture scaling */
0139 enum hdmi_nups {
0140     HDMI_NUPS_UNKNOWN,
0141     HDMI_NUPS_HORIZONTAL,
0142     HDMI_NUPS_VERTICAL,
0143     HDMI_NUPS_BOTH,
0144 };
0145 
0146 enum hdmi_ycc_quantization_range {
0147     HDMI_YCC_QUANTIZATION_RANGE_LIMITED,
0148     HDMI_YCC_QUANTIZATION_RANGE_FULL,
0149 };
0150 
0151 enum hdmi_content_type {
0152     HDMI_CONTENT_TYPE_GRAPHICS,
0153     HDMI_CONTENT_TYPE_PHOTO,
0154     HDMI_CONTENT_TYPE_CINEMA,
0155     HDMI_CONTENT_TYPE_GAME,
0156 };
0157 
0158 enum hdmi_metadata_type {
0159     HDMI_STATIC_METADATA_TYPE1 = 0,
0160 };
0161 
0162 enum hdmi_eotf {
0163     HDMI_EOTF_TRADITIONAL_GAMMA_SDR,
0164     HDMI_EOTF_TRADITIONAL_GAMMA_HDR,
0165     HDMI_EOTF_SMPTE_ST2084,
0166     HDMI_EOTF_BT_2100_HLG,
0167 };
0168 
0169 struct hdmi_avi_infoframe {
0170     enum hdmi_infoframe_type type;
0171     unsigned char version;
0172     unsigned char length;
0173     enum hdmi_colorspace colorspace;
0174     enum hdmi_scan_mode scan_mode;
0175     enum hdmi_colorimetry colorimetry;
0176     enum hdmi_picture_aspect picture_aspect;
0177     enum hdmi_active_aspect active_aspect;
0178     bool itc;
0179     enum hdmi_extended_colorimetry extended_colorimetry;
0180     enum hdmi_quantization_range quantization_range;
0181     enum hdmi_nups nups;
0182     unsigned char video_code;
0183     enum hdmi_ycc_quantization_range ycc_quantization_range;
0184     enum hdmi_content_type content_type;
0185     unsigned char pixel_repeat;
0186     unsigned short top_bar;
0187     unsigned short bottom_bar;
0188     unsigned short left_bar;
0189     unsigned short right_bar;
0190 };
0191 
0192 /* DRM Infoframe as per CTA 861.G spec */
0193 struct hdmi_drm_infoframe {
0194     enum hdmi_infoframe_type type;
0195     unsigned char version;
0196     unsigned char length;
0197     enum hdmi_eotf eotf;
0198     enum hdmi_metadata_type metadata_type;
0199     struct {
0200         u16 x, y;
0201     } display_primaries[3];
0202     struct {
0203         u16 x, y;
0204     } white_point;
0205     u16 max_display_mastering_luminance;
0206     u16 min_display_mastering_luminance;
0207     u16 max_cll;
0208     u16 max_fall;
0209 };
0210 
0211 void hdmi_avi_infoframe_init(struct hdmi_avi_infoframe *frame);
0212 ssize_t hdmi_avi_infoframe_pack(struct hdmi_avi_infoframe *frame, void *buffer,
0213                 size_t size);
0214 ssize_t hdmi_avi_infoframe_pack_only(const struct hdmi_avi_infoframe *frame,
0215                      void *buffer, size_t size);
0216 int hdmi_avi_infoframe_check(struct hdmi_avi_infoframe *frame);
0217 int hdmi_drm_infoframe_init(struct hdmi_drm_infoframe *frame);
0218 ssize_t hdmi_drm_infoframe_pack(struct hdmi_drm_infoframe *frame, void *buffer,
0219                 size_t size);
0220 ssize_t hdmi_drm_infoframe_pack_only(const struct hdmi_drm_infoframe *frame,
0221                      void *buffer, size_t size);
0222 int hdmi_drm_infoframe_check(struct hdmi_drm_infoframe *frame);
0223 int hdmi_drm_infoframe_unpack_only(struct hdmi_drm_infoframe *frame,
0224                    const void *buffer, size_t size);
0225 
0226 enum hdmi_spd_sdi {
0227     HDMI_SPD_SDI_UNKNOWN,
0228     HDMI_SPD_SDI_DSTB,
0229     HDMI_SPD_SDI_DVDP,
0230     HDMI_SPD_SDI_DVHS,
0231     HDMI_SPD_SDI_HDDVR,
0232     HDMI_SPD_SDI_DVC,
0233     HDMI_SPD_SDI_DSC,
0234     HDMI_SPD_SDI_VCD,
0235     HDMI_SPD_SDI_GAME,
0236     HDMI_SPD_SDI_PC,
0237     HDMI_SPD_SDI_BD,
0238     HDMI_SPD_SDI_SACD,
0239     HDMI_SPD_SDI_HDDVD,
0240     HDMI_SPD_SDI_PMP,
0241 };
0242 
0243 struct hdmi_spd_infoframe {
0244     enum hdmi_infoframe_type type;
0245     unsigned char version;
0246     unsigned char length;
0247     char vendor[8];
0248     char product[16];
0249     enum hdmi_spd_sdi sdi;
0250 };
0251 
0252 int hdmi_spd_infoframe_init(struct hdmi_spd_infoframe *frame,
0253                 const char *vendor, const char *product);
0254 ssize_t hdmi_spd_infoframe_pack(struct hdmi_spd_infoframe *frame, void *buffer,
0255                 size_t size);
0256 ssize_t hdmi_spd_infoframe_pack_only(const struct hdmi_spd_infoframe *frame,
0257                      void *buffer, size_t size);
0258 int hdmi_spd_infoframe_check(struct hdmi_spd_infoframe *frame);
0259 
0260 enum hdmi_audio_coding_type {
0261     HDMI_AUDIO_CODING_TYPE_STREAM,
0262     HDMI_AUDIO_CODING_TYPE_PCM,
0263     HDMI_AUDIO_CODING_TYPE_AC3,
0264     HDMI_AUDIO_CODING_TYPE_MPEG1,
0265     HDMI_AUDIO_CODING_TYPE_MP3,
0266     HDMI_AUDIO_CODING_TYPE_MPEG2,
0267     HDMI_AUDIO_CODING_TYPE_AAC_LC,
0268     HDMI_AUDIO_CODING_TYPE_DTS,
0269     HDMI_AUDIO_CODING_TYPE_ATRAC,
0270     HDMI_AUDIO_CODING_TYPE_DSD,
0271     HDMI_AUDIO_CODING_TYPE_EAC3,
0272     HDMI_AUDIO_CODING_TYPE_DTS_HD,
0273     HDMI_AUDIO_CODING_TYPE_MLP,
0274     HDMI_AUDIO_CODING_TYPE_DST,
0275     HDMI_AUDIO_CODING_TYPE_WMA_PRO,
0276     HDMI_AUDIO_CODING_TYPE_CXT,
0277 };
0278 
0279 enum hdmi_audio_sample_size {
0280     HDMI_AUDIO_SAMPLE_SIZE_STREAM,
0281     HDMI_AUDIO_SAMPLE_SIZE_16,
0282     HDMI_AUDIO_SAMPLE_SIZE_20,
0283     HDMI_AUDIO_SAMPLE_SIZE_24,
0284 };
0285 
0286 enum hdmi_audio_sample_frequency {
0287     HDMI_AUDIO_SAMPLE_FREQUENCY_STREAM,
0288     HDMI_AUDIO_SAMPLE_FREQUENCY_32000,
0289     HDMI_AUDIO_SAMPLE_FREQUENCY_44100,
0290     HDMI_AUDIO_SAMPLE_FREQUENCY_48000,
0291     HDMI_AUDIO_SAMPLE_FREQUENCY_88200,
0292     HDMI_AUDIO_SAMPLE_FREQUENCY_96000,
0293     HDMI_AUDIO_SAMPLE_FREQUENCY_176400,
0294     HDMI_AUDIO_SAMPLE_FREQUENCY_192000,
0295 };
0296 
0297 enum hdmi_audio_coding_type_ext {
0298     /* Refer to Audio Coding Type (CT) field in Data Byte 1 */
0299     HDMI_AUDIO_CODING_TYPE_EXT_CT,
0300 
0301     /*
0302      * The next three CXT values are defined in CEA-861-E only.
0303      * They do not exist in older versions, and in CEA-861-F they are
0304      * defined as 'Not in use'.
0305      */
0306     HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC,
0307     HDMI_AUDIO_CODING_TYPE_EXT_HE_AAC_V2,
0308     HDMI_AUDIO_CODING_TYPE_EXT_MPEG_SURROUND,
0309 
0310     /* The following CXT values are only defined in CEA-861-F. */
0311     HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC,
0312     HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_V2,
0313     HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC,
0314     HDMI_AUDIO_CODING_TYPE_EXT_DRA,
0315     HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_HE_AAC_SURROUND,
0316     HDMI_AUDIO_CODING_TYPE_EXT_MPEG4_AAC_LC_SURROUND = 10,
0317 };
0318 
0319 struct hdmi_audio_infoframe {
0320     enum hdmi_infoframe_type type;
0321     unsigned char version;
0322     unsigned char length;
0323     unsigned char channels;
0324     enum hdmi_audio_coding_type coding_type;
0325     enum hdmi_audio_sample_size sample_size;
0326     enum hdmi_audio_sample_frequency sample_frequency;
0327     enum hdmi_audio_coding_type_ext coding_type_ext;
0328     unsigned char channel_allocation;
0329     unsigned char level_shift_value;
0330     bool downmix_inhibit;
0331 
0332 };
0333 
0334 int hdmi_audio_infoframe_init(struct hdmi_audio_infoframe *frame);
0335 ssize_t hdmi_audio_infoframe_pack(struct hdmi_audio_infoframe *frame,
0336                   void *buffer, size_t size);
0337 ssize_t hdmi_audio_infoframe_pack_only(const struct hdmi_audio_infoframe *frame,
0338                        void *buffer, size_t size);
0339 int hdmi_audio_infoframe_check(struct hdmi_audio_infoframe *frame);
0340 
0341 enum hdmi_3d_structure {
0342     HDMI_3D_STRUCTURE_INVALID = -1,
0343     HDMI_3D_STRUCTURE_FRAME_PACKING = 0,
0344     HDMI_3D_STRUCTURE_FIELD_ALTERNATIVE,
0345     HDMI_3D_STRUCTURE_LINE_ALTERNATIVE,
0346     HDMI_3D_STRUCTURE_SIDE_BY_SIDE_FULL,
0347     HDMI_3D_STRUCTURE_L_DEPTH,
0348     HDMI_3D_STRUCTURE_L_DEPTH_GFX_GFX_DEPTH,
0349     HDMI_3D_STRUCTURE_TOP_AND_BOTTOM,
0350     HDMI_3D_STRUCTURE_SIDE_BY_SIDE_HALF = 8,
0351 };
0352 
0353 
0354 struct hdmi_vendor_infoframe {
0355     enum hdmi_infoframe_type type;
0356     unsigned char version;
0357     unsigned char length;
0358     unsigned int oui;
0359     u8 vic;
0360     enum hdmi_3d_structure s3d_struct;
0361     unsigned int s3d_ext_data;
0362 };
0363 
0364 /* HDR Metadata as per 861.G spec */
0365 struct hdr_static_metadata {
0366     __u8 eotf;
0367     __u8 metadata_type;
0368     __u16 max_cll;
0369     __u16 max_fall;
0370     __u16 min_cll;
0371 };
0372 
0373 /**
0374  * struct hdr_sink_metadata - HDR sink metadata
0375  *
0376  * Metadata Information read from Sink's EDID
0377  */
0378 struct hdr_sink_metadata {
0379     /**
0380      * @metadata_type: Static_Metadata_Descriptor_ID.
0381      */
0382     __u32 metadata_type;
0383     /**
0384      * @hdmi_type1: HDR Metadata Infoframe.
0385      */
0386     union {
0387         struct hdr_static_metadata hdmi_type1;
0388     };
0389 };
0390 
0391 int hdmi_vendor_infoframe_init(struct hdmi_vendor_infoframe *frame);
0392 ssize_t hdmi_vendor_infoframe_pack(struct hdmi_vendor_infoframe *frame,
0393                    void *buffer, size_t size);
0394 ssize_t hdmi_vendor_infoframe_pack_only(const struct hdmi_vendor_infoframe *frame,
0395                     void *buffer, size_t size);
0396 int hdmi_vendor_infoframe_check(struct hdmi_vendor_infoframe *frame);
0397 
0398 union hdmi_vendor_any_infoframe {
0399     struct {
0400         enum hdmi_infoframe_type type;
0401         unsigned char version;
0402         unsigned char length;
0403         unsigned int oui;
0404     } any;
0405     struct hdmi_vendor_infoframe hdmi;
0406 };
0407 
0408 /**
0409  * union hdmi_infoframe - overall union of all abstract infoframe representations
0410  * @any: generic infoframe
0411  * @avi: avi infoframe
0412  * @spd: spd infoframe
0413  * @vendor: union of all vendor infoframes
0414  * @audio: audio infoframe
0415  * @drm: Dynamic Range and Mastering infoframe
0416  *
0417  * This is used by the generic pack function. This works since all infoframes
0418  * have the same header which also indicates which type of infoframe should be
0419  * packed.
0420  */
0421 union hdmi_infoframe {
0422     struct hdmi_any_infoframe any;
0423     struct hdmi_avi_infoframe avi;
0424     struct hdmi_spd_infoframe spd;
0425     union hdmi_vendor_any_infoframe vendor;
0426     struct hdmi_audio_infoframe audio;
0427     struct hdmi_drm_infoframe drm;
0428 };
0429 
0430 ssize_t hdmi_infoframe_pack(union hdmi_infoframe *frame, void *buffer,
0431                 size_t size);
0432 ssize_t hdmi_infoframe_pack_only(const union hdmi_infoframe *frame,
0433                  void *buffer, size_t size);
0434 int hdmi_infoframe_check(union hdmi_infoframe *frame);
0435 int hdmi_infoframe_unpack(union hdmi_infoframe *frame,
0436               const void *buffer, size_t size);
0437 void hdmi_infoframe_log(const char *level, struct device *dev,
0438             const union hdmi_infoframe *frame);
0439 
0440 #endif /* _DRM_HDMI_H */