RE: [PATCH v3 3/3] OMAPDSS/OMAP_VOUT: Fix incorrect OMAP3-alpha compatibility setting

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 




Thanks,
Vaibhav

> -----Original Message-----
> From: Taneja, Archit
> Sent: Monday, September 26, 2011 12:04 PM
> To: Hiremath, Vaibhav
> Cc: Valkeinen, Tomi; linux-omap@xxxxxxxxxxxxxxx; Semwal, Sumit; Taneja,
> Archit; linux-media@xxxxxxxxxxxxxxx; Molnar, Lajos
> Subject: [PATCH v3 3/3] OMAPDSS/OMAP_VOUT: Fix incorrect OMAP3-alpha
> compatibility setting
>
> On OMAP3, in order to enable alpha blending for LCD and TV managers, we
> needed
> to set LCDALPHABLENDERENABLE/TVALPHABLENDERENABLE bits in DISPC_CONFIG. On
> OMAP4, alpha blending is always enabled by default, if the above bits are
> set,
> we switch to an OMAP3 compatibility mode where the zorder values in the
> pipeline
> attribute registers are ignored and a fixed priority is configured.
>
> Rename the manager_info member "alpha_enabled" to "partial_alpha_enabled"
> for
> more clarity. Introduce two dss_features FEAT_ALPHA_FIXED_ZORDER and
> FEAT_ALPHA_FREE_ZORDER which represent OMAP3-alpha compatibility mode and
> OMAP4
> alpha mode respectively. Introduce an overlay cap for ZORDER. The DSS2
> user is
> expected to check for the ZORDER cap, if an overlay doesn't have this cap,
> the
> user is expected to set the parameter partial_alpha_enabled. If the
> overlay has
> ZORDER cap, the DSS2 user can assume that alpha blending is already
> enabled.
>
> Don't support OMAP3 compatibility mode for now. Trying to read/write to
> alpha_blending_enabled sysfs attribute issues a warning for OMAP4 and does
> not
> set the LCDALPHABLENDERENABLE/TVALPHABLENDERENABLE bits.
>
> Change alpha_enabled to partial_alpha_enabled in the omap_vout driver. Use
> overlay cap "OMAP_DSS_OVL_CAP_GLOBAL_ALPHA" to check if overlay supports
> alpha
> blending or not. Replace this with checks for VIDEO1 pipeline.
>
> Cc: linux-media@xxxxxxxxxxxxxxx
> Cc: Lajos Molnar <molnar@xxxxxx>
> Signed-off-by: Archit Taneja <archit@xxxxxx>
> ---
> Changes in v3:
> - Fix some spelling mistakes in commit message.
> - Add comment about video1 limitation in omap_vout .
>
>  drivers/media/video/omap/omap_vout.c   |   17 ++++++++++++-----
>  drivers/video/omap2/dss/dispc.c        |   24 ++++++++++++------------
>  drivers/video/omap2/dss/dss.h          |    4 ++--
>  drivers/video/omap2/dss/dss_features.c |   22 +++++++++++-----------
>  drivers/video/omap2/dss/dss_features.h |    3 ++-
>  drivers/video/omap2/dss/manager.c      |   28 +++++++++++++++++++--------
> -
>  include/video/omapdss.h                |    3 ++-
>  7 files changed, 60 insertions(+), 41 deletions(-)
>
Accked-by: Vaibhav Hiremath <hvaibhav@xxxxxx>


Thanks,
Vaibhav

