Skip to content

Commit

Permalink
drm/nouveau: Don't enable AGP FW on nv18.
Browse files Browse the repository at this point in the history
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>
  • Loading branch information
Francisco Jerez authored and Ben Skeggs committed Sep 24, 2010
1 parent 3bc14b4 commit 71d0618
Showing 1 changed file with 19 additions and 2 deletions.
21 changes: 19 additions & 2 deletions drivers/gpu/drm/nouveau/nouveau_mem.c
Original file line number Diff line number Diff line change
Expand Up @@ -417,6 +417,23 @@ nouveau_mem_detect(struct drm_device *dev)
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
nouveau_mem_reset_agp(struct drm_device *dev)
{
Expand All @@ -436,7 +453,7 @@ nouveau_mem_reset_agp(struct drm_device *dev)
if (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);
if (ret)
return ret;
Expand Down Expand Up @@ -491,7 +508,7 @@ nouveau_mem_init_agp(struct drm_device *dev)
}

/* 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);
if (ret) {
NV_ERROR(dev, "Unable to enable AGP: %d\n", ret);
Expand Down

0 comments on commit 71d0618

Please sign in to comment.