MLK-17459-2: drm: imx: dcss: add cropping functionality and fix odd resolutions
authorLaurentiu Palcu <laurentiu.palcu@nxp.com>
Mon, 19 Feb 2018 13:58:21 +0000 (15:58 +0200)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
This patch fixes playback for movies with unaligned widths/heights and
adds cropping functionality for tiled formats. Untiled formats will not
have this feature as cropping is a DTRC function.

Signed-off-by: Laurentiu Palcu <laurentiu.palcu@nxp.com>
drivers/gpu/drm/imx/dcss/dcss-plane.c
drivers/gpu/imx/dcss/dcss-dpr.c
drivers/gpu/imx/dcss/dcss-dtrc.c
include/video/imx-dcss.h

index 11f5934..13c078d 100644 (file)
@@ -178,6 +178,7 @@ static int dcss_plane_atomic_check(struct drm_plane *plane,
        struct drm_gem_cma_object *cma_obj;
        struct drm_crtc_state *crtc_state;
        int hdisplay, vdisplay;
+       struct drm_rect crtc_rect, disp_rect;
 
        if (!fb)
                return 0;
@@ -194,11 +195,29 @@ static int dcss_plane_atomic_check(struct drm_plane *plane,
        hdisplay = crtc_state->adjusted_mode.hdisplay;
        vdisplay = crtc_state->adjusted_mode.vdisplay;
 
-       /* We don't support cropping yet */
+       crtc_rect.x1 = state->crtc_x;
+       crtc_rect.x2 = state->crtc_x + state->crtc_w;
+       crtc_rect.y1 = state->crtc_y;
+       crtc_rect.y2 = state->crtc_y + state->crtc_h;
+
+       disp_rect.x1 = 0;
+       disp_rect.y1 = 0;
+       disp_rect.x2 = hdisplay;
+       disp_rect.y2 = vdisplay;
+
+       /* make sure the crtc is visible */
+       if (!drm_rect_intersect(&crtc_rect, &disp_rect))
+               return -EINVAL;
+
+       /* cropping is only available on overlay planes when DTRC is used */
        if (state->crtc_x < 0 || state->crtc_y < 0 ||
            state->crtc_x + state->crtc_w > hdisplay ||
-           state->crtc_y + state->crtc_h > vdisplay)
-               return -EINVAL;
+           state->crtc_y + state->crtc_h > vdisplay) {
+               if (plane->type == DRM_PLANE_TYPE_PRIMARY)
+                       return -EINVAL;
+               else if (!(fb->flags & DRM_MODE_FB_MODIFIERS))
+                       return -EINVAL;
+       }
 
        if (!dcss_scaler_can_scale(dcss_plane->dcss, dcss_plane->ch_num,
                                   state->src_w >> 16, state->src_h >> 16,
@@ -240,8 +259,8 @@ static void dcss_plane_atomic_set_base(struct dcss_plane *dcss_plane)
                fb->pitches[1] * (state->src_y >> 16) +
                fb->format->cpp[0] * (state->src_x >> 16);
 
-       dcss_dpr_addr_set(dcss_plane->dcss, dcss_plane->ch_num,
-                         p1_ba, p2_ba, fb->pitches[0]);
+       dcss_dpr_addr_set(dcss_plane->dcss, dcss_plane->ch_num, p1_ba, p2_ba,
+                         fb->pitches[0]);
 
        switch (plane->type) {
        case DRM_PLANE_TYPE_PRIMARY:
@@ -312,6 +331,27 @@ static bool dcss_plane_needs_setup(struct drm_plane_state *state,
               fb->modifier  != old_fb->modifier;
 }
 
+static void dcss_plane_adjust(struct drm_rect *dis_rect,
+                             struct drm_rect *crtc,
+                             struct drm_rect *src)
+{
+       struct drm_rect new_crtc = *dis_rect, new_src;
+       u32 hscale, vscale;
+
+       hscale = ((src->x2 - src->x1) << 16) / (crtc->x2 - crtc->x1);
+       vscale = ((src->y2 - src->y1) << 16) / (crtc->y2 - crtc->y1);
+
+       drm_rect_intersect(&new_crtc, crtc);
+
+       new_src.x1 = ((new_crtc.x1 - crtc->x1) * hscale + (1 << 15)) >> 16;
+       new_src.x2 = ((new_crtc.x2 - crtc->x1) * hscale + (1 << 15)) >> 16;
+       new_src.y1 = ((new_crtc.y1 - crtc->y1) * vscale + (1 << 15)) >> 16;
+       new_src.y2 = ((new_crtc.y2 - crtc->y1) * vscale + (1 << 15)) >> 16;
+
+       *crtc = new_crtc;
+       *src = new_src;
+}
+
 static void dcss_plane_atomic_update(struct drm_plane *plane,
                                     struct drm_plane_state *old_state)
 {
@@ -321,6 +361,8 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
        u32 pixel_format = state->fb->format->format;
        struct drm_crtc_state *crtc_state = state->crtc->state;
        bool modifiers_present = !!(fb->flags & DRM_MODE_FB_MODIFIERS);
+       u32 src_w, src_h, adj_w, adj_h;
+       struct drm_rect disp, crtc, src, old_src;
 
        if (!state->fb)
                return;
@@ -336,11 +378,46 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
                return;
        }
 
+       dcss_dpr_enable(dcss_plane->dcss, dcss_plane->ch_num, false);
+       dcss_scaler_enable(dcss_plane->dcss, dcss_plane->ch_num, false);
+       dcss_dtg_ch_enable(dcss_plane->dcss, dcss_plane->ch_num, false);
+
+       disp.x1 = 0;
+       disp.y1 = 0;
+       disp.x2 = crtc_state->adjusted_mode.hdisplay;
+       disp.y2 = crtc_state->adjusted_mode.vdisplay;
+
+       crtc.x1 = state->crtc_x;
+       crtc.y1 = state->crtc_y;
+       crtc.x2 = state->crtc_x + state->crtc_w;
+       crtc.y2 = state->crtc_y + state->crtc_h;
+
+       src.x1 = state->src_x >> 16;
+       src.y1 = state->src_y >> 16;
+       src.x2 = (state->src_x >> 16) + (state->src_w >> 16);
+       src.y2 = (state->src_y >> 16) + (state->src_h >> 16);
+
+       old_src = src;
+
+       dcss_plane_adjust(&disp, &crtc, &src);
+
+       /*
+        * The width and height after clipping, if image was partially
+        * outside the display area.
+        */
+       src_w = src.x2 - src.x1;
+       src_h = src.y2 - src.y1;
+
        if (plane->type == DRM_PLANE_TYPE_OVERLAY)
                dcss_dtrc_set_res(dcss_plane->dcss, dcss_plane->ch_num,
-                                 state->src_w >> 16, state->src_h >> 16);
+                                 &src, &old_src);
+
+       /* DTRC has probably aligned the sizes. */
+       adj_w = src.x2 - src.x1;
+       adj_h = src.y2 - src.y1;
 
-       dcss_dpr_format_set(dcss_plane->dcss, dcss_plane->ch_num, pixel_format);
+       dcss_dpr_format_set(dcss_plane->dcss, dcss_plane->ch_num, pixel_format,
+                               modifiers_present);
        if (!modifiers_present)
                dcss_dpr_tile_derive(dcss_plane->dcss,
                                     dcss_plane->ch_num,
@@ -351,12 +428,13 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
                                     fb->modifier);
 
        dcss_dpr_set_res(dcss_plane->dcss, dcss_plane->ch_num,
-                        state->src_w >> 16, state->src_h >> 16);
+                        src_w, src_h, adj_w, adj_h);
        dcss_plane_atomic_set_base(dcss_plane);
 
        dcss_scaler_setup(dcss_plane->dcss, dcss_plane->ch_num,
-                         pixel_format, state->src_w >> 16,
-                         state->src_h >> 16, state->crtc_w, state->crtc_h,
+                         pixel_format, src_w, src_h,
+                         crtc.x2 - crtc.x1,
+                         crtc.y2 - crtc.y1,
                          drm_mode_vrefresh(&crtc_state->mode));
 
        /*
@@ -368,8 +446,9 @@ static void dcss_plane_atomic_update(struct drm_plane *plane,
                                  DCSS_COLORSPACE_RGB);
 
        dcss_dtg_plane_pos_set(dcss_plane->dcss, dcss_plane->ch_num,
-                              state->crtc_x, state->crtc_y,
-                              state->crtc_w, state->crtc_h);
+                              crtc.x1, crtc.y1,
+                              crtc.x2 - crtc.x1,
+                              crtc.y2 - crtc.y1);
        dcss_dtg_plane_alpha_set(dcss_plane->dcss, dcss_plane->ch_num,
                                 pixel_format, dcss_plane->alpha_val,
                                 dcss_plane->use_global_val);
index 08df88f..3afd5b2 100644 (file)
@@ -111,6 +111,10 @@ struct dcss_dpr_ch {
        u32 mode_ctrl;
        u32 sys_ctrl;
        u32 rtram_ctrl;
+
+       u32 pitch;
+
+       bool use_dtrc;
 };
 
 struct dcss_dpr_priv {
@@ -253,7 +257,8 @@ static u32 dcss_dpr_y_pix_high_adjust(struct dcss_dpr_ch *ch, u32 pix_high,
        return pix_high + offset;
 }
 
-void dcss_dpr_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres)
+void dcss_dpr_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres,
+                     u32 adj_w, u32 adj_h)
 {
        struct dcss_dpr_priv *dpr = dcss->dpr_priv;
        struct dcss_dpr_ch *ch = &dpr->ch[ch_num];
@@ -270,13 +275,23 @@ void dcss_dpr_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres)
 
                pix_x_wide = dcss_dpr_x_pix_wide_adjust(ch, xres, pix_format);
                pix_y_high = dcss_dpr_y_pix_high_adjust(ch, yres, pix_format);
+
+               /* DTRC may need another width alignment. If it does, use it. */
+               if (pix_x_wide != adj_w)
+                       pix_x_wide = adj_w;
+
+               if (pix_y_high != adj_h)
+                       pix_y_high = plane == 0 ? adj_h : adj_h >> 1;
+
+               if (plane == 0)
+                       ch->pitch = pix_x_wide;
+
                dcss_dpr_write(dpr, ch_num, pix_x_wide,
                               DCSS_DPR_FRAME_1P_PIX_X_CTRL + plane * gap);
                dcss_dpr_write(dpr, ch_num, pix_y_high,
                               DCSS_DPR_FRAME_1P_PIX_Y_CTRL + plane * gap);
 
-               dcss_dpr_write(dpr, ch_num, xres < 640 ? 3 :
-                              xres < 1280 ? 4 : xres < 3840 ? 5 : 6,
+               dcss_dpr_write(dpr, ch_num, ch->use_dtrc ? 7 : 2,
                               DCSS_DPR_FRAME_1P_CTRL0 + plane * gap);
        }
 }
@@ -287,6 +302,11 @@ void dcss_dpr_addr_set(struct dcss_soc *dcss, int ch_num, u32 luma_base_addr,
 {
        struct dcss_dpr_ch *ch = &dcss->dpr_priv->ch[ch_num];
 
+       if (ch->use_dtrc) {
+               luma_base_addr = 0x0;
+               chroma_base_addr = 0x10000000;
+       }
+
        if (!dcss_dtrc_is_running(dcss, ch_num)) {
                dcss_dpr_write(dcss->dpr_priv, ch_num, luma_base_addr,
                               DCSS_DPR_FRAME_1P_BASE_ADDR);
@@ -295,6 +315,9 @@ void dcss_dpr_addr_set(struct dcss_soc *dcss, int ch_num, u32 luma_base_addr,
                               DCSS_DPR_FRAME_2P_BASE_ADDR);
        }
 
+       if (ch->use_dtrc)
+               pitch = ch->pitch;
+
        ch->frame_ctrl &= ~PITCH_MASK;
        ch->frame_ctrl |= ((pitch << PITCH_POS) & PITCH_MASK);
 }
@@ -587,7 +610,8 @@ void dcss_dpr_tile_derive(struct dcss_soc *dcss,
 }
 EXPORT_SYMBOL(dcss_dpr_tile_set);
 
-void dcss_dpr_format_set(struct dcss_soc *dcss, int ch_num, u32 pix_format)
+void dcss_dpr_format_set(struct dcss_soc *dcss, int ch_num, u32 pix_format,
+                        bool modifiers_present)
 {
        struct dcss_dpr_ch *ch = &dcss->dpr_priv->ch[ch_num];
        struct drm_format_name_buf format_name;
@@ -599,6 +623,7 @@ void dcss_dpr_format_set(struct dcss_soc *dcss, int ch_num, u32 pix_format)
        ch->planes = drm_format_num_planes(pix_format);
        ch->bpp = dcss_dpr_get_bpp(pix_format);
        ch->pix_format = pix_format;
+       ch->use_dtrc = modifiers_present;
 
        dev_dbg(dcss->dev, "pix_format = %s, colorspace = %d, bpp = %d\n",
                drm_get_format_name(pix_format, &format_name), dcss_cs, ch->bpp);
index e3fb232..8ddd427 100644 (file)
 #define DCSS_DTRC_SUVSEA                       0x20
 #define DCSS_DTRC_CROPORIG                     0x24
 #define DCSS_DTRC_CROPSIZE                     0x28
+#define   CROP_HEIGHT_POS                      16
+#define   CROP_HEIGHT_MASK                     GENMASK(28, 16)
+#define   CROP_WIDTH_POS                       0
+#define   CROP_WIDTH_MASK                      GENMASK(12, 0)
 #define DCSS_DTRC_DCTL                         0x2C
 #define   CROPPING_EN                          BIT(18)
 #define   COMPRESSION_DIS                      BIT(17)
@@ -300,28 +304,8 @@ void dcss_dtrc_addr_set(struct dcss_soc *dcss, int ch_num, u32 p1_ba, u32 p2_ba,
        dcss_dtrc_write(dtrc, ch_num, p1_ba, DTRC_F1_OFS + DCSS_DTRC_DYDSADDR);
        dcss_dtrc_write(dtrc, ch_num, p2_ba, DTRC_F1_OFS + DCSS_DTRC_DCDSADDR);
 
-       if (!ch->running) {
-               dcss_dtrc_write(dtrc, ch_num, p1_ba, DCSS_DTRC_SYSSA);
-               dcss_dtrc_write(dtrc, ch_num, p1_ba + ch->xres * ch->yres,
-                               DCSS_DTRC_SYSEA);
-
-               dcss_dtrc_write(dtrc, ch_num, p2_ba, DCSS_DTRC_SUVSSA);
-               dcss_dtrc_write(dtrc, ch_num, p2_ba + ch->xres * ch->yres / 2,
-                               DCSS_DTRC_SUVSEA);
-
-               dcss_dtrc_write(dtrc, ch_num, p1_ba,
-                               DTRC_F1_OFS + DCSS_DTRC_SYSSA);
-               dcss_dtrc_write(dtrc, ch_num, p1_ba + ch->xres * ch->yres,
-                               DTRC_F1_OFS + DCSS_DTRC_SYSEA);
-
-               dcss_dtrc_write(dtrc, ch_num, p2_ba,
-                               DTRC_F1_OFS + DCSS_DTRC_SUVSSA);
-               dcss_dtrc_write(dtrc, ch_num, p2_ba + ch->xres * ch->yres / 2,
-                               DTRC_F1_OFS + DCSS_DTRC_SUVSEA);
-
-               ch->y_dec_ofs = dec_table_ofs & 0xFFFFFFFF;
-               ch->uv_dec_ofs = dec_table_ofs >> 32;
-       }
+       ch->y_dec_ofs = dec_table_ofs & 0xFFFFFFFF;
+       ch->uv_dec_ofs = dec_table_ofs >> 32;
 
        dcss_dtrc_write(dtrc, ch_num,
                p1_ba + ch->y_dec_ofs, DCSS_DTRC_DYTSADDR);
@@ -336,12 +320,15 @@ void dcss_dtrc_addr_set(struct dcss_soc *dcss, int ch_num, u32 p1_ba, u32 p2_ba,
 }
 EXPORT_SYMBOL(dcss_dtrc_addr_set);
 
-void dcss_dtrc_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres)
+void dcss_dtrc_set_res(struct dcss_soc *dcss, int ch_num, struct drm_rect *src,
+                      struct drm_rect *old_src)
 {
        struct dcss_dtrc_priv *dtrc = dcss->dtrc_priv;
        struct dcss_dtrc_ch *ch;
        u32 frame_height, frame_width;
+       u32 crop_w, crop_h, crop_orig_w, crop_orig_h;
        int bank;
+       u32 old_xres, old_yres, xres, yres;
 
        if (ch_num == 0)
                return;
@@ -349,19 +336,83 @@ void dcss_dtrc_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres)
        ch_num -= 1;
 
        ch = &dtrc->ch[ch_num];
+
        bank = dcss_readl(ch->base_reg + DCSS_DTRC_DTCTRL) >> 31;
 
-       ch->xres = xres;
-       ch->yres = yres;
+       old_xres = old_src->x2 - old_src->x1;
+       old_yres = old_src->y2 - old_src->y1;
+       xres = src->x2 - src->x1;
+       yres = src->y2 - src->y1;
 
-       frame_height = ((yres >> 3) << FRAME_HEIGHT_POS) & FRAME_HEIGHT_MASK;
-       frame_width = ((xres >> 3) << FRAME_WIDTH_POS) & FRAME_WIDTH_MASK;
+       frame_height = ((old_yres >> 3) << FRAME_HEIGHT_POS) & FRAME_HEIGHT_MASK;
+       frame_width = ((old_xres >> 3) << FRAME_WIDTH_POS) & FRAME_WIDTH_MASK;
 
        dcss_dtrc_write(dcss->dtrc_priv, ch_num, frame_height | frame_width,
                        DTRC_F1_OFS * bank + DCSS_DTRC_SIZE);
 
        dcss_dtrc_write(dcss->dtrc_priv, ch_num, frame_height | frame_width,
                        DTRC_F1_OFS * (bank ^ 1) + DCSS_DTRC_SIZE);
+
+       /*
+        * Image original size is aligned:
+        *   - 128 pixels for width;
+        *   - 8 lines for height;
+        */
+       if (xres == old_xres && !(xres & 0x7f) &&
+           yres == old_yres && !(yres & 0xf)) {
+               ch->dctl &= ~CROPPING_EN;
+               goto exit;
+       }
+
+       /* align the image size */
+       xres = (xres + 0x7f) & ~0x7f;
+       yres = (yres + 0xf) & ~0xf;
+
+       src->x1 &= ~1;
+       src->x2 &= ~1;
+
+       crop_orig_w = (src->x1 << CROP_WIDTH_POS) & CROP_WIDTH_MASK;
+       crop_orig_h = (src->y1 << CROP_HEIGHT_POS) & CROP_HEIGHT_MASK;
+
+       dcss_dtrc_write(dcss->dtrc_priv, ch_num, crop_orig_w | crop_orig_h,
+                       DCSS_DTRC_CROPORIG);
+       dcss_dtrc_write(dcss->dtrc_priv, ch_num, crop_orig_w | crop_orig_h,
+                       DTRC_F1_OFS + DCSS_DTRC_CROPORIG);
+
+       crop_w = (xres << CROP_WIDTH_POS) & CROP_WIDTH_MASK;
+       crop_h = (yres << CROP_HEIGHT_POS) & CROP_HEIGHT_MASK;
+
+       dcss_dtrc_write(dcss->dtrc_priv, ch_num, crop_w | crop_h,
+                       DTRC_F1_OFS * bank + DCSS_DTRC_CROPSIZE);
+       dcss_dtrc_write(dcss->dtrc_priv, ch_num, crop_w | crop_h,
+                       DTRC_F1_OFS * (bank ^ 1) + DCSS_DTRC_CROPSIZE);
+
+       ch->dctl |= CROPPING_EN;
+
+exit:
+       dcss_dtrc_write(dtrc, ch_num, xres * yres,
+                       DCSS_DTRC_SYSEA);
+       dcss_dtrc_write(dtrc, ch_num, xres * yres,
+                       DTRC_F1_OFS + DCSS_DTRC_SYSEA);
+
+       dcss_dtrc_write(dtrc, ch_num, 0x10000000 + xres * yres / 2,
+                       DCSS_DTRC_SUVSEA);
+       dcss_dtrc_write(dtrc, ch_num, 0x10000000 + xres * yres / 2,
+                       DTRC_F1_OFS + DCSS_DTRC_SUVSEA);
+
+       src->x2 = src->x1 + xres;
+       src->y2 = src->y1 + yres;
+
+       if (ch->running)
+               return;
+
+       dcss_dtrc_write(dtrc, ch_num, 0x0, DCSS_DTRC_SYSSA);
+       dcss_dtrc_write(dtrc, ch_num, 0x0,
+                       DTRC_F1_OFS + DCSS_DTRC_SYSSA);
+
+       dcss_dtrc_write(dtrc, ch_num, 0x10000000, DCSS_DTRC_SUVSSA);
+       dcss_dtrc_write(dtrc, ch_num, 0x10000000,
+                       DTRC_F1_OFS + DCSS_DTRC_SUVSSA);
 }
 EXPORT_SYMBOL(dcss_dtrc_set_res);
 
@@ -410,7 +461,9 @@ void dcss_dtrc_enable(struct dcss_soc *dcss, int ch_num, bool enable)
 
        curr_frame = dcss_readl(ch->base_reg + DCSS_DTRC_DTCTRL) >> 31;
 
-       fdctl = PIX_DEPTH_8BIT_EN;
+       fdctl = ch->dctl & ~(PIX_DEPTH_8BIT_EN | COMPRESSION_DIS);
+
+       fdctl |= PIX_DEPTH_8BIT_EN;
 
        if (ch->format_modifier != DRM_FORMAT_MOD_VSI_G2_TILED_COMPRESSED)
                fdctl |= COMPRESSION_DIS;
@@ -464,10 +517,10 @@ static void dcss_dtrc_ch_switch_banks(struct dcss_dtrc_priv *dtrc, int dtrc_ch)
        if (!ch->running)
                return;
 
-       ch->curr_frame ^= 1;
+       ch->curr_frame = dcss_readl(ch->base_reg + DCSS_DTRC_DTCTRL) >> 31;
 
        dcss_dtrc_write_irqsafe(dtrc, dtrc_ch, ch->dctl | CONFIG_READY,
-                               ch->curr_frame * DTRC_F1_OFS + DCSS_DTRC_DCTL);
+                               (ch->curr_frame ^ 1) * DTRC_F1_OFS + DCSS_DTRC_DCTL);
 }
 
 void dcss_dtrc_switch_banks(struct dcss_soc *dcss)
