]> bbs.cooldavid.org Git - net-next-2.6.git/blobdiff - drivers/gpu/drm/nouveau/nouveau_mem.c
drm/nouveau: Reset AGP before running the init scripts.
[net-next-2.6.git] / drivers / gpu / drm / nouveau / nouveau_mem.c
index 568bcc21216f3a2f281380e30a9d3315a44c2c96..a9f36ab256b72b535a098c8dd3aeed06dc9c2ea6 100644 (file)
@@ -341,18 +341,36 @@ nouveau_mem_detect(struct drm_device *dev)
        return -ENOMEM;
 }
 
-#if __OS_HAS_AGP
-static void nouveau_mem_reset_agp(struct drm_device *dev)
+int
+nouveau_mem_reset_agp(struct drm_device *dev)
 {
-       uint32_t saved_pci_nv_1, saved_pci_nv_19, pmc_enable;
+#if __OS_HAS_AGP
+       uint32_t saved_pci_nv_1, pmc_enable;
+       int ret;
+
+       /* 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 (dev->agp->acquired) {
+               struct drm_agp_info info;
+               struct drm_agp_mode mode;
+
+               ret = drm_agp_info(dev, &info);
+               if (ret)
+                       return ret;
+
+               mode.mode = info.mode & ~0x10;
+               ret = drm_agp_enable(dev, mode);
+               if (ret)
+                       return ret;
+       }
 
        saved_pci_nv_1 = nv_rd32(dev, NV04_PBUS_PCI_NV_1);
-       saved_pci_nv_19 = nv_rd32(dev, NV04_PBUS_PCI_NV_19);
 
        /* clear busmaster bit */
        nv_wr32(dev, NV04_PBUS_PCI_NV_1, saved_pci_nv_1 & ~0x4);
-       /* clear SBA and AGP bits */
-       nv_wr32(dev, NV04_PBUS_PCI_NV_19, saved_pci_nv_19 & 0xfffff0ff);
+       /* disable AGP */
+       nv_wr32(dev, NV04_PBUS_PCI_NV_19, 0);
 
        /* power cycle pgraph, if enabled */
        pmc_enable = nv_rd32(dev, NV03_PMC_ENABLE);
@@ -364,11 +382,12 @@ static void nouveau_mem_reset_agp(struct drm_device *dev)
        }
 
        /* and restore (gives effect of resetting AGP) */
-       nv_wr32(dev, NV04_PBUS_PCI_NV_19, saved_pci_nv_19);
        nv_wr32(dev, NV04_PBUS_PCI_NV_1, saved_pci_nv_1);
-}
 #endif
 
+       return 0;
+}
+
 int
 nouveau_mem_init_agp(struct drm_device *dev)
 {
@@ -378,11 +397,6 @@ nouveau_mem_init_agp(struct drm_device *dev)
        struct drm_agp_mode mode;
        int ret;
 
-       if (nouveau_noagp)
-               return 0;
-
-       nouveau_mem_reset_agp(dev);
-
        if (!dev->agp->acquired) {
                ret = drm_agp_acquire(dev);
                if (ret) {
@@ -479,7 +493,8 @@ nouveau_mem_init(struct drm_device *dev)
 
        /* GART */
 #if !defined(__powerpc__) && !defined(__ia64__)
-       if (drm_device_is_agp(dev) && dev->agp) {
+       if (drm_device_is_agp(dev) && dev->agp && !nouveau_noagp) {
+               nouveau_mem_reset_agp(dev);
                ret = nouveau_mem_init_agp(dev);
                if (ret)
                        NV_ERROR(dev, "Error initialising AGP: %d\n", ret);