radeon: rs690 GART tables need to be in uncached memory.
authorDave Airlie <airlied@redhat.com>
Fri, 5 Sep 2008 00:56:18 +0000 (10:56 +1000)
committerDave Airlie <airlied@redhat.com>
Fri, 5 Sep 2008 00:57:47 +0000 (10:57 +1000)
Allocate the rs480/690 tables from uncached memory.

linux-core/ati_pcigart.c
linux-core/radeon_gem.c

index 9b95429..50e990f 100644 (file)
@@ -90,6 +90,12 @@ int drm_ati_alloc_pcigart_table(struct drm_device *dev,
        if (gart_info->table_handle == NULL)
                return -ENOMEM;
 
+#ifdef CONFIG_X86
+       /* IGPs only exist on x86 in any case */
+       if (gart_info->gart_reg_if == DRM_ATI_GART_IGP)
+               set_memory_uc(gart_info->table_handle->vaddr, gart_info->table_size >> PAGE_SHIFT);
+#endif
+
        memset(gart_info->table_handle->vaddr, 0, gart_info->table_size);
        return 0;
 }
@@ -98,6 +104,11 @@ EXPORT_SYMBOL(drm_ati_alloc_pcigart_table);
 static void drm_ati_free_pcigart_table(struct drm_device *dev,
                                       struct drm_ati_pcigart_info *gart_info)
 {
+#ifdef CONFIG_X86
+       /* IGPs only exist on x86 in any case */
+       if (gart_info->gart_reg_if == DRM_ATI_GART_IGP)
+               set_memory_wb(gart_info->table_handle->vaddr, gart_info->table_size >> PAGE_SHIFT);
+#endif
        drm_pci_free(dev, gart_info->table_handle);
        gart_info->table_handle = NULL;
 }
index 44a0f1d..24c806a 100644 (file)
@@ -613,17 +613,18 @@ static int radeon_gart_init(struct drm_device *dev)
        } else if (!(dev_priv->flags & RADEON_IS_AGP)) {
                /* allocate PCI GART table */
                dev_priv->gart_info.table_mask = DMA_BIT_MASK(32);
+               dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
+               if (dev_priv->flags & RADEON_IS_IGPGART)
+                       dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_IGP;
+               else
+                       dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
+
                ret = drm_ati_alloc_pcigart_table(dev, &dev_priv->gart_info);
                if (ret) {
                        DRM_ERROR("cannot allocate PCI GART page!\n");
                        return -EINVAL;
                }
 
-               dev_priv->gart_info.gart_table_location = DRM_ATI_GART_MAIN;
-               if (dev_priv->flags & RADEON_IS_IGPGART)
-                       dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_IGP;
-               else
-                       dev_priv->gart_info.gart_reg_if = DRM_ATI_GART_PCI;
                dev_priv->gart_info.addr = dev_priv->gart_info.table_handle->vaddr;
                dev_priv->gart_info.bus_addr = dev_priv->gart_info.table_handle->busaddr;
        }