Commit b28da0d0 authored by René Rebe's avatar René Rebe Committed by Helge Deller
Browse files

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: default avatarRené Rebe <rene@exactco.de>
Cc: stable@kernel.org
Signed-off-by: default avatarHelge Deller <deller@gmx.de>
parent c39ee2d2
Loading
Loading
Loading
Loading
+13 −1
Original line number Diff line number Diff line
@@ -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);
}