aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/gpu')
-rw-r--r--drivers/gpu/drm/amd/amdgpu/amdgpu_device.c2
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c17
-rw-r--r--drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c42
-rw-r--r--drivers/gpu/drm/amd/display/dc/bios/command_table.c18
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link.c78
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c5
-rw-r--r--drivers/gpu/drm/amd/display/dc/core/dc_resource.c22
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_hw_types.h2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dc_link.h3
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c8
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c5
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c2
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c4
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c3
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c1
-rw-r--r--drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c3
-rw-r--r--drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c9
-rw-r--r--drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h2
-rw-r--r--drivers/gpu/drm/amd/display/modules/color/color_gamma.c10
-rw-r--r--drivers/gpu/drm/scheduler/gpu_scheduler.c34
21 files changed, 194 insertions, 78 deletions
diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
index e839470880d7..1e66dfd0e39c 100644
--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
@@ -3108,7 +3108,7 @@ static int amdgpu_device_handle_vram_lost(struct amdgpu_device *adev)
3108 long tmo; 3108 long tmo;
3109 3109
3110 if (amdgpu_sriov_runtime(adev)) 3110 if (amdgpu_sriov_runtime(adev))
3111 tmo = msecs_to_jiffies(amdgpu_lockup_timeout); 3111 tmo = msecs_to_jiffies(8000);
3112 else 3112 else
3113 tmo = msecs_to_jiffies(100); 3113 tmo = msecs_to_jiffies(100);
3114 3114
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
index 45e062022461..34f34823bab5 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
@@ -1320,7 +1320,12 @@ static int amdgpu_dm_backlight_update_status(struct backlight_device *bd)
1320 1320
1321static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) 1321static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd)
1322{ 1322{
1323 return bd->props.brightness; 1323 struct amdgpu_display_manager *dm = bl_get_data(bd);
1324 int ret = dc_link_get_backlight_level(dm->backlight_link);
1325
1326 if (ret == DC_ERROR_UNEXPECTED)
1327 return bd->props.brightness;
1328 return ret;
1324} 1329}
1325 1330
1326static const struct backlight_ops amdgpu_dm_backlight_ops = { 1331static const struct backlight_ops amdgpu_dm_backlight_ops = {
@@ -1335,6 +1340,7 @@ amdgpu_dm_register_backlight_device(struct amdgpu_display_manager *dm)
1335 struct backlight_properties props = { 0 }; 1340 struct backlight_properties props = { 0 };
1336 1341
1337 props.max_brightness = AMDGPU_MAX_BL_LEVEL; 1342 props.max_brightness = AMDGPU_MAX_BL_LEVEL;
1343 props.brightness = AMDGPU_MAX_BL_LEVEL;
1338 props.type = BACKLIGHT_RAW; 1344 props.type = BACKLIGHT_RAW;
1339 1345
1340 snprintf(bl_name, sizeof(bl_name), "amdgpu_bl%d", 1346 snprintf(bl_name, sizeof(bl_name), "amdgpu_bl%d",
@@ -2109,13 +2115,8 @@ convert_color_depth_from_display_info(const struct drm_connector *connector)
2109static enum dc_aspect_ratio 2115static enum dc_aspect_ratio
2110get_aspect_ratio(const struct drm_display_mode *mode_in) 2116get_aspect_ratio(const struct drm_display_mode *mode_in)
2111{ 2117{
2112 int32_t width = mode_in->crtc_hdisplay * 9; 2118 /* 1-1 mapping, since both enums follow the HDMI spec. */
2113 int32_t height = mode_in->crtc_vdisplay * 16; 2119 return (enum dc_aspect_ratio) mode_in->picture_aspect_ratio;
2114
2115 if ((width - height) < 10 && (width - height) > -10)
2116 return ASPECT_RATIO_16_9;
2117 else
2118 return ASPECT_RATIO_4_3;
2119} 2120}
2120 2121
2121static enum dc_color_space 2122static enum dc_color_space
diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
index b329393307e5..326f6fb7e0bc 100644
--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
+++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm_color.c
@@ -231,18 +231,21 @@ void amdgpu_dm_set_ctm(struct dm_crtc_state *crtc)
231 * preparation for hardware commit. If no lut is specified by user, we default 231 * preparation for hardware commit. If no lut is specified by user, we default
232 * to SRGB degamma. 232 * to SRGB degamma.
233 * 233 *
234 * Currently, we only support degamma bypass, or preprogrammed SRGB degamma. 234 * We support degamma bypass, predefined SRGB, and custom degamma
235 * Programmable degamma is not supported, and an attempt to do so will return
236 * -EINVAL.
237 * 235 *
238 * RETURNS: 236 * RETURNS:
239 * 0 on success, -EINVAL if custom degamma curve is given. 237 * 0 on success
238 * -EINVAL if crtc_state has a degamma_lut of invalid size
239 * -ENOMEM if gamma allocation fails
240 */ 240 */
241int amdgpu_dm_set_degamma_lut(struct drm_crtc_state *crtc_state, 241int amdgpu_dm_set_degamma_lut(struct drm_crtc_state *crtc_state,
242 struct dc_plane_state *dc_plane_state) 242 struct dc_plane_state *dc_plane_state)
243{ 243{
244 struct drm_property_blob *blob = crtc_state->degamma_lut; 244 struct drm_property_blob *blob = crtc_state->degamma_lut;
245 struct drm_color_lut *lut; 245 struct drm_color_lut *lut;
246 uint32_t lut_size;
247 struct dc_gamma *gamma;
248 bool ret;
246 249
247 if (!blob) { 250 if (!blob) {
248 /* Default to SRGB */ 251 /* Default to SRGB */
@@ -258,11 +261,30 @@ int amdgpu_dm_set_degamma_lut(struct drm_crtc_state *crtc_state,
258 return 0; 261 return 0;
259 } 262 }
260 263
261 /* Otherwise, assume SRGB, since programmable degamma is not 264 gamma = dc_create_gamma();
262 * supported. 265 if (!gamma)
263 */ 266 return -ENOMEM;
264 dc_plane_state->in_transfer_func->type = TF_TYPE_PREDEFINED; 267
265 dc_plane_state->in_transfer_func->tf = TRANSFER_FUNCTION_SRGB; 268 lut_size = blob->length / sizeof(struct drm_color_lut);
266 return -EINVAL; 269 gamma->num_entries = lut_size;
270 if (gamma->num_entries == MAX_COLOR_LUT_ENTRIES)
271 gamma->type = GAMMA_CUSTOM;
272 else {
273 dc_gamma_release(&gamma);
274 return -EINVAL;
275 }
276
277 __drm_lut_to_dc_gamma(lut, gamma, false);
278
279 dc_plane_state->in_transfer_func->type = TF_TYPE_DISTRIBUTED_POINTS;
280 ret = mod_color_calculate_degamma_params(dc_plane_state->in_transfer_func, gamma, true);
281 dc_gamma_release(&gamma);
282 if (!ret) {
283 dc_plane_state->in_transfer_func->type = TF_TYPE_BYPASS;
284 DRM_ERROR("Out of memory when calculating degamma params\n");
285 return -ENOMEM;
286 }
287
288 return 0;
267} 289}
268 290
diff --git a/drivers/gpu/drm/amd/display/dc/bios/command_table.c b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
index 651e1fd4622f..a558bfaa0c46 100644
--- a/drivers/gpu/drm/amd/display/dc/bios/command_table.c
+++ b/drivers/gpu/drm/amd/display/dc/bios/command_table.c
@@ -808,6 +808,24 @@ static enum bp_result transmitter_control_v1_5(
808 * (=1: 8bpp, =1.25: 10bpp, =1.5:12bpp, =2: 16bpp) 808 * (=1: 8bpp, =1.25: 10bpp, =1.5:12bpp, =2: 16bpp)
809 * LVDS mode: usPixelClock = pixel clock 809 * LVDS mode: usPixelClock = pixel clock
810 */ 810 */
811 if (cntl->signal == SIGNAL_TYPE_HDMI_TYPE_A) {
812 switch (cntl->color_depth) {
813 case COLOR_DEPTH_101010:
814 params.usSymClock =
815 cpu_to_le16((le16_to_cpu(params.usSymClock) * 30) / 24);
816 break;
817 case COLOR_DEPTH_121212:
818 params.usSymClock =
819 cpu_to_le16((le16_to_cpu(params.usSymClock) * 36) / 24);
820 break;
821 case COLOR_DEPTH_161616:
822 params.usSymClock =
823 cpu_to_le16((le16_to_cpu(params.usSymClock) * 48) / 24);
824 break;
825 default:
826 break;
827 }
828 }
811 829
812 if (EXEC_BIOS_CMD_TABLE(UNIPHYTransmitterControl, params)) 830 if (EXEC_BIOS_CMD_TABLE(UNIPHYTransmitterControl, params))
813 result = BP_RESULT_OK; 831 result = BP_RESULT_OK;
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link.c b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
index 966d2f9c8c99..a38e7ad36a7e 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link.c
@@ -744,6 +744,18 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
744 break; 744 break;
745 case EDID_NO_RESPONSE: 745 case EDID_NO_RESPONSE:
746 DC_LOG_ERROR("No EDID read.\n"); 746 DC_LOG_ERROR("No EDID read.\n");
747
748 /*
749 * Abort detection for non-DP connectors if we have
750 * no EDID
751 *
752 * DP needs to report as connected if HDP is high
753 * even if we have no EDID in order to go to
754 * fail-safe mode
755 */
756 if (dc_is_hdmi_signal(link->connector_signal) ||
757 dc_is_dvi_signal(link->connector_signal))
758 return false;
747 default: 759 default:
748 break; 760 break;
749 } 761 }
@@ -752,39 +764,41 @@ bool dc_link_detect(struct dc_link *link, enum dc_detect_reason reason)
752 if ((prev_sink != NULL) && ((edid_status == EDID_THE_SAME) || (edid_status == EDID_OK))) 764 if ((prev_sink != NULL) && ((edid_status == EDID_THE_SAME) || (edid_status == EDID_OK)))
753 same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid); 765 same_edid = is_same_edid(&prev_sink->dc_edid, &sink->dc_edid);
754 766
755 // If both edid and dpcd are the same, then discard new sink and revert back to original sink 767 if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT &&
756 if ((same_edid) && (same_dpcd)) { 768 sink_caps.transaction_type == DDC_TRANSACTION_TYPE_I2C_OVER_AUX &&
757 link_disconnect_remap(prev_sink, link); 769 reason != DETECT_REASON_HPDRX) {
758 sink = prev_sink; 770 /*
759 prev_sink = NULL; 771 * TODO debug why Dell 2413 doesn't like
760 } else { 772 * two link trainings
761 if (link->connector_signal == SIGNAL_TYPE_DISPLAY_PORT && 773 */
762 sink_caps.transaction_type ==
763 DDC_TRANSACTION_TYPE_I2C_OVER_AUX) {
764 /*
765 * TODO debug why Dell 2413 doesn't like
766 * two link trainings
767 */
768 774
769 /* deal with non-mst cases */ 775 /* deal with non-mst cases */
770 for (i = 0; i < LINK_TRAINING_MAX_VERIFY_RETRY; i++) { 776 for (i = 0; i < LINK_TRAINING_MAX_VERIFY_RETRY; i++) {
771 int fail_count = 0; 777 int fail_count = 0;
772 778
773 dp_verify_link_cap(link, 779 dp_verify_link_cap(link,
774 &link->reported_link_cap, 780 &link->reported_link_cap,
775 &fail_count); 781 &fail_count);
776 782
777 if (fail_count == 0) 783 if (fail_count == 0)
778 break; 784 break;
779 }
780 } 785 }
781 786
782 /* HDMI-DVI Dongle */ 787 } else {
783 if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A && 788 // If edid is the same, then discard new sink and revert back to original sink
784 !sink->edid_caps.edid_hdmi) 789 if (same_edid) {
785 sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK; 790 link_disconnect_remap(prev_sink, link);
791 sink = prev_sink;
792 prev_sink = NULL;
793
794 }
786 } 795 }
787 796
797 /* HDMI-DVI Dongle */
798 if (sink->sink_signal == SIGNAL_TYPE_HDMI_TYPE_A &&
799 !sink->edid_caps.edid_hdmi)
800 sink->sink_signal = SIGNAL_TYPE_DVI_SINGLE_LINK;
801
788 /* Connectivity log: detection */ 802 /* Connectivity log: detection */
789 for (i = 0; i < sink->dc_edid.length / EDID_BLOCK_SIZE; i++) { 803 for (i = 0; i < sink->dc_edid.length / EDID_BLOCK_SIZE; i++) {
790 CONN_DATA_DETECT(link, 804 CONN_DATA_DETECT(link,
@@ -1025,6 +1039,9 @@ static bool construct(
1025 1039
1026 link->link_id = bios->funcs->get_connector_id(bios, init_params->connector_index); 1040 link->link_id = bios->funcs->get_connector_id(bios, init_params->connector_index);
1027 1041
1042 if (dc_ctx->dc_bios->integrated_info)
1043 link->dp_ss_off = !!dc_ctx->dc_bios->integrated_info->dp_ss_control;
1044
1028 if (link->link_id.type != OBJECT_TYPE_CONNECTOR) { 1045 if (link->link_id.type != OBJECT_TYPE_CONNECTOR) {
1029 dm_error("%s: Invalid Connector ObjectID from Adapter Service for connector index:%d! type %d expected %d\n", 1046 dm_error("%s: Invalid Connector ObjectID from Adapter Service for connector index:%d! type %d expected %d\n",
1030 __func__, init_params->connector_index, 1047 __func__, init_params->connector_index,
@@ -2012,6 +2029,15 @@ enum dc_status dc_link_validate_mode_timing(
2012 return DC_OK; 2029 return DC_OK;
2013} 2030}
2014 2031
2032int dc_link_get_backlight_level(const struct dc_link *link)
2033{
2034 struct abm *abm = link->ctx->dc->res_pool->abm;
2035
2036 if (abm == NULL || abm->funcs->get_current_backlight_8_bit == NULL)
2037 return DC_ERROR_UNEXPECTED;
2038
2039 return (int) abm->funcs->get_current_backlight_8_bit(abm);
2040}
2015 2041
2016bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, 2042bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level,
2017 uint32_t frame_ramp, const struct dc_stream_state *stream) 2043 uint32_t frame_ramp, const struct dc_stream_state *stream)
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
index 160841da72a7..a7553b6d59c2 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_link_dp.c
@@ -953,7 +953,10 @@ enum link_training_result dc_link_dp_perform_link_training(
953 * LINK_SPREAD_05_DOWNSPREAD_30KHZ : 953 * LINK_SPREAD_05_DOWNSPREAD_30KHZ :
954 * LINK_SPREAD_DISABLED; 954 * LINK_SPREAD_DISABLED;
955 */ 955 */
956 lt_settings.link_settings.link_spread = LINK_SPREAD_05_DOWNSPREAD_30KHZ; 956 if (link->dp_ss_off)
957 lt_settings.link_settings.link_spread = LINK_SPREAD_DISABLED;
958 else
959 lt_settings.link_settings.link_spread = LINK_SPREAD_05_DOWNSPREAD_30KHZ;
957 960
958 /* 1. set link rate, lane count and spread*/ 961 /* 1. set link rate, lane count and spread*/
959 dpcd_set_link_settings(link, &lt_settings); 962 dpcd_set_link_settings(link, &lt_settings);
diff --git a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
index 2e65715f76a1..4ca41d6e3bcf 100644
--- a/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/core/dc_resource.c
@@ -330,6 +330,9 @@ bool resource_are_streams_timing_synchronizable(
330 != stream2->timing.pix_clk_khz) 330 != stream2->timing.pix_clk_khz)
331 return false; 331 return false;
332 332
333 if (stream1->clamping.c_depth != stream2->clamping.c_depth)
334 return false;
335
333 if (stream1->phy_pix_clk != stream2->phy_pix_clk 336 if (stream1->phy_pix_clk != stream2->phy_pix_clk
334 && (!dc_is_dp_signal(stream1->signal) 337 && (!dc_is_dp_signal(stream1->signal)
335 || !dc_is_dp_signal(stream2->signal))) 338 || !dc_is_dp_signal(stream2->signal)))
@@ -337,6 +340,20 @@ bool resource_are_streams_timing_synchronizable(
337 340
338 return true; 341 return true;
339} 342}
343static bool is_dp_and_hdmi_sharable(
344 struct dc_stream_state *stream1,
345 struct dc_stream_state *stream2)
346{
347 if (stream1->ctx->dc->caps.disable_dp_clk_share)
348 return false;
349
350 if (stream1->clamping.c_depth != COLOR_DEPTH_888 ||
351 stream2->clamping.c_depth != COLOR_DEPTH_888)
352 return false;
353
354 return true;
355
356}
340 357
341static bool is_sharable_clk_src( 358static bool is_sharable_clk_src(
342 const struct pipe_ctx *pipe_with_clk_src, 359 const struct pipe_ctx *pipe_with_clk_src,
@@ -348,7 +365,10 @@ static bool is_sharable_clk_src(
348 if (pipe_with_clk_src->stream->signal == SIGNAL_TYPE_VIRTUAL) 365 if (pipe_with_clk_src->stream->signal == SIGNAL_TYPE_VIRTUAL)
349 return false; 366 return false;
350 367
351 if (dc_is_dp_signal(pipe_with_clk_src->stream->signal)) 368 if (dc_is_dp_signal(pipe_with_clk_src->stream->signal) ||
369 (dc_is_dp_signal(pipe->stream->signal) &&
370 !is_dp_and_hdmi_sharable(pipe_with_clk_src->stream,
371 pipe->stream)))
352 return false; 372 return false;
353 373
354 if (dc_is_hdmi_signal(pipe_with_clk_src->stream->signal) 374 if (dc_is_hdmi_signal(pipe_with_clk_src->stream->signal)
diff --git a/drivers/gpu/drm/amd/display/dc/dc.h b/drivers/gpu/drm/amd/display/dc/dc.h
index 55bcc3bdc6a3..e2f033d420a0 100644
--- a/drivers/gpu/drm/amd/display/dc/dc.h
+++ b/drivers/gpu/drm/amd/display/dc/dc.h
@@ -78,6 +78,8 @@ struct dc_caps {
78 bool dual_link_dvi; 78 bool dual_link_dvi;
79 bool post_blend_color_processing; 79 bool post_blend_color_processing;
80 bool force_dp_tps4_for_cp2520; 80 bool force_dp_tps4_for_cp2520;
81 bool disable_dp_clk_share;
82 bool psp_setup_panel_mode;
81}; 83};
82 84
83struct dc_dcc_surface_param { 85struct dc_dcc_surface_param {
diff --git a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
index 1d1f2d5ece51..b789cb2b354b 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_hw_types.h
@@ -417,6 +417,7 @@ enum {
417 GAMMA_RGB_256_ENTRIES = 256, 417 GAMMA_RGB_256_ENTRIES = 256,
418 GAMMA_RGB_FLOAT_1024_ENTRIES = 1024, 418 GAMMA_RGB_FLOAT_1024_ENTRIES = 1024,
419 GAMMA_CS_TFM_1D_ENTRIES = 4096, 419 GAMMA_CS_TFM_1D_ENTRIES = 4096,
420 GAMMA_CUSTOM_ENTRIES = 4096,
420 GAMMA_MAX_ENTRIES = 4096 421 GAMMA_MAX_ENTRIES = 4096
421}; 422};
422 423
@@ -424,6 +425,7 @@ enum dc_gamma_type {
424 GAMMA_RGB_256 = 1, 425 GAMMA_RGB_256 = 1,
425 GAMMA_RGB_FLOAT_1024 = 2, 426 GAMMA_RGB_FLOAT_1024 = 2,
426 GAMMA_CS_TFM_1D = 3, 427 GAMMA_CS_TFM_1D = 3,
428 GAMMA_CUSTOM = 4,
427}; 429};
428 430
429struct dc_csc_transform { 431struct dc_csc_transform {
diff --git a/drivers/gpu/drm/amd/display/dc/dc_link.h b/drivers/gpu/drm/amd/display/dc/dc_link.h
index 070a56926308..d43cefbc43d3 100644
--- a/drivers/gpu/drm/amd/display/dc/dc_link.h
+++ b/drivers/gpu/drm/amd/display/dc/dc_link.h
@@ -73,6 +73,7 @@ struct dc_link {
73 enum dc_irq_source irq_source_hpd; 73 enum dc_irq_source irq_source_hpd;
74 enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse */ 74 enum dc_irq_source irq_source_hpd_rx;/* aka DP Short Pulse */
75 bool is_hpd_filter_disabled; 75 bool is_hpd_filter_disabled;
76 bool dp_ss_off;
76 77
77 /* caps is the same as reported_link_cap. link_traing use 78 /* caps is the same as reported_link_cap. link_traing use
78 * reported_link_cap. Will clean up. TODO 79 * reported_link_cap. Will clean up. TODO
@@ -141,6 +142,8 @@ static inline struct dc_link *dc_get_link_at_index(struct dc *dc, uint32_t link_
141bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, 142bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level,
142 uint32_t frame_ramp, const struct dc_stream_state *stream); 143 uint32_t frame_ramp, const struct dc_stream_state *stream);
143 144
145int dc_link_get_backlight_level(const struct dc_link *dc_link);
146
144bool dc_link_set_abm_disable(const struct dc_link *dc_link); 147bool dc_link_set_abm_disable(const struct dc_link *dc_link);
145 148
146bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait); 149bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait);
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
index 0db8d1da3d0e..684da3db7568 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_clocks.c
@@ -463,7 +463,7 @@ static void dce12_update_clocks(struct dccg *dccg,
463 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 463 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) {
464 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAY_CLK; 464 clock_voltage_req.clk_type = DM_PP_CLOCK_TYPE_DISPLAY_CLK;
465 clock_voltage_req.clocks_in_khz = new_clocks->dispclk_khz; 465 clock_voltage_req.clocks_in_khz = new_clocks->dispclk_khz;
466 dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz); 466 new_clocks->dispclk_khz = dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
467 dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 467 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
468 468
469 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req); 469 dm_pp_apply_clock_for_voltage_request(dccg->ctx, &clock_voltage_req);
@@ -625,7 +625,9 @@ static void dcn1_update_clocks(struct dccg *dccg,
625 } 625 }
626 626
627 /* dcn1 dppclk is tied to dispclk */ 627 /* dcn1 dppclk is tied to dispclk */
628 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 628 /* program dispclk on = as a w/a for sleep resume clock ramping issues */
629 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)
630 || new_clocks->dispclk_khz == dccg->clks.dispclk_khz) {
629 dcn1_ramp_up_dispclk_with_dpp(dccg, new_clocks); 631 dcn1_ramp_up_dispclk_with_dpp(dccg, new_clocks);
630 dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 632 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
631 633
@@ -661,7 +663,7 @@ static void dce_update_clocks(struct dccg *dccg,
661 } 663 }
662 664
663 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) { 665 if (should_set_clock(safe_to_lower, new_clocks->dispclk_khz, dccg->clks.dispclk_khz)) {
664 dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz); 666 new_clocks->dispclk_khz = dccg->funcs->set_dispclk(dccg, new_clocks->dispclk_khz);
665 dccg->clks.dispclk_khz = new_clocks->dispclk_khz; 667 dccg->clks.dispclk_khz = new_clocks->dispclk_khz;
666 } 668 }
667} 669}
diff --git a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
index 60e3c6a73d37..752b3d62e793 100644
--- a/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
+++ b/drivers/gpu/drm/amd/display/dc/dce/dce_link_encoder.c
@@ -256,6 +256,11 @@ static void setup_panel_mode(
256 enum dp_panel_mode panel_mode) 256 enum dp_panel_mode panel_mode)
257{ 257{
258 uint32_t value; 258 uint32_t value;
259 struct dc_context *ctx = enc110->base.ctx;
260
261 /* if psp set panel mode, dal should be program it */
262 if (ctx->dc->caps.psp_setup_panel_mode)
263 return;
259 264
260 ASSERT(REG(DP_DPHY_INTERNAL_CTRL)); 265 ASSERT(REG(DP_DPHY_INTERNAL_CTRL));
261 value = REG_READ(DP_DPHY_INTERNAL_CTRL); 266 value = REG_READ(DP_DPHY_INTERNAL_CTRL);
diff --git a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
index fd2bdae4dcec..3f76e6019546 100644
--- a/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce100/dce100_resource.c
@@ -919,7 +919,7 @@ static bool construct(
919 dc->caps.i2c_speed_in_khz = 40; 919 dc->caps.i2c_speed_in_khz = 40;
920 dc->caps.max_cursor_size = 128; 920 dc->caps.max_cursor_size = 128;
921 dc->caps.dual_link_dvi = true; 921 dc->caps.dual_link_dvi = true;
922 922 dc->caps.disable_dp_clk_share = true;
923 for (i = 0; i < pool->base.pipe_count; i++) { 923 for (i = 0; i < pool->base.pipe_count; i++) {
924 pool->base.timing_generators[i] = 924 pool->base.timing_generators[i] =
925 dce100_timing_generator_create( 925 dce100_timing_generator_create(
diff --git a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
index 1149c413f6d2..1d98e3678b04 100644
--- a/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dce110/dce110_hw_sequencer.c
@@ -2530,7 +2530,7 @@ static void pplib_apply_display_requirements(
2530 /* TODO: dce11.2*/ 2530 /* TODO: dce11.2*/
2531 pp_display_cfg->avail_mclk_switch_time_in_disp_active_us = 0; 2531 pp_display_cfg->avail_mclk_switch_time_in_disp_active_us = 0;
2532 2532
2533 pp_display_cfg->disp_clk_khz = context->bw.dce.dispclk_khz; 2533 pp_display_cfg->disp_clk_khz = dc->res_pool->dccg->clks.dispclk_khz;
2534 2534
2535 dce110_fill_display_configs(context, pp_display_cfg); 2535 dce110_fill_display_configs(context, pp_display_cfg);
2536 2536
@@ -2559,7 +2559,7 @@ void dce110_set_bandwidth(
2559{ 2559{
2560 struct dc_clocks req_clks; 2560 struct dc_clocks req_clks;
2561 2561
2562 req_clks.dispclk_khz = context->bw.dce.dispclk_khz * 115 / 100; 2562 req_clks.dispclk_khz = context->bw.dce.dispclk_khz;
2563 req_clks.phyclk_khz = get_max_pixel_clock_for_all_paths(dc, context); 2563 req_clks.phyclk_khz = get_max_pixel_clock_for_all_paths(dc, context);
2564 2564
2565 if (decrease_allowed) 2565 if (decrease_allowed)
diff --git a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
index 84a05ff2d674..288129343c77 100644
--- a/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce112/dce112_resource.c
@@ -677,9 +677,6 @@ static void destruct(struct dce110_resource_pool *pool)
677 pool->base.timing_generators[i] = NULL; 677 pool->base.timing_generators[i] = NULL;
678 } 678 }
679 679
680 if (pool->base.engines[i] != NULL)
681 dce110_engine_destroy(&pool->base.engines[i]);
682
683 } 680 }
684 681
685 for (i = 0; i < pool->base.stream_enc_count; i++) { 682 for (i = 0; i < pool->base.stream_enc_count; i++) {
diff --git a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
index 61d8e22d23c9..d43f37d99c7d 100644
--- a/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce120/dce120_resource.c
@@ -883,6 +883,7 @@ static bool construct(
883 dc->caps.i2c_speed_in_khz = 100; 883 dc->caps.i2c_speed_in_khz = 100;
884 dc->caps.max_cursor_size = 128; 884 dc->caps.max_cursor_size = 128;
885 dc->caps.dual_link_dvi = true; 885 dc->caps.dual_link_dvi = true;
886 dc->caps.psp_setup_panel_mode = true;
886 887
887 dc->debug = debug_defaults; 888 dc->debug = debug_defaults;
888 889
diff --git a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
index dc9f3e9afc33..604c62969ead 100644
--- a/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
+++ b/drivers/gpu/drm/amd/display/dc/dce80/dce80_resource.c
@@ -946,6 +946,7 @@ static bool dce80_construct(
946 } 946 }
947 947
948 dc->caps.max_planes = pool->base.pipe_count; 948 dc->caps.max_planes = pool->base.pipe_count;
949 dc->caps.disable_dp_clk_share = true;
949 950
950 if (!resource_construct(num_virtual_links, dc, &pool->base, 951 if (!resource_construct(num_virtual_links, dc, &pool->base,
951 &res_create_funcs)) 952 &res_create_funcs))
@@ -1131,6 +1132,7 @@ static bool dce81_construct(
1131 } 1132 }
1132 1133
1133 dc->caps.max_planes = pool->base.pipe_count; 1134 dc->caps.max_planes = pool->base.pipe_count;
1135 dc->caps.disable_dp_clk_share = true;
1134 1136
1135 if (!resource_construct(num_virtual_links, dc, &pool->base, 1137 if (!resource_construct(num_virtual_links, dc, &pool->base,
1136 &res_create_funcs)) 1138 &res_create_funcs))
@@ -1312,6 +1314,7 @@ static bool dce83_construct(
1312 } 1314 }
1313 1315
1314 dc->caps.max_planes = pool->base.pipe_count; 1316 dc->caps.max_planes = pool->base.pipe_count;
1317 dc->caps.disable_dp_clk_share = true;
1315 1318
1316 if (!resource_construct(num_virtual_links, dc, &pool->base, 1319 if (!resource_construct(num_virtual_links, dc, &pool->base,
1317 &res_create_funcs)) 1320 &res_create_funcs))
diff --git a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
index c87f6e603055..cfcc54f2ce65 100644
--- a/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
+++ b/drivers/gpu/drm/amd/display/dc/dcn10/dcn10_hw_sequencer.c
@@ -1089,6 +1089,8 @@ static void dcn10_init_hw(struct dc *dc)
1089 } 1089 }
1090 1090
1091 enable_power_gating_plane(dc->hwseq, true); 1091 enable_power_gating_plane(dc->hwseq, true);
1092
1093 memset(&dc->res_pool->dccg->clks, 0, sizeof(dc->res_pool->dccg->clks));
1092} 1094}
1093 1095
1094static void reset_hw_ctx_wrap( 1096static void reset_hw_ctx_wrap(
@@ -1213,8 +1215,11 @@ static bool dcn10_set_input_transfer_func(struct pipe_ctx *pipe_ctx,
1213 } else if (tf->type == TF_TYPE_BYPASS) { 1215 } else if (tf->type == TF_TYPE_BYPASS) {
1214 dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_BYPASS); 1216 dpp_base->funcs->dpp_set_degamma(dpp_base, IPP_DEGAMMA_MODE_BYPASS);
1215 } else { 1217 } else {
1216 /*TF_TYPE_DISTRIBUTED_POINTS*/ 1218 cm_helper_translate_curve_to_degamma_hw_format(tf,
1217 result = false; 1219 &dpp_base->degamma_params);
1220 dpp_base->funcs->dpp_program_degamma_pwl(dpp_base,
1221 &dpp_base->degamma_params);
1222 result = true;
1218 } 1223 }
1219 1224
1220 return result; 1225 return result;
diff --git a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h
index 36bbad594267..f312834fef50 100644
--- a/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h
+++ b/drivers/gpu/drm/amd/display/include/grph_object_ctrl_defs.h
@@ -395,6 +395,8 @@ struct integrated_info {
395 struct i2c_reg_info dp3_ext_hdmi_reg_settings[9]; 395 struct i2c_reg_info dp3_ext_hdmi_reg_settings[9];
396 unsigned char dp3_ext_hdmi_6g_reg_num; 396 unsigned char dp3_ext_hdmi_6g_reg_num;
397 struct i2c_reg_info dp3_ext_hdmi_6g_reg_settings[3]; 397 struct i2c_reg_info dp3_ext_hdmi_6g_reg_settings[3];
398 /* V11 */
399 uint32_t dp_ss_control;
398}; 400};
399 401
400/** 402/**
diff --git a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
index ee69c949bfbf..bf29733958c3 100644
--- a/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
+++ b/drivers/gpu/drm/amd/display/modules/color/color_gamma.c
@@ -997,7 +997,9 @@ static void scale_user_regamma_ramp(struct pwl_float_data *pwl_rgb,
997 * norm_y = 4095*regamma_y, and index is just truncating to nearest integer 997 * norm_y = 4095*regamma_y, and index is just truncating to nearest integer
998 * lut1 = lut1D[index], lut2 = lut1D[index+1] 998 * lut1 = lut1D[index], lut2 = lut1D[index+1]
999 * 999 *
1000 *adjustedY is then linearly interpolating regamma Y between lut1 and lut2 1000 * adjustedY is then linearly interpolating regamma Y between lut1 and lut2
1001 *
1002 * Custom degamma on Linux uses the same interpolation math, so is handled here
1001 */ 1003 */
1002static void apply_lut_1d( 1004static void apply_lut_1d(
1003 const struct dc_gamma *ramp, 1005 const struct dc_gamma *ramp,
@@ -1018,7 +1020,7 @@ static void apply_lut_1d(
1018 struct fixed31_32 delta_lut; 1020 struct fixed31_32 delta_lut;
1019 struct fixed31_32 delta_index; 1021 struct fixed31_32 delta_index;
1020 1022
1021 if (ramp->type != GAMMA_CS_TFM_1D) 1023 if (ramp->type != GAMMA_CS_TFM_1D && ramp->type != GAMMA_CUSTOM)
1022 return; // this is not expected 1024 return; // this is not expected
1023 1025
1024 for (i = 0; i < num_hw_points; i++) { 1026 for (i = 0; i < num_hw_points; i++) {
@@ -1636,7 +1638,9 @@ bool mod_color_calculate_degamma_params(struct dc_transfer_func *input_tf,
1636 map_regamma_hw_to_x_user(ramp, coeff, rgb_user, 1638 map_regamma_hw_to_x_user(ramp, coeff, rgb_user,
1637 coordinates_x, axix_x, curve, 1639 coordinates_x, axix_x, curve,
1638 MAX_HW_POINTS, tf_pts, 1640 MAX_HW_POINTS, tf_pts,
1639 mapUserRamp); 1641 mapUserRamp && ramp->type != GAMMA_CUSTOM);
1642 if (ramp->type == GAMMA_CUSTOM)
1643 apply_lut_1d(ramp, MAX_HW_POINTS, tf_pts);
1640 1644
1641 ret = true; 1645 ret = true;
1642 1646
diff --git a/drivers/gpu/drm/scheduler/gpu_scheduler.c b/drivers/gpu/drm/scheduler/gpu_scheduler.c
index 1b733229201e..4fc211e19d6e 100644
--- a/drivers/gpu/drm/scheduler/gpu_scheduler.c
+++ b/drivers/gpu/drm/scheduler/gpu_scheduler.c
@@ -249,7 +249,6 @@ static void drm_sched_entity_kill_jobs_cb(struct dma_fence *f,
249/** 249/**
250 * drm_sched_entity_flush - Flush a context entity 250 * drm_sched_entity_flush - Flush a context entity
251 * 251 *
252 * @sched: scheduler instance
253 * @entity: scheduler entity 252 * @entity: scheduler entity
254 * @timeout: time to wait in for Q to become empty in jiffies. 253 * @timeout: time to wait in for Q to become empty in jiffies.
255 * 254 *
@@ -292,7 +291,6 @@ EXPORT_SYMBOL(drm_sched_entity_flush);
292/** 291/**
293 * drm_sched_entity_cleanup - Destroy a context entity 292 * drm_sched_entity_cleanup - Destroy a context entity
294 * 293 *
295 * @sched: scheduler instance
296 * @entity: scheduler entity 294 * @entity: scheduler entity
297 * 295 *
298 * This should be called after @drm_sched_entity_do_release. It goes over the 296 * This should be called after @drm_sched_entity_do_release. It goes over the
@@ -356,7 +354,6 @@ EXPORT_SYMBOL(drm_sched_entity_fini);
356/** 354/**
357 * drm_sched_entity_fini - Destroy a context entity 355 * drm_sched_entity_fini - Destroy a context entity
358 * 356 *
359 * @sched: scheduler instance
360 * @entity: scheduler entity 357 * @entity: scheduler entity
361 * 358 *
362 * Calls drm_sched_entity_do_release() and drm_sched_entity_cleanup() 359 * Calls drm_sched_entity_do_release() and drm_sched_entity_cleanup()
@@ -552,24 +549,28 @@ static void drm_sched_job_finish(struct work_struct *work)
552 finish_work); 549 finish_work);
553 struct drm_gpu_scheduler *sched = s_job->sched; 550 struct drm_gpu_scheduler *sched = s_job->sched;
554 551
555 /* remove job from ring_mirror_list */ 552 /*
556 spin_lock(&sched->job_list_lock); 553 * Canceling the timeout without removing our job from the ring mirror
557 list_del_init(&s_job->node); 554 * list is safe, as we will only end up in this worker if our jobs
558 if (sched->timeout != MAX_SCHEDULE_TIMEOUT) { 555 * finished fence has been signaled. So even if some another worker
559 struct drm_sched_job *next; 556 * manages to find this job as the next job in the list, the fence
560 557 * signaled check below will prevent the timeout to be restarted.
561 spin_unlock(&sched->job_list_lock); 558 */
562 cancel_delayed_work_sync(&s_job->work_tdr); 559 cancel_delayed_work_sync(&s_job->work_tdr);
563 spin_lock(&sched->job_list_lock);
564 560
565 /* queue TDR for next job */ 561 spin_lock(&sched->job_list_lock);
566 next = list_first_entry_or_null(&sched->ring_mirror_list, 562 /* queue TDR for next job */
567 struct drm_sched_job, node); 563 if (sched->timeout != MAX_SCHEDULE_TIMEOUT &&
564 !list_is_last(&s_job->node, &sched->ring_mirror_list)) {
565 struct drm_sched_job *next = list_next_entry(s_job, node);
568 566
569 if (next) 567 if (!dma_fence_is_signaled(&next->s_fence->finished))
570 schedule_delayed_work(&next->work_tdr, sched->timeout); 568 schedule_delayed_work(&next->work_tdr, sched->timeout);
571 } 569 }
570 /* remove job from ring_mirror_list */
571 list_del(&s_job->node);
572 spin_unlock(&sched->job_list_lock); 572 spin_unlock(&sched->job_list_lock);
573
573 dma_fence_put(&s_job->s_fence->finished); 574 dma_fence_put(&s_job->s_fence->finished);
574 sched->ops->free_job(s_job); 575 sched->ops->free_job(s_job);
575} 576}
@@ -715,7 +716,6 @@ EXPORT_SYMBOL(drm_sched_job_recovery);
715 * drm_sched_job_init - init a scheduler job 716 * drm_sched_job_init - init a scheduler job
716 * 717 *
717 * @job: scheduler job to init 718 * @job: scheduler job to init
718 * @sched: scheduler instance
719 * @entity: scheduler entity to use 719 * @entity: scheduler entity to use
720 * @owner: job owner for debugging 720 * @owner: job owner for debugging
721 * 721 *