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>
This commit is contained in:
René Rebe 2026-02-05 16:49:58 +01:00 committed by Helge Deller
parent c39ee2d264
commit b28da0d092

View 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);
}