diff options
Diffstat (limited to 'drivers/gpu')
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 | ||
| 1321 | static int amdgpu_dm_backlight_get_brightness(struct backlight_device *bd) | 1321 | static 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 | ||
| 1326 | static const struct backlight_ops amdgpu_dm_backlight_ops = { | 1331 | static 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) | |||
| 2109 | static enum dc_aspect_ratio | 2115 | static enum dc_aspect_ratio |
| 2110 | get_aspect_ratio(const struct drm_display_mode *mode_in) | 2116 | get_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 | ||
| 2121 | static enum dc_color_space | 2122 | static 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 | */ |
| 241 | int amdgpu_dm_set_degamma_lut(struct drm_crtc_state *crtc_state, | 241 | int 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 | ||
| 2032 | int 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 | ||
| 2016 | bool dc_link_set_backlight_level(const struct dc_link *link, uint32_t level, | 2042 | bool 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, <_settings); | 962 | dpcd_set_link_settings(link, <_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 | } |
| 343 | static 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 | ||
| 341 | static bool is_sharable_clk_src( | 358 | static 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 | ||
| 83 | struct dc_dcc_surface_param { | 85 | struct 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 | ||
| 429 | struct dc_csc_transform { | 431 | struct 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_ | |||
| 141 | bool dc_link_set_backlight_level(const struct dc_link *dc_link, uint32_t level, | 142 | bool 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 | ||
| 145 | int dc_link_get_backlight_level(const struct dc_link *dc_link); | ||
| 146 | |||
| 144 | bool dc_link_set_abm_disable(const struct dc_link *dc_link); | 147 | bool dc_link_set_abm_disable(const struct dc_link *dc_link); |
| 145 | 148 | ||
| 146 | bool dc_link_set_psr_enable(const struct dc_link *dc_link, bool enable, bool wait); | 149 | bool 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 | ||
| 1094 | static void reset_hw_ctx_wrap( | 1096 | static 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 | */ |
| 1002 | static void apply_lut_1d( | 1004 | static 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 | * |
