The patch below does not apply to the 6.6-stable tree.
If someone wants it applied there, or to any other stable or longterm
tree, then please email the backport, including the original git commit
id to <[email protected]>.

Thanks,
Sasha

------------------ original commit in Linus's tree ------------------

>From b28da0d092461ac239ff034a8ac3129320177ba3 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?Ren=C3=A9=20Rebe?= <[email protected]>
Date: Thu, 5 Feb 2026 16:49:58 +0100
Subject: [PATCH] fbdev: ffb: fix corrupted video output on Sun FFB1
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit

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 <[email protected]>
Cc: [email protected]
Signed-off-by: Helge Deller <[email protected]>
---
 drivers/video/fbdev/ffb.c | 14 +++++++++++++-
 1 file changed, 13 insertions(+), 1 deletion(-)

diff --git a/drivers/video/fbdev/ffb.c b/drivers/video/fbdev/ffb.c
index 34b6abff9493e..da531b4cb4513 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);
 }
 
-- 
2.51.0




Reply via email to