Lines Matching refs:edid
49 #define version_greater(edid, maj, min) \ argument
50 (((edid)->version > (maj)) || \
51 ((edid)->version == (maj) && (edid)->revision > (min)))
98 struct edid *edid; member
1636 bool drm_edid_are_equal(const struct edid *edid1, const struct edid *edid2) in drm_edid_are_equal()
1676 struct edid *edid = (struct edid *)raw_edid; in drm_edid_block_valid() local
1727 if (edid->version != 1) { in drm_edid_block_valid()
1728 DRM_NOTE("EDID has major version %d, instead of 1\n", edid->version); in drm_edid_block_valid()
1732 if (edid->revision > 4) in drm_edid_block_valid()
1765 bool drm_edid_is_valid(struct edid *edid) in drm_edid_is_valid() argument
1768 u8 *raw = (u8 *)edid; in drm_edid_is_valid()
1770 if (!edid) in drm_edid_is_valid()
1773 for (i = 0; i <= edid->extensions; i++) in drm_edid_is_valid()
1846 u8 *edid, int num_blocks) in connector_bad_edid() argument
1857 last_block = edid[0x7e]; in connector_bad_edid()
1862 drm_edid_block_checksum(edid + last_block * EDID_LENGTH); in connector_bad_edid()
1869 u8 *block = edid + i * EDID_LENGTH; in connector_bad_edid()
1886 static struct edid *drm_get_override_edid(struct drm_connector *connector) in drm_get_override_edid()
1888 struct edid *override = NULL; in drm_get_override_edid()
1912 struct edid *override; in drm_add_override_edid_modes()
1929 static struct edid *drm_do_get_edid_base_block(struct drm_connector *connector, in drm_do_get_edid_base_block()
1936 void *edid; in drm_do_get_edid_base_block() local
1939 edid = kmalloc(EDID_LENGTH, GFP_KERNEL); in drm_do_get_edid_base_block()
1940 if (edid == NULL) in drm_do_get_edid_base_block()
1945 if (get_edid_block(data, edid, 0, EDID_LENGTH)) in drm_do_get_edid_base_block()
1947 if (drm_edid_block_valid(edid, 0, false, edid_corrupt)) in drm_do_get_edid_base_block()
1949 if (i == 0 && drm_edid_is_zero(edid, EDID_LENGTH)) { in drm_do_get_edid_base_block()
1958 return edid; in drm_do_get_edid_base_block()
1962 connector_bad_edid(connector, edid, 1); in drm_do_get_edid_base_block()
1964 kfree(edid); in drm_do_get_edid_base_block()
1988 struct edid *drm_do_get_edid(struct drm_connector *connector, in drm_do_get_edid()
1994 u8 *edid, *new; in drm_do_get_edid() local
1995 struct edid *override; in drm_do_get_edid()
2001 edid = (u8 *)drm_do_get_edid_base_block(connector, get_edid_block, data); in drm_do_get_edid()
2002 if (!edid) in drm_do_get_edid()
2006 valid_extensions = edid[0x7e]; in drm_do_get_edid()
2008 return (struct edid *)edid; in drm_do_get_edid()
2010 new = krealloc(edid, (valid_extensions + 1) * EDID_LENGTH, GFP_KERNEL); in drm_do_get_edid()
2013 edid = new; in drm_do_get_edid()
2015 for (j = 1; j <= edid[0x7e]; j++) { in drm_do_get_edid()
2016 u8 *block = edid + j * EDID_LENGTH; in drm_do_get_edid()
2029 if (valid_extensions != edid[0x7e]) { in drm_do_get_edid()
2032 connector_bad_edid(connector, edid, edid[0x7e] + 1); in drm_do_get_edid()
2034 edid[EDID_LENGTH-1] += edid[0x7e] - valid_extensions; in drm_do_get_edid()
2035 edid[0x7e] = valid_extensions; in drm_do_get_edid()
2043 for (i = 0; i <= edid[0x7e]; i++) { in drm_do_get_edid()
2044 u8 *block = edid + i * EDID_LENGTH; in drm_do_get_edid()
2053 kfree(edid); in drm_do_get_edid()
2054 edid = new; in drm_do_get_edid()
2057 return (struct edid *)edid; in drm_do_get_edid()
2060 kfree(edid); in drm_do_get_edid()
2090 struct edid *drm_get_edid(struct drm_connector *connector, in drm_get_edid()
2093 struct edid *edid; in drm_get_edid() local
2101 edid = drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter); in drm_get_edid()
2102 drm_connector_update_edid_property(connector, edid); in drm_get_edid()
2103 return edid; in drm_get_edid()
2107 static u32 edid_extract_panel_id(const struct edid *edid) in edid_extract_panel_id() argument
2122 return (u32)edid->mfg_id[0] << 24 | in edid_extract_panel_id()
2123 (u32)edid->mfg_id[1] << 16 | in edid_extract_panel_id()
2124 (u32)EDID_PRODUCT_ID(edid); in edid_extract_panel_id()
2153 struct edid *edid; in drm_edid_get_panel_id() local
2156 edid = drm_do_get_edid_base_block(NULL, drm_do_probe_ddc_edid, adapter); in drm_edid_get_panel_id()
2162 if (!edid) in drm_edid_get_panel_id()
2165 panel_id = edid_extract_panel_id(edid); in drm_edid_get_panel_id()
2166 kfree(edid); in drm_edid_get_panel_id()
2183 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector, in drm_get_edid_switcheroo()
2188 struct edid *edid; in drm_get_edid_switcheroo() local
2194 edid = drm_get_edid(connector, adapter); in drm_get_edid_switcheroo()
2197 return edid; in drm_get_edid_switcheroo()
2207 struct edid *drm_edid_duplicate(const struct edid *edid) in drm_edid_duplicate() argument
2209 return kmemdup(edid, (edid->extensions + 1) * EDID_LENGTH, GFP_KERNEL); in drm_edid_duplicate()
2221 static u32 edid_get_quirks(const struct edid *edid) in edid_get_quirks() argument
2223 u32 panel_id = edid_extract_panel_id(edid); in edid_get_quirks()
2379 struct edid *edid = (struct edid *)raw_edid; in drm_for_each_detailed_block() local
2381 if (edid == NULL) in drm_for_each_detailed_block()
2385 cb(&(edid->detailed_timings[i]), closure); in drm_for_each_detailed_block()
2417 drm_monitor_supports_rb(struct edid *edid) in drm_monitor_supports_rb() argument
2419 if (edid->revision >= 4) { in drm_monitor_supports_rb()
2422 drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); in drm_monitor_supports_rb()
2426 return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); in drm_monitor_supports_rb()
2443 drm_gtf2_hbreak(struct edid *edid) in drm_gtf2_hbreak() argument
2447 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_hbreak()
2452 drm_gtf2_2c(struct edid *edid) in drm_gtf2_2c() argument
2456 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2c()
2461 drm_gtf2_m(struct edid *edid) in drm_gtf2_m() argument
2465 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_m()
2470 drm_gtf2_k(struct edid *edid) in drm_gtf2_k() argument
2474 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_k()
2479 drm_gtf2_2j(struct edid *edid) in drm_gtf2_2j() argument
2483 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2j()
2491 static int standard_timing_level(struct edid *edid) in standard_timing_level() argument
2493 if (edid->revision >= 2) { in standard_timing_level()
2494 if (edid->revision >= 4 && (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) in standard_timing_level()
2496 if (drm_gtf2_hbreak(edid)) in standard_timing_level()
2498 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in standard_timing_level()
2534 drm_mode_std(struct drm_connector *connector, struct edid *edid, in drm_mode_std() argument
2545 int timing_level = standard_timing_level(edid); in drm_mode_std()
2556 if (edid->revision < 3) in drm_mode_std()
2599 if (drm_monitor_supports_rb(edid)) { in drm_mode_std()
2625 if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { in drm_mode_std()
2629 drm_gtf2_m(edid), in drm_mode_std()
2630 drm_gtf2_2c(edid), in drm_mode_std()
2631 drm_gtf2_k(edid), in drm_mode_std()
2632 drm_gtf2_2j(edid)); in drm_mode_std()
2696 struct edid *edid, in drm_mode_detailed() argument
2784 mode->width_mm = edid->width_cm * 10; in drm_mode_detailed()
2785 mode->height_mm = edid->height_cm * 10; in drm_mode_detailed()
2796 struct edid *edid, u8 *t) in mode_in_hsync_range() argument
2801 if (edid->revision >= 4) in mode_in_hsync_range()
2804 if (edid->revision >= 4) in mode_in_hsync_range()
2813 struct edid *edid, u8 *t) in mode_in_vsync_range() argument
2818 if (edid->revision >= 4) in mode_in_vsync_range()
2821 if (edid->revision >= 4) in mode_in_vsync_range()
2829 range_pixel_clock(struct edid *edid, u8 *t) in range_pixel_clock() argument
2836 if (edid->revision >= 4 && t[10] == 0x04) in range_pixel_clock()
2844 mode_in_range(const struct drm_display_mode *mode, struct edid *edid, in mode_in_range() argument
2850 if (!mode_in_hsync_range(mode, edid, t)) in mode_in_range()
2853 if (!mode_in_vsync_range(mode, edid, t)) in mode_in_range()
2856 if ((max_clock = range_pixel_clock(edid, t))) in mode_in_range()
2861 if (edid->revision >= 4 && t[10] == 0x04) in mode_in_range()
2865 if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid)) in mode_in_range()
2890 drm_dmt_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_dmt_modes_for_range() argument
2898 if (mode_in_range(drm_dmt_modes + i, edid, timing) && in drm_dmt_modes_for_range()
2925 drm_gtf_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_gtf_modes_for_range() argument
2940 if (!mode_in_range(newmode, edid, timing) || in drm_gtf_modes_for_range()
2954 drm_cvt_modes_for_range(struct drm_connector *connector, struct edid *edid, in drm_cvt_modes_for_range() argument
2960 bool rb = drm_monitor_supports_rb(edid); in drm_cvt_modes_for_range()
2970 if (!mode_in_range(newmode, edid, timing) || in drm_cvt_modes_for_range()
2994 closure->edid, in do_inferred_modes()
2997 if (!version_greater(closure->edid, 1, 1)) in do_inferred_modes()
3004 closure->edid, in do_inferred_modes()
3008 if (!version_greater(closure->edid, 1, 3)) in do_inferred_modes()
3012 closure->edid, in do_inferred_modes()
3022 add_inferred_modes(struct drm_connector *connector, struct edid *edid) in add_inferred_modes() argument
3026 .edid = edid, in add_inferred_modes()
3029 if (version_greater(edid, 1, 0)) in add_inferred_modes()
3030 drm_for_each_detailed_block((u8 *)edid, do_inferred_modes, in add_inferred_modes()
3085 add_established_modes(struct drm_connector *connector, struct edid *edid) in add_established_modes() argument
3088 unsigned long est_bits = edid->established_timings.t1 | in add_established_modes()
3089 (edid->established_timings.t2 << 8) | in add_established_modes()
3090 ((edid->established_timings.mfg_rsvd & 0x80) << 9); in add_established_modes()
3094 .edid = edid, in add_established_modes()
3109 if (version_greater(edid, 1, 0)) in add_established_modes()
3110 drm_for_each_detailed_block((u8 *)edid, in add_established_modes()
3122 struct edid *edid = closure->edid; in do_standard_modes() local
3132 newmode = drm_mode_std(connector, edid, std); in do_standard_modes()
3149 add_standard_modes(struct drm_connector *connector, struct edid *edid) in add_standard_modes() argument
3154 .edid = edid, in add_standard_modes()
3160 newmode = drm_mode_std(connector, edid, in add_standard_modes()
3161 &edid->standard_timings[i]); in add_standard_modes()
3168 if (version_greater(edid, 1, 0)) in add_standard_modes()
3169 drm_for_each_detailed_block((u8 *)edid, do_standard_modes, in add_standard_modes()
3241 add_cvt_modes(struct drm_connector *connector, struct edid *edid) in add_cvt_modes() argument
3245 .edid = edid, in add_cvt_modes()
3248 if (version_greater(edid, 1, 2)) in add_cvt_modes()
3249 drm_for_each_detailed_block((u8 *)edid, do_cvt_mode, &closure); in add_cvt_modes()
3268 closure->edid, timing, in do_detailed_mode()
3295 add_detailed_modes(struct drm_connector *connector, struct edid *edid, in add_detailed_modes() argument
3300 .edid = edid, in add_detailed_modes()
3305 if (closure.preferred && !version_greater(edid, 1, 3)) in add_detailed_modes()
3307 (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); in add_detailed_modes()
3309 drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure); in add_detailed_modes()
3331 const u8 *drm_find_edid_extension(const struct edid *edid, in drm_find_edid_extension() argument
3338 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension()
3342 for (i = *ext_index; i < edid->extensions; i++) { in drm_find_edid_extension()
3343 edid_ext = (const u8 *)edid + EDID_LENGTH * (i + 1); in drm_find_edid_extension()
3348 if (i >= edid->extensions) in drm_find_edid_extension()
3356 static const u8 *drm_find_cea_extension(const struct edid *edid) in drm_find_cea_extension() argument
3365 cea = drm_find_edid_extension(edid, CEA_EXT, &ext_index); in drm_find_cea_extension()
3370 displayid_iter_edid_begin(edid, &iter); in drm_find_cea_extension()
3641 add_alternate_cea_modes(struct drm_connector *connector, struct edid *edid) in add_alternate_cea_modes() argument
3649 if (!drm_find_cea_extension(edid)) in add_alternate_cea_modes()
4311 add_cea_modes(struct drm_connector *connector, struct edid *edid) in add_cea_modes() argument
4313 const u8 *cea = drm_find_cea_extension(edid); in add_cea_modes()
4489 static int get_monitor_name(struct edid *edid, char name[13]) in get_monitor_name() argument
4494 if (!edid || !name) in get_monitor_name()
4497 drm_for_each_detailed_block((u8 *)edid, monitor_name, &edid_name); in get_monitor_name()
4515 void drm_edid_get_monitor_name(struct edid *edid, char *name, int bufsize) in drm_edid_get_monitor_name() argument
4523 name_length = min(get_monitor_name(edid, buf), bufsize - 1); in drm_edid_get_monitor_name()
4549 static void drm_edid_to_eld(struct drm_connector *connector, struct edid *edid) in drm_edid_to_eld() argument
4560 if (!edid) in drm_edid_to_eld()
4563 cea = drm_find_cea_extension(edid); in drm_edid_to_eld()
4569 mnl = get_monitor_name(edid, &eld[DRM_ELD_MONITOR_NAME_STRING]); in drm_edid_to_eld()
4577 eld[DRM_ELD_MANUFACTURER_NAME0] = edid->mfg_id[0]; in drm_edid_to_eld()
4578 eld[DRM_ELD_MANUFACTURER_NAME1] = edid->mfg_id[1]; in drm_edid_to_eld()
4579 eld[DRM_ELD_PRODUCT_CODE0] = edid->prod_code[0]; in drm_edid_to_eld()
4580 eld[DRM_ELD_PRODUCT_CODE1] = edid->prod_code[1]; in drm_edid_to_eld()
4645 int drm_edid_to_sad(struct edid *edid, struct cea_sad **sads) in drm_edid_to_sad() argument
4651 cea = drm_find_cea_extension(edid); in drm_edid_to_sad()
4707 int drm_edid_to_speaker_allocation(struct edid *edid, u8 **sadb) in drm_edid_to_speaker_allocation() argument
4713 cea = drm_find_cea_extension(edid); in drm_edid_to_speaker_allocation()
4802 bool drm_detect_hdmi_monitor(struct edid *edid) in drm_detect_hdmi_monitor() argument
4808 edid_ext = drm_find_cea_extension(edid); in drm_detect_hdmi_monitor()
4840 bool drm_detect_monitor_audio(struct edid *edid) in drm_detect_monitor_audio() argument
4847 edid_ext = drm_find_cea_extension(edid); in drm_detect_monitor_audio()
5153 const struct edid *edid) in drm_parse_cea_ext() argument
5159 edid_ext = drm_find_cea_extension(edid); in drm_parse_cea_ext()
5217 const struct edid *edid) in drm_get_monitor_range() argument
5221 if (!version_greater(edid, 1, 1)) in drm_get_monitor_range()
5224 drm_for_each_detailed_block((u8 *)edid, get_monitor_range, in drm_get_monitor_range()
5284 static void drm_update_mso(struct drm_connector *connector, const struct edid *edid) in drm_update_mso() argument
5289 displayid_iter_edid_begin(edid, &iter); in drm_update_mso()
5325 u32 drm_add_display_info(struct drm_connector *connector, const struct edid *edid) in drm_add_display_info() argument
5329 u32 quirks = edid_get_quirks(edid); in drm_add_display_info()
5333 info->width_mm = edid->width_cm * 10; in drm_add_display_info()
5334 info->height_mm = edid->height_cm * 10; in drm_add_display_info()
5338 drm_get_monitor_range(connector, edid); in drm_add_display_info()
5342 if (edid->revision < 3) in drm_add_display_info()
5345 if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) in drm_add_display_info()
5348 drm_parse_cea_ext(connector, edid); in drm_add_display_info()
5357 if (info->bpc == 0 && edid->revision == 3 && in drm_add_display_info()
5358 edid->input & DRM_EDID_DIGITAL_DFP_1_X) { in drm_add_display_info()
5365 if (edid->revision < 4) in drm_add_display_info()
5368 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { in drm_add_display_info()
5397 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444) in drm_add_display_info()
5399 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422) in drm_add_display_info()
5402 drm_update_mso(connector, edid); in drm_add_display_info()
5479 struct edid *edid) in add_displayid_detailed_modes() argument
5485 displayid_iter_edid_begin(edid, &iter); in add_displayid_detailed_modes()
5506 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) in drm_add_edid_modes() argument
5511 if (edid == NULL) { in drm_add_edid_modes()
5515 if (!drm_edid_is_valid(edid)) { in drm_add_edid_modes()
5522 drm_edid_to_eld(connector, edid); in drm_add_edid_modes()
5529 quirks = drm_add_display_info(connector, edid); in drm_add_edid_modes()
5545 num_modes += add_detailed_modes(connector, edid, quirks); in drm_add_edid_modes()
5546 num_modes += add_cvt_modes(connector, edid); in drm_add_edid_modes()
5547 num_modes += add_standard_modes(connector, edid); in drm_add_edid_modes()
5548 num_modes += add_established_modes(connector, edid); in drm_add_edid_modes()
5549 num_modes += add_cea_modes(connector, edid); in drm_add_edid_modes()
5550 num_modes += add_alternate_cea_modes(connector, edid); in drm_add_edid_modes()
5551 num_modes += add_displayid_detailed_modes(connector, edid); in drm_add_edid_modes()
5552 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in drm_add_edid_modes()
5553 num_modes += add_inferred_modes(connector, edid); in drm_add_edid_modes()
6125 const struct edid *edid) in drm_update_tile_info() argument
6132 displayid_iter_edid_begin(edid, &iter); in drm_update_tile_info()