9 #include <linux/types.h>
11 #include <linux/pci.h>
12 #include <linux/bitmap.h>
13 #include <linux/slab.h>
14 #include <linux/export.h>
16 #include <asm/sn/addrs.h>
17 #include <asm/sn/io.h>
129 "%llu bytes (order %d) for GART\n",
221 struct tioca __iomem *tioca_base;
223 struct tioca_common *
common;
283 tioca_dma_d64(
unsigned long paddr)
293 bus_addr |= (1
UL << 60);
327 struct tioca_common *tioca_common;
342 bus_addr = (
dma_addr_t) (ct_addr & 0xffffffffffffUL);
343 node_upper = ct_addr >> 48;
345 if (node_upper > 64) {
347 "of range\n", __func__, (
void *)ct_addr);
354 "mismatch with ca_agp_dma_addr_extn (%llu)\n",
373 tioca_dma_mapped(
struct pci_dev *pdev,
unsigned long paddr,
size_t req_size)
376 u64 xio_addr, end_xio_addr;
377 struct tioca_common *tioca_common;
408 ps_shift =
ffs(ps) - 1;
409 end_xio_addr = xio_addr + req_size - 1;
411 entries = (end_xio_addr >> ps_shift) - (xio_addr >> ps_shift) + 1;
417 if (entry >= mapsize) {
433 bus_addr += xio_addr & (ps - 1);
434 xio_addr &= ~(ps - 1);
439 while (xio_addr < end_xio_addr) {
445 tioca_tlbflush(tioca_kern);
448 spin_unlock_irqrestore(&tioca_kern->
ca_lock, flags);
466 struct tioca_common *tioca_common;
477 if (bus_addr < tioca_kern->ca_pciap_base ||
484 if (map->cad_dma_addr == bus_addr)
489 entry = map->cad_gart_entry;
491 for (i = 0; i < map->cad_gart_size; i++, entry++) {
495 tioca_tlbflush(tioca_kern);
498 spin_unlock_irqrestore(&tioca_kern->
ca_lock, flags);
513 tioca_dma_map(
struct pci_dev *pdev,
unsigned long paddr,
size_t byte_count,
int dma_flags)
530 mapaddr = tioca_dma_d64(paddr);
531 else if (pdev->
dma_mask == 0xffffffffffffUL)
532 mapaddr = tioca_dma_d48(pdev, paddr);
539 mapaddr = tioca_dma_mapped(pdev, paddr, byte_count);
553 tioca_error_intr_handler(
int irq,
void *
arg)
555 struct tioca_common *
soft =
arg;
559 ret_stuff.status = 0;
562 segment = soft->
ca_common.bs_persist_segment;
563 busnum = soft->
ca_common.bs_persist_busnum;
567 segment, busnum, 0, 0, 0, 0, 0);
586 struct tioca_common *tioca_common;
592 if (
is_shub1() && sn_sal_rev() < 0x0406) {
594 (
KERN_ERR "%s: SGI prom rev 4.06 or greater required "
595 "for tioca support\n", __func__);
603 tioca_common =
kmemdup(prom_bussoft,
sizeof(
struct tioca_common),
610 sizeof(
struct tioca_common));
628 tioca_common->
ca_common.bs_persist_busnum);
634 if (tioca_gart_init(tioca_kern) < 0) {
641 list_add(&tioca_kern->
ca_list, &tioca_list);
644 tioca_error_intr_handler,
647 "%s: Unable to get irq %d. "
648 "Error interrupts won't be routed for TIOCA bus %d\n",
650 (
int)tioca_common->
ca_common.bs_persist_busnum);
661 .dma_map = tioca_dma_map,
662 .dma_map_consistent = tioca_dma_map,
663 .dma_unmap = tioca_dma_unmap,
664 .bus_fixup = tioca_bus_fixup,
665 .force_interrupt =
NULL,
666 .target_interrupt =
NULL