Lines Matching refs:edid
44 #define version_greater(edid, maj, min) \ argument
45 (((edid)->version > (maj)) || \
46 ((edid)->version == (maj) && (edid)->revision > (min)))
90 struct edid *edid; member
1323 struct edid *edid);
1359 struct edid *edid = (struct edid *)raw_edid; in drm_edid_block_valid() local
1409 if (edid->version != 1) { in drm_edid_block_valid()
1410 DRM_NOTE("EDID has major version %d, instead of 1\n", edid->version); in drm_edid_block_valid()
1414 if (edid->revision > 4) in drm_edid_block_valid()
1447 bool drm_edid_is_valid(struct edid *edid) in drm_edid_is_valid() argument
1450 u8 *raw = (u8 *)edid; in drm_edid_is_valid()
1452 if (!edid) in drm_edid_is_valid()
1455 for (i = 0; i <= edid->extensions; i++) in drm_edid_is_valid()
1528 u8 *edid, int num_blocks) in connector_bad_edid() argument
1539 u8 *block = edid + i * EDID_LENGTH; in connector_bad_edid()
1575 struct edid *drm_do_get_edid(struct drm_connector *connector, in drm_do_get_edid()
1581 u8 *edid, *new; in drm_do_get_edid() local
1582 struct edid *override = NULL; in drm_do_get_edid()
1593 if ((edid = kmalloc(EDID_LENGTH, GFP_KERNEL)) == NULL) in drm_do_get_edid()
1598 if (get_edid_block(data, edid, 0, EDID_LENGTH)) in drm_do_get_edid()
1600 if (drm_edid_block_valid(edid, 0, false, in drm_do_get_edid()
1603 if (i == 0 && drm_edid_is_zero(edid, EDID_LENGTH)) { in drm_do_get_edid()
1612 valid_extensions = edid[0x7e]; in drm_do_get_edid()
1614 return (struct edid *)edid; in drm_do_get_edid()
1616 new = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL); in drm_do_get_edid()
1619 edid = new; in drm_do_get_edid()
1621 for (j = 1; j <= edid[0x7e]; j++) { in drm_do_get_edid()
1622 u8 *block = edid + j * EDID_LENGTH; in drm_do_get_edid()
1635 if (valid_extensions != edid[0x7e]) { in drm_do_get_edid()
1638 connector_bad_edid(connector, edid, edid[0x7e] + 1); in drm_do_get_edid()
1640 edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions; in drm_do_get_edid()
1641 edid[0x7e] = valid_extensions; in drm_do_get_edid()
1649 for (i = 0; i <= edid[0x7e]; i++) { in drm_do_get_edid()
1650 u8 *block = edid + i * EDID_LENGTH; in drm_do_get_edid()
1659 kfree(edid); in drm_do_get_edid()
1660 edid = new; in drm_do_get_edid()
1663 return (struct edid *)edid; in drm_do_get_edid()
1666 connector_bad_edid(connector, edid, 1); in drm_do_get_edid()
1668 kfree(edid); in drm_do_get_edid()
1698 struct edid *drm_get_edid(struct drm_connector *connector, in drm_get_edid()
1701 struct edid *edid; in drm_get_edid() local
1709 edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); in drm_get_edid()
1710 if (edid) in drm_get_edid()
1711 drm_get_displayid(connector, edid); in drm_get_edid()
1712 return edid; in drm_get_edid()
1727 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector, in drm_get_edid_switcheroo()
1731 struct edid *edid; in drm_get_edid_switcheroo() local
1734 edid = drm_get_edid(connector, adapter); in drm_get_edid_switcheroo()
1737 return edid; in drm_get_edid_switcheroo()
1747 struct edid *drm_edid_duplicate(const struct edid *edid) in drm_edid_duplicate() argument
1749 return kmemdup(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL); in drm_edid_duplicate()
1762 static bool edid_vendor(const struct edid *edid, const char *vendor) in edid_vendor() argument
1766 edid_vendor[0] = ((edid->mfg_id[0] & 0x7c) >> 2) + '@'; in edid_vendor()
1767 edid_vendor[1] = (((edid->mfg_id[0] & 0x3) << 3) | in edid_vendor()
1768 ((edid->mfg_id[1] & 0xe0) >> 5)) + '@'; in edid_vendor()
1769 edid_vendor[2] = (edid->mfg_id[1] & 0x1f) + '@'; in edid_vendor()
1780 static u32 edid_get_quirks(const struct edid *edid) in edid_get_quirks() argument
1788 if (edid_vendor(edid, quirk->vendor) && in edid_get_quirks()
1789 (EDID_PRODUCT_ID(edid) == quirk->product_id)) in edid_get_quirks()
1926 struct edid *edid = (struct edid *)raw_edid; in drm_for_each_detailed_block() local
1928 if (edid == NULL) in drm_for_each_detailed_block()
1932 cb(&(edid->detailed_timings[i]), closure); in drm_for_each_detailed_block()
1960 drm_monitor_supports_rb(struct edid *edid) in drm_monitor_supports_rb() argument
1962 if (edid->revision >= 4) { in drm_monitor_supports_rb()
1964 drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); in drm_monitor_supports_rb()
1968 return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); in drm_monitor_supports_rb()
1981 drm_gtf2_hbreak(struct edid *edid) in drm_gtf2_hbreak() argument
1984 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_hbreak()
1989 drm_gtf2_2c(struct edid *edid) in drm_gtf2_2c() argument
1992 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2c()
1997 drm_gtf2_m(struct edid *edid) in drm_gtf2_m() argument
2000 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_m()
2005 drm_gtf2_k(struct edid *edid) in drm_gtf2_k() argument
2008 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_k()
2013 drm_gtf2_2j(struct edid *edid) in drm_gtf2_2j() argument
2016 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2j()
2024 static int standard_timing_level(struct edid *edid) in standard_timing_level() argument
2026 if (edid->revision >= 2) { in standard_timing_level()
2027 if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) in standard_timing_level()
2029 if (drm_gtf2_hbreak(edid)) in standard_timing_level()
2058 drm_mode_std(struct drm_connector *connector, struct edid *edid, in drm_mode_std() argument
2069 int timing_level = standard_timing_level(edid); in drm_mode_std()
2080 if (edid->revision < 3) in drm_mode_std()
2123 if (drm_monitor_supports_rb(edid)) { in drm_mode_std()
2149 if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { in drm_mode_std()
2153 drm_gtf2_m(edid), in drm_mode_std()
2154 drm_gtf2_2c(edid), in drm_mode_std()
2155 drm_gtf2_k(edid), in drm_mode_std()
2156 drm_gtf2_2j(edid)); in drm_mode_std()
2220 struct edid *edid, in drm_mode_detailed() argument
2308 mode->width_mm = edid->width_cm * 10; in drm_mode_detailed()
2309 mode->height_mm = edid->height_cm * 10; in drm_mode_detailed()
2321 struct edid *edid, u8 *t) in mode_in_hsync_range() argument
2326 if (edid->revision >= 4) in mode_in_hsync_range()
2329 if (edid->revision >= 4) in mode_in_hsync_range()
2338 struct edid *edid, u8 *t) in mode_in_vsync_range() argument
2343 if (edid->revision >= 4) in mode_in_vsync_range()
2346 if (edid->revision >= 4) in mode_in_vsync_range()
2354 range_pixel_clock(struct edid *edid, u8 *t) in range_pixel_clock() argument
2361 if (edid->revision >= 4 && t[10] == 0x04) in range_pixel_clock()
2369 mode_in_range(const struct drm_display_mode *mode, struct edid *edid, in mode_in_range() argument
2375 if (!mode_in_hsync_range(mode, edid, t)) in mode_in_range()
2378 if (!mode_in_vsync_range(mode, edid, t)) in mode_in_range()
2381 if ((max_clock = range_pixel_clock(edid, t))) in mode_in_range()
2386 if (edid->revision >= 4 && t[10] == 0x04) in mode_in_range()
2390 if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid)) in mode_in_range()
2415 drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_dmt_modes_for_range() argument
2423 if (mode_in_range(drm_dmt_modes + i, edid, timing) && in drm_dmt_modes_for_range()
2450 drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_gtf_modes_for_range() argument
2464 if (!mode_in_range(newmode, edid, timing) || in drm_gtf_modes_for_range()
2478 drm_cvt_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_cvt_modes_for_range() argument
2484 bool rb = drm_monitor_supports_rb(edid); in drm_cvt_modes_for_range()
2493 if (!mode_in_range(newmode, edid, timing) || in drm_cvt_modes_for_range()
2517 closure->edid, in do_inferred_modes()
2520 if (!version_greater(closure->edid, 1, 1)) in do_inferred_modes()
2527 closure->edid, in do_inferred_modes()
2531 if (!version_greater(closure->edid, 1, 3)) in do_inferred_modes()
2535 closure->edid, in do_inferred_modes()
2545 add_inferred_modes(struct drm_connector *connector, struct edid *edid) in add_inferred_modes() argument
2549 .edid = edid, in add_inferred_modes()
2552 if (version_greater(edid, 1, 0)) in add_inferred_modes()
2553 drm_for_each_detailed_block((u8 *)edid, do_inferred_modes, in add_inferred_modes()
2607 add_established_modes(struct drm_connector *connector, struct edid *edid) in add_established_modes() argument
2610 unsigned long est_bits = edid->established_timings.t1 | in add_established_modes()
2611 (edid->established_timings.t2 << 8) | in add_established_modes()
2612 ((edid->established_timings.mfg_rsvd & 0x80) << 9); in add_established_modes()
2616 .edid = edid, in add_established_modes()
2630 if (version_greater(edid, 1, 0)) in add_established_modes()
2631 drm_for_each_detailed_block((u8 *)edid, in add_established_modes()
2643 struct edid *edid = closure->edid; in do_standard_modes() local
2652 newmode = drm_mode_std(connector, edid, std); in do_standard_modes()
2670 add_standard_modes(struct drm_connector *connector, struct edid *edid) in add_standard_modes() argument
2675 .edid = edid, in add_standard_modes()
2681 newmode = drm_mode_std(connector, edid, in add_standard_modes()
2682 &edid->standard_timings[i]); in add_standard_modes()
2689 if (version_greater(edid, 1, 0)) in add_standard_modes()
2690 drm_for_each_detailed_block((u8 *)edid, do_standard_modes, in add_standard_modes()
2758 add_cvt_modes(struct drm_connector *connector, struct edid *edid) in add_cvt_modes() argument
2762 .edid = edid, in add_cvt_modes()
2765 if (version_greater(edid, 1, 2)) in add_cvt_modes()
2766 drm_for_each_detailed_block((u8 *)edid, do_cvt_mode, &closure); in add_cvt_modes()
2783 closure->edid, timing, in do_detailed_mode()
2811 add_detailed_modes(struct drm_connector *connector, struct edid *edid, in add_detailed_modes() argument
2816 .edid = edid, in add_detailed_modes()
2821 if (closure.preferred && !version_greater(edid, 1, 3)) in add_detailed_modes()
2823 (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); in add_detailed_modes()
2825 drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure); in add_detailed_modes()
2846 static u8 *drm_find_edid_extension(const struct edid *edid, int ext_id) in drm_find_edid_extension() argument
2852 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension()
2856 for (i = 0; i < edid->extensions; i++) { in drm_find_edid_extension()
2857 edid_ext = (u8 *)edid + EDID_LENGTH * (i + 1); in drm_find_edid_extension()
2862 if (i == edid->extensions) in drm_find_edid_extension()
2868 static u8 *drm_find_cea_extension(const struct edid *edid) in drm_find_cea_extension() argument
2870 return drm_find_edid_extension(edid, CEA_EXT); in drm_find_cea_extension()
2873 static u8 *drm_find_displayid_extension(const struct edid *edid) in drm_find_displayid_extension() argument
2875 return drm_find_edid_extension(edid, DISPLAYID_EXT); in drm_find_displayid_extension()
3112 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid) in add_alternate_cea_modes() argument
3120 if (!drm_find_cea_extension(edid)) in add_alternate_cea_modes()
3713 add_cea_modes(struct drm_connector *connector, struct edid *edid) in add_cea_modes() argument
3715 const u8 *cea = drm_find_cea_extension(edid); in add_cea_modes()
3840 static int get_monitor_name(struct edid *edid, char name[13]) in get_monitor_name() argument
3845 if (!edid || !name) in get_monitor_name()
3848 drm_for_each_detailed_block((u8 *)edid, monitor_name, &edid_name); in get_monitor_name()
3866 void drm_edid_get_monitor_name(struct edid *edid, char *name, int bufsize) in drm_edid_get_monitor_name() argument
3874 name_length = min(get_monitor_name(edid, buf), bufsize - 1); in drm_edid_get_monitor_name()
3900 static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) in drm_edid_to_eld() argument
3911 if (!edid) in drm_edid_to_eld()
3914 cea = drm_find_cea_extension(edid); in drm_edid_to_eld()
3920 mnl = get_monitor_name(edid, &eld[DRM_ELD_MONITOR_NAME_STRING]); in drm_edid_to_eld()
3928 eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0]; in drm_edid_to_eld()
3929 eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1]; in drm_edid_to_eld()
3930 eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0]; in drm_edid_to_eld()
3931 eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1]; in drm_edid_to_eld()
3997 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads) in drm_edid_to_sad() argument
4003 cea = drm_find_cea_extension(edid); in drm_edid_to_sad()
4058 int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb) in drm_edid_to_speaker_allocation() argument
4064 cea = drm_find_cea_extension(edid); in drm_edid_to_speaker_allocation()
4150 bool drm_detect_hdmi_monitor(struct edid *edid) in drm_detect_hdmi_monitor() argument
4156 edid_ext = drm_find_cea_extension(edid); in drm_detect_hdmi_monitor()
4188 bool drm_detect_monitor_audio(struct edid *edid) in drm_detect_monitor_audio() argument
4195 edid_ext = drm_find_cea_extension(edid); in drm_detect_monitor_audio()
4233 bool drm_rgb_quant_range_selectable(struct edid *edid) in drm_rgb_quant_range_selectable() argument
4238 edid_ext = drm_find_cea_extension(edid); in drm_rgb_quant_range_selectable()
4421 const struct edid *edid) in drm_parse_cea_ext() argument
4427 edid_ext = drm_find_cea_extension(edid); in drm_parse_cea_ext()
4477 u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid) in drm_add_display_info() argument
4481 u32 quirks = edid_get_quirks(edid); in drm_add_display_info()
4485 info->width_mm = edid->width_cm * 10; in drm_add_display_info()
4486 info->height_mm = edid->height_cm * 10; in drm_add_display_info()
4492 if (edid->revision < 3) in drm_add_display_info()
4495 if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) in drm_add_display_info()
4498 drm_parse_cea_ext(connector, edid); in drm_add_display_info()
4507 if ((info->bpc == 0) && (edid->revision < 4) && in drm_add_display_info()
4508 (edid->input & DRM_EDID_DIGITAL_TYPE_DVI)) { in drm_add_display_info()
4515 if (edid->revision < 4) in drm_add_display_info()
4518 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { in drm_add_display_info()
4547 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444) in drm_add_display_info()
4549 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422) in drm_add_display_info()
4649 struct edid *edid) in add_displayid_detailed_modes() argument
4658 displayid = drm_find_displayid_extension(edid); in add_displayid_detailed_modes()
4692 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) in drm_add_edid_modes() argument
4697 if (edid == NULL) { in drm_add_edid_modes()
4701 if (!drm_edid_is_valid(edid)) { in drm_add_edid_modes()
4708 drm_edid_to_eld(connector, edid); in drm_add_edid_modes()
4715 quirks = drm_add_display_info(connector, edid); in drm_add_edid_modes()
4731 num_modes += add_detailed_modes(connector, edid, quirks); in drm_add_edid_modes()
4732 num_modes += add_cvt_modes(connector, edid); in drm_add_edid_modes()
4733 num_modes += add_standard_modes(connector, edid); in drm_add_edid_modes()
4734 num_modes += add_established_modes(connector, edid); in drm_add_edid_modes()
4735 num_modes += add_cea_modes(connector, edid); in drm_add_edid_modes()
4736 num_modes += add_alternate_cea_modes(connector, edid); in drm_add_edid_modes()
4737 num_modes += add_displayid_detailed_modes(connector, edid); in drm_add_edid_modes()
4738 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in drm_add_edid_modes()
4739 num_modes += add_inferred_modes(connector, edid); in drm_add_edid_modes()
5163 struct edid *edid) in drm_get_displayid() argument
5168 displayid = drm_find_displayid_extension(edid); in drm_get_displayid()