From: Jason Hu <[email protected]> Video Overlay: Query overlay status register to make sure overlay OVADD register write to sync with the next vblank
Signed-off-by: Jason Hu <[email protected]> Signed-off-by: Hitesh K. Patel <[email protected]> --- drivers/staging/mrst/drv/psb_drm.h | 1 + drivers/staging/mrst/drv/psb_drv.c | 13 +++++++++++-- drivers/staging/mrst/drv/psb_intel_reg.h | 2 ++ 3 files changed, 14 insertions(+), 2 deletions(-) diff --git a/drivers/staging/mrst/drv/psb_drm.h b/drivers/staging/mrst/drv/psb_drm.h index a24e272..9f4a67b 100644 --- a/drivers/staging/mrst/drv/psb_drm.h +++ b/drivers/staging/mrst/drv/psb_drm.h @@ -594,6 +594,7 @@ struct drm_psb_register_rw_arg { uint32_t IEP_ENABLED; uint32_t IEP_BLE_MINMAX; uint32_t IEP_BSSCC_CONTROL; + uint32_t b_wait_vblank; } overlay; uint32_t sprite_enable_mask; diff --git a/drivers/staging/mrst/drv/psb_drv.c b/drivers/staging/mrst/drv/psb_drv.c index 545cc39..87af1d7 100644 --- a/drivers/staging/mrst/drv/psb_drv.c +++ b/drivers/staging/mrst/drv/psb_drv.c @@ -2311,6 +2311,11 @@ static int psb_register_rw_ioctl(struct drm_device *dev, void *data, { PSB_WVDC32(arg->overlay.OVADD, OV_OVADD); + if (arg->overlay.b_wait_vblank) { + while (!(PSB_RVDC32(OV_DOVASTA) & (0x1 << 31))) + cpu_relax(); + } + if (IS_MDFLD(dev)) { if ((((arg->overlay.OVADD & OV_PIPE_SELECT) >> OV_PIPE_SELECT_POS) == OV_PIPE_A) && (!(dev_priv->dsr_fb_update & MDFLD_DSR_OVERLAY_0))) { @@ -2347,9 +2352,13 @@ static int psb_register_rw_ioctl(struct drm_device *dev, void *data, } } } - if (arg->overlay_write_mask & OVC_REGRWBITS_OVADD) + if (arg->overlay_write_mask & OVC_REGRWBITS_OVADD) { PSB_WVDC32(arg->overlay.OVADD, OVC_OVADD); - + if (arg->overlay.b_wait_vblank) { + while (!(PSB_RVDC32(OV_DOVASTA) & (0x1 << 31))) + cpu_relax(); + } + } ospm_power_using_hw_end(OSPM_DISPLAY_ISLAND); } else { if (arg->overlay_write_mask & OV_REGRWBITS_OGAM_ALL) { diff --git a/drivers/staging/mrst/drv/psb_intel_reg.h b/drivers/staging/mrst/drv/psb_intel_reg.h index c192b1b..c95da7d 100644 --- a/drivers/staging/mrst/drv/psb_intel_reg.h +++ b/drivers/staging/mrst/drv/psb_intel_reg.h @@ -566,6 +566,7 @@ struct dpst_guardband { */ #define OV_C_OFFSET 0x08000 #define OV_OVADD 0x30000 +#define OV_DOVASTA 0x30008 # define OV_PIPE_SELECT (BIT6|BIT7) # define OV_PIPE_SELECT_POS 6 # define OV_PIPE_A 0 @@ -577,6 +578,7 @@ struct dpst_guardband { #define OV_OGAMC1 0x30020 #define OV_OGAMC0 0x30024 #define OVC_OVADD 0x38000 +#define OVC_DOVCSTA 0x38008 #define OVC_OGAMC5 0x38010 #define OVC_OGAMC4 0x38014 #define OVC_OGAMC3 0x38018 -- 1.7.1 _______________________________________________ MeeGo-kernel mailing list [email protected] http://lists.meego.com/listinfo/meego-kernel
