Lines Matching refs:edid

36 #define version_greater(edid, maj, min) \  argument
37 (((edid)->version > (maj)) || \
38 ((edid)->version == (maj) && (edid)->revision > (min)))
75 struct edid *edid; member
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()
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()
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()
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()
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()
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()
3369 static int edid_hfeeodb_extension_block_count(const struct edid *edid) in edid_hfeeodb_extension_block_count() argument
3374 if (!edid->extensions) in edid_hfeeodb_extension_block_count()
3378 cta = (u8 *)edid + HDMI_EDID_BLOCK_SIZE * 1; in edid_hfeeodb_extension_block_count()
3397 static int edid_hfeeodb_block_count(const struct edid *edid) in edid_hfeeodb_block_count() argument
3399 int eeodb = edid_hfeeodb_extension_block_count(edid); in edid_hfeeodb_block_count()
3407 static u8 *drm_find_edid_extension(const struct edid *edid, in drm_find_edid_extension() argument
3415 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension()
3418 if (edid_hfeeodb_extension_block_count(edid)) in drm_find_edid_extension()
3419 len = edid_hfeeodb_extension_block_count(edid); in drm_find_edid_extension()
3421 len = edid->extensions; in drm_find_edid_extension()
3425 edid_ext = (u8 *)edid + HDMI_EDID_BLOCK_SIZE * (i + 1); in drm_find_edid_extension()
3436 static u8 *drm_find_cea_extension(struct edid *edid) in drm_find_cea_extension() argument
3438 return drm_find_edid_extension(edid, 0x02); in drm_find_cea_extension()
3455 bool drm_detect_hdmi_monitor(struct edid *edid) in drm_detect_hdmi_monitor() argument
3461 edid_ext = drm_find_cea_extension(edid); in drm_detect_hdmi_monitor()
3492 bool drm_detect_monitor_audio(struct edid *edid) in drm_detect_monitor_audio() argument
3499 edid_ext = drm_find_cea_extension(edid); in drm_detect_monitor_audio()
3560 struct edid *edid) in drm_parse_cea_ext() argument
3566 edid_ext = drm_find_cea_extension(edid); in drm_parse_cea_ext()
3594 static void drm_add_display_info(struct hdmi_edid_data *data, struct edid *edid) in drm_add_display_info() argument
3598 info->width_mm = edid->width_cm * 10; in drm_add_display_info()
3599 info->height_mm = edid->height_cm * 10; in drm_add_display_info()
3611 if (edid->revision < 3) in drm_add_display_info()
3614 if (!(edid->input & DRM_EDID_INPUT_DIGITAL)) in drm_add_display_info()
3617 drm_parse_cea_ext(data, edid); in drm_add_display_info()
3626 if ((info->bpc == 0) && (edid->revision < 4) && in drm_add_display_info()
3627 (edid->input & DRM_EDID_DIGITAL_TYPE_DVI)) { in drm_add_display_info()
3633 if (edid->revision < 4) in drm_add_display_info()
3636 switch (edid->input & DRM_EDID_DIGITAL_DEPTH_MASK) { in drm_add_display_info()
3665 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB444) in drm_add_display_info()
3667 if (edid->features & DRM_EDID_FEATURE_RGB_YCRCB422) in drm_add_display_info()
3674 static u8 *drm_find_edid_extension_from_index(const struct edid *edid, in drm_find_edid_extension_from_index() argument
3682 if (edid == NULL || edid->extensions == 0) in drm_find_edid_extension_from_index()
3685 if (edid_hfeeodb_extension_block_count(edid)) in drm_find_edid_extension_from_index()
3686 len = edid_hfeeodb_extension_block_count(edid); in drm_find_edid_extension_from_index()
3688 len = edid->extensions; in drm_find_edid_extension_from_index()
3692 edid_ext = (u8 *)edid + HDMI_EDID_BLOCK_SIZE * (i + 1); in drm_find_edid_extension_from_index()
3706 int add_cea_modes(struct hdmi_edid_data *data, struct edid *edid) in add_cea_modes() argument
3714 if (edid_hfeeodb_extension_block_count(edid)) in add_cea_modes()
3715 count = edid_hfeeodb_extension_block_count(edid); in add_cea_modes()
3717 count = edid->extensions; in add_cea_modes()
3721 cea = drm_find_edid_extension_from_index(edid, CEA_EXT, &ext_index); in add_cea_modes()
3794 struct edid *edid = (struct edid *)raw_edid; in drm_for_each_detailed_block() local
3796 if (!edid) in drm_for_each_detailed_block()
3800 cb(&edid->detailed_timings[i], closure); in drm_for_each_detailed_block()
3871 struct drm_display_mode *drm_mode_detailed(struct edid *edid, in drm_mode_detailed() argument
4159 closure->edid, timing, in do_detailed_mode()
4187 add_detailed_modes(struct hdmi_edid_data *data, struct edid *edid, in add_detailed_modes() argument
4192 .edid = edid, in add_detailed_modes()
4197 if (closure.preferred && !version_greater(edid, 1, 3)) in add_detailed_modes()
4199 (edid->features & DRM_EDID_FEATURE_PREFERRED_TIMING); in add_detailed_modes()
4201 drm_for_each_detailed_block((u8 *)edid, do_detailed_mode, &closure); in add_detailed_modes()
4267 add_cvt_modes(struct hdmi_edid_data *data, struct edid *edid) in add_cvt_modes() argument
4271 .edid = edid, in add_cvt_modes()
4274 if (version_greater(edid, 1, 2)) in add_cvt_modes()
4275 drm_for_each_detailed_block((u8 *)edid, do_cvt_mode, &closure); in add_cvt_modes()
4293 drm_gtf2_hbreak(struct edid *edid) in drm_gtf2_hbreak() argument
4297 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_hbreak()
4302 drm_gtf2_2c(struct edid *edid) in drm_gtf2_2c() argument
4306 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2c()
4311 drm_gtf2_m(struct edid *edid) in drm_gtf2_m() argument
4315 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_m()
4320 drm_gtf2_k(struct edid *edid) in drm_gtf2_k() argument
4324 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_k()
4329 drm_gtf2_2j(struct edid *edid) in drm_gtf2_2j() argument
4333 drm_for_each_detailed_block((u8 *)edid, find_gtf2, &r); in drm_gtf2_2j()
4341 static int standard_timing_level(struct edid *edid) in standard_timing_level() argument
4343 if (edid->revision >= 2) { in standard_timing_level()
4344 if (edid->revision >= 4 && in standard_timing_level()
4345 (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF)) in standard_timing_level()
4347 if (drm_gtf2_hbreak(edid)) in standard_timing_level()
4378 drm_monitor_supports_rb(struct edid *edid) in drm_monitor_supports_rb() argument
4380 if (edid->revision >= 4) { in drm_monitor_supports_rb()
4383 drm_for_each_detailed_block((u8 *)edid, is_rb, &ret); in drm_monitor_supports_rb()
4387 return ((edid->input & DRM_EDID_INPUT_DIGITAL) != 0); in drm_monitor_supports_rb()
4680 drm_mode_std(struct hdmi_edid_data *data, struct edid *edid, in drm_mode_std() argument
4691 int timing_level = standard_timing_level(edid); in drm_mode_std()
4702 if (edid->revision < 3) in drm_mode_std()
4745 if (drm_monitor_supports_rb(edid)) { in drm_mode_std()
4772 if (drm_mode_hsync(mode) > drm_gtf2_hbreak(edid)) { in drm_mode_std()
4776 drm_gtf2_m(edid), in drm_mode_std()
4777 drm_gtf2_2c(edid), in drm_mode_std()
4778 drm_gtf2_k(edid), in drm_mode_std()
4779 drm_gtf2_2j(edid)); in drm_mode_std()
4796 struct edid *edid = closure->edid; in do_standard_modes() local
4806 newmode = drm_mode_std(closure->data, edid, std); in do_standard_modes()
4825 add_standard_modes(struct hdmi_edid_data *data, struct edid *edid) in add_standard_modes() argument
4830 .edid = edid, in add_standard_modes()
4836 newmode = drm_mode_std(data, edid, in add_standard_modes()
4837 &edid->standard_timings[i]); in add_standard_modes()
4845 if (version_greater(edid, 1, 0)) in add_standard_modes()
4846 drm_for_each_detailed_block((u8 *)edid, do_standard_modes, in add_standard_modes()
4903 add_established_modes(struct hdmi_edid_data *data, struct edid *edid) in add_established_modes() argument
4905 unsigned long est_bits = edid->established_timings.t1 | in add_established_modes()
4906 (edid->established_timings.t2 << 8) | in add_established_modes()
4907 ((edid->established_timings.mfg_rsvd & 0x80) << 9); in add_established_modes()
4911 .edid = edid, in add_established_modes()
4926 if (version_greater(edid, 1, 0)) in add_established_modes()
4927 drm_for_each_detailed_block((u8 *)edid, in add_established_modes()
4957 add_alternate_cea_modes(struct hdmi_edid_data *data, struct edid *edid) in add_alternate_cea_modes() argument
4963 if (!drm_find_cea_extension(edid)) in add_alternate_cea_modes()
5028 static u8 *drm_find_displayid_extension(struct edid *edid) in drm_find_displayid_extension() argument
5030 return drm_find_edid_extension(edid, DISPLAYID_EXT); in drm_find_displayid_extension()
5137 struct edid *edid) in add_displayid_detailed_modes() argument
5146 displayid = drm_find_displayid_extension(edid); in add_displayid_detailed_modes()
5172 struct edid *edid, u8 *t) in mode_in_hsync_range() argument
5177 if (edid->revision >= 4) in mode_in_hsync_range()
5180 if (edid->revision >= 4) in mode_in_hsync_range()
5189 struct edid *edid, u8 *t) in mode_in_vsync_range() argument
5194 if (edid->revision >= 4) in mode_in_vsync_range()
5197 if (edid->revision >= 4) in mode_in_vsync_range()
5205 range_pixel_clock(struct edid *edid, u8 *t) in range_pixel_clock() argument
5212 if (edid->revision >= 4 && t[10] == 0x04) in range_pixel_clock()
5220 mode_in_range(const struct drm_display_mode *mode, struct edid *edid, in mode_in_range() argument
5226 if (!mode_in_hsync_range(mode, edid, t)) in mode_in_range()
5229 if (!mode_in_vsync_range(mode, edid, t)) in mode_in_range()
5232 max_clock = range_pixel_clock(edid, t); in mode_in_range()
5238 if (edid->revision >= 4 && t[10] == 0x04) in mode_in_range()
5243 if (mode_is_rb(mode) && !drm_monitor_supports_rb(edid)) in mode_in_range()
5270 drm_dmt_modes_for_range(struct hdmi_edid_data *data, struct edid *edid, in drm_dmt_modes_for_range() argument
5276 if (mode_in_range(drm_dmt_modes + i, edid, timing) && in drm_dmt_modes_for_range()
5299 drm_gtf_modes_for_range(struct hdmi_edid_data *data, struct edid *edid, in drm_gtf_modes_for_range() argument
5313 if (!mode_in_range(newmode, edid, timing) || in drm_gtf_modes_for_range()
5328 drm_cvt_modes_for_range(struct hdmi_edid_data *data, struct edid *edid, in drm_cvt_modes_for_range() argument
5333 bool rb = drm_monitor_supports_rb(edid); in drm_cvt_modes_for_range()
5343 if (!mode_in_range(newmode, edid, timing) || in drm_cvt_modes_for_range()
5368 closure->edid, in do_inferred_modes()
5371 if (!version_greater(closure->edid, 1, 1)) in do_inferred_modes()
5378 closure->edid, in do_inferred_modes()
5382 if (!version_greater(closure->edid, 1, 3)) in do_inferred_modes()
5386 closure->edid, in do_inferred_modes()
5396 add_inferred_modes(struct hdmi_edid_data *data, struct edid *edid) in add_inferred_modes() argument
5400 .edid = edid, in add_inferred_modes()
5403 if (version_greater(edid, 1, 0)) in add_inferred_modes()
5404 drm_for_each_detailed_block((u8 *)edid, do_inferred_modes, in add_inferred_modes()
5525 struct edid *edid = (struct edid *)raw_edid; in drm_edid_block_valid() local
5571 if (edid->version != 1) { in drm_edid_block_valid()
5573 edid->version); in drm_edid_block_valid()
5577 if (edid->revision > 4) in drm_edid_block_valid()
5608 static bool drm_edid_is_valid(struct edid *edid) in drm_edid_is_valid() argument
5611 u8 *raw = (u8 *)edid; in drm_edid_is_valid()
5613 if (!edid) in drm_edid_is_valid()
5616 for (i = 0; i <= edid->extensions; i++) in drm_edid_is_valid()
5636 struct edid *edid = (struct edid *)raw_edid; in drm_add_edid_modes() local
5638 if (!edid) { in drm_add_edid_modes()
5643 if (!drm_edid_is_valid(edid)) { in drm_add_edid_modes()
5653 quirks = edid_get_quirks(edid); in drm_add_edid_modes()
5659 drm_add_display_info(data, edid); in drm_add_edid_modes()
5675 num_modes += add_detailed_modes(data, edid, quirks); in drm_add_edid_modes()
5676 num_modes += add_cvt_modes(data, edid); in drm_add_edid_modes()
5677 num_modes += add_standard_modes(data, edid); in drm_add_edid_modes()
5678 num_modes += add_established_modes(data, edid); in drm_add_edid_modes()
5679 num_modes += add_cea_modes(data, edid); in drm_add_edid_modes()
5680 num_modes += add_alternate_cea_modes(data, edid); in drm_add_edid_modes()
5681 num_modes += add_displayid_detailed_modes(data, edid); in drm_add_edid_modes()
5683 if (edid->features & DRM_EDID_FEATURE_DEFAULT_GTF) in drm_add_edid_modes()
5684 num_modes += add_inferred_modes(data, edid); in drm_add_edid_modes()
7008 u8 *new, *edid; in drm_do_get_edid() local
7013 edid = malloc(HDMI_EDID_BLOCK_SIZE); in drm_do_get_edid()
7014 if (!edid) in drm_do_get_edid()
7019 if (drm_do_probe_ddc_edid(adap, edid, 0, HDMI_EDID_BLOCK_SIZE)) in drm_do_get_edid()
7021 if (drm_edid_block_valid(edid, 0, true, in drm_do_get_edid()
7024 if (i == 0 && drm_edid_is_zero(edid, HDMI_EDID_BLOCK_SIZE)) { in drm_do_get_edid()
7034 valid_extensions = edid[0x7e]; in drm_do_get_edid()
7038 new = realloc(edid, (valid_extensions + 1) * HDMI_EDID_BLOCK_SIZE); in drm_do_get_edid()
7041 edid = new; in drm_do_get_edid()
7044 block_num = edid[0x7e] + 1; in drm_do_get_edid()
7047 u8 *block = edid + j * HDMI_EDID_BLOCK_SIZE; in drm_do_get_edid()
7071 int eeodb = edid_hfeeodb_block_count((const struct edid *)edid); in drm_do_get_edid()
7075 new = realloc(edid, block_num * HDMI_EDID_BLOCK_SIZE); in drm_do_get_edid()
7078 edid = new; in drm_do_get_edid()
7091 for (i = 0; i <= edid[0x7e]; i++) { in drm_do_get_edid()
7092 u8 *block = edid + i * HDMI_EDID_BLOCK_SIZE; in drm_do_get_edid()
7104 kfree(edid); in drm_do_get_edid()
7105 edid = new; in drm_do_get_edid()
7111 buff = &edid[0x80 * i]; in drm_do_get_edid()
7121 return edid; in drm_do_get_edid()