diff options
| -rw-r--r-- | arch/x86/include/asm/gart.h | 24 | ||||
| -rw-r--r-- | arch/x86/kernel/aperture_64.c | 2 | ||||
| -rw-r--r-- | arch/x86/kernel/pci-gart_64.c | 9 |
3 files changed, 21 insertions, 14 deletions
diff --git a/arch/x86/include/asm/gart.h b/arch/x86/include/asm/gart.h index 43085bfc99c3..156cd5d18d2a 100644 --- a/arch/x86/include/asm/gart.h +++ b/arch/x86/include/asm/gart.h | |||
| @@ -66,7 +66,7 @@ static inline void gart_set_size_and_enable(struct pci_dev *dev, u32 order) | |||
| 66 | * Don't enable translation but enable GART IO and CPU accesses. | 66 | * Don't enable translation but enable GART IO and CPU accesses. |
| 67 | * Also, set DISTLBWALKPRB since GART tables memory is UC. | 67 | * Also, set DISTLBWALKPRB since GART tables memory is UC. |
| 68 | */ | 68 | */ |
| 69 | ctl = DISTLBWALKPRB | order << 1; | 69 | ctl = order << 1; |
| 70 | 70 | ||
| 71 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl); | 71 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl); |
| 72 | } | 72 | } |
| @@ -75,17 +75,17 @@ static inline void enable_gart_translation(struct pci_dev *dev, u64 addr) | |||
| 75 | { | 75 | { |
| 76 | u32 tmp, ctl; | 76 | u32 tmp, ctl; |
| 77 | 77 | ||
| 78 | /* address of the mappings table */ | 78 | /* address of the mappings table */ |
| 79 | addr >>= 12; | 79 | addr >>= 12; |
| 80 | tmp = (u32) addr<<4; | 80 | tmp = (u32) addr<<4; |
| 81 | tmp &= ~0xf; | 81 | tmp &= ~0xf; |
| 82 | pci_write_config_dword(dev, AMD64_GARTTABLEBASE, tmp); | 82 | pci_write_config_dword(dev, AMD64_GARTTABLEBASE, tmp); |
| 83 | 83 | ||
| 84 | /* Enable GART translation for this hammer. */ | 84 | /* Enable GART translation for this hammer. */ |
| 85 | pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &ctl); | 85 | pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &ctl); |
| 86 | ctl |= GARTEN; | 86 | ctl |= GARTEN | DISTLBWALKPRB; |
| 87 | ctl &= ~(DISGARTCPU | DISGARTIO); | 87 | ctl &= ~(DISGARTCPU | DISGARTIO); |
| 88 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl); | 88 | pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl); |
| 89 | } | 89 | } |
| 90 | 90 | ||
| 91 | static inline int aperture_valid(u64 aper_base, u32 aper_size, u32 min_size) | 91 | static inline int aperture_valid(u64 aper_base, u32 aper_size, u32 min_size) |
diff --git a/arch/x86/kernel/aperture_64.c b/arch/x86/kernel/aperture_64.c index 86d1ad4962a7..73fb469908c6 100644 --- a/arch/x86/kernel/aperture_64.c +++ b/arch/x86/kernel/aperture_64.c | |||
| @@ -499,7 +499,7 @@ out: | |||
| 499 | * Don't enable translation yet but enable GART IO and CPU | 499 | * Don't enable translation yet but enable GART IO and CPU |
| 500 | * accesses and set DISTLBWALKPRB since GART table memory is UC. | 500 | * accesses and set DISTLBWALKPRB since GART table memory is UC. |
| 501 | */ | 501 | */ |
| 502 | u32 ctl = DISTLBWALKPRB | aper_order << 1; | 502 | u32 ctl = aper_order << 1; |
| 503 | 503 | ||
| 504 | bus = amd_nb_bus_dev_ranges[i].bus; | 504 | bus = amd_nb_bus_dev_ranges[i].bus; |
| 505 | dev_base = amd_nb_bus_dev_ranges[i].dev_base; | 505 | dev_base = amd_nb_bus_dev_ranges[i].dev_base; |
diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c index 82ada01625b9..b117efd24f71 100644 --- a/arch/x86/kernel/pci-gart_64.c +++ b/arch/x86/kernel/pci-gart_64.c | |||
| @@ -81,6 +81,9 @@ static u32 gart_unmapped_entry; | |||
| 81 | #define AGPEXTERN | 81 | #define AGPEXTERN |
| 82 | #endif | 82 | #endif |
| 83 | 83 | ||
| 84 | /* GART can only remap to physical addresses < 1TB */ | ||
| 85 | #define GART_MAX_PHYS_ADDR (1ULL << 40) | ||
| 86 | |||
| 84 | /* backdoor interface to AGP driver */ | 87 | /* backdoor interface to AGP driver */ |
| 85 | AGPEXTERN int agp_memory_reserved; | 88 | AGPEXTERN int agp_memory_reserved; |
| 86 | AGPEXTERN __u32 *agp_gatt_table; | 89 | AGPEXTERN __u32 *agp_gatt_table; |
| @@ -212,9 +215,13 @@ static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem, | |||
| 212 | size_t size, int dir, unsigned long align_mask) | 215 | size_t size, int dir, unsigned long align_mask) |
| 213 | { | 216 | { |
| 214 | unsigned long npages = iommu_num_pages(phys_mem, size, PAGE_SIZE); | 217 | unsigned long npages = iommu_num_pages(phys_mem, size, PAGE_SIZE); |
| 215 | unsigned long iommu_page = alloc_iommu(dev, npages, align_mask); | 218 | unsigned long iommu_page; |
| 216 | int i; | 219 | int i; |
| 217 | 220 | ||
| 221 | if (unlikely(phys_mem + size > GART_MAX_PHYS_ADDR)) | ||
| 222 | return bad_dma_addr; | ||
| 223 | |||
| 224 | iommu_page = alloc_iommu(dev, npages, align_mask); | ||
| 218 | if (iommu_page == -1) { | 225 | if (iommu_page == -1) { |
| 219 | if (!nonforced_iommu(dev, phys_mem, size)) | 226 | if (!nonforced_iommu(dev, phys_mem, size)) |
| 220 | return phys_mem; | 227 | return phys_mem; |
