|
@@ -81,6 +81,9 @@ static u32 gart_unmapped_entry;
|
|
|
#define AGPEXTERN
|
|
|
#endif
|
|
|
|
|
|
+/* GART can only remap to physical addresses < 1TB */
|
|
|
+#define GART_MAX_PHYS_ADDR (1ULL << 40)
|
|
|
+
|
|
|
/* backdoor interface to AGP driver */
|
|
|
AGPEXTERN int agp_memory_reserved;
|
|
|
AGPEXTERN __u32 *agp_gatt_table;
|
|
@@ -212,9 +215,13 @@ static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem,
|
|
|
size_t size, int dir, unsigned long align_mask)
|
|
|
{
|
|
|
unsigned long npages = iommu_num_pages(phys_mem, size, PAGE_SIZE);
|
|
|
- unsigned long iommu_page = alloc_iommu(dev, npages, align_mask);
|
|
|
+ unsigned long iommu_page;
|
|
|
int i;
|
|
|
|
|
|
+ if (unlikely(phys_mem + size > GART_MAX_PHYS_ADDR))
|
|
|
+ return bad_dma_addr;
|
|
|
+
|
|
|
+ iommu_page = alloc_iommu(dev, npages, align_mask);
|
|
|
if (iommu_page == -1) {
|
|
|
if (!nonforced_iommu(dev, phys_mem, size))
|
|
|
return phys_mem;
|