| From 665d3e2af83c8fbd149534db8f57d82fa6fa6753 Mon Sep 17 00:00:00 2001 |
| From: Joerg Roedel <joerg.roedel@amd.com> |
| Date: Mon, 18 Apr 2011 15:45:46 +0200 |
| Subject: x86, gart: Make sure GART does not map physmem above 1TB |
| |
| From: Joerg Roedel <joerg.roedel@amd.com> |
| |
| commit 665d3e2af83c8fbd149534db8f57d82fa6fa6753 upstream. |
| |
| The GART can only map physical memory below 1TB. Make sure |
| the gart driver in the kernel does not try to map memory |
| above 1TB. |
| |
| Signed-off-by: Joerg Roedel <joerg.roedel@amd.com> |
| Link: http://lkml.kernel.org/r/1303134346-5805-5-git-send-email-joerg.roedel@amd.com |
| Signed-off-by: H. Peter Anvin <hpa@zytor.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de> |
| |
| --- |
| arch/x86/kernel/pci-gart_64.c | 9 ++++++++- |
| 1 file changed, 8 insertions(+), 1 deletion(-) |
| |
| --- a/arch/x86/kernel/pci-gart_64.c |
| +++ b/arch/x86/kernel/pci-gart_64.c |
| @@ -79,6 +79,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; |
| @@ -210,9 +213,13 @@ static dma_addr_t dma_map_area(struct de |
| 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; |