Lines Matching refs:connector

101 	struct drm_connector *connector;  member
2180 static void connector_bad_edid(struct drm_connector *connector, in connector_bad_edid() argument
2196 connector->real_edid_checksum = in connector_bad_edid()
2199 if (connector->bad_edid_counter++ && !drm_debug_enabled(DRM_UT_KMS)) in connector_bad_edid()
2202 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID is invalid:\n", in connector_bad_edid()
2203 connector->base.id, connector->name); in connector_bad_edid()
2209 static const struct drm_edid *drm_edid_override_get(struct drm_connector *connector) in drm_edid_override_get() argument
2213 mutex_lock(&connector->edid_override_mutex); in drm_edid_override_get()
2215 if (connector->edid_override) in drm_edid_override_get()
2216 override = drm_edid_dup(connector->edid_override); in drm_edid_override_get()
2218 mutex_unlock(&connector->edid_override_mutex); in drm_edid_override_get()
2221 override = drm_edid_load_firmware(connector); in drm_edid_override_get()
2227 int drm_edid_override_show(struct drm_connector *connector, struct seq_file *m) in drm_edid_override_show() argument
2231 mutex_lock(&connector->edid_override_mutex); in drm_edid_override_show()
2233 drm_edid = connector->edid_override; in drm_edid_override_show()
2237 mutex_unlock(&connector->edid_override_mutex); in drm_edid_override_show()
2243 int drm_edid_override_set(struct drm_connector *connector, const void *edid, in drm_edid_override_set() argument
2250 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override invalid\n", in drm_edid_override_set()
2251 connector->base.id, connector->name); in drm_edid_override_set()
2256 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override set\n", in drm_edid_override_set()
2257 connector->base.id, connector->name); in drm_edid_override_set()
2259 mutex_lock(&connector->edid_override_mutex); in drm_edid_override_set()
2261 drm_edid_free(connector->edid_override); in drm_edid_override_set()
2262 connector->edid_override = drm_edid; in drm_edid_override_set()
2264 mutex_unlock(&connector->edid_override_mutex); in drm_edid_override_set()
2270 int drm_edid_override_reset(struct drm_connector *connector) in drm_edid_override_reset() argument
2272 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] EDID override reset\n", in drm_edid_override_reset()
2273 connector->base.id, connector->name); in drm_edid_override_reset()
2275 mutex_lock(&connector->edid_override_mutex); in drm_edid_override_reset()
2277 drm_edid_free(connector->edid_override); in drm_edid_override_reset()
2278 connector->edid_override = NULL; in drm_edid_override_reset()
2280 mutex_unlock(&connector->edid_override_mutex); in drm_edid_override_reset()
2296 int drm_edid_override_connector_update(struct drm_connector *connector) in drm_edid_override_connector_update() argument
2301 override = drm_edid_override_get(connector); in drm_edid_override_connector_update()
2303 if (drm_edid_connector_update(connector, override) == 0) in drm_edid_override_connector_update()
2304 num_modes = drm_edid_connector_add_modes(connector); in drm_edid_override_connector_update()
2308 drm_dbg_kms(connector->dev, in drm_edid_override_connector_update()
2310 connector->base.id, connector->name, num_modes); in drm_edid_override_connector_update()
2352 static struct edid *_drm_do_get_edid(struct drm_connector *connector, in _drm_do_get_edid() argument
2362 override = drm_edid_override_get(connector); in _drm_do_get_edid()
2385 connector->edid_corrupt = false; in _drm_do_get_edid()
2387 connector->edid_corrupt = true; in _drm_do_get_edid()
2391 connector->null_edid_counter++; in _drm_do_get_edid()
2393 connector_bad_edid(connector, edid, 1); in _drm_do_get_edid()
2442 connector_bad_edid(connector, edid, num_blocks); in _drm_do_get_edid()
2590 struct edid *drm_get_edid(struct drm_connector *connector, in drm_get_edid() argument
2595 if (connector->force == DRM_FORCE_OFF) in drm_get_edid()
2598 if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter)) in drm_get_edid()
2601 edid = _drm_do_get_edid(connector, drm_do_probe_ddc_edid, adapter, NULL); in drm_get_edid()
2602 drm_connector_update_edid_property(connector, edid); in drm_get_edid()
2630 const struct drm_edid *drm_edid_read_custom(struct drm_connector *connector, in drm_edid_read_custom() argument
2638 edid = _drm_do_get_edid(connector, read_block, context, &size); in drm_edid_read_custom()
2643 drm_WARN_ON(connector->dev, !size); in drm_edid_read_custom()
2671 const struct drm_edid *drm_edid_read_ddc(struct drm_connector *connector, in drm_edid_read_ddc() argument
2676 if (connector->force == DRM_FORCE_OFF) in drm_edid_read_ddc()
2679 if (connector->force == DRM_FORCE_UNSPECIFIED && !drm_probe_ddc(adapter)) in drm_edid_read_ddc()
2682 drm_edid = drm_edid_read_custom(connector, drm_do_probe_ddc_edid, adapter); in drm_edid_read_ddc()
2704 const struct drm_edid *drm_edid_read(struct drm_connector *connector) in drm_edid_read() argument
2706 if (drm_WARN_ON(connector->dev, !connector->ddc)) in drm_edid_read()
2709 return drm_edid_read_ddc(connector, connector->ddc); in drm_edid_read()
2868 struct edid *drm_get_edid_switcheroo(struct drm_connector *connector, in drm_get_edid_switcheroo() argument
2871 struct drm_device *dev = connector->dev; in drm_get_edid_switcheroo()
2879 edid = drm_get_edid(connector, adapter); in drm_get_edid_switcheroo()
2897 const struct drm_edid *drm_edid_read_switcheroo(struct drm_connector *connector, in drm_edid_read_switcheroo() argument
2900 struct drm_device *dev = connector->dev; in drm_edid_read_switcheroo()
2908 drm_edid = drm_edid_read_ddc(connector, adapter); in drm_edid_read_switcheroo()
2961 static void edid_fixup_preferred(struct drm_connector *connector) in edid_fixup_preferred() argument
2963 const struct drm_display_info *info = &connector->display_info; in edid_fixup_preferred()
2968 if (list_empty(&connector->probed_modes)) in edid_fixup_preferred()
2976 preferred_mode = list_first_entry(&connector->probed_modes, in edid_fixup_preferred()
2979 list_for_each_entry_safe(cur_mode, t, &connector->probed_modes, head) { in edid_fixup_preferred()
3332 static struct drm_display_mode *drm_mode_std(struct drm_connector *connector, in drm_mode_std() argument
3336 struct drm_device *dev = connector->dev; in drm_mode_std()
3380 list_for_each_entry(m, &connector->probed_modes, head) in drm_mode_std()
3473 static struct drm_display_mode *drm_mode_detailed(struct drm_connector *connector, in drm_mode_detailed() argument
3477 const struct drm_display_info *info = &connector->display_info; in drm_mode_detailed()
3478 struct drm_device *dev = connector->dev; in drm_mode_detailed()
3496 connector->base.id, connector->name); in drm_mode_detailed()
3501 connector->base.id, connector->name); in drm_mode_detailed()
3507 connector->base.id, connector->name); in drm_mode_detailed()
3541 connector->base.id, connector->name, in drm_mode_detailed()
3547 connector->base.id, connector->name, in drm_mode_detailed()
3662 static bool valid_inferred_mode(const struct drm_connector *connector, in valid_inferred_mode() argument
3668 list_for_each_entry(m, &connector->probed_modes, head) { in valid_inferred_mode()
3680 static int drm_dmt_modes_for_range(struct drm_connector *connector, in drm_dmt_modes_for_range() argument
3686 struct drm_device *dev = connector->dev; in drm_dmt_modes_for_range()
3690 valid_inferred_mode(connector, drm_dmt_modes + i)) { in drm_dmt_modes_for_range()
3693 drm_mode_probed_add(connector, newmode); in drm_dmt_modes_for_range()
3715 static int drm_gtf_modes_for_range(struct drm_connector *connector, in drm_gtf_modes_for_range() argument
3721 struct drm_device *dev = connector->dev; in drm_gtf_modes_for_range()
3732 !valid_inferred_mode(connector, newmode)) { in drm_gtf_modes_for_range()
3737 drm_mode_probed_add(connector, newmode); in drm_gtf_modes_for_range()
3744 static int drm_gtf2_modes_for_range(struct drm_connector *connector, in drm_gtf2_modes_for_range() argument
3750 struct drm_device *dev = connector->dev; in drm_gtf2_modes_for_range()
3761 !valid_inferred_mode(connector, newmode)) { in drm_gtf2_modes_for_range()
3766 drm_mode_probed_add(connector, newmode); in drm_gtf2_modes_for_range()
3773 static int drm_cvt_modes_for_range(struct drm_connector *connector, in drm_cvt_modes_for_range() argument
3779 struct drm_device *dev = connector->dev; in drm_cvt_modes_for_range()
3791 !valid_inferred_mode(connector, newmode)) { in drm_cvt_modes_for_range()
3796 drm_mode_probed_add(connector, newmode); in drm_cvt_modes_for_range()
3813 closure->modes += drm_dmt_modes_for_range(closure->connector, in do_inferred_modes()
3822 closure->modes += drm_gtf2_modes_for_range(closure->connector, in do_inferred_modes()
3827 closure->modes += drm_gtf_modes_for_range(closure->connector, in do_inferred_modes()
3835 closure->modes += drm_cvt_modes_for_range(closure->connector, in do_inferred_modes()
3845 static int add_inferred_modes(struct drm_connector *connector, in add_inferred_modes() argument
3849 .connector = connector, in add_inferred_modes()
3860 drm_est3_modes(struct drm_connector *connector, const struct detailed_timing *timing) in drm_est3_modes() argument
3872 mode = drm_mode_find_dmt(connector->dev, in drm_est3_modes()
3878 drm_mode_probed_add(connector, mode); in drm_est3_modes()
3896 closure->modes += drm_est3_modes(closure->connector, timing); in do_established_modes()
3904 static int add_established_modes(struct drm_connector *connector, in add_established_modes() argument
3907 struct drm_device *dev = connector->dev; in add_established_modes()
3914 .connector = connector, in add_established_modes()
3924 drm_mode_probed_add(connector, newmode); in add_established_modes()
3942 struct drm_connector *connector = closure->connector; in do_standard_modes() local
3952 newmode = drm_mode_std(connector, closure->drm_edid, std); in do_standard_modes()
3954 drm_mode_probed_add(connector, newmode); in do_standard_modes()
3965 static int add_standard_modes(struct drm_connector *connector, in add_standard_modes() argument
3970 .connector = connector, in add_standard_modes()
3977 newmode = drm_mode_std(connector, drm_edid, in add_standard_modes()
3980 drm_mode_probed_add(connector, newmode); in add_standard_modes()
3994 static int drm_cvt_modes(struct drm_connector *connector, in drm_cvt_modes() argument
3999 struct drm_device *dev = connector->dev; in drm_cvt_modes()
4036 drm_mode_probed_add(connector, newmode); in drm_cvt_modes()
4054 closure->modes += drm_cvt_modes(closure->connector, timing); in do_cvt_mode()
4058 add_cvt_modes(struct drm_connector *connector, const struct drm_edid *drm_edid) in add_cvt_modes() argument
4061 .connector = connector, in add_cvt_modes()
4073 static void fixup_detailed_cea_mode_clock(struct drm_connector *connector,
4085 newmode = drm_mode_detailed(closure->connector, in do_detailed_mode()
4098 fixup_detailed_cea_mode_clock(closure->connector, newmode); in do_detailed_mode()
4100 drm_mode_probed_add(closure->connector, newmode); in do_detailed_mode()
4110 static int add_detailed_modes(struct drm_connector *connector, in add_detailed_modes() argument
4114 .connector = connector, in add_detailed_modes()
4477 static int add_alternate_cea_modes(struct drm_connector *connector, in add_alternate_cea_modes() argument
4480 struct drm_device *dev = connector->dev; in add_alternate_cea_modes()
4493 list_for_each_entry(mode, &connector->probed_modes, head) { in add_alternate_cea_modes()
4542 drm_mode_probed_add(connector, mode); in add_alternate_cea_modes()
4563 drm_display_mode_from_vic_index(struct drm_connector *connector, int vic_index) in drm_display_mode_from_vic_index() argument
4565 const struct drm_display_info *info = &connector->display_info; in drm_display_mode_from_vic_index()
4566 struct drm_device *dev = connector->dev; in drm_display_mode_from_vic_index()
4584 static int do_y420vdb_modes(struct drm_connector *connector, in do_y420vdb_modes() argument
4587 struct drm_device *dev = connector->dev; in do_y420vdb_modes()
4600 drm_mode_probed_add(connector, newmode); in do_y420vdb_modes()
4636 static int add_cta_vdb_modes(struct drm_connector *connector) in add_cta_vdb_modes() argument
4638 const struct drm_display_info *info = &connector->display_info; in add_cta_vdb_modes()
4647 mode = drm_display_mode_from_vic_index(connector, i); in add_cta_vdb_modes()
4649 drm_mode_probed_add(connector, mode); in add_cta_vdb_modes()
4687 static int add_hdmi_mandatory_stereo_modes(struct drm_connector *connector) in add_hdmi_mandatory_stereo_modes() argument
4689 struct drm_device *dev = connector->dev; in add_hdmi_mandatory_stereo_modes()
4696 list_for_each_entry(mode, &connector->probed_modes, head) { in add_hdmi_mandatory_stereo_modes()
4716 list_splice_tail(&stereo_modes, &connector->probed_modes); in add_hdmi_mandatory_stereo_modes()
4721 static int add_hdmi_mode(struct drm_connector *connector, u8 vic) in add_hdmi_mode() argument
4723 struct drm_device *dev = connector->dev; in add_hdmi_mode()
4727 drm_err(connector->dev, "[CONNECTOR:%d:%s] Unknown HDMI VIC: %d\n", in add_hdmi_mode()
4728 connector->base.id, connector->name, vic); in add_hdmi_mode()
4736 drm_mode_probed_add(connector, newmode); in add_hdmi_mode()
4741 static int add_3d_struct_modes(struct drm_connector *connector, u16 structure, in add_3d_struct_modes() argument
4748 newmode = drm_display_mode_from_vic_index(connector, vic_index); in add_3d_struct_modes()
4751 drm_mode_probed_add(connector, newmode); in add_3d_struct_modes()
4756 newmode = drm_display_mode_from_vic_index(connector, vic_index); in add_3d_struct_modes()
4759 drm_mode_probed_add(connector, newmode); in add_3d_struct_modes()
4764 newmode = drm_display_mode_from_vic_index(connector, vic_index); in add_3d_struct_modes()
4767 drm_mode_probed_add(connector, newmode); in add_3d_struct_modes()
4805 do_hdmi_vsdb_modes(struct drm_connector *connector, const u8 *db, u8 len) in do_hdmi_vsdb_modes() argument
4829 modes += add_hdmi_mandatory_stereo_modes(connector); in do_hdmi_vsdb_modes()
4843 modes += add_hdmi_mode(connector, vic); in do_hdmi_vsdb_modes()
4872 modes += add_3d_struct_modes(connector, in do_hdmi_vsdb_modes()
4909 newmode = drm_display_mode_from_vic_index(connector, in do_hdmi_vsdb_modes()
4914 drm_mode_probed_add(connector, newmode); in do_hdmi_vsdb_modes()
5261 static void parse_cta_y420cmdb(struct drm_connector *connector, in parse_cta_y420cmdb() argument
5264 struct drm_display_info *info = &connector->display_info; in parse_cta_y420cmdb()
5300 static int add_cea_modes(struct drm_connector *connector, in add_cea_modes() argument
5308 modes = add_cta_vdb_modes(connector); in add_cea_modes()
5313 modes += do_hdmi_vsdb_modes(connector, (const u8 *)db, in add_cea_modes()
5319 modes += do_y420vdb_modes(connector, vdb420, in add_cea_modes()
5328 static void fixup_detailed_cea_mode_clock(struct drm_connector *connector, in fixup_detailed_cea_mode_clock() argument
5367 drm_dbg_kms(connector->dev, in fixup_detailed_cea_mode_clock()
5369 connector->base.id, connector->name, in fixup_detailed_cea_mode_clock()
5374 static void drm_calculate_luminance_range(struct drm_connector *connector) in drm_calculate_luminance_range() argument
5376 struct hdr_static_metadata *hdr_metadata = &connector->hdr_sink_metadata.hdmi_type1; in drm_calculate_luminance_range()
5378 &connector->display_info.luminance_range; in drm_calculate_luminance_range()
5435 drm_parse_hdr_metadata_block(struct drm_connector *connector, const u8 *db) in drm_parse_hdr_metadata_block() argument
5441 connector->hdr_sink_metadata.hdmi_type1.eotf = in drm_parse_hdr_metadata_block()
5443 connector->hdr_sink_metadata.hdmi_type1.metadata_type = in drm_parse_hdr_metadata_block()
5447 connector->hdr_sink_metadata.hdmi_type1.max_cll = db[4]; in drm_parse_hdr_metadata_block()
5449 connector->hdr_sink_metadata.hdmi_type1.max_fall = db[5]; in drm_parse_hdr_metadata_block()
5451 connector->hdr_sink_metadata.hdmi_type1.min_cll = db[6]; in drm_parse_hdr_metadata_block()
5454 drm_calculate_luminance_range(connector); in drm_parse_hdr_metadata_block()
5460 drm_parse_hdmi_vsdb_audio(struct drm_connector *connector, const u8 *db) in drm_parse_hdmi_vsdb_audio() argument
5465 connector->eld[DRM_ELD_SAD_COUNT_CONN_TYPE] |= DRM_ELD_SUPPORTS_AI; in drm_parse_hdmi_vsdb_audio()
5468 connector->latency_present[0] = true; in drm_parse_hdmi_vsdb_audio()
5469 connector->video_latency[0] = db[9]; in drm_parse_hdmi_vsdb_audio()
5470 connector->audio_latency[0] = db[10]; in drm_parse_hdmi_vsdb_audio()
5474 connector->latency_present[1] = true; in drm_parse_hdmi_vsdb_audio()
5475 connector->video_latency[1] = db[11]; in drm_parse_hdmi_vsdb_audio()
5476 connector->audio_latency[1] = db[12]; in drm_parse_hdmi_vsdb_audio()
5479 drm_dbg_kms(connector->dev, in drm_parse_hdmi_vsdb_audio()
5481 connector->base.id, connector->name, in drm_parse_hdmi_vsdb_audio()
5482 connector->latency_present[0], connector->latency_present[1], in drm_parse_hdmi_vsdb_audio()
5483 connector->video_latency[0], connector->video_latency[1], in drm_parse_hdmi_vsdb_audio()
5484 connector->audio_latency[0], connector->audio_latency[1]); in drm_parse_hdmi_vsdb_audio()
5606 static void clear_eld(struct drm_connector *connector) in clear_eld() argument
5608 mutex_lock(&connector->eld_mutex); in clear_eld()
5609 memset(connector->eld, 0, sizeof(connector->eld)); in clear_eld()
5610 mutex_unlock(&connector->eld_mutex); in clear_eld()
5612 connector->latency_present[0] = false; in clear_eld()
5613 connector->latency_present[1] = false; in clear_eld()
5614 connector->video_latency[0] = 0; in clear_eld()
5615 connector->audio_latency[0] = 0; in clear_eld()
5616 connector->video_latency[1] = 0; in clear_eld()
5617 connector->audio_latency[1] = 0; in clear_eld()
5649 static void drm_edid_to_eld(struct drm_connector *connector, in drm_edid_to_eld() argument
5652 const struct drm_display_info *info = &connector->display_info; in drm_edid_to_eld()
5655 uint8_t *eld = connector->eld; in drm_edid_to_eld()
5662 mutex_lock(&connector->eld_mutex); in drm_edid_to_eld()
5665 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD monitor %s\n", in drm_edid_to_eld()
5666 connector->base.id, connector->name, in drm_edid_to_eld()
5702 drm_parse_hdmi_vsdb_audio(connector, (const u8 *)db); in drm_edid_to_eld()
5712 if (connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort || in drm_edid_to_eld()
5713 connector->connector_type == DRM_MODE_CONNECTOR_eDP) in drm_edid_to_eld()
5721 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] ELD size %d, SAD count %d\n", in drm_edid_to_eld()
5722 connector->base.id, connector->name, in drm_edid_to_eld()
5725 mutex_unlock(&connector->eld_mutex); in drm_edid_to_eld()
5832 int drm_av_sync_delay(struct drm_connector *connector, in drm_av_sync_delay() argument
5838 if (!connector->latency_present[0]) in drm_av_sync_delay()
5840 if (!connector->latency_present[1]) in drm_av_sync_delay()
5843 a = connector->audio_latency[i]; in drm_av_sync_delay()
5844 v = connector->video_latency[i]; in drm_av_sync_delay()
5989 static void parse_cta_vdb(struct drm_connector *connector, const struct cea_db *db) in parse_cta_vdb() argument
5991 struct drm_display_info *info = &connector->display_info; in parse_cta_vdb()
6024 static void update_cta_y420cmdb(struct drm_connector *connector, u64 y420cmdb_map) in update_cta_y420cmdb() argument
6026 struct drm_display_info *info = &connector->display_info; in update_cta_y420cmdb()
6038 static bool cta_vdb_has_vic(const struct drm_connector *connector, u8 vic) in cta_vdb_has_vic() argument
6040 const struct drm_display_info *info = &connector->display_info; in cta_vdb_has_vic()
6055 static void parse_cta_y420vdb(struct drm_connector *connector, in parse_cta_y420vdb() argument
6058 struct drm_display_info *info = &connector->display_info; in parse_cta_y420vdb()
6074 static void drm_parse_vcdb(struct drm_connector *connector, const u8 *db) in drm_parse_vcdb() argument
6076 struct drm_display_info *info = &connector->display_info; in drm_parse_vcdb()
6078 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] CEA VCDB 0x%02x\n", in drm_parse_vcdb()
6079 connector->base.id, connector->name, db[2]); in drm_parse_vcdb()
6120 static void drm_parse_ycbcr420_deep_color_info(struct drm_connector *connector, in drm_parse_ycbcr420_deep_color_info() argument
6124 struct drm_hdmi_info *hdmi = &connector->display_info.hdmi; in drm_parse_ycbcr420_deep_color_info()
6202 static void drm_parse_hdmi_forum_scds(struct drm_connector *connector, in drm_parse_hdmi_forum_scds() argument
6205 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_forum_scds()
6254 drm_parse_ycbcr420_deep_color_info(connector, hf_scds); in drm_parse_hdmi_forum_scds()
6261 drm_dbg_kms(connector->dev, in drm_parse_hdmi_forum_scds()
6263 connector->base.id, connector->name, in drm_parse_hdmi_forum_scds()
6267 static void drm_parse_hdmi_deep_color_info(struct drm_connector *connector, in drm_parse_hdmi_deep_color_info() argument
6270 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_deep_color_info()
6282 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 30.\n", in drm_parse_hdmi_deep_color_info()
6283 connector->base.id, connector->name); in drm_parse_hdmi_deep_color_info()
6289 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 36.\n", in drm_parse_hdmi_deep_color_info()
6290 connector->base.id, connector->name); in drm_parse_hdmi_deep_color_info()
6296 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does deep color 48.\n", in drm_parse_hdmi_deep_color_info()
6297 connector->base.id, connector->name); in drm_parse_hdmi_deep_color_info()
6301 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] No deep color support on this HDMI sink.\n", in drm_parse_hdmi_deep_color_info()
6302 connector->base.id, connector->name); in drm_parse_hdmi_deep_color_info()
6306 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Assigning HDMI sink color depth as %d bpc.\n", in drm_parse_hdmi_deep_color_info()
6307 connector->base.id, connector->name, dc_bpc); in drm_parse_hdmi_deep_color_info()
6313 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink does YCRCB444 in deep color.\n", in drm_parse_hdmi_deep_color_info()
6314 connector->base.id, connector->name); in drm_parse_hdmi_deep_color_info()
6322 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI sink should do DC_36, but does not!\n", in drm_parse_hdmi_deep_color_info()
6323 connector->base.id, connector->name); in drm_parse_hdmi_deep_color_info()
6329 drm_parse_hdmi_vsdb_video(struct drm_connector *connector, const u8 *db) in drm_parse_hdmi_vsdb_video() argument
6331 struct drm_display_info *info = &connector->display_info; in drm_parse_hdmi_vsdb_video()
6352 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] HDMI: DVI dual %d, max TMDS clock %d kHz\n", in drm_parse_hdmi_vsdb_video()
6353 connector->base.id, connector->name, in drm_parse_hdmi_vsdb_video()
6356 drm_parse_hdmi_deep_color_info(connector, db); in drm_parse_hdmi_vsdb_video()
6363 static void drm_parse_microsoft_vsdb(struct drm_connector *connector, in drm_parse_microsoft_vsdb() argument
6366 struct drm_display_info *info = &connector->display_info; in drm_parse_microsoft_vsdb()
6374 drm_dbg_kms(connector->dev, in drm_parse_microsoft_vsdb()
6376 connector->base.id, connector->name, version, db[5]); in drm_parse_microsoft_vsdb()
6379 static void drm_parse_cea_ext(struct drm_connector *connector, in drm_parse_cea_ext() argument
6382 struct drm_display_info *info = &connector->display_info; in drm_parse_cea_ext()
6398 drm_dbg_kms(connector->dev, in drm_parse_cea_ext()
6400 connector->base.id, connector->name, in drm_parse_cea_ext()
6421 drm_parse_hdmi_vsdb_video(connector, data); in drm_parse_cea_ext()
6424 drm_parse_hdmi_forum_scds(connector, data); in drm_parse_cea_ext()
6426 drm_parse_microsoft_vsdb(connector, data); in drm_parse_cea_ext()
6428 parse_cta_y420cmdb(connector, db, &y420cmdb_map); in drm_parse_cea_ext()
6430 parse_cta_y420vdb(connector, db); in drm_parse_cea_ext()
6432 drm_parse_vcdb(connector, data); in drm_parse_cea_ext()
6434 drm_parse_hdr_metadata_block(connector, data); in drm_parse_cea_ext()
6436 parse_cta_vdb(connector, db); in drm_parse_cea_ext()
6443 update_cta_y420cmdb(connector, y420cmdb_map); in drm_parse_cea_ext()
6450 struct drm_display_info *info = &closure->connector->display_info; in get_monitor_range()
6482 static void drm_get_monitor_range(struct drm_connector *connector, in drm_get_monitor_range() argument
6485 const struct drm_display_info *info = &connector->display_info; in drm_get_monitor_range()
6487 .connector = connector, in drm_get_monitor_range()
6499 drm_dbg_kms(connector->dev, in drm_get_monitor_range()
6501 connector->base.id, connector->name, in drm_get_monitor_range()
6505 static void drm_parse_vesa_mso_data(struct drm_connector *connector, in drm_parse_vesa_mso_data() argument
6510 struct drm_display_info *info = &connector->display_info; in drm_parse_vesa_mso_data()
6513 drm_dbg_kms(connector->dev, in drm_parse_vesa_mso_data()
6515 connector->base.id, connector->name, block->num_bytes); in drm_parse_vesa_mso_data()
6523 drm_dbg_kms(connector->dev, in drm_parse_vesa_mso_data()
6525 connector->base.id, connector->name); in drm_parse_vesa_mso_data()
6531 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Reserved MSO mode value\n", in drm_parse_vesa_mso_data()
6532 connector->base.id, connector->name); in drm_parse_vesa_mso_data()
6552 drm_dbg_kms(connector->dev, in drm_parse_vesa_mso_data()
6554 connector->base.id, connector->name, in drm_parse_vesa_mso_data()
6559 drm_dbg_kms(connector->dev, in drm_parse_vesa_mso_data()
6561 connector->base.id, connector->name, in drm_parse_vesa_mso_data()
6565 static void drm_update_mso(struct drm_connector *connector, in drm_update_mso() argument
6574 drm_parse_vesa_mso_data(connector, block); in drm_update_mso()
6582 static void drm_reset_display_info(struct drm_connector *connector) in drm_reset_display_info() argument
6584 struct drm_display_info *info = &connector->display_info; in drm_reset_display_info()
6620 static void update_displayid_info(struct drm_connector *connector, in update_displayid_info() argument
6623 struct drm_display_info *info = &connector->display_info; in update_displayid_info()
6629 drm_dbg_kms(connector->dev, in update_displayid_info()
6631 connector->base.id, connector->name, in update_displayid_info()
6648 static void update_display_info(struct drm_connector *connector, in update_display_info() argument
6651 struct drm_display_info *info = &connector->display_info; in update_display_info()
6654 drm_reset_display_info(connector); in update_display_info()
6655 clear_eld(connector); in update_display_info()
6667 drm_get_monitor_range(connector, drm_edid); in update_display_info()
6676 drm_parse_cea_ext(connector, drm_edid); in update_display_info()
6678 update_displayid_info(connector, drm_edid); in update_display_info()
6690 drm_dbg_kms(connector->dev, in update_display_info()
6692 connector->base.id, connector->name, info->bpc); in update_display_info()
6724 drm_dbg_kms(connector->dev, in update_display_info()
6726 connector->base.id, connector->name, info->bpc); in update_display_info()
6733 drm_update_mso(connector, drm_edid); in update_display_info()
6737 drm_dbg_kms(connector->dev, "[CONNECTOR:%d:%s] Non-desktop display%s\n", in update_display_info()
6738 connector->base.id, connector->name, in update_display_info()
6759 drm_edid_to_eld(connector, drm_edid); in update_display_info()
6809 static int add_displayid_detailed_1_modes(struct drm_connector *connector, in add_displayid_detailed_1_modes() argument
6826 newmode = drm_mode_displayid_detailed(connector->dev, timings, type_7); in add_displayid_detailed_1_modes()
6830 drm_mode_probed_add(connector, newmode); in add_displayid_detailed_1_modes()
6836 static int add_displayid_detailed_modes(struct drm_connector *connector, in add_displayid_detailed_modes() argument
6847 num_modes += add_displayid_detailed_1_modes(connector, block); in add_displayid_detailed_modes()
6854 static int _drm_edid_connector_add_modes(struct drm_connector *connector, in _drm_edid_connector_add_modes() argument
6857 const struct drm_display_info *info = &connector->display_info; in _drm_edid_connector_add_modes()
6877 num_modes += add_detailed_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6878 num_modes += add_cvt_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6879 num_modes += add_standard_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6880 num_modes += add_established_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6881 num_modes += add_cea_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6882 num_modes += add_alternate_cea_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6883 num_modes += add_displayid_detailed_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6885 num_modes += add_inferred_modes(connector, drm_edid); in _drm_edid_connector_add_modes()
6888 edid_fixup_preferred(connector); in _drm_edid_connector_add_modes()
6893 static void _drm_update_tile_info(struct drm_connector *connector,
6896 static int _drm_edid_connector_property_update(struct drm_connector *connector, in _drm_edid_connector_property_update() argument
6899 struct drm_device *dev = connector->dev; in _drm_edid_connector_property_update()
6902 if (connector->edid_blob_ptr) { in _drm_edid_connector_property_update()
6903 const void *old_edid = connector->edid_blob_ptr->data; in _drm_edid_connector_property_update()
6904 size_t old_edid_size = connector->edid_blob_ptr->length; in _drm_edid_connector_property_update()
6907 connector->epoch_counter++; in _drm_edid_connector_property_update()
6909 connector->base.id, connector->name, in _drm_edid_connector_property_update()
6910 connector->epoch_counter); in _drm_edid_connector_property_update()
6915 &connector->edid_blob_ptr, in _drm_edid_connector_property_update()
6918 &connector->base, in _drm_edid_connector_property_update()
6922 connector->base.id, connector->name, ret); in _drm_edid_connector_property_update()
6926 ret = drm_object_property_set_value(&connector->base, in _drm_edid_connector_property_update()
6928 connector->display_info.non_desktop); in _drm_edid_connector_property_update()
6931 connector->base.id, connector->name, ret); in _drm_edid_connector_property_update()
6935 ret = drm_connector_set_tile_property(connector); in _drm_edid_connector_property_update()
6938 connector->base.id, connector->name, ret); in _drm_edid_connector_property_update()
6947 ssize_t drm_edid_connector_property_show(struct drm_connector *connector, in drm_edid_connector_property_show() argument
6954 mutex_lock(&connector->dev->mode_config.mutex); in drm_edid_connector_property_show()
6956 if (!connector->edid_blob_ptr) in drm_edid_connector_property_show()
6959 edid = connector->edid_blob_ptr->data; in drm_edid_connector_property_show()
6960 size = connector->edid_blob_ptr->length; in drm_edid_connector_property_show()
6974 mutex_unlock(&connector->dev->mode_config.mutex); in drm_edid_connector_property_show()
6993 int drm_edid_connector_update(struct drm_connector *connector, in drm_edid_connector_update() argument
6996 update_display_info(connector, drm_edid); in drm_edid_connector_update()
6998 _drm_update_tile_info(connector, drm_edid); in drm_edid_connector_update()
7000 return _drm_edid_connector_property_update(connector, drm_edid); in drm_edid_connector_update()
7016 int drm_edid_connector_add_modes(struct drm_connector *connector) in drm_edid_connector_add_modes() argument
7021 if (connector->edid_blob_ptr) in drm_edid_connector_add_modes()
7022 drm_edid = drm_edid_alloc(connector->edid_blob_ptr->data, in drm_edid_connector_add_modes()
7023 connector->edid_blob_ptr->length); in drm_edid_connector_add_modes()
7025 count = _drm_edid_connector_add_modes(connector, drm_edid); in drm_edid_connector_add_modes()
7049 int drm_connector_update_edid_property(struct drm_connector *connector, in drm_connector_update_edid_property() argument
7054 return drm_edid_connector_update(connector, drm_edid_legacy_init(&drm_edid, edid)); in drm_connector_update_edid_property()
7071 int drm_add_edid_modes(struct drm_connector *connector, struct edid *edid) in drm_add_edid_modes() argument
7077 drm_warn(connector->dev, "[CONNECTOR:%d:%s] EDID invalid.\n", in drm_add_edid_modes()
7078 connector->base.id, connector->name); in drm_add_edid_modes()
7084 update_display_info(connector, drm_edid); in drm_add_edid_modes()
7086 return _drm_edid_connector_add_modes(connector, drm_edid); in drm_add_edid_modes()
7101 int drm_add_modes_noedid(struct drm_connector *connector, in drm_add_modes_noedid() argument
7106 struct drm_device *dev = connector->dev; in drm_add_modes_noedid()
7131 drm_mode_probed_add(connector, mode); in drm_add_modes_noedid()
7139 static bool is_hdmi2_sink(const struct drm_connector *connector) in is_hdmi2_sink() argument
7145 if (!connector) in is_hdmi2_sink()
7148 return connector->display_info.hdmi.scdc.supported || in is_hdmi2_sink()
7149 connector->display_info.color_formats & DRM_COLOR_FORMAT_YCBCR420; in is_hdmi2_sink()
7152 static u8 drm_mode_hdmi_vic(const struct drm_connector *connector, in drm_mode_hdmi_vic() argument
7155 bool has_hdmi_infoframe = connector ? in drm_mode_hdmi_vic()
7156 connector->display_info.has_hdmi_infoframe : false; in drm_mode_hdmi_vic()
7168 static u8 drm_mode_cea_vic(const struct drm_connector *connector, in drm_mode_cea_vic() argument
7177 if (drm_mode_hdmi_vic(connector, mode)) in drm_mode_cea_vic()
7193 static u8 vic_for_avi_infoframe(const struct drm_connector *connector, u8 vic) in vic_for_avi_infoframe() argument
7195 if (!is_hdmi2_sink(connector) && vic > 64 && in vic_for_avi_infoframe()
7196 !cta_vdb_has_vic(connector, vic)) in vic_for_avi_infoframe()
7213 const struct drm_connector *connector, in drm_hdmi_avi_infoframe_from_display_mode() argument
7227 vic = drm_mode_cea_vic(connector, mode); in drm_hdmi_avi_infoframe_from_display_mode()
7228 hdmi_vic = drm_mode_hdmi_vic(connector, mode); in drm_hdmi_avi_infoframe_from_display_mode()
7271 frame->video_code = vic_for_avi_infoframe(connector, vic); in drm_hdmi_avi_infoframe_from_display_mode()
7290 const struct drm_connector *connector, in drm_hdmi_avi_infoframe_quant_range() argument
7294 const struct drm_display_info *info = &connector->display_info; in drm_hdmi_avi_infoframe_quant_range()
7325 if (!is_hdmi2_sink(connector) || in drm_hdmi_avi_infoframe_quant_range()
7377 const struct drm_connector *connector, in drm_hdmi_vendor_infoframe_from_display_mode() argument
7384 bool has_hdmi_infoframe = connector ? in drm_hdmi_vendor_infoframe_from_display_mode()
7385 connector->display_info.has_hdmi_infoframe : false; in drm_hdmi_vendor_infoframe_from_display_mode()
7407 frame->vic = drm_mode_hdmi_vic(connector, mode); in drm_hdmi_vendor_infoframe_from_display_mode()
7414 static void drm_parse_tiled_block(struct drm_connector *connector, in drm_parse_tiled_block() argument
7431 connector->has_tile = true; in drm_parse_tiled_block()
7433 connector->tile_is_single_monitor = true; in drm_parse_tiled_block()
7435 connector->num_h_tile = num_h_tile + 1; in drm_parse_tiled_block()
7436 connector->num_v_tile = num_v_tile + 1; in drm_parse_tiled_block()
7437 connector->tile_h_loc = tile_h_loc; in drm_parse_tiled_block()
7438 connector->tile_v_loc = tile_v_loc; in drm_parse_tiled_block()
7439 connector->tile_h_size = w + 1; in drm_parse_tiled_block()
7440 connector->tile_v_size = h + 1; in drm_parse_tiled_block()
7442 drm_dbg_kms(connector->dev, in drm_parse_tiled_block()
7444 connector->base.id, connector->name, in drm_parse_tiled_block()
7446 connector->tile_h_size, connector->tile_v_size, in drm_parse_tiled_block()
7447 connector->num_h_tile, connector->num_v_tile, in drm_parse_tiled_block()
7448 connector->tile_h_loc, connector->tile_v_loc, in drm_parse_tiled_block()
7451 tg = drm_mode_get_tile_group(connector->dev, tile->topology_id); in drm_parse_tiled_block()
7453 tg = drm_mode_create_tile_group(connector->dev, tile->topology_id); in drm_parse_tiled_block()
7457 if (connector->tile_group != tg) { in drm_parse_tiled_block()
7460 if (connector->tile_group) in drm_parse_tiled_block()
7461 drm_mode_put_tile_group(connector->dev, connector->tile_group); in drm_parse_tiled_block()
7462 connector->tile_group = tg; in drm_parse_tiled_block()
7465 drm_mode_put_tile_group(connector->dev, tg); in drm_parse_tiled_block()
7478 static void _drm_update_tile_info(struct drm_connector *connector, in _drm_update_tile_info() argument
7484 connector->has_tile = false; in _drm_update_tile_info()
7489 drm_parse_tiled_block(connector, block); in _drm_update_tile_info()
7493 if (!connector->has_tile && connector->tile_group) { in _drm_update_tile_info()
7494 drm_mode_put_tile_group(connector->dev, connector->tile_group); in _drm_update_tile_info()
7495 connector->tile_group = NULL; in _drm_update_tile_info()