linux/arch/alpha/kernel/pci_iommu.c
<<
>>
Prefs
   1// SPDX-License-Identifier: GPL-2.0
   2/*
   3 *      linux/arch/alpha/kernel/pci_iommu.c
   4 */
   5
   6#include <linux/kernel.h>
   7#include <linux/mm.h>
   8#include <linux/pci.h>
   9#include <linux/gfp.h>
  10#include <linux/bootmem.h>
  11#include <linux/export.h>
  12#include <linux/scatterlist.h>
  13#include <linux/log2.h>
  14#include <linux/dma-mapping.h>
  15#include <linux/iommu-helper.h>
  16
  17#include <asm/io.h>
  18#include <asm/hwrpb.h>
  19
  20#include "proto.h"
  21#include "pci_impl.h"
  22
  23
  24#define DEBUG_ALLOC 0
  25#if DEBUG_ALLOC > 0
  26# define DBGA(args...)          printk(KERN_DEBUG args)
  27#else
  28# define DBGA(args...)
  29#endif
  30#if DEBUG_ALLOC > 1
  31# define DBGA2(args...)         printk(KERN_DEBUG args)
  32#else
  33# define DBGA2(args...)
  34#endif
  35
  36#define DEBUG_NODIRECT 0
  37
  38#define ISA_DMA_MASK            0x00ffffff
  39
  40static inline unsigned long
  41mk_iommu_pte(unsigned long paddr)
  42{
  43        return (paddr >> (PAGE_SHIFT-1)) | 1;
  44}
  45
  46/* Return the minimum of MAX or the first power of two larger
  47   than main memory.  */
  48
  49unsigned long
  50size_for_memory(unsigned long max)
  51{
  52        unsigned long mem = max_low_pfn << PAGE_SHIFT;
  53        if (mem < max)
  54                max = roundup_pow_of_two(mem);
  55        return max;
  56}
  57
  58struct pci_iommu_arena * __init
  59iommu_arena_new_node(int nid, struct pci_controller *hose, dma_addr_t base,
  60                     unsigned long window_size, unsigned long align)
  61{
  62        unsigned long mem_size;
  63        struct pci_iommu_arena *arena;
  64
  65        mem_size = window_size / (PAGE_SIZE / sizeof(unsigned long));
  66
  67        /* Note that the TLB lookup logic uses bitwise concatenation,
  68           not addition, so the required arena alignment is based on
  69           the size of the window.  Retain the align parameter so that
  70           particular systems can over-align the arena.  */
  71        if (align < mem_size)
  72                align = mem_size;
  73
  74
  75#ifdef CONFIG_DISCONTIGMEM
  76
  77        arena = alloc_bootmem_node(NODE_DATA(nid), sizeof(*arena));
  78        if (!NODE_DATA(nid) || !arena) {
  79                printk("%s: couldn't allocate arena from node %d\n"
  80                       "    falling back to system-wide allocation\n",
  81                       __func__, nid);
  82                arena = alloc_bootmem(sizeof(*arena));
  83        }
  84
  85        arena->ptes = __alloc_bootmem_node(NODE_DATA(nid), mem_size, align, 0);
  86        if (!NODE_DATA(nid) || !arena->ptes) {
  87                printk("%s: couldn't allocate arena ptes from node %d\n"
  88                       "    falling back to system-wide allocation\n",
  89                       __func__, nid);
  90                arena->ptes = __alloc_bootmem(mem_size, align, 0);
  91        }
  92
  93#else /* CONFIG_DISCONTIGMEM */
  94
  95        arena = alloc_bootmem(sizeof(*arena));
  96        arena->ptes = __alloc_bootmem(mem_size, align, 0);
  97
  98#endif /* CONFIG_DISCONTIGMEM */
  99
 100        spin_lock_init(&arena->lock);
 101        arena->hose = hose;
 102        arena->dma_base = base;
 103        arena->size = window_size;
 104        arena->next_entry = 0;
 105
 106        /* Align allocations to a multiple of a page size.  Not needed
 107           unless there are chip bugs.  */
 108        arena->align_entry = 1;
 109
 110        return arena;
 111}
 112
 113struct pci_iommu_arena * __init
 114iommu_arena_new(struct pci_controller *hose, dma_addr_t base,
 115                unsigned long window_size, unsigned long align)
 116{
 117        return iommu_arena_new_node(0, hose, base, window_size, align);
 118}
 119
 120/* Must be called with the arena lock held */
 121static long
 122iommu_arena_find_pages(struct device *dev, struct pci_iommu_arena *arena,
 123                       long n, long mask)
 124{
 125        unsigned long *ptes;
 126        long i, p, nent;
 127        int pass = 0;
 128        unsigned long base;
 129        unsigned long boundary_size;
 130
 131        base = arena->dma_base >> PAGE_SHIFT;
 132        if (dev) {
 133                boundary_size = dma_get_seg_boundary(dev) + 1;
 134                boundary_size >>= PAGE_SHIFT;
 135        } else {
 136                boundary_size = 1UL << (32 - PAGE_SHIFT);
 137        }
 138
 139        /* Search forward for the first mask-aligned sequence of N free ptes */
 140        ptes = arena->ptes;
 141        nent = arena->size >> PAGE_SHIFT;
 142        p = ALIGN(arena->next_entry, mask + 1);
 143        i = 0;
 144
 145again:
 146        while (i < n && p+i < nent) {
 147                if (!i && iommu_is_span_boundary(p, n, base, boundary_size)) {
 148                        p = ALIGN(p + 1, mask + 1);
 149                        goto again;
 150                }
 151
 152                if (ptes[p+i])
 153                        p = ALIGN(p + i + 1, mask + 1), i = 0;
 154                else
 155                        i = i + 1;
 156        }
 157
 158        if (i < n) {
 159                if (pass < 1) {
 160                        /*
 161                         * Reached the end.  Flush the TLB and restart
 162                         * the search from the beginning.
 163                        */
 164                        alpha_mv.mv_pci_tbi(arena->hose, 0, -1);
 165
 166                        pass++;
 167                        p = 0;
 168                        i = 0;
 169                        goto again;
 170                } else
 171                        return -1;
 172        }
 173
 174        /* Success. It's the responsibility of the caller to mark them
 175           in use before releasing the lock */
 176        return p;
 177}
 178
 179static long
 180iommu_arena_alloc(struct device *dev, struct pci_iommu_arena *arena, long n,
 181                  unsigned int align)
 182{
 183        unsigned long flags;
 184        unsigned long *ptes;
 185        long i, p, mask;
 186
 187        spin_lock_irqsave(&arena->lock, flags);
 188
 189        /* Search for N empty ptes */
 190        ptes = arena->ptes;
 191        mask = max(align, arena->align_entry) - 1;
 192        p = iommu_arena_find_pages(dev, arena, n, mask);
 193        if (p < 0) {
 194                spin_unlock_irqrestore(&arena->lock, flags);
 195                return -1;
 196        }
 197
 198        /* Success.  Mark them all in use, ie not zero and invalid
 199           for the iommu tlb that could load them from under us.
 200           The chip specific bits will fill this in with something
 201           kosher when we return.  */
 202        for (i = 0; i < n; ++i)
 203                ptes[p+i] = IOMMU_INVALID_PTE;
 204
 205        arena->next_entry = p + n;
 206        spin_unlock_irqrestore(&arena->lock, flags);
 207
 208        return p;
 209}
 210
 211static void
 212iommu_arena_free(struct pci_iommu_arena *arena, long ofs, long n)
 213{
 214        unsigned long *p;
 215        long i;
 216
 217        p = arena->ptes + ofs;
 218        for (i = 0; i < n; ++i)
 219                p[i] = 0;
 220}
 221
 222/*
 223 * True if the machine supports DAC addressing, and DEV can
 224 * make use of it given MASK.
 225 */
 226static int pci_dac_dma_supported(struct pci_dev *dev, u64 mask)
 227{
 228        dma_addr_t dac_offset = alpha_mv.pci_dac_offset;
 229        int ok = 1;
 230
 231        /* If this is not set, the machine doesn't support DAC at all.  */
 232        if (dac_offset == 0)
 233                ok = 0;
 234
 235        /* The device has to be able to address our DAC bit.  */
 236        if ((dac_offset & dev->dma_mask) != dac_offset)
 237                ok = 0;
 238
 239        /* If both conditions above are met, we are fine. */
 240        DBGA("pci_dac_dma_supported %s from %pf\n",
 241             ok ? "yes" : "no", __builtin_return_address(0));
 242
 243        return ok;
 244}
 245
 246/* Map a single buffer of the indicated size for PCI DMA in streaming
 247   mode.  The 32-bit PCI bus mastering address to use is returned.
 248   Once the device is given the dma address, the device owns this memory
 249   until either pci_unmap_single or pci_dma_sync_single is performed.  */
 250
 251static dma_addr_t
 252pci_map_single_1(struct pci_dev *pdev, void *cpu_addr, size_t size,
 253                 int dac_allowed)
 254{
 255        struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose;
 256        dma_addr_t max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK;
 257        struct pci_iommu_arena *arena;
 258        long npages, dma_ofs, i;
 259        unsigned long paddr;
 260        dma_addr_t ret;
 261        unsigned int align = 0;
 262        struct device *dev = pdev ? &pdev->dev : NULL;
 263
 264        paddr = __pa(cpu_addr);
 265
 266#if !DEBUG_NODIRECT
 267        /* First check to see if we can use the direct map window.  */
 268        if (paddr + size + __direct_map_base - 1 <= max_dma
 269            && paddr + size <= __direct_map_size) {
 270                ret = paddr + __direct_map_base;
 271
 272                DBGA2("pci_map_single: [%p,%zx] -> direct %llx from %pf\n",
 273                      cpu_addr, size, ret, __builtin_return_address(0));
 274
 275                return ret;
 276        }
 277#endif
 278
 279        /* Next, use DAC if selected earlier.  */
 280        if (dac_allowed) {
 281                ret = paddr + alpha_mv.pci_dac_offset;
 282
 283                DBGA2("pci_map_single: [%p,%zx] -> DAC %llx from %pf\n",
 284                      cpu_addr, size, ret, __builtin_return_address(0));
 285
 286                return ret;
 287        }
 288
 289        /* If the machine doesn't define a pci_tbi routine, we have to
 290           assume it doesn't support sg mapping, and, since we tried to
 291           use direct_map above, it now must be considered an error. */
 292        if (! alpha_mv.mv_pci_tbi) {
 293                printk_once(KERN_WARNING "pci_map_single: no HW sg\n");
 294                return 0;
 295        }
 296
 297        arena = hose->sg_pci;
 298        if (!arena || arena->dma_base + arena->size - 1 > max_dma)
 299                arena = hose->sg_isa;
 300
 301        npages = iommu_num_pages(paddr, size, PAGE_SIZE);
 302
 303        /* Force allocation to 64KB boundary for ISA bridges. */
 304        if (pdev && pdev == isa_bridge)
 305                align = 8;
 306        dma_ofs = iommu_arena_alloc(dev, arena, npages, align);
 307        if (dma_ofs < 0) {
 308                printk(KERN_WARNING "pci_map_single failed: "
 309                       "could not allocate dma page tables\n");
 310                return 0;
 311        }
 312
 313        paddr &= PAGE_MASK;
 314        for (i = 0; i < npages; ++i, paddr += PAGE_SIZE)
 315                arena->ptes[i + dma_ofs] = mk_iommu_pte(paddr);
 316
 317        ret = arena->dma_base + dma_ofs * PAGE_SIZE;
 318        ret += (unsigned long)cpu_addr & ~PAGE_MASK;
 319
 320        DBGA2("pci_map_single: [%p,%zx] np %ld -> sg %llx from %pf\n",
 321              cpu_addr, size, npages, ret, __builtin_return_address(0));
 322
 323        return ret;
 324}
 325
 326/* Helper for generic DMA-mapping functions. */
 327static struct pci_dev *alpha_gendev_to_pci(struct device *dev)
 328{
 329        if (dev && dev_is_pci(dev))
 330                return to_pci_dev(dev);
 331
 332        /* Assume that non-PCI devices asking for DMA are either ISA or EISA,
 333           BUG() otherwise. */
 334        BUG_ON(!isa_bridge);
 335
 336        /* Assume non-busmaster ISA DMA when dma_mask is not set (the ISA
 337           bridge is bus master then). */
 338        if (!dev || !dev->dma_mask || !*dev->dma_mask)
 339                return isa_bridge;
 340
 341        /* For EISA bus masters, return isa_bridge (it might have smaller
 342           dma_mask due to wiring limitations). */
 343        if (*dev->dma_mask >= isa_bridge->dma_mask)
 344                return isa_bridge;
 345
 346        /* This assumes ISA bus master with dma_mask 0xffffff. */
 347        return NULL;
 348}
 349
 350static dma_addr_t alpha_pci_map_page(struct device *dev, struct page *page,
 351                                     unsigned long offset, size_t size,
 352                                     enum dma_data_direction dir,
 353                                     unsigned long attrs)
 354{
 355        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 356        int dac_allowed;
 357
 358        BUG_ON(dir == PCI_DMA_NONE);
 359
 360        dac_allowed = pdev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0; 
 361        return pci_map_single_1(pdev, (char *)page_address(page) + offset, 
 362                                size, dac_allowed);
 363}
 364
 365/* Unmap a single streaming mode DMA translation.  The DMA_ADDR and
 366   SIZE must match what was provided for in a previous pci_map_single
 367   call.  All other usages are undefined.  After this call, reads by
 368   the cpu to the buffer are guaranteed to see whatever the device
 369   wrote there.  */
 370
 371static void alpha_pci_unmap_page(struct device *dev, dma_addr_t dma_addr,
 372                                 size_t size, enum dma_data_direction dir,
 373                                 unsigned long attrs)
 374{
 375        unsigned long flags;
 376        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 377        struct pci_controller *hose = pdev ? pdev->sysdata : pci_isa_hose;
 378        struct pci_iommu_arena *arena;
 379        long dma_ofs, npages;
 380
 381        BUG_ON(dir == PCI_DMA_NONE);
 382
 383        if (dma_addr >= __direct_map_base
 384            && dma_addr < __direct_map_base + __direct_map_size) {
 385                /* Nothing to do.  */
 386
 387                DBGA2("pci_unmap_single: direct [%llx,%zx] from %pf\n",
 388                      dma_addr, size, __builtin_return_address(0));
 389
 390                return;
 391        }
 392
 393        if (dma_addr > 0xffffffff) {
 394                DBGA2("pci64_unmap_single: DAC [%llx,%zx] from %pf\n",
 395                      dma_addr, size, __builtin_return_address(0));
 396                return;
 397        }
 398
 399        arena = hose->sg_pci;
 400        if (!arena || dma_addr < arena->dma_base)
 401                arena = hose->sg_isa;
 402
 403        dma_ofs = (dma_addr - arena->dma_base) >> PAGE_SHIFT;
 404        if (dma_ofs * PAGE_SIZE >= arena->size) {
 405                printk(KERN_ERR "Bogus pci_unmap_single: dma_addr %llx "
 406                       " base %llx size %x\n",
 407                       dma_addr, arena->dma_base, arena->size);
 408                return;
 409                BUG();
 410        }
 411
 412        npages = iommu_num_pages(dma_addr, size, PAGE_SIZE);
 413
 414        spin_lock_irqsave(&arena->lock, flags);
 415
 416        iommu_arena_free(arena, dma_ofs, npages);
 417
 418        /* If we're freeing ptes above the `next_entry' pointer (they
 419           may have snuck back into the TLB since the last wrap flush),
 420           we need to flush the TLB before reallocating the latter.  */
 421        if (dma_ofs >= arena->next_entry)
 422                alpha_mv.mv_pci_tbi(hose, dma_addr, dma_addr + size - 1);
 423
 424        spin_unlock_irqrestore(&arena->lock, flags);
 425
 426        DBGA2("pci_unmap_single: sg [%llx,%zx] np %ld from %pf\n",
 427              dma_addr, size, npages, __builtin_return_address(0));
 428}
 429
 430/* Allocate and map kernel buffer using consistent mode DMA for PCI
 431   device.  Returns non-NULL cpu-view pointer to the buffer if
 432   successful and sets *DMA_ADDRP to the pci side dma address as well,
 433   else DMA_ADDRP is undefined.  */
 434
 435static void *alpha_pci_alloc_coherent(struct device *dev, size_t size,
 436                                      dma_addr_t *dma_addrp, gfp_t gfp,
 437                                      unsigned long attrs)
 438{
 439        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 440        void *cpu_addr;
 441        long order = get_order(size);
 442
 443        gfp &= ~GFP_DMA;
 444
 445try_again:
 446        cpu_addr = (void *)__get_free_pages(gfp, order);
 447        if (! cpu_addr) {
 448                printk(KERN_INFO "pci_alloc_consistent: "
 449                       "get_free_pages failed from %pf\n",
 450                        __builtin_return_address(0));
 451                /* ??? Really atomic allocation?  Otherwise we could play
 452                   with vmalloc and sg if we can't find contiguous memory.  */
 453                return NULL;
 454        }
 455        memset(cpu_addr, 0, size);
 456
 457        *dma_addrp = pci_map_single_1(pdev, cpu_addr, size, 0);
 458        if (*dma_addrp == 0) {
 459                free_pages((unsigned long)cpu_addr, order);
 460                if (alpha_mv.mv_pci_tbi || (gfp & GFP_DMA))
 461                        return NULL;
 462                /* The address doesn't fit required mask and we
 463                   do not have iommu. Try again with GFP_DMA. */
 464                gfp |= GFP_DMA;
 465                goto try_again;
 466        }
 467
 468        DBGA2("pci_alloc_consistent: %zx -> [%p,%llx] from %pf\n",
 469              size, cpu_addr, *dma_addrp, __builtin_return_address(0));
 470
 471        return cpu_addr;
 472}
 473
 474/* Free and unmap a consistent DMA buffer.  CPU_ADDR and DMA_ADDR must
 475   be values that were returned from pci_alloc_consistent.  SIZE must
 476   be the same as what as passed into pci_alloc_consistent.
 477   References to the memory and mappings associated with CPU_ADDR or
 478   DMA_ADDR past this call are illegal.  */
 479
 480static void alpha_pci_free_coherent(struct device *dev, size_t size,
 481                                    void *cpu_addr, dma_addr_t dma_addr,
 482                                    unsigned long attrs)
 483{
 484        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 485        pci_unmap_single(pdev, dma_addr, size, PCI_DMA_BIDIRECTIONAL);
 486        free_pages((unsigned long)cpu_addr, get_order(size));
 487
 488        DBGA2("pci_free_consistent: [%llx,%zx] from %pf\n",
 489              dma_addr, size, __builtin_return_address(0));
 490}
 491
 492/* Classify the elements of the scatterlist.  Write dma_address
 493   of each element with:
 494        0   : Followers all physically adjacent.
 495        1   : Followers all virtually adjacent.
 496        -1  : Not leader, physically adjacent to previous.
 497        -2  : Not leader, virtually adjacent to previous.
 498   Write dma_length of each leader with the combined lengths of
 499   the mergable followers.  */
 500
 501#define SG_ENT_VIRT_ADDRESS(SG) (sg_virt((SG)))
 502#define SG_ENT_PHYS_ADDRESS(SG) __pa(SG_ENT_VIRT_ADDRESS(SG))
 503
 504static void
 505sg_classify(struct device *dev, struct scatterlist *sg, struct scatterlist *end,
 506            int virt_ok)
 507{
 508        unsigned long next_paddr;
 509        struct scatterlist *leader;
 510        long leader_flag, leader_length;
 511        unsigned int max_seg_size;
 512
 513        leader = sg;
 514        leader_flag = 0;
 515        leader_length = leader->length;
 516        next_paddr = SG_ENT_PHYS_ADDRESS(leader) + leader_length;
 517
 518        /* we will not marge sg without device. */
 519        max_seg_size = dev ? dma_get_max_seg_size(dev) : 0;
 520        for (++sg; sg < end; ++sg) {
 521                unsigned long addr, len;
 522                addr = SG_ENT_PHYS_ADDRESS(sg);
 523                len = sg->length;
 524
 525                if (leader_length + len > max_seg_size)
 526                        goto new_segment;
 527
 528                if (next_paddr == addr) {
 529                        sg->dma_address = -1;
 530                        leader_length += len;
 531                } else if (((next_paddr | addr) & ~PAGE_MASK) == 0 && virt_ok) {
 532                        sg->dma_address = -2;
 533                        leader_flag = 1;
 534                        leader_length += len;
 535                } else {
 536new_segment:
 537                        leader->dma_address = leader_flag;
 538                        leader->dma_length = leader_length;
 539                        leader = sg;
 540                        leader_flag = 0;
 541                        leader_length = len;
 542                }
 543
 544                next_paddr = addr + len;
 545        }
 546
 547        leader->dma_address = leader_flag;
 548        leader->dma_length = leader_length;
 549}
 550
 551/* Given a scatterlist leader, choose an allocation method and fill
 552   in the blanks.  */
 553
 554static int
 555sg_fill(struct device *dev, struct scatterlist *leader, struct scatterlist *end,
 556        struct scatterlist *out, struct pci_iommu_arena *arena,
 557        dma_addr_t max_dma, int dac_allowed)
 558{
 559        unsigned long paddr = SG_ENT_PHYS_ADDRESS(leader);
 560        long size = leader->dma_length;
 561        struct scatterlist *sg;
 562        unsigned long *ptes;
 563        long npages, dma_ofs, i;
 564
 565#if !DEBUG_NODIRECT
 566        /* If everything is physically contiguous, and the addresses
 567           fall into the direct-map window, use it.  */
 568        if (leader->dma_address == 0
 569            && paddr + size + __direct_map_base - 1 <= max_dma
 570            && paddr + size <= __direct_map_size) {
 571                out->dma_address = paddr + __direct_map_base;
 572                out->dma_length = size;
 573
 574                DBGA("    sg_fill: [%p,%lx] -> direct %llx\n",
 575                     __va(paddr), size, out->dma_address);
 576
 577                return 0;
 578        }
 579#endif
 580
 581        /* If physically contiguous and DAC is available, use it.  */
 582        if (leader->dma_address == 0 && dac_allowed) {
 583                out->dma_address = paddr + alpha_mv.pci_dac_offset;
 584                out->dma_length = size;
 585
 586                DBGA("    sg_fill: [%p,%lx] -> DAC %llx\n",
 587                     __va(paddr), size, out->dma_address);
 588
 589                return 0;
 590        }
 591
 592        /* Otherwise, we'll use the iommu to make the pages virtually
 593           contiguous.  */
 594
 595        paddr &= ~PAGE_MASK;
 596        npages = iommu_num_pages(paddr, size, PAGE_SIZE);
 597        dma_ofs = iommu_arena_alloc(dev, arena, npages, 0);
 598        if (dma_ofs < 0) {
 599                /* If we attempted a direct map above but failed, die.  */
 600                if (leader->dma_address == 0)
 601                        return -1;
 602
 603                /* Otherwise, break up the remaining virtually contiguous
 604                   hunks into individual direct maps and retry.  */
 605                sg_classify(dev, leader, end, 0);
 606                return sg_fill(dev, leader, end, out, arena, max_dma, dac_allowed);
 607        }
 608
 609        out->dma_address = arena->dma_base + dma_ofs*PAGE_SIZE + paddr;
 610        out->dma_length = size;
 611
 612        DBGA("    sg_fill: [%p,%lx] -> sg %llx np %ld\n",
 613             __va(paddr), size, out->dma_address, npages);
 614
 615        /* All virtually contiguous.  We need to find the length of each
 616           physically contiguous subsegment to fill in the ptes.  */
 617        ptes = &arena->ptes[dma_ofs];
 618        sg = leader;
 619        do {
 620#if DEBUG_ALLOC > 0
 621                struct scatterlist *last_sg = sg;
 622#endif
 623
 624                size = sg->length;
 625                paddr = SG_ENT_PHYS_ADDRESS(sg);
 626
 627                while (sg+1 < end && (int) sg[1].dma_address == -1) {
 628                        size += sg[1].length;
 629                        sg++;
 630                }
 631
 632                npages = iommu_num_pages(paddr, size, PAGE_SIZE);
 633
 634                paddr &= PAGE_MASK;
 635                for (i = 0; i < npages; ++i, paddr += PAGE_SIZE)
 636                        *ptes++ = mk_iommu_pte(paddr);
 637
 638#if DEBUG_ALLOC > 0
 639                DBGA("    (%ld) [%p,%x] np %ld\n",
 640                     last_sg - leader, SG_ENT_VIRT_ADDRESS(last_sg),
 641                     last_sg->length, npages);
 642                while (++last_sg <= sg) {
 643                        DBGA("        (%ld) [%p,%x] cont\n",
 644                             last_sg - leader, SG_ENT_VIRT_ADDRESS(last_sg),
 645                             last_sg->length);
 646                }
 647#endif
 648        } while (++sg < end && (int) sg->dma_address < 0);
 649
 650        return 1;
 651}
 652
 653static int alpha_pci_map_sg(struct device *dev, struct scatterlist *sg,
 654                            int nents, enum dma_data_direction dir,
 655                            unsigned long attrs)
 656{
 657        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 658        struct scatterlist *start, *end, *out;
 659        struct pci_controller *hose;
 660        struct pci_iommu_arena *arena;
 661        dma_addr_t max_dma;
 662        int dac_allowed;
 663
 664        BUG_ON(dir == PCI_DMA_NONE);
 665
 666        dac_allowed = dev ? pci_dac_dma_supported(pdev, pdev->dma_mask) : 0;
 667
 668        /* Fast path single entry scatterlists.  */
 669        if (nents == 1) {
 670                sg->dma_length = sg->length;
 671                sg->dma_address
 672                  = pci_map_single_1(pdev, SG_ENT_VIRT_ADDRESS(sg),
 673                                     sg->length, dac_allowed);
 674                return sg->dma_address != 0;
 675        }
 676
 677        start = sg;
 678        end = sg + nents;
 679
 680        /* First, prepare information about the entries.  */
 681        sg_classify(dev, sg, end, alpha_mv.mv_pci_tbi != 0);
 682
 683        /* Second, figure out where we're going to map things.  */
 684        if (alpha_mv.mv_pci_tbi) {
 685                hose = pdev ? pdev->sysdata : pci_isa_hose;
 686                max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK;
 687                arena = hose->sg_pci;
 688                if (!arena || arena->dma_base + arena->size - 1 > max_dma)
 689                        arena = hose->sg_isa;
 690        } else {
 691                max_dma = -1;
 692                arena = NULL;
 693                hose = NULL;
 694        }
 695
 696        /* Third, iterate over the scatterlist leaders and allocate
 697           dma space as needed.  */
 698        for (out = sg; sg < end; ++sg) {
 699                if ((int) sg->dma_address < 0)
 700                        continue;
 701                if (sg_fill(dev, sg, end, out, arena, max_dma, dac_allowed) < 0)
 702                        goto error;
 703                out++;
 704        }
 705
 706        /* Mark the end of the list for pci_unmap_sg.  */
 707        if (out < end)
 708                out->dma_length = 0;
 709
 710        if (out - start == 0)
 711                printk(KERN_WARNING "pci_map_sg failed: no entries?\n");
 712        DBGA("pci_map_sg: %ld entries\n", out - start);
 713
 714        return out - start;
 715
 716 error:
 717        printk(KERN_WARNING "pci_map_sg failed: "
 718               "could not allocate dma page tables\n");
 719
 720        /* Some allocation failed while mapping the scatterlist
 721           entries.  Unmap them now.  */
 722        if (out > start)
 723                pci_unmap_sg(pdev, start, out - start, dir);
 724        return 0;
 725}
 726
 727/* Unmap a set of streaming mode DMA translations.  Again, cpu read
 728   rules concerning calls here are the same as for pci_unmap_single()
 729   above.  */
 730
 731static void alpha_pci_unmap_sg(struct device *dev, struct scatterlist *sg,
 732                               int nents, enum dma_data_direction dir,
 733                               unsigned long attrs)
 734{
 735        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 736        unsigned long flags;
 737        struct pci_controller *hose;
 738        struct pci_iommu_arena *arena;
 739        struct scatterlist *end;
 740        dma_addr_t max_dma;
 741        dma_addr_t fbeg, fend;
 742
 743        BUG_ON(dir == PCI_DMA_NONE);
 744
 745        if (! alpha_mv.mv_pci_tbi)
 746                return;
 747
 748        hose = pdev ? pdev->sysdata : pci_isa_hose;
 749        max_dma = pdev ? pdev->dma_mask : ISA_DMA_MASK;
 750        arena = hose->sg_pci;
 751        if (!arena || arena->dma_base + arena->size - 1 > max_dma)
 752                arena = hose->sg_isa;
 753
 754        fbeg = -1, fend = 0;
 755
 756        spin_lock_irqsave(&arena->lock, flags);
 757
 758        for (end = sg + nents; sg < end; ++sg) {
 759                dma_addr_t addr;
 760                size_t size;
 761                long npages, ofs;
 762                dma_addr_t tend;
 763
 764                addr = sg->dma_address;
 765                size = sg->dma_length;
 766                if (!size)
 767                        break;
 768
 769                if (addr > 0xffffffff) {
 770                        /* It's a DAC address -- nothing to do.  */
 771                        DBGA("    (%ld) DAC [%llx,%zx]\n",
 772                              sg - end + nents, addr, size);
 773                        continue;
 774                }
 775
 776                if (addr >= __direct_map_base
 777                    && addr < __direct_map_base + __direct_map_size) {
 778                        /* Nothing to do.  */
 779                        DBGA("    (%ld) direct [%llx,%zx]\n",
 780                              sg - end + nents, addr, size);
 781                        continue;
 782                }
 783
 784                DBGA("    (%ld) sg [%llx,%zx]\n",
 785                     sg - end + nents, addr, size);
 786
 787                npages = iommu_num_pages(addr, size, PAGE_SIZE);
 788                ofs = (addr - arena->dma_base) >> PAGE_SHIFT;
 789                iommu_arena_free(arena, ofs, npages);
 790
 791                tend = addr + size - 1;
 792                if (fbeg > addr) fbeg = addr;
 793                if (fend < tend) fend = tend;
 794        }
 795
 796        /* If we're freeing ptes above the `next_entry' pointer (they
 797           may have snuck back into the TLB since the last wrap flush),
 798           we need to flush the TLB before reallocating the latter.  */
 799        if ((fend - arena->dma_base) >> PAGE_SHIFT >= arena->next_entry)
 800                alpha_mv.mv_pci_tbi(hose, fbeg, fend);
 801
 802        spin_unlock_irqrestore(&arena->lock, flags);
 803
 804        DBGA("pci_unmap_sg: %ld entries\n", nents - (end - sg));
 805}
 806
 807/* Return whether the given PCI device DMA address mask can be
 808   supported properly.  */
 809
 810static int alpha_pci_supported(struct device *dev, u64 mask)
 811{
 812        struct pci_dev *pdev = alpha_gendev_to_pci(dev);
 813        struct pci_controller *hose;
 814        struct pci_iommu_arena *arena;
 815
 816        /* If there exists a direct map, and the mask fits either
 817           the entire direct mapped space or the total system memory as
 818           shifted by the map base */
 819        if (__direct_map_size != 0
 820            && (__direct_map_base + __direct_map_size - 1 <= mask ||
 821                __direct_map_base + (max_low_pfn << PAGE_SHIFT) - 1 <= mask))
 822                return 1;
 823
 824        /* Check that we have a scatter-gather arena that fits.  */
 825        hose = pdev ? pdev->sysdata : pci_isa_hose;
 826        arena = hose->sg_isa;
 827        if (arena && arena->dma_base + arena->size - 1 <= mask)
 828                return 1;
 829        arena = hose->sg_pci;
 830        if (arena && arena->dma_base + arena->size - 1 <= mask)
 831                return 1;
 832
 833        /* As last resort try ZONE_DMA.  */
 834        if (!__direct_map_base && MAX_DMA_ADDRESS - IDENT_ADDR - 1 <= mask)
 835                return 1;
 836
 837        return 0;
 838}
 839
 840
 841/*
 842 * AGP GART extensions to the IOMMU
 843 */
 844int
 845iommu_reserve(struct pci_iommu_arena *arena, long pg_count, long align_mask) 
 846{
 847        unsigned long flags;
 848        unsigned long *ptes;
 849        long i, p;
 850
 851        if (!arena) return -EINVAL;
 852
 853        spin_lock_irqsave(&arena->lock, flags);
 854
 855        /* Search for N empty ptes.  */
 856        ptes = arena->ptes;
 857        p = iommu_arena_find_pages(NULL, arena, pg_count, align_mask);
 858        if (p < 0) {
 859                spin_unlock_irqrestore(&arena->lock, flags);
 860                return -1;
 861        }
 862
 863        /* Success.  Mark them all reserved (ie not zero and invalid)
 864           for the iommu tlb that could load them from under us.
 865           They will be filled in with valid bits by _bind() */
 866        for (i = 0; i < pg_count; ++i)
 867                ptes[p+i] = IOMMU_RESERVED_PTE;
 868
 869        arena->next_entry = p + pg_count;
 870        spin_unlock_irqrestore(&arena->lock, flags);
 871
 872        return p;
 873}
 874
 875int 
 876iommu_release(struct pci_iommu_arena *arena, long pg_start, long pg_count)
 877{
 878        unsigned long *ptes;
 879        long i;
 880
 881        if (!arena) return -EINVAL;
 882
 883        ptes = arena->ptes;
 884
 885        /* Make sure they're all reserved first... */
 886        for(i = pg_start; i < pg_start + pg_count; i++)
 887                if (ptes[i] != IOMMU_RESERVED_PTE)
 888                        return -EBUSY;
 889
 890        iommu_arena_free(arena, pg_start, pg_count);
 891        return 0;
 892}
 893
 894int
 895iommu_bind(struct pci_iommu_arena *arena, long pg_start, long pg_count, 
 896           struct page **pages)
 897{
 898        unsigned long flags;
 899        unsigned long *ptes;
 900        long i, j;
 901
 902        if (!arena) return -EINVAL;
 903        
 904        spin_lock_irqsave(&arena->lock, flags);
 905
 906        ptes = arena->ptes;
 907
 908        for(j = pg_start; j < pg_start + pg_count; j++) {
 909                if (ptes[j] != IOMMU_RESERVED_PTE) {
 910                        spin_unlock_irqrestore(&arena->lock, flags);
 911                        return -EBUSY;
 912                }
 913        }
 914                
 915        for(i = 0, j = pg_start; i < pg_count; i++, j++)
 916                ptes[j] = mk_iommu_pte(page_to_phys(pages[i]));
 917
 918        spin_unlock_irqrestore(&arena->lock, flags);
 919
 920        return 0;
 921}
 922
 923int
 924iommu_unbind(struct pci_iommu_arena *arena, long pg_start, long pg_count)
 925{
 926        unsigned long *p;
 927        long i;
 928
 929        if (!arena) return -EINVAL;
 930
 931        p = arena->ptes + pg_start;
 932        for(i = 0; i < pg_count; i++)
 933                p[i] = IOMMU_RESERVED_PTE;
 934
 935        return 0;
 936}
 937
 938static int alpha_pci_mapping_error(struct device *dev, dma_addr_t dma_addr)
 939{
 940        return dma_addr == 0;
 941}
 942
 943const struct dma_map_ops alpha_pci_ops = {
 944        .alloc                  = alpha_pci_alloc_coherent,
 945        .free                   = alpha_pci_free_coherent,
 946        .map_page               = alpha_pci_map_page,
 947        .unmap_page             = alpha_pci_unmap_page,
 948        .map_sg                 = alpha_pci_map_sg,
 949        .unmap_sg               = alpha_pci_unmap_sg,
 950        .mapping_error          = alpha_pci_mapping_error,
 951        .dma_supported          = alpha_pci_supported,
 952};
 953
 954const struct dma_map_ops *dma_ops = &alpha_pci_ops;
 955EXPORT_SYMBOL(dma_ops);
 956