]> Pileus Git - ~andy/linux/blobdiff - drivers/gpu/drm/nouveau/nouveau_agp.c
Merge tag 'tags/disintegrate-tile-20121009' into for-linus
[~andy/linux] / drivers / gpu / drm / nouveau / nouveau_agp.c
index d33201c56aa17a3c4ea7d540c0410a6f05ddd23f..d28430cd2ba6066ad62c118b8d13d59fa7a88793 100644 (file)
@@ -1,10 +1,10 @@
 #include <linux/module.h>
 
-#include "drmP.h"
-#include "drm.h"
+#include <core/device.h>
 
-#include "nouveau_drv.h"
+#include "nouveau_drm.h"
 #include "nouveau_agp.h"
+#include "nouveau_reg.h"
 
 #if __OS_HAS_AGP
 MODULE_PARM_DESC(agpmode, "AGP mode (0 to disable AGP)");
@@ -12,15 +12,15 @@ static int nouveau_agpmode = -1;
 module_param_named(agpmode, nouveau_agpmode, int, 0400);
 
 static unsigned long
-get_agp_mode(struct drm_device *dev, unsigned long mode)
+get_agp_mode(struct nouveau_drm *drm, unsigned long mode)
 {
-       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       struct nouveau_device *device = nv_device(drm->device);
 
        /*
         * FW seems to be broken on nv18, it makes the card lock up
         * randomly.
         */
-       if (dev_priv->chipset == 0x18)
+       if (device->chipset == 0x18)
                mode &= ~PCI_AGP_COMMAND_FW;
 
        /*
@@ -37,42 +37,39 @@ get_agp_mode(struct drm_device *dev, unsigned long mode)
 }
 
 static bool
-nouveau_agp_enabled(struct drm_device *dev)
+nouveau_agp_enabled(struct nouveau_drm *drm)
 {
-       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       struct drm_device *dev = drm->dev;
 
        if (!drm_pci_device_is_agp(dev) || !dev->agp)
                return false;
 
-       switch (dev_priv->gart_info.type) {
-       case NOUVEAU_GART_NONE:
+       if (drm->agp.stat == UNKNOWN) {
                if (!nouveau_agpmode)
                        return false;
-               break;
-       case NOUVEAU_GART_AGP:
-               break;
-       default:
-               return false;
+               return true;
        }
 
-       return true;
+       return (drm->agp.stat == ENABLED);
 }
 #endif
 
 void
-nouveau_agp_reset(struct drm_device *dev)
+nouveau_agp_reset(struct nouveau_drm *drm)
 {
 #if __OS_HAS_AGP
+       struct nouveau_device *device = nv_device(drm->device);
+       struct drm_device *dev = drm->dev;
        u32 save[2];
        int ret;
 
-       if (!nouveau_agp_enabled(dev))
+       if (!nouveau_agp_enabled(drm))
                return;
 
        /* First of all, disable fast writes, otherwise if it's
         * already enabled in the AGP bridge and we disable the card's
         * AGP controller we might be locking ourselves out of it. */
-       if ((nv_rd32(dev, NV04_PBUS_PCI_NV_19) |
+       if ((nv_rd32(device, NV04_PBUS_PCI_NV_19) |
             dev->agp->mode) & PCI_AGP_COMMAND_FW) {
                struct drm_agp_info info;
                struct drm_agp_mode mode;
@@ -81,7 +78,7 @@ nouveau_agp_reset(struct drm_device *dev)
                if (ret)
                        return;
 
-               mode.mode  = get_agp_mode(dev, info.mode);
+               mode.mode  = get_agp_mode(drm, info.mode);
                mode.mode &= ~PCI_AGP_COMMAND_FW;
 
                ret = drm_agp_enable(dev, mode);
@@ -91,61 +88,64 @@ nouveau_agp_reset(struct drm_device *dev)
 
 
        /* clear busmaster bit, and disable AGP */
-       save[0] = nv_mask(dev, NV04_PBUS_PCI_NV_1, 0x00000004, 0x00000000);
-       nv_wr32(dev, NV04_PBUS_PCI_NV_19, 0);
+       save[0] = nv_mask(device, NV04_PBUS_PCI_NV_1, 0x00000004, 0x00000000);
+       nv_wr32(device, NV04_PBUS_PCI_NV_19, 0);
 
        /* reset PGRAPH, PFIFO and PTIMER */
-       save[1] = nv_mask(dev, 0x000200, 0x00011100, 0x00000000);
-       nv_mask(dev, 0x000200, 0x00011100, save[1]);
+       save[1] = nv_mask(device, 0x000200, 0x00011100, 0x00000000);
+       nv_mask(device, 0x000200, 0x00011100, save[1]);
 
        /* and restore bustmaster bit (gives effect of resetting AGP) */
-       nv_wr32(dev, NV04_PBUS_PCI_NV_1, save[0]);
+       nv_wr32(device, NV04_PBUS_PCI_NV_1, save[0]);
 #endif
 }
 
 void
-nouveau_agp_init(struct drm_device *dev)
+nouveau_agp_init(struct nouveau_drm *drm)
 {
 #if __OS_HAS_AGP
-       struct drm_nouveau_private *dev_priv = dev->dev_private;
+       struct nouveau_device *device = nv_device(drm->device);
+       struct drm_device *dev = drm->dev;
        struct drm_agp_info info;
        struct drm_agp_mode mode;
        int ret;
 
-       if (!nouveau_agp_enabled(dev))
+       if (!nouveau_agp_enabled(drm))
                return;
+       drm->agp.stat = DISABLE;
 
        ret = drm_agp_acquire(dev);
        if (ret) {
-               NV_ERROR(dev, "Unable to acquire AGP: %d\n", ret);
+               nv_error(device, "unable to acquire AGP: %d\n", ret);
                return;
        }
 
        ret = drm_agp_info(dev, &info);
        if (ret) {
-               NV_ERROR(dev, "Unable to get AGP info: %d\n", ret);
+               nv_error(device, "unable to get AGP info: %d\n", ret);
                return;
        }
 
        /* see agp.h for the AGPSTAT_* modes available */
-       mode.mode = get_agp_mode(dev, info.mode);
+       mode.mode = get_agp_mode(drm, info.mode);
 
        ret = drm_agp_enable(dev, mode);
        if (ret) {
-               NV_ERROR(dev, "Unable to enable AGP: %d\n", ret);
+               nv_error(device, "unable to enable AGP: %d\n", ret);
                return;
        }
 
-       dev_priv->gart_info.type = NOUVEAU_GART_AGP;
-       dev_priv->gart_info.aper_base = info.aperture_base;
-       dev_priv->gart_info.aper_size = info.aperture_size;
+       drm->agp.stat = ENABLED;
+       drm->agp.base = info.aperture_base;
+       drm->agp.size = info.aperture_size;
 #endif
 }
 
 void
-nouveau_agp_fini(struct drm_device *dev)
+nouveau_agp_fini(struct nouveau_drm *drm)
 {
 #if __OS_HAS_AGP
+       struct drm_device *dev = drm->dev;
        if (dev->agp && dev->agp->acquired)
                drm_agp_release(dev);
 #endif