xref: /linux/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_connector.c (revision 546b928da0427b0d6c663cbb992bd7bfa9ac7971)
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