OSDN Git Service

radeon: fix fence race condition hopefully
[android-x86/external-libdrm.git] / linux-core / radeon_pm.c
index 1a814d9..259d42d 100644 (file)
@@ -54,10 +54,10 @@ int radeon_suspend(struct drm_device *dev, pm_message_t state)
                if (!radeon_fb)
                        continue;
 
-               if (!radeon_fb->base.mm_private)
+               if (!radeon_fb->obj)
                        continue;
                
-               radeon_gem_object_unpin(radeon_fb->base.mm_private);
+               radeon_gem_object_unpin(radeon_fb->obj);
        }
 
        if (!(dev_priv->flags & RADEON_IS_IGP))
@@ -69,6 +69,11 @@ int radeon_suspend(struct drm_device *dev, pm_message_t state)
 
        radeon_modeset_cp_suspend(dev);
 
+        /* Disable *all* interrupts */
+       if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690)
+               RADEON_WRITE(R500_DxMODE_INT_MASK, 0);
+       RADEON_WRITE(RADEON_GEN_INT_CNTL, 0);
+
        if (dev_priv->flags & RADEON_IS_PCIE) {
                memcpy_fromio(dev_priv->mm.pcie_table_backup, dev_priv->mm.pcie_table.kmap.virtual, RADEON_PCIGART_TABLE_SIZE);
        }
@@ -88,7 +93,6 @@ int radeon_resume(struct drm_device *dev)
        struct drm_radeon_private *dev_priv = dev->dev_private;
        struct drm_framebuffer *fb;
        int i;
-       u32 tmp;
 
        if (!drm_core_check_feature(dev, DRIVER_MODESET))
                return 0;
@@ -97,12 +101,11 @@ int radeon_resume(struct drm_device *dev)
        pci_restore_state(dev->pdev);
        if (pci_enable_device(dev->pdev))
                return -1;
-       pci_set_master(dev->pdev);
 
-       /* Turn on bus mastering */
-       tmp = RADEON_READ(RADEON_BUS_CNTL) & ~RADEON_BUS_MASTER_DIS;
-       RADEON_WRITE(RADEON_BUS_CNTL, tmp);
+       /* Turn on bus mastering -todo fix properly */
+       radeon_enable_bm(dev_priv);
 
+       DRM_ERROR("\n");
        /* on atom cards re init the whole card 
           and set the modes again */
 
@@ -113,6 +116,8 @@ int radeon_resume(struct drm_device *dev)
                radeon_combios_asic_init(dev);
        }
 
+       pci_set_master(dev->pdev);
+
        for (i = 0; i < 8; i++)
                RADEON_WRITE(RADEON_BIOS_0_SCRATCH + (i * 4), dev_priv->pmregs.bios_scratch[i]);
 
@@ -151,7 +156,9 @@ int radeon_resume(struct drm_device *dev)
        /* reset swi reg */
        RADEON_WRITE(RADEON_LAST_SWI_REG, dev_priv->counter);
 
-//     radeon_enable_interrupt(dev);
+       if ((dev_priv->flags & RADEON_FAMILY_MASK) >= CHIP_RS690)
+               RADEON_WRITE(R500_DxMODE_INT_MASK, dev_priv->r500_disp_irq_reg);
+       RADEON_WRITE(RADEON_GEN_INT_CNTL, dev_priv->irq_enable_reg);
 
        /* reset the context for userspace */
        if (dev->primary->master) {
@@ -160,7 +167,7 @@ int radeon_resume(struct drm_device *dev)
                        master_priv->sarea_priv->ctx_owner = 0;
        }
 
-       /* unpin the front buffers */
+       /* pin the front buffers */
        list_for_each_entry(fb, &dev->mode_config.fb_kernel_list, filp_head) {
                
                struct radeon_framebuffer *radeon_fb = to_radeon_framebuffer(fb);
@@ -168,10 +175,10 @@ int radeon_resume(struct drm_device *dev)
                if (!radeon_fb)
                        continue;
 
-               if (!radeon_fb->base.mm_private)
+               if (!radeon_fb->obj)
                        continue;
                
-               radeon_gem_object_pin(radeon_fb->base.mm_private,
+               radeon_gem_object_pin(radeon_fb->obj,
                                      PAGE_SIZE, RADEON_GEM_DOMAIN_VRAM);
        }
        /* blat the mode back in */