Lines Matching +full:d +full:- +full:link
1 // SPDX-License-Identifier: GPL-2.0-only
3 * Copyright (c) 2012-2020, The Linux Foundation. All rights reserved.
22 struct msm_dp_link *link; member
32 msm_dp_panel = &panel->msm_dp_panel; in msm_dp_panel_read_psr_cap()
35 if (msm_dp_panel->dpcd[DP_EDP_CONFIGURATION_CAP]) { in msm_dp_panel_read_psr_cap()
36 rlen = drm_dp_dpcd_read(panel->aux, DP_PSR_SUPPORT, in msm_dp_panel_read_psr_cap()
37 &msm_dp_panel->psr_cap, sizeof(msm_dp_panel->psr_cap)); in msm_dp_panel_read_psr_cap()
38 if (rlen == sizeof(msm_dp_panel->psr_cap)) { in msm_dp_panel_read_psr_cap()
39 drm_dbg_dp(panel->drm_dev, in msm_dp_panel_read_psr_cap()
41 msm_dp_panel->psr_cap.version, in msm_dp_panel_read_psr_cap()
42 msm_dp_panel->psr_cap.capabilities); in msm_dp_panel_read_psr_cap()
56 dpcd = msm_dp_panel->dpcd; in msm_dp_panel_read_dpcd()
57 rc = drm_dp_read_dpcd_caps(panel->aux, dpcd); in msm_dp_panel_read_dpcd()
61 msm_dp_panel->vsc_sdp_supported = drm_dp_vsc_sdp_supported(panel->aux, dpcd); in msm_dp_panel_read_dpcd()
62 link_info = &msm_dp_panel->link_info; in msm_dp_panel_read_dpcd()
63 link_info->revision = dpcd[DP_DPCD_REV]; in msm_dp_panel_read_dpcd()
64 major = (link_info->revision >> 4) & 0x0f; in msm_dp_panel_read_dpcd()
65 minor = link_info->revision & 0x0f; in msm_dp_panel_read_dpcd()
67 link_info->rate = drm_dp_max_link_rate(dpcd); in msm_dp_panel_read_dpcd()
68 link_info->num_lanes = drm_dp_max_lane_count(dpcd); in msm_dp_panel_read_dpcd()
70 /* Limit data lanes from data-lanes of endpoint property of dtsi */ in msm_dp_panel_read_dpcd()
71 if (link_info->num_lanes > msm_dp_panel->max_dp_lanes) in msm_dp_panel_read_dpcd()
72 link_info->num_lanes = msm_dp_panel->max_dp_lanes; in msm_dp_panel_read_dpcd()
74 /* Limit link rate from link-frequencies of endpoint property of dtsi */ in msm_dp_panel_read_dpcd()
75 if (link_info->rate > msm_dp_panel->max_dp_link_rate) in msm_dp_panel_read_dpcd()
76 link_info->rate = msm_dp_panel->max_dp_link_rate; in msm_dp_panel_read_dpcd()
78 drm_dbg_dp(panel->drm_dev, "version: %d.%d\n", major, minor); in msm_dp_panel_read_dpcd()
79 drm_dbg_dp(panel->drm_dev, "link_rate=%d\n", link_info->rate); in msm_dp_panel_read_dpcd()
80 drm_dbg_dp(panel->drm_dev, "lane_count=%d\n", link_info->num_lanes); in msm_dp_panel_read_dpcd()
83 link_info->capabilities |= DP_LINK_CAP_ENHANCED_FRAMING; in msm_dp_panel_read_dpcd()
99 link_info = &msm_dp_panel->link_info; in msm_dp_panel_get_supported_bpp()
100 data_rate_khz = link_info->num_lanes * link_info->rate * 8; in msm_dp_panel_get_supported_bpp()
105 bpp -= 6; in msm_dp_panel_get_supported_bpp()
120 return -EINVAL; in msm_dp_panel_read_sink_caps()
125 drm_dbg_dp(panel->drm_dev, "max_lanes=%d max_link_rate=%d\n", in msm_dp_panel_read_sink_caps()
126 msm_dp_panel->max_dp_lanes, msm_dp_panel->max_dp_link_rate); in msm_dp_panel_read_sink_caps()
130 DRM_ERROR("read dpcd failed %d\n", rc); in msm_dp_panel_read_sink_caps()
134 bw_code = drm_dp_link_rate_to_bw_code(msm_dp_panel->link_info.rate); in msm_dp_panel_read_sink_caps()
136 !is_lane_count_valid(msm_dp_panel->link_info.num_lanes) || in msm_dp_panel_read_sink_caps()
137 (bw_code > msm_dp_panel->max_bw_code)) { in msm_dp_panel_read_sink_caps()
138 DRM_ERROR("Illegal link rate=%d lane=%d\n", msm_dp_panel->link_info.rate, in msm_dp_panel_read_sink_caps()
139 msm_dp_panel->link_info.num_lanes); in msm_dp_panel_read_sink_caps()
140 return -EINVAL; in msm_dp_panel_read_sink_caps()
143 if (drm_dp_is_branch(msm_dp_panel->dpcd)) { in msm_dp_panel_read_sink_caps()
144 count = drm_dp_read_sink_count(panel->aux); in msm_dp_panel_read_sink_caps()
146 panel->link->sink_count = 0; in msm_dp_panel_read_sink_caps()
147 return -ENOTCONN; in msm_dp_panel_read_sink_caps()
151 rc = drm_dp_read_downstream_info(panel->aux, msm_dp_panel->dpcd, in msm_dp_panel_read_sink_caps()
152 msm_dp_panel->downstream_ports); in msm_dp_panel_read_sink_caps()
156 drm_edid_free(msm_dp_panel->drm_edid); in msm_dp_panel_read_sink_caps()
158 msm_dp_panel->drm_edid = drm_edid_read_ddc(connector, &panel->aux->ddc); in msm_dp_panel_read_sink_caps()
160 drm_edid_connector_update(connector, msm_dp_panel->drm_edid); in msm_dp_panel_read_sink_caps()
162 if (!msm_dp_panel->drm_edid) { in msm_dp_panel_read_sink_caps()
165 if (!msm_dp_catalog_link_is_connected(panel->catalog)) { in msm_dp_panel_read_sink_caps()
166 rc = -ETIMEDOUT; in msm_dp_panel_read_sink_caps()
188 if (msm_dp_panel->video_test) in msm_dp_panel_get_mode_bpp()
190 panel->link->test_video.test_bit_depth); in msm_dp_panel_get_mode_bpp()
203 return -EINVAL; in msm_dp_panel_get_modes()
206 if (msm_dp_panel->drm_edid) in msm_dp_panel_get_modes()
214 edid += edid->extensions; in msm_dp_panel_get_edid_checksum()
216 return edid->checksum; in msm_dp_panel_get_edid_checksum()
230 if (panel->link->sink_request & DP_TEST_LINK_EDID_READ) { in msm_dp_panel_handle_sink_request()
232 const struct edid *edid = drm_edid_raw(msm_dp_panel->drm_edid); in msm_dp_panel_handle_sink_request()
238 checksum = msm_dp_panel->connector->real_edid_checksum; in msm_dp_panel_handle_sink_request()
240 msm_dp_link_send_edid_checksum(panel->link, checksum); in msm_dp_panel_handle_sink_request()
241 msm_dp_link_send_test_response(panel->link); in msm_dp_panel_handle_sink_request()
256 catalog = panel->catalog; in msm_dp_panel_tpg_config()
258 if (!panel->panel_on) { in msm_dp_panel_tpg_config()
259 drm_dbg_dp(panel->drm_dev, in msm_dp_panel_tpg_config()
269 drm_dbg_dp(panel->drm_dev, "calling catalog tpg_enable\n"); in msm_dp_panel_tpg_config()
270 msm_dp_catalog_panel_tpg_enable(catalog, &panel->msm_dp_panel.msm_dp_mode.drm_mode); in msm_dp_panel_tpg_config()
284 return -EINVAL; in msm_dp_panel_setup_vsc_sdp_yuv_420()
288 catalog = panel->catalog; in msm_dp_panel_setup_vsc_sdp_yuv_420()
289 msm_dp_mode = &msm_dp_panel->msm_dp_mode; in msm_dp_panel_setup_vsc_sdp_yuv_420()
293 /* VSC SDP header as per table 2-118 of DP 1.4 specification */ in msm_dp_panel_setup_vsc_sdp_yuv_420()
303 vsc_sdp_data.bpc = msm_dp_mode->bpp / 3; in msm_dp_panel_setup_vsc_sdp_yuv_420()
332 catalog = panel->catalog; in msm_dp_panel_timing_cfg()
333 drm_mode = &panel->msm_dp_panel.msm_dp_mode.drm_mode; in msm_dp_panel_timing_cfg()
335 drm_dbg_dp(panel->drm_dev, "width=%d hporch= %d %d %d\n", in msm_dp_panel_timing_cfg()
336 drm_mode->hdisplay, drm_mode->htotal - drm_mode->hsync_end, in msm_dp_panel_timing_cfg()
337 drm_mode->hsync_start - drm_mode->hdisplay, in msm_dp_panel_timing_cfg()
338 drm_mode->hsync_end - drm_mode->hsync_start); in msm_dp_panel_timing_cfg()
340 drm_dbg_dp(panel->drm_dev, "height=%d vporch= %d %d %d\n", in msm_dp_panel_timing_cfg()
341 drm_mode->vdisplay, drm_mode->vtotal - drm_mode->vsync_end, in msm_dp_panel_timing_cfg()
342 drm_mode->vsync_start - drm_mode->vdisplay, in msm_dp_panel_timing_cfg()
343 drm_mode->vsync_end - drm_mode->vsync_start); in msm_dp_panel_timing_cfg()
345 total_hor = drm_mode->htotal; in msm_dp_panel_timing_cfg()
347 total_ver = drm_mode->vtotal; in msm_dp_panel_timing_cfg()
355 data = (drm_mode->vtotal - drm_mode->vsync_start); in msm_dp_panel_timing_cfg()
357 data |= (drm_mode->htotal - drm_mode->hsync_start); in msm_dp_panel_timing_cfg()
361 data = drm_mode->vsync_end - drm_mode->vsync_start; in msm_dp_panel_timing_cfg()
363 data |= (panel->msm_dp_panel.msm_dp_mode.v_active_low << 31); in msm_dp_panel_timing_cfg()
364 data |= drm_mode->hsync_end - drm_mode->hsync_start; in msm_dp_panel_timing_cfg()
365 data |= (panel->msm_dp_panel.msm_dp_mode.h_active_low << 15); in msm_dp_panel_timing_cfg()
369 data = drm_mode->vdisplay; in msm_dp_panel_timing_cfg()
371 data |= drm_mode->hdisplay; in msm_dp_panel_timing_cfg()
377 if (msm_dp_panel->msm_dp_mode.out_fmt_is_yuv_420) in msm_dp_panel_timing_cfg()
380 panel->panel_on = true; in msm_dp_panel_timing_cfg()
390 drm_mode = &msm_dp_panel->msm_dp_mode.drm_mode; in msm_dp_panel_init_panel_info()
398 drm_dbg_dp(panel->drm_dev, "SET NEW RESOLUTION:\n"); in msm_dp_panel_init_panel_info()
399 drm_dbg_dp(panel->drm_dev, "%dx%d@%dfps\n", in msm_dp_panel_init_panel_info()
400 drm_mode->hdisplay, drm_mode->vdisplay, drm_mode_vrefresh(drm_mode)); in msm_dp_panel_init_panel_info()
401 drm_dbg_dp(panel->drm_dev, in msm_dp_panel_init_panel_info()
402 "h_porches(back|front|width) = (%d|%d|%d)\n", in msm_dp_panel_init_panel_info()
403 drm_mode->htotal - drm_mode->hsync_end, in msm_dp_panel_init_panel_info()
404 drm_mode->hsync_start - drm_mode->hdisplay, in msm_dp_panel_init_panel_info()
405 drm_mode->hsync_end - drm_mode->hsync_start); in msm_dp_panel_init_panel_info()
406 drm_dbg_dp(panel->drm_dev, in msm_dp_panel_init_panel_info()
407 "v_porches(back|front|width) = (%d|%d|%d)\n", in msm_dp_panel_init_panel_info()
408 drm_mode->vtotal - drm_mode->vsync_end, in msm_dp_panel_init_panel_info()
409 drm_mode->vsync_start - drm_mode->vdisplay, in msm_dp_panel_init_panel_info()
410 drm_mode->vsync_end - drm_mode->vsync_start); in msm_dp_panel_init_panel_info()
411 drm_dbg_dp(panel->drm_dev, "pixel clock (KHz)=(%d)\n", in msm_dp_panel_init_panel_info()
412 drm_mode->clock); in msm_dp_panel_init_panel_info()
413 drm_dbg_dp(panel->drm_dev, "bpp = %d\n", msm_dp_panel->msm_dp_mode.bpp); in msm_dp_panel_init_panel_info()
415 …msm_dp_panel->msm_dp_mode.bpp = msm_dp_panel_get_mode_bpp(msm_dp_panel, msm_dp_panel->msm_dp_mode.… in msm_dp_panel_init_panel_info()
416 msm_dp_panel->msm_dp_mode.drm_mode.clock); in msm_dp_panel_init_panel_info()
418 drm_dbg_dp(panel->drm_dev, "updated bpp = %d\n", in msm_dp_panel_init_panel_info()
419 msm_dp_panel->msm_dp_mode.bpp); in msm_dp_panel_init_panel_info()
434 cnt = of_property_count_u64_elems(endpoint, "link-frequencies"); in msm_dp_panel_link_frequencies()
437 of_property_read_u64_index(endpoint, "link-frequencies", in msm_dp_panel_link_frequencies()
438 cnt - 1, &frequency); in msm_dp_panel_link_frequencies()
442 10 * /* from symbol rate to link rate */ in msm_dp_panel_link_frequencies()
455 of_node = panel->dev->of_node; in msm_dp_panel_parse_dt()
458 * data-lanes is the property of msm_dp_out endpoint in msm_dp_panel_parse_dt()
462 /* legacy code, data-lanes is the property of mdss_dp node */ in msm_dp_panel_parse_dt()
467 msm_dp_panel->max_dp_lanes = cnt; in msm_dp_panel_parse_dt()
469 msm_dp_panel->max_dp_lanes = DP_MAX_NUM_DP_LANES; /* 4 lanes */ in msm_dp_panel_parse_dt()
471 msm_dp_panel->max_dp_link_rate = msm_dp_panel_link_frequencies(of_node); in msm_dp_panel_parse_dt()
472 if (!msm_dp_panel->max_dp_link_rate) in msm_dp_panel_parse_dt()
473 msm_dp_panel->max_dp_link_rate = DP_LINK_RATE_HBR2; in msm_dp_panel_parse_dt()
479 struct msm_dp_link *link, struct msm_dp_catalog *catalog) in msm_dp_panel_get() argument
485 if (!dev || !catalog || !aux || !link) { in msm_dp_panel_get()
487 return ERR_PTR(-EINVAL); in msm_dp_panel_get()
492 return ERR_PTR(-ENOMEM); in msm_dp_panel_get()
494 panel->dev = dev; in msm_dp_panel_get()
495 panel->aux = aux; in msm_dp_panel_get()
496 panel->catalog = catalog; in msm_dp_panel_get()
497 panel->link = link; in msm_dp_panel_get()
499 msm_dp_panel = &panel->msm_dp_panel; in msm_dp_panel_get()
500 msm_dp_panel->max_bw_code = DP_LINK_BW_8_1; in msm_dp_panel_get()
514 drm_edid_free(msm_dp_panel->drm_edid); in msm_dp_panel_put()