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>
This commit is contained in:
Francisco Jerez 2010-09-08 02:23:20 +02:00 committed by Ben Skeggs
parent 3bc14b4dca
commit 71d0618661
1 changed files with 19 additions and 2 deletions

View File

@ -417,6 +417,23 @@ nouveau_mem_detect(struct drm_device *dev)
return -ENOMEM; return -ENOMEM;
} }
#if __OS_HAS_AGP
static unsigned long
get_agp_mode(struct drm_device *dev, unsigned long mode)
{
struct drm_nouveau_private *dev_priv = dev->dev_private;
/*
* FW seems to be broken on nv18, it makes the card lock up
* randomly.
*/
if (dev_priv->chipset == 0x18)
mode &= ~PCI_AGP_COMMAND_FW;
return mode;
}
#endif
int int
nouveau_mem_reset_agp(struct drm_device *dev) nouveau_mem_reset_agp(struct drm_device *dev)
{ {
@ -436,7 +453,7 @@ nouveau_mem_reset_agp(struct drm_device *dev)
if (ret) if (ret)
return ret; return ret;
mode.mode = info.mode & ~PCI_AGP_COMMAND_FW; mode.mode = get_agp_mode(dev, info.mode) & ~PCI_AGP_COMMAND_FW;
ret = drm_agp_enable(dev, mode); ret = drm_agp_enable(dev, mode);
if (ret) if (ret)
return ret; return ret;
@ -491,7 +508,7 @@ nouveau_mem_init_agp(struct drm_device *dev)
} }
/* see agp.h for the AGPSTAT_* modes available */ /* see agp.h for the AGPSTAT_* modes available */
mode.mode = info.mode; mode.mode = get_agp_mode(dev, info.mode);
ret = drm_agp_enable(dev, mode); ret = drm_agp_enable(dev, mode);
if (ret) { if (ret) {
NV_ERROR(dev, "Unable to enable AGP: %d\n", ret); NV_ERROR(dev, "Unable to enable AGP: %d\n", ret);