diff options
author | Francisco Jerez <currojerez@riseup.net> | 2010-09-07 20:23:20 -0400 |
---|---|---|
committer | Ben Skeggs <bskeggs@redhat.com> | 2010-09-24 02:25:10 -0400 |
commit | 71d0618661f9dd531caa94ce2ce5dc919321624b (patch) | |
tree | 520eb45ea44da00f4642d1598cef86441499e9d8 | |
parent | 3bc14b4dca2f8bc088162476279480e78491fd83 (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.c | 21 |
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 | ||
421 | static unsigned long | ||
422 | get_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 | |||
420 | int | 437 | int |
421 | nouveau_mem_reset_agp(struct drm_device *dev) | 438 | nouveau_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); |