157 lines
4.6 KiB
Diff
157 lines
4.6 KiB
Diff
From git-commits-head-owner@vger.kernel.org Mon Nov 13 18:27:28 2006
|
|
Date: Mon, 13 Nov 2006 16:59:04 GMT
|
|
Message-Id: <200611131659.kADGx4Ol025786@hera.kernel.org>
|
|
From: Linux Kernel Mailing List <linux-kernel@vger.kernel.org>
|
|
To: git-commits-head@vger.kernel.org
|
|
Subject: [PATCH] Patch for nvidia divide by zero error for 7600 pci-express card
|
|
|
|
commit e40c67597eac7a0b0e676867517b01a5a57f7b4b
|
|
tree 842f4cc8ad5739c9935e4ca1aca8ad0743de54da
|
|
parent 7947d2cc2c2e01125a393de83862d02b621999fe
|
|
author Wink Saville <wink@saville.com> 1163190472 -0800
|
|
committer Linus Torvalds <torvalds@g5.osdl.org> 1163432442 -0800
|
|
|
|
[PATCH] Patch for nvidia divide by zero error for 7600 pci-express card
|
|
|
|
The following patch resolves the divide by zero error I encountered on my
|
|
system:
|
|
|
|
http://marc.10east.com/?l=linux-fbdev-devel&m=116058257024413&w=2
|
|
|
|
I accomplished this by merging what I thought was appropriate from:
|
|
|
|
http://webcvs.freedesktop.org/xorg/driver/xf86-video-nv/src/
|
|
|
|
Signed-off-by: Andrew Morton <akpm@osdl.org>
|
|
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
|
|
|
|
drivers/video/nvidia/nv_hw.c | 12 +++++++++---
|
|
drivers/video/nvidia/nv_setup.c | 18 +++++++++++++++++-
|
|
drivers/video/nvidia/nv_type.h | 1 +
|
|
drivers/video/nvidia/nvidia.c | 24 ++++++++++++------------
|
|
4 files changed, 39 insertions(+), 16 deletions(-)
|
|
|
|
diff --git a/drivers/video/nvidia/nv_hw.c b/drivers/video/nvidia/nv_hw.c
|
|
index 9ed640d..ea42611 100644
|
|
--- a/drivers/video/nvidia/nv_hw.c
|
|
+++ b/drivers/video/nvidia/nv_hw.c
|
|
@@ -145,12 +145,18 @@ static void nvGetClocks(struct nvidia_pa
|
|
|
|
if (par->Architecture >= NV_ARCH_40) {
|
|
pll = NV_RD32(par->PMC, 0x4020);
|
|
- P = (pll >> 16) & 0x03;
|
|
+ P = (pll >> 16) & 0x07;
|
|
pll = NV_RD32(par->PMC, 0x4024);
|
|
M = pll & 0xFF;
|
|
N = (pll >> 8) & 0xFF;
|
|
- MB = (pll >> 16) & 0xFF;
|
|
- NB = (pll >> 24) & 0xFF;
|
|
+ if (((par->Chipset & 0xfff0) == 0x0290) ||
|
|
+ ((par->Chipset & 0xfff0) == 0x0390)) {
|
|
+ MB = 1;
|
|
+ NB = 1;
|
|
+ } else {
|
|
+ MB = (pll >> 16) & 0xFF;
|
|
+ NB = (pll >> 24) & 0xFF;
|
|
+ }
|
|
*MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P;
|
|
|
|
pll = NV_RD32(par->PMC, 0x4000);
|
|
diff --git a/drivers/video/nvidia/nv_setup.c b/drivers/video/nvidia/nv_setup.c
|
|
index a18a9ae..61dc46f 100644
|
|
--- a/drivers/video/nvidia/nv_setup.c
|
|
+++ b/drivers/video/nvidia/nv_setup.c
|
|
@@ -359,6 +359,7 @@ int NVCommonSetup(struct fb_info *info)
|
|
case 0x0186:
|
|
case 0x0187:
|
|
case 0x018D:
|
|
+ case 0x0228:
|
|
case 0x0286:
|
|
case 0x028C:
|
|
case 0x0316:
|
|
@@ -382,6 +383,10 @@ int NVCommonSetup(struct fb_info *info)
|
|
case 0x034C:
|
|
case 0x0160:
|
|
case 0x0166:
|
|
+ case 0x0169:
|
|
+ case 0x016B:
|
|
+ case 0x016C:
|
|
+ case 0x016D:
|
|
case 0x00C8:
|
|
case 0x00CC:
|
|
case 0x0144:
|
|
@@ -639,12 +644,23 @@ int NVCommonSetup(struct fb_info *info)
|
|
par->fpHeight = NV_RD32(par->PRAMDAC, 0x0800) + 1;
|
|
par->fpSyncs = NV_RD32(par->PRAMDAC, 0x0848) & 0x30000033;
|
|
|
|
- printk("Panel size is %i x %i\n", par->fpWidth, par->fpHeight);
|
|
+ printk("nvidiafb: Panel size is %i x %i\n", par->fpWidth, par->fpHeight);
|
|
}
|
|
|
|
if (monA)
|
|
info->monspecs = *monA;
|
|
|
|
+ if (!par->FlatPanel || !par->twoHeads)
|
|
+ par->FPDither = 0;
|
|
+
|
|
+ par->LVDS = 0;
|
|
+ if (par->FlatPanel && par->twoHeads) {
|
|
+ NV_WR32(par->PRAMDAC0, 0x08B0, 0x00010004);
|
|
+ if (par->PRAMDAC0[0x08b4] & 1)
|
|
+ par->LVDS = 1;
|
|
+ printk("nvidiafb: Panel is %s\n", par->LVDS ? "LVDS" : "TMDS");
|
|
+ }
|
|
+
|
|
kfree(edidA);
|
|
kfree(edidB);
|
|
done:
|
|
diff --git a/drivers/video/nvidia/nv_type.h b/drivers/video/nvidia/nv_type.h
|
|
index acdc266..86e65de 100644
|
|
--- a/drivers/video/nvidia/nv_type.h
|
|
+++ b/drivers/video/nvidia/nv_type.h
|
|
@@ -129,6 +129,7 @@ struct nvidia_par {
|
|
int fpHeight;
|
|
int PanelTweak;
|
|
int paneltweak;
|
|
+ int LVDS;
|
|
int pm_state;
|
|
u32 crtcSync_read;
|
|
u32 fpSyncs;
|
|
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c
|
|
index eb24107..538e947 100644
|
|
--- a/drivers/video/nvidia/nvidia.c
|
|
+++ b/drivers/video/nvidia/nvidia.c
|
|
@@ -1160,20 +1160,20 @@ static u32 __devinit nvidia_get_arch(str
|
|
case 0x0340: /* GeForceFX 5700 */
|
|
arch = NV_ARCH_30;
|
|
break;
|
|
- case 0x0040:
|
|
- case 0x00C0:
|
|
- case 0x0120:
|
|
+ case 0x0040: /* GeForce 6800 */
|
|
+ case 0x00C0: /* GeForce 6800 */
|
|
+ case 0x0120: /* GeForce 6800 */
|
|
case 0x0130:
|
|
- case 0x0140:
|
|
- case 0x0160:
|
|
- case 0x01D0:
|
|
- case 0x0090:
|
|
- case 0x0210:
|
|
- case 0x0220:
|
|
+ case 0x0140: /* GeForce 6600 */
|
|
+ case 0x0160: /* GeForce 6200 */
|
|
+ case 0x01D0: /* GeForce 7200, 7300, 7400 */
|
|
+ case 0x0090: /* GeForce 7800 */
|
|
+ case 0x0210: /* GeForce 6800 */
|
|
+ case 0x0220: /* GeForce 6200 */
|
|
case 0x0230:
|
|
- case 0x0240:
|
|
- case 0x0290:
|
|
- case 0x0390:
|
|
+ case 0x0240: /* GeForce 6100 */
|
|
+ case 0x0290: /* GeForce 7900 */
|
|
+ case 0x0390: /* GeForce 7600 */
|
|
arch = NV_ARCH_40;
|
|
break;
|
|
case 0x0020: /* TNT, TNT2 */
|