index 4c5bd0c..bb48b3c 100644 (file)
@@ -17,6 +17,7 @@
 
 #include <linux/types.h>
 #include <video/videomode.h>
+#include <drm/drm_rect.h>
 
 struct dcss_soc;
 
@@ -48,11 +49,13 @@ enum dcss_pix_size {
        PIX_SIZE_32,
 };
 
-void dcss_dpr_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres);
+void dcss_dpr_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres,
+                     u32 adj_w, u32 adj_h);
 void dcss_dpr_addr_set(struct dcss_soc *dcss, int ch_num, u32 luma_base_addr,
                       u32 chroma_base_addr, u16 pitch);
 void dcss_dpr_enable(struct dcss_soc *dcss, int ch_num, bool en);
-void dcss_dpr_format_set(struct dcss_soc *dcss, int ch_num, u32 pix_format);
+void dcss_dpr_format_set(struct dcss_soc *dcss, int ch_num, u32 pix_format,
+                        bool modifiers_present);
 void dcss_dpr_tile_derive(struct dcss_soc *dcss,
                          int ch_num,
                          uint64_t modifier);
@@ -94,7 +97,8 @@ void dcss_hdr10_pipe_csc_setup(struct dcss_soc *dcss, int ch_num,
 
 /* DTRC */
 void dcss_dtrc_bypass(struct dcss_soc *dcss, int ch_num);
-void dcss_dtrc_set_res(struct dcss_soc *dcss, int ch_num, u32 xres, u32 yres);
+void dcss_dtrc_set_res(struct dcss_soc *dcss, int ch_num, struct drm_rect *src,
+                      struct drm_rect *old_src);
 void dcss_dtrc_addr_set(struct dcss_soc *dcss, int ch_num, u32 p1_ba, u32 p2_ba,
                        uint64_t dec_table_ofs);
 void dcss_dtrc_enable(struct dcss_soc *dcss, int ch_num, bool enable);