diff options
Diffstat (limited to 'drivers/video/nvidia/nv_hw.c')
-rw-r--r-- | drivers/video/nvidia/nv_hw.c | 81 |
1 files changed, 65 insertions, 16 deletions
diff --git a/drivers/video/nvidia/nv_hw.c b/drivers/video/nvidia/nv_hw.c index b989358437b3..454283f9bdac 100644 --- a/drivers/video/nvidia/nv_hw.c +++ b/drivers/video/nvidia/nv_hw.c | |||
@@ -848,7 +848,7 @@ void NVCalcStateExt(struct nvidia_par *par, | |||
848 | int width, | 848 | int width, |
849 | int hDisplaySize, int height, int dotClock, int flags) | 849 | int hDisplaySize, int height, int dotClock, int flags) |
850 | { | 850 | { |
851 | int pixelDepth, VClk; | 851 | int pixelDepth, VClk = 0; |
852 | /* | 852 | /* |
853 | * Save mode parameters. | 853 | * Save mode parameters. |
854 | */ | 854 | */ |
@@ -938,15 +938,24 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
938 | 938 | ||
939 | if (par->Architecture == NV_ARCH_04) { | 939 | if (par->Architecture == NV_ARCH_04) { |
940 | NV_WR32(par->PFB, 0x0200, state->config); | 940 | NV_WR32(par->PFB, 0x0200, state->config); |
941 | } else if ((par->Chipset & 0xfff0) == 0x0090) { | 941 | } else if ((par->Architecture < NV_ARCH_40) || |
942 | for (i = 0; i < 15; i++) { | 942 | (par->Chipset & 0xfff0) == 0x0040) { |
943 | NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0); | ||
944 | NV_WR32(par->PFB, 0x0604 + (i * 0x10), par->FbMapSize - 1); | ||
945 | } | ||
946 | } else { | ||
947 | for (i = 0; i < 8; i++) { | 943 | for (i = 0; i < 8; i++) { |
948 | NV_WR32(par->PFB, 0x0240 + (i * 0x10), 0); | 944 | NV_WR32(par->PFB, 0x0240 + (i * 0x10), 0); |
949 | NV_WR32(par->PFB, 0x0244 + (i * 0x10), par->FbMapSize - 1); | 945 | NV_WR32(par->PFB, 0x0244 + (i * 0x10), |
946 | par->FbMapSize - 1); | ||
947 | } | ||
948 | } else { | ||
949 | int regions = 12; | ||
950 | |||
951 | if (((par->Chipset & 0xfff0) == 0x0090) || | ||
952 | ((par->Chipset & 0xfff0) == 0x01D0) || | ||
953 | ((par->Chipset & 0xfff0) == 0x0290)) | ||
954 | regions = 15; | ||
955 | for(i = 0; i < regions; i++) { | ||
956 | NV_WR32(par->PFB, 0x0600 + (i * 0x10), 0); | ||
957 | NV_WR32(par->PFB, 0x0604 + (i * 0x10), | ||
958 | par->FbMapSize - 1); | ||
950 | } | 959 | } |
951 | } | 960 | } |
952 | 961 | ||
@@ -1182,11 +1191,17 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1182 | NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); | 1191 | NV_WR32(par->PGRAPH, 0x0608, 0xFFFFFFFF); |
1183 | } else { | 1192 | } else { |
1184 | if (par->Architecture >= NV_ARCH_40) { | 1193 | if (par->Architecture >= NV_ARCH_40) { |
1194 | u32 tmp; | ||
1195 | |||
1185 | NV_WR32(par->PGRAPH, 0x0084, 0x401287c0); | 1196 | NV_WR32(par->PGRAPH, 0x0084, 0x401287c0); |
1186 | NV_WR32(par->PGRAPH, 0x008C, 0x60de8051); | 1197 | NV_WR32(par->PGRAPH, 0x008C, 0x60de8051); |
1187 | NV_WR32(par->PGRAPH, 0x0090, 0x00008000); | 1198 | NV_WR32(par->PGRAPH, 0x0090, 0x00008000); |
1188 | NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f); | 1199 | NV_WR32(par->PGRAPH, 0x0610, 0x00be3c5f); |
1189 | 1200 | ||
1201 | tmp = NV_RD32(par->REGS, 0x1540) & 0xff; | ||
1202 | for(i = 0; tmp && !(tmp & 1); tmp >>= 1, i++); | ||
1203 | NV_WR32(par->PGRAPH, 0x5000, i); | ||
1204 | |||
1190 | if ((par->Chipset & 0xfff0) == 0x0040) { | 1205 | if ((par->Chipset & 0xfff0) == 0x0040) { |
1191 | NV_WR32(par->PGRAPH, 0x09b0, | 1206 | NV_WR32(par->PGRAPH, 0x09b0, |
1192 | 0x83280fff); | 1207 | 0x83280fff); |
@@ -1211,6 +1226,7 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1211 | 0xffff7fff); | 1226 | 0xffff7fff); |
1212 | break; | 1227 | break; |
1213 | case 0x00C0: | 1228 | case 0x00C0: |
1229 | case 0x0120: | ||
1214 | NV_WR32(par->PGRAPH, 0x0828, | 1230 | NV_WR32(par->PGRAPH, 0x0828, |
1215 | 0x007596ff); | 1231 | 0x007596ff); |
1216 | NV_WR32(par->PGRAPH, 0x082C, | 1232 | NV_WR32(par->PGRAPH, 0x082C, |
@@ -1245,6 +1261,7 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1245 | 0x00100000); | 1261 | 0x00100000); |
1246 | break; | 1262 | break; |
1247 | case 0x0090: | 1263 | case 0x0090: |
1264 | case 0x0290: | ||
1248 | NV_WR32(par->PRAMDAC, 0x0608, | 1265 | NV_WR32(par->PRAMDAC, 0x0608, |
1249 | NV_RD32(par->PRAMDAC, 0x0608) | | 1266 | NV_RD32(par->PRAMDAC, 0x0608) | |
1250 | 0x00100000); | 1267 | 0x00100000); |
@@ -1310,14 +1327,44 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1310 | } | 1327 | } |
1311 | } | 1328 | } |
1312 | 1329 | ||
1313 | if ((par->Chipset & 0xfff0) == 0x0090) { | 1330 | if ((par->Architecture < NV_ARCH_40) || |
1314 | for (i = 0; i < 60; i++) | 1331 | ((par->Chipset & 0xfff0) == 0x0040)) { |
1315 | NV_WR32(par->PGRAPH, 0x0D00 + i, | 1332 | for (i = 0; i < 32; i++) { |
1316 | NV_RD32(par->PFB, 0x0600 + i)); | 1333 | NV_WR32(par->PGRAPH, 0x0900 + i*4, |
1334 | NV_RD32(par->PFB, 0x0240 +i*4)); | ||
1335 | NV_WR32(par->PGRAPH, 0x6900 + i*4, | ||
1336 | NV_RD32(par->PFB, 0x0240 +i*4)); | ||
1337 | } | ||
1317 | } else { | 1338 | } else { |
1318 | for (i = 0; i < 32; i++) | 1339 | if (((par->Chipset & 0xfff0) == 0x0090) || |
1319 | NV_WR32(par->PGRAPH, 0x0900 + i, | 1340 | ((par->Chipset & 0xfff0) == 0x01D0) || |
1320 | NV_RD32(par->PFB, 0x0240 + i)); | 1341 | ((par->Chipset & 0xfff0) == 0x0290)) { |
1342 | for (i = 0; i < 60; i++) { | ||
1343 | NV_WR32(par->PGRAPH, | ||
1344 | 0x0D00 + i*4, | ||
1345 | NV_RD32(par->PFB, | ||
1346 | 0x0600 + i*4)); | ||
1347 | NV_WR32(par->PGRAPH, | ||
1348 | 0x6900 + i*4, | ||
1349 | NV_RD32(par->PFB, | ||
1350 | 0x0600 + i*4)); | ||
1351 | } | ||
1352 | } else { | ||
1353 | for (i = 0; i < 48; i++) { | ||
1354 | NV_WR32(par->PGRAPH, | ||
1355 | 0x0900 + i*4, | ||
1356 | NV_RD32(par->PFB, | ||
1357 | 0x0600 + i*4)); | ||
1358 | if(((par->Chipset & 0xfff0) | ||
1359 | != 0x0160) && | ||
1360 | ((par->Chipset & 0xfff0) | ||
1361 | != 0x0220)) | ||
1362 | NV_WR32(par->PGRAPH, | ||
1363 | 0x6900 + i*4, | ||
1364 | NV_RD32(par->PFB, | ||
1365 | 0x0600 + i*4)); | ||
1366 | } | ||
1367 | } | ||
1321 | } | 1368 | } |
1322 | 1369 | ||
1323 | if (par->Architecture >= NV_ARCH_40) { | 1370 | if (par->Architecture >= NV_ARCH_40) { |
@@ -1338,7 +1385,9 @@ void NVLoadStateExt(struct nvidia_par *par, RIVA_HW_STATE * state) | |||
1338 | NV_WR32(par->PGRAPH, 0x0868, | 1385 | NV_WR32(par->PGRAPH, 0x0868, |
1339 | par->FbMapSize - 1); | 1386 | par->FbMapSize - 1); |
1340 | } else { | 1387 | } else { |
1341 | if((par->Chipset & 0xfff0) == 0x0090) { | 1388 | if ((par->Chipset & 0xfff0) == 0x0090 || |
1389 | (par->Chipset & 0xfff0) == 0x01D0 || | ||
1390 | (par->Chipset & 0xfff0) == 0x0290) { | ||
1342 | NV_WR32(par->PGRAPH, 0x0DF0, | 1391 | NV_WR32(par->PGRAPH, 0x0DF0, |
1343 | NV_RD32(par->PFB, 0x0200)); | 1392 | NV_RD32(par->PFB, 0x0200)); |
1344 | NV_WR32(par->PGRAPH, 0x0DF4, | 1393 | NV_WR32(par->PGRAPH, 0x0DF4, |