Commit b28da0d09246 for kernel

commit b28da0d092461ac239ff034a8ac3129320177ba3
Author: René Rebe <rene@exactco.de>
Date:   Thu Feb 5 16:49:58 2026 +0100

    fbdev: ffb: fix corrupted video output on Sun FFB1

    Fix Sun FFB1 corrupted video out ([1] and [2]) by disabling overlay and
    initializing window mode to a known state. The issue never appeared on
    my FFB2+/vertical nor Elite3D/M6. It could also depend on the PROM
    version.

    /SUNW,ffb@1e,0: FFB at 000001fc00000000, type 11, DAC pnum[236c] rev[10] manuf_rev[4]
    X (II) /dev/fb0: Detected FFB1, Z-buffer, Single-buffered.
    X (II) /dev/fb0: BT9068 (PAC1) ramdac detected (with normal cursor control)
    X (II) /dev/fb0: Detected Creator/Creator3D

    [1] https://www.instagram.com/p/DUTcSmSjSem/
    [2] https://chaos.social/@ReneRebe/116023241660154102

    Signed-off-by: René Rebe <rene@exactco.de>
    Cc: stable@kernel.org
    Signed-off-by: Helge Deller <deller@gmx.de>

diff --git a/drivers/video/fbdev/ffb.c b/drivers/video/fbdev/ffb.c
index 34b6abff9493..da531b4cb451 100644
--- a/drivers/video/fbdev/ffb.c
+++ b/drivers/video/fbdev/ffb.c
@@ -335,6 +335,9 @@ struct ffb_dac {
 };

 #define FFB_DAC_UCTRL		0x1001 /* User Control */
+#define FFB_DAC_UCTRL_OVENAB	0x00000008 /* Overlay Enable */
+#define FFB_DAC_UCTRL_WMODE	0x00000030 /* Window Mode */
+#define FFB_DAC_UCTRL_WM_COMB	0x00000000 /* Window Mode = Combined */
 #define FFB_DAC_UCTRL_MANREV	0x00000f00 /* 4-bit Manufacturing Revision */
 #define FFB_DAC_UCTRL_MANREV_SHIFT 8
 #define FFB_DAC_TGEN		0x6000 /* Timing Generator */
@@ -425,7 +428,7 @@ static void ffb_switch_from_graph(struct ffb_par *par)
 {
 	struct ffb_fbc __iomem *fbc = par->fbc;
 	struct ffb_dac __iomem *dac = par->dac;
-	unsigned long flags;
+	unsigned long flags, uctrl;

 	spin_lock_irqsave(&par->lock, flags);
 	FFBWait(par);
@@ -450,6 +453,15 @@ static void ffb_switch_from_graph(struct ffb_par *par)
 		upa_writel((FFB_DAC_CUR_CTRL_P0 |
 			    FFB_DAC_CUR_CTRL_P1), &dac->value2);

+	/* Disable overlay and window modes. */
+	upa_writel(FFB_DAC_UCTRL, &dac->type);
+	uctrl = upa_readl(&dac->value);
+	uctrl &= ~FFB_DAC_UCTRL_WMODE;
+	uctrl |= FFB_DAC_UCTRL_WM_COMB;
+	uctrl &= ~FFB_DAC_UCTRL_OVENAB;
+	upa_writel(FFB_DAC_UCTRL, &dac->type);
+	upa_writel(uctrl, &dac->value);
+
 	spin_unlock_irqrestore(&par->lock, flags);
 }