summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDave Airlie <airlied@redhat.com>2008-09-05 10:56:18 +1000
committerDave Airlie <airlied@redhat.com>2008-09-05 10:57:47 +1000
commit9f9f171f8e0ad817414e6218b44579171d03cec0 (patch)
treed872b22143d83524c57a510b59858c3a02ad9e65
parentfe59d04a7c30692952652f77529deb22a3e0c8bb (diff)
radeon: rs690 GART tables need to be in uncached memory.
Allocate the rs480/690 tables from uncached memory.
-rw-r--r--linux-core/ati_pcigart.c11
-rw-r--r--linux-core/radeon_gem.c11
2 files changed, 17 insertions, 5 deletions
diff --git a/linux-core/ati_pcigart.c b/linux-core/ati_pcigart.c
index 9b954291..50e990f1 100644
--- a/linux-core/ati_pcigart.c
+++ b/linux-core/ati_pcigart.c
@@ -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;
}
diff --git a/linux-core/radeon_gem.c b/linux-core/radeon_gem.c
index 44a0f1d1..24c806a1 100644
--- a/linux-core/radeon_gem.c
+++ b/linux-core/radeon_gem.c
@@ -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;
}