plane);
        int ret = 0, min_scale;
        struct dpu_plane *pdpu = to_dpu_plane(plane);
+       struct dpu_kms *kms = _dpu_plane_get_kms(&pdpu->base);
+       u64 max_mdp_clk_rate = kms->perf.max_core_clk_rate;
        struct dpu_plane_state *pstate = to_dpu_plane_state(new_plane_state);
        struct dpu_sw_pipe *pipe = &pstate->pipe;
        struct dpu_sw_pipe *r_pipe = &pstate->r_pipe;
 
        max_linewidth = pdpu->catalog->caps->max_linewidth;
 
-       if (drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) {
+       if ((drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) ||
+            _dpu_plane_calc_clk(&crtc_state->adjusted_mode, pipe_cfg) > max_mdp_clk_rate) {
                /*
                 * In parallel multirect case only the half of the usual width
                 * is supported for tiled formats. If we are here, we know that
                 * full width is more than max_linewidth, thus each rect is
                 * wider than allowed.
                 */
-               if (DPU_FORMAT_IS_UBWC(fmt)) {
+               if (DPU_FORMAT_IS_UBWC(fmt) &&
+                   drm_rect_width(&pipe_cfg->src_rect) > max_linewidth) {
                        DPU_DEBUG_PLANE(pdpu, "invalid src " DRM_RECT_FMT " line:%u, tiled format\n",
                                        DRM_RECT_ARG(&pipe_cfg->src_rect), max_linewidth);
                        return -E2BIG;