diff options
author | Antonino A. Daplas <adaplas@gmail.com> | 2007-07-17 07:05:30 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@woody.linux-foundation.org> | 2007-07-17 13:23:11 -0400 |
commit | ac1ae162c9c400d63e62d9f2878be968b10ceaab (patch) | |
tree | e9af6679ec144a1155122a83af892623f88a94db /drivers/video | |
parent | b5f2f4d1a6d7efde39cfb5e1d034981c69f2214c (diff) |
nvidiafb: Add proper support for Geforce 7600 chipset
Add proper support for the Geforce 7600 (device id 0x039x). This also sync's
nvidiafb with the latest Xorg nv driver.
Signed-off-by: Antonino Daplas <adaplas@gmail.com>
Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'drivers/video')
-rw-r--r-- | drivers/video/nvidia/nv_hw.c | 62 | ||||
-rw-r--r-- | drivers/video/nvidia/nv_setup.c | 12 | ||||
-rw-r--r-- | drivers/video/nvidia/nv_type.h | 1 | ||||
-rw-r--r-- | drivers/video/nvidia/nvidia.c | 7 |
4 files changed, 54 insertions, 28 deletions
diff --git a/drivers/video/nvidia/nv_hw.c b/drivers/video/nvidia/nv_hw.c index aff11bbf59a7..d1a10549f543 100644 --- a/drivers/video/nvidia/nv_hw.c +++ b/drivers/video/nvidia/nv_hw.c | |||
@@ -150,8 +150,7 @@ static void nvGetClocks(struct nvidia_par *par, unsigned int *MClk, | |||
150 | M = pll & 0xFF; | 150 | M = pll & 0xFF; |
151 | N = (pll >> 8) & 0xFF; | 151 | N = (pll >> 8) & 0xFF; |
152 | if (((par->Chipset & 0xfff0) == 0x0290) || | 152 | if (((par->Chipset & 0xfff0) == 0x0290) || |
153 | ((par->Chipset & 0xfff0) == 0x0390) || | 153 | ((par->Chipset & 0xfff0) == 0x0390)) { |
154 | ((par->Chipset & 0xfff0) == 0x02E0)) { | ||
155 | MB = 1; | 154 | MB = 1; |
156 | NB = 1; | 155 | NB = 1; |
157 | } else { | 156 | } else { |
@@ -161,7 +160,7 @@ static void nvGetClocks(struct nvidia_par *par, unsigned int *MClk, | |||
161 | *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; | 160 | *MClk = ((N * NB * par->CrystalFreqKHz) / (M * MB)) >> P; |
162 | 161 | ||
163 | pll = NV_RD32(par->PMC, 0x4000); | 162 | pll = NV_RD32(par->PMC, 0x4000); |
164 | P = (pll >> 16) & 0x03; | 163 | P = (pll >> 16) & 0x07; |
165 | pll = NV_RD32(par->PMC, 0x4004); | 164 | pll = NV_RD32(par->PMC, 0x4004); |
166 | M = pll & 0xFF; | 165 | M = pll & 0xFF; |
167 | N = (pll >> 8) & 0xFF; | 166 | N = (pll >> 8) & 0xFF; |
@@ -892,11 +891,17 @@ void NVCalcStateExt(struct nvidia_par *par, | |||
892 | state->general = bpp == 16 ? 0x00101100 : 0x00100100; | 891 | state->general = bpp == 16 ? 0x00101100 : 0x00100100; |
893 | state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; | 892 | state->repaint1 = hDisplaySize < 1280 ? 0x04 : 0x00; |
894 | break; | 893 | break; |
894 | case NV_ARCH_40: | ||
895 | if (!par->FlatPanel) | ||
896 | state->control = NV_RD32(par->PRAMDAC0, 0x0580) & | ||
897 | 0xeffffeff; | ||
898 | /* fallthrough */ | ||
895 | case NV_ARCH_10: | 899 | case NV_ARCH_10: |
896 | case NV_ARCH_20: | 900 | case NV_ARCH_20: |
897 | case NV_ARCH_30: | 901 | case NV_ARCH_30: |
898 | default: | 902 | default: |
899 | if ((par->Chipset & 0xfff0) == 0x0240) { | 903 | if ((par->Chipset & 0xfff0) == 0x0240 || |
904 | (par->Chipset & 0xfff0) == 0x03d0) { | ||
900 | state->arbitration0 = 256; | 905 | state->arbitration0 = 256; |
901 | state->arbitration1 = 0x0480; | 906 | state->arbitration1 = 0x0480; |
902 | } else if (((par->Chipset & 0xffff) == 0x01A0) || | 907 | } else if (((par->Chipset & 0xffff) == 0x01A0) || |
@@ -939,7 +944,7 @@ void NVCalcStateExt(struct nvidia_par *par, | |||
939 | 944 | ||
940 | void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | 945 | void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) |
941 | { | 946 | { |
942 | int i; | 947 | int i, j; |
943 | 948 | ||
944 | NV_WR32(par->PMC, 0x0140, 0x00000000); | 949 | NV_WR32(par->PMC, 0x0140, 0x00000000); |
945 | NV_WR32(par->PMC, 0x0200, 0xFFFF00FF); | 950 | NV_WR32(par->PMC, 0x0200, 0xFFFF00FF); |
@@ -951,7 +956,8 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
951 | NV_WR32(par->PTIMER, 0x0100 * 4, 0xFFFFFFFF); | 956 | NV_WR32(par->PTIMER, 0x0100 * 4, 0xFFFFFFFF); |
952 | 957 | ||
953 | if (par->Architecture == NV_ARCH_04) { | 958 | if (par->Architecture == NV_ARCH_04) { |
954 | NV_WR32(par->PFB, 0x0200, state->config); | 959 | if (state) |
960 | NV_WR32(par->PFB, 0x0200, state->config); | ||
955 | } else if ((par->Architecture < NV_ARCH_40) || | 961 | } else if ((par->Architecture < NV_ARCH_40) || |
956 | (par->Chipset & 0xfff0) == 0x0040) { | 962 | (par->Chipset & 0xfff0) == 0x0040) { |
957 | for (i = 0; i < 8; i++) { | 963 | for (i = 0; i < 8; i++) { |
@@ -964,8 +970,9 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
964 | 970 | ||
965 | if (((par->Chipset & 0xfff0) == 0x0090) || | 971 | if (((par->Chipset & 0xfff0) == 0x0090) || |
966 | ((par->Chipset & 0xfff0) == 0x01D0) || | 972 | ((par->Chipset & 0xfff0) == 0x01D0) || |
967 | ((par->Chipset & 0xfff0) == 0x02E0) || | 973 | ((par->Chipset & 0xfff0) == 0x0290) || |
968 | ((par->Chipset & 0xfff0) == 0x0290)) | 974 | ((par->Chipset & 0xfff0) == 0x0390) || |
975 | ((par->Chipset & 0xfff0) == 0x03D0)) | ||
969 | regions = 15; | 976 | regions = 15; |
970 | for(i = 0; i < regions; i++) { | 977 | for(i = 0; i < regions; i++) { |
971 | NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0); | 978 | NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0); |
@@ -1206,16 +1213,20 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1206 | NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); | 1213 | NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); |
1207 | } else { | 1214 | } else { |
1208 | if (par->Architecture >= NV_ARCH_40) { | 1215 | if (par->Architecture >= NV_ARCH_40) { |
1209 | u32 tmp; | ||
1210 | |||
1211 | NV_WR32(par->PGRAPH, 0x0084, 0x401287c0); | 1216 | NV_WR32(par->PGRAPH, 0x0084, 0x401287c0); |
1212 | NV_WR32(par->PGRAPH, 0x008C, 0x60de8051); | 1217 | NV_WR32(par->PGRAPH, 0x008C, 0x60de8051); |
1213 | NV_WR32(par->PGRAPH, 0x0090, 0x00008000); | 1218 | NV_WR32(par->PGRAPH, 0x0090, 0x00008000); |
1214 | NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f); | 1219 | NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f); |
1220 | NV_WR32(par->PGRAPH, 0x0bc4, | ||
1221 | NV_RD32(par->PGRAPH, 0x0bc4) | | ||
1222 | 0x00008000); | ||
1215 | 1223 | ||
1216 | tmp = NV_RD32(par->REGS, 0x1540) & 0xff; | 1224 | j = NV_RD32(par->REGS, 0x1540) & 0xff; |
1217 | for(i = 0; tmp && !(tmp & 1); tmp >>= 1, i++); | 1225 | |
1218 | NV_WR32(par->PGRAPH, 0x5000, i); | 1226 | if (j) { |
1227 | for (i = 0; !(j & 1); j >>= 1, i++); | ||
1228 | NV_WR32(par->PGRAPH, 0x5000, i); | ||
1229 | } | ||
1219 | 1230 | ||
1220 | if ((par->Chipset & 0xfff0) == 0x0040) { | 1231 | if ((par->Chipset & 0xfff0) == 0x0040) { |
1221 | NV_WR32(par->PGRAPH, 0x09b0, | 1232 | NV_WR32(par->PGRAPH, 0x09b0, |
@@ -1250,6 +1261,7 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1250 | case 0x0160: | 1261 | case 0x0160: |
1251 | case 0x01D0: | 1262 | case 0x01D0: |
1252 | case 0x0240: | 1263 | case 0x0240: |
1264 | case 0x03D0: | ||
1253 | NV_WR32(par->PMC, 0x1700, | 1265 | NV_WR32(par->PMC, 0x1700, |
1254 | NV_RD32(par->PFB, 0x020C)); | 1266 | NV_RD32(par->PFB, 0x020C)); |
1255 | NV_WR32(par->PMC, 0x1704, 0); | 1267 | NV_WR32(par->PMC, 0x1704, 0); |
@@ -1269,7 +1281,6 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1269 | 0x00000108); | 1281 | 0x00000108); |
1270 | break; | 1282 | break; |
1271 | case 0x0220: | 1283 | case 0x0220: |
1272 | case 0x0230: | ||
1273 | NV_WR32(par->PGRAPH, 0x0860, 0); | 1284 | NV_WR32(par->PGRAPH, 0x0860, 0); |
1274 | NV_WR32(par->PGRAPH, 0x0864, 0); | 1285 | NV_WR32(par->PGRAPH, 0x0864, 0); |
1275 | NV_WR32(par->PRAMDAC, 0x0608, | 1286 | NV_WR32(par->PRAMDAC, 0x0608, |
@@ -1277,8 +1288,8 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1277 | 0x00100000); | 1288 | 0x00100000); |
1278 | break; | 1289 | break; |
1279 | case 0x0090: | 1290 | case 0x0090: |
1280 | case 0x02E0: | ||
1281 | case 0x0290: | 1291 | case 0x0290: |
1292 | case 0x0390: | ||
1282 | NV_WR32(par->PRAMDAC, 0x0608, | 1293 | NV_WR32(par->PRAMDAC, 0x0608, |
1283 | NV_RD32(par->PRAMDAC, 0x0608) | | 1294 | NV_RD32(par->PRAMDAC, 0x0608) | |
1284 | 0x00100000); | 1295 | 0x00100000); |
@@ -1355,8 +1366,9 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1355 | } else { | 1366 | } else { |
1356 | if (((par->Chipset & 0xfff0) == 0x0090) || | 1367 | if (((par->Chipset & 0xfff0) == 0x0090) || |
1357 | ((par->Chipset & 0xfff0) == 0x01D0) || | 1368 | ((par->Chipset & 0xfff0) == 0x01D0) || |
1358 | ((par->Chipset & 0xfff0) == 0x02E0) || | 1369 | ((par->Chipset & 0xfff0) == 0x0290) || |
1359 | ((par->Chipset & 0xfff0) == 0x0290)) { | 1370 | ((par->Chipset & 0xfff0) == 0x0390) || |
1371 | ((par->Chipset & 0xfff0) == 0x03D0)) { | ||
1360 | for (i = 0; i < 60; i++) { | 1372 | for (i = 0; i < 60; i++) { |
1361 | NV_WR32(par->PGRAPH, | 1373 | NV_WR32(par->PGRAPH, |
1362 | 0x0D00 + i*4, | 1374 | 0x0D00 + i*4, |
@@ -1407,8 +1419,8 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1407 | } else { | 1419 | } else { |
1408 | if ((par->Chipset & 0xfff0) == 0x0090 || | 1420 | if ((par->Chipset & 0xfff0) == 0x0090 || |
1409 | (par->Chipset & 0xfff0) == 0x01D0 || | 1421 | (par->Chipset & 0xfff0) == 0x01D0 || |
1410 | (par->Chipset & 0xfff0) == 0x02E0 || | 1422 | (par->Chipset & 0xfff0) == 0x0290 || |
1411 | (par->Chipset & 0xfff0) == 0x0290) { | 1423 | (par->Chipset & 0xfff0) == 0x0390) { |
1412 | NV_WR32(par->PGRAPH, 0x0DF0, | 1424 | NV_WR32(par->PGRAPH, 0x0DF0, |
1413 | NV_RD32(par->PFB, 0x0200)); | 1425 | NV_RD32(par->PFB, 0x0200)); |
1414 | NV_WR32(par->PGRAPH, 0x0DF4, | 1426 | NV_WR32(par->PGRAPH, 0x0DF4, |
@@ -1495,6 +1507,12 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1495 | NV_WR32(par->PFIFO, 0x0494 * 4, 0x00000001); | 1507 | NV_WR32(par->PFIFO, 0x0494 * 4, 0x00000001); |
1496 | NV_WR32(par->PFIFO, 0x0495 * 4, 0x00000001); | 1508 | NV_WR32(par->PFIFO, 0x0495 * 4, 0x00000001); |
1497 | NV_WR32(par->PFIFO, 0x0140 * 4, 0x00000001); | 1509 | NV_WR32(par->PFIFO, 0x0140 * 4, 0x00000001); |
1510 | |||
1511 | if (!state) { | ||
1512 | par->CurrentState = NULL; | ||
1513 | return; | ||
1514 | } | ||
1515 | |||
1498 | if (par->Architecture >= NV_ARCH_10) { | 1516 | if (par->Architecture >= NV_ARCH_10) { |
1499 | if (par->twoHeads) { | 1517 | if (par->twoHeads) { |
1500 | NV_WR32(par->PCRTC0, 0x0860, state->head); | 1518 | NV_WR32(par->PCRTC0, 0x0860, state->head); |
@@ -1566,6 +1584,9 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1566 | VGA_WR08(par->PCIO, 0x03D5, state->interlace); | 1584 | VGA_WR08(par->PCIO, 0x03D5, state->interlace); |
1567 | 1585 | ||
1568 | if (!par->FlatPanel) { | 1586 | if (!par->FlatPanel) { |
1587 | if (par->Architecture >= NV_ARCH_40) | ||
1588 | NV_WR32(par->PRAMDAC0, 0x0580, state->control); | ||
1589 | |||
1569 | NV_WR32(par->PRAMDAC0, 0x050C, state->pllsel); | 1590 | NV_WR32(par->PRAMDAC0, 0x050C, state->pllsel); |
1570 | NV_WR32(par->PRAMDAC0, 0x0508, state->vpll); | 1591 | NV_WR32(par->PRAMDAC0, 0x0508, state->vpll); |
1571 | if (par->twoHeads) | 1592 | if (par->twoHeads) |
@@ -1631,6 +1652,9 @@ void NVUnloadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) { | |||
1631 | state->scale = NV_RD32(par->PRAMDAC, 0x0848); | 1652 | state->scale = NV_RD32(par->PRAMDAC, 0x0848); |
1632 | state->config = NV_RD32(par->PFB, 0x0200); | 1653 | state->config = NV_RD32(par->PFB, 0x0200); |
1633 | 1654 | ||
1655 | if (par->Architecture >= NV_ARCH_40 && !par->FlatPanel) | ||
1656 | state->control = NV_RD32(par->PRAMDAC0, 0x0580); | ||
1657 | |||
1634 | if (par->Architecture >= NV_ARCH_10) { | 1658 | if (par->Architecture >= NV_ARCH_10) { |
1635 | if (par->twoHeads) { | 1659 | if (par->twoHeads) { |
1636 | state->head = NV_RD32(par->PCRTC0, 0x0860); | 1660 | state->head = NV_RD32(par->PCRTC0, 0x0860); |
diff --git a/drivers/video/nvidia/nv_setup.c b/drivers/video/nvidia/nv_setup.c index 707e2c8a13ed..82579d3a9970 100644 --- a/drivers/video/nvidia/nv_setup.c +++ b/drivers/video/nvidia/nv_setup.c | |||
@@ -166,11 +166,13 @@ u8 NVReadDacData(struct nvidia_par *par) | |||
166 | static int NVIsConnected(struct nvidia_par *par, int output) | 166 | static int NVIsConnected(struct nvidia_par *par, int output) |
167 | { | 167 | { |
168 | volatile u32 __iomem *PRAMDAC = par->PRAMDAC0; | 168 | volatile u32 __iomem *PRAMDAC = par->PRAMDAC0; |
169 | u32 reg52C, reg608; | 169 | u32 reg52C, reg608, dac0_reg608 = 0; |
170 | int present; | 170 | int present; |
171 | 171 | ||
172 | if (output) | 172 | if (output) { |
173 | PRAMDAC += 0x800; | 173 | dac0_reg608 = NV_RD32(PRAMDAC, 0x0608); |
174 | PRAMDAC += 0x800; | ||
175 | } | ||
174 | 176 | ||
175 | reg52C = NV_RD32(PRAMDAC, 0x052C); | 177 | reg52C = NV_RD32(PRAMDAC, 0x052C); |
176 | reg608 = NV_RD32(PRAMDAC, 0x0608); | 178 | reg608 = NV_RD32(PRAMDAC, 0x0608); |
@@ -194,8 +196,8 @@ static int NVIsConnected(struct nvidia_par *par, int output) | |||
194 | else | 196 | else |
195 | printk("nvidiafb: CRTC%i analog not found\n", output); | 197 | printk("nvidiafb: CRTC%i analog not found\n", output); |
196 | 198 | ||
197 | NV_WR32(par->PRAMDAC0, 0x0608, NV_RD32(par->PRAMDAC0, 0x0608) & | 199 | if (output) |
198 | 0x0000EFFF); | 200 | NV_WR32(par->PRAMDAC0, 0x0608, dac0_reg608); |
199 | 201 | ||
200 | NV_WR32(PRAMDAC, 0x052C, reg52C); | 202 | NV_WR32(PRAMDAC, 0x052C, reg52C); |
201 | NV_WR32(PRAMDAC, 0x0608, reg608); | 203 | NV_WR32(PRAMDAC, 0x0608, reg608); |
diff --git a/drivers/video/nvidia/nv_type.h b/drivers/video/nvidia/nv_type.h index 38f7cc0a2331..2fdf77ec39fc 100644 --- a/drivers/video/nvidia/nv_type.h +++ b/drivers/video/nvidia/nv_type.h | |||
@@ -86,6 +86,7 @@ typedef struct _riva_hw_state { | |||
86 | u32 timingV; | 86 | u32 timingV; |
87 | u32 displayV; | 87 | u32 displayV; |
88 | u32 crtcSync; | 88 | u32 crtcSync; |
89 | u32 control; | ||
89 | } RIVA_HW_STATE; | 90 | } RIVA_HW_STATE; |
90 | 91 | ||
91 | struct riva_regs { | 92 | struct riva_regs { |
diff --git a/drivers/video/nvidia/nvidia.c b/drivers/video/nvidia/nvidia.c index 8c3a25360232..a7fe214f0f77 100644 --- a/drivers/video/nvidia/nvidia.c +++ b/drivers/video/nvidia/nvidia.c | |||
@@ -1195,7 +1195,8 @@ static u32 __devinit nvidia_get_chipset(struct fb_info *info) | |||
1195 | 1195 | ||
1196 | printk(KERN_INFO PFX "Device ID: %x \n", id); | 1196 | printk(KERN_INFO PFX "Device ID: %x \n", id); |
1197 | 1197 | ||
1198 | if ((id & 0xfff0) == 0x00f0) { | 1198 | if ((id & 0xfff0) == 0x00f0 || |
1199 | (id & 0xfff0) == 0x02e0) { | ||
1199 | /* pci-e */ | 1200 | /* pci-e */ |
1200 | id = NV_RD32(par->REGS, 0x1800); | 1201 | id = NV_RD32(par->REGS, 0x1800); |
1201 | 1202 | ||
@@ -1240,18 +1241,16 @@ static u32 __devinit nvidia_get_arch(struct fb_info *info) | |||
1240 | case 0x0040: /* GeForce 6800 */ | 1241 | case 0x0040: /* GeForce 6800 */ |
1241 | case 0x00C0: /* GeForce 6800 */ | 1242 | case 0x00C0: /* GeForce 6800 */ |
1242 | case 0x0120: /* GeForce 6800 */ | 1243 | case 0x0120: /* GeForce 6800 */ |
1243 | case 0x0130: | ||
1244 | case 0x0140: /* GeForce 6600 */ | 1244 | case 0x0140: /* GeForce 6600 */ |
1245 | case 0x0160: /* GeForce 6200 */ | 1245 | case 0x0160: /* GeForce 6200 */ |
1246 | case 0x01D0: /* GeForce 7200, 7300, 7400 */ | 1246 | case 0x01D0: /* GeForce 7200, 7300, 7400 */ |
1247 | case 0x02E0: /* GeForce 7300 GT */ | ||
1248 | case 0x0090: /* GeForce 7800 */ | 1247 | case 0x0090: /* GeForce 7800 */ |
1249 | case 0x0210: /* GeForce 6800 */ | 1248 | case 0x0210: /* GeForce 6800 */ |
1250 | case 0x0220: /* GeForce 6200 */ | 1249 | case 0x0220: /* GeForce 6200 */ |
1251 | case 0x0230: | ||
1252 | case 0x0240: /* GeForce 6100 */ | 1250 | case 0x0240: /* GeForce 6100 */ |
1253 | case 0x0290: /* GeForce 7900 */ | 1251 | case 0x0290: /* GeForce 7900 */ |
1254 | case 0x0390: /* GeForce 7600 */ | 1252 | case 0x0390: /* GeForce 7600 */ |
1253 | case 0x03D0: | ||
1255 | arch = NV_ARCH_40; | 1254 | arch = NV_ARCH_40; |
1256 | break; | 1255 | break; |
1257 | case 0x0020: /* TNT, TNT2 */ | 1256 | case 0x0020: /* TNT, TNT2 */ |