lkml.org 
[lkml]   [2011]   [Apr]   [18]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    Date
    From
    Subject[tip:x86/urgent] x86, gart: Make sure GART does not map physmem above 1TB
    Commit-ID:  665d3e2af83c8fbd149534db8f57d82fa6fa6753
    Gitweb: http://git.kernel.org/tip/665d3e2af83c8fbd149534db8f57d82fa6fa6753
    Author: Joerg Roedel <joerg.roedel@amd.com>
    AuthorDate: Mon, 18 Apr 2011 15:45:46 +0200
    Committer: H. Peter Anvin <hpa@zytor.com>
    CommitDate: Mon, 18 Apr 2011 09:26:49 -0700

    x86, gart: Make sure GART does not map physmem above 1TB

    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.

    Cc: <stable@kernel.org>
    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>
    ---
    arch/x86/kernel/pci-gart_64.c | 9 ++++++++-
    1 files changed, 8 insertions(+), 1 deletions(-)

    diff --git a/arch/x86/kernel/pci-gart_64.c b/arch/x86/kernel/pci-gart_64.c
    index 82ada01..b117efd 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;
    #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;

    \
     
     \ /
      Last update: 2011-04-18 18:43    [W:0.024 / U:267.660 seconds]
    ©2003-2016 Jasper Spaans. hosted at Digital OceanAdvertise on this site