Lines Matching full:edid
18 #include <edid.h>
36 #define version_greater(edid, maj, min) \ argument
37 (((edid)->version > (maj)) || \
38 ((edid)->version == (maj) && (edid)->revision > (min)))
41 * EDID blocks out in the wild have a variety of bugs, try to collect
75 struct edid *edid; member
146 /* Rotel RSX-1058 forwards sink's EDID but only does HDMI 1.1*/
1356 * modes are old-school Mac modes. The EDID spec says the 1152x864@75 mode
1731 int edid_get_ranges(struct edid1_info *edid, unsigned int *hmin, in edid_get_ranges() argument
1739 if (edid_check_info(edid)) in edid_get_ranges()
1742 for (i = 0; i < ARRAY_SIZE(edid->monitor_details.descriptor); i++) { in edid_get_ranges()
1743 monitor = &edid->monitor_details.descriptor[i]; in edid_get_ranges()
1766 * @buf: Pointer to EDID detailed timing record
1776 /* Edid contains pixel clock in terms of 10KHz */ in decode_timing()
1828 * @buf: Pointer to EDID detailed timing record
1851 /* Edid contains pixel clock in terms of 10KHz */ in decode_mode()
1882 * edid_vendor - match a string against EDID's obfuscated vendor field
1883 * @edid: EDID to match
1886 * Returns true if @vendor is in @edid, false otherwise
1888 static bool edid_vendor(struct edid *edid, char *vendor) in edid_vendor() argument
1892 edid_vendor[0] = ((edid->mfg_id[0] & 0x7c) >> 2) + '@'; in edid_vendor()
1893 edid_vendor[1] = (((edid->mfg_id[0] & 0x3) << 3) | in edid_vendor()
1894 ((edid->mfg_id[1] & 0xe0) >> 5)) + '@'; in edid_vendor()
1895 edid_vendor[2] = (edid->mfg_id[1] & 0x1f) + '@'; in edid_vendor()
1962 struct edid1_info *edid = (struct edid1_info *)buf; in edid_get_drm_mode() local
1966 if (buf_size < sizeof(*edid) || edid_check_info(edid)) { in edid_get_drm_mode()
1971 if (!EDID1_INFO_FEATURE_PREFERRED_TIMING_MODE(*edid)) { in edid_get_drm_mode()
1981 desc = &edid->monitor_details.descriptor[i]; in edid_get_drm_mode()
1991 if (!EDID1_INFO_VIDEO_INPUT_DIGITAL(*edid)) { in edid_get_drm_mode()
1995 if (edid->version != 1 || edid->revision < 4) { in edid_get_drm_mode()
1996 debug("%s: EDID version %d.%d does not have required info\n", in edid_get_drm_mode()
1997 __func__, edid->version, edid->revision); in edid_get_drm_mode()
2001 ((edid->video_input_definition & 0x70) >> 3) + 4; in edid_get_drm_mode()
2010 struct edid1_info *edid = (struct edid1_info *)buf; in edid_get_timing() local
2014 if (buf_size < sizeof(*edid) || edid_check_info(edid)) { in edid_get_timing()
2019 if (!EDID1_INFO_FEATURE_PREFERRED_TIMING_MODE(*edid)) { in edid_get_timing()
2029 desc = &edid->monitor_details.descriptor[i]; in edid_get_timing()
2039 if (!EDID1_INFO_VIDEO_INPUT_DIGITAL(*edid)) { in edid_get_timing()
2043 if (edid->version != 1 || edid->revision < 4) { in edid_get_timing()
2044 debug("%s: EDID version %d.%d does not have required info\n", in edid_get_timing()
2045 __func__, edid->version, edid->revision); in edid_get_timing()
2049 ((edid->video_input_definition & 0x70) >> 3) + 4; in edid_get_timing()
2053 if (edid->extension_flag && (buf_size >= EDID_EXT_SIZE)) { in edid_get_timing()
2055 (struct edid_cea861_info *)(buf + sizeof(*edid)); in edid_get_timing()
2089 * Print an EDID monitor descriptor block
2091 * @param monitor The EDID monitor descriptor block
2144 * Get the manufacturer name from an EDID info.
2146 * @param edid_info The EDID info to be printed
2149 static void edid_get_manufacturer_name(struct edid1_info *edid, char *name) in edid_get_manufacturer_name() argument
2151 name[0] = EDID1_INFO_MANUFACTURER_NAME_CHAR1(*edid) + 'A' - 1; in edid_get_manufacturer_name()
2152 name[1] = EDID1_INFO_MANUFACTURER_NAME_CHAR2(*edid) + 'A' - 1; in edid_get_manufacturer_name()
2153 name[2] = EDID1_INFO_MANUFACTURER_NAME_CHAR3(*edid) + 'A' - 1; in edid_get_manufacturer_name()
2165 printf("Not a valid EDID\n"); in edid_print_info()
2169 printf("EDID version: %d.%d\n", in edid_print_info()
2561 * XXX: cea[2] is equal to the real value minus one in some sink edid. in cea_db_offsets()
2754 * @data: the structure that save parsed hdmi edid data
3045 * edid_get_quirks - return quirk flags for a given EDID
3046 * @edid: EDID to process
3050 static u32 edid_get_quirks(struct edid *edid) in edid_get_quirks() argument
3058 if (edid_vendor(edid, quirk->vendor) && in edid_get_quirks()
3059 (EDID_PRODUCT_ID(edid) == quirk->product_id)) in edid_get_quirks()
3166 * * Availability of a HF-VSDB block in EDID (check) in drm_parse_hdmi_forum_vsdb()
3198 debug("hdmi_21 sink detected. parsing edid\n"); in drm_parse_hdmi_forum_vsdb()
3336 * Search EDID for CEA extension block.
3338 static u8 *drm_find_edid_extension(struct edid *edid, int ext_id) in drm_find_edid_extension() argument
3343 /* No EDID or EDID extensions */ in drm_find_edid_extension()
3344 if (!edid || !edid->extensions) in drm_find_edid_extension()
3348 for (i = 0; i < edid->extensions; i++) { in drm_find_edid_extension()
3349 edid_ext = (u8 *)edid + EDID_SIZE * (i + 1); in drm_find_edid_extension()
3354 if (i == edid->extensions) in drm_find_edid_extension()
3360 static u8 *drm_find_cea_extension(struct edid *edid) in drm_find_cea_extension() argument
3362 return drm_find_edid_extension(edid, 0x02); in drm_find_cea_extension()
3373 * @edid: monitor EDID information
3379 bool drm_detect_hdmi_monitor(struct edid *edid) in drm_detect_hdmi_monitor() argument
3385 edid_ext = drm_find_cea_extension(edid); in drm_detect_hdmi_monitor()
3406 * @edid: EDID block to scan
3412 * audio' is not defined in EDID.
3416 bool drm_detect_monitor_audio(struct edid *edid) in drm_detect_monitor_audio() argument
3423 edid_ext = drm_find_cea_extension(edid); in drm_detect_monitor_audio()
3466 struct edid *edid) in drm_parse_cea_ext() argument
3472 edid_ext = drm_find_cea_extension(edid); in drm_parse_cea_ext()
3500 static void drm_add_display_info(struct hdmi_edid_data *data, struct edid *edid) in drm_add_display_info() argument
3504 info->width_mm = edid->width_cm * 10; in drm_add_display_info()
3505 info->height_mm = edid->height_cm * 10; in drm_add_display_info()
3517 if (edid->revision < 3) in drm_add_display_info()
3520 if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) in drm_add_display_info()
3523 drm_parse_cea_ext(data, edid); in drm_add_display_info()
3526 * Digital sink with "DFP 1.x compliant TMDS" according to EDID 1.3? in drm_add_display_info()
3528 * For such displays, the DFP spec 1.0, section 3.10 "EDID support" in drm_add_display_info()
3529 * tells us to assume 8 bpc color depth if the EDID doesn't have in drm_add_display_info()
3532 if ((info->bpc == 0) && (edid->revision < 4) && in drm_add_display_info()
3533 (edid->input & DRM_EDID_DIGITAL_TYPE_DVI)) { in drm_add_display_info()
3539 if (edid->revision < 4) in drm_add_display_info()
3542 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { in drm_add_display_info()
3567 debug("Assigning EDID-1.4 digital sink color depth as %d bpc.\n", in drm_add_display_info()
3571 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444) in drm_add_display_info()
3573 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422) in drm_add_display_info()
3578 int add_cea_modes(struct hdmi_edid_data *data, struct edid *edid) in add_cea_modes() argument
3580 const u8 *cea = drm_find_cea_extension(edid); in add_cea_modes()
3605 /* Add 4:2:0(only) modes present in EDID */ in add_cea_modes()
3657 struct edid *edid = (struct edid *)raw_edid; in drm_for_each_detailed_block() local
3659 if (!edid) in drm_for_each_detailed_block()
3663 cb(&edid->detailed_timings[i], closure); in drm_for_each_detailed_block()
3682 * EDID is delightfully ambiguous about how interlaced modes are to be
3725 * drm_mode_detailed - create a new mode from an EDID detailed timing section
3726 * @edid: EDID block
3727 * @timing: EDID detailed timing info
3730 * An EDID detailed timing block contains enough info for us to create and
3734 struct drm_display_mode *drm_mode_detailed(struct edid *edid, in drm_mode_detailed() argument
4022 closure->edid, timing, in do_detailed_mode()
4046 * @edid: EDID block to scan
4050 add_detailed_modes(struct hdmi_edid_data *data, struct edid *edid, in add_detailed_modes() argument
4055 .edid = edid, in add_detailed_modes()
4060 if (closure.preferred && !version_greater(edid, 1, 3)) in add_detailed_modes()
4062 (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); in add_detailed_modes()
4064 drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure); in add_detailed_modes()
4130 add_cvt_modes(struct hdmi_edid_data *data, struct edid *edid) in add_cvt_modes() argument
4134 .edid = edid, in add_cvt_modes()
4137 if (version_greater(edid, 1, 2)) in add_cvt_modes()
4138 drm_for_each_detailed_block((u8 *)edid, do_cvt_mode, &closure); in add_cvt_modes()
4156 drm_gtf2_hbreak(struct edid *edid) in drm_gtf2_hbreak() argument
4160 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_hbreak()
4165 drm_gtf2_2c(struct edid *edid) in drm_gtf2_2c() argument
4169 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2c()
4174 drm_gtf2_m(struct edid *edid) in drm_gtf2_m() argument
4178 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_m()
4183 drm_gtf2_k(struct edid *edid) in drm_gtf2_k() argument
4187 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_k()
4192 drm_gtf2_2j(struct edid *edid) in drm_gtf2_2j() argument
4196 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2j()
4202 * @edid: EDID block to scan
4204 static int standard_timing_level(struct edid *edid) in standard_timing_level() argument
4206 if (edid->revision >= 2) { in standard_timing_level()
4207 if (edid->revision >= 4 && in standard_timing_level()
4208 (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) in standard_timing_level()
4210 if (drm_gtf2_hbreak(edid)) in standard_timing_level()
4239 /* EDID 1.4 defines this explicitly. For EDID 1.3, we guess, badly. */
4241 drm_monitor_supports_rb(struct edid *edid) in drm_monitor_supports_rb() argument
4243 if (edid->revision >= 4) { in drm_monitor_supports_rb()
4246 drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); in drm_monitor_supports_rb()
4250 return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); in drm_monitor_supports_rb()
4535 * @data: the structure that save parsed hdmi edid data
4536 * @edid: EDID block to scan
4543 drm_mode_std(struct hdmi_edid_data *data, struct edid *edid, in drm_mode_std() argument
4554 int timing_level = standard_timing_level(edid); in drm_mode_std()
4559 /* According to the EDID spec, the hdisplay = hsize * 8 + 248 */ in drm_mode_std()
4565 if (edid->revision < 3) in drm_mode_std()
4608 if (drm_monitor_supports_rb(edid)) { in drm_mode_std()
4635 if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { in drm_mode_std()
4639 drm_gtf2_m(edid), in drm_mode_std()
4640 drm_gtf2_2c(edid), in drm_mode_std()
4641 drm_gtf2_k(edid), in drm_mode_std()
4642 drm_gtf2_2j(edid)); in drm_mode_std()
4659 struct edid *edid = closure->edid; in do_standard_modes() local
4669 newmode = drm_mode_std(closure->data, edid, std); in do_standard_modes()
4680 * add_standard_modes - get std. modes from EDID and add them
4682 * @edid: EDID block to scan
4685 * GTF or CVT. Grab them from @edid and add them to the list.
4688 add_standard_modes(struct hdmi_edid_data *data, struct edid *edid) in add_standard_modes() argument
4693 .edid = edid, in add_standard_modes()
4699 newmode = drm_mode_std(data, edid, in add_standard_modes()
4700 &edid->standard_timings[i]); in add_standard_modes()
4708 if (version_greater(edid, 1, 0)) in add_standard_modes()
4709 drm_for_each_detailed_block((u8 *)edid, do_standard_modes, in add_standard_modes()
4758 * add_established_modes - get est. modes from EDID and add them
4760 * @edid: EDID block to scan
4762 * Each EDID block contains a bitmap of the supported "established modes" list
4766 add_established_modes(struct hdmi_edid_data *data, struct edid *edid) in add_established_modes() argument
4768 unsigned long est_bits = edid->established_timings.t1 | in add_established_modes()
4769 (edid->established_timings.t2 << 8) | in add_established_modes()
4770 ((edid->established_timings.mfg_rsvd & 0x80) << 9); in add_established_modes()
4774 .edid = edid, in add_established_modes()
4789 if (version_greater(edid, 1, 0)) in add_established_modes()
4790 drm_for_each_detailed_block((u8 *)edid, in add_established_modes()
4820 add_alternate_cea_modes(struct hdmi_edid_data *data, struct edid *edid) in add_alternate_cea_modes() argument
4826 if (!drm_find_cea_extension(edid)) in add_alternate_cea_modes()
4891 static u8 *drm_find_displayid_extension(struct edid *edid) in drm_find_displayid_extension() argument
4893 return drm_find_edid_extension(edid, DISPLAYID_EXT); in drm_find_displayid_extension()
5000 struct edid *edid) in add_displayid_detailed_modes() argument
5009 displayid = drm_find_displayid_extension(edid); in add_displayid_detailed_modes()
5035 struct edid *edid, u8 *t) in mode_in_hsync_range() argument
5040 if (edid->revision >= 4) in mode_in_hsync_range()
5043 if (edid->revision >= 4) in mode_in_hsync_range()
5052 struct edid *edid, u8 *t) in mode_in_vsync_range() argument
5057 if (edid->revision >= 4) in mode_in_vsync_range()
5060 if (edid->revision >= 4) in mode_in_vsync_range()
5068 range_pixel_clock(struct edid *edid, u8 *t) in range_pixel_clock() argument
5075 if (edid->revision >= 4 && t[10] == 0x04) in range_pixel_clock()
5083 mode_in_range(const struct drm_display_mode *mode, struct edid *edid, in mode_in_range() argument
5089 if (!mode_in_hsync_range(mode, edid, t)) in mode_in_range()
5092 if (!mode_in_vsync_range(mode, edid, t)) in mode_in_range()
5095 max_clock = range_pixel_clock(edid, t); in mode_in_range()
5101 if (edid->revision >= 4 && t[10] == 0x04) in mode_in_range()
5106 if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid)) in mode_in_range()
5133 drm_dmt_modes_for_range(struct hdmi_edid_data *data, struct edid *edid, in drm_dmt_modes_for_range() argument
5139 if (mode_in_range(drm_dmt_modes + i, edid, timing) && in drm_dmt_modes_for_range()
5162 drm_gtf_modes_for_range(struct hdmi_edid_data *data, struct edid *edid, in drm_gtf_modes_for_range() argument
5176 if (!mode_in_range(newmode, edid, timing) || in drm_gtf_modes_for_range()
5191 drm_cvt_modes_for_range(struct hdmi_edid_data *data, struct edid *edid, in drm_cvt_modes_for_range() argument
5196 bool rb = drm_monitor_supports_rb(edid); in drm_cvt_modes_for_range()
5206 if (!mode_in_range(newmode, edid, timing) || in drm_cvt_modes_for_range()
5231 closure->edid, in do_inferred_modes()
5234 if (!version_greater(closure->edid, 1, 1)) in do_inferred_modes()
5241 closure->edid, in do_inferred_modes()
5245 if (!version_greater(closure->edid, 1, 3)) in do_inferred_modes()
5249 closure->edid, in do_inferred_modes()
5259 add_inferred_modes(struct hdmi_edid_data *data, struct edid *edid) in add_inferred_modes() argument
5263 .edid = edid, in add_inferred_modes()
5266 if (version_greater(edid, 1, 0)) in add_inferred_modes()
5267 drm_for_each_detailed_block((u8 *)edid, do_inferred_modes, in add_inferred_modes()
5278 * @data: the structure that save parsed hdmi edid data
5333 * drm_edid_header_is_valid - sanity check the header of the base EDID block
5334 * @raw_edid: pointer to raw base EDID block
5336 * Sanity check the header of the base EDID block.
5371 * drm_edid_block_valid - Sanity check the EDID block (base or extension)
5372 * @raw_edid: pointer to raw EDID block
5374 * @print_bad_edid: if true, dump bad EDID blocks to the console
5377 * Validate a base or extension EDID block and optionally dump bad blocks to
5388 struct edid *edid = (struct edid *)raw_edid; in drm_edid_block_valid() local
5419 debug("EDID checksum is invalid, remainder is %d\n", in drm_edid_block_valid()
5434 if (edid->version != 1) { in drm_edid_block_valid()
5435 debug("EDID has major version %d, instead of 1\n", in drm_edid_block_valid()
5436 edid->version); in drm_edid_block_valid()
5440 if (edid->revision > 4) in drm_edid_block_valid()
5453 debug("EDID block is all zeroes\n"); in drm_edid_block_valid()
5455 debug("Raw EDID:\n"); in drm_edid_block_valid()
5464 * drm_edid_is_valid - sanity check EDID data
5465 * @edid: EDID data
5467 * Sanity-check an entire EDID record (including extensions)
5469 * Return: True if the EDID data is valid, false otherwise.
5471 static bool drm_edid_is_valid(struct edid *edid) in drm_edid_is_valid() argument
5474 u8 *raw = (u8 *)edid; in drm_edid_is_valid()
5476 if (!edid) in drm_edid_is_valid()
5479 for (i = 0; i <= edid->extensions; i++) in drm_edid_is_valid()
5487 * drm_add_edid_modes - add modes from EDID data, if available
5489 * @edid: EDID data
5499 struct edid *edid = (struct edid *)raw_edid; in drm_add_edid_modes() local
5501 if (!edid) { in drm_add_edid_modes()
5502 debug("no edid\n"); in drm_add_edid_modes()
5506 if (!drm_edid_is_valid(edid)) { in drm_add_edid_modes()
5507 debug("EDID invalid\n"); in drm_add_edid_modes()
5516 quirks = edid_get_quirks(edid); in drm_add_edid_modes()
5522 drm_add_display_info(data, edid); in drm_add_edid_modes()
5525 * EDID spec says modes should be preferred in this order: in drm_add_edid_modes()
5538 num_modes += add_detailed_modes(data, edid, quirks); in drm_add_edid_modes()
5539 num_modes += add_cvt_modes(data, edid); in drm_add_edid_modes()
5540 num_modes += add_standard_modes(data, edid); in drm_add_edid_modes()
5541 num_modes += add_established_modes(data, edid); in drm_add_edid_modes()
5542 num_modes += add_cea_modes(data, edid); in drm_add_edid_modes()
5543 num_modes += add_alternate_cea_modes(data, edid); in drm_add_edid_modes()
5544 num_modes += add_displayid_detailed_modes(data, edid); in drm_add_edid_modes()
5546 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in drm_add_edid_modes()
5547 num_modes += add_inferred_modes(data, edid); in drm_add_edid_modes()
6814 * drm_do_probe_ddc_edid() - get EDID information via I2C
6816 * @buf: EDID data buffer to be filled
6817 * @block: 128 byte EDID block to start fetching from
6818 * @len: EDID data buffer length to fetch
6820 * Try to fetch EDID information by calling I2C driver functions.
6867 int drm_do_get_edid(struct ddc_adapter *adap, u8 *edid) in drm_do_get_edid() argument
6877 if (drm_do_probe_ddc_edid(adap, edid, 0, HDMI_EDID_BLOCK_SIZE)) in drm_do_get_edid()
6879 if (drm_edid_block_valid(edid, 0, true, in drm_do_get_edid()
6882 if (i == 0 && drm_edid_is_zero(edid, HDMI_EDID_BLOCK_SIZE)) { in drm_do_get_edid()
6883 printf("edid base block is 0, get edid failed\n"); in drm_do_get_edid()
6893 block_num = edid[0x7e]; in drm_do_get_edid()
6897 if (drm_do_probe_ddc_edid(adap, &edid[0x80 * j], j, in drm_do_get_edid()
6900 if (drm_edid_block_valid(&edid[0x80 * j], j, in drm_do_get_edid()
6911 printf("RAW EDID:\n"); in drm_do_get_edid()
6913 buff = &edid[0x80 * i]; in drm_do_get_edid()
6926 printf("can't get edid block:%d\n", block); in drm_do_get_edid()
6927 /* clear all read edid block, include invalid block */ in drm_do_get_edid()
6928 memset(edid, 0, HDMI_EDID_BLOCK_SIZE * (block + 1)); in drm_do_get_edid()