]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
fbdev: ffb: fix corrupted video output on Sun FFB1
authorRené Rebe <rene@exactco.de>
Thu, 5 Feb 2026 15:49:58 +0000 (16:49 +0100)
committerHelge Deller <deller@gmx.de>
Sat, 14 Feb 2026 10:09:47 +0000 (11:09 +0100)
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>
drivers/video/fbdev/ffb.c

index 34b6abff9493e30d9fa5e80d2ce77111c9bd096d..da531b4cb4513f4af2bbc25218a79888fa929ec9 100644 (file)
@@ -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);
 }