#define VOP_WIN_GET_YRGBADDR(vop, win) \
                vop_readl(vop, win->base + win->phy->yrgb_mst.offset)
 
+#define VOP_WIN_TO_INDEX(vop_win) \
+       ((vop_win) - (vop_win)->vop->win)
+
 #define to_vop(x) container_of(x, struct vop, crtc)
 #define to_vop_win(x) container_of(x, struct vop_win, base)
 
        dma_addr_t dma_addr;
        uint32_t val;
        bool rb_swap;
+       int win_index = VOP_WIN_TO_INDEX(vop_win);
        int format;
 
        /*
        rb_swap = has_rb_swapped(fb->format->format);
        VOP_WIN_SET(vop, win, rb_swap, rb_swap);
 
-       if (fb->format->has_alpha) {
+       /*
+        * Blending win0 with the background color doesn't seem to work
+        * correctly. We only get the background color, no matter the contents
+        * of the win0 framebuffer.  However, blending pre-multiplied color
+        * with the default opaque black default background color is a no-op,
+        * so we can just disable blending to get the correct result.
+        */
+       if (fb->format->has_alpha && win_index > 0) {
                VOP_WIN_SET(vop, win, dst_alpha_ctl,
                            DST_FACTOR_M0(ALPHA_SRC_INVERSE));
                val = SRC_ALPHA_EN(1) | SRC_COLOR_M0(ALPHA_SRC_PRE_MUL) |