1*4882a593Smuzhiyun /* 2*4882a593Smuzhiyun * Copyright (c) 2012 The Chromium OS Authors. 3*4882a593Smuzhiyun * 4*4882a593Smuzhiyun * (C) Copyright 2010 5*4882a593Smuzhiyun * Petr Stetiar <ynezz@true.cz> 6*4882a593Smuzhiyun * 7*4882a593Smuzhiyun * SPDX-License-Identifier: GPL-2.0+ 8*4882a593Smuzhiyun * 9*4882a593Smuzhiyun * Contains stolen code from ddcprobe project which is: 10*4882a593Smuzhiyun * Copyright (C) Nalin Dahyabhai <bigfun@pobox.com> 11*4882a593Smuzhiyun * (C) Copyright 2008-2017 Fuzhou Rockchip Electronics Co., Ltd 12*4882a593Smuzhiyun */ 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun #ifndef __EDID_H_ 15*4882a593Smuzhiyun #define __EDID_H_ 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun #include <div64.h> 18*4882a593Smuzhiyun #include <linux/types.h> 19*4882a593Smuzhiyun #include <drm_modes.h> 20*4882a593Smuzhiyun #include <i2c.h> 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Size of the EDID data */ 23*4882a593Smuzhiyun #define EDID_SIZE 128 24*4882a593Smuzhiyun #define EDID_EXT_SIZE 256 25*4882a593Smuzhiyun #define MODE_LEN 240 26*4882a593Smuzhiyun 27*4882a593Smuzhiyun #define CEA_EXT 0x02 28*4882a593Smuzhiyun #define VTB_EXT 0x10 29*4882a593Smuzhiyun #define DI_EXT 0x40 30*4882a593Smuzhiyun #define LS_EXT 0x50 31*4882a593Smuzhiyun #define MI_EXT 0x60 32*4882a593Smuzhiyun #define DISPLAYID_EXT 0x70 33*4882a593Smuzhiyun 34*4882a593Smuzhiyun #define EDID_TIMING_ASPECT_SHIFT 6 35*4882a593Smuzhiyun #define EDID_TIMING_ASPECT_MASK (0x3 << EDID_TIMING_ASPECT_SHIFT) 36*4882a593Smuzhiyun 37*4882a593Smuzhiyun /* need to add 60 */ 38*4882a593Smuzhiyun #define EDID_TIMING_VFREQ_SHIFT 0 39*4882a593Smuzhiyun #define EDID_TIMING_VFREQ_MASK (0x3f << EDID_TIMING_VFREQ_SHIFT) 40*4882a593Smuzhiyun 41*4882a593Smuzhiyun /* OUI of HDMI vendor specific data block */ 42*4882a593Smuzhiyun #define HDMI_IEEE_OUI 0x000c03 43*4882a593Smuzhiyun 44*4882a593Smuzhiyun /* drm mode 4k and 3d */ 45*4882a593Smuzhiyun #define DRM_MODE_FLAG_420_MASK (0x03 << 23) 46*4882a593Smuzhiyun #define DRM_MODE_FLAG_420 BIT(23) 47*4882a593Smuzhiyun #define DRM_MODE_FLAG_420_ONLY BIT(24) 48*4882a593Smuzhiyun 49*4882a593Smuzhiyun #define BITS_PER_BYTE 8 50*4882a593Smuzhiyun #define BITS_TO_LONGS(nr) DIV_ROUND_UP(nr, BITS_PER_BYTE * sizeof(long)) 51*4882a593Smuzhiyun #define GET_BIT(_x, _pos) \ 52*4882a593Smuzhiyun (((_x) >> (_pos)) & 1) 53*4882a593Smuzhiyun #define GET_BITS(_x, _pos_msb, _pos_lsb) \ 54*4882a593Smuzhiyun (((_x) >> (_pos_lsb)) & ((1 << ((_pos_msb) - (_pos_lsb) + 1)) - 1)) 55*4882a593Smuzhiyun #define DRM_MODE(t, c, hd, hss, hse, ht, vd, vss, vse, vt, vs, f) \ 56*4882a593Smuzhiyun .clock = (c), .type = (t),\ 57*4882a593Smuzhiyun .hdisplay = (hd), .hsync_start = (hss), .hsync_end = (hse), \ 58*4882a593Smuzhiyun .htotal = (ht), .vdisplay = (vd), \ 59*4882a593Smuzhiyun .vsync_start = (vss), .vsync_end = (vse), .vtotal = (vt), \ 60*4882a593Smuzhiyun .vscan = (vs), .flags = (f) 61*4882a593Smuzhiyun 62*4882a593Smuzhiyun #define DDC_SEGMENT_ADDR 0x30 63*4882a593Smuzhiyun #define DDC_ADDR 0x50 64*4882a593Smuzhiyun #define HDMI_EDID_BLOCK_SIZE 128 65*4882a593Smuzhiyun #define SCDC_I2C_SLAVE_ADDRESS 0x54 66*4882a593Smuzhiyun 67*4882a593Smuzhiyun /* Aspect ratios used in EDID info. */ 68*4882a593Smuzhiyun enum edid_aspect { 69*4882a593Smuzhiyun ASPECT_625 = 0, 70*4882a593Smuzhiyun ASPECT_75, 71*4882a593Smuzhiyun ASPECT_8, 72*4882a593Smuzhiyun ASPECT_5625, 73*4882a593Smuzhiyun }; 74*4882a593Smuzhiyun 75*4882a593Smuzhiyun struct est_timings { 76*4882a593Smuzhiyun u8 t1; 77*4882a593Smuzhiyun u8 t2; 78*4882a593Smuzhiyun u8 mfg_rsvd; 79*4882a593Smuzhiyun } __packed; 80*4882a593Smuzhiyun 81*4882a593Smuzhiyun /* 00=16:10, 01=4:3, 10=5:4, 11=16:9 */ 82*4882a593Smuzhiyun #define EDID_TIMING_ASPECT_SHIFT 6 83*4882a593Smuzhiyun #define EDID_TIMING_ASPECT_MASK (0x3 << EDID_TIMING_ASPECT_SHIFT) 84*4882a593Smuzhiyun 85*4882a593Smuzhiyun /* need to add 60 */ 86*4882a593Smuzhiyun #define EDID_TIMING_VFREQ_SHIFT 0 87*4882a593Smuzhiyun #define EDID_TIMING_VFREQ_MASK (0x3f << EDID_TIMING_VFREQ_SHIFT) 88*4882a593Smuzhiyun 89*4882a593Smuzhiyun struct std_timing { 90*4882a593Smuzhiyun u8 hsize; /* need to multiply by 8 then add 248 */ 91*4882a593Smuzhiyun u8 vfreq_aspect; 92*4882a593Smuzhiyun } __packed; 93*4882a593Smuzhiyun 94*4882a593Smuzhiyun struct detailed_pixel_timing { 95*4882a593Smuzhiyun u8 hactive_lo; 96*4882a593Smuzhiyun u8 hblank_lo; 97*4882a593Smuzhiyun u8 hactive_hblank_hi; 98*4882a593Smuzhiyun u8 vactive_lo; 99*4882a593Smuzhiyun u8 vblank_lo; 100*4882a593Smuzhiyun u8 vactive_vblank_hi; 101*4882a593Smuzhiyun u8 hsync_offset_lo; 102*4882a593Smuzhiyun u8 hsync_pulse_width_lo; 103*4882a593Smuzhiyun u8 vsync_offset_pulse_width_lo; 104*4882a593Smuzhiyun u8 hsync_vsync_offset_pulse_width_hi; 105*4882a593Smuzhiyun u8 width_mm_lo; 106*4882a593Smuzhiyun u8 height_mm_lo; 107*4882a593Smuzhiyun u8 width_height_mm_hi; 108*4882a593Smuzhiyun u8 hborder; 109*4882a593Smuzhiyun u8 vborder; 110*4882a593Smuzhiyun u8 misc; 111*4882a593Smuzhiyun } __packed; 112*4882a593Smuzhiyun 113*4882a593Smuzhiyun /* If it's not pixel timing, it'll be one of the below */ 114*4882a593Smuzhiyun struct detailed_data_string { 115*4882a593Smuzhiyun u8 str[13]; 116*4882a593Smuzhiyun } __packed; 117*4882a593Smuzhiyun 118*4882a593Smuzhiyun struct detailed_data_monitor_range { 119*4882a593Smuzhiyun u8 min_vfreq; 120*4882a593Smuzhiyun u8 max_vfreq; 121*4882a593Smuzhiyun u8 min_hfreq_khz; 122*4882a593Smuzhiyun u8 max_hfreq_khz; 123*4882a593Smuzhiyun u8 pixel_clock_mhz; /* need to multiply by 10 */ 124*4882a593Smuzhiyun u8 flags; 125*4882a593Smuzhiyun union { 126*4882a593Smuzhiyun struct { 127*4882a593Smuzhiyun u8 reserved; 128*4882a593Smuzhiyun u8 hfreq_start_khz; /* need to multiply by 2 */ 129*4882a593Smuzhiyun u8 c; /* need to divide by 2 */ 130*4882a593Smuzhiyun __le16 m; 131*4882a593Smuzhiyun u8 k; 132*4882a593Smuzhiyun u8 j; /* need to divide by 2 */ 133*4882a593Smuzhiyun } __packed gtf2; 134*4882a593Smuzhiyun struct { 135*4882a593Smuzhiyun u8 version; 136*4882a593Smuzhiyun u8 data1; /* high 6 bits: extra clock resolution */ 137*4882a593Smuzhiyun u8 data2; /* plus low 2 of above: max hactive */ 138*4882a593Smuzhiyun u8 supported_aspects; 139*4882a593Smuzhiyun u8 flags; /* preferred aspect and blanking support */ 140*4882a593Smuzhiyun u8 supported_scalings; 141*4882a593Smuzhiyun u8 preferred_refresh; 142*4882a593Smuzhiyun } __packed cvt; 143*4882a593Smuzhiyun } formula; 144*4882a593Smuzhiyun } __packed; 145*4882a593Smuzhiyun 146*4882a593Smuzhiyun struct detailed_data_wpindex { 147*4882a593Smuzhiyun u8 white_yx_lo; /* Lower 2 bits each */ 148*4882a593Smuzhiyun u8 white_x_hi; 149*4882a593Smuzhiyun u8 white_y_hi; 150*4882a593Smuzhiyun u8 gamma; /* need to divide by 100 then add 1 */ 151*4882a593Smuzhiyun } __packed; 152*4882a593Smuzhiyun 153*4882a593Smuzhiyun struct detailed_data_color_point { 154*4882a593Smuzhiyun u8 windex1; 155*4882a593Smuzhiyun u8 wpindex1[3]; 156*4882a593Smuzhiyun u8 windex2; 157*4882a593Smuzhiyun u8 wpindex2[3]; 158*4882a593Smuzhiyun } __packed; 159*4882a593Smuzhiyun 160*4882a593Smuzhiyun struct cvt_timing { 161*4882a593Smuzhiyun u8 code[3]; 162*4882a593Smuzhiyun } __packed; 163*4882a593Smuzhiyun 164*4882a593Smuzhiyun struct detailed_non_pixel { 165*4882a593Smuzhiyun u8 pad1; 166*4882a593Smuzhiyun u8 type; /* ff=serial, fe=string, fd=monitor range, fc=monitor name 167*4882a593Smuzhiyun * fb=color point data, fa=standard timing data, 168*4882a593Smuzhiyun * f9=undefined, f8=mfg. reserved 169*4882a593Smuzhiyun */ 170*4882a593Smuzhiyun u8 pad2; 171*4882a593Smuzhiyun union { 172*4882a593Smuzhiyun struct detailed_data_string str; 173*4882a593Smuzhiyun struct detailed_data_monitor_range range; 174*4882a593Smuzhiyun struct detailed_data_wpindex color; 175*4882a593Smuzhiyun struct std_timing timings[6]; 176*4882a593Smuzhiyun struct cvt_timing cvt[4]; 177*4882a593Smuzhiyun } data; 178*4882a593Smuzhiyun } __packed; 179*4882a593Smuzhiyun 180*4882a593Smuzhiyun #define EDID_DETAIL_EST_TIMINGS 0xf7 181*4882a593Smuzhiyun #define EDID_DETAIL_CVT_3BYTE 0xf8 182*4882a593Smuzhiyun #define EDID_DETAIL_COLOR_MGMT_DATA 0xf9 183*4882a593Smuzhiyun #define EDID_DETAIL_STD_MODES 0xfa 184*4882a593Smuzhiyun #define EDID_DETAIL_MONITOR_CPDATA 0xfb 185*4882a593Smuzhiyun #define EDID_DETAIL_MONITOR_NAME 0xfc 186*4882a593Smuzhiyun #define EDID_DETAIL_MONITOR_RANGE 0xfd 187*4882a593Smuzhiyun #define EDID_DETAIL_MONITOR_STRING 0xfe 188*4882a593Smuzhiyun #define EDID_DETAIL_MONITOR_SERIAL 0xff 189*4882a593Smuzhiyun 190*4882a593Smuzhiyun struct detailed_timing { 191*4882a593Smuzhiyun __le16 pixel_clock; /* need to multiply by 10 KHz */ 192*4882a593Smuzhiyun union { 193*4882a593Smuzhiyun struct detailed_pixel_timing pixel_data; 194*4882a593Smuzhiyun struct detailed_non_pixel other_data; 195*4882a593Smuzhiyun } data; 196*4882a593Smuzhiyun } __packed; 197*4882a593Smuzhiyun 198*4882a593Smuzhiyun /* Detailed timing information used in EDID v1.x */ 199*4882a593Smuzhiyun struct edid_detailed_timing { 200*4882a593Smuzhiyun unsigned char pixel_clock[2]; 201*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_PIXEL_CLOCK(_x) \ 202*4882a593Smuzhiyun (((((uint32_t)(_x).pixel_clock[1]) << 8) + \ 203*4882a593Smuzhiyun (_x).pixel_clock[0]) * 10000) 204*4882a593Smuzhiyun unsigned char horizontal_active; 205*4882a593Smuzhiyun unsigned char horizontal_blanking; 206*4882a593Smuzhiyun unsigned char horizontal_active_blanking_hi; 207*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_HORIZONTAL_ACTIVE(_x) \ 208*4882a593Smuzhiyun ((GET_BITS((_x).horizontal_active_blanking_hi, 7, 4) << 8) + \ 209*4882a593Smuzhiyun (_x).horizontal_active) 210*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_HORIZONTAL_BLANKING(_x) \ 211*4882a593Smuzhiyun ((GET_BITS((_x).horizontal_active_blanking_hi, 3, 0) << 8) + \ 212*4882a593Smuzhiyun (_x).horizontal_blanking) 213*4882a593Smuzhiyun unsigned char vertical_active; 214*4882a593Smuzhiyun unsigned char vertical_blanking; 215*4882a593Smuzhiyun unsigned char vertical_active_blanking_hi; 216*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_VERTICAL_ACTIVE(_x) \ 217*4882a593Smuzhiyun ((GET_BITS((_x).vertical_active_blanking_hi, 7, 4) << 8) + \ 218*4882a593Smuzhiyun (_x).vertical_active) 219*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_VERTICAL_BLANKING(_x) \ 220*4882a593Smuzhiyun ((GET_BITS((_x).vertical_active_blanking_hi, 3, 0) << 8) + \ 221*4882a593Smuzhiyun (_x).vertical_blanking) 222*4882a593Smuzhiyun unsigned char hsync_offset; 223*4882a593Smuzhiyun unsigned char hsync_pulse_width; 224*4882a593Smuzhiyun unsigned char vsync_offset_pulse_width; 225*4882a593Smuzhiyun unsigned char hsync_vsync_offset_pulse_width_hi; 226*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_HSYNC_OFFSET(_x) \ 227*4882a593Smuzhiyun ((GET_BITS((_x).hsync_vsync_offset_pulse_width_hi, 7, 6) << 8) + \ 228*4882a593Smuzhiyun (_x).hsync_offset) 229*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_HSYNC_PULSE_WIDTH(_x) \ 230*4882a593Smuzhiyun ((GET_BITS((_x).hsync_vsync_offset_pulse_width_hi, 5, 4) << 8) + \ 231*4882a593Smuzhiyun (_x).hsync_pulse_width) 232*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_VSYNC_OFFSET(_x) \ 233*4882a593Smuzhiyun ((GET_BITS((_x).hsync_vsync_offset_pulse_width_hi, 3, 2) << 4) + \ 234*4882a593Smuzhiyun GET_BITS((_x).vsync_offset_pulse_width, 7, 4)) 235*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_VSYNC_PULSE_WIDTH(_x) \ 236*4882a593Smuzhiyun ((GET_BITS((_x).hsync_vsync_offset_pulse_width_hi, 1, 0) << 4) + \ 237*4882a593Smuzhiyun GET_BITS((_x).vsync_offset_pulse_width, 3, 0)) 238*4882a593Smuzhiyun unsigned char himage_size; 239*4882a593Smuzhiyun unsigned char vimage_size; 240*4882a593Smuzhiyun unsigned char himage_vimage_size_hi; 241*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_HIMAGE_SIZE(_x) \ 242*4882a593Smuzhiyun ((GET_BITS((_x).himage_vimage_size_hi, 7, 4) << 8) + (_x).himage_size) 243*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_VIMAGE_SIZE(_x) \ 244*4882a593Smuzhiyun ((GET_BITS((_x).himage_vimage_size_hi, 3, 0) << 8) + (_x).vimage_size) 245*4882a593Smuzhiyun unsigned char hborder; 246*4882a593Smuzhiyun unsigned char vborder; 247*4882a593Smuzhiyun unsigned char flags; 248*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_INTERLACED(_x) \ 249*4882a593Smuzhiyun GET_BIT((_x).flags, 7) 250*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_STEREO(_x) \ 251*4882a593Smuzhiyun GET_BITS((_x).flags, 6, 5) 252*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_DIGITAL_COMPOSITE(_x) \ 253*4882a593Smuzhiyun GET_BITS((_x).flags, 4, 3) 254*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_POLARITY(_x) \ 255*4882a593Smuzhiyun GET_BITS((_x).flags, 2, 1) 256*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_VSYNC_POLARITY(_x) \ 257*4882a593Smuzhiyun GET_BIT((_x).flags, 2) 258*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_HSYNC_POLARITY(_x) \ 259*4882a593Smuzhiyun GET_BIT((_x).flags, 1) 260*4882a593Smuzhiyun #define EDID_DETAILED_TIMING_FLAG_INTERLEAVED(_x) \ 261*4882a593Smuzhiyun GET_BIT((_x).flags, 0) 262*4882a593Smuzhiyun } __attribute__ ((__packed__)); 263*4882a593Smuzhiyun 264*4882a593Smuzhiyun enum edid_monitor_descriptor_types { 265*4882a593Smuzhiyun EDID_MONITOR_DESCRIPTOR_SERIAL = 0xff, 266*4882a593Smuzhiyun EDID_MONITOR_DESCRIPTOR_ASCII = 0xfe, 267*4882a593Smuzhiyun EDID_MONITOR_DESCRIPTOR_RANGE = 0xfd, 268*4882a593Smuzhiyun EDID_MONITOR_DESCRIPTOR_NAME = 0xfc, 269*4882a593Smuzhiyun }; 270*4882a593Smuzhiyun 271*4882a593Smuzhiyun struct edid_monitor_descriptor { 272*4882a593Smuzhiyun uint16_t zero_flag_1; 273*4882a593Smuzhiyun unsigned char zero_flag_2; 274*4882a593Smuzhiyun unsigned char type; 275*4882a593Smuzhiyun unsigned char zero_flag_3; 276*4882a593Smuzhiyun union { 277*4882a593Smuzhiyun char string[13]; 278*4882a593Smuzhiyun struct { 279*4882a593Smuzhiyun unsigned char vertical_min; 280*4882a593Smuzhiyun unsigned char vertical_max; 281*4882a593Smuzhiyun unsigned char horizontal_min; 282*4882a593Smuzhiyun unsigned char horizontal_max; 283*4882a593Smuzhiyun unsigned char pixel_clock_max; 284*4882a593Smuzhiyun unsigned char gtf_data[8]; 285*4882a593Smuzhiyun } range_data; 286*4882a593Smuzhiyun } data; 287*4882a593Smuzhiyun } __attribute__ ((__packed__)); 288*4882a593Smuzhiyun 289*4882a593Smuzhiyun #define DRM_EDID_INPUT_SERRATION_VSYNC (1 << 0) 290*4882a593Smuzhiyun #define DRM_EDID_INPUT_SYNC_ON_GREEN (1 << 1) 291*4882a593Smuzhiyun #define DRM_EDID_INPUT_COMPOSITE_SYNC (1 << 2) 292*4882a593Smuzhiyun #define DRM_EDID_INPUT_SEPARATE_SYNCS (1 << 3) 293*4882a593Smuzhiyun #define DRM_EDID_INPUT_BLANK_TO_BLACK (1 << 4) 294*4882a593Smuzhiyun #define DRM_EDID_INPUT_VIDEO_LEVEL (3 << 5) 295*4882a593Smuzhiyun #define DRM_EDID_INPUT_DIGITAL (1 << 7) 296*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_MASK (7 << 4) 297*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_UNDEF (0 << 4) 298*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_6 (1 << 4) 299*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_8 (2 << 4) 300*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_10 (3 << 4) 301*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_12 (4 << 4) 302*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_14 (5 << 4) 303*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_16 (6 << 4) 304*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_DEPTH_RSVD (7 << 4) 305*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_TYPE_UNDEF (0) 306*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_TYPE_DVI (1) 307*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_TYPE_HDMI_A (2) 308*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_TYPE_HDMI_B (3) 309*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_TYPE_MDDI (4) 310*4882a593Smuzhiyun #define DRM_EDID_DIGITAL_TYPE_DP (5) 311*4882a593Smuzhiyun 312*4882a593Smuzhiyun #define DRM_EDID_FEATURE_DEFAULT_GTF (1 << 0) 313*4882a593Smuzhiyun #define DRM_EDID_FEATURE_PREFERRED_TIMING (1 << 1) 314*4882a593Smuzhiyun #define DRM_EDID_FEATURE_STANDARD_COLOR (1 << 2) 315*4882a593Smuzhiyun /* If analog */ 316*4882a593Smuzhiyun /* 00=mono, 01=rgb, 10=non-rgb, 11=unknown */ 317*4882a593Smuzhiyun #define DRM_EDID_FEATURE_DISPLAY_TYPE (3 << 3) 318*4882a593Smuzhiyun /* If digital */ 319*4882a593Smuzhiyun #define DRM_EDID_FEATURE_COLOR_MASK (3 << 3) 320*4882a593Smuzhiyun #define DRM_EDID_FEATURE_RGB (0 << 3) 321*4882a593Smuzhiyun #define DRM_EDID_FEATURE_RGB_YCRCB444 (1 << 3) 322*4882a593Smuzhiyun #define DRM_EDID_FEATURE_RGB_YCRCB422 (2 << 3) 323*4882a593Smuzhiyun /* both 4:4:4 and 4:2:2 */ 324*4882a593Smuzhiyun #define DRM_EDID_FEATURE_RGB_YCRCB (3 << 3) 325*4882a593Smuzhiyun 326*4882a593Smuzhiyun #define DRM_EDID_FEATURE_PM_ACTIVE_OFF (1 << 5) 327*4882a593Smuzhiyun #define DRM_EDID_FEATURE_PM_SUSPEND (1 << 6) 328*4882a593Smuzhiyun #define DRM_EDID_FEATURE_PM_STANDBY (1 << 7) 329*4882a593Smuzhiyun 330*4882a593Smuzhiyun #define DRM_EDID_HDMI_DC_48 (1 << 6) 331*4882a593Smuzhiyun #define DRM_EDID_HDMI_DC_36 (1 << 5) 332*4882a593Smuzhiyun #define DRM_EDID_HDMI_DC_30 (1 << 4) 333*4882a593Smuzhiyun #define DRM_EDID_HDMI_DC_Y444 (1 << 3) 334*4882a593Smuzhiyun 335*4882a593Smuzhiyun /* YCBCR 420 deep color modes */ 336*4882a593Smuzhiyun #define DRM_EDID_YCBCR420_DC_48 (1 << 2) 337*4882a593Smuzhiyun #define DRM_EDID_YCBCR420_DC_36 (1 << 1) 338*4882a593Smuzhiyun #define DRM_EDID_YCBCR420_DC_30 (1 << 0) 339*4882a593Smuzhiyun #define DRM_EDID_YCBCR420_DC_MASK (DRM_EDID_YCBCR420_DC_48 | \ 340*4882a593Smuzhiyun DRM_EDID_YCBCR420_DC_36 | \ 341*4882a593Smuzhiyun DRM_EDID_YCBCR420_DC_30) 342*4882a593Smuzhiyun 343*4882a593Smuzhiyun /* HDMI 2.1 additional fields */ 344*4882a593Smuzhiyun #define DRM_EDID_MAX_FRL_RATE_MASK 0xf0 345*4882a593Smuzhiyun #define DRM_EDID_FAPA_START_LOCATION BIT(0) 346*4882a593Smuzhiyun #define DRM_EDID_ALLM BIT(1) 347*4882a593Smuzhiyun #define DRM_EDID_FVA BIT(2) 348*4882a593Smuzhiyun 349*4882a593Smuzhiyun /* Deep Color specific */ 350*4882a593Smuzhiyun #define DRM_EDID_DC_30BIT_420 BIT(0) 351*4882a593Smuzhiyun #define DRM_EDID_DC_36BIT_420 BIT(1) 352*4882a593Smuzhiyun #define DRM_EDID_DC_48BIT_420 BIT(2) 353*4882a593Smuzhiyun 354*4882a593Smuzhiyun /* VRR specific */ 355*4882a593Smuzhiyun #define DRM_EDID_CNMVRR BIT(3) 356*4882a593Smuzhiyun #define DRM_EDID_CINEMA_VRR BIT(4) 357*4882a593Smuzhiyun #define DRM_EDID_MDELTA BIT(5) 358*4882a593Smuzhiyun #define DRM_EDID_VRR_MAX_UPPER_MASK 0xc0 359*4882a593Smuzhiyun #define DRM_EDID_VRR_MAX_LOWER_MASK 0xff 360*4882a593Smuzhiyun #define DRM_EDID_VRR_MIN_MASK 0x3f 361*4882a593Smuzhiyun 362*4882a593Smuzhiyun /* DSC specific */ 363*4882a593Smuzhiyun #define DRM_EDID_DSC_10BPC BIT(0) 364*4882a593Smuzhiyun #define DRM_EDID_DSC_12BPC BIT(1) 365*4882a593Smuzhiyun #define DRM_EDID_DSC_16BPC BIT(2) 366*4882a593Smuzhiyun #define DRM_EDID_DSC_ALL_BPP BIT(3) 367*4882a593Smuzhiyun #define DRM_EDID_DSC_NATIVE_420 BIT(6) 368*4882a593Smuzhiyun #define DRM_EDID_DSC_1P2 BIT(7) 369*4882a593Smuzhiyun #define DRM_EDID_DSC_MAX_FRL_RATE_MASK 0xf0 370*4882a593Smuzhiyun #define DRM_EDID_DSC_MAX_SLICES 0xf 371*4882a593Smuzhiyun #define DRM_EDID_DSC_TOTAL_CHUNK_KBYTES 0x3f 372*4882a593Smuzhiyun 373*4882a593Smuzhiyun struct edid1_info { 374*4882a593Smuzhiyun unsigned char header[8]; 375*4882a593Smuzhiyun unsigned char manufacturer_name[2]; 376*4882a593Smuzhiyun #define EDID1_INFO_MANUFACTURER_NAME_ZERO(_x) \ 377*4882a593Smuzhiyun GET_BIT(((_x).manufacturer_name[0]), 7) 378*4882a593Smuzhiyun #define EDID1_INFO_MANUFACTURER_NAME_CHAR1(_x) \ 379*4882a593Smuzhiyun GET_BITS(((_x).manufacturer_name[0]), 6, 2) 380*4882a593Smuzhiyun #define EDID1_INFO_MANUFACTURER_NAME_CHAR2(_x) \ 381*4882a593Smuzhiyun ((GET_BITS(((_x).manufacturer_name[0]), 1, 0) << 3) + \ 382*4882a593Smuzhiyun GET_BITS(((_x).manufacturer_name[1]), 7, 5)) 383*4882a593Smuzhiyun #define EDID1_INFO_MANUFACTURER_NAME_CHAR3(_x) \ 384*4882a593Smuzhiyun GET_BITS(((_x).manufacturer_name[1]), 4, 0) 385*4882a593Smuzhiyun unsigned char product_code[2]; 386*4882a593Smuzhiyun #define EDID1_INFO_PRODUCT_CODE(_x) \ 387*4882a593Smuzhiyun (((uint16_t)(_x).product_code[1] << 8) + (_x).product_code[0]) 388*4882a593Smuzhiyun unsigned char serial_number[4]; 389*4882a593Smuzhiyun #define EDID1_INFO_SERIAL_NUMBER(_x) \ 390*4882a593Smuzhiyun (((uint32_t)(_x).serial_number[3] << 24) + \ 391*4882a593Smuzhiyun ((_x).serial_number[2] << 16) + ((_x).serial_number[1] << 8) + \ 392*4882a593Smuzhiyun (_x).serial_number[0]) 393*4882a593Smuzhiyun unsigned char week; 394*4882a593Smuzhiyun unsigned char year; 395*4882a593Smuzhiyun unsigned char version; 396*4882a593Smuzhiyun unsigned char revision; 397*4882a593Smuzhiyun unsigned char video_input_definition; 398*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_DIGITAL(_x) \ 399*4882a593Smuzhiyun GET_BIT(((_x).video_input_definition), 7) 400*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_VOLTAGE_LEVEL(_x) \ 401*4882a593Smuzhiyun GET_BITS(((_x).video_input_definition), 6, 5) 402*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_BLANK_TO_BLACK(_x) \ 403*4882a593Smuzhiyun GET_BIT(((_x).video_input_definition), 4) 404*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_SEPARATE_SYNC(_x) \ 405*4882a593Smuzhiyun GET_BIT(((_x).video_input_definition), 3) 406*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_COMPOSITE_SYNC(_x) \ 407*4882a593Smuzhiyun GET_BIT(((_x).video_input_definition), 2) 408*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_SYNC_ON_GREEN(_x) \ 409*4882a593Smuzhiyun GET_BIT(((_x).video_input_definition), 1) 410*4882a593Smuzhiyun #define EDID1_INFO_VIDEO_INPUT_SERRATION_V(_x) \ 411*4882a593Smuzhiyun GET_BIT(((_x).video_input_definition), 0) 412*4882a593Smuzhiyun unsigned char max_size_horizontal; 413*4882a593Smuzhiyun unsigned char max_size_vertical; 414*4882a593Smuzhiyun unsigned char gamma; 415*4882a593Smuzhiyun unsigned char feature_support; 416*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_STANDBY(_x) \ 417*4882a593Smuzhiyun GET_BIT(((_x).feature_support), 7) 418*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_SUSPEND(_x) \ 419*4882a593Smuzhiyun GET_BIT(((_x).feature_support), 6) 420*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_ACTIVE_OFF(_x) \ 421*4882a593Smuzhiyun GET_BIT(((_x).feature_support), 5) 422*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_DISPLAY_TYPE(_x) \ 423*4882a593Smuzhiyun GET_BITS(((_x).feature_support), 4, 3) 424*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_RGB(_x) \ 425*4882a593Smuzhiyun GET_BIT(((_x).feature_support), 2) 426*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_PREFERRED_TIMING_MODE(_x) \ 427*4882a593Smuzhiyun GET_BIT(((_x).feature_support), 1) 428*4882a593Smuzhiyun #define EDID1_INFO_FEATURE_DEFAULT_GTF_SUPPORT(_x) \ 429*4882a593Smuzhiyun GET_BIT(((_x).feature_support), 0) 430*4882a593Smuzhiyun unsigned char color_characteristics[10]; 431*4882a593Smuzhiyun unsigned char established_timings[3]; 432*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_720X400_70(_x) \ 433*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 7) 434*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_720X400_88(_x) \ 435*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 6) 436*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_640X480_60(_x) \ 437*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 5) 438*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_640X480_67(_x) \ 439*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 4) 440*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_640X480_72(_x) \ 441*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 3) 442*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_640X480_75(_x) \ 443*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 2) 444*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_800X600_56(_x) \ 445*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 1) 446*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_800X600_60(_x) \ 447*4882a593Smuzhiyun GET_BIT(((_x).established_timings[0]), 0) 448*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_800X600_72(_x) \ 449*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 7) 450*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_800X600_75(_x) \ 451*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 6) 452*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_832X624_75(_x) \ 453*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 5) 454*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_1024X768_87I(_x) \ 455*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 4) 456*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_1024X768_60(_x) \ 457*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 3) 458*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_1024X768_70(_x) \ 459*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 2) 460*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_1024X768_75(_x) \ 461*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 1) 462*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_1280X1024_75(_x) \ 463*4882a593Smuzhiyun GET_BIT(((_x).established_timings[1]), 0) 464*4882a593Smuzhiyun #define EDID1_INFO_ESTABLISHED_TIMING_1152X870_75(_x) \ 465*4882a593Smuzhiyun GET_BIT(((_x).established_timings[2]), 7) 466*4882a593Smuzhiyun struct { 467*4882a593Smuzhiyun unsigned char xresolution; 468*4882a593Smuzhiyun unsigned char aspect_vfreq; 469*4882a593Smuzhiyun } __attribute__((__packed__)) standard_timings[8]; 470*4882a593Smuzhiyun #define EDID1_INFO_STANDARD_TIMING_XRESOLUTION(_x, _i) \ 471*4882a593Smuzhiyun (((_x).standard_timings[_i]).xresolution) 472*4882a593Smuzhiyun #define EDID1_INFO_STANDARD_TIMING_ASPECT(_x, _i) \ 473*4882a593Smuzhiyun GET_BITS(((_x).standard_timings[_i].aspect_vfreq), 7, 6) 474*4882a593Smuzhiyun #define EDID1_INFO_STANDARD_TIMING_VFREQ(_x, _i) \ 475*4882a593Smuzhiyun GET_BITS(((_x).standard_timings[_i].aspect_vfreq), 5, 0) 476*4882a593Smuzhiyun union { 477*4882a593Smuzhiyun unsigned char timing[72]; 478*4882a593Smuzhiyun struct edid_monitor_descriptor descriptor[4]; 479*4882a593Smuzhiyun } monitor_details; 480*4882a593Smuzhiyun unsigned char extension_flag; 481*4882a593Smuzhiyun unsigned char checksum; 482*4882a593Smuzhiyun } __attribute__ ((__packed__)); 483*4882a593Smuzhiyun 484*4882a593Smuzhiyun enum edid_cea861_db_types { 485*4882a593Smuzhiyun EDID_CEA861_DB_AUDIO = 0x01, 486*4882a593Smuzhiyun EDID_CEA861_DB_VIDEO = 0x02, 487*4882a593Smuzhiyun EDID_CEA861_DB_VENDOR = 0x03, 488*4882a593Smuzhiyun EDID_CEA861_DB_SPEAKER = 0x04, 489*4882a593Smuzhiyun EDID_CEA861_DB_USE_EXTENDED = 0x07, 490*4882a593Smuzhiyun }; 491*4882a593Smuzhiyun 492*4882a593Smuzhiyun #define EXT_VIDEO_CAPABILITY_BLOCK 0x00 493*4882a593Smuzhiyun #define EXT_VIDEO_DATA_BLOCK_420 0x0E 494*4882a593Smuzhiyun #define EXT_VIDEO_CAP_BLOCK_Y420CMDB 0x0F 495*4882a593Smuzhiyun #define EDID_BASIC_AUDIO BIT(6) 496*4882a593Smuzhiyun #define EDID_CEA_YCRCB444 BIT(5) 497*4882a593Smuzhiyun #define EDID_CEA_YCRCB422 BIT(4) 498*4882a593Smuzhiyun #define EDID_CEA_VCDB_QS BIT(6) 499*4882a593Smuzhiyun 500*4882a593Smuzhiyun #define EXT_VIDEO_DATA_BLOCK_420 0x0E 501*4882a593Smuzhiyun 502*4882a593Smuzhiyun struct edid_cea861_info { 503*4882a593Smuzhiyun unsigned char extension_tag; 504*4882a593Smuzhiyun #define EDID_CEA861_EXTENSION_TAG 0x02 505*4882a593Smuzhiyun unsigned char revision; 506*4882a593Smuzhiyun unsigned char dtd_offset; 507*4882a593Smuzhiyun unsigned char dtd_count; 508*4882a593Smuzhiyun #define EDID_CEA861_SUPPORTS_UNDERSCAN(_x) \ 509*4882a593Smuzhiyun GET_BIT(((_x).dtd_count), 7) 510*4882a593Smuzhiyun #define EDID_CEA861_SUPPORTS_BASIC_AUDIO(_x) \ 511*4882a593Smuzhiyun GET_BIT(((_x).dtd_count), 6) 512*4882a593Smuzhiyun #define EDID_CEA861_SUPPORTS_YUV444(_x) \ 513*4882a593Smuzhiyun GET_BIT(((_x).dtd_count), 5) 514*4882a593Smuzhiyun #define EDID_CEA861_SUPPORTS_YUV422(_x) \ 515*4882a593Smuzhiyun GET_BIT(((_x).dtd_count), 4) 516*4882a593Smuzhiyun #define EDID_CEA861_DTD_COUNT(_x) \ 517*4882a593Smuzhiyun GET_BITS(((_x).dtd_count), 3, 0) 518*4882a593Smuzhiyun unsigned char data[124]; 519*4882a593Smuzhiyun #define EDID_CEA861_DB_TYPE(_x, offset) \ 520*4882a593Smuzhiyun GET_BITS((_x).data[offset], 7, 5) 521*4882a593Smuzhiyun #define EDID_CEA861_DB_LEN(_x, offset) \ 522*4882a593Smuzhiyun GET_BITS((_x).data[offset], 4, 0) 523*4882a593Smuzhiyun } __attribute__ ((__packed__)); 524*4882a593Smuzhiyun 525*4882a593Smuzhiyun #define DATA_BLOCK_PRODUCT_ID 0x00 526*4882a593Smuzhiyun #define DATA_BLOCK_DISPLAY_PARAMETERS 0x01 527*4882a593Smuzhiyun #define DATA_BLOCK_COLOR_CHARACTERISTICS 0x02 528*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_1_DETAILED_TIMING 0x03 529*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_2_DETAILED_TIMING 0x04 530*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_3_SHORT_TIMING 0x05 531*4882a593Smuzhiyun #define DATA_BLOCK_TYPE_4_DMT_TIMING 0x06 532*4882a593Smuzhiyun #define DATA_BLOCK_VESA_TIMING 0x07 533*4882a593Smuzhiyun #define DATA_BLOCK_CEA_TIMING 0x08 534*4882a593Smuzhiyun #define DATA_BLOCK_VIDEO_TIMING_RANGE 0x09 535*4882a593Smuzhiyun #define DATA_BLOCK_PRODUCT_SERIAL_NUMBER 0x0a 536*4882a593Smuzhiyun #define DATA_BLOCK_GP_ASCII_STRING 0x0b 537*4882a593Smuzhiyun #define DATA_BLOCK_DISPLAY_DEVICE_DATA 0x0c 538*4882a593Smuzhiyun #define DATA_BLOCK_INTERFACE_POWER_SEQUENCING 0x0d 539*4882a593Smuzhiyun #define DATA_BLOCK_TRANSFER_CHARACTERISTICS 0x0e 540*4882a593Smuzhiyun #define DATA_BLOCK_DISPLAY_INTERFACE 0x0f 541*4882a593Smuzhiyun #define DATA_BLOCK_STEREO_DISPLAY_INTERFACE 0x10 542*4882a593Smuzhiyun #define DATA_BLOCK_TILED_DISPLAY 0x12 543*4882a593Smuzhiyun 544*4882a593Smuzhiyun struct displayid_hdr { 545*4882a593Smuzhiyun u8 rev; 546*4882a593Smuzhiyun u8 bytes; 547*4882a593Smuzhiyun u8 prod_id; 548*4882a593Smuzhiyun u8 ext_count; 549*4882a593Smuzhiyun } __packed; 550*4882a593Smuzhiyun 551*4882a593Smuzhiyun struct displayid_block { 552*4882a593Smuzhiyun u8 tag; 553*4882a593Smuzhiyun u8 rev; 554*4882a593Smuzhiyun u8 num_bytes; 555*4882a593Smuzhiyun } __packed; 556*4882a593Smuzhiyun 557*4882a593Smuzhiyun struct displayid_detailed_timings_1 { 558*4882a593Smuzhiyun u8 pixel_clock[3]; 559*4882a593Smuzhiyun u8 flags; 560*4882a593Smuzhiyun u8 hactive[2]; 561*4882a593Smuzhiyun u8 hblank[2]; 562*4882a593Smuzhiyun u8 hsync[2]; 563*4882a593Smuzhiyun u8 hsw[2]; 564*4882a593Smuzhiyun u8 vactive[2]; 565*4882a593Smuzhiyun u8 vblank[2]; 566*4882a593Smuzhiyun u8 vsync[2]; 567*4882a593Smuzhiyun u8 vsw[2]; 568*4882a593Smuzhiyun } __packed; 569*4882a593Smuzhiyun 570*4882a593Smuzhiyun struct displayid_detailed_timing_block { 571*4882a593Smuzhiyun struct displayid_block base; 572*4882a593Smuzhiyun struct displayid_detailed_timings_1 timings[0]; 573*4882a593Smuzhiyun }; 574*4882a593Smuzhiyun 575*4882a593Smuzhiyun /** 576*4882a593Smuzhiyun * struct drm_scrambling: sink's scrambling support. 577*4882a593Smuzhiyun */ 578*4882a593Smuzhiyun struct drm_scrambling { 579*4882a593Smuzhiyun /** 580*4882a593Smuzhiyun * @supported: scrambling supported for rates > 340 Mhz. 581*4882a593Smuzhiyun */ 582*4882a593Smuzhiyun bool supported; 583*4882a593Smuzhiyun /** 584*4882a593Smuzhiyun * @low_rates: scrambling supported for rates <= 340 Mhz. 585*4882a593Smuzhiyun */ 586*4882a593Smuzhiyun bool low_rates; 587*4882a593Smuzhiyun }; 588*4882a593Smuzhiyun 589*4882a593Smuzhiyun /** 590*4882a593Smuzhiyun * struct drm_scdc - Information about scdc capabilities of a HDMI 2.0 sink 591*4882a593Smuzhiyun * 592*4882a593Smuzhiyun * Provides SCDC register support and capabilities related information on a 593*4882a593Smuzhiyun * HDMI 2.0 sink. In case of a HDMI 1.4 sink, all parameter must be 0. 594*4882a593Smuzhiyun */ 595*4882a593Smuzhiyun 596*4882a593Smuzhiyun struct drm_scdc { 597*4882a593Smuzhiyun /** 598*4882a593Smuzhiyun * @supported: status control & data channel present. 599*4882a593Smuzhiyun */ 600*4882a593Smuzhiyun bool supported; 601*4882a593Smuzhiyun /** 602*4882a593Smuzhiyun * @read_request: sink is capable of generating scdc read request. 603*4882a593Smuzhiyun */ 604*4882a593Smuzhiyun bool read_request; 605*4882a593Smuzhiyun /** 606*4882a593Smuzhiyun * @scrambling: sink's scrambling capabilities 607*4882a593Smuzhiyun */ 608*4882a593Smuzhiyun struct drm_scrambling scrambling; 609*4882a593Smuzhiyun }; 610*4882a593Smuzhiyun 611*4882a593Smuzhiyun /** 612*4882a593Smuzhiyun * struct drm_hdmi_dsc_cap - DSC capabilities of HDMI sink 613*4882a593Smuzhiyun * 614*4882a593Smuzhiyun * Describes the DSC support provided by HDMI 2.1 sink. 615*4882a593Smuzhiyun * The information is fetched fom additional HFVSDB blocks defined 616*4882a593Smuzhiyun * for HDMI 2.1. 617*4882a593Smuzhiyun */ 618*4882a593Smuzhiyun struct drm_hdmi_dsc_cap { 619*4882a593Smuzhiyun /** @v_1p2: flag for dsc1.2 version support by sink */ 620*4882a593Smuzhiyun bool v_1p2; 621*4882a593Smuzhiyun 622*4882a593Smuzhiyun /** @native_420: Does sink support DSC with 4:2:0 compression */ 623*4882a593Smuzhiyun bool native_420; 624*4882a593Smuzhiyun 625*4882a593Smuzhiyun /** 626*4882a593Smuzhiyun * @all_bpp: Does sink support all bpp with 4:4:4: or 4:2:2 627*4882a593Smuzhiyun * compressed formats 628*4882a593Smuzhiyun */ 629*4882a593Smuzhiyun bool all_bpp; 630*4882a593Smuzhiyun 631*4882a593Smuzhiyun /** 632*4882a593Smuzhiyun * @bpc_supported: compressed bpc supported by sink : 10, 12 or 16 bpc 633*4882a593Smuzhiyun */ 634*4882a593Smuzhiyun u8 bpc_supported; 635*4882a593Smuzhiyun 636*4882a593Smuzhiyun /** @max_slices: maximum number of Horizontal slices supported by */ 637*4882a593Smuzhiyun u8 max_slices; 638*4882a593Smuzhiyun 639*4882a593Smuzhiyun /** @clk_per_slice : max pixel clock in MHz supported per slice */ 640*4882a593Smuzhiyun int clk_per_slice; 641*4882a593Smuzhiyun 642*4882a593Smuzhiyun /** @max_lanes : dsc max lanes supported for Fixed rate Link training */ 643*4882a593Smuzhiyun u8 max_lanes; 644*4882a593Smuzhiyun 645*4882a593Smuzhiyun /** @max_frl_rate_per_lane : maximum frl rate with DSC per lane */ 646*4882a593Smuzhiyun u8 max_frl_rate_per_lane; 647*4882a593Smuzhiyun 648*4882a593Smuzhiyun /** @total_chunk_kbytes: max size of chunks in KBs supported per line*/ 649*4882a593Smuzhiyun u8 total_chunk_kbytes; 650*4882a593Smuzhiyun }; 651*4882a593Smuzhiyun 652*4882a593Smuzhiyun /** 653*4882a593Smuzhiyun * struct drm_hdmi_info - runtime information about the connected HDMI sink 654*4882a593Smuzhiyun * 655*4882a593Smuzhiyun * Describes if a given display supports advanced HDMI 2.0 features. 656*4882a593Smuzhiyun * This information is available in CEA-861-F extension blocks (like HF-VSDB). 657*4882a593Smuzhiyun */ 658*4882a593Smuzhiyun struct drm_hdmi_info { 659*4882a593Smuzhiyun struct drm_scdc scdc; 660*4882a593Smuzhiyun 661*4882a593Smuzhiyun /** 662*4882a593Smuzhiyun * @y420_vdb_modes: bitmap of modes which can support ycbcr420 663*4882a593Smuzhiyun * output only (not normal RGB/YCBCR444/422 outputs). There are total 664*4882a593Smuzhiyun * 107 VICs defined by CEA-861-F spec, so the size is 128 bits to map 665*4882a593Smuzhiyun * upto 128 VICs; 666*4882a593Smuzhiyun */ 667*4882a593Smuzhiyun unsigned long y420_vdb_modes[BITS_TO_LONGS(128)]; 668*4882a593Smuzhiyun 669*4882a593Smuzhiyun /** 670*4882a593Smuzhiyun * @y420_cmdb_modes: bitmap of modes which can support ycbcr420 671*4882a593Smuzhiyun * output also, along with normal HDMI outputs. There are total 107 672*4882a593Smuzhiyun * VICs defined by CEA-861-F spec, so the size is 128 bits to map upto 673*4882a593Smuzhiyun * 128 VICs; 674*4882a593Smuzhiyun */ 675*4882a593Smuzhiyun unsigned long y420_cmdb_modes[BITS_TO_LONGS(128)]; 676*4882a593Smuzhiyun 677*4882a593Smuzhiyun /** @y420_cmdb_map: bitmap of SVD index, to extraxt vcb modes */ 678*4882a593Smuzhiyun u64 y420_cmdb_map; 679*4882a593Smuzhiyun 680*4882a593Smuzhiyun /** @y420_dc_modes: bitmap of deep color support index */ 681*4882a593Smuzhiyun u8 y420_dc_modes; 682*4882a593Smuzhiyun 683*4882a593Smuzhiyun /** @max_frl_rate_per_lane: support fixed rate link */ 684*4882a593Smuzhiyun u8 max_frl_rate_per_lane; 685*4882a593Smuzhiyun 686*4882a593Smuzhiyun /** @max_lanes: supported by sink */ 687*4882a593Smuzhiyun u8 max_lanes; 688*4882a593Smuzhiyun 689*4882a593Smuzhiyun /* @add_func: support hdmi2.1 function */ 690*4882a593Smuzhiyun u8 add_func; 691*4882a593Smuzhiyun 692*4882a593Smuzhiyun /** @dsc_cap: DSC capabilities of the sink */ 693*4882a593Smuzhiyun struct drm_hdmi_dsc_cap dsc_cap; 694*4882a593Smuzhiyun }; 695*4882a593Smuzhiyun 696*4882a593Smuzhiyun enum subpixel_order { 697*4882a593Smuzhiyun subpixelunknown = 0, 698*4882a593Smuzhiyun subpixelhorizontalrgb, 699*4882a593Smuzhiyun subpixelhorizontalbgr, 700*4882a593Smuzhiyun subpixelverticalrgb, 701*4882a593Smuzhiyun subpixelverticalbgr, 702*4882a593Smuzhiyun subpixelnone, 703*4882a593Smuzhiyun }; 704*4882a593Smuzhiyun 705*4882a593Smuzhiyun #define DRM_COLOR_FORMAT_RGB444 BIT(0) 706*4882a593Smuzhiyun #define DRM_COLOR_FORMAT_YCRCB444 BIT(1) 707*4882a593Smuzhiyun #define DRM_COLOR_FORMAT_YCRCB422 BIT(2) 708*4882a593Smuzhiyun #define DRM_COLOR_FORMAT_YCRCB420 BIT(3) 709*4882a593Smuzhiyun 710*4882a593Smuzhiyun /* 711*4882a593Smuzhiyun * Describes a given display (e.g. CRT or flat panel) and its limitations. 712*4882a593Smuzhiyun */ 713*4882a593Smuzhiyun struct drm_display_info { 714*4882a593Smuzhiyun char name[32]; 715*4882a593Smuzhiyun 716*4882a593Smuzhiyun /* Physical size */ 717*4882a593Smuzhiyun unsigned int width_mm; 718*4882a593Smuzhiyun unsigned int height_mm; 719*4882a593Smuzhiyun 720*4882a593Smuzhiyun /* Clock limits FIXME: storage format */ 721*4882a593Smuzhiyun unsigned int min_vfreq, max_vfreq; 722*4882a593Smuzhiyun unsigned int min_hfreq, max_hfreq; 723*4882a593Smuzhiyun unsigned int pixel_clock; 724*4882a593Smuzhiyun unsigned int bpc; 725*4882a593Smuzhiyun 726*4882a593Smuzhiyun enum subpixel_order subpixel_order; 727*4882a593Smuzhiyun u32 color_formats; 728*4882a593Smuzhiyun 729*4882a593Smuzhiyun const u32 *bus_formats; 730*4882a593Smuzhiyun unsigned int num_bus_formats; 731*4882a593Smuzhiyun 732*4882a593Smuzhiyun /** 733*4882a593Smuzhiyun * @max_tmds_clock: Maximum TMDS clock rate supported by the 734*4882a593Smuzhiyun * sink in kHz. 0 means undefined. 735*4882a593Smuzhiyun */ 736*4882a593Smuzhiyun int max_tmds_clock; 737*4882a593Smuzhiyun 738*4882a593Smuzhiyun /** 739*4882a593Smuzhiyun * @dvi_dual: Dual-link DVI sink? 740*4882a593Smuzhiyun */ 741*4882a593Smuzhiyun bool dvi_dual; 742*4882a593Smuzhiyun 743*4882a593Smuzhiyun /* Mask of supported hdmi deep color modes */ 744*4882a593Smuzhiyun u8 edid_hdmi_dc_modes; 745*4882a593Smuzhiyun 746*4882a593Smuzhiyun u8 cea_rev; 747*4882a593Smuzhiyun 748*4882a593Smuzhiyun /** 749*4882a593Smuzhiyun * @hdmi: advance features of a HDMI sink. 750*4882a593Smuzhiyun */ 751*4882a593Smuzhiyun struct drm_hdmi_info hdmi; 752*4882a593Smuzhiyun }; 753*4882a593Smuzhiyun 754*4882a593Smuzhiyun struct edid { 755*4882a593Smuzhiyun u8 header[8]; 756*4882a593Smuzhiyun /* Vendor & product info */ 757*4882a593Smuzhiyun u8 mfg_id[2]; 758*4882a593Smuzhiyun u8 prod_code[2]; 759*4882a593Smuzhiyun u32 serial; /* FIXME: byte order */ 760*4882a593Smuzhiyun u8 mfg_week; 761*4882a593Smuzhiyun u8 mfg_year; 762*4882a593Smuzhiyun /* EDID version */ 763*4882a593Smuzhiyun u8 version; 764*4882a593Smuzhiyun u8 revision; 765*4882a593Smuzhiyun /* Display info: */ 766*4882a593Smuzhiyun u8 input; 767*4882a593Smuzhiyun u8 width_cm; 768*4882a593Smuzhiyun u8 height_cm; 769*4882a593Smuzhiyun u8 gamma; 770*4882a593Smuzhiyun u8 features; 771*4882a593Smuzhiyun /* Color characteristics */ 772*4882a593Smuzhiyun u8 red_green_lo; 773*4882a593Smuzhiyun u8 black_white_lo; 774*4882a593Smuzhiyun u8 red_x; 775*4882a593Smuzhiyun u8 red_y; 776*4882a593Smuzhiyun u8 green_x; 777*4882a593Smuzhiyun u8 green_y; 778*4882a593Smuzhiyun u8 blue_x; 779*4882a593Smuzhiyun u8 blue_y; 780*4882a593Smuzhiyun u8 white_x; 781*4882a593Smuzhiyun u8 white_y; 782*4882a593Smuzhiyun /* Est. timings and mfg rsvd timings*/ 783*4882a593Smuzhiyun struct est_timings established_timings; 784*4882a593Smuzhiyun /* Standard timings 1-8*/ 785*4882a593Smuzhiyun struct std_timing standard_timings[8]; 786*4882a593Smuzhiyun /* Detailing timings 1-4 */ 787*4882a593Smuzhiyun struct detailed_timing detailed_timings[4]; 788*4882a593Smuzhiyun /* Number of 128 byte ext. blocks */ 789*4882a593Smuzhiyun u8 extensions; 790*4882a593Smuzhiyun /* Checksum */ 791*4882a593Smuzhiyun u8 checksum; 792*4882a593Smuzhiyun } __packed; 793*4882a593Smuzhiyun 794*4882a593Smuzhiyun enum base_output_format { 795*4882a593Smuzhiyun DRM_HDMI_OUTPUT_DEFAULT_RGB, /* default RGB */ 796*4882a593Smuzhiyun DRM_HDMI_OUTPUT_YCBCR444, /* YCBCR 444 */ 797*4882a593Smuzhiyun DRM_HDMI_OUTPUT_YCBCR422, /* YCBCR 422 */ 798*4882a593Smuzhiyun DRM_HDMI_OUTPUT_YCBCR420, /* YCBCR 420 */ 799*4882a593Smuzhiyun /* (YCbCr444 > YCbCr422 > YCbCr420 > RGB) */ 800*4882a593Smuzhiyun DRM_HDMI_OUTPUT_YCBCR_HQ, 801*4882a593Smuzhiyun /* (YCbCr420 > YCbCr422 > YCbCr444 > RGB) */ 802*4882a593Smuzhiyun DRM_HDMI_OUTPUT_YCBCR_LQ, 803*4882a593Smuzhiyun DRM_HDMI_OUTPUT_INVALID, /* Guess what ? */ 804*4882a593Smuzhiyun }; 805*4882a593Smuzhiyun 806*4882a593Smuzhiyun enum base_output_depth { 807*4882a593Smuzhiyun AUTOMATIC = 0, 808*4882a593Smuzhiyun DEPTH_24BIT = 8, 809*4882a593Smuzhiyun DEPTH_30BIT = 10, 810*4882a593Smuzhiyun }; 811*4882a593Smuzhiyun 812*4882a593Smuzhiyun struct base_bcsh_info { 813*4882a593Smuzhiyun unsigned short brightness; 814*4882a593Smuzhiyun unsigned short contrast; 815*4882a593Smuzhiyun unsigned short saturation; 816*4882a593Smuzhiyun unsigned short hue; 817*4882a593Smuzhiyun }; 818*4882a593Smuzhiyun 819*4882a593Smuzhiyun struct base_overscan { 820*4882a593Smuzhiyun unsigned int maxvalue; 821*4882a593Smuzhiyun unsigned short leftscale; 822*4882a593Smuzhiyun unsigned short rightscale; 823*4882a593Smuzhiyun unsigned short topscale; 824*4882a593Smuzhiyun unsigned short bottomscale; 825*4882a593Smuzhiyun }; 826*4882a593Smuzhiyun 827*4882a593Smuzhiyun struct base_drm_display_mode { 828*4882a593Smuzhiyun int clock; /* in kHz */ 829*4882a593Smuzhiyun int hdisplay; 830*4882a593Smuzhiyun int hsync_start; 831*4882a593Smuzhiyun int hsync_end; 832*4882a593Smuzhiyun int htotal; 833*4882a593Smuzhiyun int vdisplay; 834*4882a593Smuzhiyun int vsync_start; 835*4882a593Smuzhiyun int vsync_end; 836*4882a593Smuzhiyun int vtotal; 837*4882a593Smuzhiyun int vrefresh; 838*4882a593Smuzhiyun int vscan; 839*4882a593Smuzhiyun unsigned int flags; 840*4882a593Smuzhiyun int picture_aspect_ratio; 841*4882a593Smuzhiyun }; 842*4882a593Smuzhiyun 843*4882a593Smuzhiyun struct base_screen_info { 844*4882a593Smuzhiyun int type; 845*4882a593Smuzhiyun struct base_drm_display_mode mode; /* 52 bytes */ 846*4882a593Smuzhiyun enum base_output_format format; /* 4 bytes */ 847*4882a593Smuzhiyun enum base_output_depth depth; /* 4 bytes */ 848*4882a593Smuzhiyun unsigned int feature; /* 4 bytes */ 849*4882a593Smuzhiyun }; 850*4882a593Smuzhiyun 851*4882a593Smuzhiyun struct base_disp_info { 852*4882a593Smuzhiyun struct base_screen_info screen_list[5]; 853*4882a593Smuzhiyun struct base_overscan scan; /* 12 bytes */ 854*4882a593Smuzhiyun }; 855*4882a593Smuzhiyun 856*4882a593Smuzhiyun struct base2_cubic_lut_data { 857*4882a593Smuzhiyun u16 size; 858*4882a593Smuzhiyun u16 lred[4913]; 859*4882a593Smuzhiyun u16 lgreen[4913]; 860*4882a593Smuzhiyun u16 lblue[4913]; 861*4882a593Smuzhiyun }; 862*4882a593Smuzhiyun 863*4882a593Smuzhiyun struct base2_screen_info { 864*4882a593Smuzhiyun u32 type; 865*4882a593Smuzhiyun u32 id; 866*4882a593Smuzhiyun struct base_drm_display_mode resolution; 867*4882a593Smuzhiyun enum base_output_format format; 868*4882a593Smuzhiyun enum base_output_depth depthc; 869*4882a593Smuzhiyun u32 feature; 870*4882a593Smuzhiyun }; 871*4882a593Smuzhiyun 872*4882a593Smuzhiyun struct base2_gamma_lut_data { 873*4882a593Smuzhiyun u16 size; 874*4882a593Smuzhiyun u16 lred[1024]; 875*4882a593Smuzhiyun u16 lgreen[1024]; 876*4882a593Smuzhiyun u16 lblue[1024]; 877*4882a593Smuzhiyun }; 878*4882a593Smuzhiyun 879*4882a593Smuzhiyun struct framebuffer_info { 880*4882a593Smuzhiyun u32 framebuffer_width; 881*4882a593Smuzhiyun u32 framebuffer_height; 882*4882a593Smuzhiyun u32 fps; 883*4882a593Smuzhiyun }; 884*4882a593Smuzhiyun 885*4882a593Smuzhiyun struct csc_info { 886*4882a593Smuzhiyun u16 hue; 887*4882a593Smuzhiyun u16 saturation; 888*4882a593Smuzhiyun u16 contrast; 889*4882a593Smuzhiyun u16 brightness; 890*4882a593Smuzhiyun u16 r_gain; 891*4882a593Smuzhiyun u16 g_gain; 892*4882a593Smuzhiyun u16 b_gain; 893*4882a593Smuzhiyun u16 r_offset; 894*4882a593Smuzhiyun u16 g_offset; 895*4882a593Smuzhiyun u16 b_offset; 896*4882a593Smuzhiyun u16 csc_enable; 897*4882a593Smuzhiyun }; 898*4882a593Smuzhiyun 899*4882a593Smuzhiyun 900*4882a593Smuzhiyun #define ACM_GAIN_LUT_HY_LENGTH (9*17) 901*4882a593Smuzhiyun #define ACM_GAIN_LUT_HY_TOTAL_LENGTH (ACM_GAIN_LUT_HY_LENGTH * 3) 902*4882a593Smuzhiyun #define ACM_GAIN_LUT_HS_LENGTH (13*17) 903*4882a593Smuzhiyun #define ACM_GAIN_LUT_HS_TOTAL_LENGTH (ACM_GAIN_LUT_HS_LENGTH * 3) 904*4882a593Smuzhiyun #define ACM_DELTA_LUT_H_LENGTH 65 905*4882a593Smuzhiyun #define ACM_DELTA_LUT_H_TOTAL_LENGTH (ACM_DELTA_LUT_H_LENGTH * 3) 906*4882a593Smuzhiyun 907*4882a593Smuzhiyun struct acm_data { 908*4882a593Smuzhiyun s16 delta_lut_h[ACM_DELTA_LUT_H_TOTAL_LENGTH]; 909*4882a593Smuzhiyun s16 gain_lut_hy[ACM_GAIN_LUT_HY_TOTAL_LENGTH]; 910*4882a593Smuzhiyun s16 gain_lut_hs[ACM_GAIN_LUT_HS_TOTAL_LENGTH]; 911*4882a593Smuzhiyun u16 y_gain; 912*4882a593Smuzhiyun u16 h_gain; 913*4882a593Smuzhiyun u16 s_gain; 914*4882a593Smuzhiyun u16 acm_enable; 915*4882a593Smuzhiyun }; 916*4882a593Smuzhiyun 917*4882a593Smuzhiyun struct base2_disp_info { 918*4882a593Smuzhiyun char disp_head_flag[6]; 919*4882a593Smuzhiyun struct base2_screen_info screen_info[4]; 920*4882a593Smuzhiyun struct base_bcsh_info bcsh_info; 921*4882a593Smuzhiyun struct base_overscan overscan_info; 922*4882a593Smuzhiyun struct base2_gamma_lut_data gamma_lut_data; 923*4882a593Smuzhiyun struct base2_cubic_lut_data cubic_lut_data; 924*4882a593Smuzhiyun struct framebuffer_info framebuffer_info; 925*4882a593Smuzhiyun u32 cacm_header; 926*4882a593Smuzhiyun u32 reserved[243]; 927*4882a593Smuzhiyun u32 crc; 928*4882a593Smuzhiyun /* baseparameter version 3.0 add */ 929*4882a593Smuzhiyun struct csc_info csc_info; 930*4882a593Smuzhiyun struct acm_data acm_data; 931*4882a593Smuzhiyun u8 resv2[10*1024]; /* */ 932*4882a593Smuzhiyun u32 crc2; 933*4882a593Smuzhiyun /* baseparameter version 3.0 add */ 934*4882a593Smuzhiyun }; 935*4882a593Smuzhiyun 936*4882a593Smuzhiyun struct base2_disp_header { 937*4882a593Smuzhiyun u32 connector_type; 938*4882a593Smuzhiyun u32 connector_id; 939*4882a593Smuzhiyun u32 offset; 940*4882a593Smuzhiyun }; 941*4882a593Smuzhiyun 942*4882a593Smuzhiyun struct base2_info { 943*4882a593Smuzhiyun char head_flag[4]; 944*4882a593Smuzhiyun u16 major_version; 945*4882a593Smuzhiyun u16 minor_version; 946*4882a593Smuzhiyun struct base2_disp_header disp_header[8]; 947*4882a593Smuzhiyun struct base2_disp_info disp_info[8]; 948*4882a593Smuzhiyun }; 949*4882a593Smuzhiyun 950*4882a593Smuzhiyun /** 951*4882a593Smuzhiyun * Print the EDID info. 952*4882a593Smuzhiyun * 953*4882a593Smuzhiyun * @param edid_info The EDID info to be printed 954*4882a593Smuzhiyun */ 955*4882a593Smuzhiyun void edid_print_info(struct edid1_info *edid_info); 956*4882a593Smuzhiyun 957*4882a593Smuzhiyun /** 958*4882a593Smuzhiyun * Check the EDID info. 959*4882a593Smuzhiyun * 960*4882a593Smuzhiyun * @param info The EDID info to be checked 961*4882a593Smuzhiyun * @return 0 on valid, or -1 on invalid 962*4882a593Smuzhiyun */ 963*4882a593Smuzhiyun int edid_check_info(struct edid1_info *info); 964*4882a593Smuzhiyun 965*4882a593Smuzhiyun /** 966*4882a593Smuzhiyun * Check checksum of a 128 bytes EDID data block 967*4882a593Smuzhiyun * 968*4882a593Smuzhiyun * @param edid_block EDID block data 969*4882a593Smuzhiyun * 970*4882a593Smuzhiyun * @return 0 on success, or a negative errno on error 971*4882a593Smuzhiyun */ 972*4882a593Smuzhiyun int edid_check_checksum(u8 *edid_block); 973*4882a593Smuzhiyun 974*4882a593Smuzhiyun /** 975*4882a593Smuzhiyun * Get the horizontal and vertical rate ranges of the monitor. 976*4882a593Smuzhiyun * 977*4882a593Smuzhiyun * @param edid The EDID info 978*4882a593Smuzhiyun * @param hmin Returns the minimum horizontal rate 979*4882a593Smuzhiyun * @param hmax Returns the maximum horizontal rate 980*4882a593Smuzhiyun * @param vmin Returns the minimum vertical rate 981*4882a593Smuzhiyun * @param vmax Returns the maximum vertical rate 982*4882a593Smuzhiyun * @return 0 on success, or -1 on error 983*4882a593Smuzhiyun */ 984*4882a593Smuzhiyun int edid_get_ranges(struct edid1_info *edid, unsigned int *hmin, 985*4882a593Smuzhiyun unsigned int *hmax, unsigned int *vmin, 986*4882a593Smuzhiyun unsigned int *vmax); 987*4882a593Smuzhiyun 988*4882a593Smuzhiyun struct drm_display_mode; 989*4882a593Smuzhiyun struct display_timing; 990*4882a593Smuzhiyun 991*4882a593Smuzhiyun struct hdmi_edid_data { 992*4882a593Smuzhiyun struct drm_display_mode *preferred_mode; 993*4882a593Smuzhiyun int modes; 994*4882a593Smuzhiyun struct drm_display_mode *mode_buf; 995*4882a593Smuzhiyun struct drm_display_info display_info; 996*4882a593Smuzhiyun }; 997*4882a593Smuzhiyun 998*4882a593Smuzhiyun struct ddc_adapter { 999*4882a593Smuzhiyun int (*ddc_xfer)(struct ddc_adapter *adap, struct i2c_msg *msgs, 1000*4882a593Smuzhiyun int num); 1001*4882a593Smuzhiyun struct udevice *i2c_bus; 1002*4882a593Smuzhiyun struct dm_i2c_ops *ops; 1003*4882a593Smuzhiyun }; 1004*4882a593Smuzhiyun 1005*4882a593Smuzhiyun /** 1006*4882a593Smuzhiyun * edid_get_timing() - Get basic digital display parameters 1007*4882a593Smuzhiyun * 1008*4882a593Smuzhiyun * @param buf Buffer containing EDID data 1009*4882a593Smuzhiyun * @param buf_size Size of buffer in bytes 1010*4882a593Smuzhiyun * @param timing Place to put preferring timing information 1011*4882a593Smuzhiyun * @param panel_bits_per_colourp Place to put the number of bits per 1012*4882a593Smuzhiyun * colour supported by the panel. This will be set to 1013*4882a593Smuzhiyun * -1 if not available 1014*4882a593Smuzhiyun * @return 0 if timings are OK, -ve on error 1015*4882a593Smuzhiyun */ 1016*4882a593Smuzhiyun int edid_get_timing(u8 *buf, int buf_size, struct display_timing *timing, 1017*4882a593Smuzhiyun int *panel_bits_per_colourp); 1018*4882a593Smuzhiyun int edid_get_drm_mode(u8 *buf, int buf_size, struct drm_display_mode *mode, 1019*4882a593Smuzhiyun int *panel_bits_per_colourp); 1020*4882a593Smuzhiyun int drm_add_edid_modes(struct hdmi_edid_data *data, u8 *edid); 1021*4882a593Smuzhiyun bool drm_detect_hdmi_monitor(struct edid *edid); 1022*4882a593Smuzhiyun bool drm_detect_monitor_audio(struct edid *edid); 1023*4882a593Smuzhiyun int do_cea_modes(struct hdmi_edid_data *data, const u8 *db, u8 len); 1024*4882a593Smuzhiyun int drm_do_get_edid(struct ddc_adapter *adap, u8 *edid); 1025*4882a593Smuzhiyun enum hdmi_quantization_range 1026*4882a593Smuzhiyun drm_default_rgb_quant_range(struct drm_display_mode *mode); 1027*4882a593Smuzhiyun u8 drm_scdc_readb(struct ddc_adapter *adap, u8 offset, 1028*4882a593Smuzhiyun u8 *value); 1029*4882a593Smuzhiyun u8 drm_scdc_writeb(struct ddc_adapter *adap, u8 offset, 1030*4882a593Smuzhiyun u8 value); 1031*4882a593Smuzhiyun void drm_mode_sort(struct hdmi_edid_data *edid_data); 1032*4882a593Smuzhiyun int drm_mode_prune_invalid(struct hdmi_edid_data *edid_data); 1033*4882a593Smuzhiyun void drm_rk_filter_whitelist(struct hdmi_edid_data *edid_data); 1034*4882a593Smuzhiyun void drm_rk_select_mode(struct hdmi_edid_data *edid_data, 1035*4882a593Smuzhiyun struct base_screen_info *screen_info); 1036*4882a593Smuzhiyun 1037*4882a593Smuzhiyun #endif /* __EDID_H_ */ 1038