mirror of https://gitee.com/openkylin/linux.git
drm/amd/display: Refactor pageflips plane commit
[Why] commit_planes is indented quite far [How] Move the pageflip code from an if statement to after a continue Signed-off-by: David Francis <David.Francis@amd.com> Reviewed-by: Nicholas Kazlauskas <Nicholas.Kazlauskas@amd.com> Acked-by: Bhawanpreet Lakha <Bhawanpreet.Lakha@amd.com> Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
This commit is contained in:
parent
34bafd27e3
commit
f503100060
|
@ -4712,74 +4712,6 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
||||||
|
|
||||||
dc_plane = dm_new_plane_state->dc_state;
|
dc_plane = dm_new_plane_state->dc_state;
|
||||||
|
|
||||||
plane_needs_flip = old_plane_state->fb && new_plane_state->fb;
|
|
||||||
|
|
||||||
pflip_present = pflip_present || plane_needs_flip;
|
|
||||||
|
|
||||||
if (plane_needs_flip) {
|
|
||||||
/*
|
|
||||||
* TODO This might fail and hence better not used, wait
|
|
||||||
* explicitly on fences instead
|
|
||||||
* and in general should be called for
|
|
||||||
* blocking commit to as per framework helpers
|
|
||||||
*/
|
|
||||||
abo = gem_to_amdgpu_bo(fb->obj[0]);
|
|
||||||
r = amdgpu_bo_reserve(abo, true);
|
|
||||||
if (unlikely(r != 0))
|
|
||||||
DRM_ERROR("failed to reserve buffer before flip\n");
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Wait for all fences on this FB. Do limited wait to avoid
|
|
||||||
* deadlock during GPU reset when this fence will not signal
|
|
||||||
* but we hold reservation lock for the BO.
|
|
||||||
*/
|
|
||||||
r = reservation_object_wait_timeout_rcu(abo->tbo.resv,
|
|
||||||
true, false,
|
|
||||||
msecs_to_jiffies(5000));
|
|
||||||
if (unlikely(r == 0))
|
|
||||||
DRM_ERROR("Waiting for fences timed out.");
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
|
|
||||||
|
|
||||||
amdgpu_bo_unreserve(abo);
|
|
||||||
|
|
||||||
bundle->flip_addrs[planes_count].address.grph.addr.low_part = lower_32_bits(afb->address);
|
|
||||||
bundle->flip_addrs[planes_count].address.grph.addr.high_part = upper_32_bits(afb->address);
|
|
||||||
|
|
||||||
dcc_address = get_dcc_address(afb->address, tiling_flags);
|
|
||||||
bundle->flip_addrs[planes_count].address.grph.meta_addr.low_part = lower_32_bits(dcc_address);
|
|
||||||
bundle->flip_addrs[planes_count].address.grph.meta_addr.high_part = upper_32_bits(dcc_address);
|
|
||||||
|
|
||||||
bundle->flip_addrs[planes_count].flip_immediate =
|
|
||||||
(crtc->state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0;
|
|
||||||
|
|
||||||
timestamp_ns = ktime_get_ns();
|
|
||||||
bundle->flip_addrs[planes_count].flip_timestamp_in_us = div_u64(timestamp_ns, 1000);
|
|
||||||
bundle->surface_updates[planes_count].flip_addr = &bundle->flip_addrs[planes_count];
|
|
||||||
bundle->surface_updates[planes_count].surface = dc_plane;
|
|
||||||
|
|
||||||
if (!bundle->surface_updates[planes_count].surface) {
|
|
||||||
DRM_ERROR("No surface for CRTC: id=%d\n",
|
|
||||||
acrtc_attach->crtc_id);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (plane == pcrtc->primary)
|
|
||||||
update_freesync_state_on_stream(
|
|
||||||
dm,
|
|
||||||
acrtc_state,
|
|
||||||
acrtc_state->stream,
|
|
||||||
dc_plane,
|
|
||||||
bundle->flip_addrs[planes_count].flip_timestamp_in_us);
|
|
||||||
|
|
||||||
DRM_DEBUG_DRIVER("%s Flipping to hi: 0x%x, low: 0x%x\n",
|
|
||||||
__func__,
|
|
||||||
bundle->flip_addrs[planes_count].address.grph.addr.high_part,
|
|
||||||
bundle->flip_addrs[planes_count].address.grph.addr.low_part);
|
|
||||||
}
|
|
||||||
|
|
||||||
bundle->surface_updates[planes_count].surface = dc_plane;
|
bundle->surface_updates[planes_count].surface = dc_plane;
|
||||||
if (new_pcrtc_state->color_mgmt_changed) {
|
if (new_pcrtc_state->color_mgmt_changed) {
|
||||||
bundle->surface_updates[planes_count].gamma = dc_plane->gamma_correction;
|
bundle->surface_updates[planes_count].gamma = dc_plane->gamma_correction;
|
||||||
|
@ -4806,6 +4738,70 @@ static void amdgpu_dm_commit_planes(struct drm_atomic_state *state,
|
||||||
bundle->plane_infos[planes_count].dcc = dc_plane->dcc;
|
bundle->plane_infos[planes_count].dcc = dc_plane->dcc;
|
||||||
bundle->surface_updates[planes_count].plane_info = &bundle->plane_infos[planes_count];
|
bundle->surface_updates[planes_count].plane_info = &bundle->plane_infos[planes_count];
|
||||||
|
|
||||||
|
plane_needs_flip = old_plane_state->fb && new_plane_state->fb;
|
||||||
|
|
||||||
|
pflip_present = pflip_present || plane_needs_flip;
|
||||||
|
|
||||||
|
if (!plane_needs_flip) {
|
||||||
|
planes_count += 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* TODO This might fail and hence better not used, wait
|
||||||
|
* explicitly on fences instead
|
||||||
|
* and in general should be called for
|
||||||
|
* blocking commit to as per framework helpers
|
||||||
|
*/
|
||||||
|
abo = gem_to_amdgpu_bo(fb->obj[0]);
|
||||||
|
r = amdgpu_bo_reserve(abo, true);
|
||||||
|
if (unlikely(r != 0)) {
|
||||||
|
DRM_ERROR("failed to reserve buffer before flip\n");
|
||||||
|
WARN_ON(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Wait for all fences on this FB */
|
||||||
|
WARN_ON(reservation_object_wait_timeout_rcu(abo->tbo.resv, true, false,
|
||||||
|
MAX_SCHEDULE_TIMEOUT) < 0);
|
||||||
|
|
||||||
|
amdgpu_bo_get_tiling_flags(abo, &tiling_flags);
|
||||||
|
|
||||||
|
amdgpu_bo_unreserve(abo);
|
||||||
|
|
||||||
|
bundle->flip_addrs[planes_count].address.grph.addr.low_part = lower_32_bits(afb->address);
|
||||||
|
bundle->flip_addrs[planes_count].address.grph.addr.high_part = upper_32_bits(afb->address);
|
||||||
|
|
||||||
|
dcc_address = get_dcc_address(afb->address, tiling_flags);
|
||||||
|
bundle->flip_addrs[planes_count].address.grph.meta_addr.low_part = lower_32_bits(dcc_address);
|
||||||
|
bundle->flip_addrs[planes_count].address.grph.meta_addr.high_part = upper_32_bits(dcc_address);
|
||||||
|
|
||||||
|
bundle->flip_addrs[planes_count].flip_immediate =
|
||||||
|
(crtc->state->pageflip_flags & DRM_MODE_PAGE_FLIP_ASYNC) != 0;
|
||||||
|
|
||||||
|
timestamp_ns = ktime_get_ns();
|
||||||
|
bundle->flip_addrs[planes_count].flip_timestamp_in_us = div_u64(timestamp_ns, 1000);
|
||||||
|
bundle->surface_updates[planes_count].flip_addr = &bundle->flip_addrs[planes_count];
|
||||||
|
bundle->surface_updates[planes_count].surface = dc_plane;
|
||||||
|
|
||||||
|
if (!bundle->surface_updates[planes_count].surface) {
|
||||||
|
DRM_ERROR("No surface for CRTC: id=%d\n",
|
||||||
|
acrtc_attach->crtc_id);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (plane == pcrtc->primary)
|
||||||
|
update_freesync_state_on_stream(
|
||||||
|
dm,
|
||||||
|
acrtc_state,
|
||||||
|
acrtc_state->stream,
|
||||||
|
dc_plane,
|
||||||
|
bundle->flip_addrs[planes_count].flip_timestamp_in_us);
|
||||||
|
|
||||||
|
DRM_DEBUG_DRIVER("%s Flipping to hi: 0x%x, low: 0x%x\n",
|
||||||
|
__func__,
|
||||||
|
bundle->flip_addrs[planes_count].address.grph.addr.high_part,
|
||||||
|
bundle->flip_addrs[planes_count].address.grph.addr.low_part);
|
||||||
|
|
||||||
planes_count += 1;
|
planes_count += 1;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue