aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorFrancisco Jerez <currojerez@riseup.net>2010-09-07 20:23:20 -0400
committerBen Skeggs <bskeggs@redhat.com>2010-09-24 02:25:10 -0400
commit71d0618661f9dd531caa94ce2ce5dc919321624b (patch)
tree520eb45ea44da00f4642d1598cef86441499e9d8
parent3bc14b4dca2f8bc088162476279480e78491fd83 (diff)
drm/nouveau: Don't enable AGP FW on nv18.
FW seems to be broken on nv18, it causes random lockups and breaks suspend/resume even with the blob. Signed-off-by: Francisco Jerez <currojerez@riseup.net> Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
-rw-r--r--drivers/gpu/drm/nouveau/nouveau_mem.c21
1 files changed, 19 insertions, 2 deletions
diff --git a/drivers/gpu/drm/nouveau/nouveau_mem.c b/drivers/gpu/drm/nouveau/nouveau_mem.c
index fb15a1b0dda9..a885cd0b27e8 100644
--- a/drivers/gpu/drm/nouveau/nouveau_mem.c
+++ b/drivers/gpu/drm/nouveau/nouveau_mem.c
@@ -417,6 +417,23 @@ nouveau_mem_detect(struct drm_device *dev)
417 return -ENOMEM; 417 return -ENOMEM;
418} 418}
419 419
420#if __OS_HAS_AGP
421static unsigned long
422get_agp_mode(struct drm_device *dev, unsigned long mode)
423{
424 struct drm_nouveau_private *dev_priv = dev->dev_private;
425
426 /*
427 * FW seems to be broken on nv18, it makes the card lock up
428 * randomly.
429 */
430 if (dev_priv->chipset == 0x18)
431 mode &= ~PCI_AGP_COMMAND_FW;
432
433 return mode;
434}
435#endif
436
420int 437int
421nouveau_mem_reset_agp(struct drm_device *dev) 438nouveau_mem_reset_agp(struct drm_device *dev)
422{ 439{
@@ -436,7 +453,7 @@ nouveau_mem_reset_agp(struct drm_device *dev)
436 if (ret) 453 if (ret)
437 return ret; 454 return ret;
438 455
439 mode.mode = info.mode & ~PCI_AGP_COMMAND_FW; 456 mode.mode = get_agp_mode(dev, info.mode) & ~PCI_AGP_COMMAND_FW;
440 ret = drm_agp_enable(dev, mode); 457 ret = drm_agp_enable(dev, mode);
441 if (ret) 458 if (ret)
442 return ret; 459 return ret;
@@ -491,7 +508,7 @@ nouveau_mem_init_agp(struct drm_device *dev)
491 } 508 }
492 509
493 /* see agp.h for the AGPSTAT_* modes available */ 510 /* see agp.h for the AGPSTAT_* modes available */
494 mode.mode = info.mode; 511 mode.mode = get_agp_mode(dev, info.mode);
495 ret = drm_agp_enable(dev, mode); 512 ret = drm_agp_enable(dev, mode);
496 if (ret) { 513 if (ret) {
497 NV_ERROR(dev, "Unable to enable AGP: %d\n", ret); 514 NV_ERROR(dev, "Unable to enable AGP: %d\n", ret);