Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux
1
fork

Configure Feed

Select the types of activity you want to include in your feed.

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>

authored by

René Rebe and committed by
Helge Deller
b28da0d0 c39ee2d2

+13 -1
+13 -1
drivers/video/fbdev/ffb.c
··· 335 335 }; 336 336 337 337 #define FFB_DAC_UCTRL 0x1001 /* User Control */ 338 + #define FFB_DAC_UCTRL_OVENAB 0x00000008 /* Overlay Enable */ 339 + #define FFB_DAC_UCTRL_WMODE 0x00000030 /* Window Mode */ 340 + #define FFB_DAC_UCTRL_WM_COMB 0x00000000 /* Window Mode = Combined */ 338 341 #define FFB_DAC_UCTRL_MANREV 0x00000f00 /* 4-bit Manufacturing Revision */ 339 342 #define FFB_DAC_UCTRL_MANREV_SHIFT 8 340 343 #define FFB_DAC_TGEN 0x6000 /* Timing Generator */ ··· 428 425 { 429 426 struct ffb_fbc __iomem *fbc = par->fbc; 430 427 struct ffb_dac __iomem *dac = par->dac; 431 - unsigned long flags; 428 + unsigned long flags, uctrl; 432 429 433 430 spin_lock_irqsave(&par->lock, flags); 434 431 FFBWait(par); ··· 452 449 else 453 450 upa_writel((FFB_DAC_CUR_CTRL_P0 | 454 451 FFB_DAC_CUR_CTRL_P1), &dac->value2); 452 + 453 + /* Disable overlay and window modes. */ 454 + upa_writel(FFB_DAC_UCTRL, &dac->type); 455 + uctrl = upa_readl(&dac->value); 456 + uctrl &= ~FFB_DAC_UCTRL_WMODE; 457 + uctrl |= FFB_DAC_UCTRL_WM_COMB; 458 + uctrl &= ~FFB_DAC_UCTRL_OVENAB; 459 + upa_writel(FFB_DAC_UCTRL, &dac->type); 460 + upa_writel(uctrl, &dac->value); 455 461 456 462 spin_unlock_irqrestore(&par->lock, flags); 457 463 }