* [PATCH][matroxfb] G450 jittery display on ppc systems
@ 2006-03-29 16:39 Paul A. Clarke
0 siblings, 0 replies; only message in thread
From: Paul A. Clarke @ 2006-03-29 16:39 UTC (permalink / raw)
To: linux-fbdev-devel; +Cc: idr
There has been a longstanding problem with the Matrox G450 and perhaps other similar cards, with modes "above"
1280x1024-60 on ppc/ppc64 boxes running Linux. Higher resolutions and/or higher refresh rates resulted in a very
noticably "jittery" display, and sometimes no display, depending on the phyiscal monitor. This patch fixes that problem
on the systems I have easy access to...
I've tested with SLES9SP3 (2.6.5+ kernel) and 2.6.16-rc6 custom kernels on an IBM eServer p5 520 w/G450 (a.k.a GXT135P
on IBM's ppc64 systems) , and a colleague of mine (Ian Romanick) tested it successfully on an Apple ppc32 box
(w/GXT135P). I also tested it on IA32 box I have with a GXT135P to verify that it didn't obviously break anything. In
my testing, I covered single-card, single and dual-head setups using both HD15 and DVI-D signals, on both the IA32 and
ppc64 boxes. While everything appeared fine on both boxes, I did encounter one problem: I can't get any signal on the
DVI-D output on the ppc64 box. However, this is also the case without my patch.
Hmm, I just noticed that screen-blanking only occurs on the primary display as well.
I guess those are the next problems to work on... :-)
Signed-off-by: Paul A. Clarke <pc@us.ibm.com>
Signed-off-by: Ian Romanick <idr@us.ibm.com>
--
Regards,
Paul Clarke, IBM
diff -rup /usr/src/linux/drivers/video/matrox/g450_pll.c linux/drivers/video/matrox/g450_pll.c
--- /usr/src/linux/drivers/video/matrox/g450_pll.c 2006-03-20 10:17:05.147957832 -0600
+++ linux/drivers/video/matrox/g450_pll.c 2006-03-20 10:15:19.495912080 -0600
@@ -316,14 +316,24 @@ static int __g450_setclk(WPMINFO unsigne
case M_PIXEL_PLL_B:
case M_PIXEL_PLL_C:
{
- u_int8_t tmp;
+ u_int8_t tmp, xpwrctrl;
unsigned long flags;
matroxfb_DAC_lock_irqsave(flags);
+
+ xpwrctrl = matroxfb_DAC_in(PMINFO M1064_XPWRCTRL);
+ matroxfb_DAC_out(PMINFO M1064_XPWRCTRL, xpwrctrl & ~M1064_XPWRCTRL_PANELPDN);
+ mga_outb(M_SEQ_INDEX, M_SEQ1);
+ mga_outb(M_SEQ_DATA, mga_inb(M_SEQ_DATA) | M_SEQ1_SCROFF);
tmp = matroxfb_DAC_in(PMINFO M1064_XPIXCLKCTRL);
+ tmp |= M1064_XPIXCLKCTRL_DIS;
if (!(tmp & M1064_XPIXCLKCTRL_PLL_UP)) {
- matroxfb_DAC_out(PMINFO M1064_XPIXCLKCTRL, tmp | M1064_XPIXCLKCTRL_PLL_UP);
+ tmp |= M1064_XPIXCLKCTRL_PLL_UP;
}
+ matroxfb_DAC_out(PMINFO M1064_XPIXCLKCTRL, tmp);
+ matroxfb_DAC_out(PMINFO M1064_XDVICLKCTRL, 0);
+ matroxfb_DAC_out(PMINFO M1064_XPWRCTRL, xpwrctrl);
+
matroxfb_DAC_unlock_irqrestore(flags);
}
{
@@ -418,6 +428,15 @@ static int __g450_setclk(WPMINFO unsigne
frequency to higher - with <= lowest wins, while
with < highest one wins */
if (delta <= deltaarray[idx-1]) {
+ /* all else being equal except VCO,
+ * choose VCO not near (within 1/16th or so) VCOmin
+ * (freqs near VCOmin aren't as stable)
+ */
+ if (delta == deltaarray[idx-1]
+ && vco != g450_mnp2vco(PMINFO mnparray[idx-1])
+ && vco < (pi->vcomin * 17 / 16)) {
+ break;
+ }
mnparray[idx] = mnparray[idx-1];
deltaarray[idx] = deltaarray[idx-1];
} else {
diff -rup /usr/src/linux/drivers/video/matrox/matroxfb_DAC1064.h linux/drivers/video/matrox/matroxfb_DAC1064.h
--- /usr/src/linux/drivers/video/matrox/matroxfb_DAC1064.h 2004-04-03 21:38:21.000000000 -0600
+++ linux/drivers/video/matrox/matroxfb_DAC1064.h 2006-03-20 12:54:38.145911344 -0600
@@ -41,6 +41,7 @@ void DAC1064_global_restore(WPMINFO2);
#define M1064_XCURCOL1RED 0x0C
#define M1064_XCURCOL1GREEN 0x0D
#define M1064_XCURCOL1BLUE 0x0E
+#define M1064_XDVICLKCTRL 0x0F
#define M1064_XCURCOL2RED 0x10
#define M1064_XCURCOL2GREEN 0x11
#define M1064_XCURCOL2BLUE 0x12
@@ -145,6 +146,7 @@ void DAC1064_global_restore(WPMINFO2);
#define M1064_XVIDPLLN 0x8F
#define M1064_XPWRCTRL 0xA0
+#define M1064_XPWRCTRL_PANELPDN 0x04
#define M1064_XPANMODE 0xA2
diff -rup /usr/src/linux/drivers/video/matrox/matroxfb_base.h linux/drivers/video/matrox/matroxfb_base.h
--- /usr/src/linux/drivers/video/matrox/matroxfb_base.h 2004-04-03 21:37:07.000000000 -0600
+++ linux/drivers/video/matrox/matroxfb_base.h 2006-03-16 11:02:09.000000000 -0600
@@ -748,6 +748,8 @@ void matroxfb_unregister_driver(struct m
#define M_SEQ_INDEX 0x1FC4
#define M_SEQ_DATA 0x1FC5
+#define M_SEQ1 0x01
+#define M_SEQ1_SCROFF 0x20
#define M_MISC_REG_READ 0x1FCC
-------------------------------------------------------
This SF.Net email is sponsored by xPML, a groundbreaking scripting language
that extends applications into web and mobile media. Attend the live webcast
and join the prime developer group breaking into this new coding territory!
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=110944&bid=241720&dat=121642
^ permalink raw reply [flat|nested] only message in thread
only message in thread, other threads:[~2006-03-29 16:39 UTC | newest]
Thread overview: (only message) (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2006-03-29 16:39 [PATCH][matroxfb] G450 jittery display on ppc systems Paul A. Clarke
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.