1 // SPDX-License-Identifier: MIT
2 /*
3 * Copyright 2026 Advanced Micro Devices, Inc.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining a
6 * copy of this software and associated documentation files (the "Software"),
7 * to deal in the Software without restriction, including without limitation
8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
9 * and/or sell copies of the Software, and to permit persons to whom the
10 * Software is furnished to do so, subject to the following conditions:
11 *
12 * The above copyright notice and this permission notice shall be included in
13 * all copies or substantial portions of the Software.
14 *
15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
21 * OTHER DEALINGS IN THE SOFTWARE.
22 *
23 * Authors: AMD
24 *
25 */
26
27 #include "dm_services_types.h"
28 #include "dc.h"
29 #include "dc/dc_dmub_srv.h"
30 #include "dc/dc_edid_parser.h"
31 #include "dc/dc_stat.h"
32 #include "dc/dc_state.h"
33 #include "dc/dc_stream.h"
34 #include "dc/inc/core_types.h"
35 #include "link_enc_cfg.h"
36 #include "link/protocols/link_dpcd.h"
37 #include "link_service_types.h"
38 #include "link/protocols/link_dp_capability.h"
39 #include "link/protocols/link_ddc.h"
40
41 #include "amdgpu.h"
42 #include "amdgpu_display.h"
43 #include "amdgpu_dm.h"
44 #include "amdgpu_dm_connector.h"
45 #include "amdgpu_dm_plane.h"
46 #include "amdgpu_dm_crtc.h"
47 #include "amdgpu_dm_wb.h"
48 #include "amdgpu_dm_mst_types.h"
49 #if defined(CONFIG_DEBUG_FS)
50 #include "amdgpu_dm_debugfs.h"
51 #endif
52 #include "amdgpu_dm_backlight.h"
53 #include "amdgpu_dm_audio.h"
54 #include "amdgpu_dm_irq.h"
55 #include "amdgpu_dm_psr.h"
56 #include "dm_helpers.h"
57
58 #include <drm/drm_atomic.h>
59 #include <drm/drm_atomic_uapi.h>
60 #include <drm/drm_atomic_helper.h>
61 #include <drm/drm_edid.h>
62 #include <drm/drm_eld.h>
63 #include <drm/drm_fixed.h>
64 #include <drm/drm_mode.h>
65 #include <drm/drm_probe_helper.h>
66 #include <drm/drm_utils.h>
67 #include <drm/display/drm_dp_mst_helper.h>
68 #include <drm/display/drm_hdmi_helper.h>
69 #include <drm/drm_privacy_screen_consumer.h>
70 #include <drm/display/drm_hdcp_helper.h>
71
72 #include <linux/backlight.h>
73
74 #include <media/cec-notifier.h>
75
76 #include "modules/inc/mod_freesync.h"
77 #include "modules/inc/mod_power.h"
78
79 #include "amdgpu_dm_trace.h"
80
81 /* Encoder functions */
82
amdgpu_dm_encoder_destroy(struct drm_encoder * encoder)83 static void amdgpu_dm_encoder_destroy(struct drm_encoder *encoder)
84 {
85 drm_encoder_cleanup(encoder);
86 kfree(encoder);
87 }
88
89 static const struct drm_encoder_funcs amdgpu_dm_encoder_funcs = {
90 .destroy = amdgpu_dm_encoder_destroy,
91 };
92
dm_encoder_helper_disable(struct drm_encoder * encoder)93 STATIC_IFN_KUNIT void dm_encoder_helper_disable(struct drm_encoder *encoder)
94 {
95 }
96 EXPORT_IF_KUNIT(dm_encoder_helper_disable);
97
dm_encoder_helper_atomic_check(struct drm_encoder * encoder,struct drm_crtc_state * crtc_state,struct drm_connector_state * conn_state)98 STATIC_IFN_KUNIT int dm_encoder_helper_atomic_check(struct drm_encoder *encoder,
99 struct drm_crtc_state *crtc_state,
100 struct drm_connector_state *conn_state)
101 {
102 struct drm_atomic_commit *state = crtc_state->state;
103 struct drm_connector *connector = conn_state->connector;
104 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
105 struct dm_connector_state *dm_new_connector_state = to_dm_connector_state(conn_state);
106 const struct drm_display_mode *adjusted_mode = &crtc_state->adjusted_mode;
107 struct drm_dp_mst_topology_mgr *mst_mgr;
108 struct drm_dp_mst_port *mst_port;
109 struct drm_dp_mst_topology_state *mst_state;
110 enum dc_color_depth color_depth;
111 int clock, bpp = 0;
112 bool is_y420 = false;
113
114 if ((connector->connector_type == DRM_MODE_CONNECTOR_eDP) ||
115 (connector->connector_type == DRM_MODE_CONNECTOR_LVDS)) {
116 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
117 struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
118 enum drm_mode_status result;
119
120 result = drm_crtc_helper_mode_valid_fixed(encoder->crtc, adjusted_mode, native_mode);
121 if (result != MODE_OK && dm_new_connector_state->scaling == RMX_OFF) {
122 drm_dbg_driver(encoder->dev,
123 "mode %dx%d@%dHz is not native, enabling scaling\n",
124 adjusted_mode->hdisplay, adjusted_mode->vdisplay,
125 drm_mode_vrefresh(adjusted_mode));
126 dm_new_connector_state->scaling = RMX_ASPECT;
127 }
128 return 0;
129 }
130
131 if (!aconnector->mst_output_port)
132 return 0;
133
134 mst_port = aconnector->mst_output_port;
135 mst_mgr = &aconnector->mst_root->mst_mgr;
136
137 if (!crtc_state->connectors_changed && !crtc_state->mode_changed)
138 return 0;
139
140 mst_state = drm_atomic_get_mst_topology_state(state, mst_mgr);
141 if (IS_ERR(mst_state))
142 return PTR_ERR(mst_state);
143
144 mst_state->pbn_div.full = dm_mst_get_pbn_divider(aconnector->mst_root->dc_link);
145
146 if (!state->duplicated) {
147 int max_bpc = conn_state->max_requested_bpc;
148
149 is_y420 = drm_mode_is_420_also(&connector->display_info, adjusted_mode) &&
150 aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR420;
151 color_depth = amdgpu_dm_convert_color_depth_from_display_info(connector,
152 is_y420,
153 max_bpc);
154 bpp = amdgpu_dm_convert_dc_color_depth_into_bpc(color_depth) * 3;
155 clock = adjusted_mode->clock;
156 dm_new_connector_state->pbn = drm_dp_calc_pbn_mode(clock, bpp << 4);
157 }
158
159 dm_new_connector_state->vcpi_slots =
160 drm_dp_atomic_find_time_slots(state, mst_mgr, mst_port,
161 dm_new_connector_state->pbn);
162 if (dm_new_connector_state->vcpi_slots < 0) {
163 drm_dbg_atomic(connector->dev, "failed finding vcpi slots: %d\n", (int)dm_new_connector_state->vcpi_slots);
164 return dm_new_connector_state->vcpi_slots;
165 }
166 return 0;
167 }
168 EXPORT_IF_KUNIT(dm_encoder_helper_atomic_check);
169
170 const struct drm_encoder_helper_funcs amdgpu_dm_encoder_helper_funcs = {
171 .disable = dm_encoder_helper_disable,
172 .atomic_check = dm_encoder_helper_atomic_check
173 };
174
amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device * adev)175 int amdgpu_dm_get_encoder_crtc_mask(struct amdgpu_device *adev)
176 {
177 switch (adev->mode_info.num_crtc) {
178 case 1:
179 return 0x1;
180 case 2:
181 return 0x3;
182 case 3:
183 return 0x7;
184 case 4:
185 return 0xf;
186 case 5:
187 return 0x1f;
188 case 6:
189 default:
190 return 0x3f;
191 }
192 }
193 EXPORT_IF_KUNIT(amdgpu_dm_get_encoder_crtc_mask);
194
amdgpu_dm_encoder_init(struct drm_device * dev,struct amdgpu_encoder * aencoder,uint32_t link_index)195 int amdgpu_dm_encoder_init(struct drm_device *dev,
196 struct amdgpu_encoder *aencoder,
197 uint32_t link_index)
198 {
199 struct amdgpu_device *adev = drm_to_adev(dev);
200
201 int res = drm_encoder_init(dev,
202 &aencoder->base,
203 &amdgpu_dm_encoder_funcs,
204 DRM_MODE_ENCODER_TMDS,
205 NULL);
206
207 aencoder->base.possible_crtcs = amdgpu_dm_get_encoder_crtc_mask(adev);
208
209 if (!res)
210 aencoder->encoder_id = link_index;
211 else
212 aencoder->encoder_id = -1;
213
214 drm_encoder_helper_add(&aencoder->base, &amdgpu_dm_encoder_helper_funcs);
215
216 return res;
217 }
218
get_subconnector_type(struct dc_link * link)219 STATIC_IFN_KUNIT enum drm_mode_subconnector get_subconnector_type(struct dc_link *link)
220 {
221 switch (link->dpcd_caps.dongle_type) {
222 case DISPLAY_DONGLE_NONE:
223 return DRM_MODE_SUBCONNECTOR_Native;
224 case DISPLAY_DONGLE_DP_VGA_CONVERTER:
225 return DRM_MODE_SUBCONNECTOR_VGA;
226 case DISPLAY_DONGLE_DP_DVI_CONVERTER:
227 case DISPLAY_DONGLE_DP_DVI_DONGLE:
228 return DRM_MODE_SUBCONNECTOR_DVID;
229 case DISPLAY_DONGLE_DP_HDMI_CONVERTER:
230 case DISPLAY_DONGLE_DP_HDMI_DONGLE:
231 return DRM_MODE_SUBCONNECTOR_HDMIA;
232 case DISPLAY_DONGLE_DP_HDMI_MISMATCHED_DONGLE:
233 default:
234 return DRM_MODE_SUBCONNECTOR_Unknown;
235 }
236 }
237 EXPORT_IF_KUNIT(get_subconnector_type);
238
update_subconnector_property(struct amdgpu_dm_connector * aconnector)239 STATIC_IFN_KUNIT void update_subconnector_property(struct amdgpu_dm_connector *aconnector)
240 {
241 struct dc_link *link = aconnector->dc_link;
242 struct drm_connector *connector = &aconnector->base;
243 enum drm_mode_subconnector subconnector = DRM_MODE_SUBCONNECTOR_Unknown;
244
245 if (connector->connector_type != DRM_MODE_CONNECTOR_DisplayPort)
246 return;
247
248 if (aconnector->dc_sink)
249 subconnector = get_subconnector_type(link);
250
251 drm_object_property_set_value(&connector->base,
252 connector->dev->mode_config.dp_subconnector_property,
253 subconnector);
254 }
255 EXPORT_IF_KUNIT(update_subconnector_property);
256
257 static int amdgpu_dm_connector_get_modes(struct drm_connector *connector);
258
amdgpu_dm_fbc_init(struct drm_connector * connector)259 STATIC_IFN_KUNIT void amdgpu_dm_fbc_init(struct drm_connector *connector)
260 {
261 struct amdgpu_device *adev = drm_to_adev(connector->dev);
262 struct dm_compressor_info *compressor = &adev->dm.compressor;
263 struct amdgpu_dm_connector *aconn = to_amdgpu_dm_connector(connector);
264 struct drm_display_mode *mode;
265 unsigned long max_size = 0;
266
267 if (adev->dm.dc->fbc_compressor == NULL)
268 return;
269
270 if (aconn->dc_link->connector_signal != SIGNAL_TYPE_EDP)
271 return;
272
273 if (compressor->bo_ptr)
274 return;
275
276
277 list_for_each_entry(mode, &connector->modes, head) {
278 if (max_size < (unsigned long) mode->htotal * mode->vtotal)
279 max_size = (unsigned long) mode->htotal * mode->vtotal;
280 }
281
282 if (max_size) {
283 int r = amdgpu_bo_create_kernel(adev, max_size * 4, PAGE_SIZE,
284 AMDGPU_GEM_DOMAIN_GTT, &compressor->bo_ptr,
285 &compressor->gpu_addr, &compressor->cpu_addr);
286
287 if (r)
288 drm_err(adev_to_drm(adev), "DM: Failed to initialize FBC\n");
289 else {
290 adev->dm.dc->ctx->fbc_gpu_addr = compressor->gpu_addr;
291 drm_info(adev_to_drm(adev), "DM: FBC alloc %lu\n", max_size*4);
292 }
293
294 }
295
296 }
297 EXPORT_IF_KUNIT(amdgpu_dm_fbc_init);
298
299
amdgpu_dm_detect_mst_link_for_all_connectors(struct drm_device * dev)300 int amdgpu_dm_detect_mst_link_for_all_connectors(struct drm_device *dev)
301 {
302 struct amdgpu_dm_connector *aconnector;
303 struct drm_connector *connector;
304 struct drm_connector_list_iter iter;
305 int ret = 0;
306
307 drm_connector_list_iter_begin(dev, &iter);
308 drm_for_each_connector_iter(connector, &iter) {
309
310 if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
311 continue;
312
313 aconnector = to_amdgpu_dm_connector(connector);
314 if (aconnector->dc_link->type == dc_connection_mst_branch &&
315 aconnector->mst_mgr.aux) {
316 drm_dbg_kms(dev, "DM_MST: starting TM on aconnector: %p [id: %d]\n",
317 aconnector,
318 aconnector->base.base.id);
319
320 ret = drm_dp_mst_topology_mgr_set_mst(&aconnector->mst_mgr, true);
321 if (ret < 0) {
322 drm_err(dev, "DM_MST: Failed to start MST\n");
323 aconnector->dc_link->type =
324 dc_connection_single;
325 ret = dm_helpers_dp_mst_stop_top_mgr(aconnector->dc_link->ctx,
326 aconnector->dc_link);
327 break;
328 }
329 }
330 }
331 drm_connector_list_iter_end(&iter);
332
333 return ret;
334 }
335 EXPORT_IF_KUNIT(amdgpu_dm_detect_mst_link_for_all_connectors);
336
hdmi_cec_unset_edid(struct amdgpu_dm_connector * aconnector)337 STATIC_IFN_KUNIT void hdmi_cec_unset_edid(struct amdgpu_dm_connector *aconnector)
338 {
339 struct cec_notifier *n = aconnector->notifier;
340
341 if (!n)
342 return;
343
344 cec_notifier_phys_addr_invalidate(n);
345 }
346 EXPORT_IF_KUNIT(hdmi_cec_unset_edid);
347
amdgpu_dm_hdmi_cec_set_edid(struct amdgpu_dm_connector * aconnector)348 void amdgpu_dm_hdmi_cec_set_edid(struct amdgpu_dm_connector *aconnector)
349 {
350 struct drm_connector *connector = &aconnector->base;
351 struct cec_notifier *n = aconnector->notifier;
352
353 if (!n)
354 return;
355
356 cec_notifier_set_phys_addr(n,
357 connector->display_info.source_physical_address);
358 }
359 EXPORT_IF_KUNIT(amdgpu_dm_hdmi_cec_set_edid);
360
amdgpu_dm_s3_handle_hdmi_cec(struct drm_device * ddev,bool suspend)361 void amdgpu_dm_s3_handle_hdmi_cec(struct drm_device *ddev, bool suspend)
362 {
363 struct amdgpu_dm_connector *aconnector;
364 struct drm_connector *connector;
365 struct drm_connector_list_iter conn_iter;
366
367 drm_connector_list_iter_begin(ddev, &conn_iter);
368 drm_for_each_connector_iter(connector, &conn_iter) {
369 if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
370 continue;
371
372 aconnector = to_amdgpu_dm_connector(connector);
373 if (suspend)
374 hdmi_cec_unset_edid(aconnector);
375 else
376 amdgpu_dm_hdmi_cec_set_edid(aconnector);
377 }
378 drm_connector_list_iter_end(&conn_iter);
379 }
380 EXPORT_IF_KUNIT(amdgpu_dm_s3_handle_hdmi_cec);
381
382
383 struct drm_connector *
amdgpu_dm_find_first_crtc_matching_connector(struct drm_atomic_commit * state,struct drm_crtc * crtc)384 amdgpu_dm_find_first_crtc_matching_connector(struct drm_atomic_commit *state,
385 struct drm_crtc *crtc)
386 {
387 u32 i;
388 struct drm_connector_state *new_con_state;
389 struct drm_connector *connector;
390 struct drm_crtc *crtc_from_state;
391
392 for_each_new_connector_in_state(state, connector, new_con_state, i) {
393 crtc_from_state = new_con_state->crtc;
394
395 if (crtc_from_state == crtc)
396 return connector;
397 }
398
399 return NULL;
400 }
401 EXPORT_IF_KUNIT(amdgpu_dm_find_first_crtc_matching_connector);
402
amdgpu_dm_set_panel_type(struct amdgpu_dm_connector * aconnector)403 STATIC_IFN_KUNIT void amdgpu_dm_set_panel_type(struct amdgpu_dm_connector *aconnector)
404 {
405 struct drm_connector *connector = &aconnector->base;
406 struct drm_display_info *display_info = &connector->display_info;
407 struct dc_link *link = aconnector->dc_link;
408 struct amdgpu_device *adev;
409 enum dc_panel_type panel_type = PANEL_TYPE_NONE;
410
411 adev = drm_to_adev(connector->dev);
412
413 switch (display_info->amd_vsdb.panel_type) {
414 case AMD_VSDB_PANEL_TYPE_OLED:
415 panel_type = PANEL_TYPE_OLED;
416 break;
417 case AMD_VSDB_PANEL_TYPE_MINILED:
418 panel_type = PANEL_TYPE_MINILED;
419 break;
420 }
421
422 /* If VSDB didn't determine panel type, check DPCD ext caps */
423 if (panel_type == PANEL_TYPE_NONE) {
424 if (link->dpcd_sink_ext_caps.bits.miniled == 1)
425 panel_type = PANEL_TYPE_MINILED;
426 if (link->dpcd_sink_ext_caps.bits.oled == 1)
427 panel_type = PANEL_TYPE_OLED;
428 }
429
430 /* If VSDB and DPCD didn't determine panel type, check DID */
431 if (panel_type == PANEL_TYPE_NONE) {
432 if (display_info->panel_type == DRM_MODE_PANEL_TYPE_LCD)
433 panel_type = PANEL_TYPE_LCD;
434 else if (display_info->panel_type == DRM_MODE_PANEL_TYPE_OLED)
435 panel_type = PANEL_TYPE_OLED;
436 }
437
438 if (panel_type == PANEL_TYPE_NONE) {
439 struct drm_amd_vsdb_info *vsdb = &display_info->amd_vsdb;
440 u32 lum1_max = vsdb->luminance_range1.max_luminance;
441 u32 lum2_max = vsdb->luminance_range2.max_luminance;
442
443 if (vsdb->version && link->local_sink &&
444 link->local_sink->edid_caps.manufacturer_id ==
445 DDC_MANUFACTURERNAME_SAMSUNG &&
446 lum1_max >= ((lum2_max * 3) / 2))
447 panel_type = PANEL_TYPE_MINILED;
448 }
449
450 if (panel_type != PANEL_TYPE_NONE)
451 link->panel_type = panel_type;
452 else
453 link->panel_type = PANEL_TYPE_LCD;
454
455 if (link->panel_type == PANEL_TYPE_OLED)
456 drm_object_property_set_value(&connector->base,
457 adev_to_drm(adev)->mode_config.panel_type_property,
458 DRM_MODE_PANEL_TYPE_OLED);
459 else if (link->panel_type == PANEL_TYPE_LCD)
460 drm_object_property_set_value(&connector->base,
461 adev_to_drm(adev)->mode_config.panel_type_property,
462 DRM_MODE_PANEL_TYPE_LCD);
463 else
464 drm_object_property_set_value(&connector->base,
465 adev_to_drm(adev)->mode_config.panel_type_property,
466 DRM_MODE_PANEL_TYPE_UNKNOWN);
467
468 drm_dbg_kms(aconnector->base.dev, "Panel type: %d\n", link->panel_type);
469 }
470 EXPORT_IF_KUNIT(amdgpu_dm_set_panel_type);
471
amdgpu_dm_update_cacp_caps(struct amdgpu_dm_connector * aconnector)472 STATIC_IFN_KUNIT void amdgpu_dm_update_cacp_caps(struct amdgpu_dm_connector *aconnector)
473 {
474 struct amdgpu_device *adev = drm_to_adev(aconnector->base.dev);
475 struct dc_link *link = aconnector->dc_link;
476
477 link->panel_config.cacp.cacp_supported = true;
478
479 if (amdgpu_ip_version(adev, DCE_HWIP, 0) < IP_VERSION(3, 1, 4) ||
480 amdgpu_ip_version(adev, DCE_HWIP, 0) == IP_VERSION(3, 1, 6)) {
481 link->panel_config.cacp.cacp_supported = false;
482 return;
483 }
484
485 if (link->connector_signal != SIGNAL_TYPE_EDP &&
486 link->connector_signal != SIGNAL_TYPE_LVDS) {
487 link->panel_config.cacp.cacp_supported = false;
488 return;
489 }
490
491 if (link->panel_type == PANEL_TYPE_LCD)
492 link->panel_config.cacp.cacp_supported = false;
493
494 drm_dbg_kms(aconnector->base.dev, "cacp_supported: %d\n",
495 link->panel_config.cacp.cacp_supported);
496 }
497 EXPORT_IF_KUNIT(amdgpu_dm_update_cacp_caps);
498
DEFINE_FREE(sink_release,struct dc_sink *,if (_T)dc_sink_release (_T))499 DEFINE_FREE(sink_release, struct dc_sink *, if (_T) dc_sink_release(_T))
500
501 void amdgpu_dm_update_connector_after_detect(
502 struct amdgpu_dm_connector *aconnector)
503 {
504 struct drm_connector *connector = &aconnector->base;
505 struct dc_sink *sink __free(sink_release) = NULL;
506 struct drm_device *dev = connector->dev;
507 struct amdgpu_device *adev = drm_to_adev(dev);
508 int inst;
509
510 /* MST handled by drm_mst framework */
511 if (aconnector->mst_mgr.mst_state)
512 return;
513
514 sink = aconnector->dc_link->local_sink;
515 if (sink)
516 dc_sink_retain(sink);
517
518 /*
519 * Edid mgmt connector gets first update only in mode_valid hook and then
520 * the connector sink is set to either fake or physical sink depends on link status.
521 * Skip if already done during boot.
522 */
523 if (aconnector->base.force != DRM_FORCE_UNSPECIFIED
524 && aconnector->dc_em_sink) {
525
526 /*
527 * For S3 resume with headless use eml_sink to fake stream
528 * because on resume connector->sink is set to NULL
529 */
530 guard(mutex)(&dev->mode_config.mutex);
531
532 if (sink) {
533 if (aconnector->dc_sink) {
534 amdgpu_dm_update_freesync_caps(connector, NULL, true);
535 /*
536 * retain and release below are used to
537 * bump up refcount for sink because the link doesn't point
538 * to it anymore after disconnect, so on next crtc to connector
539 * reshuffle by UMD we will get into unwanted dc_sink release
540 */
541 dc_sink_release(aconnector->dc_sink);
542 }
543 aconnector->dc_sink = sink;
544 dc_sink_retain(aconnector->dc_sink);
545 amdgpu_dm_update_freesync_caps(connector,
546 aconnector->drm_edid, true);
547 } else {
548 amdgpu_dm_update_freesync_caps(connector, NULL, true);
549 if (!aconnector->dc_sink) {
550 aconnector->dc_sink = aconnector->dc_em_sink;
551 dc_sink_retain(aconnector->dc_sink);
552 }
553 }
554
555 return;
556 }
557
558 /*
559 * TODO: temporary guard to look for proper fix
560 * if this sink is MST sink, we should not do anything
561 */
562 if (sink && sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
563 return;
564
565 if (aconnector->dc_sink == sink) {
566 /*
567 * We got a DP short pulse (Link Loss, DP CTS, etc...).
568 * Do nothing!!
569 */
570 drm_dbg_kms(dev, "DCHPD: connector_id=%d: dc_sink didn't change.\n",
571 aconnector->connector_id);
572 return;
573 }
574
575 drm_dbg_kms(dev, "DCHPD: connector_id=%d: Old sink=%p New sink=%p\n",
576 aconnector->connector_id, aconnector->dc_sink, sink);
577
578 /* When polling, DRM has already locked the mutex for us. */
579 if (!drm_kms_helper_is_poll_worker())
580 mutex_lock(&dev->mode_config.mutex);
581
582 /*
583 * 1. Update status of the drm connector
584 * 2. Send an event and let userspace tell us what to do
585 */
586 if (sink) {
587 /*
588 * TODO: check if we still need the S3 mode update workaround.
589 * If yes, put it here.
590 */
591 if (aconnector->dc_sink) {
592 amdgpu_dm_update_freesync_caps(connector, NULL, true);
593 dc_sink_release(aconnector->dc_sink);
594 }
595
596 aconnector->dc_sink = sink;
597 dc_sink_retain(aconnector->dc_sink);
598 drm_edid_free(aconnector->drm_edid);
599 aconnector->drm_edid = NULL;
600 if (sink->dc_edid.length == 0) {
601 hdmi_cec_unset_edid(aconnector);
602 if (aconnector->dc_link->aux_mode)
603 drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
604 } else {
605 const struct edid *edid = (const struct edid *)sink->dc_edid.raw_edid;
606
607 aconnector->drm_edid = drm_edid_alloc(edid, sink->dc_edid.length);
608 drm_edid_connector_update(connector, aconnector->drm_edid);
609
610 amdgpu_dm_hdmi_cec_set_edid(aconnector);
611 if (aconnector->dc_link->aux_mode)
612 drm_dp_cec_attach(&aconnector->dm_dp_aux.aux,
613 connector->display_info.source_physical_address);
614 }
615
616 if (!aconnector->timing_requested) {
617 aconnector->timing_requested =
618 kzalloc_obj(struct dc_crtc_timing);
619 if (!aconnector->timing_requested)
620 drm_err(dev,
621 "failed to create aconnector->requested_timing\n");
622 }
623
624 amdgpu_dm_update_freesync_caps(connector, aconnector->drm_edid, true);
625 amdgpu_dm_update_connector_ext_caps(aconnector);
626 amdgpu_dm_set_panel_type(aconnector);
627 amdgpu_dm_update_cacp_caps(aconnector);
628
629 if (aconnector->hdmi_comp_auto) {
630 if (sink->sink_signal != SIGNAL_TYPE_HDMI_FRL)
631 sink->sink_signal = SIGNAL_TYPE_HDMI_FRL;
632 }
633 } else {
634 hdmi_cec_unset_edid(aconnector);
635 drm_dp_cec_unset_edid(&aconnector->dm_dp_aux.aux);
636 amdgpu_dm_update_freesync_caps(connector, NULL, true);
637 aconnector->num_modes = 0;
638 dc_sink_release(aconnector->dc_sink);
639 aconnector->dc_sink = NULL;
640 drm_edid_free(aconnector->drm_edid);
641 aconnector->drm_edid = NULL;
642 kfree(aconnector->timing_requested);
643 aconnector->timing_requested = NULL;
644 /* Set CP to DESIRED if it was ENABLED, so we can re-enable it again on hotplug */
645 if (connector->state->content_protection == DRM_MODE_CONTENT_PROTECTION_ENABLED)
646 connector->state->content_protection = DRM_MODE_CONTENT_PROTECTION_DESIRED;
647
648 mutex_lock(&adev->dm.audio_lock);
649 inst = aconnector->audio_inst;
650 aconnector->audio_inst = -1;
651 mutex_unlock(&adev->dm.audio_lock);
652 if (inst != -1)
653 amdgpu_dm_audio_eld_notify(adev, inst);
654 }
655
656 update_subconnector_property(aconnector);
657
658 /* When polling, the mutex will be unlocked for us by DRM. */
659 if (!drm_kms_helper_is_poll_worker())
660 mutex_unlock(&dev->mode_config.mutex);
661 }
662 EXPORT_IF_KUNIT(amdgpu_dm_update_connector_after_detect);
663
664 enum dc_color_depth
amdgpu_dm_convert_color_depth_from_display_info(const struct drm_connector * connector,bool is_y420,int requested_bpc)665 amdgpu_dm_convert_color_depth_from_display_info(const struct drm_connector *connector,
666 bool is_y420, int requested_bpc)
667 {
668 u8 bpc;
669
670 if (is_y420) {
671 bpc = 8;
672
673 /* Cap display bpc based on HDMI 2.0 HF-VSDB */
674 if (connector->display_info.hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_48)
675 bpc = 16;
676 else if (connector->display_info.hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_36)
677 bpc = 12;
678 else if (connector->display_info.hdmi.y420_dc_modes & DRM_EDID_YCBCR420_DC_30)
679 bpc = 10;
680 } else {
681 bpc = (uint8_t)connector->display_info.bpc;
682 /* Assume 8 bpc by default if no bpc is specified. */
683 bpc = bpc ? bpc : 8;
684 }
685
686 if (requested_bpc > 0) {
687 /*
688 * Cap display bpc based on the user requested value.
689 *
690 * The value for state->max_bpc may not correctly updated
691 * depending on when the connector gets added to the state
692 * or if this was called outside of atomic check, so it
693 * can't be used directly.
694 */
695 bpc = min_t(u8, bpc, requested_bpc);
696
697 /* Round down to the nearest even number. */
698 bpc = bpc - (bpc & 1);
699 }
700
701 switch (bpc) {
702 case 0:
703 /*
704 * Temporary Work around, DRM doesn't parse color depth for
705 * EDID revision before 1.4
706 * TODO: Fix edid parsing
707 */
708 return COLOR_DEPTH_888;
709 case 6:
710 return COLOR_DEPTH_666;
711 case 8:
712 return COLOR_DEPTH_888;
713 case 10:
714 return COLOR_DEPTH_101010;
715 case 12:
716 return COLOR_DEPTH_121212;
717 case 14:
718 return COLOR_DEPTH_141414;
719 case 16:
720 return COLOR_DEPTH_161616;
721 default:
722 return COLOR_DEPTH_UNDEFINED;
723 }
724 }
725 EXPORT_IF_KUNIT(amdgpu_dm_convert_color_depth_from_display_info);
726
727 STATIC_IFN_KUNIT enum dc_aspect_ratio
get_aspect_ratio(const struct drm_display_mode * mode_in)728 get_aspect_ratio(const struct drm_display_mode *mode_in)
729 {
730 /* 1-1 mapping, since both enums follow the HDMI spec. */
731 return (enum dc_aspect_ratio) mode_in->picture_aspect_ratio;
732 }
733 EXPORT_IF_KUNIT(get_aspect_ratio);
734
735 enum dc_color_space
amdgpu_dm_get_output_color_space(const struct dc_crtc_timing * dc_crtc_timing,const struct drm_connector_state * connector_state)736 amdgpu_dm_get_output_color_space(const struct dc_crtc_timing *dc_crtc_timing,
737 const struct drm_connector_state *connector_state)
738 {
739 enum dc_color_space color_space = COLOR_SPACE_SRGB;
740
741 switch (connector_state->colorspace) {
742 case DRM_MODE_COLORIMETRY_BT601_YCC:
743 if (dc_crtc_timing->flags.Y_ONLY)
744 color_space = COLOR_SPACE_YCBCR601_LIMITED;
745 else
746 color_space = COLOR_SPACE_YCBCR601;
747 break;
748 case DRM_MODE_COLORIMETRY_BT709_YCC:
749 if (dc_crtc_timing->flags.Y_ONLY)
750 color_space = COLOR_SPACE_YCBCR709_LIMITED;
751 else
752 color_space = COLOR_SPACE_YCBCR709;
753 break;
754 case DRM_MODE_COLORIMETRY_OPRGB:
755 color_space = COLOR_SPACE_ADOBERGB;
756 break;
757 case DRM_MODE_COLORIMETRY_BT2020_RGB:
758 case DRM_MODE_COLORIMETRY_BT2020_YCC:
759 if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) {
760 if (connector_state->hdmi.broadcast_rgb == DRM_HDMI_BROADCAST_RGB_LIMITED)
761 color_space = COLOR_SPACE_2020_RGB_LIMITEDRANGE;
762 else
763 color_space = COLOR_SPACE_2020_RGB_FULLRANGE;
764 } else {
765 color_space = COLOR_SPACE_2020_YCBCR_LIMITED;
766 }
767 break;
768 case DRM_MODE_COLORIMETRY_DEFAULT: /* ITU601 */
769 default:
770 if (dc_crtc_timing->pixel_encoding == PIXEL_ENCODING_RGB) {
771 color_space = COLOR_SPACE_SRGB;
772 if (connector_state->hdmi.broadcast_rgb == DRM_HDMI_BROADCAST_RGB_LIMITED)
773 color_space = COLOR_SPACE_SRGB_LIMITED;
774 /*
775 * 27030khz is the separation point between HDTV and SDTV
776 * according to HDMI spec, we use YCbCr709 and YCbCr601
777 * respectively
778 */
779 } else if (dc_crtc_timing->pix_clk_100hz > 270300) {
780 if (dc_crtc_timing->flags.Y_ONLY)
781 color_space =
782 COLOR_SPACE_YCBCR709_LIMITED;
783 else
784 color_space = COLOR_SPACE_YCBCR709;
785 } else {
786 if (dc_crtc_timing->flags.Y_ONLY)
787 color_space =
788 COLOR_SPACE_YCBCR601_LIMITED;
789 else
790 color_space = COLOR_SPACE_YCBCR601;
791 }
792 break;
793 }
794
795 return color_space;
796 }
797 EXPORT_IF_KUNIT(amdgpu_dm_get_output_color_space);
798
799 STATIC_IFN_KUNIT enum display_content_type
get_output_content_type(const struct drm_connector_state * connector_state)800 get_output_content_type(const struct drm_connector_state *connector_state)
801 {
802 switch (connector_state->content_type) {
803 default:
804 case DRM_MODE_CONTENT_TYPE_NO_DATA:
805 return DISPLAY_CONTENT_TYPE_NO_DATA;
806 case DRM_MODE_CONTENT_TYPE_GRAPHICS:
807 return DISPLAY_CONTENT_TYPE_GRAPHICS;
808 case DRM_MODE_CONTENT_TYPE_PHOTO:
809 return DISPLAY_CONTENT_TYPE_PHOTO;
810 case DRM_MODE_CONTENT_TYPE_CINEMA:
811 return DISPLAY_CONTENT_TYPE_CINEMA;
812 case DRM_MODE_CONTENT_TYPE_GAME:
813 return DISPLAY_CONTENT_TYPE_GAME;
814 }
815 }
816 EXPORT_IF_KUNIT(get_output_content_type);
817
adjust_colour_depth_from_display_info(struct dc_crtc_timing * timing_out,const struct drm_display_info * info)818 STATIC_IFN_KUNIT bool adjust_colour_depth_from_display_info(
819 struct dc_crtc_timing *timing_out,
820 const struct drm_display_info *info)
821 {
822 enum dc_color_depth depth = timing_out->display_color_depth;
823 int normalized_clk;
824
825 do {
826 normalized_clk = timing_out->pix_clk_100hz / 10;
827 /* YCbCr 4:2:0 requires additional adjustment of 1/2 */
828 if (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420)
829 normalized_clk /= 2;
830 /* Adjusting pix clock following on HDMI spec based on colour depth */
831 switch (depth) {
832 case COLOR_DEPTH_888:
833 break;
834 case COLOR_DEPTH_101010:
835 normalized_clk = (normalized_clk * 30) / 24;
836 break;
837 case COLOR_DEPTH_121212:
838 normalized_clk = (normalized_clk * 36) / 24;
839 break;
840 case COLOR_DEPTH_161616:
841 normalized_clk = (normalized_clk * 48) / 24;
842 break;
843 default:
844 /* The above depths are the only ones valid for HDMI. */
845 return false;
846 }
847 if (normalized_clk <= info->max_tmds_clock) {
848 timing_out->display_color_depth = depth;
849 return true;
850 }
851 } while (--depth > COLOR_DEPTH_666);
852 return false;
853 }
854 EXPORT_IF_KUNIT(adjust_colour_depth_from_display_info);
855
fill_stream_properties_from_drm_display_mode(struct dc_stream_state * stream,const struct drm_display_mode * mode_in,const struct drm_connector * connector,const struct drm_connector_state * connector_state,const struct dc_stream_state * old_stream,int requested_bpc,enum dc_pixel_encoding requested_encoding,bool is_hdmi_ep)856 STATIC_IFN_KUNIT void fill_stream_properties_from_drm_display_mode(
857 struct dc_stream_state *stream,
858 const struct drm_display_mode *mode_in,
859 const struct drm_connector *connector,
860 const struct drm_connector_state *connector_state,
861 const struct dc_stream_state *old_stream,
862 int requested_bpc,
863 enum dc_pixel_encoding requested_encoding,
864 bool is_hdmi_ep)
865 {
866 struct dc_crtc_timing *timing_out = &stream->timing;
867 const struct drm_display_info *info = &connector->display_info;
868 struct amdgpu_dm_connector *aconnector = NULL;
869 struct hdmi_vendor_infoframe hv_frame;
870 struct hdmi_avi_infoframe avi_frame;
871 ssize_t err;
872
873 if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
874 aconnector = to_amdgpu_dm_connector(connector);
875
876 memset(&hv_frame, 0, sizeof(hv_frame));
877 memset(&avi_frame, 0, sizeof(avi_frame));
878
879 timing_out->h_border_left = 0;
880 timing_out->h_border_right = 0;
881 timing_out->v_border_top = 0;
882 timing_out->v_border_bottom = 0;
883
884 /*
885 * The pixel encoding to use is decided entirely by the caller (see
886 * amdgpu_dm_create_validate_stream_for_sink()), which enumerates only
887 * the encodings the sink actually advertises. This helper must not
888 * second-guess that choice; it simply applies it.
889 */
890 timing_out->pixel_encoding = requested_encoding;
891
892 timing_out->timing_3d_format = TIMING_3D_FORMAT_NONE;
893 timing_out->display_color_depth = amdgpu_dm_convert_color_depth_from_display_info(
894 connector,
895 (timing_out->pixel_encoding == PIXEL_ENCODING_YCBCR420),
896 requested_bpc);
897 timing_out->scan_type = SCANNING_TYPE_NODATA;
898 timing_out->hdmi_vic = 0;
899
900 if (old_stream) {
901 timing_out->vic = old_stream->timing.vic;
902 timing_out->flags.HSYNC_POSITIVE_POLARITY = old_stream->timing.flags.HSYNC_POSITIVE_POLARITY;
903 timing_out->flags.VSYNC_POSITIVE_POLARITY = old_stream->timing.flags.VSYNC_POSITIVE_POLARITY;
904 } else {
905 timing_out->vic = drm_match_cea_mode(mode_in);
906 if (mode_in->flags & DRM_MODE_FLAG_PHSYNC)
907 timing_out->flags.HSYNC_POSITIVE_POLARITY = 1;
908 if (mode_in->flags & DRM_MODE_FLAG_PVSYNC)
909 timing_out->flags.VSYNC_POSITIVE_POLARITY = 1;
910 }
911
912 if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A ||
913 stream->signal == SIGNAL_TYPE_HDMI_FRL) {
914 err = drm_hdmi_avi_infoframe_from_display_mode(&avi_frame,
915 (struct drm_connector *)connector,
916 mode_in);
917 if (err < 0)
918 drm_warn_once(connector->dev, "Failed to setup avi infoframe on connector %s: %zd\n",
919 connector->name, err);
920 timing_out->vic = avi_frame.video_code;
921 err = drm_hdmi_vendor_infoframe_from_display_mode(&hv_frame,
922 (struct drm_connector *)connector,
923 mode_in);
924 if (err < 0)
925 drm_warn_once(connector->dev, "Failed to setup vendor infoframe on connector %s: %zd\n",
926 connector->name, err);
927 timing_out->hdmi_vic = hv_frame.vic;
928 }
929
930 if (aconnector && amdgpu_dm_is_freesync_video_mode(mode_in, aconnector)) {
931 timing_out->h_addressable = mode_in->hdisplay;
932 timing_out->h_total = mode_in->htotal;
933 timing_out->h_sync_width = mode_in->hsync_end - mode_in->hsync_start;
934 timing_out->h_front_porch = mode_in->hsync_start - mode_in->hdisplay;
935 timing_out->v_total = mode_in->vtotal;
936 timing_out->v_addressable = mode_in->vdisplay;
937 timing_out->v_front_porch = mode_in->vsync_start - mode_in->vdisplay;
938 timing_out->v_sync_width = mode_in->vsync_end - mode_in->vsync_start;
939 timing_out->pix_clk_100hz = mode_in->clock * 10;
940 } else {
941 timing_out->h_addressable = mode_in->crtc_hdisplay;
942 timing_out->h_total = mode_in->crtc_htotal;
943 timing_out->h_sync_width = mode_in->crtc_hsync_end - mode_in->crtc_hsync_start;
944 timing_out->h_front_porch = mode_in->crtc_hsync_start - mode_in->crtc_hdisplay;
945 timing_out->v_total = mode_in->crtc_vtotal;
946 timing_out->v_addressable = mode_in->crtc_vdisplay;
947 timing_out->v_front_porch = mode_in->crtc_vsync_start - mode_in->crtc_vdisplay;
948 timing_out->v_sync_width = mode_in->crtc_vsync_end - mode_in->crtc_vsync_start;
949 timing_out->pix_clk_100hz = mode_in->crtc_clock * 10;
950 }
951
952 timing_out->aspect_ratio = get_aspect_ratio(mode_in);
953
954 stream->out_transfer_func.type = TF_TYPE_PREDEFINED;
955 stream->out_transfer_func.tf = TRANSFER_FUNCTION_SRGB;
956
957 /* Clamp the HDMI colour depth to what the sink's max TMDS clock
958 * allows. The pixel encoding is fixed by the caller and must not be
959 * changed here: the caller already enumerates YCbCr420 as its own
960 * candidate, so silently switching to it would hide an enumeration
961 * bug and produce a stream the caller never asked to validate.
962 */
963 if (is_hdmi_ep)
964 adjust_colour_depth_from_display_info(timing_out, info);
965
966 stream->output_color_space = amdgpu_dm_get_output_color_space(timing_out, connector_state);
967 stream->content_type = get_output_content_type(connector_state);
968 }
969 EXPORT_IF_KUNIT(fill_stream_properties_from_drm_display_mode);
970
971 STATIC_IFN_KUNIT void
copy_crtc_timing_for_drm_display_mode(const struct drm_display_mode * src_mode,struct drm_display_mode * dst_mode)972 copy_crtc_timing_for_drm_display_mode(const struct drm_display_mode *src_mode,
973 struct drm_display_mode *dst_mode)
974 {
975 dst_mode->crtc_hdisplay = src_mode->crtc_hdisplay;
976 dst_mode->crtc_vdisplay = src_mode->crtc_vdisplay;
977 dst_mode->crtc_clock = src_mode->crtc_clock;
978 dst_mode->crtc_hblank_start = src_mode->crtc_hblank_start;
979 dst_mode->crtc_hblank_end = src_mode->crtc_hblank_end;
980 dst_mode->crtc_hsync_start = src_mode->crtc_hsync_start;
981 dst_mode->crtc_hsync_end = src_mode->crtc_hsync_end;
982 dst_mode->crtc_htotal = src_mode->crtc_htotal;
983 dst_mode->crtc_hskew = src_mode->crtc_hskew;
984 dst_mode->crtc_vblank_start = src_mode->crtc_vblank_start;
985 dst_mode->crtc_vblank_end = src_mode->crtc_vblank_end;
986 dst_mode->crtc_vsync_start = src_mode->crtc_vsync_start;
987 dst_mode->crtc_vsync_end = src_mode->crtc_vsync_end;
988 dst_mode->crtc_vtotal = src_mode->crtc_vtotal;
989 }
990 EXPORT_IF_KUNIT(copy_crtc_timing_for_drm_display_mode);
991
992 STATIC_IFN_KUNIT void
decide_crtc_timing_for_drm_display_mode(struct drm_display_mode * drm_mode,const struct drm_display_mode * native_mode,bool scale_enabled)993 decide_crtc_timing_for_drm_display_mode(struct drm_display_mode *drm_mode,
994 const struct drm_display_mode *native_mode,
995 bool scale_enabled)
996 {
997 if (scale_enabled || (
998 native_mode->clock == drm_mode->clock &&
999 native_mode->htotal == drm_mode->htotal &&
1000 native_mode->vtotal == drm_mode->vtotal)) {
1001 if (native_mode->crtc_clock)
1002 copy_crtc_timing_for_drm_display_mode(native_mode, drm_mode);
1003 } else {
1004 /* no scaling nor amdgpu inserted, no need to patch */
1005 }
1006 }
1007 EXPORT_IF_KUNIT(decide_crtc_timing_for_drm_display_mode);
1008
1009 static struct dc_sink *
create_fake_sink(struct drm_device * dev,struct dc_link * link)1010 create_fake_sink(struct drm_device *dev, struct dc_link *link)
1011 {
1012 struct dc_sink_init_data sink_init_data = { 0 };
1013 struct dc_sink *sink = NULL;
1014
1015 sink_init_data.link = link;
1016 sink_init_data.sink_signal = link->connector_signal;
1017
1018 sink = dc_sink_create(&sink_init_data);
1019 if (!sink) {
1020 drm_err(dev, "Failed to create sink!\n");
1021 return NULL;
1022 }
1023 sink->sink_signal = SIGNAL_TYPE_VIRTUAL;
1024
1025 return sink;
1026 }
1027
1028 /**
1029 * DOC: FreeSync Video
1030 *
1031 * When a userspace application wants to play a video, the content follows a
1032 * standard format definition that usually specifies the FPS for that format.
1033 * The below list illustrates some video format and the expected FPS,
1034 * respectively:
1035 *
1036 * - TV/NTSC (23.976 FPS)
1037 * - Cinema (24 FPS)
1038 * - TV/PAL (25 FPS)
1039 * - TV/NTSC (29.97 FPS)
1040 * - TV/NTSC (30 FPS)
1041 * - Cinema HFR (48 FPS)
1042 * - TV/PAL (50 FPS)
1043 * - Commonly used (60 FPS)
1044 * - Multiples of 24 (48,72,96 FPS)
1045 *
1046 * The list of standards video format is not huge and can be added to the
1047 * connector modeset list beforehand. With that, userspace can leverage
1048 * FreeSync to extends the front porch in order to attain the target refresh
1049 * rate. Such a switch will happen seamlessly, without screen blanking or
1050 * reprogramming of the output in any other way. If the userspace requests a
1051 * modesetting change compatible with FreeSync modes that only differ in the
1052 * refresh rate, DC will skip the full update and avoid blink during the
1053 * transition. For example, the video player can change the modesetting from
1054 * 60Hz to 30Hz for playing TV/NTSC content when it goes full screen without
1055 * causing any display blink. This same concept can be applied to a mode
1056 * setting change.
1057 */
1058 struct drm_display_mode *
amdgpu_dm_get_highest_refresh_rate_mode(struct amdgpu_dm_connector * aconnector,bool use_probed_modes)1059 amdgpu_dm_get_highest_refresh_rate_mode(struct amdgpu_dm_connector *aconnector,
1060 bool use_probed_modes)
1061 {
1062 struct drm_display_mode *m, *m_pref = NULL;
1063 u16 current_refresh, highest_refresh;
1064 struct list_head *list_head = use_probed_modes ?
1065 &aconnector->base.probed_modes :
1066 &aconnector->base.modes;
1067
1068 if (aconnector->base.connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
1069 return NULL;
1070
1071 if (aconnector->freesync_vid_base.clock != 0)
1072 return &aconnector->freesync_vid_base;
1073
1074 /* Find the preferred mode */
1075 list_for_each_entry(m, list_head, head) {
1076 if (m->type & DRM_MODE_TYPE_PREFERRED) {
1077 m_pref = m;
1078 break;
1079 }
1080 }
1081
1082 if (!m_pref) {
1083 /* Probably an EDID with no preferred mode. Fallback to first entry */
1084 m_pref = list_first_entry_or_null(
1085 &aconnector->base.modes, struct drm_display_mode, head);
1086 if (!m_pref) {
1087 drm_dbg_driver(aconnector->base.dev, "No preferred mode found in EDID\n");
1088 return NULL;
1089 }
1090 }
1091
1092 highest_refresh = drm_mode_vrefresh(m_pref);
1093
1094 /*
1095 * Find the mode with highest refresh rate with same resolution.
1096 * For some monitors, preferred mode is not the mode with highest
1097 * supported refresh rate.
1098 */
1099 list_for_each_entry(m, list_head, head) {
1100 current_refresh = drm_mode_vrefresh(m);
1101
1102 if (m->hdisplay == m_pref->hdisplay &&
1103 m->vdisplay == m_pref->vdisplay &&
1104 highest_refresh < current_refresh) {
1105 highest_refresh = current_refresh;
1106 m_pref = m;
1107 }
1108 }
1109
1110 drm_mode_copy(&aconnector->freesync_vid_base, m_pref);
1111 return m_pref;
1112 }
1113 EXPORT_IF_KUNIT(amdgpu_dm_get_highest_refresh_rate_mode);
1114
amdgpu_dm_is_freesync_video_mode(const struct drm_display_mode * mode,struct amdgpu_dm_connector * aconnector)1115 bool amdgpu_dm_is_freesync_video_mode(const struct drm_display_mode *mode,
1116 struct amdgpu_dm_connector *aconnector)
1117 {
1118 struct drm_display_mode *high_mode;
1119 int timing_diff;
1120
1121 high_mode = amdgpu_dm_get_highest_refresh_rate_mode(aconnector, false);
1122 if (!high_mode || !mode)
1123 return false;
1124
1125 timing_diff = high_mode->vtotal - mode->vtotal;
1126
1127 if (high_mode->clock == 0 || high_mode->clock != mode->clock ||
1128 high_mode->hdisplay != mode->hdisplay ||
1129 high_mode->vdisplay != mode->vdisplay ||
1130 high_mode->hsync_start != mode->hsync_start ||
1131 high_mode->hsync_end != mode->hsync_end ||
1132 high_mode->htotal != mode->htotal ||
1133 high_mode->hskew != mode->hskew ||
1134 high_mode->vscan != mode->vscan ||
1135 high_mode->vsync_start - mode->vsync_start != timing_diff ||
1136 high_mode->vsync_end - mode->vsync_end != timing_diff)
1137 return false;
1138 else
1139 return true;
1140 }
1141 EXPORT_IF_KUNIT(amdgpu_dm_is_freesync_video_mode);
1142
1143 #if defined(CONFIG_DRM_AMD_DC_FP)
update_dsc_caps(struct amdgpu_dm_connector * aconnector,struct dc_sink * sink,struct dc_stream_state * stream,struct dsc_dec_dpcd_caps * dsc_caps)1144 static void update_dsc_caps(struct amdgpu_dm_connector *aconnector,
1145 struct dc_sink *sink, struct dc_stream_state *stream,
1146 struct dsc_dec_dpcd_caps *dsc_caps)
1147 {
1148 stream->timing.flags.DSC = 0;
1149 dsc_caps->is_dsc_supported = false;
1150
1151 if (aconnector->dc_link && (sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT ||
1152 sink->sink_signal == SIGNAL_TYPE_EDP)) {
1153 if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_NONE)
1154 dc_dsc_parse_dsc_dpcd(aconnector->dc_link->ctx->dc,
1155 aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,
1156 aconnector->dc_link->dpcd_caps.dsc_caps.dsc_branch_decoder_caps.raw,
1157 dsc_caps);
1158 else if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) {
1159 if (aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.fields.dsc_support.DSC_PASSTHROUGH_SUPPORT &&
1160 !aconnector->dsc_settings.dsc_force_disable_passthrough &&
1161 aconnector->dc_link->dpcd_caps.dongle_caps.dp_hdmi_frl_max_link_bw_in_kbps > 0 &&
1162 sink->edid_caps.frl_dsc_support &&
1163 sink->edid_caps.max_frl_rate > 0 &&
1164 sink->edid_caps.frl_dsc_max_frl_rate > 0)
1165 dc_dsc_parse_dsc_edid(aconnector->dc_link->ctx->dc, &sink->edid_caps, dsc_caps);
1166 else
1167 dc_dsc_parse_dsc_dpcd(aconnector->dc_link->ctx->dc,
1168 aconnector->dc_link->dpcd_caps.dsc_caps.dsc_basic_caps.raw,
1169 aconnector->dc_link->dpcd_caps.dsc_caps.dsc_branch_decoder_caps.raw,
1170 dsc_caps);
1171 }
1172 } else if (aconnector->dc_link && sink->sink_signal == SIGNAL_TYPE_HDMI_FRL) {
1173 if (sink->edid_caps.frl_dsc_support &&
1174 sink->edid_caps.max_frl_rate > 0 &&
1175 sink->edid_caps.frl_dsc_max_frl_rate > 0)
1176 dc_dsc_parse_dsc_edid(aconnector->dc_link->ctx->dc, &sink->edid_caps, dsc_caps);
1177 }
1178 }
1179
apply_dsc_policy_for_edp(struct amdgpu_dm_connector * aconnector,struct dc_sink * sink,struct dc_stream_state * stream,struct dsc_dec_dpcd_caps * dsc_caps,uint32_t max_dsc_target_bpp_limit_override)1180 static void apply_dsc_policy_for_edp(struct amdgpu_dm_connector *aconnector,
1181 struct dc_sink *sink, struct dc_stream_state *stream,
1182 struct dsc_dec_dpcd_caps *dsc_caps,
1183 uint32_t max_dsc_target_bpp_limit_override)
1184 {
1185 const struct dc_link_settings *verified_link_cap = NULL;
1186 u32 link_bw_in_kbps;
1187 u32 edp_min_bpp_x16, edp_max_bpp_x16;
1188 struct dc *dc = sink->ctx->dc;
1189 struct dc_dsc_bw_range bw_range = {0};
1190 struct dc_dsc_config dsc_cfg = {0};
1191 struct dc_dsc_config_options dsc_options = {0};
1192
1193 dc_dsc_get_default_config_option(dc, &dsc_options);
1194 dsc_options.max_target_bpp_limit_override_x16 = max_dsc_target_bpp_limit_override * 16;
1195
1196 verified_link_cap = dc_link_get_link_cap(stream->link);
1197 link_bw_in_kbps = dc_link_bandwidth_kbps(stream->link, verified_link_cap);
1198 edp_min_bpp_x16 = 8 * 16;
1199 edp_max_bpp_x16 = 8 * 16;
1200
1201 if (edp_max_bpp_x16 > dsc_caps->edp_max_bits_per_pixel)
1202 edp_max_bpp_x16 = dsc_caps->edp_max_bits_per_pixel;
1203
1204 if (edp_max_bpp_x16 < edp_min_bpp_x16)
1205 edp_min_bpp_x16 = edp_max_bpp_x16;
1206
1207 if (dc_dsc_compute_bandwidth_range(dc->res_pool->dscs[0],
1208 dc->debug.dsc_min_slice_height_override,
1209 edp_min_bpp_x16, edp_max_bpp_x16,
1210 dsc_caps,
1211 &stream->timing,
1212 dc_link_get_highest_encoding_format(aconnector->dc_link),
1213 &bw_range)) {
1214
1215 if (bw_range.max_kbps < link_bw_in_kbps) {
1216 if (dc_dsc_compute_config(dc->res_pool->dscs[0],
1217 dsc_caps,
1218 &dsc_options,
1219 0,
1220 &stream->timing,
1221 dc_link_get_highest_encoding_format(aconnector->dc_link),
1222 &dsc_cfg)) {
1223 stream->timing.dsc_cfg = dsc_cfg;
1224 stream->timing.flags.DSC = 1;
1225 stream->timing.dsc_cfg.bits_per_pixel = edp_max_bpp_x16;
1226 }
1227 return;
1228 }
1229 }
1230
1231 if (dc_dsc_compute_config(dc->res_pool->dscs[0],
1232 dsc_caps,
1233 &dsc_options,
1234 link_bw_in_kbps,
1235 &stream->timing,
1236 dc_link_get_highest_encoding_format(aconnector->dc_link),
1237 &dsc_cfg)) {
1238 stream->timing.dsc_cfg = dsc_cfg;
1239 stream->timing.flags.DSC = 1;
1240 }
1241 }
1242
apply_dsc_policy_for_stream(struct amdgpu_dm_connector * aconnector,struct dc_sink * sink,struct dc_stream_state * stream,struct dsc_dec_dpcd_caps * dsc_caps)1243 static void apply_dsc_policy_for_stream(struct amdgpu_dm_connector *aconnector,
1244 struct dc_sink *sink, struct dc_stream_state *stream,
1245 struct dsc_dec_dpcd_caps *dsc_caps)
1246 {
1247 struct drm_connector *drm_connector = &aconnector->base;
1248 u32 link_bandwidth_kbps;
1249 struct dc *dc = sink->ctx->dc;
1250 const struct dc_hdmi_frl_link_settings *frl_verified_link_cap = NULL;
1251 u32 converter_bw_in_kbps;
1252 u32 sink_bw_in_kbps;
1253 u32 dsc_sink_bw_in_kbps;
1254 u32 max_supported_bw_in_kbps, timing_bw_in_kbps;
1255 u32 dsc_max_supported_bw_in_kbps;
1256 u32 max_dsc_target_bpp_limit_override =
1257 drm_connector->display_info.max_dsc_bpp;
1258 struct dc_dsc_config_options dsc_options = {0};
1259
1260 if (!aconnector->dc_link)
1261 return;
1262
1263 dc_dsc_get_default_config_option(dc, &dsc_options);
1264 dsc_options.max_target_bpp_limit_override_x16 = max_dsc_target_bpp_limit_override * 16;
1265
1266 link_bandwidth_kbps = dc_link_bandwidth_kbps(aconnector->dc_link,
1267 dc_link_get_link_cap(aconnector->dc_link));
1268
1269 /* Set DSC policy according to dsc_clock_en */
1270 dc_dsc_policy_set_enable_dsc_when_not_needed(
1271 aconnector->dsc_settings.dsc_force_enable == DSC_CLK_FORCE_ENABLE);
1272
1273 if (sink->sink_signal == SIGNAL_TYPE_EDP &&
1274 !aconnector->dc_link->panel_config.dsc.disable_dsc_edp &&
1275 dc->caps.edp_dsc_support && aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE) {
1276
1277 apply_dsc_policy_for_edp(aconnector, sink, stream, dsc_caps, max_dsc_target_bpp_limit_override);
1278
1279 } else if (sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT) {
1280 if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_NONE) {
1281 if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
1282 dsc_caps,
1283 &dsc_options,
1284 link_bandwidth_kbps,
1285 &stream->timing,
1286 dc_link_get_highest_encoding_format(aconnector->dc_link),
1287 &stream->timing.dsc_cfg)) {
1288 stream->timing.flags.DSC = 1;
1289 drm_dbg_driver(drm_connector->dev, "%s: SST_DSC [%s] DSC is selected from SST RX\n",
1290 __func__, drm_connector->name);
1291 }
1292 } else if (sink->link->dpcd_caps.dongle_type == DISPLAY_DONGLE_DP_HDMI_CONVERTER) {
1293 timing_bw_in_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing,
1294 dc_link_get_highest_encoding_format(aconnector->dc_link));
1295 converter_bw_in_kbps = aconnector->dc_link->dpcd_caps.dongle_caps.dp_hdmi_frl_max_link_bw_in_kbps;
1296 sink_bw_in_kbps = dc_link_bw_kbps_from_raw_frl_link_rate_data(dc, sink->edid_caps.max_frl_rate);
1297 dsc_sink_bw_in_kbps = dc_link_bw_kbps_from_raw_frl_link_rate_data(dc, sink->edid_caps.frl_dsc_max_frl_rate);
1298
1299 if (dsc_caps->is_frl) {
1300 max_supported_bw_in_kbps = min(link_bandwidth_kbps, converter_bw_in_kbps);
1301 max_supported_bw_in_kbps = min(max_supported_bw_in_kbps, sink_bw_in_kbps);
1302 dsc_max_supported_bw_in_kbps = min(max_supported_bw_in_kbps, dsc_sink_bw_in_kbps);
1303 } else {
1304 max_supported_bw_in_kbps = link_bandwidth_kbps;
1305 dsc_max_supported_bw_in_kbps = link_bandwidth_kbps;
1306 }
1307
1308 if (timing_bw_in_kbps > max_supported_bw_in_kbps &&
1309 max_supported_bw_in_kbps > 0 &&
1310 dsc_max_supported_bw_in_kbps > 0)
1311 if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
1312 dsc_caps,
1313 &dsc_options,
1314 dsc_max_supported_bw_in_kbps,
1315 &stream->timing,
1316 dc_link_get_highest_encoding_format(aconnector->dc_link),
1317 &stream->timing.dsc_cfg)) {
1318 stream->timing.flags.DSC = 1;
1319 drm_dbg_driver(drm_connector->dev, "%s: SST_DSC [%s] DSC is selected from %s\n",
1320 __func__, drm_connector->name,
1321 (dsc_caps->is_frl == 1) ? "HDMI FRL RX" : "DP-HDMI PCON");
1322 }
1323 }
1324 } else if (sink->sink_signal == SIGNAL_TYPE_HDMI_FRL) {
1325 struct dc_dsc_policy dsc_policy = {0};
1326
1327 frl_verified_link_cap = dc_link_get_frl_link_cap(stream->link);
1328 if (frl_verified_link_cap->frl_link_rate != HDMI_FRL_LINK_RATE_DISABLE &&
1329 aconnector->dc_link->frl_flags.force_frl_dsc) {
1330 dc_dsc_policy_set_enable_dsc_when_not_needed(true);
1331 dc_dsc_get_policy_for_timing(&stream->timing, 0, &dsc_policy, dc_link_get_highest_encoding_format(stream->link));
1332 }
1333
1334 timing_bw_in_kbps = dc_bandwidth_in_kbps_from_timing(&stream->timing, DC_LINK_ENCODING_HDMI_FRL);
1335 link_bandwidth_kbps = dc_link_frl_bandwidth_kbps(stream->link, frl_verified_link_cap->frl_link_rate);
1336 dsc_sink_bw_in_kbps = dc_link_bw_kbps_from_raw_frl_link_rate_data(dc, sink->edid_caps.frl_dsc_max_frl_rate);
1337
1338 if ((timing_bw_in_kbps > link_bandwidth_kbps && dsc_sink_bw_in_kbps > 0) ||
1339 (dsc_policy.enable_dsc_when_not_needed || dsc_options.force_dsc_when_not_needed)) {
1340 if (dc_dsc_compute_config(aconnector->dc_link->ctx->dc->res_pool->dscs[0],
1341 dsc_caps,
1342 &dsc_options,
1343 dsc_sink_bw_in_kbps,
1344 &stream->timing,
1345 dc_link_get_highest_encoding_format(aconnector->dc_link),
1346 &stream->timing.dsc_cfg)) {
1347 stream->timing.flags.DSC = 1;
1348 drm_dbg_driver(drm_connector->dev, "%s: HDMI_FRL_DSC [%s] DSC is selected from HDMI FRL RX\n",
1349 __func__, drm_connector->name);
1350 }
1351 }
1352 }
1353
1354 /* Overwrite the stream flag if DSC is enabled through debugfs */
1355 if (aconnector->dsc_settings.dsc_force_enable == DSC_CLK_FORCE_ENABLE)
1356 stream->timing.flags.DSC = 1;
1357
1358 if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_num_slices_h)
1359 stream->timing.dsc_cfg.num_slices_h = aconnector->dsc_settings.dsc_num_slices_h;
1360
1361 if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_num_slices_v)
1362 stream->timing.dsc_cfg.num_slices_v = aconnector->dsc_settings.dsc_num_slices_v;
1363
1364 if (stream->timing.flags.DSC && aconnector->dsc_settings.dsc_bits_per_pixel)
1365 stream->timing.dsc_cfg.bits_per_pixel = aconnector->dsc_settings.dsc_bits_per_pixel;
1366 }
1367 #endif
1368
amdgpu_dm_update_stream_scaling_settings(struct drm_device * dev,const struct drm_display_mode * mode,const struct dm_connector_state * dm_state,struct dc_stream_state * stream)1369 void amdgpu_dm_update_stream_scaling_settings(struct drm_device *dev,
1370 const struct drm_display_mode *mode,
1371 const struct dm_connector_state *dm_state,
1372 struct dc_stream_state *stream)
1373 {
1374 enum amdgpu_rmx_type rmx_type;
1375
1376 struct rect src = { 0 }; /* viewport in composition space*/
1377 struct rect dst = { 0 }; /* stream addressable area */
1378
1379 /* no mode. nothing to be done */
1380 if (!mode)
1381 return;
1382
1383 /* Full screen scaling by default */
1384 src.width = mode->hdisplay;
1385 src.height = mode->vdisplay;
1386 dst.width = stream->timing.h_addressable;
1387 dst.height = stream->timing.v_addressable;
1388
1389 if (dm_state) {
1390 rmx_type = dm_state->scaling;
1391 if (rmx_type == RMX_ASPECT || rmx_type == RMX_OFF) {
1392 if (src.width * dst.height <
1393 src.height * dst.width) {
1394 /* height needs less upscaling/more downscaling */
1395 dst.width = src.width *
1396 dst.height / src.height;
1397 } else {
1398 /* width needs less upscaling/more downscaling */
1399 dst.height = src.height *
1400 dst.width / src.width;
1401 }
1402 } else if (rmx_type == RMX_CENTER) {
1403 dst = src;
1404 }
1405
1406 dst.x = (stream->timing.h_addressable - dst.width) / 2;
1407 dst.y = (stream->timing.v_addressable - dst.height) / 2;
1408
1409 if (dm_state->underscan_enable) {
1410 dst.x += dm_state->underscan_hborder / 2;
1411 dst.y += dm_state->underscan_vborder / 2;
1412 dst.width -= dm_state->underscan_hborder;
1413 dst.height -= dm_state->underscan_vborder;
1414 }
1415 }
1416
1417 stream->src = src;
1418 stream->dst = dst;
1419
1420 drm_dbg_kms(dev, "Destination Rectangle x:%d y:%d width:%d height:%d\n",
1421 dst.x, dst.y, dst.width, dst.height);
1422
1423 }
1424 EXPORT_IF_KUNIT(amdgpu_dm_update_stream_scaling_settings);
1425
1426 STATIC_IFN_KUNIT struct dc_stream_state *
create_stream_for_sink(struct drm_connector * connector,const struct drm_display_mode * drm_mode,const struct dm_connector_state * dm_state,const struct dc_stream_state * old_stream,int requested_bpc,enum dc_pixel_encoding requested_encoding,bool is_hdmi_ep)1427 create_stream_for_sink(struct drm_connector *connector,
1428 const struct drm_display_mode *drm_mode,
1429 const struct dm_connector_state *dm_state,
1430 const struct dc_stream_state *old_stream,
1431 int requested_bpc,
1432 enum dc_pixel_encoding requested_encoding,
1433 bool is_hdmi_ep)
1434 {
1435 struct drm_device *dev = connector->dev;
1436 struct amdgpu_dm_connector *aconnector = NULL;
1437 struct drm_display_mode *preferred_mode = NULL;
1438 const struct drm_connector_state *con_state = &dm_state->base;
1439 struct dc_stream_state *stream = NULL;
1440 struct drm_display_mode mode;
1441 struct drm_display_mode saved_mode;
1442 struct drm_display_mode *freesync_mode = NULL;
1443 bool native_mode_found = false;
1444 bool recalculate_timing = false;
1445 bool scale = dm_state->scaling != RMX_OFF;
1446 int mode_refresh;
1447 int preferred_refresh = 0;
1448 enum color_transfer_func tf = TRANSFER_FUNC_UNKNOWN;
1449 #if defined(CONFIG_DRM_AMD_DC_FP)
1450 struct dsc_dec_dpcd_caps dsc_caps = {0};
1451 #endif
1452 struct dc_link *link = NULL;
1453 struct dc_sink *sink = NULL;
1454
1455 drm_mode_init(&mode, drm_mode);
1456 memset(&saved_mode, 0, sizeof(saved_mode));
1457
1458 if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK) {
1459 aconnector = NULL;
1460 aconnector = to_amdgpu_dm_connector(connector);
1461 link = aconnector->dc_link;
1462 } else {
1463 struct drm_writeback_connector *wbcon = NULL;
1464 struct amdgpu_dm_wb_connector *dm_wbcon = NULL;
1465
1466 wbcon = drm_connector_to_writeback(connector);
1467 dm_wbcon = to_amdgpu_dm_wb_connector(wbcon);
1468 link = dm_wbcon->link;
1469 }
1470
1471 if (!aconnector || !aconnector->dc_sink) {
1472 sink = create_fake_sink(dev, link);
1473 if (!sink)
1474 return stream;
1475
1476 } else {
1477 sink = aconnector->dc_sink;
1478 dc_sink_retain(sink);
1479 }
1480
1481 stream = dc_create_stream_for_sink(sink);
1482
1483 if (stream == NULL) {
1484 drm_err(dev, "Failed to create stream for sink!\n");
1485 goto finish;
1486 }
1487
1488 /* We leave this NULL for writeback connectors */
1489 stream->dm_stream_context = aconnector;
1490
1491 stream->timing.flags.LTE_340MCSC_SCRAMBLE =
1492 connector->display_info.hdmi.scdc.scrambling.low_rates;
1493
1494 list_for_each_entry(preferred_mode, &connector->modes, head) {
1495 /* Search for preferred mode */
1496 if (preferred_mode->type & DRM_MODE_TYPE_PREFERRED) {
1497 native_mode_found = true;
1498 break;
1499 }
1500 }
1501 if (!native_mode_found)
1502 preferred_mode = list_first_entry_or_null(
1503 &connector->modes,
1504 struct drm_display_mode,
1505 head);
1506
1507 mode_refresh = drm_mode_vrefresh(&mode);
1508
1509 if (preferred_mode == NULL) {
1510 /*
1511 * This may not be an error, the use case is when we have no
1512 * usermode calls to reset and set mode upon hotplug. In this
1513 * case, we call set mode ourselves to restore the previous mode
1514 * and the modelist may not be filled in time.
1515 */
1516 drm_dbg_driver(dev, "No preferred mode found\n");
1517 } else if (aconnector) {
1518 recalculate_timing = amdgpu_freesync_vid_mode &&
1519 amdgpu_dm_is_freesync_video_mode(&mode, aconnector);
1520 if (recalculate_timing) {
1521 freesync_mode = amdgpu_dm_get_highest_refresh_rate_mode(aconnector, false);
1522 drm_mode_copy(&saved_mode, &mode);
1523 saved_mode.picture_aspect_ratio = mode.picture_aspect_ratio;
1524 drm_mode_copy(&mode, freesync_mode);
1525 mode.picture_aspect_ratio = saved_mode.picture_aspect_ratio;
1526 } else {
1527 decide_crtc_timing_for_drm_display_mode(
1528 &mode, preferred_mode, scale);
1529
1530 preferred_refresh = drm_mode_vrefresh(preferred_mode);
1531 }
1532 }
1533
1534 if (recalculate_timing)
1535 drm_mode_set_crtcinfo(&saved_mode, 0);
1536
1537 /*
1538 * If scaling is enabled and refresh rate didn't change
1539 * we copy the vic and polarities of the old timings
1540 */
1541 if (!scale || mode_refresh != preferred_refresh)
1542 fill_stream_properties_from_drm_display_mode(
1543 stream, &mode, connector, con_state, NULL,
1544 requested_bpc, requested_encoding, is_hdmi_ep);
1545 else
1546 fill_stream_properties_from_drm_display_mode(
1547 stream, &mode, connector, con_state, old_stream,
1548 requested_bpc, requested_encoding, is_hdmi_ep);
1549
1550 /* The rest isn't needed for writeback connectors */
1551 if (!aconnector)
1552 goto finish;
1553
1554 if (aconnector->timing_changed) {
1555 drm_dbg(aconnector->base.dev,
1556 "overriding timing for automated test, bpc %d, changing to %d\n",
1557 stream->timing.display_color_depth,
1558 aconnector->timing_requested->display_color_depth);
1559 stream->timing = *aconnector->timing_requested;
1560 }
1561
1562 #if defined(CONFIG_DRM_AMD_DC_FP)
1563 /* SST DSC determination policy */
1564 update_dsc_caps(aconnector, sink, stream, &dsc_caps);
1565 if (aconnector->dsc_settings.dsc_force_enable != DSC_CLK_FORCE_DISABLE && dsc_caps.is_dsc_supported)
1566 apply_dsc_policy_for_stream(aconnector, sink, stream, &dsc_caps);
1567 #endif
1568
1569 amdgpu_dm_update_stream_scaling_settings(dev, &mode, dm_state, stream);
1570
1571 amdgpu_dm_fill_audio_info(
1572 &stream->audio_info,
1573 connector,
1574 sink);
1575
1576 update_stream_signal(stream, sink);
1577
1578 if (stream->signal == SIGNAL_TYPE_HDMI_TYPE_A ||
1579 stream->signal == SIGNAL_TYPE_HDMI_FRL)
1580 mod_build_hf_vsif_infopacket(stream, &stream->vsp_infopacket, false, false);
1581
1582 if (stream->signal == SIGNAL_TYPE_DISPLAY_PORT ||
1583 stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST ||
1584 stream->signal == SIGNAL_TYPE_EDP) {
1585 const struct dc_edid_caps *edid_caps;
1586 unsigned int disable_colorimetry = 0;
1587
1588 if (aconnector->dc_sink) {
1589 edid_caps = &aconnector->dc_sink->edid_caps;
1590 disable_colorimetry = edid_caps->panel_patch.disable_colorimetry;
1591 }
1592
1593 /*
1594 * should decide stream support vsc sdp colorimetry capability
1595 * before building vsc info packet
1596 */
1597 stream->use_vsc_sdp_for_colorimetry = stream->link->dpcd_caps.dpcd_rev.raw >= 0x14 &&
1598 stream->link->dpcd_caps.dprx_feature.bits.VSC_SDP_COLORIMETRY_SUPPORTED &&
1599 !disable_colorimetry;
1600
1601 if (stream->out_transfer_func.tf == TRANSFER_FUNCTION_GAMMA22)
1602 tf = TRANSFER_FUNC_GAMMA_22;
1603 mod_build_vsc_infopacket(stream, &stream->vsc_infopacket, stream->output_color_space, tf);
1604 aconnector->sr_skip_count = AMDGPU_DM_PSR_ENTRY_DELAY;
1605
1606 }
1607 finish:
1608 dc_sink_release(sink);
1609
1610 return stream;
1611 }
1612 EXPORT_IF_KUNIT(create_stream_for_sink);
1613
1614 /**
1615 * amdgpu_dm_connector_poll - Poll a connector to see if it's connected to a display
1616 * @aconnector: DM connector to poll (owns @base drm_connector and @dc_link)
1617 * @force: if true, force polling even when DAC load detection was used
1618 *
1619 * Used for connectors that don't support HPD (hotplug detection) to
1620 * periodically check whether the connector is connected to a display.
1621 *
1622 * When connection was determined via DAC load detection, we avoid
1623 * re-running it on normal polls to prevent visible glitches, unless
1624 * @force is set.
1625 *
1626 * Return: The probed connector status (connected/disconnected/unknown).
1627 */
1628 STATIC_IFN_KUNIT enum drm_connector_status
amdgpu_dm_connector_poll(struct amdgpu_dm_connector * aconnector,bool force)1629 amdgpu_dm_connector_poll(struct amdgpu_dm_connector *aconnector, bool force)
1630 {
1631 struct drm_connector *connector = &aconnector->base;
1632 struct drm_device *dev = connector->dev;
1633 struct amdgpu_device *adev = drm_to_adev(dev);
1634 struct dc_link *link = aconnector->dc_link;
1635 enum dc_connection_type conn_type = dc_connection_none;
1636 enum drm_connector_status status = connector_status_disconnected;
1637
1638 /* When we determined the connection using DAC load detection,
1639 * do NOT poll the connector do detect disconnect because
1640 * that would run DAC load detection again which can cause
1641 * visible visual glitches.
1642 *
1643 * Only allow to poll such a connector again when forcing.
1644 */
1645 if (!force && link->local_sink && link->type == dc_connection_analog_load)
1646 return connector->status;
1647
1648 mutex_lock(&aconnector->hpd_lock);
1649
1650 if (dc_link_detect_connection_type(aconnector->dc_link, &conn_type) &&
1651 conn_type != dc_connection_none) {
1652 mutex_lock(&adev->dm.dc_lock);
1653
1654 /* Only call full link detection when a sink isn't created yet,
1655 * ie. just when the display is plugged in, otherwise we risk flickering.
1656 */
1657 if (link->local_sink ||
1658 dc_link_detect(link, DETECT_REASON_HPD))
1659 status = connector_status_connected;
1660
1661 mutex_unlock(&adev->dm.dc_lock);
1662 }
1663
1664 if (connector->status != status) {
1665 if (status == connector_status_disconnected) {
1666 if (link->local_sink)
1667 dc_sink_release(link->local_sink);
1668
1669 link->local_sink = NULL;
1670 link->dpcd_sink_count = 0;
1671 link->type = dc_connection_none;
1672 }
1673
1674 amdgpu_dm_update_connector_after_detect(aconnector);
1675 }
1676
1677 mutex_unlock(&aconnector->hpd_lock);
1678 return status;
1679 }
1680 EXPORT_IF_KUNIT(amdgpu_dm_connector_poll);
1681
1682 /*
1683 * Apple Studio Display exposes two SST DP links for a 2x1 tiled panel.
1684 * The primary tile advertises the full 5120x2880 mode (with DSC on the
1685 * bandwidth-sufficient link) while the secondary carries a per-tile
1686 * 2560x2880 timing on a insufficient bandwidth link. Hide the secondary
1687 * connector from userspace so compositors configure a single 5K stream
1688 * on the primary link only.
1689 */
amdgpu_dm_hide_secondary_tile_from_userspace(struct drm_connector * connector)1690 static bool amdgpu_dm_hide_secondary_tile_from_userspace(struct drm_connector *connector)
1691 {
1692 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
1693
1694 if (!aconnector->dc_sink)
1695 return false;
1696
1697 if (!aconnector->dc_sink->edid_caps.panel_patch.disable_second_tile)
1698 return false;
1699
1700 drm_edid_connector_update(connector, aconnector->drm_edid);
1701
1702 if (!connector->has_tile)
1703 return false;
1704
1705 if (!connector->tile_h_loc && !connector->tile_v_loc)
1706 return false;
1707
1708 drm_dbg_kms(connector->dev,
1709 "[CONNECTOR:%d:%s] hiding secondary Apple Studio Display tile from userspace\n",
1710 connector->base.id, connector->name);
1711
1712 return true;
1713 }
1714
1715 /**
1716 * amdgpu_dm_connector_detect() - Detect whether a DRM connector is connected to a display
1717 *
1718 * A connector is considered connected when it has a sink that is not NULL.
1719 * For connectors that support HPD (hotplug detection), the connection is
1720 * handled in the HPD interrupt.
1721 * For connectors that may not support HPD, such as analog connectors,
1722 * DRM will call this function repeatedly to poll them.
1723 *
1724 * Notes:
1725 * 1. This interface is NOT called in context of HPD irq.
1726 * 2. This interface *is called* in context of user-mode ioctl. Which
1727 * makes it a bad place for *any* MST-related activity.
1728 *
1729 * @connector: The DRM connector we are checking. We convert it to
1730 * amdgpu_dm_connector so we can read the DC link and state.
1731 * @force: If true, do a full detect again. This is used even when
1732 * a lighter check would normally be used to avoid flicker.
1733 *
1734 * Return: The connector status (connected, disconnected, or unknown).
1735 *
1736 */
1737 STATIC_IFN_KUNIT enum drm_connector_status
amdgpu_dm_connector_detect(struct drm_connector * connector,bool force)1738 amdgpu_dm_connector_detect(struct drm_connector *connector, bool force)
1739 {
1740 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
1741
1742 update_subconnector_property(aconnector);
1743
1744 if (aconnector->base.force == DRM_FORCE_ON ||
1745 aconnector->base.force == DRM_FORCE_ON_DIGITAL)
1746 return connector_status_connected;
1747 else if (aconnector->base.force == DRM_FORCE_OFF)
1748 return connector_status_disconnected;
1749
1750 /* Poll analog connectors and only when either
1751 * disconnected or connected to an analog display.
1752 */
1753 if (drm_kms_helper_is_poll_worker() &&
1754 dc_connector_supports_analog(aconnector->dc_link->link_id.id) &&
1755 (!aconnector->dc_sink || aconnector->dc_sink->edid_caps.analog))
1756 return amdgpu_dm_connector_poll(aconnector, force);
1757
1758 if (amdgpu_dm_hide_secondary_tile_from_userspace(connector))
1759 return connector_status_disconnected;
1760
1761 return (aconnector->dc_sink ? connector_status_connected :
1762 connector_status_disconnected);
1763 }
1764 EXPORT_IF_KUNIT(amdgpu_dm_connector_detect);
1765
amdgpu_dm_connector_atomic_set_property(struct drm_connector * connector,struct drm_connector_state * connector_state,struct drm_property * property,uint64_t val)1766 int amdgpu_dm_connector_atomic_set_property(struct drm_connector *connector,
1767 struct drm_connector_state *connector_state,
1768 struct drm_property *property,
1769 uint64_t val)
1770 {
1771 struct drm_device *dev = connector->dev;
1772 struct amdgpu_device *adev = drm_to_adev(dev);
1773 struct dm_connector_state *dm_old_state =
1774 to_dm_connector_state(connector->state);
1775 struct dm_connector_state *dm_new_state =
1776 to_dm_connector_state(connector_state);
1777
1778 int ret = -EINVAL;
1779
1780 if (property == dev->mode_config.scaling_mode_property) {
1781 enum amdgpu_rmx_type rmx_type;
1782
1783 switch (val) {
1784 case DRM_MODE_SCALE_CENTER:
1785 rmx_type = RMX_CENTER;
1786 break;
1787 case DRM_MODE_SCALE_ASPECT:
1788 rmx_type = RMX_ASPECT;
1789 break;
1790 case DRM_MODE_SCALE_FULLSCREEN:
1791 rmx_type = RMX_FULL;
1792 break;
1793 case DRM_MODE_SCALE_NONE:
1794 default:
1795 rmx_type = RMX_OFF;
1796 break;
1797 }
1798
1799 if (dm_old_state->scaling == rmx_type)
1800 return 0;
1801
1802 dm_new_state->scaling = rmx_type;
1803 ret = 0;
1804 } else if (property == adev->mode_info.underscan_hborder_property) {
1805 dm_new_state->underscan_hborder = val;
1806 ret = 0;
1807 } else if (property == adev->mode_info.underscan_vborder_property) {
1808 dm_new_state->underscan_vborder = val;
1809 ret = 0;
1810 } else if (property == adev->mode_info.underscan_property) {
1811 dm_new_state->underscan_enable = val;
1812 ret = 0;
1813 } else if (property == adev->mode_info.abm_level_property) {
1814 switch (val) {
1815 case ABM_SYSFS_CONTROL:
1816 dm_new_state->abm_sysfs_forbidden = false;
1817 break;
1818 case ABM_LEVEL_OFF:
1819 dm_new_state->abm_sysfs_forbidden = true;
1820 dm_new_state->abm_level = ABM_LEVEL_IMMEDIATE_DISABLE;
1821 break;
1822 default:
1823 dm_new_state->abm_sysfs_forbidden = true;
1824 dm_new_state->abm_level = val;
1825 }
1826 ret = 0;
1827 }
1828
1829 return ret;
1830 }
1831 EXPORT_IF_KUNIT(amdgpu_dm_connector_atomic_set_property);
1832
amdgpu_dm_connector_atomic_get_property(struct drm_connector * connector,const struct drm_connector_state * state,struct drm_property * property,uint64_t * val)1833 int amdgpu_dm_connector_atomic_get_property(struct drm_connector *connector,
1834 const struct drm_connector_state *state,
1835 struct drm_property *property,
1836 uint64_t *val)
1837 {
1838 struct drm_device *dev = connector->dev;
1839 struct amdgpu_device *adev = drm_to_adev(dev);
1840 struct dm_connector_state *dm_state =
1841 to_dm_connector_state(state);
1842 int ret = -EINVAL;
1843
1844 if (property == dev->mode_config.scaling_mode_property) {
1845 switch (dm_state->scaling) {
1846 case RMX_CENTER:
1847 *val = DRM_MODE_SCALE_CENTER;
1848 break;
1849 case RMX_ASPECT:
1850 *val = DRM_MODE_SCALE_ASPECT;
1851 break;
1852 case RMX_FULL:
1853 *val = DRM_MODE_SCALE_FULLSCREEN;
1854 break;
1855 case RMX_OFF:
1856 default:
1857 *val = DRM_MODE_SCALE_NONE;
1858 break;
1859 }
1860 ret = 0;
1861 } else if (property == adev->mode_info.underscan_hborder_property) {
1862 *val = dm_state->underscan_hborder;
1863 ret = 0;
1864 } else if (property == adev->mode_info.underscan_vborder_property) {
1865 *val = dm_state->underscan_vborder;
1866 ret = 0;
1867 } else if (property == adev->mode_info.underscan_property) {
1868 *val = dm_state->underscan_enable;
1869 ret = 0;
1870 } else if (property == adev->mode_info.abm_level_property) {
1871 if (!dm_state->abm_sysfs_forbidden)
1872 *val = ABM_SYSFS_CONTROL;
1873 else
1874 *val = (dm_state->abm_level != ABM_LEVEL_IMMEDIATE_DISABLE) ?
1875 dm_state->abm_level : 0;
1876 ret = 0;
1877 }
1878
1879 return ret;
1880 }
1881 EXPORT_IF_KUNIT(amdgpu_dm_connector_atomic_get_property);
1882
amdgpu_dm_connector_unregister(struct drm_connector * connector)1883 STATIC_IFN_KUNIT void amdgpu_dm_connector_unregister(struct drm_connector *connector)
1884 {
1885 struct amdgpu_dm_connector *amdgpu_dm_connector = to_amdgpu_dm_connector(connector);
1886
1887 if (amdgpu_dm_should_create_sysfs(amdgpu_dm_connector))
1888 sysfs_remove_group(&connector->kdev->kobj, &amdgpu_group);
1889
1890 cec_notifier_conn_unregister(amdgpu_dm_connector->notifier);
1891 drm_dp_aux_unregister(&amdgpu_dm_connector->dm_dp_aux.aux);
1892 }
1893 EXPORT_IF_KUNIT(amdgpu_dm_connector_unregister);
1894
amdgpu_dm_connector_destroy(struct drm_connector * connector)1895 STATIC_IFN_KUNIT void amdgpu_dm_connector_destroy(struct drm_connector *connector)
1896 {
1897 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
1898 struct amdgpu_device *adev = drm_to_adev(connector->dev);
1899 struct amdgpu_display_manager *dm = &adev->dm;
1900
1901 /*
1902 * Call only if mst_mgr was initialized before since it's not done
1903 * for all connector types.
1904 */
1905 if (aconnector->mst_mgr.dev)
1906 drm_dp_mst_topology_mgr_destroy(&aconnector->mst_mgr);
1907
1908 /* Cancel and flush any pending HDMI HPD debounce work */
1909 if (aconnector->hdmi_hpd_debounce_delay_ms) {
1910 cancel_delayed_work_sync(&aconnector->hdmi_hpd_debounce_work);
1911 if (aconnector->hdmi_prev_sink) {
1912 dc_sink_release(aconnector->hdmi_prev_sink);
1913 aconnector->hdmi_prev_sink = NULL;
1914 }
1915 }
1916
1917 if (aconnector->bl_idx != -1) {
1918 backlight_device_unregister(dm->backlight_dev[aconnector->bl_idx]);
1919 dm->backlight_dev[aconnector->bl_idx] = NULL;
1920 }
1921
1922 if (aconnector->dc_em_sink)
1923 dc_sink_release(aconnector->dc_em_sink);
1924 aconnector->dc_em_sink = NULL;
1925 if (aconnector->dc_sink)
1926 dc_sink_release(aconnector->dc_sink);
1927 aconnector->dc_sink = NULL;
1928
1929 drm_dp_cec_unregister_connector(&aconnector->dm_dp_aux.aux);
1930 drm_connector_unregister(connector);
1931 drm_connector_cleanup(connector);
1932 kfree(aconnector->dm_dp_aux.aux.name);
1933
1934 kfree(connector);
1935 }
1936 EXPORT_IF_KUNIT(amdgpu_dm_connector_destroy);
1937
amdgpu_dm_connector_funcs_reset(struct drm_connector * connector)1938 void amdgpu_dm_connector_funcs_reset(struct drm_connector *connector)
1939 {
1940 struct dm_connector_state *old_state =
1941 to_dm_connector_state(connector->state);
1942 struct dm_connector_state *state;
1943
1944 state = kzalloc_obj(*state);
1945 if (!state)
1946 return;
1947
1948 if (connector->state)
1949 __drm_atomic_helper_connector_destroy_state(connector->state);
1950
1951 kfree(old_state);
1952
1953 __drm_atomic_helper_connector_reset(connector, &state->base);
1954
1955 state->scaling = RMX_OFF;
1956 state->underscan_enable = false;
1957 state->underscan_hborder = 0;
1958 state->underscan_vborder = 0;
1959 state->base.max_requested_bpc = 8;
1960 state->vcpi_slots = 0;
1961 state->pbn = 0;
1962
1963 if (connector->connector_type == DRM_MODE_CONNECTOR_eDP) {
1964 if (amdgpu_dm_abm_level <= 0)
1965 state->abm_level = ABM_LEVEL_IMMEDIATE_DISABLE;
1966 else
1967 state->abm_level = amdgpu_dm_abm_level;
1968 }
1969 }
1970 EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_reset);
1971
1972 struct drm_connector_state *
amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector * connector)1973 amdgpu_dm_connector_atomic_duplicate_state(struct drm_connector *connector)
1974 {
1975 struct dm_connector_state *state =
1976 to_dm_connector_state(connector->state);
1977
1978 struct dm_connector_state *new_state =
1979 kmemdup(state, sizeof(*state), GFP_KERNEL);
1980
1981 if (!new_state)
1982 return NULL;
1983
1984 __drm_atomic_helper_connector_duplicate_state(connector, &new_state->base);
1985
1986 new_state->freesync_capable = state->freesync_capable;
1987 new_state->abm_level = state->abm_level;
1988 new_state->scaling = state->scaling;
1989 new_state->underscan_enable = state->underscan_enable;
1990 new_state->underscan_hborder = state->underscan_hborder;
1991 new_state->underscan_vborder = state->underscan_vborder;
1992 new_state->vcpi_slots = state->vcpi_slots;
1993 new_state->pbn = state->pbn;
1994 return &new_state->base;
1995 }
1996 EXPORT_IF_KUNIT(amdgpu_dm_connector_atomic_duplicate_state);
1997
1998 STATIC_IFN_KUNIT int
amdgpu_dm_connector_late_register(struct drm_connector * connector)1999 amdgpu_dm_connector_late_register(struct drm_connector *connector)
2000 {
2001 struct amdgpu_dm_connector *amdgpu_dm_connector =
2002 to_amdgpu_dm_connector(connector);
2003 int r;
2004
2005 if (amdgpu_dm_should_create_sysfs(amdgpu_dm_connector)) {
2006 r = sysfs_create_group(&connector->kdev->kobj,
2007 &amdgpu_group);
2008 if (r)
2009 return r;
2010 }
2011
2012 amdgpu_dm_register_backlight_device(amdgpu_dm_connector);
2013
2014 if ((connector->connector_type == DRM_MODE_CONNECTOR_DisplayPort) ||
2015 (connector->connector_type == DRM_MODE_CONNECTOR_eDP)) {
2016 amdgpu_dm_connector->dm_dp_aux.aux.dev = connector->kdev;
2017 r = drm_dp_aux_register(&amdgpu_dm_connector->dm_dp_aux.aux);
2018 if (r)
2019 return r;
2020 }
2021
2022 #if defined(CONFIG_DEBUG_FS)
2023 connector_debugfs_init(amdgpu_dm_connector);
2024 #endif
2025
2026 return 0;
2027 }
2028 EXPORT_IF_KUNIT(amdgpu_dm_connector_late_register);
2029
amdgpu_dm_connector_funcs_force(struct drm_connector * connector)2030 STATIC_IFN_KUNIT void amdgpu_dm_connector_funcs_force(struct drm_connector *connector)
2031 {
2032 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
2033 struct dc_link *dc_link = aconnector->dc_link;
2034 struct dc_sink *dc_em_sink = aconnector->dc_em_sink;
2035 const struct drm_edid *drm_edid;
2036 struct i2c_adapter *ddc;
2037 struct drm_device *dev = connector->dev;
2038
2039 if (dc_link && dc_link->aux_mode)
2040 ddc = &aconnector->dm_dp_aux.aux.ddc;
2041 else
2042 ddc = &aconnector->i2c->base;
2043
2044 drm_edid = drm_edid_read_ddc(connector, ddc);
2045 drm_edid_connector_update(connector, drm_edid);
2046 if (!drm_edid) {
2047 drm_err(dev, "No EDID found on connector: %s.\n", connector->name);
2048 return;
2049 }
2050
2051 aconnector->drm_edid = drm_edid;
2052 /* Update emulated (virtual) sink's EDID */
2053 if (dc_em_sink && dc_link) {
2054 /* FIXME: Get rid of drm_edid_raw() */
2055 const struct edid *edid = drm_edid_raw(drm_edid);
2056
2057 memset(&dc_em_sink->edid_caps, 0, sizeof(struct dc_edid_caps));
2058 memmove(dc_em_sink->dc_edid.raw_edid, edid,
2059 (edid->extensions + 1) * EDID_LENGTH);
2060 dm_helpers_parse_edid_caps(
2061 dc_link,
2062 &dc_em_sink->dc_edid,
2063 &dc_em_sink->edid_caps);
2064 }
2065 }
2066 EXPORT_IF_KUNIT(amdgpu_dm_connector_funcs_force);
2067
2068 static const struct drm_connector_funcs amdgpu_dm_connector_funcs = {
2069 .reset = amdgpu_dm_connector_funcs_reset,
2070 .detect = amdgpu_dm_connector_detect,
2071 .fill_modes = drm_helper_probe_single_connector_modes,
2072 .destroy = amdgpu_dm_connector_destroy,
2073 .atomic_duplicate_state = amdgpu_dm_connector_atomic_duplicate_state,
2074 .atomic_destroy_state = drm_atomic_helper_connector_destroy_state,
2075 .atomic_set_property = amdgpu_dm_connector_atomic_set_property,
2076 .atomic_get_property = amdgpu_dm_connector_atomic_get_property,
2077 .late_register = amdgpu_dm_connector_late_register,
2078 .early_unregister = amdgpu_dm_connector_unregister,
2079 .force = amdgpu_dm_connector_funcs_force
2080 };
2081
get_modes(struct drm_connector * connector)2082 static int get_modes(struct drm_connector *connector)
2083 {
2084 return amdgpu_dm_connector_get_modes(connector);
2085 }
2086
create_eml_sink(struct amdgpu_dm_connector * aconnector)2087 STATIC_IFN_KUNIT void create_eml_sink(struct amdgpu_dm_connector *aconnector)
2088 {
2089 struct drm_connector *connector = &aconnector->base;
2090 struct dc_link *dc_link = aconnector->dc_link;
2091 struct dc_sink_init_data init_params = {
2092 .link = aconnector->dc_link,
2093 .sink_signal = SIGNAL_TYPE_VIRTUAL
2094 };
2095 const struct drm_edid *drm_edid;
2096 const struct edid *edid;
2097 struct i2c_adapter *ddc;
2098
2099 if (dc_link && dc_link->aux_mode)
2100 ddc = &aconnector->dm_dp_aux.aux.ddc;
2101 else
2102 ddc = &aconnector->i2c->base;
2103
2104 drm_edid = drm_edid_read_ddc(connector, ddc);
2105 drm_edid_connector_update(connector, drm_edid);
2106 if (!drm_edid) {
2107 drm_err(connector->dev, "No EDID found on connector: %s.\n", connector->name);
2108 return;
2109 }
2110
2111 if (connector->display_info.is_hdmi)
2112 init_params.sink_signal = SIGNAL_TYPE_HDMI_TYPE_A;
2113
2114 aconnector->drm_edid = drm_edid;
2115
2116 /* FIXME: Get rid of drm_edid_raw() */
2117 edid = drm_edid_raw(drm_edid);
2118 aconnector->dc_em_sink = dc_link_add_remote_sink(
2119 aconnector->dc_link,
2120 (uint8_t *)edid,
2121 (edid->extensions + 1) * EDID_LENGTH,
2122 &init_params);
2123
2124 if (aconnector->base.force == DRM_FORCE_ON) {
2125 aconnector->dc_sink = aconnector->dc_link->local_sink ?
2126 aconnector->dc_link->local_sink :
2127 aconnector->dc_em_sink;
2128 if (aconnector->dc_sink)
2129 dc_sink_retain(aconnector->dc_sink);
2130 }
2131 }
2132 EXPORT_IF_KUNIT(create_eml_sink);
2133
handle_edid_mgmt(struct amdgpu_dm_connector * aconnector)2134 STATIC_IFN_KUNIT void handle_edid_mgmt(struct amdgpu_dm_connector *aconnector)
2135 {
2136 struct dc_link *link = (struct dc_link *)aconnector->dc_link;
2137
2138 /*
2139 * In case of headless boot with force on for DP managed connector
2140 * Those settings have to be != 0 to get initial modeset
2141 */
2142 if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT) {
2143 link->verified_link_cap.lane_count = LANE_COUNT_FOUR;
2144 link->verified_link_cap.link_rate = LINK_RATE_HIGH2;
2145 }
2146
2147 create_eml_sink(aconnector);
2148 }
2149 EXPORT_IF_KUNIT(handle_edid_mgmt);
2150
dm_validate_stream_and_context(struct dc * dc,struct dc_stream_state * stream)2151 STATIC_IFN_KUNIT enum dc_status dm_validate_stream_and_context(struct dc *dc,
2152 struct dc_stream_state *stream)
2153 {
2154 enum dc_status dc_result = DC_ERROR_UNEXPECTED;
2155 struct dc_plane_state *dc_plane_state = NULL;
2156 struct dc_state *dc_state = NULL;
2157
2158 if (!stream)
2159 goto cleanup;
2160
2161 dc_plane_state = dc_create_plane_state(dc);
2162 if (!dc_plane_state)
2163 goto cleanup;
2164
2165 dc_state = dc_state_create(dc, NULL);
2166 if (!dc_state)
2167 goto cleanup;
2168
2169 /* populate stream to plane */
2170 dc_plane_state->src_rect.height = stream->src.height;
2171 dc_plane_state->src_rect.width = stream->src.width;
2172 dc_plane_state->dst_rect.height = stream->src.height;
2173 dc_plane_state->dst_rect.width = stream->src.width;
2174 dc_plane_state->clip_rect.height = stream->src.height;
2175 dc_plane_state->clip_rect.width = stream->src.width;
2176 dc_plane_state->plane_size.surface_pitch = ((stream->src.width + 255) / 256) * 256;
2177 dc_plane_state->plane_size.surface_size.height = stream->src.height;
2178 dc_plane_state->plane_size.surface_size.width = stream->src.width;
2179 dc_plane_state->plane_size.chroma_size.height = stream->src.height;
2180 dc_plane_state->plane_size.chroma_size.width = stream->src.width;
2181 dc_plane_state->format = SURFACE_PIXEL_FORMAT_GRPH_ARGB8888;
2182 dc_plane_state->tiling_info.gfx9.swizzle = DC_SW_UNKNOWN;
2183 dc_plane_state->rotation = ROTATION_ANGLE_0;
2184 dc_plane_state->is_tiling_rotated = false;
2185 dc_plane_state->tiling_info.gfx8.array_mode = DC_ARRAY_LINEAR_GENERAL;
2186
2187 dc_result = dc_validate_stream(dc, stream);
2188 if (dc_result == DC_OK)
2189 dc_result = dc_validate_plane(dc, dc_plane_state);
2190
2191 if (dc_result == DC_OK)
2192 dc_result = dc_state_add_stream(dc, dc_state, stream);
2193
2194 if (dc_result == DC_OK && !dc_state_add_plane(
2195 dc,
2196 stream,
2197 dc_plane_state,
2198 dc_state))
2199 dc_result = DC_FAIL_ATTACH_SURFACES;
2200
2201 if (dc_result == DC_OK)
2202 dc_result = dc_validate_global_state(dc, dc_state, DC_VALIDATE_MODE_ONLY);
2203
2204 cleanup:
2205 if (dc_state)
2206 dc_state_release(dc_state);
2207
2208 if (dc_plane_state)
2209 dc_plane_state_release(dc_plane_state);
2210
2211 return dc_result;
2212 }
2213 EXPORT_IF_KUNIT(dm_validate_stream_and_context);
2214
2215 static enum dc_status
dm_validate_stream_color_format(const struct drm_connector_state * drm_state,const struct dc_stream_state * stream)2216 dm_validate_stream_color_format(const struct drm_connector_state *drm_state,
2217 const struct dc_stream_state *stream)
2218 {
2219 enum dc_pixel_encoding encoding;
2220
2221 if (!drm_state->color_format)
2222 return DC_OK;
2223
2224 switch (drm_state->color_format) {
2225 case DRM_CONNECTOR_COLOR_FORMAT_AUTO:
2226 case DRM_CONNECTOR_COLOR_FORMAT_RGB444:
2227 encoding = PIXEL_ENCODING_RGB;
2228 break;
2229 case DRM_CONNECTOR_COLOR_FORMAT_YCBCR444:
2230 encoding = PIXEL_ENCODING_YCBCR444;
2231 break;
2232 case DRM_CONNECTOR_COLOR_FORMAT_YCBCR422:
2233 encoding = PIXEL_ENCODING_YCBCR422;
2234 break;
2235 case DRM_CONNECTOR_COLOR_FORMAT_YCBCR420:
2236 encoding = PIXEL_ENCODING_YCBCR420;
2237 break;
2238 default:
2239 encoding = PIXEL_ENCODING_UNDEFINED;
2240 break;
2241 }
2242
2243 return encoding == stream->timing.pixel_encoding ?
2244 DC_OK : DC_UNSUPPORTED_VALUE;
2245 }
2246
2247 struct dc_stream_state *
amdgpu_dm_create_validate_stream_for_sink(struct drm_connector * connector,const struct drm_display_mode * drm_mode,const struct dm_connector_state * dm_state,const struct dc_stream_state * old_stream)2248 amdgpu_dm_create_validate_stream_for_sink(struct drm_connector *connector,
2249 const struct drm_display_mode *drm_mode,
2250 const struct dm_connector_state *dm_state,
2251 const struct dc_stream_state *old_stream)
2252 {
2253 /*
2254 * Ordered lists of the encodings and bit depths we are willing to
2255 * validate, best quality/bandwidth first. The per-sink masks built
2256 * below gate which of these entries are actually attempted.
2257 */
2258 static const enum dc_pixel_encoding encoding_order[] = {
2259 PIXEL_ENCODING_YCBCR444,
2260 PIXEL_ENCODING_RGB,
2261 PIXEL_ENCODING_YCBCR422,
2262 PIXEL_ENCODING_YCBCR420,
2263 };
2264 static const u8 bpc_order[] = { 16, 12, 10, 8, 6 };
2265
2266 struct amdgpu_dm_connector *aconnector = NULL;
2267 struct amdgpu_device *adev = drm_to_adev(connector->dev);
2268 const struct drm_display_info *info = &connector->display_info;
2269 struct dc_stream_state *stream = NULL;
2270 const struct drm_connector_state *drm_state = dm_state ? &dm_state->base : NULL;
2271 int requested_bpc = drm_state ? drm_state->max_requested_bpc : 8;
2272 enum dc_status dc_result = DC_OK;
2273 enum signal_type signal = SIGNAL_TYPE_NONE;
2274 bool want_420, want_422, is_dp_or_hdmi;
2275 u32 encoding_mask = 0;
2276 u32 bpc_mask = 0;
2277 bool is_hdmi_ep = false;
2278 unsigned int i, j;
2279
2280 if (!dm_state)
2281 return NULL;
2282
2283 if (connector->connector_type != DRM_MODE_CONNECTOR_WRITEBACK)
2284 aconnector = to_amdgpu_dm_connector(connector);
2285
2286 /*
2287 * Writeback connectors have no sink EDID to enumerate against. They
2288 * only ever use RGB at the requested depth, so build and validate a
2289 * single stream directly and return it (dc_validate_stream() is not
2290 * meaningful for the writeback path).
2291 */
2292 if (!aconnector) {
2293 stream = create_stream_for_sink(connector, drm_mode, dm_state,
2294 old_stream, requested_bpc,
2295 PIXEL_ENCODING_RGB, is_hdmi_ep);
2296 if (!stream)
2297 drm_err(adev_to_drm(adev), "Failed to create stream for sink!\n");
2298 return stream;
2299 }
2300
2301 signal = aconnector->dc_link->connector_signal;
2302
2303 /*
2304 * Determine whether this is a native HDMI sink or a DP->HDMI dongle.
2305 * Since we check for it a few times below, cache the result.
2306 */
2307 is_hdmi_ep = (signal == SIGNAL_TYPE_HDMI_TYPE_A ||
2308 signal == SIGNAL_TYPE_HDMI_FRL ||
2309 aconnector->dc_link->dpcd_caps.dongle_type ==
2310 DISPLAY_DONGLE_DP_HDMI_CONVERTER);
2311 is_dp_or_hdmi = dc_is_hdmi_signal(signal) || dc_is_dp_signal(signal);
2312
2313 /*
2314 * Build the set of pixel encodings this sink advertises, so we only
2315 * ever validate combinations the display can actually accept. Ordered
2316 * best-first: RGB / YCbCr444 (full bandwidth) -> YCbCr422 -> YCbCr420.
2317 *
2318 * - RGB is the mandatory baseline and always available.
2319 * - YCbCr444 is only meaningful for native HDMI sinks.
2320 * - A 420-only mode collapses the mask to YCbCr420 alone.
2321 * - The debugfs force_yuv_pixel_format override pins the encoding to a
2322 * single dc_pixel_encoding when set (PIXEL_ENCODING_UNDEFINED means
2323 * "no override"). An explicit YCbCr420 force is honoured even on
2324 * modes the sink only lists as RGB/4:4:4 capable
2325 * (drm_mode_is_420_also() clear), as required for HDMI compliance
2326 * testing; dc_validate_stream() still rejects anything the link
2327 * genuinely cannot carry. The YCbCr422/YCbCr444 forces stay gated on
2328 * the sink's advertised caps.
2329 */
2330 want_420 = (aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR420) ||
2331 (drm_state && drm_state->color_format == DRM_CONNECTOR_COLOR_FORMAT_YCBCR420);
2332 want_422 = (aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR422) ||
2333 (drm_state && drm_state->color_format == DRM_CONNECTOR_COLOR_FORMAT_YCBCR422);
2334
2335 if (drm_mode_is_420_only(info, drm_mode) &&
2336 (want_420 || (drm_state && drm_state->color_format == DRM_CONNECTOR_COLOR_FORMAT_AUTO))) {
2337 encoding_mask = BIT(PIXEL_ENCODING_YCBCR420);
2338 } else if (drm_mode_is_420_also(info, drm_mode) && want_420) {
2339 encoding_mask = BIT(PIXEL_ENCODING_YCBCR420);
2340 } else if ((info->color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422)) &&
2341 want_422 && is_dp_or_hdmi) {
2342 encoding_mask = BIT(PIXEL_ENCODING_YCBCR422);
2343 } else if (((aconnector->force_yuv_pixel_format == PIXEL_ENCODING_YCBCR444) ||
2344 (drm_state && drm_state->color_format == DRM_CONNECTOR_COLOR_FORMAT_YCBCR444)) &&
2345 (info->color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444)) &&
2346 is_dp_or_hdmi) {
2347 encoding_mask = BIT(PIXEL_ENCODING_YCBCR444);
2348 } else if (drm_state && drm_state->color_format == DRM_CONNECTOR_COLOR_FORMAT_RGB444) {
2349 encoding_mask = BIT(PIXEL_ENCODING_RGB);
2350 } else {
2351 encoding_mask = BIT(PIXEL_ENCODING_RGB);
2352
2353 if ((info->color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444)) &&
2354 is_hdmi_ep)
2355 encoding_mask |= BIT(PIXEL_ENCODING_YCBCR444);
2356
2357 if (info->color_formats & BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422))
2358 encoding_mask |= BIT(PIXEL_ENCODING_YCBCR422);
2359
2360 if (drm_mode_is_420_also(info, drm_mode))
2361 encoding_mask |= BIT(PIXEL_ENCODING_YCBCR420);
2362 }
2363
2364 /*
2365 * Build the set of bit depths to try, high-to-low. Start from the
2366 * atomic-requested cap and clear anything the sink cannot do:
2367 *
2368 * - Never exceed the requested bpc.
2369 * - HDMI/FRL and DP->HDMI dongles have no defined 6 bpc mode.
2370 * - Any depth above the EDID-reported bpc is dropped.
2371 *
2372 * amdgpu_dm_convert_color_depth_from_display_info() applies the final
2373 * per-encoding cap (e.g. YCbCr420 deep-colour limits) when the stream
2374 * is built, so this mask only needs the coarse sink limits.
2375 */
2376 for (j = 0; j < ARRAY_SIZE(bpc_order); j++) {
2377 u8 bpc = bpc_order[j];
2378
2379 if (requested_bpc > 0 && bpc > requested_bpc)
2380 continue;
2381
2382 if (bpc == 6 && is_hdmi_ep)
2383 continue;
2384
2385 if (info->bpc && bpc > info->bpc)
2386 continue;
2387
2388 bpc_mask |= BIT(bpc);
2389 }
2390
2391 /*
2392 * Enumerate the supported (encoding, bpc) combinations in priority
2393 * order and return the first that validates. Because the masks only
2394 * contain sink-supported entries, this is generic across connector
2395 * types and needs no encoding-specific fallback afterwards.
2396 *
2397 * The selection lives entirely on the stack and is passed by value to
2398 * create_stream_for_sink(); no shared connector state is mutated. This
2399 * matters because this helper runs concurrently from the connector
2400 * probe worker (->mode_valid) and from a compositor's atomic check on
2401 * the same connector.
2402 */
2403 for (i = 0; i < ARRAY_SIZE(encoding_order); i++) {
2404 enum dc_pixel_encoding enc = encoding_order[i];
2405
2406 if (!(encoding_mask & BIT(enc)))
2407 continue;
2408
2409 for (j = 0; j < ARRAY_SIZE(bpc_order); j++) {
2410 u8 bpc = bpc_order[j];
2411
2412 if (!(bpc_mask & BIT(bpc)))
2413 continue;
2414
2415 drm_dbg_kms(connector->dev,
2416 "Trying %s with %d bpc (encoding_mask=0x%x bpc_mask=0x%x requested_bpc=%d drm max_bpc)\n",
2417 dc_pixel_encoding_to_str(enc), bpc,
2418 encoding_mask, bpc_mask, requested_bpc);
2419
2420 stream = create_stream_for_sink(connector, drm_mode,
2421 dm_state, old_stream,
2422 bpc, enc, is_hdmi_ep);
2423 if (stream == NULL) {
2424 drm_err(adev_to_drm(adev), "Failed to create stream for sink!\n");
2425 return NULL;
2426 }
2427
2428 dc_result = dc_validate_stream(adev->dm.dc, stream);
2429
2430 if (dc_result == DC_OK &&
2431 stream->signal == SIGNAL_TYPE_DISPLAY_PORT_MST)
2432 dc_result = dm_dp_mst_is_port_support_mode(aconnector, stream);
2433
2434 if (dc_result == DC_OK)
2435 dc_result = dm_validate_stream_and_context(adev->dm.dc, stream);
2436
2437 if (dc_result == DC_OK)
2438 dc_result = dm_validate_stream_color_format(drm_state, stream);
2439
2440 if (dc_result == DC_OK)
2441 return stream;
2442
2443 drm_dbg_kms(connector->dev, "Pruned mode %d x %d (refresh rate %d) %s %s -- %s\n",
2444 drm_mode->hdisplay,
2445 drm_mode->vdisplay,
2446 drm_mode_vrefresh(drm_mode),
2447 dc_pixel_encoding_to_str(stream->timing.pixel_encoding),
2448 dc_color_depth_to_str(stream->timing.display_color_depth),
2449 dc_status_to_str(dc_result));
2450
2451 dc_stream_release(stream);
2452 stream = NULL;
2453 }
2454 }
2455
2456 /*
2457 * Every sink-supported combination was exhausted without validating;
2458 * the mode is genuinely unsupported on this link.
2459 */
2460 return NULL;
2461 }
2462 EXPORT_IF_KUNIT(amdgpu_dm_create_validate_stream_for_sink);
2463
amdgpu_dm_connector_mode_valid(struct drm_connector * connector,const struct drm_display_mode * mode)2464 enum drm_mode_status amdgpu_dm_connector_mode_valid(struct drm_connector *connector,
2465 const struct drm_display_mode *mode)
2466 {
2467 int result = MODE_ERROR;
2468 struct dc_sink *dc_sink;
2469 struct drm_display_mode *test_mode;
2470 /* TODO: Unhardcode stream count */
2471 struct dc_stream_state *stream;
2472 /* we always have an amdgpu_dm_connector here since we got
2473 * here via the amdgpu_dm_connector_helper_funcs
2474 */
2475 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
2476
2477 if ((mode->flags & DRM_MODE_FLAG_INTERLACE) ||
2478 (mode->flags & DRM_MODE_FLAG_DBLSCAN))
2479 return result;
2480
2481 /*
2482 * Only run this the first time mode_valid is called to initilialize
2483 * EDID mgmt
2484 */
2485 if (aconnector->base.force != DRM_FORCE_UNSPECIFIED &&
2486 !aconnector->dc_em_sink)
2487 handle_edid_mgmt(aconnector);
2488
2489 dc_sink = to_amdgpu_dm_connector(connector)->dc_sink;
2490
2491 if (dc_sink == NULL && aconnector->base.force != DRM_FORCE_ON_DIGITAL &&
2492 aconnector->base.force != DRM_FORCE_ON) {
2493 drm_err(connector->dev, "dc_sink is NULL!\n");
2494 goto fail;
2495 }
2496
2497 test_mode = drm_mode_duplicate(connector->dev, mode);
2498 if (!test_mode)
2499 goto fail;
2500
2501 drm_mode_set_crtcinfo(test_mode, 0);
2502
2503 stream = amdgpu_dm_create_validate_stream_for_sink(connector, test_mode,
2504 to_dm_connector_state(connector->state),
2505 NULL);
2506 drm_mode_destroy(connector->dev, test_mode);
2507 if (stream) {
2508 dc_stream_release(stream);
2509 result = MODE_OK;
2510 }
2511
2512 fail:
2513 /* TODO: error handling*/
2514 return result;
2515 }
2516 EXPORT_IF_KUNIT(amdgpu_dm_connector_mode_valid);
2517
amdgpu_dm_fill_hdr_info_packet(const struct drm_connector_state * state,struct dc_info_packet * out)2518 int amdgpu_dm_fill_hdr_info_packet(const struct drm_connector_state *state,
2519 struct dc_info_packet *out)
2520 {
2521 struct hdmi_drm_infoframe frame;
2522 unsigned char buf[30]; /* 26 + 4 */
2523 ssize_t len;
2524 int ret, i;
2525
2526 memset(out, 0, sizeof(*out));
2527
2528 if (!state->hdr_output_metadata)
2529 return 0;
2530
2531 ret = drm_hdmi_infoframe_set_hdr_metadata(&frame, state);
2532 if (ret)
2533 return ret;
2534
2535 len = hdmi_drm_infoframe_pack_only(&frame, buf, sizeof(buf));
2536 if (len < 0)
2537 return (int)len;
2538
2539 /* Static metadata is a fixed 26 bytes + 4 byte header. */
2540 if (len != 30)
2541 return -EINVAL;
2542
2543 /* Prepare the infopacket for DC. */
2544 switch (state->connector->connector_type) {
2545 case DRM_MODE_CONNECTOR_HDMIA:
2546 out->hb0 = 0x87; /* type */
2547 out->hb1 = 0x01; /* version */
2548 out->hb2 = 0x1A; /* length */
2549 out->sb[0] = buf[3]; /* checksum */
2550 i = 1;
2551 break;
2552
2553 case DRM_MODE_CONNECTOR_DisplayPort:
2554 case DRM_MODE_CONNECTOR_eDP:
2555 out->hb0 = 0x00; /* sdp id, zero */
2556 out->hb1 = 0x87; /* type */
2557 out->hb2 = 0x1D; /* payload len - 1 */
2558 out->hb3 = (0x13 << 2); /* sdp version */
2559 out->sb[0] = 0x01; /* version */
2560 out->sb[1] = 0x1A; /* length */
2561 i = 2;
2562 break;
2563
2564 default:
2565 return -EINVAL;
2566 }
2567
2568 memcpy(&out->sb[i], &buf[4], 26);
2569 out->valid = true;
2570
2571 print_hex_dump(KERN_DEBUG, "HDR SB:", DUMP_PREFIX_NONE, 16, 1, out->sb,
2572 sizeof(out->sb), false);
2573
2574 return 0;
2575 }
2576 EXPORT_IF_KUNIT(amdgpu_dm_fill_hdr_info_packet);
2577
2578 static int
amdgpu_dm_connector_atomic_check(struct drm_connector * conn,struct drm_atomic_commit * state)2579 amdgpu_dm_connector_atomic_check(struct drm_connector *conn,
2580 struct drm_atomic_commit *state)
2581 {
2582 struct drm_connector_state *new_con_state =
2583 drm_atomic_get_new_connector_state(state, conn);
2584 struct drm_connector_state *old_con_state =
2585 drm_atomic_get_old_connector_state(state, conn);
2586 struct drm_crtc *crtc;
2587 struct drm_crtc_state *new_crtc_state;
2588 struct amdgpu_dm_connector *aconn = to_amdgpu_dm_connector(conn);
2589 int ret;
2590
2591 if (WARN_ON(unlikely(!old_con_state || !new_con_state)))
2592 return -EINVAL;
2593
2594 trace_amdgpu_dm_connector_atomic_check(new_con_state);
2595
2596 if (conn->connector_type == DRM_MODE_CONNECTOR_DisplayPort) {
2597 ret = drm_dp_mst_root_conn_atomic_check(new_con_state, &aconn->mst_mgr);
2598 if (ret < 0)
2599 return ret;
2600 }
2601
2602 crtc = new_con_state->crtc;
2603 if (!crtc)
2604 return 0;
2605
2606 if (new_con_state->privacy_screen_sw_state != old_con_state->privacy_screen_sw_state) {
2607 new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
2608 if (IS_ERR(new_crtc_state))
2609 return PTR_ERR(new_crtc_state);
2610
2611 new_crtc_state->mode_changed = true;
2612 }
2613
2614 if (new_con_state->colorspace != old_con_state->colorspace) {
2615 new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
2616 if (IS_ERR(new_crtc_state))
2617 return PTR_ERR(new_crtc_state);
2618
2619 new_crtc_state->mode_changed = true;
2620 }
2621
2622 if (new_con_state->content_type != old_con_state->content_type) {
2623 new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
2624 if (IS_ERR(new_crtc_state))
2625 return PTR_ERR(new_crtc_state);
2626
2627 new_crtc_state->mode_changed = true;
2628 }
2629
2630 if (!drm_connector_atomic_hdr_metadata_equal(old_con_state, new_con_state)) {
2631 struct dc_info_packet hdr_infopacket;
2632
2633 ret = amdgpu_dm_fill_hdr_info_packet(new_con_state, &hdr_infopacket);
2634 if (ret)
2635 return ret;
2636
2637 new_crtc_state = drm_atomic_get_crtc_state(state, crtc);
2638 if (IS_ERR(new_crtc_state))
2639 return PTR_ERR(new_crtc_state);
2640
2641 /*
2642 * DC considers the stream backends changed if the
2643 * static metadata changes. Forcing the modeset also
2644 * gives a simple way for userspace to switch from
2645 * 8bpc to 10bpc when setting the metadata to enter
2646 * or exit HDR.
2647 *
2648 * Changing the static metadata after it's been
2649 * set is permissible, however. So only force a
2650 * modeset if we're entering or exiting HDR.
2651 */
2652 new_crtc_state->mode_changed = new_crtc_state->mode_changed ||
2653 !old_con_state->hdr_output_metadata ||
2654 !new_con_state->hdr_output_metadata;
2655 }
2656
2657 return 0;
2658 }
2659
2660 static const struct drm_connector_helper_funcs
2661 amdgpu_dm_connector_helper_funcs = {
2662 /*
2663 * If hotplugging a second bigger display in FB Con mode, bigger resolution
2664 * modes will be filtered by drm_mode_validate_size(), and those modes
2665 * are missing after user start lightdm. So we need to renew modes list.
2666 * in get_modes call back, not just return the modes count
2667 */
2668 .get_modes = get_modes,
2669 .mode_valid = amdgpu_dm_connector_mode_valid,
2670 .atomic_check = amdgpu_dm_connector_atomic_check,
2671 };
2672
amdgpu_dm_convert_dc_color_depth_into_bpc(enum dc_color_depth display_color_depth)2673 int amdgpu_dm_convert_dc_color_depth_into_bpc(enum dc_color_depth display_color_depth)
2674 {
2675 switch (display_color_depth) {
2676 case COLOR_DEPTH_666:
2677 return 6;
2678 case COLOR_DEPTH_888:
2679 return 8;
2680 case COLOR_DEPTH_101010:
2681 return 10;
2682 case COLOR_DEPTH_121212:
2683 return 12;
2684 case COLOR_DEPTH_141414:
2685 return 14;
2686 case COLOR_DEPTH_161616:
2687 return 16;
2688 default:
2689 break;
2690 }
2691 return 0;
2692 }
2693 EXPORT_IF_KUNIT(amdgpu_dm_convert_dc_color_depth_into_bpc);
2694
to_drm_connector_type(enum signal_type st,uint32_t connector_id)2695 STATIC_IFN_KUNIT int to_drm_connector_type(enum signal_type st, uint32_t connector_id)
2696 {
2697 switch (st) {
2698 case SIGNAL_TYPE_HDMI_TYPE_A:
2699 return DRM_MODE_CONNECTOR_HDMIA;
2700 case SIGNAL_TYPE_EDP:
2701 return DRM_MODE_CONNECTOR_eDP;
2702 case SIGNAL_TYPE_LVDS:
2703 return DRM_MODE_CONNECTOR_LVDS;
2704 case SIGNAL_TYPE_RGB:
2705 return DRM_MODE_CONNECTOR_VGA;
2706 case SIGNAL_TYPE_DISPLAY_PORT:
2707 case SIGNAL_TYPE_DISPLAY_PORT_MST:
2708 /* External DP bridges have a different connector type. */
2709 if (connector_id == CONNECTOR_ID_VGA)
2710 return DRM_MODE_CONNECTOR_VGA;
2711 else if (connector_id == CONNECTOR_ID_LVDS)
2712 return DRM_MODE_CONNECTOR_LVDS;
2713
2714 return DRM_MODE_CONNECTOR_DisplayPort;
2715 case SIGNAL_TYPE_DVI_DUAL_LINK:
2716 case SIGNAL_TYPE_DVI_SINGLE_LINK:
2717 if (connector_id == CONNECTOR_ID_SINGLE_LINK_DVII ||
2718 connector_id == CONNECTOR_ID_DUAL_LINK_DVII)
2719 return DRM_MODE_CONNECTOR_DVII;
2720
2721 return DRM_MODE_CONNECTOR_DVID;
2722 case SIGNAL_TYPE_VIRTUAL:
2723 return DRM_MODE_CONNECTOR_VIRTUAL;
2724
2725 default:
2726 return DRM_MODE_CONNECTOR_Unknown;
2727 }
2728 }
2729 EXPORT_IF_KUNIT(to_drm_connector_type);
2730
amdgpu_dm_connector_to_encoder(struct drm_connector * connector)2731 STATIC_IFN_KUNIT struct drm_encoder *amdgpu_dm_connector_to_encoder(struct drm_connector *connector)
2732 {
2733 struct drm_encoder *encoder;
2734
2735 /* There is only one encoder per connector */
2736 drm_connector_for_each_possible_encoder(connector, encoder)
2737 return encoder;
2738
2739 return NULL;
2740 }
2741 EXPORT_IF_KUNIT(amdgpu_dm_connector_to_encoder);
2742
amdgpu_dm_get_native_mode(struct drm_connector * connector)2743 STATIC_IFN_KUNIT void amdgpu_dm_get_native_mode(struct drm_connector *connector)
2744 {
2745 struct drm_encoder *encoder;
2746 struct amdgpu_encoder *amdgpu_encoder;
2747
2748 encoder = amdgpu_dm_connector_to_encoder(connector);
2749
2750 if (encoder == NULL)
2751 return;
2752
2753 amdgpu_encoder = to_amdgpu_encoder(encoder);
2754
2755 amdgpu_encoder->native_mode.clock = 0;
2756
2757 if (!list_empty(&connector->probed_modes)) {
2758 struct drm_display_mode *preferred_mode = NULL;
2759
2760 list_for_each_entry(preferred_mode,
2761 &connector->probed_modes,
2762 head) {
2763 if (preferred_mode->type & DRM_MODE_TYPE_PREFERRED)
2764 amdgpu_encoder->native_mode = *preferred_mode;
2765
2766 break;
2767 }
2768
2769 }
2770 }
2771 EXPORT_IF_KUNIT(amdgpu_dm_get_native_mode);
2772
2773 STATIC_IFN_KUNIT struct drm_display_mode *
amdgpu_dm_create_common_mode(struct drm_encoder * encoder,const char * name,int hdisplay,int vdisplay)2774 amdgpu_dm_create_common_mode(struct drm_encoder *encoder,
2775 const char *name,
2776 int hdisplay, int vdisplay)
2777 {
2778 struct drm_device *dev = encoder->dev;
2779 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
2780 struct drm_display_mode *mode = NULL;
2781 struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
2782
2783 mode = drm_mode_duplicate(dev, native_mode);
2784
2785 if (mode == NULL)
2786 return NULL;
2787
2788 mode->hdisplay = hdisplay;
2789 mode->vdisplay = vdisplay;
2790 mode->type &= ~DRM_MODE_TYPE_PREFERRED;
2791 strscpy(mode->name, name, DRM_DISPLAY_MODE_LEN);
2792
2793 return mode;
2794
2795 }
2796 EXPORT_IF_KUNIT(amdgpu_dm_create_common_mode);
2797
2798 static const struct amdgpu_dm_mode_size {
2799 char name[DRM_DISPLAY_MODE_LEN];
2800 int w;
2801 int h;
2802 } common_modes[] = {
2803 { "640x480", 640, 480},
2804 { "800x600", 800, 600},
2805 { "1024x768", 1024, 768},
2806 { "1280x720", 1280, 720},
2807 { "1280x800", 1280, 800},
2808 {"1280x1024", 1280, 1024},
2809 { "1440x900", 1440, 900},
2810 {"1680x1050", 1680, 1050},
2811 {"1600x1200", 1600, 1200},
2812 {"1920x1080", 1920, 1080},
2813 {"1920x1200", 1920, 1200}
2814 };
2815
amdgpu_dm_connector_add_common_modes(struct drm_encoder * encoder,struct drm_connector * connector)2816 STATIC_IFN_KUNIT void amdgpu_dm_connector_add_common_modes(struct drm_encoder *encoder,
2817 struct drm_connector *connector)
2818 {
2819 struct amdgpu_encoder *amdgpu_encoder = to_amdgpu_encoder(encoder);
2820 struct drm_display_mode *mode = NULL;
2821 struct drm_display_mode *native_mode = &amdgpu_encoder->native_mode;
2822 struct amdgpu_dm_connector *amdgpu_dm_connector =
2823 to_amdgpu_dm_connector(connector);
2824 int i;
2825 int n;
2826
2827 if ((connector->connector_type != DRM_MODE_CONNECTOR_eDP) &&
2828 (connector->connector_type != DRM_MODE_CONNECTOR_LVDS))
2829 return;
2830
2831 n = ARRAY_SIZE(common_modes);
2832
2833 for (i = 0; i < n; i++) {
2834 struct drm_display_mode *curmode = NULL;
2835 bool mode_existed = false;
2836
2837 if (common_modes[i].w > native_mode->hdisplay ||
2838 common_modes[i].h > native_mode->vdisplay ||
2839 (common_modes[i].w == native_mode->hdisplay &&
2840 common_modes[i].h == native_mode->vdisplay))
2841 continue;
2842
2843 list_for_each_entry(curmode, &connector->probed_modes, head) {
2844 if (common_modes[i].w == curmode->hdisplay &&
2845 common_modes[i].h == curmode->vdisplay) {
2846 mode_existed = true;
2847 break;
2848 }
2849 }
2850
2851 if (mode_existed)
2852 continue;
2853
2854 mode = amdgpu_dm_create_common_mode(encoder,
2855 common_modes[i].name, common_modes[i].w,
2856 common_modes[i].h);
2857 if (!mode)
2858 continue;
2859
2860 drm_mode_probed_add(connector, mode);
2861 amdgpu_dm_connector->num_modes++;
2862 }
2863 }
2864 EXPORT_IF_KUNIT(amdgpu_dm_connector_add_common_modes);
2865
amdgpu_set_panel_orientation(struct drm_connector * connector)2866 void amdgpu_set_panel_orientation(struct drm_connector *connector)
2867 {
2868 struct drm_encoder *encoder;
2869 struct amdgpu_encoder *amdgpu_encoder;
2870 const struct drm_display_mode *native_mode;
2871
2872 if (connector->connector_type != DRM_MODE_CONNECTOR_eDP &&
2873 connector->connector_type != DRM_MODE_CONNECTOR_LVDS)
2874 return;
2875
2876 mutex_lock(&connector->dev->mode_config.mutex);
2877 amdgpu_dm_connector_get_modes(connector);
2878 mutex_unlock(&connector->dev->mode_config.mutex);
2879
2880 encoder = amdgpu_dm_connector_to_encoder(connector);
2881 if (!encoder)
2882 return;
2883
2884 amdgpu_encoder = to_amdgpu_encoder(encoder);
2885
2886 native_mode = &amdgpu_encoder->native_mode;
2887 if (native_mode->hdisplay == 0 || native_mode->vdisplay == 0)
2888 return;
2889
2890 drm_connector_set_panel_orientation_with_quirk(connector,
2891 DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
2892 native_mode->hdisplay,
2893 native_mode->vdisplay);
2894 }
2895
2896 /*
2897 * The Apple Studio Display primary tile advertises both the full 5120x2880
2898 * mode and the per-tile 2560x2880 timing. As the secondary tile is hidden from
2899 * userspace (see amdgpu_dm_hide_secondary_tile_from_userspace()), drop the
2900 * per-tile timing from the primary connector so compositors only pick the full
2901 * 5K mode.
2902 */
amdgpu_dm_prune_primary_tile_modes(struct drm_connector * connector)2903 static void amdgpu_dm_prune_primary_tile_modes(struct drm_connector *connector)
2904 {
2905 struct amdgpu_dm_connector *aconnector = to_amdgpu_dm_connector(connector);
2906 struct drm_display_mode *mode, *t;
2907
2908 if (!aconnector->dc_sink)
2909 return;
2910
2911 if (!aconnector->dc_sink->edid_caps.panel_patch.disable_second_tile)
2912 return;
2913
2914 if (!connector->has_tile)
2915 return;
2916
2917 /* Only prune the per-tile timing from the primary tile. */
2918 if (connector->tile_h_loc || connector->tile_v_loc)
2919 return;
2920
2921 list_for_each_entry_safe(mode, t, &connector->probed_modes, head) {
2922 if (mode->hdisplay != connector->tile_h_size ||
2923 mode->vdisplay != connector->tile_v_size)
2924 continue;
2925
2926 drm_dbg_kms(connector->dev,
2927 "[CONNECTOR:%d:%s] pruning per-tile %dx%d timing from primary Apple Studio Display tile\n",
2928 connector->base.id, connector->name,
2929 mode->hdisplay, mode->vdisplay);
2930
2931 list_del(&mode->head);
2932 drm_mode_destroy(connector->dev, mode);
2933 aconnector->num_modes--;
2934 }
2935 }
2936
amdgpu_dm_connector_ddc_get_modes(struct drm_connector * connector,const struct drm_edid * drm_edid)2937 STATIC_IFN_KUNIT void amdgpu_dm_connector_ddc_get_modes(struct drm_connector *connector,
2938 const struct drm_edid *drm_edid)
2939 {
2940 struct amdgpu_dm_connector *amdgpu_dm_connector =
2941 to_amdgpu_dm_connector(connector);
2942
2943 if (drm_edid) {
2944 /* empty probed_modes */
2945 INIT_LIST_HEAD(&connector->probed_modes);
2946 amdgpu_dm_connector->num_modes =
2947 drm_edid_connector_add_modes(connector);
2948
2949 amdgpu_dm_prune_primary_tile_modes(connector);
2950
2951 /* sorting the probed modes before calling function
2952 * amdgpu_dm_get_native_mode() since EDID can have
2953 * more than one preferred mode. The modes that are
2954 * later in the probed mode list could be of higher
2955 * and preferred resolution. For example, 3840x2160
2956 * resolution in base EDID preferred timing and 4096x2160
2957 * preferred resolution in DID extension block later.
2958 */
2959 drm_mode_sort(&connector->probed_modes);
2960 amdgpu_dm_get_native_mode(connector);
2961
2962 /* Freesync capabilities are reset by calling
2963 * drm_edid_connector_add_modes() and need to be
2964 * restored here.
2965 */
2966 amdgpu_dm_update_freesync_caps(connector, drm_edid, false);
2967 } else {
2968 amdgpu_dm_connector->num_modes = 0;
2969 }
2970 }
2971 EXPORT_IF_KUNIT(amdgpu_dm_connector_ddc_get_modes);
2972
is_duplicate_mode(struct amdgpu_dm_connector * aconnector,struct drm_display_mode * mode)2973 STATIC_IFN_KUNIT bool is_duplicate_mode(struct amdgpu_dm_connector *aconnector,
2974 struct drm_display_mode *mode)
2975 {
2976 struct drm_display_mode *m;
2977
2978 list_for_each_entry(m, &aconnector->base.probed_modes, head) {
2979 if (drm_mode_equal(m, mode))
2980 return true;
2981 }
2982
2983 return false;
2984 }
2985 EXPORT_IF_KUNIT(is_duplicate_mode);
2986
add_fs_modes(struct amdgpu_dm_connector * aconnector)2987 STATIC_IFN_KUNIT uint add_fs_modes(struct amdgpu_dm_connector *aconnector)
2988 {
2989 const struct drm_display_mode *m;
2990 struct drm_display_mode *new_mode;
2991 uint i;
2992 u32 new_modes_count = 0;
2993
2994 /* Standard FPS values
2995 *
2996 * 23.976 - TV/NTSC
2997 * 24 - Cinema
2998 * 25 - TV/PAL
2999 * 29.97 - TV/NTSC
3000 * 30 - TV/NTSC
3001 * 48 - Cinema HFR
3002 * 50 - TV/PAL
3003 * 60 - Commonly used
3004 * 48,72,96,120 - Multiples of 24
3005 */
3006 static const u32 common_rates[] = {
3007 23976, 24000, 25000, 29970, 30000,
3008 48000, 50000, 60000, 72000, 96000, 120000
3009 };
3010
3011 /*
3012 * Find mode with highest refresh rate with the same resolution
3013 * as the preferred mode. Some monitors report a preferred mode
3014 * with lower resolution than the highest refresh rate supported.
3015 */
3016
3017 m = amdgpu_dm_get_highest_refresh_rate_mode(aconnector, true);
3018 if (!m)
3019 return 0;
3020
3021 for (i = 0; i < ARRAY_SIZE(common_rates); i++) {
3022 u64 target_vtotal, target_vtotal_diff;
3023 u64 num, den;
3024
3025 if (drm_mode_vrefresh(m) * 1000 < common_rates[i])
3026 continue;
3027
3028 if (common_rates[i] < aconnector->min_vfreq * 1000 ||
3029 common_rates[i] > aconnector->max_vfreq * 1000)
3030 continue;
3031
3032 num = (unsigned long long)m->clock * 1000 * 1000;
3033 den = common_rates[i] * (unsigned long long)m->htotal;
3034 target_vtotal = div_u64(num, den);
3035 target_vtotal_diff = target_vtotal - m->vtotal;
3036
3037 /* Check for illegal modes */
3038 if (m->vsync_start + target_vtotal_diff < m->vdisplay ||
3039 m->vsync_end + target_vtotal_diff < m->vsync_start ||
3040 m->vtotal + target_vtotal_diff < m->vsync_end)
3041 continue;
3042
3043 new_mode = drm_mode_duplicate(aconnector->base.dev, m);
3044 if (!new_mode)
3045 goto out;
3046
3047 new_mode->vtotal += (u16)target_vtotal_diff;
3048 new_mode->vsync_start += (u16)target_vtotal_diff;
3049 new_mode->vsync_end += (u16)target_vtotal_diff;
3050 new_mode->type &= ~DRM_MODE_TYPE_PREFERRED;
3051 new_mode->type |= DRM_MODE_TYPE_DRIVER;
3052
3053 if (!is_duplicate_mode(aconnector, new_mode)) {
3054 drm_mode_probed_add(&aconnector->base, new_mode);
3055 new_modes_count += 1;
3056 } else
3057 drm_mode_destroy(aconnector->base.dev, new_mode);
3058 }
3059 out:
3060 return new_modes_count;
3061 }
3062 EXPORT_IF_KUNIT(add_fs_modes);
3063
amdgpu_dm_connector_add_freesync_modes(struct drm_connector * connector,const struct drm_edid * drm_edid)3064 STATIC_IFN_KUNIT void amdgpu_dm_connector_add_freesync_modes(struct drm_connector *connector,
3065 const struct drm_edid *drm_edid)
3066 {
3067 struct amdgpu_dm_connector *amdgpu_dm_connector =
3068 to_amdgpu_dm_connector(connector);
3069
3070 if (!(amdgpu_freesync_vid_mode && drm_edid))
3071 return;
3072
3073 if (!amdgpu_dm_connector->dc_sink || !amdgpu_dm_connector->dc_link)
3074 return;
3075
3076 if (!dc_supports_vrr(amdgpu_dm_connector->dc_sink->ctx->dce_version))
3077 return;
3078
3079 if (dc_connector_supports_analog(amdgpu_dm_connector->dc_link->link_id.id) &&
3080 amdgpu_dm_connector->dc_sink->edid_caps.analog)
3081 return;
3082
3083 if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10)
3084 amdgpu_dm_connector->num_modes +=
3085 add_fs_modes(amdgpu_dm_connector);
3086 }
3087 EXPORT_IF_KUNIT(amdgpu_dm_connector_add_freesync_modes);
3088
amdgpu_dm_connector_get_modes(struct drm_connector * connector)3089 static int amdgpu_dm_connector_get_modes(struct drm_connector *connector)
3090 {
3091 struct amdgpu_dm_connector *amdgpu_dm_connector =
3092 to_amdgpu_dm_connector(connector);
3093 struct dc_link *dc_link = amdgpu_dm_connector->dc_link;
3094 struct drm_encoder *encoder;
3095 const struct drm_edid *drm_edid = amdgpu_dm_connector->drm_edid;
3096 struct dc_link_settings *verified_link_cap = &dc_link->verified_link_cap;
3097 const struct dc *dc = dc_link->dc;
3098
3099 encoder = amdgpu_dm_connector_to_encoder(connector);
3100
3101 if (!drm_edid) {
3102 amdgpu_dm_connector->num_modes =
3103 drm_add_modes_noedid(connector, 640, 480);
3104 if (dc->link_srv->dp_get_encoding_format(verified_link_cap) == DP_128b_132b_ENCODING)
3105 amdgpu_dm_connector->num_modes +=
3106 drm_add_modes_noedid(connector, 1920, 1080);
3107
3108 if (amdgpu_dm_connector->dc_sink &&
3109 amdgpu_dm_connector->dc_sink->edid_caps.analog &&
3110 dc_connector_supports_analog(dc_link->link_id.id)) {
3111 /* Analog monitor connected by DAC load detection.
3112 * Add common modes. It will be up to the user to select one that works.
3113 */
3114 for (int i = 0; i < ARRAY_SIZE(common_modes); i++)
3115 amdgpu_dm_connector->num_modes += drm_add_modes_noedid(
3116 connector, common_modes[i].w, common_modes[i].h);
3117 }
3118 } else {
3119 amdgpu_dm_connector_ddc_get_modes(connector, drm_edid);
3120 if (encoder)
3121 amdgpu_dm_connector_add_common_modes(encoder, connector);
3122 amdgpu_dm_connector_add_freesync_modes(connector, drm_edid);
3123 }
3124 amdgpu_dm_fbc_init(connector);
3125
3126 return amdgpu_dm_connector->num_modes;
3127 }
3128
3129 static const u32 supported_colorspaces =
3130 BIT(DRM_MODE_COLORIMETRY_BT709_YCC) |
3131 BIT(DRM_MODE_COLORIMETRY_OPRGB) |
3132 BIT(DRM_MODE_COLORIMETRY_BT2020_RGB) |
3133 BIT(DRM_MODE_COLORIMETRY_BT2020_YCC);
3134
3135 static const u32 supported_colorformats =
3136 BIT(DRM_OUTPUT_COLOR_FORMAT_RGB444) |
3137 BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR444) |
3138 BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR422) |
3139 BIT(DRM_OUTPUT_COLOR_FORMAT_YCBCR420);
3140
hdmi_frl_status_polling_work(struct work_struct * work)3141 static void hdmi_frl_status_polling_work(struct work_struct *work)
3142 {
3143 struct amdgpu_display_manager *dm =
3144 container_of(to_delayed_work(work), struct amdgpu_display_manager,
3145 hdmi_frl_status_polling_work);
3146 struct dc *dc = dm->dc;
3147 struct dc_link *dc_link;
3148 bool link_update = false;
3149
3150 for (int i = 0; i < MAX_LINKS; i++) {
3151 dc_link = dc->links[i];
3152
3153
3154 if (!dc_link || !dc_link->local_sink)
3155 continue;
3156
3157 if (!dc_is_hdmi_signal(dc_link->connector_signal))
3158 continue;
3159
3160 if (dc_link->frl_link_settings.frl_link_rate == 0)
3161 continue;
3162
3163 link_update = dc_link_frl_poll_status_flag(dc_link);
3164 if (link_update) {
3165 mutex_lock(&dm->dc_lock);
3166 dc_link_detect(dc_link, DETECT_REASON_RETRAIN);
3167 mutex_unlock(&dm->dc_lock);
3168 }
3169 }
3170
3171 queue_delayed_work(dm->hdmi_frl_status_polling_wq,
3172 &dm->hdmi_frl_status_polling_work,
3173 msecs_to_jiffies(dm->hdmi_frl_status_polling_delay_ms));
3174 }
3175
amdgpu_dm_connector_init_helper(struct amdgpu_display_manager * dm,struct amdgpu_dm_connector * aconnector,int connector_type,struct dc_link * link,int link_index)3176 void amdgpu_dm_connector_init_helper(struct amdgpu_display_manager *dm,
3177 struct amdgpu_dm_connector *aconnector,
3178 int connector_type,
3179 struct dc_link *link,
3180 int link_index)
3181 {
3182 struct amdgpu_device *adev = drm_to_adev(dm->ddev);
3183
3184 /*
3185 * Some of the properties below require access to state, like bpc.
3186 * Allocate some default initial connector state with our reset helper.
3187 */
3188 if (aconnector->base.funcs->reset)
3189 aconnector->base.funcs->reset(&aconnector->base);
3190
3191 aconnector->connector_id = link_index;
3192 aconnector->bl_idx = -1;
3193 aconnector->dc_link = link;
3194 aconnector->base.interlace_allowed = false;
3195 aconnector->base.doublescan_allowed = false;
3196 aconnector->base.stereo_allowed = false;
3197 aconnector->base.dpms = DRM_MODE_DPMS_OFF;
3198 aconnector->hpd.hpd = AMDGPU_HPD_NONE; /* not used */
3199 aconnector->audio_inst = -1;
3200 aconnector->pack_sdp_v1_3 = false;
3201 aconnector->as_type = ADAPTIVE_SYNC_TYPE_NONE;
3202 memset(&aconnector->vsdb_info, 0, sizeof(aconnector->vsdb_info));
3203 mutex_init(&aconnector->hpd_lock);
3204 mutex_init(&aconnector->handle_mst_msg_ready);
3205
3206 /*
3207 * If HDMI HPD debounce delay is set, use the minimum between selected
3208 * value and AMDGPU_DM_MAX_HDMI_HPD_DEBOUNCE_MS
3209 */
3210 if (amdgpu_hdmi_hpd_debounce_delay_ms) {
3211 aconnector->hdmi_hpd_debounce_delay_ms = min(amdgpu_hdmi_hpd_debounce_delay_ms,
3212 AMDGPU_DM_MAX_HDMI_HPD_DEBOUNCE_MS);
3213 INIT_DELAYED_WORK(&aconnector->hdmi_hpd_debounce_work, amdgpu_dm_hdmi_hpd_debounce_work);
3214 aconnector->hdmi_prev_sink = NULL;
3215 } else {
3216 aconnector->hdmi_hpd_debounce_delay_ms = 0;
3217 }
3218
3219 dm->hdmi_frl_status_polling_delay_ms = 200;
3220 INIT_DELAYED_WORK(&dm->hdmi_frl_status_polling_work, hdmi_frl_status_polling_work);
3221 /*
3222 * configure support HPD hot plug connector_>polled default value is 0
3223 * which means HPD hot plug not supported
3224 */
3225 switch (connector_type) {
3226 case DRM_MODE_CONNECTOR_HDMIA:
3227 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
3228 aconnector->base.ycbcr_420_allowed =
3229 link->link_enc->features.hdmi_ycbcr420_supported ? true : false;
3230 break;
3231 case DRM_MODE_CONNECTOR_DisplayPort:
3232 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
3233 link->link_enc = link_enc_cfg_get_link_enc(link);
3234 ASSERT(link->link_enc);
3235 if (link->link_enc)
3236 aconnector->base.ycbcr_420_allowed =
3237 link->link_enc->features.dp_ycbcr420_supported ? true : false;
3238 break;
3239 case DRM_MODE_CONNECTOR_DVID:
3240 aconnector->base.polled = DRM_CONNECTOR_POLL_HPD;
3241 break;
3242 case DRM_MODE_CONNECTOR_DVII:
3243 case DRM_MODE_CONNECTOR_VGA:
3244 aconnector->base.polled =
3245 DRM_CONNECTOR_POLL_CONNECT | DRM_CONNECTOR_POLL_DISCONNECT;
3246 break;
3247 default:
3248 break;
3249 }
3250
3251 drm_object_attach_property(&aconnector->base.base,
3252 dm->ddev->mode_config.scaling_mode_property,
3253 DRM_MODE_SCALE_NONE);
3254
3255 if (connector_type == DRM_MODE_CONNECTOR_HDMIA
3256 || (connector_type == DRM_MODE_CONNECTOR_DisplayPort && !aconnector->mst_root))
3257 drm_connector_attach_broadcast_rgb_property(&aconnector->base);
3258
3259 drm_object_attach_property(&aconnector->base.base,
3260 adev->mode_info.underscan_property,
3261 UNDERSCAN_OFF);
3262 drm_object_attach_property(&aconnector->base.base,
3263 adev->mode_info.underscan_hborder_property,
3264 0);
3265 drm_object_attach_property(&aconnector->base.base,
3266 adev->mode_info.underscan_vborder_property,
3267 0);
3268
3269 if (!aconnector->mst_root)
3270 drm_connector_attach_max_bpc_property(&aconnector->base, 8, 16);
3271
3272 aconnector->base.state->max_bpc = 16;
3273 aconnector->base.state->max_requested_bpc = aconnector->base.state->max_bpc;
3274
3275 if (connector_type == DRM_MODE_CONNECTOR_HDMIA) {
3276 /* Content Type is currently only implemented for HDMI. */
3277 drm_connector_attach_content_type_property(&aconnector->base);
3278 }
3279
3280 if (connector_type == DRM_MODE_CONNECTOR_HDMIA) {
3281 if (!drm_mode_create_hdmi_colorspace_property(&aconnector->base, supported_colorspaces))
3282 drm_connector_attach_colorspace_property(&aconnector->base);
3283 } else if ((connector_type == DRM_MODE_CONNECTOR_DisplayPort && !aconnector->mst_root) ||
3284 connector_type == DRM_MODE_CONNECTOR_eDP) {
3285 if (!drm_mode_create_dp_colorspace_property(&aconnector->base, supported_colorspaces))
3286 drm_connector_attach_colorspace_property(&aconnector->base);
3287 }
3288
3289 if (connector_type == DRM_MODE_CONNECTOR_HDMIA ||
3290 connector_type == DRM_MODE_CONNECTOR_DisplayPort ||
3291 connector_type == DRM_MODE_CONNECTOR_eDP) {
3292 drm_connector_attach_hdr_output_metadata_property(&aconnector->base);
3293
3294 if (!aconnector->mst_root) {
3295 drm_connector_attach_vrr_capable_property(&aconnector->base);
3296 drm_connector_attach_color_format_property(&aconnector->base,
3297 supported_colorformats);
3298 }
3299
3300
3301 if (adev->dm.hdcp_workqueue)
3302 drm_connector_attach_content_protection_property(&aconnector->base, true);
3303 }
3304
3305 if (connector_type == DRM_MODE_CONNECTOR_eDP) {
3306 struct drm_privacy_screen *privacy_screen;
3307
3308 drm_connector_attach_panel_type_property(&aconnector->base);
3309
3310 privacy_screen = drm_privacy_screen_get(adev_to_drm(adev)->dev, NULL);
3311 if (!IS_ERR(privacy_screen)) {
3312 drm_connector_attach_privacy_screen_provider(&aconnector->base,
3313 privacy_screen);
3314 } else if (PTR_ERR(privacy_screen) != -ENODEV) {
3315 drm_warn(adev_to_drm(adev), "Error getting privacy-screen\n");
3316 }
3317 }
3318 }
3319
amdgpu_dm_i2c_xfer(struct i2c_adapter * i2c_adap,struct i2c_msg * msgs,int num)3320 STATIC_IFN_KUNIT int amdgpu_dm_i2c_xfer(struct i2c_adapter *i2c_adap,
3321 struct i2c_msg *msgs, int num)
3322 {
3323 struct amdgpu_i2c_adapter *i2c = i2c_get_adapdata(i2c_adap);
3324 struct ddc_service *ddc_service = i2c->ddc_service;
3325 struct i2c_command cmd;
3326 int i;
3327 int result = -EIO;
3328
3329 if (!ddc_service->ddc_pin)
3330 return result;
3331
3332 cmd.payloads = kzalloc_objs(struct i2c_payload, num);
3333
3334 if (!cmd.payloads)
3335 return result;
3336
3337 cmd.number_of_payloads = num;
3338 cmd.engine = I2C_COMMAND_ENGINE_DEFAULT;
3339 cmd.speed = 100;
3340
3341 for (i = 0; i < num; i++) {
3342 cmd.payloads[i].write = !(msgs[i].flags & I2C_M_RD);
3343 cmd.payloads[i].address = msgs[i].addr;
3344 cmd.payloads[i].length = msgs[i].len;
3345 cmd.payloads[i].data = msgs[i].buf;
3346 }
3347
3348 if (i2c->oem) {
3349 if (dc_submit_i2c_oem(
3350 ddc_service->ctx->dc,
3351 &cmd))
3352 result = num;
3353 } else {
3354 if (dc_submit_i2c(
3355 ddc_service->ctx->dc,
3356 ddc_service->link->link_index,
3357 &cmd))
3358 result = num;
3359 }
3360
3361 kfree(cmd.payloads);
3362 return result;
3363 }
3364 EXPORT_IF_KUNIT(amdgpu_dm_i2c_xfer);
3365
amdgpu_dm_i2c_func(struct i2c_adapter * adap)3366 STATIC_IFN_KUNIT u32 amdgpu_dm_i2c_func(struct i2c_adapter *adap)
3367 {
3368 return I2C_FUNC_I2C | I2C_FUNC_SMBUS_EMUL;
3369 }
3370 EXPORT_IF_KUNIT(amdgpu_dm_i2c_func);
3371
3372 static const struct i2c_algorithm amdgpu_dm_i2c_algo = {
3373 .master_xfer = amdgpu_dm_i2c_xfer,
3374 .functionality = amdgpu_dm_i2c_func,
3375 };
3376
3377 struct amdgpu_i2c_adapter *
amdgpu_dm_create_i2c(struct ddc_service * ddc_service,bool oem)3378 amdgpu_dm_create_i2c(struct ddc_service *ddc_service, bool oem)
3379 {
3380 struct amdgpu_device *adev = ddc_service->ctx->driver_context;
3381 struct amdgpu_i2c_adapter *i2c;
3382
3383 i2c = kzalloc_obj(struct amdgpu_i2c_adapter);
3384 if (!i2c)
3385 return NULL;
3386 i2c->base.owner = THIS_MODULE;
3387 i2c->base.dev.parent = &adev->pdev->dev;
3388 i2c->base.algo = &amdgpu_dm_i2c_algo;
3389 if (oem)
3390 snprintf(i2c->base.name, sizeof(i2c->base.name), "AMDGPU DM i2c OEM bus");
3391 else
3392 snprintf(i2c->base.name, sizeof(i2c->base.name), "AMDGPU DM i2c hw bus %d",
3393 ddc_service->link->link_index);
3394 i2c_set_adapdata(&i2c->base, i2c);
3395 i2c->ddc_service = ddc_service;
3396 i2c->oem = oem;
3397
3398 return i2c;
3399 }
3400
amdgpu_dm_initialize_hdmi_connector(struct amdgpu_dm_connector * aconnector)3401 int amdgpu_dm_initialize_hdmi_connector(struct amdgpu_dm_connector *aconnector)
3402 {
3403 struct cec_connector_info conn_info;
3404 struct drm_device *ddev = aconnector->base.dev;
3405 struct device *hdmi_dev = ddev->dev;
3406
3407 if (amdgpu_dc_debug_mask & DC_DISABLE_HDMI_CEC) {
3408 drm_info(ddev, "HDMI-CEC feature masked\n");
3409 return -EINVAL;
3410 }
3411
3412 cec_fill_conn_info_from_drm(&conn_info, &aconnector->base);
3413 aconnector->notifier =
3414 cec_notifier_conn_register(hdmi_dev, NULL, &conn_info);
3415 if (!aconnector->notifier) {
3416 drm_err(ddev, "Failed to create cec notifier\n");
3417 return -ENOMEM;
3418 }
3419
3420 return 0;
3421 }
3422
3423 /*
3424 * Note: this function assumes that dc_link_detect() was called for the
3425 * dc_link which will be represented by this aconnector.
3426 */
amdgpu_dm_connector_init(struct amdgpu_display_manager * dm,struct amdgpu_dm_connector * aconnector,u32 link_index,struct amdgpu_encoder * aencoder)3427 int amdgpu_dm_connector_init(struct amdgpu_display_manager *dm,
3428 struct amdgpu_dm_connector *aconnector,
3429 u32 link_index,
3430 struct amdgpu_encoder *aencoder)
3431 {
3432 int res = 0;
3433 int connector_type;
3434 struct dc *dc = dm->dc;
3435 struct dc_link *link = dc_get_link_at_index(dc, link_index);
3436 struct amdgpu_i2c_adapter *i2c;
3437
3438 /* Not needed for writeback connector */
3439 link->priv = aconnector;
3440
3441
3442 i2c = amdgpu_dm_create_i2c(link->ddc, false);
3443 if (!i2c) {
3444 drm_err(adev_to_drm(dm->adev), "Failed to create i2c adapter data\n");
3445 return -ENOMEM;
3446 }
3447
3448 aconnector->i2c = i2c;
3449 res = devm_i2c_add_adapter(dm->adev->dev, &i2c->base);
3450
3451 if (res) {
3452 drm_err(adev_to_drm(dm->adev), "Failed to register hw i2c %d\n", link->link_index);
3453 goto out_free;
3454 }
3455
3456 connector_type = to_drm_connector_type(link->connector_signal, link->link_id.id);
3457
3458 res = drm_connector_init_with_ddc(
3459 dm->ddev,
3460 &aconnector->base,
3461 &amdgpu_dm_connector_funcs,
3462 connector_type,
3463 &i2c->base);
3464
3465 if (res) {
3466 drm_err(adev_to_drm(dm->adev), "connector_init failed\n");
3467 aconnector->connector_id = -1;
3468 goto out_free;
3469 }
3470
3471 drm_connector_helper_add(
3472 &aconnector->base,
3473 &amdgpu_dm_connector_helper_funcs);
3474
3475 amdgpu_dm_connector_init_helper(
3476 dm,
3477 aconnector,
3478 connector_type,
3479 link,
3480 link_index);
3481
3482 drm_connector_attach_encoder(
3483 &aconnector->base, &aencoder->base);
3484
3485 if (connector_type == DRM_MODE_CONNECTOR_HDMIA ||
3486 connector_type == DRM_MODE_CONNECTOR_HDMIB)
3487 amdgpu_dm_initialize_hdmi_connector(aconnector);
3488
3489 if (dc_is_dp_signal(link->connector_signal))
3490 amdgpu_dm_initialize_dp_connector(dm, aconnector, link->link_index);
3491
3492 out_free:
3493 if (res) {
3494 kfree(i2c);
3495 aconnector->i2c = NULL;
3496 }
3497 return res;
3498 }
3499
dm_force_atomic_commit(struct drm_connector * connector)3500 static int dm_force_atomic_commit(struct drm_connector *connector)
3501 {
3502 int ret = 0;
3503 struct drm_device *ddev = connector->dev;
3504 struct drm_atomic_commit *state = drm_atomic_commit_alloc(ddev);
3505 struct amdgpu_crtc *disconnected_acrtc = to_amdgpu_crtc(connector->encoder->crtc);
3506 struct drm_plane *plane = disconnected_acrtc->base.primary;
3507 struct drm_connector_state *conn_state;
3508 struct drm_crtc_state *crtc_state;
3509 struct drm_plane_state *plane_state;
3510
3511 if (!state)
3512 return -ENOMEM;
3513
3514 state->acquire_ctx = ddev->mode_config.acquire_ctx;
3515
3516 /* Construct an atomic state to restore previous display setting */
3517
3518 /*
3519 * Attach connectors to drm_atomic_commit
3520 */
3521 conn_state = drm_atomic_get_connector_state(state, connector);
3522
3523 /* Check for error in getting connector state */
3524 if (IS_ERR(conn_state)) {
3525 ret = PTR_ERR(conn_state);
3526 goto out;
3527 }
3528
3529 /* Attach crtc to drm_atomic_commit*/
3530 crtc_state = drm_atomic_get_crtc_state(state, &disconnected_acrtc->base);
3531
3532 /* Check for error in getting crtc state */
3533 if (IS_ERR(crtc_state)) {
3534 ret = PTR_ERR(crtc_state);
3535 goto out;
3536 }
3537
3538 /* force a restore */
3539 crtc_state->mode_changed = true;
3540
3541 /* Attach plane to drm_atomic_commit */
3542 plane_state = drm_atomic_get_plane_state(state, plane);
3543
3544 /* Check for error in getting plane state */
3545 if (IS_ERR(plane_state)) {
3546 ret = PTR_ERR(plane_state);
3547 goto out;
3548 }
3549
3550 /* Call commit internally with the state we just constructed */
3551 ret = drm_atomic_commit(state);
3552
3553 out:
3554 drm_atomic_commit_put(state);
3555 if (ret)
3556 drm_err(ddev, "Restoring old state failed with %i\n", ret);
3557
3558 return ret;
3559 }
3560
3561 /*
3562 * This function handles all cases when set mode does not come upon hotplug.
3563 * This includes when a display is unplugged then plugged back into the
3564 * same port and when running without usermode desktop manager support
3565 */
dm_restore_drm_connector_state(struct drm_device * dev,struct drm_connector * connector)3566 void dm_restore_drm_connector_state(struct drm_device *dev,
3567 struct drm_connector *connector)
3568 {
3569 struct amdgpu_dm_connector *aconnector;
3570 struct amdgpu_crtc *disconnected_acrtc;
3571 struct dm_crtc_state *acrtc_state;
3572
3573 if (connector->connector_type == DRM_MODE_CONNECTOR_WRITEBACK)
3574 return;
3575
3576 aconnector = to_amdgpu_dm_connector(connector);
3577
3578 if (!aconnector->dc_sink || !connector->state || !connector->encoder)
3579 return;
3580
3581 disconnected_acrtc = to_amdgpu_crtc(connector->encoder->crtc);
3582 if (!disconnected_acrtc)
3583 return;
3584
3585 acrtc_state = to_dm_crtc_state(disconnected_acrtc->base.state);
3586 if (!acrtc_state->stream)
3587 return;
3588
3589 /*
3590 * If the previous sink is not released and different from the current,
3591 * we deduce we are in a state where we can not rely on usermode call
3592 * to turn on the display, so we do it here
3593 */
3594 if (acrtc_state->stream->sink != aconnector->dc_sink)
3595 dm_force_atomic_commit(&aconnector->base);
3596 }
3597
dm_edid_parser_send_cea(struct amdgpu_display_manager * dm,unsigned int offset,unsigned int total_length,u8 * data,unsigned int length,struct amdgpu_hdmi_vsdb_info * vsdb)3598 static bool dm_edid_parser_send_cea(struct amdgpu_display_manager *dm,
3599 unsigned int offset,
3600 unsigned int total_length,
3601 u8 *data,
3602 unsigned int length,
3603 struct amdgpu_hdmi_vsdb_info *vsdb)
3604 {
3605 bool res;
3606 union dmub_rb_cmd cmd;
3607 struct dmub_cmd_send_edid_cea *input;
3608 struct dmub_cmd_edid_cea_output *output;
3609
3610 if (length > DMUB_EDID_CEA_DATA_CHUNK_BYTES)
3611 return false;
3612
3613 memset(&cmd, 0, sizeof(cmd));
3614
3615 input = &cmd.edid_cea.data.input;
3616
3617 cmd.edid_cea.header.type = DMUB_CMD__EDID_CEA;
3618 cmd.edid_cea.header.sub_type = 0;
3619 cmd.edid_cea.header.payload_bytes =
3620 sizeof(cmd.edid_cea) - sizeof(cmd.edid_cea.header);
3621 input->offset = offset;
3622 input->length = length;
3623 input->cea_total_length = total_length;
3624 memcpy(input->payload, data, length);
3625
3626 res = dc_wake_and_execute_dmub_cmd(dm->dc->ctx, &cmd, DM_DMUB_WAIT_TYPE_WAIT_WITH_REPLY);
3627 if (!res) {
3628 drm_err(adev_to_drm(dm->adev), "EDID CEA parser failed\n");
3629 return false;
3630 }
3631
3632 output = &cmd.edid_cea.data.output;
3633
3634 if (output->type == DMUB_CMD__EDID_CEA_ACK) {
3635 if (!output->ack.success) {
3636 drm_err(adev_to_drm(dm->adev), "EDID CEA ack failed at offset %d\n",
3637 output->ack.offset);
3638 }
3639 } else if (output->type == DMUB_CMD__EDID_CEA_AMD_VSDB) {
3640 if (!output->amd_vsdb.vsdb_found)
3641 return false;
3642
3643 vsdb->freesync_supported = output->amd_vsdb.freesync_supported;
3644 vsdb->amd_vsdb_version = output->amd_vsdb.amd_vsdb_version;
3645 vsdb->min_refresh_rate_hz = output->amd_vsdb.min_frame_rate;
3646 vsdb->max_refresh_rate_hz = output->amd_vsdb.max_frame_rate;
3647 vsdb->freesync_mccs_vcp_code = output->amd_vsdb.freesync_mccs_vcp_code;
3648 } else {
3649 drm_warn(adev_to_drm(dm->adev), "Unknown EDID CEA parser results\n");
3650 return false;
3651 }
3652
3653 return true;
3654 }
3655
parse_edid_cea_dmcu(struct amdgpu_display_manager * dm,u8 * edid_ext,int len,struct amdgpu_hdmi_vsdb_info * vsdb_info)3656 static bool parse_edid_cea_dmcu(struct amdgpu_display_manager *dm,
3657 u8 *edid_ext, int len,
3658 struct amdgpu_hdmi_vsdb_info *vsdb_info)
3659 {
3660 int i;
3661
3662 /* send extension block to DMCU for parsing */
3663 for (i = 0; i < len; i += 8) {
3664 bool res;
3665 int offset;
3666
3667 /* send 8 bytes a time */
3668 if (!dc_edid_parser_send_cea(dm->dc, i, len, &edid_ext[i], 8))
3669 return false;
3670
3671 if (i+8 == len) {
3672 /* EDID block sent completed, expect result */
3673 int version, min_rate, max_rate;
3674
3675 res = dc_edid_parser_recv_amd_vsdb(dm->dc, &version, &min_rate, &max_rate);
3676 if (res) {
3677 /* amd vsdb found */
3678 vsdb_info->freesync_supported = 1;
3679 vsdb_info->amd_vsdb_version = version;
3680 vsdb_info->min_refresh_rate_hz = min_rate;
3681 vsdb_info->max_refresh_rate_hz = max_rate;
3682 /* Not enabled on DMCU*/
3683 vsdb_info->freesync_mccs_vcp_code = 0;
3684 return true;
3685 }
3686 /* not amd vsdb */
3687 return false;
3688 }
3689
3690 /* check for ack*/
3691 res = dc_edid_parser_recv_cea_ack(dm->dc, &offset);
3692 if (!res)
3693 return false;
3694 }
3695
3696 return false;
3697 }
3698
parse_edid_cea_dmub(struct amdgpu_display_manager * dm,u8 * edid_ext,int len,struct amdgpu_hdmi_vsdb_info * vsdb_info)3699 static bool parse_edid_cea_dmub(struct amdgpu_display_manager *dm,
3700 u8 *edid_ext, int len,
3701 struct amdgpu_hdmi_vsdb_info *vsdb_info)
3702 {
3703 int i;
3704
3705 /* send extension block to DMCU for parsing */
3706 for (i = 0; i < len; i += 8) {
3707 /* send 8 bytes a time */
3708 if (!dm_edid_parser_send_cea(dm, i, len, &edid_ext[i], 8, vsdb_info))
3709 return false;
3710 }
3711
3712 return vsdb_info->freesync_supported;
3713 }
3714
parse_edid_cea(struct amdgpu_dm_connector * aconnector,u8 * edid_ext,int len,struct amdgpu_hdmi_vsdb_info * vsdb_info)3715 static bool parse_edid_cea(struct amdgpu_dm_connector *aconnector,
3716 u8 *edid_ext, int len,
3717 struct amdgpu_hdmi_vsdb_info *vsdb_info)
3718 {
3719 struct amdgpu_device *adev = drm_to_adev(aconnector->base.dev);
3720 bool ret;
3721
3722 mutex_lock(&adev->dm.dc_lock);
3723 if (adev->dm.dmub_srv)
3724 ret = parse_edid_cea_dmub(&adev->dm, edid_ext, len, vsdb_info);
3725 else
3726 ret = parse_edid_cea_dmcu(&adev->dm, edid_ext, len, vsdb_info);
3727 mutex_unlock(&adev->dm.dc_lock);
3728 return ret;
3729 }
3730
parse_edid_displayid_vrr(struct drm_connector * connector,const struct edid * edid)3731 STATIC_IFN_KUNIT void parse_edid_displayid_vrr(struct drm_connector *connector,
3732 const struct edid *edid)
3733 {
3734 u8 *edid_ext = NULL;
3735 int i;
3736 int j = 0;
3737 u16 min_vfreq;
3738 u16 max_vfreq;
3739
3740 if (!edid || !edid->extensions)
3741 return;
3742
3743 /* Find DisplayID extension */
3744 for (i = 0; i < edid->extensions; i++) {
3745 edid_ext = (void *)(edid + (i + 1));
3746 if (edid_ext[0] == DISPLAYID_EXT)
3747 break;
3748 }
3749
3750 if (i == edid->extensions)
3751 return;
3752
3753 while (j < EDID_LENGTH) {
3754 /* Get dynamic video timing range from DisplayID if available */
3755 if (EDID_LENGTH - j > 13 && edid_ext[j] == 0x25 &&
3756 (edid_ext[j+1] & 0xFE) == 0 && (edid_ext[j+2] == 9)) {
3757 min_vfreq = edid_ext[j+9];
3758 if (edid_ext[j+1] & 7)
3759 max_vfreq = edid_ext[j+10] + ((edid_ext[j+11] & 3) << 8);
3760 else
3761 max_vfreq = edid_ext[j+10];
3762
3763 if (max_vfreq && min_vfreq) {
3764 connector->display_info.monitor_range.max_vfreq = max_vfreq;
3765 connector->display_info.monitor_range.min_vfreq = min_vfreq;
3766
3767 return;
3768 }
3769 }
3770 j++;
3771 }
3772 }
3773 EXPORT_IF_KUNIT(parse_edid_displayid_vrr);
3774
get_amd_vsdb(struct amdgpu_dm_connector * aconnector,struct amdgpu_hdmi_vsdb_info * vsdb_info)3775 STATIC_IFN_KUNIT int get_amd_vsdb(struct amdgpu_dm_connector *aconnector,
3776 struct amdgpu_hdmi_vsdb_info *vsdb_info)
3777 {
3778 struct drm_connector *connector = &aconnector->base;
3779
3780 vsdb_info->replay_mode = connector->display_info.amd_vsdb.replay_mode;
3781 vsdb_info->amd_vsdb_version = connector->display_info.amd_vsdb.version;
3782
3783 return connector->display_info.amd_vsdb.version != 0;
3784 }
3785 EXPORT_IF_KUNIT(get_amd_vsdb);
3786
parse_hdmi_amd_vsdb(struct amdgpu_dm_connector * aconnector,const struct edid * edid,struct amdgpu_hdmi_vsdb_info * vsdb_info)3787 STATIC_IFN_KUNIT int parse_hdmi_amd_vsdb(struct amdgpu_dm_connector *aconnector,
3788 const struct edid *edid,
3789 struct amdgpu_hdmi_vsdb_info *vsdb_info)
3790 {
3791 u8 *edid_ext = NULL;
3792 int i;
3793 bool valid_vsdb_found = false;
3794
3795 /*----- drm_find_cea_extension() -----*/
3796 /* No EDID or EDID extensions */
3797 if (edid == NULL || edid->extensions == 0)
3798 return -ENODEV;
3799
3800 /* Find CEA extension */
3801 for (i = 0; i < edid->extensions; i++) {
3802 edid_ext = (uint8_t *)edid + EDID_LENGTH * (i + 1);
3803 if (edid_ext[0] == CEA_EXT)
3804 break;
3805 }
3806
3807 if (i == edid->extensions)
3808 return -ENODEV;
3809
3810 /*----- cea_db_offsets() -----*/
3811 if (edid_ext[0] != CEA_EXT)
3812 return -ENODEV;
3813
3814 valid_vsdb_found = parse_edid_cea(aconnector, edid_ext, EDID_LENGTH, vsdb_info);
3815
3816 return valid_vsdb_found ? i : -ENODEV;
3817 }
3818 EXPORT_IF_KUNIT(parse_hdmi_amd_vsdb);
3819
3820 /**
3821 * amdgpu_dm_update_freesync_caps - Update Freesync capabilities
3822 *
3823 * @connector: Connector to query.
3824 * @drm_edid: DRM EDID from monitor
3825 * @do_mccs: Controls whether MCCS (Monitor Control Command Set) over
3826 * DDC (Display Data Channel) transactions are performed. When true,
3827 * the driver queries the monitor to get or update additional FreeSync
3828 * capability information. When false, these transactions are skipped.
3829 *
3830 * Amdgpu supports Freesync in DP and HDMI displays, and it is required to keep
3831 * track of some of the display information in the internal data struct used by
3832 * amdgpu_dm. This function checks which type of connector we need to set the
3833 * FreeSync parameters.
3834 */
amdgpu_dm_update_freesync_caps(struct drm_connector * connector,const struct drm_edid * drm_edid,bool do_mccs)3835 void amdgpu_dm_update_freesync_caps(struct drm_connector *connector,
3836 const struct drm_edid *drm_edid, bool do_mccs)
3837 {
3838 int i = 0;
3839 struct amdgpu_dm_connector *amdgpu_dm_connector =
3840 to_amdgpu_dm_connector(connector);
3841 struct dm_connector_state *dm_con_state = NULL;
3842 struct dc_sink *sink;
3843 struct amdgpu_device *adev = drm_to_adev(connector->dev);
3844 struct amdgpu_hdmi_vsdb_info vsdb_info = {0};
3845 const struct edid *edid;
3846 bool freesync_capable = false;
3847 enum adaptive_sync_type as_type = ADAPTIVE_SYNC_TYPE_NONE;
3848
3849 if (!connector->state) {
3850 drm_err(adev_to_drm(adev), "%s - Connector has no state", __func__);
3851 goto update;
3852 }
3853
3854 sink = amdgpu_dm_connector->dc_sink ?
3855 amdgpu_dm_connector->dc_sink :
3856 amdgpu_dm_connector->dc_em_sink;
3857
3858 drm_edid_connector_update(connector, drm_edid);
3859
3860 if (!drm_edid || !sink) {
3861 dm_con_state = to_dm_connector_state(connector->state);
3862
3863 amdgpu_dm_connector->min_vfreq = 0;
3864 amdgpu_dm_connector->max_vfreq = 0;
3865 freesync_capable = false;
3866
3867 goto update;
3868 }
3869
3870 dm_con_state = to_dm_connector_state(connector->state);
3871
3872 if (!adev->dm.freesync_module || !dc_supports_vrr(sink->ctx->dce_version))
3873 goto update;
3874
3875 /* FIXME: Get rid of drm_edid_raw() */
3876 edid = drm_edid_raw(drm_edid);
3877
3878 /* Some eDP panels only have the refresh rate range info in DisplayID */
3879 if ((connector->display_info.monitor_range.min_vfreq == 0 ||
3880 connector->display_info.monitor_range.max_vfreq == 0))
3881 parse_edid_displayid_vrr(connector, edid);
3882
3883 if (edid && (sink->sink_signal == SIGNAL_TYPE_DISPLAY_PORT ||
3884 sink->sink_signal == SIGNAL_TYPE_EDP)) {
3885 if (amdgpu_dm_connector->dc_link &&
3886 amdgpu_dm_connector->dc_link->dpcd_caps.allow_invalid_MSA_timing_param) {
3887 amdgpu_dm_connector->min_vfreq = connector->display_info.monitor_range.min_vfreq;
3888 amdgpu_dm_connector->max_vfreq = connector->display_info.monitor_range.max_vfreq;
3889 if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10)
3890 freesync_capable = true;
3891 }
3892
3893 get_amd_vsdb(amdgpu_dm_connector, &vsdb_info);
3894
3895 if (vsdb_info.replay_mode) {
3896 amdgpu_dm_connector->vsdb_info.replay_mode = vsdb_info.replay_mode;
3897 amdgpu_dm_connector->vsdb_info.amd_vsdb_version = vsdb_info.amd_vsdb_version;
3898 amdgpu_dm_connector->as_type = ADAPTIVE_SYNC_TYPE_EDP;
3899 }
3900
3901 } else if (drm_edid && sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A) {
3902 i = parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
3903 if (i >= 0) {
3904 amdgpu_dm_connector->vsdb_info = vsdb_info;
3905 sink->edid_caps.freesync_vcp_code = vsdb_info.freesync_mccs_vcp_code;
3906
3907 if (vsdb_info.freesync_supported) {
3908 amdgpu_dm_connector->min_vfreq = vsdb_info.min_refresh_rate_hz;
3909 amdgpu_dm_connector->max_vfreq = vsdb_info.max_refresh_rate_hz;
3910 if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10)
3911 freesync_capable = true;
3912
3913 connector->display_info.monitor_range.min_vfreq = vsdb_info.min_refresh_rate_hz;
3914 connector->display_info.monitor_range.max_vfreq = vsdb_info.max_refresh_rate_hz;
3915 }
3916 }
3917 }
3918
3919 if (amdgpu_dm_connector->dc_link)
3920 as_type = dm_get_adaptive_sync_support_type(amdgpu_dm_connector->dc_link);
3921
3922 if (as_type == FREESYNC_TYPE_PCON_IN_WHITELIST) {
3923 i = parse_hdmi_amd_vsdb(amdgpu_dm_connector, edid, &vsdb_info);
3924 if (i >= 0) {
3925 amdgpu_dm_connector->vsdb_info = vsdb_info;
3926 sink->edid_caps.freesync_vcp_code = vsdb_info.freesync_mccs_vcp_code;
3927
3928 if (vsdb_info.freesync_supported && vsdb_info.amd_vsdb_version > 0) {
3929 amdgpu_dm_connector->pack_sdp_v1_3 = true;
3930 amdgpu_dm_connector->as_type = as_type;
3931
3932 amdgpu_dm_connector->min_vfreq = vsdb_info.min_refresh_rate_hz;
3933 amdgpu_dm_connector->max_vfreq = vsdb_info.max_refresh_rate_hz;
3934 if (amdgpu_dm_connector->max_vfreq - amdgpu_dm_connector->min_vfreq > 10)
3935 freesync_capable = true;
3936
3937 connector->display_info.monitor_range.min_vfreq = vsdb_info.min_refresh_rate_hz;
3938 connector->display_info.monitor_range.max_vfreq = vsdb_info.max_refresh_rate_hz;
3939 }
3940 }
3941 }
3942
3943 /* Handle MCCS */
3944 if (do_mccs) {
3945 dm_helpers_read_mccs_caps(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink);
3946
3947 if (sink->edid_caps.freesync_vcp_code && !sink->mccs_caps.freesync_supported)
3948 freesync_capable = false;
3949
3950 if (sink->mccs_caps.freesync_supported && freesync_capable)
3951 dm_helpers_mccs_vcp_set(adev->dm.dc->ctx, amdgpu_dm_connector->dc_link, sink);
3952 }
3953
3954 update:
3955 if (dm_con_state)
3956 dm_con_state->freesync_capable = freesync_capable;
3957
3958 if (connector->state && amdgpu_dm_connector->dc_link && !freesync_capable &&
3959 amdgpu_dm_connector->dc_link->replay_settings.config.replay_supported) {
3960 amdgpu_dm_connector->dc_link->replay_settings.config.replay_supported = false;
3961 amdgpu_dm_connector->dc_link->replay_settings.replay_feature_enabled = false;
3962 }
3963
3964 if (connector->vrr_capable_property)
3965 drm_connector_set_vrr_capable_property(connector,
3966 freesync_capable);
3967 }
3968