linux/arch/x86/kernel/pci-gart_64.c
<<
>>
Prefs
   1/*
   2 * Dynamic DMA mapping support for AMD Hammer.
   3 *
   4 * Use the integrated AGP GART in the Hammer northbridge as an IOMMU for PCI.
   5 * This allows to use PCI devices that only support 32bit addresses on systems
   6 * with more than 4GB.
   7 *
   8 * See Documentation/DMA-mapping.txt for the interface specification.
   9 *
  10 * Copyright 2002 Andi Kleen, SuSE Labs.
  11 * Subject to the GNU General Public License v2 only.
  12 */
  13
  14#include <linux/types.h>
  15#include <linux/ctype.h>
  16#include <linux/agp_backend.h>
  17#include <linux/init.h>
  18#include <linux/mm.h>
  19#include <linux/string.h>
  20#include <linux/spinlock.h>
  21#include <linux/pci.h>
  22#include <linux/module.h>
  23#include <linux/topology.h>
  24#include <linux/interrupt.h>
  25#include <linux/bitops.h>
  26#include <linux/kdebug.h>
  27#include <linux/scatterlist.h>
  28#include <linux/iommu-helper.h>
  29#include <linux/sysdev.h>
  30#include <linux/io.h>
  31#include <asm/atomic.h>
  32#include <asm/mtrr.h>
  33#include <asm/pgtable.h>
  34#include <asm/proto.h>
  35#include <asm/iommu.h>
  36#include <asm/gart.h>
  37#include <asm/cacheflush.h>
  38#include <asm/swiotlb.h>
  39#include <asm/dma.h>
  40#include <asm/k8.h>
  41
  42static unsigned long iommu_bus_base;    /* GART remapping area (physical) */
  43static unsigned long iommu_size;        /* size of remapping area bytes */
  44static unsigned long iommu_pages;       /* .. and in pages */
  45
  46static u32 *iommu_gatt_base;            /* Remapping table */
  47
  48/*
  49 * If this is disabled the IOMMU will use an optimized flushing strategy
  50 * of only flushing when an mapping is reused. With it true the GART is
  51 * flushed for every mapping. Problem is that doing the lazy flush seems
  52 * to trigger bugs with some popular PCI cards, in particular 3ware (but
  53 * has been also also seen with Qlogic at least).
  54 */
  55int iommu_fullflush = 1;
  56
  57/* Allocation bitmap for the remapping area: */
  58static DEFINE_SPINLOCK(iommu_bitmap_lock);
  59/* Guarded by iommu_bitmap_lock: */
  60static unsigned long *iommu_gart_bitmap;
  61
  62static u32 gart_unmapped_entry;
  63
  64#define GPTE_VALID    1
  65#define GPTE_COHERENT 2
  66#define GPTE_ENCODE(x) \
  67        (((x) & 0xfffff000) | (((x) >> 32) << 4) | GPTE_VALID | GPTE_COHERENT)
  68#define GPTE_DECODE(x) (((x) & 0xfffff000) | (((u64)(x) & 0xff0) << 28))
  69
  70#define EMERGENCY_PAGES 32 /* = 128KB */
  71
  72#ifdef CONFIG_AGP
  73#define AGPEXTERN extern
  74#else
  75#define AGPEXTERN
  76#endif
  77
  78/* backdoor interface to AGP driver */
  79AGPEXTERN int agp_memory_reserved;
  80AGPEXTERN __u32 *agp_gatt_table;
  81
  82static unsigned long next_bit;  /* protected by iommu_bitmap_lock */
  83static bool need_flush;         /* global flush state. set for each gart wrap */
  84
  85static unsigned long alloc_iommu(struct device *dev, int size,
  86                                 unsigned long align_mask)
  87{
  88        unsigned long offset, flags;
  89        unsigned long boundary_size;
  90        unsigned long base_index;
  91
  92        base_index = ALIGN(iommu_bus_base & dma_get_seg_boundary(dev),
  93                           PAGE_SIZE) >> PAGE_SHIFT;
  94        boundary_size = ALIGN((unsigned long long)dma_get_seg_boundary(dev) + 1,
  95                              PAGE_SIZE) >> PAGE_SHIFT;
  96
  97        spin_lock_irqsave(&iommu_bitmap_lock, flags);
  98        offset = iommu_area_alloc(iommu_gart_bitmap, iommu_pages, next_bit,
  99                                  size, base_index, boundary_size, align_mask);
 100        if (offset == -1) {
 101                need_flush = true;
 102                offset = iommu_area_alloc(iommu_gart_bitmap, iommu_pages, 0,
 103                                          size, base_index, boundary_size,
 104                                          align_mask);
 105        }
 106        if (offset != -1) {
 107                next_bit = offset+size;
 108                if (next_bit >= iommu_pages) {
 109                        next_bit = 0;
 110                        need_flush = true;
 111                }
 112        }
 113        if (iommu_fullflush)
 114                need_flush = true;
 115        spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
 116
 117        return offset;
 118}
 119
 120static void free_iommu(unsigned long offset, int size)
 121{
 122        unsigned long flags;
 123
 124        spin_lock_irqsave(&iommu_bitmap_lock, flags);
 125        iommu_area_free(iommu_gart_bitmap, offset, size);
 126        if (offset >= next_bit)
 127                next_bit = offset + size;
 128        spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
 129}
 130
 131/*
 132 * Use global flush state to avoid races with multiple flushers.
 133 */
 134static void flush_gart(void)
 135{
 136        unsigned long flags;
 137
 138        spin_lock_irqsave(&iommu_bitmap_lock, flags);
 139        if (need_flush) {
 140                k8_flush_garts();
 141                need_flush = false;
 142        }
 143        spin_unlock_irqrestore(&iommu_bitmap_lock, flags);
 144}
 145
 146#ifdef CONFIG_IOMMU_LEAK
 147
 148#define SET_LEAK(x)                                                     \
 149        do {                                                            \
 150                if (iommu_leak_tab)                                     \
 151                        iommu_leak_tab[x] = __builtin_return_address(0);\
 152        } while (0)
 153
 154#define CLEAR_LEAK(x)                                                   \
 155        do {                                                            \
 156                if (iommu_leak_tab)                                     \
 157                        iommu_leak_tab[x] = NULL;                       \
 158        } while (0)
 159
 160/* Debugging aid for drivers that don't free their IOMMU tables */
 161static void **iommu_leak_tab;
 162static int leak_trace;
 163static int iommu_leak_pages = 20;
 164
 165static void dump_leak(void)
 166{
 167        int i;
 168        static int dump;
 169
 170        if (dump || !iommu_leak_tab)
 171                return;
 172        dump = 1;
 173        show_stack(NULL, NULL);
 174
 175        /* Very crude. dump some from the end of the table too */
 176        printk(KERN_DEBUG "Dumping %d pages from end of IOMMU:\n",
 177               iommu_leak_pages);
 178        for (i = 0; i < iommu_leak_pages; i += 2) {
 179                printk(KERN_DEBUG "%lu: ", iommu_pages-i);
 180                printk_address((unsigned long) iommu_leak_tab[iommu_pages-i],
 181                                0);
 182                printk(KERN_CONT "%c", (i+1)%2 == 0 ? '\n' : ' ');
 183        }
 184        printk(KERN_DEBUG "\n");
 185}
 186#else
 187# define SET_LEAK(x)
 188# define CLEAR_LEAK(x)
 189#endif
 190
 191static void iommu_full(struct device *dev, size_t size, int dir)
 192{
 193        /*
 194         * Ran out of IOMMU space for this operation. This is very bad.
 195         * Unfortunately the drivers cannot handle this operation properly.
 196         * Return some non mapped prereserved space in the aperture and
 197         * let the Northbridge deal with it. This will result in garbage
 198         * in the IO operation. When the size exceeds the prereserved space
 199         * memory corruption will occur or random memory will be DMAed
 200         * out. Hopefully no network devices use single mappings that big.
 201         */
 202
 203        dev_err(dev, "PCI-DMA: Out of IOMMU space for %lu bytes\n", size);
 204
 205        if (size > PAGE_SIZE*EMERGENCY_PAGES) {
 206                if (dir == PCI_DMA_FROMDEVICE || dir == PCI_DMA_BIDIRECTIONAL)
 207                        panic("PCI-DMA: Memory would be corrupted\n");
 208                if (dir == PCI_DMA_TODEVICE || dir == PCI_DMA_BIDIRECTIONAL)
 209                        panic(KERN_ERR
 210                                "PCI-DMA: Random memory would be DMAed\n");
 211        }
 212#ifdef CONFIG_IOMMU_LEAK
 213        dump_leak();
 214#endif
 215}
 216
 217static inline int
 218need_iommu(struct device *dev, unsigned long addr, size_t size)
 219{
 220        return force_iommu ||
 221                !is_buffer_dma_capable(*dev->dma_mask, addr, size);
 222}
 223
 224static inline int
 225nonforced_iommu(struct device *dev, unsigned long addr, size_t size)
 226{
 227        return !is_buffer_dma_capable(*dev->dma_mask, addr, size);
 228}
 229
 230/* Map a single continuous physical area into the IOMMU.
 231 * Caller needs to check if the iommu is needed and flush.
 232 */
 233static dma_addr_t dma_map_area(struct device *dev, dma_addr_t phys_mem,
 234                                size_t size, int dir, unsigned long align_mask)
 235{
 236        unsigned long npages = iommu_num_pages(phys_mem, size, PAGE_SIZE);
 237        unsigned long iommu_page = alloc_iommu(dev, npages, align_mask);
 238        int i;
 239
 240        if (iommu_page == -1) {
 241                if (!nonforced_iommu(dev, phys_mem, size))
 242                        return phys_mem;
 243                if (panic_on_overflow)
 244                        panic("dma_map_area overflow %lu bytes\n", size);
 245                iommu_full(dev, size, dir);
 246                return bad_dma_address;
 247        }
 248
 249        for (i = 0; i < npages; i++) {
 250                iommu_gatt_base[iommu_page + i] = GPTE_ENCODE(phys_mem);
 251                SET_LEAK(iommu_page + i);
 252                phys_mem += PAGE_SIZE;
 253        }
 254        return iommu_bus_base + iommu_page*PAGE_SIZE + (phys_mem & ~PAGE_MASK);
 255}
 256
 257/* Map a single area into the IOMMU */
 258static dma_addr_t
 259gart_map_single(struct device *dev, phys_addr_t paddr, size_t size, int dir)
 260{
 261        unsigned long bus;
 262
 263        if (!dev)
 264                dev = &x86_dma_fallback_dev;
 265
 266        if (!need_iommu(dev, paddr, size))
 267                return paddr;
 268
 269        bus = dma_map_area(dev, paddr, size, dir, 0);
 270        flush_gart();
 271
 272        return bus;
 273}
 274
 275/*
 276 * Free a DMA mapping.
 277 */
 278static void gart_unmap_single(struct device *dev, dma_addr_t dma_addr,
 279                              size_t size, int direction)
 280{
 281        unsigned long iommu_page;
 282        int npages;
 283        int i;
 284
 285        if (dma_addr < iommu_bus_base + EMERGENCY_PAGES*PAGE_SIZE ||
 286            dma_addr >= iommu_bus_base + iommu_size)
 287                return;
 288
 289        iommu_page = (dma_addr - iommu_bus_base)>>PAGE_SHIFT;
 290        npages = iommu_num_pages(dma_addr, size, PAGE_SIZE);
 291        for (i = 0; i < npages; i++) {
 292                iommu_gatt_base[iommu_page + i] = gart_unmapped_entry;
 293                CLEAR_LEAK(iommu_page + i);
 294        }
 295        free_iommu(iommu_page, npages);
 296}
 297
 298/*
 299 * Wrapper for pci_unmap_single working with scatterlists.
 300 */
 301static void
 302gart_unmap_sg(struct device *dev, struct scatterlist *sg, int nents, int dir)
 303{
 304        struct scatterlist *s;
 305        int i;
 306
 307        for_each_sg(sg, s, nents, i) {
 308                if (!s->dma_length || !s->length)
 309                        break;
 310                gart_unmap_single(dev, s->dma_address, s->dma_length, dir);
 311        }
 312}
 313
 314/* Fallback for dma_map_sg in case of overflow */
 315static int dma_map_sg_nonforce(struct device *dev, struct scatterlist *sg,
 316                               int nents, int dir)
 317{
 318        struct scatterlist *s;
 319        int i;
 320
 321#ifdef CONFIG_IOMMU_DEBUG
 322        printk(KERN_DEBUG "dma_map_sg overflow\n");
 323#endif
 324
 325        for_each_sg(sg, s, nents, i) {
 326                unsigned long addr = sg_phys(s);
 327
 328                if (nonforced_iommu(dev, addr, s->length)) {
 329                        addr = dma_map_area(dev, addr, s->length, dir, 0);
 330                        if (addr == bad_dma_address) {
 331                                if (i > 0)
 332                                        gart_unmap_sg(dev, sg, i, dir);
 333                                nents = 0;
 334                                sg[0].dma_length = 0;
 335                                break;
 336                        }
 337                }
 338                s->dma_address = addr;
 339                s->dma_length = s->length;
 340        }
 341        flush_gart();
 342
 343        return nents;
 344}
 345
 346/* Map multiple scatterlist entries continuous into the first. */
 347static int __dma_map_cont(struct device *dev, struct scatterlist *start,
 348                          int nelems, struct scatterlist *sout,
 349                          unsigned long pages)
 350{
 351        unsigned long iommu_start = alloc_iommu(dev, pages, 0);
 352        unsigned long iommu_page = iommu_start;
 353        struct scatterlist *s;
 354        int i;
 355
 356        if (iommu_start == -1)
 357                return -1;
 358
 359        for_each_sg(start, s, nelems, i) {
 360                unsigned long pages, addr;
 361                unsigned long phys_addr = s->dma_address;
 362
 363                BUG_ON(s != start && s->offset);
 364                if (s == start) {
 365                        sout->dma_address = iommu_bus_base;
 366                        sout->dma_address += iommu_page*PAGE_SIZE + s->offset;
 367                        sout->dma_length = s->length;
 368                } else {
 369                        sout->dma_length += s->length;
 370                }
 371
 372                addr = phys_addr;
 373                pages = iommu_num_pages(s->offset, s->length, PAGE_SIZE);
 374                while (pages--) {
 375                        iommu_gatt_base[iommu_page] = GPTE_ENCODE(addr);
 376                        SET_LEAK(iommu_page);
 377                        addr += PAGE_SIZE;
 378                        iommu_page++;
 379                }
 380        }
 381        BUG_ON(iommu_page - iommu_start != pages);
 382
 383        return 0;
 384}
 385
 386static inline int
 387dma_map_cont(struct device *dev, struct scatterlist *start, int nelems,
 388             struct scatterlist *sout, unsigned long pages, int need)
 389{
 390        if (!need) {
 391                BUG_ON(nelems != 1);
 392                sout->dma_address = start->dma_address;
 393                sout->dma_length = start->length;
 394                return 0;
 395        }
 396        return __dma_map_cont(dev, start, nelems, sout, pages);
 397}
 398
 399/*
 400 * DMA map all entries in a scatterlist.
 401 * Merge chunks that have page aligned sizes into a continuous mapping.
 402 */
 403static int
 404gart_map_sg(struct device *dev, struct scatterlist *sg, int nents, int dir)
 405{
 406        struct scatterlist *s, *ps, *start_sg, *sgmap;
 407        int need = 0, nextneed, i, out, start;
 408        unsigned long pages = 0;
 409        unsigned int seg_size;
 410        unsigned int max_seg_size;
 411
 412        if (nents == 0)
 413                return 0;
 414
 415        if (!dev)
 416                dev = &x86_dma_fallback_dev;
 417
 418        out = 0;
 419        start = 0;
 420        start_sg = sgmap = sg;
 421        seg_size = 0;
 422        max_seg_size = dma_get_max_seg_size(dev);
 423        ps = NULL; /* shut up gcc */
 424        for_each_sg(sg, s, nents, i) {
 425                dma_addr_t addr = sg_phys(s);
 426
 427                s->dma_address = addr;
 428                BUG_ON(s->length == 0);
 429
 430                nextneed = need_iommu(dev, addr, s->length);
 431
 432                /* Handle the previous not yet processed entries */
 433                if (i > start) {
 434                        /*
 435                         * Can only merge when the last chunk ends on a
 436                         * page boundary and the new one doesn't have an
 437                         * offset.
 438                         */
 439                        if (!iommu_merge || !nextneed || !need || s->offset ||
 440                            (s->length + seg_size > max_seg_size) ||
 441                            (ps->offset + ps->length) % PAGE_SIZE) {
 442                                if (dma_map_cont(dev, start_sg, i - start,
 443                                                 sgmap, pages, need) < 0)
 444                                        goto error;
 445                                out++;
 446                                seg_size = 0;
 447                                sgmap = sg_next(sgmap);
 448                                pages = 0;
 449                                start = i;
 450                                start_sg = s;
 451                        }
 452                }
 453
 454                seg_size += s->length;
 455                need = nextneed;
 456                pages += iommu_num_pages(s->offset, s->length, PAGE_SIZE);
 457                ps = s;
 458        }
 459        if (dma_map_cont(dev, start_sg, i - start, sgmap, pages, need) < 0)
 460                goto error;
 461        out++;
 462        flush_gart();
 463        if (out < nents) {
 464                sgmap = sg_next(sgmap);
 465                sgmap->dma_length = 0;
 466        }
 467        return out;
 468
 469error:
 470        flush_gart();
 471        gart_unmap_sg(dev, sg, out, dir);
 472
 473        /* When it was forced or merged try again in a dumb way */
 474        if (force_iommu || iommu_merge) {
 475                out = dma_map_sg_nonforce(dev, sg, nents, dir);
 476                if (out > 0)
 477                        return out;
 478        }
 479        if (panic_on_overflow)
 480                panic("dma_map_sg: overflow on %lu pages\n", pages);
 481
 482        iommu_full(dev, pages << PAGE_SHIFT, dir);
 483        for_each_sg(sg, s, nents, i)
 484                s->dma_address = bad_dma_address;
 485        return 0;
 486}
 487
 488/* allocate and map a coherent mapping */
 489static void *
 490gart_alloc_coherent(struct device *dev, size_t size, dma_addr_t *dma_addr,
 491                    gfp_t flag)
 492{
 493        dma_addr_t paddr;
 494        unsigned long align_mask;
 495        struct page *page;
 496
 497        if (force_iommu && !(flag & GFP_DMA)) {
 498                flag &= ~(__GFP_DMA | __GFP_HIGHMEM | __GFP_DMA32);
 499                page = alloc_pages(flag | __GFP_ZERO, get_order(size));
 500                if (!page)
 501                        return NULL;
 502
 503                align_mask = (1UL << get_order(size)) - 1;
 504                paddr = dma_map_area(dev, page_to_phys(page), size,
 505                                     DMA_BIDIRECTIONAL, align_mask);
 506
 507                flush_gart();
 508                if (paddr != bad_dma_address) {
 509                        *dma_addr = paddr;
 510                        return page_address(page);
 511                }
 512                __free_pages(page, get_order(size));
 513        } else
 514                return dma_generic_alloc_coherent(dev, size, dma_addr, flag);
 515
 516        return NULL;
 517}
 518
 519/* free a coherent mapping */
 520static void
 521gart_free_coherent(struct device *dev, size_t size, void *vaddr,
 522                   dma_addr_t dma_addr)
 523{
 524        gart_unmap_single(dev, dma_addr, size, DMA_BIDIRECTIONAL);
 525        free_pages((unsigned long)vaddr, get_order(size));
 526}
 527
 528static int no_agp;
 529
 530static __init unsigned long check_iommu_size(unsigned long aper, u64 aper_size)
 531{
 532        unsigned long a;
 533
 534        if (!iommu_size) {
 535                iommu_size = aper_size;
 536                if (!no_agp)
 537                        iommu_size /= 2;
 538        }
 539
 540        a = aper + iommu_size;
 541        iommu_size -= round_up(a, PMD_PAGE_SIZE) - a;
 542
 543        if (iommu_size < 64*1024*1024) {
 544                printk(KERN_WARNING
 545                        "PCI-DMA: Warning: Small IOMMU %luMB."
 546                        " Consider increasing the AGP aperture in BIOS\n",
 547                                iommu_size >> 20);
 548        }
 549
 550        return iommu_size;
 551}
 552
 553static __init unsigned read_aperture(struct pci_dev *dev, u32 *size)
 554{
 555        unsigned aper_size = 0, aper_base_32, aper_order;
 556        u64 aper_base;
 557
 558        pci_read_config_dword(dev, AMD64_GARTAPERTUREBASE, &aper_base_32);
 559        pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &aper_order);
 560        aper_order = (aper_order >> 1) & 7;
 561
 562        aper_base = aper_base_32 & 0x7fff;
 563        aper_base <<= 25;
 564
 565        aper_size = (32 * 1024 * 1024) << aper_order;
 566        if (aper_base + aper_size > 0x100000000UL || !aper_size)
 567                aper_base = 0;
 568
 569        *size = aper_size;
 570        return aper_base;
 571}
 572
 573static void enable_gart_translations(void)
 574{
 575        int i;
 576
 577        for (i = 0; i < num_k8_northbridges; i++) {
 578                struct pci_dev *dev = k8_northbridges[i];
 579
 580                enable_gart_translation(dev, __pa(agp_gatt_table));
 581        }
 582}
 583
 584/*
 585 * If fix_up_north_bridges is set, the north bridges have to be fixed up on
 586 * resume in the same way as they are handled in gart_iommu_hole_init().
 587 */
 588static bool fix_up_north_bridges;
 589static u32 aperture_order;
 590static u32 aperture_alloc;
 591
 592void set_up_gart_resume(u32 aper_order, u32 aper_alloc)
 593{
 594        fix_up_north_bridges = true;
 595        aperture_order = aper_order;
 596        aperture_alloc = aper_alloc;
 597}
 598
 599static int gart_resume(struct sys_device *dev)
 600{
 601        printk(KERN_INFO "PCI-DMA: Resuming GART IOMMU\n");
 602
 603        if (fix_up_north_bridges) {
 604                int i;
 605
 606                printk(KERN_INFO "PCI-DMA: Restoring GART aperture settings\n");
 607
 608                for (i = 0; i < num_k8_northbridges; i++) {
 609                        struct pci_dev *dev = k8_northbridges[i];
 610
 611                        /*
 612                         * Don't enable translations just yet.  That is the next
 613                         * step.  Restore the pre-suspend aperture settings.
 614                         */
 615                        pci_write_config_dword(dev, AMD64_GARTAPERTURECTL,
 616                                                aperture_order << 1);
 617                        pci_write_config_dword(dev, AMD64_GARTAPERTUREBASE,
 618                                                aperture_alloc >> 25);
 619                }
 620        }
 621
 622        enable_gart_translations();
 623
 624        return 0;
 625}
 626
 627static int gart_suspend(struct sys_device *dev, pm_message_t state)
 628{
 629        return 0;
 630}
 631
 632static struct sysdev_class gart_sysdev_class = {
 633        .name = "gart",
 634        .suspend = gart_suspend,
 635        .resume = gart_resume,
 636
 637};
 638
 639static struct sys_device device_gart = {
 640        .id     = 0,
 641        .cls    = &gart_sysdev_class,
 642};
 643
 644/*
 645 * Private Northbridge GATT initialization in case we cannot use the
 646 * AGP driver for some reason.
 647 */
 648static __init int init_k8_gatt(struct agp_kern_info *info)
 649{
 650        unsigned aper_size, gatt_size, new_aper_size;
 651        unsigned aper_base, new_aper_base;
 652        struct pci_dev *dev;
 653        void *gatt;
 654        int i, error;
 655
 656        printk(KERN_INFO "PCI-DMA: Disabling AGP.\n");
 657        aper_size = aper_base = info->aper_size = 0;
 658        dev = NULL;
 659        for (i = 0; i < num_k8_northbridges; i++) {
 660                dev = k8_northbridges[i];
 661                new_aper_base = read_aperture(dev, &new_aper_size);
 662                if (!new_aper_base)
 663                        goto nommu;
 664
 665                if (!aper_base) {
 666                        aper_size = new_aper_size;
 667                        aper_base = new_aper_base;
 668                }
 669                if (aper_size != new_aper_size || aper_base != new_aper_base)
 670                        goto nommu;
 671        }
 672        if (!aper_base)
 673                goto nommu;
 674        info->aper_base = aper_base;
 675        info->aper_size = aper_size >> 20;
 676
 677        gatt_size = (aper_size >> PAGE_SHIFT) * sizeof(u32);
 678        gatt = (void *)__get_free_pages(GFP_KERNEL | __GFP_ZERO,
 679                                        get_order(gatt_size));
 680        if (!gatt)
 681                panic("Cannot allocate GATT table");
 682        if (set_memory_uc((unsigned long)gatt, gatt_size >> PAGE_SHIFT))
 683                panic("Could not set GART PTEs to uncacheable pages");
 684
 685        agp_gatt_table = gatt;
 686
 687        enable_gart_translations();
 688
 689        error = sysdev_class_register(&gart_sysdev_class);
 690        if (!error)
 691                error = sysdev_register(&device_gart);
 692        if (error)
 693                panic("Could not register gart_sysdev -- "
 694                      "would corrupt data on next suspend");
 695
 696        flush_gart();
 697
 698        printk(KERN_INFO "PCI-DMA: aperture base @ %x size %u KB\n",
 699               aper_base, aper_size>>10);
 700
 701        return 0;
 702
 703 nommu:
 704        /* Should not happen anymore */
 705        printk(KERN_WARNING "PCI-DMA: More than 4GB of RAM and no IOMMU\n"
 706               KERN_WARNING "falling back to iommu=soft.\n");
 707        return -1;
 708}
 709
 710static struct dma_mapping_ops gart_dma_ops = {
 711        .map_single                     = gart_map_single,
 712        .unmap_single                   = gart_unmap_single,
 713        .map_sg                         = gart_map_sg,
 714        .unmap_sg                       = gart_unmap_sg,
 715        .alloc_coherent                 = gart_alloc_coherent,
 716        .free_coherent                  = gart_free_coherent,
 717};
 718
 719void gart_iommu_shutdown(void)
 720{
 721        struct pci_dev *dev;
 722        int i;
 723
 724        if (no_agp && (dma_ops != &gart_dma_ops))
 725                return;
 726
 727        for (i = 0; i < num_k8_northbridges; i++) {
 728                u32 ctl;
 729
 730                dev = k8_northbridges[i];
 731                pci_read_config_dword(dev, AMD64_GARTAPERTURECTL, &ctl);
 732
 733                ctl &= ~GARTEN;
 734
 735                pci_write_config_dword(dev, AMD64_GARTAPERTURECTL, ctl);
 736        }
 737}
 738
 739void __init gart_iommu_init(void)
 740{
 741        struct agp_kern_info info;
 742        unsigned long iommu_start;
 743        unsigned long aper_base, aper_size;
 744        unsigned long start_pfn, end_pfn;
 745        unsigned long scratch;
 746        long i;
 747
 748        if (cache_k8_northbridges() < 0 || num_k8_northbridges == 0)
 749                return;
 750
 751#ifndef CONFIG_AGP_AMD64
 752        no_agp = 1;
 753#else
 754        /* Makefile puts PCI initialization via subsys_initcall first. */
 755        /* Add other K8 AGP bridge drivers here */
 756        no_agp = no_agp ||
 757                (agp_amd64_init() < 0) ||
 758                (agp_copy_info(agp_bridge, &info) < 0);
 759#endif
 760
 761        if (swiotlb)
 762                return;
 763
 764        /* Did we detect a different HW IOMMU? */
 765        if (iommu_detected && !gart_iommu_aperture)
 766                return;
 767
 768        if (no_iommu ||
 769            (!force_iommu && max_pfn <= MAX_DMA32_PFN) ||
 770            !gart_iommu_aperture ||
 771            (no_agp && init_k8_gatt(&info) < 0)) {
 772                if (max_pfn > MAX_DMA32_PFN) {
 773                        printk(KERN_WARNING "More than 4GB of memory "
 774                               "but GART IOMMU not available.\n");
 775                        printk(KERN_WARNING "falling back to iommu=soft.\n");
 776                }
 777                return;
 778        }
 779
 780        /* need to map that range */
 781        aper_size = info.aper_size << 20;
 782        aper_base = info.aper_base;
 783        end_pfn = (aper_base>>PAGE_SHIFT) + (aper_size>>PAGE_SHIFT);
 784        if (end_pfn > max_low_pfn_mapped) {
 785                start_pfn = (aper_base>>PAGE_SHIFT);
 786                init_memory_mapping(start_pfn<<PAGE_SHIFT, end_pfn<<PAGE_SHIFT);
 787        }
 788
 789        printk(KERN_INFO "PCI-DMA: using GART IOMMU.\n");
 790        iommu_size = check_iommu_size(info.aper_base, aper_size);
 791        iommu_pages = iommu_size >> PAGE_SHIFT;
 792
 793        iommu_gart_bitmap = (void *) __get_free_pages(GFP_KERNEL | __GFP_ZERO,
 794                                                      get_order(iommu_pages/8));
 795        if (!iommu_gart_bitmap)
 796                panic("Cannot allocate iommu bitmap\n");
 797
 798#ifdef CONFIG_IOMMU_LEAK
 799        if (leak_trace) {
 800                iommu_leak_tab = (void *)__get_free_pages(GFP_KERNEL|__GFP_ZERO,
 801                                  get_order(iommu_pages*sizeof(void *)));
 802                if (!iommu_leak_tab)
 803                        printk(KERN_DEBUG
 804                               "PCI-DMA: Cannot allocate leak trace area\n");
 805        }
 806#endif
 807
 808        /*
 809         * Out of IOMMU space handling.
 810         * Reserve some invalid pages at the beginning of the GART.
 811         */
 812        iommu_area_reserve(iommu_gart_bitmap, 0, EMERGENCY_PAGES);
 813
 814        agp_memory_reserved = iommu_size;
 815        printk(KERN_INFO
 816               "PCI-DMA: Reserving %luMB of IOMMU area in the AGP aperture\n",
 817               iommu_size >> 20);
 818
 819        iommu_start = aper_size - iommu_size;
 820        iommu_bus_base = info.aper_base + iommu_start;
 821        bad_dma_address = iommu_bus_base;
 822        iommu_gatt_base = agp_gatt_table + (iommu_start>>PAGE_SHIFT);
 823
 824        /*
 825         * Unmap the IOMMU part of the GART. The alias of the page is
 826         * always mapped with cache enabled and there is no full cache
 827         * coherency across the GART remapping. The unmapping avoids
 828         * automatic prefetches from the CPU allocating cache lines in
 829         * there. All CPU accesses are done via the direct mapping to
 830         * the backing memory. The GART address is only used by PCI
 831         * devices.
 832         */
 833        set_memory_np((unsigned long)__va(iommu_bus_base),
 834                                iommu_size >> PAGE_SHIFT);
 835        /*
 836         * Tricky. The GART table remaps the physical memory range,
 837         * so the CPU wont notice potential aliases and if the memory
 838         * is remapped to UC later on, we might surprise the PCI devices
 839         * with a stray writeout of a cacheline. So play it sure and
 840         * do an explicit, full-scale wbinvd() _after_ having marked all
 841         * the pages as Not-Present:
 842         */
 843        wbinvd();
 844
 845        /*
 846         * Try to workaround a bug (thanks to BenH):
 847         * Set unmapped entries to a scratch page instead of 0.
 848         * Any prefetches that hit unmapped entries won't get an bus abort
 849         * then. (P2P bridge may be prefetching on DMA reads).
 850         */
 851        scratch = get_zeroed_page(GFP_KERNEL);
 852        if (!scratch)
 853                panic("Cannot allocate iommu scratch page");
 854        gart_unmapped_entry = GPTE_ENCODE(__pa(scratch));
 855        for (i = EMERGENCY_PAGES; i < iommu_pages; i++)
 856                iommu_gatt_base[i] = gart_unmapped_entry;
 857
 858        flush_gart();
 859        dma_ops = &gart_dma_ops;
 860}
 861
 862void __init gart_parse_options(char *p)
 863{
 864        int arg;
 865
 866#ifdef CONFIG_IOMMU_LEAK
 867        if (!strncmp(p, "leak", 4)) {
 868                leak_trace = 1;
 869                p += 4;
 870                if (*p == '=')
 871                        ++p;
 872                if (isdigit(*p) && get_option(&p, &arg))
 873                        iommu_leak_pages = arg;
 874        }
 875#endif
 876        if (isdigit(*p) && get_option(&p, &arg))
 877                iommu_size = arg;
 878        if (!strncmp(p, "fullflush", 8))
 879                iommu_fullflush = 1;
 880        if (!strncmp(p, "nofullflush", 11))
 881                iommu_fullflush = 0;
 882        if (!strncmp(p, "noagp", 5))
 883                no_agp = 1;
 884        if (!strncmp(p, "noaperture", 10))
 885                fix_aperture = 0;
 886        /* duplicated from pci-dma.c */
 887        if (!strncmp(p, "force", 5))
 888                gart_iommu_aperture_allowed = 1;
 889        if (!strncmp(p, "allowed", 7))
 890                gart_iommu_aperture_allowed = 1;
 891        if (!strncmp(p, "memaper", 7)) {
 892                fallback_aper_force = 1;
 893                p += 7;
 894                if (*p == '=') {
 895                        ++p;
 896                        if (get_option(&p, &arg))
 897                                fallback_aper_order = arg;
 898                }
 899        }
 900}
 901
lxr.linux.no kindly hosted by Redpill Linpro AS, provider of Linux consulting and operations services since 1995.