diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0560-drm-amd-dal-use-new-state-in-atomic_check.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0560-drm-amd-dal-use-new-state-in-atomic_check.patch | 168 |
1 files changed, 168 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0560-drm-amd-dal-use-new-state-in-atomic_check.patch b/common/recipes-kernel/linux/files/0560-drm-amd-dal-use-new-state-in-atomic_check.patch new file mode 100644 index 00000000..5b9f7dcc --- /dev/null +++ b/common/recipes-kernel/linux/files/0560-drm-amd-dal-use-new-state-in-atomic_check.patch @@ -0,0 +1,168 @@ +From 02aa957e7c799e8d69b44a85e5fa50d2d73580cf Mon Sep 17 00:00:00 2001 +From: Mykola Lysenko <Mykola.Lysenko@amd.com> +Date: Wed, 2 Dec 2015 19:18:59 +0800 +Subject: [PATCH 0560/1110] drm/amd/dal: use new state in atomic_check + +Pass new state to fill_plane_attributes functions, so fb variable is available. +We should not segfault in case target is not created in atomic_check. +Removed unneeded cast + +Signed-off-by: Harry Wentland <harry.wentland@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +--- + .../gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c | 61 ++++++++++++++-------- + 1 file changed, 39 insertions(+), 22 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +index 7990a48..4c460c0 100644 +--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c ++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm_types.c +@@ -525,18 +525,20 @@ static void fill_gamma_from_crtc( + + static void fill_plane_attributes( + struct dc_surface *surface, +- const struct drm_crtc *crtc) ++ struct drm_plane_state *state) + { + const struct amdgpu_framebuffer *amdgpu_fb = +- to_amdgpu_framebuffer(crtc->primary->state->fb); +- fill_rects_from_plane_state(crtc->primary->state, surface); ++ to_amdgpu_framebuffer(state->fb); ++ const struct drm_crtc *crtc = state->crtc; ++ ++ fill_rects_from_plane_state(state, surface); + fill_plane_attributes_from_fb( + surface, + amdgpu_fb); + + /* In case of gamma set, update gamma value */ + if (crtc->mode.private_flags & +- AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET) { ++ AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET) { + fill_gamma_from_crtc(crtc, surface); + } + } +@@ -647,7 +649,7 @@ static void dm_dc_surface_commit( + dm_state); + + /* Surface programming */ +- fill_plane_attributes(dc_surface, crtc); ++ fill_plane_attributes(dc_surface, crtc->primary->state); + if (crtc->mode.private_flags & + AMDGPU_CRTC_MODE_PRIVATE_FLAGS_GAMMASET) { + /* reset trigger of gamma */ +@@ -2087,14 +2089,15 @@ int amdgpu_dm_atomic_commit( + * aconnector as needed + */ + handle_headless_hotplug(acrtc, new_state, &aconnector); +- if (!aconnector) { ++ ++ action = get_dm_commit_action(new_state); ++ ++ if (!aconnector && action != DM_COMMIT_ACTION_NOTHING) { + DRM_ERROR("Can't find connector for crtc %d\n", + acrtc->crtc_id); + break; + } + +- action = get_dm_commit_action(new_state); +- + switch (action) { + case DM_COMMIT_ACTION_DPMS_ON: + case DM_COMMIT_ACTION_SET: { +@@ -2318,7 +2321,11 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + struct drm_crtc_state *crtc_state; + struct drm_plane *plane; + struct drm_plane_state *plane_state; +- int i, j, ret, set_count, new_target_count; ++ int i; ++ int j; ++ int ret; ++ int set_count; ++ int new_target_count; + struct dc_validation_set set[MAX_TARGET_NUM] = {{ 0 }}; + struct dc_target *new_targets[MAX_TARGET_NUM] = { 0 }; + struct amdgpu_device *adev = dev->dev_private; +@@ -2334,11 +2341,6 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + + ret = -EINVAL; + +- if (state->num_connector > MAX_TARGET_NUM) { +- DRM_ERROR("Exceeded max targets number !\n"); +- return ret; +- } +- + /* copy existing configuration */ + new_target_count = 0; + set_count = 0; +@@ -2381,14 +2383,27 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + struct dc_target *new_target = NULL; + + if (!aconnector) { +- DRM_ERROR("Can't find connector for crtc %d\n", +- acrtc->crtc_id); ++ DRM_ERROR( ++ "%s: Can't find connector for crtc %d\n", ++ __func__, ++ acrtc->crtc_id); + goto connector_not_found; + } ++ + new_target = + create_target_for_sink( + aconnector, + &mode); ++ ++ if (!new_target) { ++ DRM_ERROR( ++ "%s: Can't create target for crtc %d\n", ++ __func__, ++ acrtc->crtc_id); ++ goto connector_not_found; ++ ++ } ++ + new_targets[new_target_count] = new_target; + + set_count = update_in_val_sets_target( +@@ -2420,12 +2435,13 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + for_each_plane_in_state(state, plane, plane_state, j) { + struct drm_plane_state *old_plane_state = plane->state; + struct drm_framebuffer *fb = plane_state->fb; +- struct amdgpu_crtc *acrtc = +- to_amdgpu_crtc(plane_state->crtc); ++ struct drm_crtc *crtc = plane_state->crtc; ++ struct amdgpu_crtc *acrtc = to_amdgpu_crtc(crtc); + + if (!fb || acrtc->target != set[i].target) + continue; +- if (!plane_state->crtc->state->planes_changed) ++ ++ if (!crtc->state->planes_changed) + continue; + + if (!page_flip_needed(plane_state, old_plane_state)) { +@@ -2433,7 +2449,9 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + dc_create_surface(dc); + + fill_plane_attributes( +- surface, plane_state->crtc); ++ surface, ++ plane_state); ++ + add_val_sets_surface( + set, + set_count, +@@ -2450,8 +2468,7 @@ int amdgpu_dm_atomic_check(struct drm_device *dev, + connector_not_found: + for (i = 0; i < set_count; i++) { + for (j = 0; j < set[i].surface_count; j++) { +- dc_surface_release( +- (struct dc_surface *)set[i].surfaces[j]); ++ dc_surface_release(set[i].surfaces[j]); + } + } + for (i = 0; i < new_target_count; i++) +-- +2.7.4 + |