diff options
Diffstat (limited to 'common/recipes-kernel/linux/files/0980-drm-amd-dal-Implement-retreiving-crtc-scanoutpos-for.patch')
-rw-r--r-- | common/recipes-kernel/linux/files/0980-drm-amd-dal-Implement-retreiving-crtc-scanoutpos-for.patch | 172 |
1 files changed, 172 insertions, 0 deletions
diff --git a/common/recipes-kernel/linux/files/0980-drm-amd-dal-Implement-retreiving-crtc-scanoutpos-for.patch b/common/recipes-kernel/linux/files/0980-drm-amd-dal-Implement-retreiving-crtc-scanoutpos-for.patch new file mode 100644 index 00000000..e7e9f99b --- /dev/null +++ b/common/recipes-kernel/linux/files/0980-drm-amd-dal-Implement-retreiving-crtc-scanoutpos-for.patch @@ -0,0 +1,172 @@ +From a0e3903311121fd5cd9e37ffe67bdf22ae77764d Mon Sep 17 00:00:00 2001 +From: Jordan Lazare <Jordan.Lazare@amd.com> +Date: Tue, 22 Mar 2016 16:22:20 -0400 +Subject: [PATCH 0980/1110] drm/amd/dal: Implement retreiving crtc scanoutpos + for drm + +This got missed in the DAL3 rewrite. + +Signed-off-by: Jordan Lazare <Jordan.Lazare@amd.com> +Acked-by: Harry Wentland <harry.wentland@amd.com> +Signed-off-by: Alex Deucher <alexander.deucher@amd.com> +--- + drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c | 13 ++++++++--- + drivers/gpu/drm/amd/dal/dc/core/dc_target.c | 26 ++++++++++++++++++++++ + drivers/gpu/drm/amd/dal/dc/dc.h | 10 +++++++++ + .../amd/dal/dc/dce110/dce110_timing_generator.c | 5 +++-- + .../amd/dal/dc/dce110/dce110_timing_generator.h | 4 ++-- + .../drm/amd/dal/dc/dce80/dce80_timing_generator.c | 1 + + .../gpu/drm/amd/dal/dc/inc/hw/timing_generator.h | 4 ++++ + 7 files changed, 56 insertions(+), 7 deletions(-) + +diff --git a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +index 5626402..5b92771 100644 +--- a/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c ++++ b/drivers/gpu/drm/amd/dal/amdgpu_dm/amdgpu_dm.c +@@ -98,10 +98,17 @@ static int dm_crtc_get_scanoutpos(struct amdgpu_device *adev, int crtc, + { + if ((crtc < 0) || (crtc >= adev->mode_info.num_crtc)) + return -EINVAL; ++ else { ++ struct amdgpu_crtc *acrtc = adev->mode_info.crtcs[crtc]; ++ ++ if (NULL == acrtc->target) { ++ DRM_ERROR("dc_target is NULL for crtc '%d'!\n", crtc); ++ return 0; ++ } ++ ++ return dc_target_get_scanoutpos(acrtc->target, vbl, position); ++ } + +-/* TODO: #DAL3 Implement scanoutpos +- dal_get_crtc_scanoutpos(adev->dm.dal, crtc, vbl, position); +-*/ + return 0; + } + +diff --git a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c +index 53bb64b..4b5504c 100644 +--- a/drivers/gpu/drm/amd/dal/dc/core/dc_target.c ++++ b/drivers/gpu/drm/amd/dal/dc/core/dc_target.c +@@ -257,6 +257,32 @@ uint32_t dc_target_get_vblank_counter(const struct dc_target *dc_target) + return 0; + } + ++uint32_t dc_target_get_scanoutpos( ++ const struct dc_target *dc_target, ++ uint32_t *vbl, ++ uint32_t *position) ++{ ++ uint8_t i, j; ++ struct core_target *target = DC_TARGET_TO_CORE(dc_target); ++ struct core_dc *core_dc = DC_TO_CORE(target->ctx->dc); ++ struct resource_context *res_ctx = ++ &core_dc->current_context.res_ctx; ++ ++ for (i = 0; i < target->public.stream_count; i++) { ++ for (j = 0; j < MAX_PIPES; j++) { ++ struct timing_generator *tg = res_ctx->pipe_ctx[j].tg; ++ ++ if (res_ctx->pipe_ctx[j].stream != ++ DC_STREAM_TO_CORE(target->public.streams[i])) ++ continue; ++ ++ return tg->funcs->get_scanoutpos(tg, vbl, position); ++ } ++ } ++ ++ return 0; ++} ++ + enum dc_irq_source dc_target_get_irq_src( + const struct dc *dc, + const struct dc_target *dc_target, +diff --git a/drivers/gpu/drm/amd/dal/dc/dc.h b/drivers/gpu/drm/amd/dal/dc/dc.h +index 348bb0d..5c2fe6d 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dc.h ++++ b/drivers/gpu/drm/amd/dal/dc/dc.h +@@ -242,6 +242,16 @@ bool dc_target_is_connected_to_sink( + uint8_t dc_target_get_controller_id(const struct dc_target *dc_target); + + uint32_t dc_target_get_vblank_counter(const struct dc_target *dc_target); ++ ++/* TODO: Return parsed values rather than direct register read ++ * This has a dependency on the caller (amdgpu_get_crtc_scanoutpos) ++ * being refactored properly to be dce-specific ++ */ ++uint32_t dc_target_get_scanoutpos( ++ const struct dc_target *dc_target, ++ uint32_t *vbl, ++ uint32_t *position); ++ + enum dc_irq_source dc_target_get_irq_src( + const struct dc *dc, + const struct dc_target *dc_target, +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c +index a9ef65d..e4fe49a 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.c +@@ -130,6 +130,7 @@ static struct timing_generator_funcs dce110_tg_funcs = { + .is_counter_moving = dce110_timing_generator_is_counter_moving, + .get_position = dce110_timing_generator_get_crtc_positions, + .get_frame_count = dce110_timing_generator_get_vblank_counter, ++ .get_scanoutpos = dce110_timing_generator_get_crtc_scanoutpos, + .set_early_control = dce110_timing_generator_set_early_control, + .wait_for_state = dce110_tg_wait_for_state, + .set_blank = dce110_tg_set_blank, +@@ -819,8 +820,8 @@ void dce110_timing_generator_get_crtc_positions( + */ + uint32_t dce110_timing_generator_get_crtc_scanoutpos( + struct timing_generator *tg, +- int32_t *vbl, +- int32_t *position) ++ uint32_t *vbl, ++ uint32_t *position) + { + struct dce110_timing_generator *tg110 = DCE110TG_FROM_TG(tg); + /* TODO 1: Update the implementation once caller is updated +diff --git a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h +index 005f22b..7e01bde 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h ++++ b/drivers/gpu/drm/amd/dal/dc/dce110/dce110_timing_generator.h +@@ -193,8 +193,8 @@ void dce110_timing_generator_program_drr( + + uint32_t dce110_timing_generator_get_crtc_scanoutpos( + struct timing_generator *tg, +- int32_t *vbl, +- int32_t *position); ++ uint32_t *vbl, ++ uint32_t *position); + + void dce110_timing_generator_enable_advanced_request( + struct timing_generator *tg, +diff --git a/drivers/gpu/drm/amd/dal/dc/dce80/dce80_timing_generator.c b/drivers/gpu/drm/amd/dal/dc/dce80/dce80_timing_generator.c +index 24c1832..e44e131 100644 +--- a/drivers/gpu/drm/amd/dal/dc/dce80/dce80_timing_generator.c ++++ b/drivers/gpu/drm/amd/dal/dc/dce80/dce80_timing_generator.c +@@ -124,6 +124,7 @@ static struct timing_generator_funcs dce80_tg_funcs = { + .is_counter_moving = dce110_timing_generator_is_counter_moving, + .get_position = dce110_timing_generator_get_crtc_positions, + .get_frame_count = dce110_timing_generator_get_vblank_counter, ++ .get_scanoutpos = dce110_timing_generator_get_crtc_scanoutpos, + .set_early_control = dce110_timing_generator_set_early_control, + .wait_for_state = dce110_tg_wait_for_state, + .set_blank = dce110_tg_set_blank, +diff --git a/drivers/gpu/drm/amd/dal/dc/inc/hw/timing_generator.h b/drivers/gpu/drm/amd/dal/dc/inc/hw/timing_generator.h +index 25f2417..9347310 100644 +--- a/drivers/gpu/drm/amd/dal/dc/inc/hw/timing_generator.h ++++ b/drivers/gpu/drm/amd/dal/dc/inc/hw/timing_generator.h +@@ -124,6 +124,10 @@ struct timing_generator_funcs { + int32_t *h_position, + int32_t *v_position); + uint32_t (*get_frame_count)(struct timing_generator *tg); ++ uint32_t (*get_scanoutpos)( ++ struct timing_generator *tg, ++ uint32_t *vbl, ++ uint32_t *position); + void (*set_early_control)(struct timing_generator *tg, + uint32_t early_cntl); + void (*wait_for_state)(struct timing_generator *tg, +-- +2.7.4 + |