|
@@ -1256,7 +1256,7 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
|
|
const struct dpu_format *fmt;
|
|
const struct dpu_format *fmt;
|
|
struct drm_crtc *crtc;
|
|
struct drm_crtc *crtc;
|
|
struct drm_framebuffer *fb;
|
|
struct drm_framebuffer *fb;
|
|
- struct drm_rect src, dst;
|
|
|
|
|
|
+ int ret, min_scale;
|
|
|
|
|
|
if (!plane) {
|
|
if (!plane) {
|
|
DPU_ERROR("invalid plane\n");
|
|
DPU_ERROR("invalid plane\n");
|
|
@@ -1295,21 +1295,29 @@ static int dpu_plane_sspp_atomic_update(struct drm_plane *plane,
|
|
pdpu->is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT);
|
|
pdpu->is_rt_pipe = (dpu_crtc_get_client_type(crtc) != NRT_CLIENT);
|
|
_dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL);
|
|
_dpu_plane_set_qos_ctrl(plane, false, DPU_PLANE_QOS_PANIC_CTRL);
|
|
|
|
|
|
- src.x1 = state->src_x >> 16;
|
|
|
|
- src.y1 = state->src_y >> 16;
|
|
|
|
- src.x2 = src.x1 + (state->src_w >> 16);
|
|
|
|
- src.y2 = src.y1 + (state->src_h >> 16);
|
|
|
|
|
|
+ min_scale = FRAC_16_16(1, pdpu->pipe_sblk->maxdwnscale);
|
|
|
|
+ ret = drm_atomic_helper_check_plane_state(state, crtc->state, min_scale,
|
|
|
|
+ pdpu->pipe_sblk->maxupscale << 16,
|
|
|
|
+ true, false);
|
|
|
|
+ if (ret) {
|
|
|
|
+ DPU_ERROR_PLANE(pdpu, "Check plane state failed (%d)\n", ret);
|
|
|
|
+ return ret;
|
|
|
|
+ }
|
|
|
|
|
|
- dst = drm_plane_state_dest(state);
|
|
|
|
|
|
+ DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FP_FMT "->crtc%u " DRM_RECT_FMT
|
|
|
|
+ ", %4.4s ubwc %d\n", fb->base.id, DRM_RECT_FP_ARG(&state->src),
|
|
|
|
+ crtc->base.id, DRM_RECT_ARG(&state->dst),
|
|
|
|
+ (char *)&fmt->base.pixel_format, DPU_FORMAT_IS_UBWC(fmt));
|
|
|
|
|
|
- DPU_DEBUG_PLANE(pdpu, "FB[%u] " DRM_RECT_FMT "->crtc%u " DRM_RECT_FMT
|
|
|
|
- ", %4.4s ubwc %d\n", fb->base.id, DRM_RECT_ARG(&src),
|
|
|
|
- crtc->base.id, DRM_RECT_ARG(&dst),
|
|
|
|
- (char *)&fmt->base.pixel_format,
|
|
|
|
- DPU_FORMAT_IS_UBWC(fmt));
|
|
|
|
|
|
+ pdpu->pipe_cfg.src_rect = state->src;
|
|
|
|
+
|
|
|
|
+ /* state->src is 16.16, src_rect is not */
|
|
|
|
+ pdpu->pipe_cfg.src_rect.x1 >>= 16;
|
|
|
|
+ pdpu->pipe_cfg.src_rect.x2 >>= 16;
|
|
|
|
+ pdpu->pipe_cfg.src_rect.y1 >>= 16;
|
|
|
|
+ pdpu->pipe_cfg.src_rect.y2 >>= 16;
|
|
|
|
|
|
- pdpu->pipe_cfg.src_rect = src;
|
|
|
|
- pdpu->pipe_cfg.dst_rect = dst;
|
|
|
|
|
|
+ pdpu->pipe_cfg.dst_rect = state->dst;
|
|
|
|
|
|
_dpu_plane_setup_scaler(pdpu, pstate, fmt, false);
|
|
_dpu_plane_setup_scaler(pdpu, pstate, fmt, false);
|
|
|
|
|