On Wed, Jun 23, 2010 at 07:18:00AM +0200, ext Nagarajan, Rajkumar wrote:
> 
> DISPC DMA optimization has been enabled and vrfb calls changed as required.
> Optimization reduces the memory traffic (DDR memory) when rotation is set
> to 90- and 270- degree and SMS-VRFB rotation engine is used.
> 
> With this change,
> L3 interconnect traffic is reduced by a factor 2x for YUV422 & UYVY
> DDR memory traffic is reduced by a factor 2x for YUV422 & UYVY.
> 
> Signed-off-by: Mukund Mittal <mmit...@ti.com>
> Signed-off-by: Kishore Y <kishor...@ti.com>
> Signed-off-by: Rajkumar N <rajkumar.nagara...@ti.com>
> ---
>  arch/arm/plat-omap/include/plat/vrfb.h   |    6 +++-
>  drivers/media/video/omap/omap_vout.c     |    2 +-
>  drivers/video/omap2/dss/dispc.c          |   39 
> +++++++++++++++++++++++-------
>  drivers/video/omap2/omapfb/omapfb-main.c |    2 +-
>  drivers/video/omap2/vrfb.c               |   18 ++++++++++---
>  5 files changed, 50 insertions(+), 17 deletions(-)
> 
> diff --git a/arch/arm/plat-omap/include/plat/vrfb.h 
> b/arch/arm/plat-omap/include/plat/vrfb.h
> index d8a03ce..fba9ecd 100644
> --- a/arch/arm/plat-omap/include/plat/vrfb.h
> +++ b/arch/arm/plat-omap/include/plat/vrfb.h
> @@ -23,6 +23,8 @@
>  
>  #define OMAP_VRFB_LINE_LEN 2048
>  
> +#include <plat/display.h>
> +
>  struct vrfb {
>       u8 context;
>       void __iomem *vaddr[4];
> @@ -42,8 +44,8 @@ extern void omap_vrfb_adjust_size(u16 *width, u16 *height,
>  extern u32 omap_vrfb_min_phys_size(u16 width, u16 height, u8 bytespp);
>  extern u16 omap_vrfb_max_height(u32 phys_size, u16 width, u8 bytespp);
>  extern void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
> -             u16 width, u16 height,
> -             unsigned bytespp, bool yuv_mode);
> +             u16 width, u16 height, unsigned bytespp,
> +             enum omap_color_mode color_mode, int rotation);
>  extern int omap_vrfb_map_angle(struct vrfb *vrfb, u16 height, u8 rot);
>  extern void omap_vrfb_restore_context(void);
>  
> diff --git a/drivers/media/video/omap/omap_vout.c 
> b/drivers/media/video/omap/omap_vout.c
> index b74884b..b3f94ca 100644
> --- a/drivers/media/video/omap/omap_vout.c
> +++ b/drivers/media/video/omap/omap_vout.c
> @@ -465,7 +465,7 @@ static int omap_vout_vrfb_buffer_setup(struct 
> omap_vout_device *vout,
>       for (i = 0; i < *count; i++)
>               omap_vrfb_setup(&vout->vrfb_context[i],
>                               vout->smsshado_phy_addr[i], vout->pix.width,
> -                             vout->pix.height, vout->bpp, yuv_mode);
> +                             vout->pix.height, vout->bpp, vout->dss_mode, 
> vout->rotation);
>  
>       return 0;
>  }
> diff --git a/drivers/video/omap2/dss/dispc.c b/drivers/video/omap2/dss/dispc.c
> index e777e35..cb8eba4 100644
> --- a/drivers/video/omap2/dss/dispc.c
> +++ b/drivers/video/omap2/dss/dispc.c
> @@ -1059,12 +1059,16 @@ static void _dispc_set_vid_accu1(enum omap_plane 
> plane, int haccu, int vaccu)
>       dispc_write_reg(ac1_reg[plane-1], val);
>  }
>  
> +static void _dispc_set_vdma_attrs(enum omap_plane plane, bool enable)
> +{
> +       REG_FLD_MOD(dispc_reg_att[plane], enable ? 1 : 0, 20, 20);
> +}
>  
>  static void _dispc_set_scaling(enum omap_plane plane,
>               u16 orig_width, u16 orig_height,
>               u16 out_width, u16 out_height,
>               bool ilace, bool five_taps,
> -             bool fieldmode)
> +             bool fieldmode, bool vdma)
>  {
>       int fir_hinc;
>       int fir_vinc;
> @@ -1080,12 +1084,12 @@ static void _dispc_set_scaling(enum omap_plane plane,
>  
>       _dispc_set_scale_coef(plane, hscaleup, vscaleup, five_taps);
>  
> -     if (!orig_width || orig_width == out_width)
> +     if (!orig_width || (!vdma && (orig_width == out_width)))
>               fir_hinc = 0;
>       else
>               fir_hinc = 1024 * orig_width / out_width;
>  
> -     if (!orig_height || orig_height == out_height)
> +     if (!orig_height || (!vdma && (orig_height == out_height)))
>               fir_vinc = 0;
>       else
>               fir_vinc = 1024 * orig_height / out_height;
> @@ -1164,10 +1168,6 @@ static void _dispc_set_rotation_attrs(enum omap_plane 
> plane, u8 rotation,
>  
>               REG_FLD_MOD(dispc_reg_att[plane], vidrot, 13, 12);
>  
> -             if (rotation == OMAP_DSS_ROT_90 || rotation == OMAP_DSS_ROT_270)
> -                     REG_FLD_MOD(dispc_reg_att[plane], 0x1, 18, 18);
> -             else
> -                     REG_FLD_MOD(dispc_reg_att[plane], 0x0, 18, 18);

So VIDROWREPEAT is supposed to be off when vid DMA optimization is on?
There's no mention of that in the TRM.

>       } else {
>               REG_FLD_MOD(dispc_reg_att[plane], 0, 13, 12);
>               REG_FLD_MOD(dispc_reg_att[plane], 0, 18, 18);
> @@ -1504,6 +1504,17 @@ static unsigned long calc_fclk(u16 width, u16 height,
>       return dispc_pclk_rate() * vf * hf;
>  }
>  
> +static int dispc_is_vdma_req(u8 rotation, enum omap_color_mode color_mode)
> +{
> +/* TODO: VDMA support for RGB16 mode */
> +     if (cpu_is_omap3630())

Is video DMA optimization broken on 34xx? I tried to enable it on a 3430
at some point but didn't see any obvious improvement. However the 34xx
TRM didn't say anything about 5-tap so perhaps it just didn't actually
do anything.

> +             if ((color_mode == OMAP_DSS_COLOR_YUV2) ||
> +                     (color_mode == OMAP_DSS_COLOR_UYVY))
> +                     if ((rotation == 1) || (rotation == 3))
> +                             return true;
> +     return false;
> +}
> +
>  void dispc_set_channel_out(enum omap_plane plane, enum omap_channel 
> channel_out)
>  {
>       enable_clocks(1);
> @@ -1623,6 +1634,8 @@ static int _dispc_setup_plane(enum omap_plane plane,
>                       if (cpu_is_omap34xx() && height > out_height &&
>                                       fclk > dispc_fclk_rate())
>                               five_taps = true;
> +                     if (dispc_is_vdma_req(rotation, color_mode))
> +                             five_taps = true;

Maybe it would make sense to change the code back to trying 5-tap first
and fall back to 3-tap if the required clock is too high?

>               }
>  
>               if (width > (2048 >> five_taps)) {
> @@ -1694,9 +1707,17 @@ static int _dispc_setup_plane(enum omap_plane plane,
>       _dispc_set_pic_size(plane, width, height);
>  
>       if (plane != OMAP_DSS_GFX) {
> -             _dispc_set_scaling(plane, width, height,
> +             if (dispc_is_vdma_req(rotation, color_mode)) {
> +                     _dispc_set_scaling(plane, width, height,
>                                  out_width, out_height,
> -                                ilace, five_taps, fieldmode);
> +                                ilace, five_taps, fieldmode, 1);
> +                     _dispc_set_vdma_attrs(plane, 1);
> +             } else {
> +                     _dispc_set_scaling(plane, width, height,
> +                                out_width, out_height,
> +                                ilace, five_taps, fieldmode, 0);
> +                     _dispc_set_vdma_attrs(plane, 0);
> +             }

Less copy-pasting:

bool vdma = dispc_is_vdma_req();

_dispc_set_scaling(..., vdma);
_dispc_set_vdma_attrs(..., vdma);


>               _dispc_set_vid_size(plane, out_width, out_height);
>               _dispc_set_vid_color_conv(plane, cconv);
>       }
> diff --git a/drivers/video/omap2/omapfb/omapfb-main.c 
> b/drivers/video/omap2/omapfb/omapfb-main.c
> index 73ecc9f..33fd427 100644
> --- a/drivers/video/omap2/omapfb/omapfb-main.c
> +++ b/drivers/video/omap2/omapfb/omapfb-main.c
> @@ -552,7 +552,7 @@ static int setup_vrfb_rotation(struct fb_info *fbi)
>       omap_vrfb_setup(&rg->vrfb, rg->paddr,
>                       var->xres_virtual,
>                       var->yres_virtual,
> -                     bytespp, yuv_mode);
> +                     bytespp, mode, 0);
>  
>       /* Now one can ioremap the 0 angle view */
>       r = omap_vrfb_map_angle(vrfb, var->yres_virtual, 0);
> diff --git a/drivers/video/omap2/vrfb.c b/drivers/video/omap2/vrfb.c
> index fd22716..38d03d1 100644
> --- a/drivers/video/omap2/vrfb.c
> +++ b/drivers/video/omap2/vrfb.c
> @@ -157,7 +157,7 @@ EXPORT_SYMBOL(omap_vrfb_max_height);
>  
>  void omap_vrfb_setup(struct vrfb *vrfb, unsigned long paddr,
>               u16 width, u16 height,
> -             unsigned bytespp, bool yuv_mode)
> +             unsigned bytespp, enum omap_color_mode color_mode, int rotation)
>  {
>       unsigned pixel_size_exp;
>       u16 vrfb_width;
> @@ -167,11 +167,12 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long 
> paddr,
>       u32 control;
>  
>       DBG("omapfb_set_vrfb(%d, %lx, %dx%d, %d, %d)\n", ctx, paddr,
> -                     width, height, bytespp, yuv_mode);
> +                     width, height, bytespp, color_mode);
>  
>       /* For YUV2 and UYVY modes VRFB needs to handle pixels a bit
>        * differently. See TRM. */
> -     if (yuv_mode) {
> +     if (color_mode == OMAP_DSS_COLOR_YUV2 ||
> +                     color_mode == OMAP_DSS_COLOR_UYVY) {
>               bytespp *= 2;
>               width /= 2;
>       }
> @@ -183,6 +184,13 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long 
> paddr,
>       else
>               BUG();
>  
> +     /* for vdma */
> +     /* TODO: VDMA support for RGB16 mode */
> +     if (cpu_is_omap3630())
> +             if (color_mode == OMAP_DSS_COLOR_YUV2)
> +                     if ((rotation == 1) || (rotation == 3))
> +                             pixel_size_exp = 2;
> +

where did UYVY go? Also what's this supposed to do? pixel_size_exp will
be to 2 for YUV anyway.

>       vrfb_width = ALIGN(width * bytespp, VRFB_PAGE_WIDTH) / bytespp;
>       vrfb_height = ALIGN(height, VRFB_PAGE_HEIGHT);
>  
> @@ -211,7 +219,9 @@ void omap_vrfb_setup(struct vrfb *vrfb, unsigned long 
> paddr,
>       vrfb->xoffset = vrfb_width - width;
>       vrfb->yoffset = vrfb_height - height;
>       vrfb->bytespp = bytespp;
> -     vrfb->yuv_mode = yuv_mode;
> +     if (color_mode == OMAP_DSS_COLOR_YUV2 ||
> +                     color_mode == OMAP_DSS_COLOR_UYVY)
> +             vrfb->yuv_mode = true;
>  }
>  EXPORT_SYMBOL(omap_vrfb_setup);
>  
> -- 
> 1.5.4.3
> --
> To unsubscribe from this list: send the line "unsubscribe linux-fbdev" in
> the body of a message to majord...@vger.kernel.org
> More majordomo info at  http://vger.kernel.org/majordomo-info.html

-- 
Ville Syrjälä
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to