As skl_pfit_enable and skl_scaler_setup_casf have similar logic for pipe scaler registers so to avoid duplicacy introduce new helper skl_pipe_scaler_setup. This helper consolidates common scaler setup steps and is now called from both skl_pfit_enable() and skl_scaler_setup_casf().
Signed-off-by: Nemesa Garg <[email protected]> --- drivers/gpu/drm/i915/display/skl_scaler.c | 67 ++++++++++++----------- drivers/gpu/drm/i915/display/skl_scaler.h | 2 + 2 files changed, 36 insertions(+), 33 deletions(-) diff --git a/drivers/gpu/drm/i915/display/skl_scaler.c b/drivers/gpu/drm/i915/display/skl_scaler.c index 4c4deac7f9c8..abd951f7dd71 100644 --- a/drivers/gpu/drm/i915/display/skl_scaler.c +++ b/drivers/gpu/drm/i915/display/skl_scaler.c @@ -761,41 +761,25 @@ static void skl_scaler_setup_filter(struct intel_display *display, void skl_scaler_setup_casf(struct intel_crtc_state *crtc_state) { - struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); - struct intel_display *display = to_intel_display(crtc); + struct intel_display *display = to_intel_display(crtc_state); + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); + const struct intel_crtc_scaler_state *scaler_state = + &crtc_state->scaler_state; struct drm_display_mode *adjusted_mode = - &crtc_state->hw.adjusted_mode; - struct intel_crtc_scaler_state *scaler_state = - &crtc_state->scaler_state; - struct drm_rect src, dest; - int id, width, height; - int x = 0, y = 0; + &crtc_state->hw.adjusted_mode; enum pipe pipe = crtc->pipe; - u32 ps_ctrl; + int width, height, x = 0, y = 0; + int id; width = adjusted_mode->crtc_hdisplay; height = adjusted_mode->crtc_vdisplay; - drm_rect_init(&dest, x, y, width, height); - - width = drm_rect_width(&dest); - height = drm_rect_height(&dest); id = scaler_state->scaler_id; - drm_rect_init(&src, 0, 0, - drm_rect_width(&crtc_state->pipe_src) << 16, - drm_rect_height(&crtc_state->pipe_src) << 16); + skl_pipe_scaler_setup(crtc_state, width, height, x, y); - trace_intel_pipe_scaler_update_arm(crtc, id, x, y, width, height); - - ps_ctrl = PS_SCALER_EN | PS_BINDING_PIPE | scaler_state->scalers[id].mode | - CASF_SCALER_FILTER_SELECT; - - intel_de_write_fw(display, SKL_PS_CTRL(pipe, id), ps_ctrl); - intel_de_write_fw(display, SKL_PS_WIN_POS(pipe, id), - PS_WIN_XPOS(x) | PS_WIN_YPOS(y)); intel_de_write_fw(display, SKL_PS_WIN_SZ(pipe, id), - PS_WIN_XSIZE(width) | PS_WIN_YSIZE(height)); + PS_WIN_XSIZE(width) | PS_WIN_YSIZE(height)); } void skl_pfit_enable(const struct intel_crtc_state *crtc_state) @@ -814,7 +798,6 @@ void skl_pfit_enable(const struct intel_crtc_state *crtc_state) int hscale, vscale; struct drm_rect src; int id; - u32 ps_ctrl; if (!crtc_state->pch_pfit.enabled) return; @@ -836,10 +819,34 @@ void skl_pfit_enable(const struct intel_crtc_state *crtc_state) uv_rgb_hphase = skl_scaler_calc_phase(1, hscale, false); uv_rgb_vphase = skl_scaler_calc_phase(1, vscale, false); + skl_pipe_scaler_setup(crtc_state, width, height, x, y); + + id = scaler_state->scaler_id; + + intel_de_write_fw(display, SKL_PS_VPHASE(pipe, id), + PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase)); + intel_de_write_fw(display, SKL_PS_HPHASE(pipe, id), + PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase)); + intel_de_write_fw(display, SKL_PS_WIN_SZ(pipe, id), + PS_WIN_XSIZE(width) | PS_WIN_YSIZE(height)); +} + +void skl_pipe_scaler_setup(const struct intel_crtc_state *crtc_state, + int width, int height, int x, int y) +{ + struct intel_display *display = to_intel_display(crtc_state); + struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc); + const struct intel_crtc_scaler_state *scaler_state = + &crtc_state->scaler_state; + enum pipe pipe = crtc->pipe; + int id; + u32 ps_ctrl; + id = scaler_state->scaler_id; ps_ctrl = PS_SCALER_EN | PS_BINDING_PIPE | scaler_state->scalers[id].mode | - skl_scaler_get_filter_select(crtc_state->hw.scaling_filter); + skl_scaler_get_filter_select(crtc_state->hw.scaling_filter) | + CASF_SCALER_FILTER_SELECT; trace_intel_pipe_scaler_update_arm(crtc, id, x, y, width, height); @@ -848,14 +855,8 @@ void skl_pfit_enable(const struct intel_crtc_state *crtc_state) intel_de_write_fw(display, SKL_PS_CTRL(pipe, id), ps_ctrl); - intel_de_write_fw(display, SKL_PS_VPHASE(pipe, id), - PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_vphase)); - intel_de_write_fw(display, SKL_PS_HPHASE(pipe, id), - PS_Y_PHASE(0) | PS_UV_RGB_PHASE(uv_rgb_hphase)); intel_de_write_fw(display, SKL_PS_WIN_POS(pipe, id), PS_WIN_XPOS(x) | PS_WIN_YPOS(y)); - intel_de_write_fw(display, SKL_PS_WIN_SZ(pipe, id), - PS_WIN_XSIZE(width) | PS_WIN_YSIZE(height)); } void diff --git a/drivers/gpu/drm/i915/display/skl_scaler.h b/drivers/gpu/drm/i915/display/skl_scaler.h index 7e8d819c019d..94bde5d1c06a 100644 --- a/drivers/gpu/drm/i915/display/skl_scaler.h +++ b/drivers/gpu/drm/i915/display/skl_scaler.h @@ -30,6 +30,8 @@ void skl_program_plane_scaler(struct intel_dsb *dsb, struct intel_plane *plane, const struct intel_crtc_state *crtc_state, const struct intel_plane_state *plane_state); +void skl_pipe_scaler_setup(const struct intel_crtc_state *crtc_state, + int width, int height, int x, int y); void skl_detach_scalers(struct intel_dsb *dsb, const struct intel_crtc_state *crtc_state); void skl_scaler_disable(const struct intel_crtc_state *old_crtc_state); -- 2.25.1
