PVRSRV_KERNEL_MEM_INFO *mem_info;
PVRSRV_KERNEL_MEM_INFO *old_mem_info;
u32 tgid;
+ unsigned int sw_dirty;
};
#define to_mfld_overlay(plane) container_of(plane, struct mfld_overlay, base)
wmb();
}
+static void check_dirty_coefs(struct mfld_overlay *ovl, u32 dovsta)
+{
+ /* No pending updates, coefficients have been loaded for sure. */
+ if (dovsta & OVL_DOVSTA_OVR_UPDT)
+ ovl->dirty &= ~OVL_DIRTY_COEFS;
+}
+
static void ovl_commit(struct mfld_overlay *ovl, unsigned int dirty)
{
struct drm_device *dev = ovl->dev;
return;
if (ovl->atomic) {
- spin_lock_irq(&ovl->regs_lock);
- ovl->dirty |= dirty;
- spin_unlock_irq(&ovl->regs_lock);
+ ovl->sw_dirty |= dirty;
return;
}
spin_lock_irq(&ovl->regs_lock);
- /* FIXME cook up something like this when using atomic flips. */
- if (ovl->dirty & OVL_DIRTY_COEFS && !(dirty & OVL_DIRTY_COEFS)) {
- /* No pending updates, coefficients have been loaded for sure. */
- if (OVL_REG_READ(ovl, OVL_DOVSTA) & OVL_DOVSTA_OVR_UPDT)
- ovl->dirty &= ~OVL_DIRTY_COEFS;
- }
+ if ((ovl->dirty & OVL_DIRTY_COEFS) && !(dirty & OVL_DIRTY_COEFS))
+ check_dirty_coefs(ovl, OVL_REG_READ(ovl, OVL_DOVSTA));
/* It's possible that mdfld_overlay_resume() already did this for us. */
if (ovl->dirty & OVL_DIRTY_REGS)
u32 tgid;
struct mfld_overlay_regs regs;
bool vblank_ref;
+ unsigned int dirty;
};
static void ovl_prepare(struct drm_flip *flip)
ovl->curr_page = !ovl->curr_page;
+ ovl->dirty |= oflip->dirty;
+
dovsta = OVL_REG_READ(ovl, OVL_DOVSTA);
+ if ((ovl->dirty & OVL_DIRTY_COEFS) && !(oflip->dirty & OVL_DIRTY_COEFS))
+ check_dirty_coefs(ovl, dovsta);
+
write_ovadd(ovl);
spin_unlock_irqrestore(&ovl->regs_lock, flags);
struct mfld_overlay *ovl = to_mfld_overlay(plane);
struct mfld_overlay_flip *oflip;
- if (ovl->pipe != pipe || !ovl->atomic)
- return NULL;
-
- spin_lock_irq(&ovl->regs_lock);
-
- if (!(ovl->dirty & OVL_DIRTY_REGS)) {
- spin_unlock_irq(&ovl->regs_lock);
+ if (ovl->pipe != pipe || !ovl->atomic || !ovl->sw_dirty)
return NULL;
- }
-
- ovl->dirty &= ~OVL_DIRTY_REGS;
-
- spin_unlock_irq(&ovl->regs_lock);
oflip = kmalloc(sizeof *oflip, GFP_KERNEL);
if (!oflip)
oflip->plane = plane;
oflip->pipe = pipe;
+ oflip->dirty = ovl->sw_dirty;
+ ovl->sw_dirty = 0;
+
return &oflip->base;
}