> diff --git a/drivers/media/video/omap/omap_vout.c
> b/drivers/media/video/omap/omap_vout.c
> index b3a5ecd..d9e64f3 100644
> --- a/drivers/media/video/omap/omap_vout.c
> +++ b/drivers/media/video/omap/omap_vout.c
> @@ -1165,12 +1165,17 @@ static int vidioc_try_fmt_vid_overlay(struct file
> *file, void *fh,
>  {
>       int ret = 0;
>       struct omap_vout_device *vout = fh;
> +     struct omap_overlay *ovl;
> +     struct omapvideo_info *ovid;
>       struct v4l2_window *win = &f->fmt.win;
>
> +     ovid = &vout->vid_info;
> +     ovl = ovid->overlays[0];
> +
>       ret = omap_vout_try_window(&vout->fbuf, win);
>
>       if (!ret) {
> -             if (vout->vid == OMAP_VIDEO1)
> +             if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0)
>                       win->global_alpha = 255;
>               else
>                       win->global_alpha = f->fmt.win.global_alpha;
> @@ -1194,8 +1199,8 @@ static int vidioc_s_fmt_vid_overlay(struct file
> *file, void *fh,
>
>       ret = omap_vout_new_window(&vout->crop, &vout->win, &vout->fbuf,
> win);
>       if (!ret) {
> -             /* Video1 plane does not support global alpha */
> -             if (ovl->id == OMAP_DSS_VIDEO1)
> +             /* Video1 plane does not support global alpha on OMAP3 */
> +             if ((ovl->caps & OMAP_DSS_OVL_CAP_GLOBAL_ALPHA) == 0)
>                       vout->win.global_alpha = 255;
>               else
>                       vout->win.global_alpha = f->fmt.win.global_alpha;
> @@ -1788,7 +1793,9 @@ static int vidioc_s_fbuf(struct file *file, void *fh,
>       if (ovl->manager && ovl->manager->get_manager_info &&
>                       ovl->manager->set_manager_info) {
>               ovl->manager->get_manager_info(ovl->manager, &info);
> -             info.alpha_enabled = enable;
> +             /* enable this only if there is no zorder cap */
> +             if ((ovl->caps & OMAP_DSS_OVL_CAP_ZORDER) == 0)
> +                     info.partial_alpha_enabled = enable;
>               if (ovl->manager->set_manager_info(ovl->manager, &info))
>                       return -EINVAL;
>       }
> @@ -1820,7 +1827,7 @@ static int vidioc_g_fbuf(struct file *file, void *fh,
>       }
>       if (ovl->manager && ovl->manager->get_manager_info) {
>               ovl->manager->get_manager_info(ovl->manager, &info);
> -             if (info.alpha_enabled)
> +             if (info.partial_alpha_enabled)
>                       a->flags |= V4L2_FBUF_FLAG_LOCAL_ALPHA;
>       }
>
> diff --git a/drivers/video/omap2/dss/dispc.c
> b/drivers/video/omap2/dss/dispc.c
> index 5e6849e..e0639d3 100644
> --- a/drivers/video/omap2/dss/dispc.c
> +++ b/drivers/video/omap2/dss/dispc.c
> @@ -179,7 +179,8 @@ static void dispc_save_context(void)
>       SR(CONTROL);
>       SR(CONFIG);
>       SR(LINE_NUMBER);
> -     if (dss_has_feature(FEAT_GLOBAL_ALPHA))
> +     if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) ||
> +                     dss_has_feature(FEAT_ALPHA_FREE_ZORDER))
>               SR(GLOBAL_ALPHA);
>       if (dss_has_feature(FEAT_MGR_LCD2)) {
>               SR(CONTROL2);
> @@ -293,7 +294,8 @@ static void dispc_restore_context(void)
>       /*RR(CONTROL);*/
>       RR(CONFIG);
>       RR(LINE_NUMBER);
> -     if (dss_has_feature(FEAT_GLOBAL_ALPHA))
> +     if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) ||
> +                     dss_has_feature(FEAT_ALPHA_FREE_ZORDER))
>               RR(GLOBAL_ALPHA);
>       if (dss_has_feature(FEAT_MGR_LCD2))
>               RR(CONFIG2);
> @@ -2159,38 +2161,35 @@ void dispc_mgr_enable_trans_key(enum omap_channel
> ch, bool enable)
>       else /* OMAP_DSS_CHANNEL_LCD2 */
>               REG_FLD_MOD(DISPC_CONFIG2, enable, 10, 10);
>  }
> -void dispc_mgr_enable_alpha_blending(enum omap_channel ch, bool enable)
> +
> +void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, bool
> enable)
>  {
> -     if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
> +     if (!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER))
>               return;
>
>       if (ch == OMAP_DSS_CHANNEL_LCD)
>               REG_FLD_MOD(DISPC_CONFIG, enable, 18, 18);
>       else if (ch == OMAP_DSS_CHANNEL_DIGIT)
>               REG_FLD_MOD(DISPC_CONFIG, enable, 19, 19);
> -     else /* OMAP_DSS_CHANNEL_LCD2 */
> -             REG_FLD_MOD(DISPC_CONFIG2, enable, 18, 18);
>  }
> -bool dispc_mgr_alpha_blending_enabled(enum omap_channel ch)
> +
> +bool dispc_mgr_alpha_fixed_zorder_enabled(enum omap_channel ch)
>  {
>       bool enabled;
>
> -     if (!dss_has_feature(FEAT_GLOBAL_ALPHA))
> +     if (!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER))
>               return false;
>
>       if (ch == OMAP_DSS_CHANNEL_LCD)
>               enabled = REG_GET(DISPC_CONFIG, 18, 18);
>       else if (ch == OMAP_DSS_CHANNEL_DIGIT)
>               enabled = REG_GET(DISPC_CONFIG, 19, 19);
> -     else if (ch == OMAP_DSS_CHANNEL_LCD2)
> -             enabled = REG_GET(DISPC_CONFIG2, 18, 18);
>       else
>               BUG();
>
>       return enabled;
>  }
>
> -
>  bool dispc_mgr_trans_key_enabled(enum omap_channel ch)
>  {
>       bool enabled;
> @@ -2603,7 +2602,8 @@ void dispc_dump_regs(struct seq_file *s)
>       DUMPREG(DISPC_CAPABLE);
>       DUMPREG(DISPC_LINE_STATUS);
>       DUMPREG(DISPC_LINE_NUMBER);
> -     if (dss_has_feature(FEAT_GLOBAL_ALPHA))
> +     if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER) ||
> +                     dss_has_feature(FEAT_ALPHA_FREE_ZORDER))
>               DUMPREG(DISPC_GLOBAL_ALPHA);
>       if (dss_has_feature(FEAT_MGR_LCD2)) {
>               DUMPREG(DISPC_CONTROL2);
> diff --git a/drivers/video/omap2/dss/dss.h b/drivers/video/omap2/dss/dss.h
> index 47eebd8..a37aef2 100644
> --- a/drivers/video/omap2/dss/dss.h
> +++ b/drivers/video/omap2/dss/dss.h
> @@ -430,9 +430,9 @@ void dispc_mgr_get_trans_key(enum omap_channel ch,
>               enum omap_dss_trans_key_type *type,
>               u32 *trans_key);
>  void dispc_mgr_enable_trans_key(enum omap_channel ch, bool enable);
> -void dispc_mgr_enable_alpha_blending(enum omap_channel ch, bool enable);
> +void dispc_mgr_enable_alpha_fixed_zorder(enum omap_channel ch, bool
> enable);
>  bool dispc_mgr_trans_key_enabled(enum omap_channel ch);
> -bool dispc_mgr_alpha_blending_enabled(enum omap_channel ch);
> +bool dispc_mgr_alpha_fixed_zorder_enabled(enum omap_channel ch);
>  void dispc_mgr_set_lcd_timings(enum omap_channel channel,
>               struct omap_video_timings *timings);
>  void dispc_mgr_set_pol_freq(enum omap_channel channel,
> diff --git a/drivers/video/omap2/dss/dss_features.c
> b/drivers/video/omap2/dss/dss_features.c
> index 47e66d8..70d5b9e 100644
> --- a/drivers/video/omap2/dss/dss_features.c
> +++ b/drivers/video/omap2/dss/dss_features.c
> @@ -248,15 +248,16 @@ static const enum omap_overlay_caps
> omap3630_dss_overlay_caps[] = {
>
>  static const enum omap_overlay_caps omap4_dss_overlay_caps[] = {
>       /* OMAP_DSS_GFX */
> -     OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA,
> +     OMAP_DSS_OVL_CAP_GLOBAL_ALPHA | OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA |
> +             OMAP_DSS_OVL_CAP_ZORDER,
>
>       /* OMAP_DSS_VIDEO1 */
>       OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
> -             OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA,
> +             OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
>
>       /* OMAP_DSS_VIDEO2 */
>       OMAP_DSS_OVL_CAP_SCALE | OMAP_DSS_OVL_CAP_GLOBAL_ALPHA |
> -             OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA,
> +             OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA | OMAP_DSS_OVL_CAP_ZORDER,
>  };
>
>  static const char * const omap2_dss_clk_source_names[] = {
> @@ -342,13 +343,13 @@ static const struct omap_dss_features
> omap3430_dss_features = {
>       .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
>
>       .has_feature    =
> -             FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL |
> +             FEAT_LCDENABLEPOL |
>               FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE |
>               FEAT_FUNCGATED | FEAT_ROWREPEATENABLE |
>               FEAT_LINEBUFFERSPLIT | FEAT_RESIZECONF |
>               FEAT_DSI_PLL_FREQSEL | FEAT_DSI_REVERSE_TXCLKESC |
>               FEAT_VENC_REQUIRES_TV_DAC_CLK | FEAT_CPR | FEAT_PRELOAD |
> -             FEAT_FIR_COEF_V,
> +             FEAT_FIR_COEF_V | FEAT_ALPHA_FIXED_ZORDER,
>
>       .num_mgrs = 2,
>       .num_ovls = 3,
> @@ -366,13 +367,13 @@ static const struct omap_dss_features
> omap3630_dss_features = {
>       .num_reg_fields = ARRAY_SIZE(omap3_dss_reg_fields),
>
>       .has_feature    =
> -             FEAT_GLOBAL_ALPHA | FEAT_LCDENABLEPOL |
> +             FEAT_LCDENABLEPOL |
>               FEAT_LCDENABLESIGNAL | FEAT_PCKFREEENABLE |
>               FEAT_FUNCGATED |
>               FEAT_ROWREPEATENABLE | FEAT_LINEBUFFERSPLIT |
>               FEAT_RESIZECONF | FEAT_DSI_PLL_PWR_BUG |
>               FEAT_DSI_PLL_FREQSEL | FEAT_CPR | FEAT_PRELOAD |
> -             FEAT_FIR_COEF_V,
> +             FEAT_FIR_COEF_V | FEAT_ALPHA_FIXED_ZORDER,
>
>       .num_mgrs = 2,
>       .num_ovls = 3,
> @@ -392,12 +393,12 @@ static const struct omap_dss_features
> omap4430_es1_0_dss_features  = {
>       .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
>
>       .has_feature    =
> -             FEAT_GLOBAL_ALPHA |
>               FEAT_MGR_LCD2 |
>               FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC |
>               FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH |
>               FEAT_DSI_GNQ | FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 |
> -             FEAT_CPR | FEAT_PRELOAD | FEAT_FIR_COEF_V,
> +             FEAT_CPR | FEAT_PRELOAD | FEAT_FIR_COEF_V |
> +             FEAT_ALPHA_FREE_ZORDER,
>
>       .num_mgrs = 3,
>       .num_ovls = 3,
> @@ -416,13 +417,12 @@ static const struct omap_dss_features
> omap4_dss_features = {
>       .num_reg_fields = ARRAY_SIZE(omap4_dss_reg_fields),
>
>       .has_feature    =
> -             FEAT_GLOBAL_ALPHA |
>               FEAT_MGR_LCD2 |
>               FEAT_CORE_CLK_DIV | FEAT_LCD_CLK_SRC |
>               FEAT_DSI_DCS_CMD_CONFIG_VC | FEAT_DSI_VC_OCP_WIDTH |
>               FEAT_DSI_GNQ | FEAT_HDMI_CTS_SWMODE |
>               FEAT_HANDLE_UV_SEPARATE | FEAT_ATTR2 | FEAT_CPR |
> -             FEAT_PRELOAD | FEAT_FIR_COEF_V,
> +             FEAT_PRELOAD | FEAT_FIR_COEF_V | FEAT_ALPHA_FREE_ZORDER,
>
>       .num_mgrs = 3,
>       .num_ovls = 3,
> diff --git a/drivers/video/omap2/dss/dss_features.h
> b/drivers/video/omap2/dss/dss_features.h
> index cd60644..e81271a 100644
> --- a/drivers/video/omap2/dss/dss_features.h
> +++ b/drivers/video/omap2/dss/dss_features.h
> @@ -31,7 +31,6 @@
>
>  /* DSS has feature id */
>  enum dss_feat_id {
> -     FEAT_GLOBAL_ALPHA               = 1 << 0,
>       FEAT_LCDENABLEPOL               = 1 << 3,
>       FEAT_LCDENABLESIGNAL            = 1 << 4,
>       FEAT_PCKFREEENABLE              = 1 << 5,
> @@ -57,6 +56,8 @@ enum dss_feat_id {
>       FEAT_CPR                        = 1 << 23,
>       FEAT_PRELOAD                    = 1 << 24,
>       FEAT_FIR_COEF_V                 = 1 << 25,
> +     FEAT_ALPHA_FIXED_ZORDER         = 1 << 26,
> +     FEAT_ALPHA_FREE_ZORDER          = 1 << 27,
>  };
>
>  /* DSS register field id */
> diff --git a/drivers/video/omap2/dss/manager.c
> b/drivers/video/omap2/dss/manager.c
> index fdbbeeb..6e63845 100644
> --- a/drivers/video/omap2/dss/manager.c
> +++ b/drivers/video/omap2/dss/manager.c
> @@ -249,7 +249,10 @@ static ssize_t manager_trans_key_enabled_store(struct
> omap_overlay_manager *mgr,
>  static ssize_t manager_alpha_blending_enabled_show(
>               struct omap_overlay_manager *mgr, char *buf)
>  {
> -     return snprintf(buf, PAGE_SIZE, "%d\n", mgr->info.alpha_enabled);
> +     WARN_ON(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER));
> +
> +     return snprintf(buf, PAGE_SIZE, "%d\n",
> +             mgr->info.partial_alpha_enabled);
>  }
>
>  static ssize_t manager_alpha_blending_enabled_store(
> @@ -260,13 +263,15 @@ static ssize_t manager_alpha_blending_enabled_store(
>       bool enable;
>       int r;
>
> +     WARN_ON(!dss_has_feature(FEAT_ALPHA_FIXED_ZORDER));
> +
>       r = strtobool(buf, &enable);
>       if (r)
>               return r;
>
>       mgr->get_manager_info(mgr, &info);
>
> -     info.alpha_enabled = enable;
> +     info.partial_alpha_enabled = enable;
>
>       r = mgr->set_manager_info(mgr, &info);
>       if (r)
> @@ -966,7 +971,7 @@ static void configure_manager(enum omap_channel
> channel)
>       dispc_mgr_set_default_color(channel, mi->default_color);
>       dispc_mgr_set_trans_key(channel, mi->trans_key_type, mi->trans_key);
>       dispc_mgr_enable_trans_key(channel, mi->trans_enabled);
> -     dispc_mgr_enable_alpha_blending(channel, mi->alpha_enabled);
> +     dispc_mgr_enable_alpha_fixed_zorder(channel, mi-
> >partial_alpha_enabled);
>       if (dss_has_feature(FEAT_CPR)) {
>               dispc_mgr_enable_cpr(channel, mi->cpr_enable);
>               dispc_mgr_set_cpr_coef(channel, &mi->cpr_coefs);
> @@ -1481,12 +1486,17 @@ static int omap_dss_mgr_apply(struct
> omap_overlay_manager *mgr)
>
>  static int dss_check_manager(struct omap_overlay_manager *mgr)
>  {
> -     /* OMAP supports only graphics source transparency color key and
> alpha
> -      * blending simultaneously. See TRM 15.4.2.4.2.2 Alpha Mode */
> -
> -     if (mgr->info.alpha_enabled && mgr->info.trans_enabled &&
> -                     mgr->info.trans_key_type != OMAP_DSS_COLOR_KEY_GFX_DST)
> -             return -EINVAL;
> +     if (dss_has_feature(FEAT_ALPHA_FIXED_ZORDER)) {
> +             /*
> +              * OMAP3 supports only graphics source transparency color key
> +              * and alpha blending simultaneously. See TRM 15.4.2.4.2.2
> +              * Alpha Mode
> +              */
> +             if (mgr->info.partial_alpha_enabled && mgr->info.trans_enabled
> +                     && mgr->info.trans_key_type !=
> +                             OMAP_DSS_COLOR_KEY_GFX_DST)
> +                     return -EINVAL;
> +     }
>
>       return 0;
>  }
> diff --git a/include/video/omapdss.h b/include/video/omapdss.h
> index c62b9a4..5f0ce5e 100644
> --- a/include/video/omapdss.h
> +++ b/include/video/omapdss.h
> @@ -179,6 +179,7 @@ enum omap_overlay_caps {
>       OMAP_DSS_OVL_CAP_SCALE = 1 << 0,
>       OMAP_DSS_OVL_CAP_GLOBAL_ALPHA = 1 << 1,
>       OMAP_DSS_OVL_CAP_PRE_MULT_ALPHA = 1 << 2,
> +     OMAP_DSS_OVL_CAP_ZORDER = 1 << 3,
>  };
>
>  enum omap_overlay_manager_caps {
> @@ -406,7 +407,7 @@ struct omap_overlay_manager_info {
>       u32 trans_key;
>       bool trans_enabled;
>
> -     bool alpha_enabled;
> +     bool partial_alpha_enabled;
>
>       bool cpr_enable;
>       struct omap_dss_cpr_coefs cpr_coefs;
> --
> 1.7.1

--
To unsubscribe from this list: send the line "unsubscribe linux-media" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html


[Index of Archives]     [Linux Input]     [Video for Linux]     [Gstreamer Embedded]     [Mplayer Users]     [Linux USB Devel]     [Linux Audio Users]     [Linux Kernel]     [Linux SCSI]     [Yosemite Backpacking]
  Powered by Linux