pcibr.c
上传用户:jlfgdled
上传日期:2013-04-10
资源大小:33168k
文件大小:227k
源码类别:

Linux/Unix编程

开发平台:

Unix_Linux

  1.     pci_hi_fb = 0x00200000; /* High Memory FreeBlock Base */
  2.     pci_hi_fl = 0x3FFFFFFF; /* High Memory FreeBlock Last */
  3.     PCI_ADDR_SPACE_LIMITS_STORE();
  4.     /* build "no-slot" connection point
  5.      */
  6.     pcibr_info = pcibr_device_info_new
  7. (pcibr_soft, PCIIO_SLOT_NONE, PCIIO_FUNC_NONE,
  8.  PCIIO_VENDOR_ID_NONE, PCIIO_DEVICE_ID_NONE);
  9.     noslot_conn = pciio_device_info_register
  10. (pcibr_vhdl, &pcibr_info->f_c);
  11.     /* Remember the no slot connection point info for tearing it
  12.      * down during detach.
  13.      */
  14.     pcibr_soft->bs_noslot_conn = noslot_conn;
  15.     pcibr_soft->bs_noslot_info = pcibr_info;
  16. #if PCI_FBBE
  17.     fast_back_to_back_enable = 1;
  18. #endif
  19. #if PCI_FBBE
  20.     if (fast_back_to_back_enable) {
  21. /*
  22.  * All devices on the bus are capable of fast back to back, so
  23.  * we need to set the fast back to back bit in all devices on
  24.  * the bus that are capable of doing such accesses.
  25.  */
  26.     }
  27. #endif
  28. #ifdef LATER
  29.     /* If the bridge has been reset then there is no need to reset
  30.      * the individual PCI slots.
  31.      */
  32.     for (slot = 0; slot < 8; ++slot)  
  33. /* Reset all the slots */
  34. (void)pcibr_slot_reset(pcibr_vhdl, slot);
  35. #endif
  36.     for (slot = 0; slot < 8; ++slot)
  37. /* Find out what is out there */
  38. (void)pcibr_slot_info_init(pcibr_vhdl,slot);
  39.     for (slot = 0; slot < 8; ++slot)  
  40. /* Set up the address space for this slot in the pci land */
  41. (void)pcibr_slot_addr_space_init(pcibr_vhdl,slot);
  42.     for (slot = 0; slot < 8; ++slot)  
  43. /* Setup the device register */
  44. (void)pcibr_slot_device_init(pcibr_vhdl, slot);
  45. #ifndef __ia64
  46.     for (slot = 0; slot < 8; ++slot)  
  47. /* Set up convenience links */
  48. if (is_xbridge(bridge))
  49. if (pcibr_soft->bs_slot[slot].bss_ninfo > 0) /* if occupied */
  50. pcibr_bus_cnvlink(pcibr_info->f_vertex, slot);
  51. #endif
  52.     for (slot = 0; slot < 8; ++slot)  
  53. /* Setup host/guest relations */
  54. (void)pcibr_slot_guest_info_init(pcibr_vhdl,slot);
  55.     for (slot = 0; slot < 8; ++slot)  
  56. /* Initial RRB management */
  57. (void)pcibr_slot_initial_rrb_alloc(pcibr_vhdl,slot);
  58.     /* driver attach routines should be called out from generic linux code */
  59.     for (slot = 0; slot < 8; ++slot)  
  60. /* Call the device attach */
  61. (void)pcibr_slot_call_device_attach(pcibr_vhdl, slot, 0);
  62.     /*
  63.      * Each Pbrick PCI bus only has slots 1 and 2.   Similarly for
  64.      * widget 0xe on Ibricks.  Allocate RRB's accordingly.
  65.      */
  66.     if (pcibr_soft->bs_moduleid > 0) {
  67. switch (MODULE_GET_BTCHAR(pcibr_soft->bs_moduleid)) {
  68. case 'p': /* Pbrick */
  69. do_pcibr_rrb_autoalloc(pcibr_soft, 1, 8);
  70. do_pcibr_rrb_autoalloc(pcibr_soft, 2, 8);
  71. break;
  72. case 'i': /* Ibrick */
  73.    /* port 0xe on the Ibrick only has slots 1 and 2 */
  74. if (pcibr_soft->bs_xid == 0xe) {
  75. do_pcibr_rrb_autoalloc(pcibr_soft, 1, 8);
  76. do_pcibr_rrb_autoalloc(pcibr_soft, 2, 8);
  77. }
  78. else {
  79.      /* allocate one RRB for the serial port */
  80. do_pcibr_rrb_autoalloc(pcibr_soft, 0, 1);
  81. }
  82. break;
  83. } /* switch */
  84.     }
  85. #ifdef LATER
  86.     if (strstr(nicinfo, XTALK_PCI_PART_NUM)) {
  87. do_pcibr_rrb_autoalloc(pcibr_soft, 1, 8);
  88. #if PCIBR_RRB_DEBUG
  89. printf("nnFound XTALK_PCI (030-1275) at %vn", xconn_vhdl);
  90. printf("pcibr_attach: %v Shoebox RRB MANAGEMENT: %d+%d freen",
  91. pcibr_vhdl,
  92. pcibr_soft->bs_rrb_avail[0],
  93. pcibr_soft->bs_rrb_avail[1]);
  94. for (slot = 0; slot < 8; ++slot)
  95.     printf("t%d+%d+%d",
  96.     0xFFF & pcibr_soft->bs_rrb_valid[slot],
  97.     0xFFF & pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL],
  98.     pcibr_soft->bs_rrb_res[slot]);
  99. printf("n");
  100. #endif
  101.     }
  102. #else
  103. FIXME("pcibr_attach: Call do_pcibr_rrb_autoalloc nicinfon");
  104. #endif
  105.     if (aa)
  106.     async_attach_add_info(noslot_conn, aa);
  107.     pciio_device_attach(noslot_conn, 0);
  108.     /* 
  109.      * Tear down pointer to async attach info -- async threads for
  110.      * bridge's descendants may be running but the bridge's work is done.
  111.      */
  112.     if (aa)
  113.     async_attach_del_info(xconn_vhdl);
  114.     return 0;
  115. }
  116. /*
  117.  * pcibr_detach:
  118.  * Detach the bridge device from the hwgraph after cleaning out all the 
  119.  * underlying vertices.
  120.  */
  121. int
  122. pcibr_detach(devfs_handle_t xconn)
  123. {
  124.     pciio_slot_t slot;
  125.     devfs_handle_t pcibr_vhdl;
  126.     pcibr_soft_t pcibr_soft;
  127.     bridge_t *bridge;
  128.     /* Get the bridge vertex from its xtalk connection point */
  129.     if (hwgraph_traverse(xconn, EDGE_LBL_PCI, &pcibr_vhdl) != GRAPH_SUCCESS)
  130. return(1);
  131.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  132.     bridge = pcibr_soft->bs_base;
  133.     /* Disable the interrupts from the bridge */
  134.     bridge->b_int_enable = 0;
  135.     /* Detach all the PCI devices talking to this bridge */
  136.     for(slot = 0; slot < 8; slot++) {
  137. #ifdef DEBUG
  138. printk("pcibr_device_detach called for %p/%dn",
  139. pcibr_vhdl,slot);
  140. #endif
  141. pcibr_slot_detach(pcibr_vhdl, slot, 0);
  142.     }
  143.     /* Unregister the no-slot connection point */
  144.     pciio_device_info_unregister(pcibr_vhdl,
  145.  &(pcibr_soft->bs_noslot_info->f_c));
  146.     spin_lock_destroy(&pcibr_soft->bs_lock);
  147.     kfree(pcibr_soft->bs_name);
  148.     
  149.     /* Error handler gets unregistered when the widget info is 
  150.      * cleaned 
  151.      */
  152.     /* Free the soft ATE maps */
  153.     if (pcibr_soft->bs_int_ate_map)
  154. rmfreemap(pcibr_soft->bs_int_ate_map);
  155.     if (pcibr_soft->bs_ext_ate_map)
  156. rmfreemap(pcibr_soft->bs_ext_ate_map);
  157.     /* Disconnect the error interrupt and free the xtalk resources 
  158.      * associated with it.
  159.      */
  160.     xtalk_intr_disconnect(pcibr_soft->bsi_err_intr);
  161.     xtalk_intr_free(pcibr_soft->bsi_err_intr);
  162.     /* Clear the software state maintained by the bridge driver for this
  163.      * bridge.
  164.      */
  165.     DEL(pcibr_soft);
  166.     /* Remove the Bridge revision labelled info */
  167.     (void)hwgraph_info_remove_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, NULL);
  168.     /* Remove the character device associated with this bridge */
  169.     (void)hwgraph_edge_remove(pcibr_vhdl, EDGE_LBL_CONTROLLER, NULL);
  170.     /* Remove the PCI bridge vertex */
  171.     (void)hwgraph_edge_remove(xconn, EDGE_LBL_PCI, NULL);
  172.     return(0);
  173. }
  174. int
  175. pcibr_asic_rev(devfs_handle_t pconn_vhdl)
  176. {
  177.     devfs_handle_t            pcibr_vhdl;
  178.     arbitrary_info_t        ainfo;
  179.     if (GRAPH_SUCCESS !=
  180. hwgraph_traverse(pconn_vhdl, EDGE_LBL_MASTER, &pcibr_vhdl))
  181. return -1;
  182.     if (GRAPH_SUCCESS !=
  183. hwgraph_info_get_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, &ainfo))
  184. return -1;
  185.     return (int) ainfo;
  186. }
  187. int
  188. pcibr_write_gather_flush(devfs_handle_t pconn_vhdl)
  189. {
  190.     pciio_info_t  pciio_info = pciio_info_get(pconn_vhdl);
  191.     pcibr_soft_t  pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  192.     pciio_slot_t  slot;
  193.     slot = pciio_info_slot_get(pciio_info);
  194.     pcibr_device_write_gather_flush(pcibr_soft, slot);
  195.     return 0;
  196. }
  197. /* =====================================================================
  198.  *    PIO MANAGEMENT
  199.  */
  200. LOCAL iopaddr_t
  201. pcibr_addr_pci_to_xio(devfs_handle_t pconn_vhdl,
  202.       pciio_slot_t slot,
  203.       pciio_space_t space,
  204.       iopaddr_t pci_addr,
  205.       size_t req_size,
  206.       unsigned flags)
  207. {
  208.     pcibr_info_t            pcibr_info = pcibr_info_get(pconn_vhdl);
  209.     pciio_info_t            pciio_info = &pcibr_info->f_c;
  210.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  211.     bridge_t               *bridge = pcibr_soft->bs_base;
  212.     unsigned                bar; /* which BASE reg on device is decoding */
  213.     iopaddr_t               xio_addr = XIO_NOWHERE;
  214.     pciio_space_t           wspace; /* which space device is decoding */
  215.     iopaddr_t               wbase; /* base of device decode on PCI */
  216.     size_t                  wsize; /* size of device decode on PCI */
  217.     int                     try; /* DevIO(x) window scanning order control */
  218.     int                     win; /* which DevIO(x) window is being used */
  219.     pciio_space_t           mspace; /* target space for devio(x) register */
  220.     iopaddr_t               mbase; /* base of devio(x) mapped area on PCI */
  221.     size_t                  msize; /* size of devio(x) mapped area on PCI */
  222.     size_t                  mmask; /* addr bits stored in Device(x) */
  223.     unsigned long           s;
  224.     s = pcibr_lock(pcibr_soft);
  225.     if (pcibr_soft->bs_slot[slot].has_host) {
  226. slot = pcibr_soft->bs_slot[slot].host_slot;
  227. pcibr_info = pcibr_soft->bs_slot[slot].bss_infos[0];
  228.     }
  229.     if (space == PCIIO_SPACE_NONE)
  230. goto done;
  231.     if (space == PCIIO_SPACE_CFG) {
  232. /*
  233.  * Usually, the first mapping
  234.  * established to a PCI device
  235.  * is to its config space.
  236.  *
  237.  * In any case, we definitely
  238.  * do NOT need to worry about
  239.  * PCI BASE registers, and
  240.  * MUST NOT attempt to point
  241.  * the DevIO(x) window at
  242.  * this access ...
  243.  */
  244. if (((flags & PCIIO_BYTE_STREAM) == 0) &&
  245.     ((pci_addr + req_size) <= BRIDGE_TYPE0_CFG_FUNC_OFF))
  246.     xio_addr = pci_addr + BRIDGE_TYPE0_CFG_DEV(slot);
  247. goto done;
  248.     }
  249.     if (space == PCIIO_SPACE_ROM) {
  250. /* PIO to the Expansion Rom.
  251.  * Driver is responsible for
  252.  * enabling and disabling
  253.  * decodes properly.
  254.  */
  255. wbase = pcibr_info->f_rbase;
  256. wsize = pcibr_info->f_rsize;
  257. /*
  258.  * While the driver should know better
  259.  * than to attempt to map more space
  260.  * than the device is decoding, he might
  261.  * do it; better to bail out here.
  262.  */
  263. if ((pci_addr + req_size) > wsize)
  264.     goto done;
  265. pci_addr += wbase;
  266. space = PCIIO_SPACE_MEM;
  267.     }
  268.     /*
  269.      * reduce window mappings to raw
  270.      * space mappings (maybe allocating
  271.      * windows), and try for DevIO(x)
  272.      * usage (setting it if it is available).
  273.      */
  274.     bar = space - PCIIO_SPACE_WIN0;
  275.     if (bar < 6) {
  276. wspace = pcibr_info->f_window[bar].w_space;
  277. if (wspace == PCIIO_SPACE_NONE)
  278.     goto done;
  279. /* get PCI base and size */
  280. wbase = pcibr_info->f_window[bar].w_base;
  281. wsize = pcibr_info->f_window[bar].w_size;
  282. /*
  283.  * While the driver should know better
  284.  * than to attempt to map more space
  285.  * than the device is decoding, he might
  286.  * do it; better to bail out here.
  287.  */
  288. if ((pci_addr + req_size) > wsize)
  289.     goto done;
  290. /* shift from window relative to
  291.  * decoded space relative.
  292.  */
  293. pci_addr += wbase;
  294. space = wspace;
  295.     } else
  296. bar = -1;
  297.     /* Scan all the DevIO(x) windows twice looking for one
  298.      * that can satisfy our request. The first time through,
  299.      * only look at assigned windows; the second time, also
  300.      * look at PCIIO_SPACE_NONE windows. Arrange the order
  301.      * so we always look at our own window first.
  302.      *
  303.      * We will not attempt to satisfy a single request
  304.      * by concatinating multiple windows.
  305.      */
  306.     for (try = 0; try < 16; ++try) {
  307. bridgereg_t             devreg;
  308. unsigned                offset;
  309. win = (try + slot) % 8;
  310. /* If this DevIO(x) mapping area can provide
  311.  * a mapping to this address, use it.
  312.  */
  313. msize = (win < 2) ? 0x200000 : 0x100000;
  314. mmask = -msize;
  315. if (space != PCIIO_SPACE_IO)
  316.     mmask &= 0x3FFFFFFF;
  317. offset = pci_addr & (msize - 1);
  318. /* If this window can't possibly handle that request,
  319.  * go on to the next window.
  320.  */
  321. if (((pci_addr & (msize - 1)) + req_size) > msize)
  322.     continue;
  323. devreg = pcibr_soft->bs_slot[win].bss_device;
  324. /* Is this window "nailed down"?
  325.  * If not, maybe we can use it.
  326.  * (only check this the second time through)
  327.  */
  328. mspace = pcibr_soft->bs_slot[win].bss_devio.bssd_space;
  329. if ((try > 7) && (mspace == PCIIO_SPACE_NONE)) {
  330.     /* If this is the primary DevIO(x) window
  331.      * for some other device, skip it.
  332.      */
  333.     if ((win != slot) &&
  334. (PCIIO_VENDOR_ID_NONE !=
  335.  pcibr_soft->bs_slot[win].bss_vendor_id))
  336. continue;
  337.     /* It's a free window, and we fit in it.
  338.      * Set up Device(win) to our taste.
  339.      */
  340.     mbase = pci_addr & mmask;
  341.     /* check that we would really get from
  342.      * here to there.
  343.      */
  344.     if ((mbase | offset) != pci_addr)
  345. continue;
  346.     devreg &= ~BRIDGE_DEV_OFF_MASK;
  347.     if (space != PCIIO_SPACE_IO)
  348. devreg |= BRIDGE_DEV_DEV_IO_MEM;
  349.     else
  350. devreg &= ~BRIDGE_DEV_DEV_IO_MEM;
  351.     devreg |= (mbase >> 20) & BRIDGE_DEV_OFF_MASK;
  352.     /* default is WORD_VALUES.
  353.      * if you specify both,
  354.      * operation is undefined.
  355.      */
  356.     if (flags & PCIIO_BYTE_STREAM)
  357. devreg |= BRIDGE_DEV_DEV_SWAP;
  358.     else
  359. devreg &= ~BRIDGE_DEV_DEV_SWAP;
  360.     if (pcibr_soft->bs_slot[win].bss_device != devreg) {
  361. bridge->b_device[win].reg = devreg;
  362. pcibr_soft->bs_slot[win].bss_device = devreg;
  363. bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  364. #if DEBUG && PCI_DEBUG
  365. printk("pcibr Device(%d): 0x%lxn", win, bridge->b_device[win].reg);
  366. #endif
  367.     }
  368.     pcibr_soft->bs_slot[win].bss_devio.bssd_space = space;
  369.     pcibr_soft->bs_slot[win].bss_devio.bssd_base = mbase;
  370.     xio_addr = BRIDGE_DEVIO(win) + (pci_addr - mbase);
  371. #if DEBUG && PCI_DEBUG
  372.     printk("%s LINE %d map to space %d space desc 0x%x[%lx..%lx] for slot %d allocates DevIO(%d) devreg 0x%xn", 
  373.     __FUNCTION__, __LINE__, space, space_desc,
  374.     pci_addr, pci_addr + req_size - 1,
  375.     slot, win, devreg);
  376. #endif
  377.     goto done;
  378. } /* endif DevIO(x) not pointed */
  379. mbase = pcibr_soft->bs_slot[win].bss_devio.bssd_base;
  380. /* Now check for request incompat with DevIO(x)
  381.  */
  382. if ((mspace != space) ||
  383.     (pci_addr < mbase) ||
  384.     ((pci_addr + req_size) > (mbase + msize)) ||
  385.     ((flags & PCIIO_BYTE_STREAM) && !(devreg & BRIDGE_DEV_DEV_SWAP)) ||
  386.     (!(flags & PCIIO_BYTE_STREAM) && (devreg & BRIDGE_DEV_DEV_SWAP)))
  387.     continue;
  388. /* DevIO(x) window is pointed at PCI space
  389.  * that includes our target. Calculate the
  390.  * final XIO address, release the lock and
  391.  * return.
  392.  */
  393. xio_addr = BRIDGE_DEVIO(win) + (pci_addr - mbase);
  394. #if DEBUG && PCI_DEBUG
  395. printk("%s LINE %d map to space %d [0x%p..0x%p] for slot %d uses DevIO(%d)n",
  396. __FUNCTION__, __LINE__, space,  pci_addr, pci_addr + req_size - 1, slot, win);
  397. #endif
  398. goto done;
  399.     }
  400.     switch (space) {
  401. /*
  402.  * Accesses to device decode
  403.  * areas that do a not fit
  404.  * within the DevIO(x) space are
  405.  * modified to be accesses via
  406.  * the direct mapping areas.
  407.  *
  408.  * If necessary, drivers can
  409.  * explicitly ask for mappings
  410.  * into these address spaces,
  411.  * but this should never be needed.
  412.  */
  413.     case PCIIO_SPACE_MEM: /* "mem space" */
  414.     case PCIIO_SPACE_MEM32: /* "mem, use 32-bit-wide bus" */
  415. if ((pci_addr + BRIDGE_PCI_MEM32_BASE + req_size - 1) <=
  416.     BRIDGE_PCI_MEM32_LIMIT)
  417.     xio_addr = pci_addr + BRIDGE_PCI_MEM32_BASE;
  418. break;
  419.     case PCIIO_SPACE_MEM64: /* "mem, use 64-bit-wide bus" */
  420. if ((pci_addr + BRIDGE_PCI_MEM64_BASE + req_size - 1) <=
  421.     BRIDGE_PCI_MEM64_LIMIT)
  422.     xio_addr = pci_addr + BRIDGE_PCI_MEM64_BASE;
  423. break;
  424.     case PCIIO_SPACE_IO: /* "i/o space" */
  425. /* Bridge Hardware Bug WAR #482741:
  426.  * The 4G area that maps directly from
  427.  * XIO space to PCI I/O space is busted
  428.  * until Bridge Rev D.
  429.  */
  430. if ((pcibr_soft->bs_rev_num > BRIDGE_PART_REV_C) &&
  431.     ((pci_addr + BRIDGE_PCI_IO_BASE + req_size - 1) <=
  432.      BRIDGE_PCI_IO_LIMIT))
  433.     xio_addr = pci_addr + BRIDGE_PCI_IO_BASE;
  434. break;
  435.     }
  436.     /* Check that "Direct PIO" byteswapping matches,
  437.      * try to change it if it does not.
  438.      */
  439.     if (xio_addr != XIO_NOWHERE) {
  440. unsigned                bst; /* nonzero to set bytestream */
  441. unsigned               *bfp; /* addr of record of how swapper is set */
  442. unsigned                swb; /* which control bit to mung */
  443. unsigned                bfo; /* current swapper setting */
  444. unsigned                bfn; /* desired swapper setting */
  445. bfp = ((space == PCIIO_SPACE_IO)
  446.        ? (&pcibr_soft->bs_pio_end_io)
  447.        : (&pcibr_soft->bs_pio_end_mem));
  448. bfo = *bfp;
  449. bst = flags & PCIIO_BYTE_STREAM;
  450. bfn = bst ? PCIIO_BYTE_STREAM : PCIIO_WORD_VALUES;
  451. if (bfn == bfo) { /* we already match. */
  452.     ;
  453. } else if (bfo != 0) { /* we have a conflict. */
  454. #if DEBUG && PCI_DEBUG
  455.     printk("pcibr_addr_pci_to_xio: swap conflict in space %d , was%s%s, want%s%sn",
  456.     space, 
  457.     bfo & PCIIO_BYTE_STREAM ? " BYTE_STREAM" : "",
  458.     bfo & PCIIO_WORD_VALUES ? " WORD_VALUES" : "",
  459.     bfn & PCIIO_BYTE_STREAM ? " BYTE_STREAM" : "",
  460.     bfn & PCIIO_WORD_VALUES ? " WORD_VALUES" : "");
  461. #endif
  462.     xio_addr = XIO_NOWHERE;
  463. } else { /* OK to make the change. */
  464.     bridgereg_t             octl, nctl;
  465.     swb = (space == PCIIO_SPACE_IO) ? BRIDGE_CTRL_IO_SWAP : BRIDGE_CTRL_MEM_SWAP;
  466.     octl = bridge->b_wid_control;
  467.     nctl = bst ? octl | swb : octl & ~swb;
  468.     if (octl != nctl) /* make the change if any */
  469. bridge->b_wid_control = nctl;
  470.     *bfp = bfn; /* record the assignment */
  471. #if DEBUG && PCI_DEBUG
  472.     printk("pcibr_addr_pci_to_xio: swap for space %d  set to%s%sn",
  473.     space, 
  474.     bfn & PCIIO_BYTE_STREAM ? " BYTE_STREAM" : "",
  475.     bfn & PCIIO_WORD_VALUES ? " WORD_VALUES" : "");
  476. #endif
  477. }
  478.     }
  479.   done:
  480.     pcibr_unlock(pcibr_soft, s);
  481.     return xio_addr;
  482. }
  483. /*ARGSUSED6 */
  484. pcibr_piomap_t
  485. pcibr_piomap_alloc(devfs_handle_t pconn_vhdl,
  486.    device_desc_t dev_desc,
  487.    pciio_space_t space,
  488.    iopaddr_t pci_addr,
  489.    size_t req_size,
  490.    size_t req_size_max,
  491.    unsigned flags)
  492. {
  493.     pcibr_info_t     pcibr_info = pcibr_info_get(pconn_vhdl);
  494.     pciio_info_t            pciio_info = &pcibr_info->f_c;
  495.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  496.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  497.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  498.     pcibr_piomap_t         *mapptr;
  499.     pcibr_piomap_t          maplist;
  500.     pcibr_piomap_t          pcibr_piomap;
  501.     iopaddr_t               xio_addr;
  502.     xtalk_piomap_t          xtalk_piomap;
  503.     unsigned long           s;
  504.     /* Make sure that the req sizes are non-zero */
  505.     if ((req_size < 1) || (req_size_max < 1))
  506. return NULL;
  507.     /*
  508.      * Code to translate slot/space/addr
  509.      * into xio_addr is common between
  510.      * this routine and pcibr_piotrans_addr.
  511.      */
  512.     xio_addr = pcibr_addr_pci_to_xio(pconn_vhdl, pciio_slot, space, pci_addr, req_size, flags);
  513.     if (xio_addr == XIO_NOWHERE)
  514. return NULL;
  515.     /* Check the piomap list to see if there is already an allocated
  516.      * piomap entry but not in use. If so use that one. Otherwise
  517.      * allocate a new piomap entry and add it to the piomap list
  518.      */
  519.     mapptr = &(pcibr_info->f_piomap);
  520.     s = pcibr_lock(pcibr_soft);
  521.     for (pcibr_piomap = *mapptr;
  522.  pcibr_piomap != NULL;
  523.  pcibr_piomap = pcibr_piomap->bp_next) {
  524. if (pcibr_piomap->bp_mapsz == 0)
  525.     break;
  526.     }
  527.     if (pcibr_piomap)
  528. mapptr = NULL;
  529.     else {
  530. pcibr_unlock(pcibr_soft, s);
  531. NEW(pcibr_piomap);
  532.     }
  533.     pcibr_piomap->bp_dev = pconn_vhdl;
  534.     pcibr_piomap->bp_slot = pciio_slot;
  535.     pcibr_piomap->bp_flags = flags;
  536.     pcibr_piomap->bp_space = space;
  537.     pcibr_piomap->bp_pciaddr = pci_addr;
  538.     pcibr_piomap->bp_mapsz = req_size;
  539.     pcibr_piomap->bp_soft = pcibr_soft;
  540.     pcibr_piomap->bp_toc[0] = ATOMIC_INIT(0);
  541.     if (mapptr) {
  542. s = pcibr_lock(pcibr_soft);
  543. maplist = *mapptr;
  544. pcibr_piomap->bp_next = maplist;
  545. *mapptr = pcibr_piomap;
  546.     }
  547.     pcibr_unlock(pcibr_soft, s);
  548.     if (pcibr_piomap) {
  549. xtalk_piomap =
  550.     xtalk_piomap_alloc(xconn_vhdl, 0,
  551.        xio_addr,
  552.        req_size, req_size_max,
  553.        flags & PIOMAP_FLAGS);
  554. if (xtalk_piomap) {
  555.     pcibr_piomap->bp_xtalk_addr = xio_addr;
  556.     pcibr_piomap->bp_xtalk_pio = xtalk_piomap;
  557. } else {
  558.     pcibr_piomap->bp_mapsz = 0;
  559.     pcibr_piomap = 0;
  560. }
  561.     }
  562.     return pcibr_piomap;
  563. }
  564. /*ARGSUSED */
  565. void
  566. pcibr_piomap_free(pcibr_piomap_t pcibr_piomap)
  567. {
  568.     xtalk_piomap_free(pcibr_piomap->bp_xtalk_pio);
  569.     pcibr_piomap->bp_xtalk_pio = 0;
  570.     pcibr_piomap->bp_mapsz = 0;
  571. }
  572. /*ARGSUSED */
  573. caddr_t
  574. pcibr_piomap_addr(pcibr_piomap_t pcibr_piomap,
  575.   iopaddr_t pci_addr,
  576.   size_t req_size)
  577. {
  578.     return xtalk_piomap_addr(pcibr_piomap->bp_xtalk_pio,
  579.      pcibr_piomap->bp_xtalk_addr +
  580.      pci_addr - pcibr_piomap->bp_pciaddr,
  581.      req_size);
  582. }
  583. /*ARGSUSED */
  584. void
  585. pcibr_piomap_done(pcibr_piomap_t pcibr_piomap)
  586. {
  587.     xtalk_piomap_done(pcibr_piomap->bp_xtalk_pio);
  588. }
  589. /*ARGSUSED */
  590. caddr_t
  591. pcibr_piotrans_addr(devfs_handle_t pconn_vhdl,
  592.     device_desc_t dev_desc,
  593.     pciio_space_t space,
  594.     iopaddr_t pci_addr,
  595.     size_t req_size,
  596.     unsigned flags)
  597. {
  598.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  599.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  600.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  601.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  602.     iopaddr_t               xio_addr;
  603.     xio_addr = pcibr_addr_pci_to_xio(pconn_vhdl, pciio_slot, space, pci_addr, req_size, flags);
  604.     if (xio_addr == XIO_NOWHERE)
  605. return NULL;
  606.     return xtalk_piotrans_addr(xconn_vhdl, 0, xio_addr, req_size, flags & PIOMAP_FLAGS);
  607. }
  608. /*
  609.  * PIO Space allocation and management.
  610.  *      Allocate and Manage the PCI PIO space (mem and io space)
  611.  *      This routine is pretty simplistic at this time, and
  612.  *      does pretty trivial management of allocation and freeing..
  613.  *      The current scheme is prone for fragmentation..
  614.  *      Change the scheme to use bitmaps.
  615.  */
  616. /*ARGSUSED */
  617. iopaddr_t
  618. pcibr_piospace_alloc(devfs_handle_t pconn_vhdl,
  619.      device_desc_t dev_desc,
  620.      pciio_space_t space,
  621.      size_t req_size,
  622.      size_t alignment)
  623. {
  624.     pcibr_info_t            pcibr_info = pcibr_info_get(pconn_vhdl);
  625.     pciio_info_t            pciio_info = &pcibr_info->f_c;
  626.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  627.     pciio_piospace_t        piosp;
  628.     unsigned long           s;
  629.     iopaddr_t              *pciaddr, *pcilast;
  630.     iopaddr_t               start_addr;
  631.     size_t                  align_mask;
  632.     /*
  633.      * Check for proper alignment
  634.      */
  635.     ASSERT(alignment >= NBPP);
  636.     ASSERT((alignment & (alignment - 1)) == 0);
  637.     align_mask = alignment - 1;
  638.     s = pcibr_lock(pcibr_soft);
  639.     /*
  640.      * First look if a previously allocated chunk exists.
  641.      */
  642.     if ((piosp = pcibr_info->f_piospace)) {
  643. /*
  644.  * Look through the list for a right sized free chunk.
  645.  */
  646. do {
  647.     if (piosp->free &&
  648. (piosp->space == space) &&
  649. (piosp->count >= req_size) &&
  650. !(piosp->start & align_mask)) {
  651. piosp->free = 0;
  652. pcibr_unlock(pcibr_soft, s);
  653. return piosp->start;
  654.     }
  655.     piosp = piosp->next;
  656. } while (piosp);
  657.     }
  658.     ASSERT(!piosp);
  659.     switch (space) {
  660.     case PCIIO_SPACE_IO:
  661. pciaddr = &pcibr_soft->bs_spinfo.pci_io_base;
  662. pcilast = &pcibr_soft->bs_spinfo.pci_io_last;
  663. break;
  664.     case PCIIO_SPACE_MEM:
  665.     case PCIIO_SPACE_MEM32:
  666. pciaddr = &pcibr_soft->bs_spinfo.pci_mem_base;
  667. pcilast = &pcibr_soft->bs_spinfo.pci_mem_last;
  668. break;
  669.     default:
  670. ASSERT(0);
  671. pcibr_unlock(pcibr_soft, s);
  672. return 0;
  673.     }
  674.     start_addr = *pciaddr;
  675.     /*
  676.      * Align start_addr.
  677.      */
  678.     if (start_addr & align_mask)
  679. start_addr = (start_addr + align_mask) & ~align_mask;
  680.     if ((start_addr + req_size) > *pcilast) {
  681. /*
  682.  * If too big a request, reject it.
  683.  */
  684. pcibr_unlock(pcibr_soft, s);
  685. return 0;
  686.     }
  687.     *pciaddr = (start_addr + req_size);
  688.     NEW(piosp);
  689.     piosp->free = 0;
  690.     piosp->space = space;
  691.     piosp->start = start_addr;
  692.     piosp->count = req_size;
  693.     piosp->next = pcibr_info->f_piospace;
  694.     pcibr_info->f_piospace = piosp;
  695.     pcibr_unlock(pcibr_soft, s);
  696.     return start_addr;
  697. }
  698. /*ARGSUSED */
  699. void
  700. pcibr_piospace_free(devfs_handle_t pconn_vhdl,
  701.     pciio_space_t space,
  702.     iopaddr_t pciaddr,
  703.     size_t req_size)
  704. {
  705.     pcibr_info_t            pcibr_info = pcibr_info_get(pconn_vhdl);
  706.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pcibr_info->f_mfast;
  707.     pciio_piospace_t        piosp;
  708.     unsigned long           s;
  709.     char                    name[1024];
  710.     /*
  711.      * Look through the bridge data structures for the pciio_piospace_t
  712.      * structure corresponding to  'pciaddr'
  713.      */
  714.     s = pcibr_lock(pcibr_soft);
  715.     piosp = pcibr_info->f_piospace;
  716.     while (piosp) {
  717. /*
  718.  * Piospace free can only be for the complete
  719.  * chunk and not parts of it..
  720.  */
  721. if (piosp->start == pciaddr) {
  722.     if (piosp->count == req_size)
  723. break;
  724.     /*
  725.      * Improper size passed for freeing..
  726.      * Print a message and break;
  727.      */
  728.     hwgraph_vertex_name_get(pconn_vhdl, name, 1024);
  729.     printk(KERN_WARNING  "pcibr_piospace_free: error");
  730.     printk(KERN_WARNING  "Device %s freeing size (0x%lx) different than allocated (0x%lx)",
  731. name, req_size, piosp->count);
  732.     printk(KERN_WARNING  "Freeing 0x%lx instead", piosp->count);
  733.     break;
  734. }
  735. piosp = piosp->next;
  736.     }
  737.     if (!piosp) {
  738. printk(KERN_WARNING  
  739. "pcibr_piospace_free: Address 0x%lx size 0x%lx - No matchn",
  740. pciaddr, req_size);
  741. pcibr_unlock(pcibr_soft, s);
  742. return;
  743.     }
  744.     piosp->free = 1;
  745.     pcibr_unlock(pcibr_soft, s);
  746.     return;
  747. }
  748. /* =====================================================================
  749.  *    DMA MANAGEMENT
  750.  *
  751.  *      The Bridge ASIC provides three methods of doing
  752.  *      DMA: via a "direct map" register available in
  753.  *      32-bit PCI space (which selects a contiguous 2G
  754.  *      address space on some other widget), via
  755.  *      "direct" addressing via 64-bit PCI space (all
  756.  *      destination information comes from the PCI
  757.  *      address, including transfer attributes), and via
  758.  *      a "mapped" region that allows a bunch of
  759.  *      different small mappings to be established with
  760.  *      the PMU.
  761.  *
  762.  *      For efficiency, we most prefer to use the 32-bit
  763.  *      direct mapping facility, since it requires no
  764.  *      resource allocations. The advantage of using the
  765.  *      PMU over the 64-bit direct is that single-cycle
  766.  *      PCI addressing can be used; the advantage of
  767.  *      using 64-bit direct over PMU addressing is that
  768.  *      we do not have to allocate entries in the PMU.
  769.  */
  770. /*
  771.  * Convert PCI-generic software flags and Bridge-specific software flags
  772.  * into Bridge-specific Direct Map attribute bits.
  773.  */
  774. LOCAL iopaddr_t
  775. pcibr_flags_to_d64(unsigned flags, pcibr_soft_t pcibr_soft)
  776. {
  777.     iopaddr_t               attributes = 0;
  778.     /* Sanity check: Bridge only allows use of VCHAN1 via 64-bit addrs */
  779. #ifdef LATER
  780.     ASSERT_ALWAYS(!(flags & PCIBR_VCHAN1) || (flags & PCIIO_DMA_A64));
  781. #endif
  782.     /* Generic macro flags
  783.      */
  784.     if (flags & PCIIO_DMA_DATA) { /* standard data channel */
  785. attributes &= ~PCI64_ATTR_BAR; /* no barrier bit */
  786. attributes |= PCI64_ATTR_PREF; /* prefetch on */
  787.     }
  788.     if (flags & PCIIO_DMA_CMD) { /* standard command channel */
  789. attributes |= PCI64_ATTR_BAR; /* barrier bit on */
  790. attributes &= ~PCI64_ATTR_PREF; /* disable prefetch */
  791.     }
  792.     /* Generic detail flags
  793.      */
  794.     if (flags & PCIIO_PREFETCH)
  795. attributes |= PCI64_ATTR_PREF;
  796.     if (flags & PCIIO_NOPREFETCH)
  797. attributes &= ~PCI64_ATTR_PREF;
  798.     /* the swap bit is in the address attributes for xbridge */
  799.     if (pcibr_soft->bs_xbridge) {
  800.      if (flags & PCIIO_BYTE_STREAM)
  801.          attributes |= PCI64_ATTR_SWAP;
  802.      if (flags & PCIIO_WORD_VALUES)
  803.          attributes &= ~PCI64_ATTR_SWAP;
  804.     }
  805.     /* Provider-specific flags
  806.      */
  807.     if (flags & PCIBR_BARRIER)
  808. attributes |= PCI64_ATTR_BAR;
  809.     if (flags & PCIBR_NOBARRIER)
  810. attributes &= ~PCI64_ATTR_BAR;
  811.     if (flags & PCIBR_PREFETCH)
  812. attributes |= PCI64_ATTR_PREF;
  813.     if (flags & PCIBR_NOPREFETCH)
  814. attributes &= ~PCI64_ATTR_PREF;
  815.     if (flags & PCIBR_PRECISE)
  816. attributes |= PCI64_ATTR_PREC;
  817.     if (flags & PCIBR_NOPRECISE)
  818. attributes &= ~PCI64_ATTR_PREC;
  819.     if (flags & PCIBR_VCHAN1)
  820. attributes |= PCI64_ATTR_VIRTUAL;
  821.     if (flags & PCIBR_VCHAN0)
  822. attributes &= ~PCI64_ATTR_VIRTUAL;
  823.     return (attributes);
  824. }
  825. /*
  826.  * Convert PCI-generic software flags and Bridge-specific software flags
  827.  * into Bridge-specific Address Translation Entry attribute bits.
  828.  */
  829. LOCAL bridge_ate_t
  830. pcibr_flags_to_ate(unsigned flags)
  831. {
  832.     bridge_ate_t            attributes;
  833.     /* default if nothing specified:
  834.      * NOBARRIER
  835.      * NOPREFETCH
  836.      * NOPRECISE
  837.      * COHERENT
  838.      * Plus the valid bit
  839.      */
  840.     attributes = ATE_CO | ATE_V;
  841.     /* Generic macro flags
  842.      */
  843.     if (flags & PCIIO_DMA_DATA) { /* standard data channel */
  844. attributes &= ~ATE_BAR; /* no barrier */
  845. attributes |= ATE_PREF; /* prefetch on */
  846.     }
  847.     if (flags & PCIIO_DMA_CMD) { /* standard command channel */
  848. attributes |= ATE_BAR; /* barrier bit on */
  849. attributes &= ~ATE_PREF; /* disable prefetch */
  850.     }
  851.     /* Generic detail flags
  852.      */
  853.     if (flags & PCIIO_PREFETCH)
  854. attributes |= ATE_PREF;
  855.     if (flags & PCIIO_NOPREFETCH)
  856. attributes &= ~ATE_PREF;
  857.     /* Provider-specific flags
  858.      */
  859.     if (flags & PCIBR_BARRIER)
  860. attributes |= ATE_BAR;
  861.     if (flags & PCIBR_NOBARRIER)
  862. attributes &= ~ATE_BAR;
  863.     if (flags & PCIBR_PREFETCH)
  864. attributes |= ATE_PREF;
  865.     if (flags & PCIBR_NOPREFETCH)
  866. attributes &= ~ATE_PREF;
  867.     if (flags & PCIBR_PRECISE)
  868. attributes |= ATE_PREC;
  869.     if (flags & PCIBR_NOPRECISE)
  870. attributes &= ~ATE_PREC;
  871.     return (attributes);
  872. }
  873. /*ARGSUSED */
  874. pcibr_dmamap_t
  875. pcibr_dmamap_alloc(devfs_handle_t pconn_vhdl,
  876.    device_desc_t dev_desc,
  877.    size_t req_size_max,
  878.    unsigned flags)
  879. {
  880.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  881.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  882.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  883.     pciio_slot_t            slot;
  884.     xwidgetnum_t            xio_port;
  885.     xtalk_dmamap_t          xtalk_dmamap;
  886.     pcibr_dmamap_t          pcibr_dmamap;
  887.     int                     ate_count;
  888.     int                     ate_index;
  889.     /* merge in forced flags */
  890.     flags |= pcibr_soft->bs_dma_flags;
  891. #ifdef IRIX
  892.     NEWf(pcibr_dmamap, flags);
  893. #else
  894.     /*
  895.      * On SNIA64, these maps are pre-allocated because pcibr_dmamap_alloc()
  896.      * can be called within an interrupt thread.
  897.      */
  898.     pcibr_dmamap = (pcibr_dmamap_t)get_free_pciio_dmamap(pcibr_soft->bs_vhdl);
  899. #endif
  900.     if (!pcibr_dmamap)
  901. return 0;
  902.     xtalk_dmamap = xtalk_dmamap_alloc(xconn_vhdl, dev_desc, req_size_max,
  903.       flags & DMAMAP_FLAGS);
  904.     if (!xtalk_dmamap) {
  905. #if PCIBR_ATE_DEBUG
  906. printk("pcibr_attach: xtalk_dmamap_alloc failedn");
  907. #endif
  908. #ifdef IRIX
  909. DEL(pcibr_dmamap);
  910. #else
  911. free_pciio_dmamap(pcibr_dmamap);
  912. #endif
  913. return 0;
  914.     }
  915.     xio_port = pcibr_soft->bs_mxid;
  916.     slot = pciio_info_slot_get(pciio_info);
  917.     pcibr_dmamap->bd_dev = pconn_vhdl;
  918.     pcibr_dmamap->bd_slot = slot;
  919.     pcibr_dmamap->bd_soft = pcibr_soft;
  920.     pcibr_dmamap->bd_xtalk = xtalk_dmamap;
  921.     pcibr_dmamap->bd_max_size = req_size_max;
  922.     pcibr_dmamap->bd_xio_port = xio_port;
  923.     if (flags & PCIIO_DMA_A64) {
  924. if (!pcibr_try_set_device(pcibr_soft, slot, flags, BRIDGE_DEV_D64_BITS)) {
  925.     iopaddr_t               pci_addr;
  926.     int                     have_rrbs;
  927.     int                     min_rrbs;
  928.     /* Device is capable of A64 operations,
  929.      * and the attributes of the DMA are
  930.      * consistant with any previous DMA
  931.      * mappings using shared resources.
  932.      */
  933.     pci_addr = pcibr_flags_to_d64(flags, pcibr_soft);
  934.     pcibr_dmamap->bd_flags = flags;
  935.     pcibr_dmamap->bd_xio_addr = 0;
  936.     pcibr_dmamap->bd_pci_addr = pci_addr;
  937.     /* Make sure we have an RRB (or two).
  938.      */
  939.     if (!(pcibr_soft->bs_rrb_fixed & (1 << slot))) {
  940. if (flags & PCIBR_VCHAN1)
  941.     slot += PCIBR_RRB_SLOT_VIRTUAL;
  942. have_rrbs = pcibr_soft->bs_rrb_valid[slot];
  943. if (have_rrbs < 2) {
  944.     if (pci_addr & PCI64_ATTR_PREF)
  945. min_rrbs = 2;
  946.     else
  947. min_rrbs = 1;
  948.     if (have_rrbs < min_rrbs)
  949. do_pcibr_rrb_autoalloc(pcibr_soft, slot, min_rrbs - have_rrbs);
  950. }
  951.     }
  952. #if PCIBR_ATE_DEBUG
  953.     printk("pcibr_dmamap_alloc: using direct64n");
  954. #endif
  955.     return pcibr_dmamap;
  956. }
  957. #if PCIBR_ATE_DEBUG
  958. printk("pcibr_dmamap_alloc: unable to use direct64n");
  959. #endif
  960. flags &= ~PCIIO_DMA_A64;
  961.     }
  962.     if (flags & PCIIO_FIXED) {
  963. /* warning: mappings may fail later,
  964.  * if direct32 can't get to the address.
  965.  */
  966. if (!pcibr_try_set_device(pcibr_soft, slot, flags, BRIDGE_DEV_D32_BITS)) {
  967.     /* User desires DIRECT A32 operations,
  968.      * and the attributes of the DMA are
  969.      * consistant with any previous DMA
  970.      * mappings using shared resources.
  971.      * Mapping calls may fail if target
  972.      * is outside the direct32 range.
  973.      */
  974. #if PCIBR_ATE_DEBUG
  975.     printk("pcibr_dmamap_alloc: using direct32n");
  976. #endif
  977.     pcibr_dmamap->bd_flags = flags;
  978.     pcibr_dmamap->bd_xio_addr = pcibr_soft->bs_dir_xbase;
  979.     pcibr_dmamap->bd_pci_addr = PCI32_DIRECT_BASE;
  980.     return pcibr_dmamap;
  981. }
  982. #if PCIBR_ATE_DEBUG
  983. printk("pcibr_dmamap_alloc: unable to use direct32n");
  984. #endif
  985. /* If the user demands FIXED and we can't
  986.  * give it to him, fail.
  987.  */
  988. xtalk_dmamap_free(xtalk_dmamap);
  989. #ifdef IRIX
  990. DEL(pcibr_dmamap);
  991. #else
  992. free_pciio_dmamap(pcibr_dmamap);
  993. #endif
  994. return 0;
  995.     }
  996.     /*
  997.      * Allocate Address Translation Entries from the mapping RAM.
  998.      * Unless the PCIBR_NO_ATE_ROUNDUP flag is specified,
  999.      * the maximum number of ATEs is based on the worst-case
  1000.      * scenario, where the requested target is in the
  1001.      * last byte of an ATE; thus, mapping IOPGSIZE+2
  1002.      * does end up requiring three ATEs.
  1003.      */
  1004.     if (!(flags & PCIBR_NO_ATE_ROUNDUP)) {
  1005. ate_count = IOPG((IOPGSIZE - 1) /* worst case start offset */
  1006.      +req_size_max /* max mapping bytes */
  1007.      - 1) + 1; /* round UP */
  1008.     } else { /* assume requested target is page aligned */
  1009. ate_count = IOPG(req_size_max   /* max mapping bytes */
  1010.      - 1) + 1; /* round UP */
  1011.     }
  1012.     ate_index = pcibr_ate_alloc(pcibr_soft, ate_count);
  1013.     if (ate_index != -1) {
  1014. if (!pcibr_try_set_device(pcibr_soft, slot, flags, BRIDGE_DEV_PMU_BITS)) {
  1015.     bridge_ate_t            ate_proto;
  1016.     int                     have_rrbs;
  1017.     int                     min_rrbs;
  1018. #if PCIBR_ATE_DEBUG
  1019.     printk("pcibr_dmamap_alloc: using PMUn");
  1020. #endif
  1021.     ate_proto = pcibr_flags_to_ate(flags);
  1022.     pcibr_dmamap->bd_flags = flags;
  1023.     pcibr_dmamap->bd_pci_addr =
  1024. PCI32_MAPPED_BASE + IOPGSIZE * ate_index;
  1025.     /*
  1026.      * for xbridge the byte-swap bit == bit 29 of PCI address
  1027.      */
  1028.     if (pcibr_soft->bs_xbridge) {
  1029.     if (flags & PCIIO_BYTE_STREAM)
  1030.     ATE_SWAP_ON(pcibr_dmamap->bd_pci_addr);
  1031.     /*
  1032.      * If swap was set in bss_device in pcibr_endian_set()
  1033.      * we need to change the address bit.
  1034.      */
  1035.     if (pcibr_soft->bs_slot[slot].bss_device & 
  1036. BRIDGE_DEV_SWAP_PMU)
  1037.     ATE_SWAP_ON(pcibr_dmamap->bd_pci_addr);
  1038.     if (flags & PCIIO_WORD_VALUES)
  1039.     ATE_SWAP_OFF(pcibr_dmamap->bd_pci_addr);
  1040.     }
  1041.     pcibr_dmamap->bd_xio_addr = 0;
  1042.     pcibr_dmamap->bd_ate_ptr = pcibr_ate_addr(pcibr_soft, ate_index);
  1043.     pcibr_dmamap->bd_ate_index = ate_index;
  1044.     pcibr_dmamap->bd_ate_count = ate_count;
  1045.     pcibr_dmamap->bd_ate_proto = ate_proto;
  1046.     /* Make sure we have an RRB (or two).
  1047.      */
  1048.     if (!(pcibr_soft->bs_rrb_fixed & (1 << slot))) {
  1049. have_rrbs = pcibr_soft->bs_rrb_valid[slot];
  1050. if (have_rrbs < 2) {
  1051.     if (ate_proto & ATE_PREF)
  1052. min_rrbs = 2;
  1053.     else
  1054. min_rrbs = 1;
  1055.     if (have_rrbs < min_rrbs)
  1056. do_pcibr_rrb_autoalloc(pcibr_soft, slot, min_rrbs - have_rrbs);
  1057. }
  1058.     }
  1059.     if (ate_index >= pcibr_soft->bs_int_ate_size && 
  1060. !pcibr_soft->bs_xbridge) {
  1061. bridge_t               *bridge = pcibr_soft->bs_base;
  1062. volatile unsigned      *cmd_regp;
  1063. unsigned                cmd_reg;
  1064. unsigned long           s;
  1065. pcibr_dmamap->bd_flags |= PCIBR_DMAMAP_SSRAM;
  1066. s = pcibr_lock(pcibr_soft);
  1067. cmd_regp = &(bridge->
  1068.      b_type0_cfg_dev[slot].
  1069.      l[PCI_CFG_COMMAND / 4]);
  1070. cmd_reg = *cmd_regp;
  1071. pcibr_soft->bs_slot[slot].bss_cmd_pointer = cmd_regp;
  1072. pcibr_soft->bs_slot[slot].bss_cmd_shadow = cmd_reg;
  1073. pcibr_unlock(pcibr_soft, s);
  1074.     }
  1075.     return pcibr_dmamap;
  1076. }
  1077. #if PCIBR_ATE_DEBUG
  1078. printk("pcibr_dmamap_alloc: unable to use PMUn");
  1079. #endif
  1080. pcibr_ate_free(pcibr_soft, ate_index, ate_count);
  1081.     }
  1082.     /* total failure: sorry, you just can't
  1083.      * get from here to there that way.
  1084.      */
  1085. #if PCIBR_ATE_DEBUG
  1086.     printk("pcibr_dmamap_alloc: complete failure.n");
  1087. #endif
  1088.     xtalk_dmamap_free(xtalk_dmamap);
  1089. #ifdef IRIX
  1090.     DEL(pcibr_dmamap);
  1091. #else
  1092.     free_pciio_dmamap(pcibr_dmamap);
  1093. #endif
  1094.     return 0;
  1095. }
  1096. /*ARGSUSED */
  1097. void
  1098. pcibr_dmamap_free(pcibr_dmamap_t pcibr_dmamap)
  1099. {
  1100.     pcibr_soft_t            pcibr_soft = pcibr_dmamap->bd_soft;
  1101.     pciio_slot_t            slot = pcibr_dmamap->bd_slot;
  1102.     unsigned                flags = pcibr_dmamap->bd_flags;
  1103.     /* Make sure that bss_ext_ates_active
  1104.      * is properly kept up to date.
  1105.      */
  1106.     if (PCIBR_DMAMAP_BUSY & flags)
  1107. if (PCIBR_DMAMAP_SSRAM & flags)
  1108.     atomic_dec(&(pcibr_soft->bs_slot[slot]. bss_ext_ates_active));
  1109.     xtalk_dmamap_free(pcibr_dmamap->bd_xtalk);
  1110.     if (pcibr_dmamap->bd_flags & PCIIO_DMA_A64) {
  1111. pcibr_release_device(pcibr_soft, slot, BRIDGE_DEV_D64_BITS);
  1112.     }
  1113.     if (pcibr_dmamap->bd_ate_count) {
  1114. pcibr_ate_free(pcibr_dmamap->bd_soft,
  1115.        pcibr_dmamap->bd_ate_index,
  1116.        pcibr_dmamap->bd_ate_count);
  1117. pcibr_release_device(pcibr_soft, slot, BRIDGE_DEV_PMU_BITS);
  1118.     }
  1119. #ifdef IRIX
  1120.     DEL(pcibr_dmamap);
  1121. #else
  1122.     free_pciio_dmamap(pcibr_dmamap);
  1123. #endif
  1124. }
  1125. /*
  1126.  * Setup an Address Translation Entry as specified.  Use either the Bridge
  1127.  * internal maps or the external map RAM, as appropriate.
  1128.  */
  1129. LOCAL bridge_ate_p
  1130. pcibr_ate_addr(pcibr_soft_t pcibr_soft,
  1131.        int ate_index)
  1132. {
  1133.     bridge_t *bridge = pcibr_soft->bs_base;
  1134.     return (ate_index < pcibr_soft->bs_int_ate_size)
  1135. ? &(bridge->b_int_ate_ram[ate_index].wr)
  1136. : &(bridge->b_ext_ate_ram[ate_index]);
  1137. }
  1138. /*
  1139.  *    pcibr_addr_xio_to_pci: given a PIO range, hand
  1140.  *      back the corresponding base PCI MEM address;
  1141.  *      this is used to short-circuit DMA requests that
  1142.  *      loop back onto this PCI bus.
  1143.  */
  1144. LOCAL iopaddr_t
  1145. pcibr_addr_xio_to_pci(pcibr_soft_t soft,
  1146.       iopaddr_t xio_addr,
  1147.       size_t req_size)
  1148. {
  1149.     iopaddr_t               xio_lim = xio_addr + req_size - 1;
  1150.     iopaddr_t               pci_addr;
  1151.     pciio_slot_t            slot;
  1152.     if ((xio_addr >= BRIDGE_PCI_MEM32_BASE) &&
  1153. (xio_lim <= BRIDGE_PCI_MEM32_LIMIT)) {
  1154. pci_addr = xio_addr - BRIDGE_PCI_MEM32_BASE;
  1155. return pci_addr;
  1156.     }
  1157.     if ((xio_addr >= BRIDGE_PCI_MEM64_BASE) &&
  1158. (xio_lim <= BRIDGE_PCI_MEM64_LIMIT)) {
  1159. pci_addr = xio_addr - BRIDGE_PCI_MEM64_BASE;
  1160. return pci_addr;
  1161.     }
  1162.     for (slot = 0; slot < 8; ++slot)
  1163. if ((xio_addr >= BRIDGE_DEVIO(slot)) &&
  1164.     (xio_lim < BRIDGE_DEVIO(slot + 1))) {
  1165.     bridgereg_t             dev;
  1166.     dev = soft->bs_slot[slot].bss_device;
  1167.     pci_addr = dev & BRIDGE_DEV_OFF_MASK;
  1168.     pci_addr <<= BRIDGE_DEV_OFF_ADDR_SHFT;
  1169.     pci_addr += xio_addr - BRIDGE_DEVIO(slot);
  1170.     return (dev & BRIDGE_DEV_DEV_IO_MEM) ? pci_addr : PCI_NOWHERE;
  1171. }
  1172.     return 0;
  1173. }
  1174. /* We are starting to get more complexity
  1175.  * surrounding writing ATEs, so pull
  1176.  * the writing code into this new function.
  1177.  */
  1178. #if PCIBR_FREEZE_TIME
  1179. #define ATE_FREEZE() s = ate_freeze(pcibr_dmamap, &freeze_time, cmd_regs)
  1180. #else
  1181. #define ATE_FREEZE() s = ate_freeze(pcibr_dmamap, cmd_regs)
  1182. #endif
  1183. LOCAL unsigned
  1184. ate_freeze(pcibr_dmamap_t pcibr_dmamap,
  1185. #if PCIBR_FREEZE_TIME
  1186.    unsigned *freeze_time_ptr,
  1187. #endif
  1188.    unsigned *cmd_regs)
  1189. {
  1190.     pcibr_soft_t            pcibr_soft = pcibr_dmamap->bd_soft;
  1191. #ifdef LATER
  1192.     int                     dma_slot = pcibr_dmamap->bd_slot;
  1193. #endif
  1194.     int                     ext_ates = pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM;
  1195.     int                     slot;
  1196.     unsigned long           s;
  1197.     unsigned                cmd_reg;
  1198.     volatile unsigned      *cmd_lwa;
  1199.     unsigned                cmd_lwd;
  1200.     if (!ext_ates)
  1201. return 0;
  1202.     /* Bridge Hardware Bug WAR #484930:
  1203.      * Bridge can't handle updating External ATEs
  1204.      * while DMA is occuring that uses External ATEs,
  1205.      * even if the particular ATEs involved are disjoint.
  1206.      */
  1207.     /* need to prevent anyone else from
  1208.      * unfreezing the grant while we
  1209.      * are working; also need to prevent
  1210.      * this thread from being interrupted
  1211.      * to keep PCI grant freeze time
  1212.      * at an absolute minimum.
  1213.      */
  1214.     s = pcibr_lock(pcibr_soft);
  1215. #ifdef LATER
  1216.     /* just in case pcibr_dmamap_done was not called */
  1217.     if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_BUSY) {
  1218. pcibr_dmamap->bd_flags &= ~PCIBR_DMAMAP_BUSY;
  1219. if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM)
  1220.     atomic_dec(&(pcibr_soft->bs_slot[dma_slot]. bss_ext_ates_active));
  1221. xtalk_dmamap_done(pcibr_dmamap->bd_xtalk);
  1222.     }
  1223. #endif /* LATER */
  1224. #if PCIBR_FREEZE_TIME
  1225.     *freeze_time_ptr = get_timestamp();
  1226. #endif
  1227.     cmd_lwa = 0;
  1228.     for (slot = 0; slot < 8; ++slot)
  1229. if (atomic_read(&pcibr_soft->bs_slot[slot].bss_ext_ates_active)) {
  1230.     cmd_reg = pcibr_soft->
  1231. bs_slot[slot].
  1232. bss_cmd_shadow;
  1233.     if (cmd_reg & PCI_CMD_BUS_MASTER) {
  1234. cmd_lwa = pcibr_soft->
  1235.     bs_slot[slot].
  1236.     bss_cmd_pointer;
  1237. cmd_lwd = cmd_reg ^ PCI_CMD_BUS_MASTER;
  1238. cmd_lwa[0] = cmd_lwd;
  1239.     }
  1240.     cmd_regs[slot] = cmd_reg;
  1241. } else
  1242.     cmd_regs[slot] = 0;
  1243.     if (cmd_lwa) {
  1244.     bridge_t *bridge = pcibr_soft->bs_base;
  1245.     /* Read the last master bit that has been cleared. This PIO read
  1246.      * on the PCI bus is to ensure the completion of any DMAs that
  1247.      * are due to bus requests issued by PCI devices before the
  1248.      * clearing of master bits.
  1249.      */
  1250.     cmd_lwa[0];
  1251.     /* Flush all the write buffers in the bridge */
  1252.     for (slot = 0; slot < 8; ++slot)
  1253.     if (atomic_read(&pcibr_soft->bs_slot[slot].bss_ext_ates_active)) {
  1254.     /* Flush the write buffer associated with this
  1255.      * PCI device which might be using dma map RAM.
  1256.      */
  1257.     bridge->b_wr_req_buf[slot].reg;
  1258.     }
  1259.     }
  1260.     return s;
  1261. }
  1262. #define ATE_WRITE()    ate_write(ate_ptr, ate_count, ate)
  1263. LOCAL void
  1264. ate_write(bridge_ate_p ate_ptr,
  1265.   int ate_count,
  1266.   bridge_ate_t ate)
  1267. {
  1268.     while (ate_count-- > 0) {
  1269. *ate_ptr++ = ate;
  1270. ate += IOPGSIZE;
  1271.     }
  1272. }
  1273. #if PCIBR_FREEZE_TIME
  1274. #define ATE_THAW() ate_thaw(pcibr_dmamap, ate_index, ate, ate_total, freeze_time, cmd_regs, s)
  1275. #else
  1276. #define ATE_THAW() ate_thaw(pcibr_dmamap, ate_index, cmd_regs, s)
  1277. #endif
  1278. LOCAL void
  1279. ate_thaw(pcibr_dmamap_t pcibr_dmamap,
  1280.  int ate_index,
  1281. #if PCIBR_FREEZE_TIME
  1282.  bridge_ate_t ate,
  1283.  int ate_total,
  1284.  unsigned freeze_time_start,
  1285. #endif
  1286.  unsigned *cmd_regs,
  1287.  unsigned s)
  1288. {
  1289.     pcibr_soft_t            pcibr_soft = pcibr_dmamap->bd_soft;
  1290.     int                     dma_slot = pcibr_dmamap->bd_slot;
  1291.     int                     slot;
  1292.     bridge_t               *bridge = pcibr_soft->bs_base;
  1293.     int                     ext_ates = pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM;
  1294.     unsigned                cmd_reg;
  1295. #if PCIBR_FREEZE_TIME
  1296.     unsigned                freeze_time;
  1297.     static unsigned         max_freeze_time = 0;
  1298.     static unsigned         max_ate_total;
  1299. #endif
  1300.     if (!ext_ates)
  1301. return;
  1302.     /* restore cmd regs */
  1303.     for (slot = 0; slot < 8; ++slot)
  1304. if ((cmd_reg = cmd_regs[slot]) & PCI_CMD_BUS_MASTER)
  1305.     bridge->b_type0_cfg_dev[slot].l[PCI_CFG_COMMAND / 4] = cmd_reg;
  1306.     pcibr_dmamap->bd_flags |= PCIBR_DMAMAP_BUSY;
  1307.     atomic_inc(&(pcibr_soft->bs_slot[dma_slot]. bss_ext_ates_active));
  1308. #if PCIBR_FREEZE_TIME
  1309.     freeze_time = get_timestamp() - freeze_time_start;
  1310.     if ((max_freeze_time < freeze_time) ||
  1311. (max_ate_total < ate_total)) {
  1312. if (max_freeze_time < freeze_time)
  1313.     max_freeze_time = freeze_time;
  1314. if (max_ate_total < ate_total)
  1315.     max_ate_total = ate_total;
  1316. pcibr_unlock(pcibr_soft, s);
  1317. printk("%s: pci freeze time %d usec for %d ATEsn"
  1318. "tfirst ate: %Rn",
  1319. pcibr_soft->bs_name,
  1320. freeze_time * 1000 / 1250,
  1321. ate_total,
  1322. ate, ate_bits);
  1323.     } else
  1324. #endif
  1325. pcibr_unlock(pcibr_soft, s);
  1326. }
  1327. /*ARGSUSED */
  1328. iopaddr_t
  1329. pcibr_dmamap_addr(pcibr_dmamap_t pcibr_dmamap,
  1330.   paddr_t paddr,
  1331.   size_t req_size)
  1332. {
  1333.     pcibr_soft_t            pcibr_soft;
  1334.     iopaddr_t               xio_addr;
  1335.     xwidgetnum_t            xio_port;
  1336.     iopaddr_t               pci_addr;
  1337.     unsigned                flags;
  1338.     ASSERT(pcibr_dmamap != NULL);
  1339.     ASSERT(req_size > 0);
  1340.     ASSERT(req_size <= pcibr_dmamap->bd_max_size);
  1341.     pcibr_soft = pcibr_dmamap->bd_soft;
  1342.     flags = pcibr_dmamap->bd_flags;
  1343.     xio_addr = xtalk_dmamap_addr(pcibr_dmamap->bd_xtalk, paddr, req_size);
  1344.     if (XIO_PACKED(xio_addr)) {
  1345. xio_port = XIO_PORT(xio_addr);
  1346. xio_addr = XIO_ADDR(xio_addr);
  1347.     } else
  1348. xio_port = pcibr_dmamap->bd_xio_port;
  1349.     /* If this DMA is to an address that
  1350.      * refers back to this Bridge chip,
  1351.      * reduce it back to the correct
  1352.      * PCI MEM address.
  1353.      */
  1354.     if (xio_port == pcibr_soft->bs_xid) {
  1355. pci_addr = pcibr_addr_xio_to_pci(pcibr_soft, xio_addr, req_size);
  1356.     } else if (flags & PCIIO_DMA_A64) {
  1357. /* A64 DMA:
  1358.  * always use 64-bit direct mapping,
  1359.  * which always works.
  1360.  * Device(x) was set up during
  1361.  * dmamap allocation.
  1362.  */
  1363. /* attributes are already bundled up into bd_pci_addr.
  1364.  */
  1365. pci_addr = pcibr_dmamap->bd_pci_addr
  1366.     | ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT)
  1367.     | xio_addr;
  1368. /* Bridge Hardware WAR #482836:
  1369.  * If the transfer is not cache aligned
  1370.  * and the Bridge Rev is <= B, force
  1371.  * prefetch to be off.
  1372.  */
  1373. if (flags & PCIBR_NOPREFETCH)
  1374.     pci_addr &= ~PCI64_ATTR_PREF;
  1375. #if DEBUG && PCIBR_DMA_DEBUG
  1376. printk("pcibr_dmamap_addr (direct64):n"
  1377. "twanted paddr [0x%x..0x%x]n"
  1378. "tXIO port 0x%x offset 0x%xn"
  1379. "treturning PCI 0x%xn",
  1380. paddr, paddr + req_size - 1,
  1381. xio_port, xio_addr, pci_addr);
  1382. #endif
  1383.     } else if (flags & PCIIO_FIXED) {
  1384. /* A32 direct DMA:
  1385.  * always use 32-bit direct mapping,
  1386.  * which may fail.
  1387.  * Device(x) was set up during
  1388.  * dmamap allocation.
  1389.  */
  1390. if (xio_port != pcibr_soft->bs_dir_xport)
  1391.     pci_addr = 0; /* wrong DIDN */
  1392. else if (xio_addr < pcibr_dmamap->bd_xio_addr)
  1393.     pci_addr = 0; /* out of range */
  1394. else if ((xio_addr + req_size) >
  1395.  (pcibr_dmamap->bd_xio_addr + BRIDGE_DMA_DIRECT_SIZE))
  1396.     pci_addr = 0; /* out of range */
  1397. else
  1398.     pci_addr = pcibr_dmamap->bd_pci_addr +
  1399. xio_addr - pcibr_dmamap->bd_xio_addr;
  1400. #if DEBUG && PCIBR_DMA_DEBUG
  1401. printk("pcibr_dmamap_addr (direct32):n"
  1402. "twanted paddr [0x%x..0x%x]n"
  1403. "tXIO port 0x%x offset 0x%xn"
  1404. "treturning PCI 0x%xn",
  1405. paddr, paddr + req_size - 1,
  1406. xio_port, xio_addr, pci_addr);
  1407. #endif
  1408.     } else {
  1409. bridge_t               *bridge = pcibr_soft->bs_base;
  1410. iopaddr_t               offset = IOPGOFF(xio_addr);
  1411. bridge_ate_t            ate_proto = pcibr_dmamap->bd_ate_proto;
  1412. int                     ate_count = IOPG(offset + req_size - 1) + 1;
  1413. int                     ate_index = pcibr_dmamap->bd_ate_index;
  1414. unsigned                cmd_regs[8];
  1415. unsigned                s;
  1416. #if PCIBR_FREEZE_TIME
  1417. int                     ate_total = ate_count;
  1418. unsigned                freeze_time;
  1419. #endif
  1420. #if PCIBR_ATE_DEBUG
  1421. bridge_ate_t            ate_cmp;
  1422. bridge_ate_p            ate_cptr;
  1423. unsigned                ate_lo, ate_hi;
  1424. int                     ate_bad = 0;
  1425. int                     ate_rbc = 0;
  1426. #endif
  1427. bridge_ate_p            ate_ptr = pcibr_dmamap->bd_ate_ptr;
  1428. bridge_ate_t            ate;
  1429. /* Bridge Hardware WAR #482836:
  1430.  * If the transfer is not cache aligned
  1431.  * and the Bridge Rev is <= B, force
  1432.  * prefetch to be off.
  1433.  */
  1434. if (flags & PCIBR_NOPREFETCH)
  1435.     ate_proto &= ~ATE_PREF;
  1436. ate = ate_proto
  1437.     | (xio_port << ATE_TIDSHIFT)
  1438.     | (xio_addr - offset);
  1439. pci_addr = pcibr_dmamap->bd_pci_addr + offset;
  1440. /* Fill in our mapping registers
  1441.  * with the appropriate xtalk data,
  1442.  * and hand back the PCI address.
  1443.  */
  1444. ASSERT(ate_count > 0);
  1445. if (ate_count <= pcibr_dmamap->bd_ate_count) {
  1446. ATE_FREEZE();
  1447. ATE_WRITE();
  1448. ATE_THAW();
  1449. bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  1450. } else {
  1451. /* The number of ATE's required is greater than the number
  1452.  * allocated for this map. One way this can happen is if
  1453.  * pcibr_dmamap_alloc() was called with the PCIBR_NO_ATE_ROUNDUP
  1454.  * flag, and then when that map is used (right now), the
  1455.  * target address tells us we really did need to roundup.
  1456.  * The other possibility is that the map is just plain too
  1457.  * small to handle the requested target area.
  1458.  */
  1459. #if PCIBR_ATE_DEBUG
  1460. printk(KERN_WARNING   "pcibr_dmamap_addr :n"
  1461. "twanted paddr [0x%x..0x%x]n"
  1462. "tate_count 0x%x bd_ate_count 0x%xn"
  1463. "tATE's required > number allocatedn",
  1464. paddr, paddr + req_size - 1,
  1465. ate_count, pcibr_dmamap->bd_ate_count);
  1466. #endif
  1467. pci_addr = 0;
  1468. }
  1469.     }
  1470.     return pci_addr;
  1471. }
  1472. /*ARGSUSED */
  1473. alenlist_t
  1474. pcibr_dmamap_list(pcibr_dmamap_t pcibr_dmamap,
  1475.   alenlist_t palenlist,
  1476.   unsigned flags)
  1477. {
  1478.     pcibr_soft_t            pcibr_soft;
  1479.     bridge_t               *bridge=NULL;
  1480.     unsigned                al_flags = (flags & PCIIO_NOSLEEP) ? AL_NOSLEEP : 0;
  1481.     int                     inplace = flags & PCIIO_INPLACE;
  1482.     alenlist_t              pciio_alenlist = 0;
  1483.     alenlist_t              xtalk_alenlist;
  1484.     size_t                  length;
  1485.     iopaddr_t               offset;
  1486.     unsigned                direct64;
  1487.     int                     ate_index = 0;
  1488.     int                     ate_count = 0;
  1489.     int                     ate_total = 0;
  1490.     bridge_ate_p            ate_ptr = (bridge_ate_p)0;
  1491.     bridge_ate_t            ate_proto = (bridge_ate_t)0;
  1492.     bridge_ate_t            ate_prev;
  1493.     bridge_ate_t            ate;
  1494.     alenaddr_t              xio_addr;
  1495.     xwidgetnum_t            xio_port;
  1496.     iopaddr_t               pci_addr;
  1497.     alenaddr_t              new_addr;
  1498.     unsigned                cmd_regs[8];
  1499.     unsigned                s = 0;
  1500. #if PCIBR_FREEZE_TIME
  1501.     unsigned                freeze_time;
  1502. #endif
  1503.     int     ate_freeze_done = 0; /* To pair ATE_THAW
  1504.  * with an ATE_FREEZE
  1505.  */
  1506.     pcibr_soft = pcibr_dmamap->bd_soft;
  1507.     xtalk_alenlist = xtalk_dmamap_list(pcibr_dmamap->bd_xtalk, palenlist,
  1508.        flags & DMAMAP_FLAGS);
  1509.     if (!xtalk_alenlist)
  1510. goto fail;
  1511.     alenlist_cursor_init(xtalk_alenlist, 0, NULL);
  1512.     if (inplace) {
  1513. pciio_alenlist = xtalk_alenlist;
  1514.     } else {
  1515. pciio_alenlist = alenlist_create(al_flags);
  1516. if (!pciio_alenlist)
  1517.     goto fail;
  1518.     }
  1519.     direct64 = pcibr_dmamap->bd_flags & PCIIO_DMA_A64;
  1520.     if (!direct64) {
  1521. bridge = pcibr_soft->bs_base;
  1522. ate_ptr = pcibr_dmamap->bd_ate_ptr;
  1523. ate_index = pcibr_dmamap->bd_ate_index;
  1524. ate_proto = pcibr_dmamap->bd_ate_proto;
  1525. ATE_FREEZE();
  1526. ate_freeze_done = 1; /* Remember that we need to do an ATE_THAW */
  1527.     }
  1528.     pci_addr = pcibr_dmamap->bd_pci_addr;
  1529.     ate_prev = 0; /* matches no valid ATEs */
  1530.     while (ALENLIST_SUCCESS ==
  1531.    alenlist_get(xtalk_alenlist, NULL, 0,
  1532. &xio_addr, &length, al_flags)) {
  1533. if (XIO_PACKED(xio_addr)) {
  1534.     xio_port = XIO_PORT(xio_addr);
  1535.     xio_addr = XIO_ADDR(xio_addr);
  1536. } else
  1537.     xio_port = pcibr_dmamap->bd_xio_port;
  1538. if (xio_port == pcibr_soft->bs_xid) {
  1539.     new_addr = pcibr_addr_xio_to_pci(pcibr_soft, xio_addr, length);
  1540.     if (new_addr == PCI_NOWHERE)
  1541. goto fail;
  1542. } else if (direct64) {
  1543.     new_addr = pci_addr | xio_addr
  1544. | ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT);
  1545.     /* Bridge Hardware WAR #482836:
  1546.      * If the transfer is not cache aligned
  1547.      * and the Bridge Rev is <= B, force
  1548.      * prefetch to be off.
  1549.      */
  1550.     if (flags & PCIBR_NOPREFETCH)
  1551. new_addr &= ~PCI64_ATTR_PREF;
  1552. } else {
  1553.     /* calculate the ate value for
  1554.      * the first address. If it
  1555.      * matches the previous
  1556.      * ATE written (ie. we had
  1557.      * multiple blocks in the
  1558.      * same IOPG), then back up
  1559.      * and reuse that ATE.
  1560.      *
  1561.      * We are NOT going to
  1562.      * aggressively try to
  1563.      * reuse any other ATEs.
  1564.      */
  1565.     offset = IOPGOFF(xio_addr);
  1566.     ate = ate_proto
  1567. | (xio_port << ATE_TIDSHIFT)
  1568. | (xio_addr - offset);
  1569.     if (ate == ate_prev) {
  1570. #if PCIBR_ATE_DEBUG
  1571. printk("pcibr_dmamap_list: ATE sharen");
  1572. #endif
  1573. ate_ptr--;
  1574. ate_index--;
  1575. pci_addr -= IOPGSIZE;
  1576.     }
  1577.     new_addr = pci_addr + offset;
  1578.     /* Fill in the hardware ATEs
  1579.      * that contain this block.
  1580.      */
  1581.     ate_count = IOPG(offset + length - 1) + 1;
  1582.     ate_total += ate_count;
  1583.     /* Ensure that this map contains enough ATE's */
  1584.     if (ate_total > pcibr_dmamap->bd_ate_count) {
  1585. #if PCIBR_ATE_DEBUG
  1586. printk(KERN_WARNING   "pcibr_dmamap_list :n"
  1587. "twanted xio_addr [0x%x..0x%x]n"
  1588. "tate_total 0x%x bd_ate_count 0x%xn"
  1589. "tATE's required > number allocatedn",
  1590. xio_addr, xio_addr + length - 1,
  1591. ate_total, pcibr_dmamap->bd_ate_count);
  1592. #endif
  1593. goto fail;
  1594.     }
  1595.     ATE_WRITE();
  1596.     ate_index += ate_count;
  1597.     ate_ptr += ate_count;
  1598.     ate_count <<= IOPFNSHIFT;
  1599.     ate += ate_count;
  1600.     pci_addr += ate_count;
  1601. }
  1602. /* write the PCI DMA address
  1603.  * out to the scatter-gather list.
  1604.  */
  1605. if (inplace) {
  1606.     if (ALENLIST_SUCCESS !=
  1607. alenlist_replace(pciio_alenlist, NULL,
  1608.  &new_addr, &length, al_flags))
  1609. goto fail;
  1610. } else {
  1611.     if (ALENLIST_SUCCESS !=
  1612. alenlist_append(pciio_alenlist,
  1613. new_addr, length, al_flags))
  1614. goto fail;
  1615. }
  1616.     }
  1617.     if (!inplace)
  1618. alenlist_done(xtalk_alenlist);
  1619.     /* Reset the internal cursor of the alenlist to be returned back
  1620.      * to the caller.
  1621.      */
  1622.     alenlist_cursor_init(pciio_alenlist, 0, NULL);
  1623.     /* In case an ATE_FREEZE was done do the ATE_THAW to unroll all the
  1624.      * changes that ATE_FREEZE has done to implement the external SSRAM
  1625.      * bug workaround.
  1626.      */
  1627.     if (ate_freeze_done) {
  1628. ATE_THAW();
  1629. bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  1630.     }
  1631.     return pciio_alenlist;
  1632.   fail:
  1633.     /* There are various points of failure after doing an ATE_FREEZE
  1634.      * We need to do an ATE_THAW. Otherwise the ATEs are locked forever.
  1635.      * The decision to do an ATE_THAW needs to be based on whether a
  1636.      * an ATE_FREEZE was done before.
  1637.      */
  1638.     if (ate_freeze_done) {
  1639. ATE_THAW();
  1640. bridge->b_wid_tflush;
  1641.     }
  1642.     if (pciio_alenlist && !inplace)
  1643. alenlist_destroy(pciio_alenlist);
  1644.     return 0;
  1645. }
  1646. /*ARGSUSED */
  1647. void
  1648. pcibr_dmamap_done(pcibr_dmamap_t pcibr_dmamap)
  1649. {
  1650.     /*
  1651.      * We could go through and invalidate ATEs here;
  1652.      * for performance reasons, we don't.
  1653.      * We also don't enforce the strict alternation
  1654.      * between _addr/_list and _done, but Hub does.
  1655.      */
  1656.     if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_BUSY) {
  1657. pcibr_dmamap->bd_flags &= ~PCIBR_DMAMAP_BUSY;
  1658. if (pcibr_dmamap->bd_flags & PCIBR_DMAMAP_SSRAM)
  1659.     atomic_dec(&(pcibr_dmamap->bd_soft->bs_slot[pcibr_dmamap->bd_slot]. bss_ext_ates_active));
  1660.     }
  1661.     xtalk_dmamap_done(pcibr_dmamap->bd_xtalk);
  1662. }
  1663. /*
  1664.  * For each bridge, the DIR_OFF value in the Direct Mapping Register
  1665.  * determines the PCI to Crosstalk memory mapping to be used for all
  1666.  * 32-bit Direct Mapping memory accesses. This mapping can be to any
  1667.  * node in the system. This function will return that compact node id.
  1668.  */
  1669. /*ARGSUSED */
  1670. cnodeid_t
  1671. pcibr_get_dmatrans_node(devfs_handle_t pconn_vhdl)
  1672. {
  1673. pciio_info_t pciio_info = pciio_info_get(pconn_vhdl);
  1674. pcibr_soft_t pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  1675. return(NASID_TO_COMPACT_NODEID(NASID_GET(pcibr_soft->bs_dir_xbase)));
  1676. }
  1677. /*ARGSUSED */
  1678. iopaddr_t
  1679. pcibr_dmatrans_addr(devfs_handle_t pconn_vhdl,
  1680.     device_desc_t dev_desc,
  1681.     paddr_t paddr,
  1682.     size_t req_size,
  1683.     unsigned flags)
  1684. {
  1685.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  1686.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  1687.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  1688.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  1689.     pcibr_soft_slot_t       slotp = &pcibr_soft->bs_slot[pciio_slot];
  1690.     xwidgetnum_t            xio_port;
  1691.     iopaddr_t               xio_addr;
  1692.     iopaddr_t               pci_addr;
  1693.     int                     have_rrbs;
  1694.     int                     min_rrbs;
  1695.     /* merge in forced flags */
  1696.     flags |= pcibr_soft->bs_dma_flags;
  1697.     xio_addr = xtalk_dmatrans_addr(xconn_vhdl, 0, paddr, req_size,
  1698.    flags & DMAMAP_FLAGS);
  1699.     if (!xio_addr) {
  1700. #if PCIBR_DMA_DEBUG
  1701. printk("pcibr_dmatrans_addr:n"
  1702. "tpciio connection point %vn"
  1703. "txtalk connection point %vn"
  1704. "twanted paddr [0x%x..0x%x]n"
  1705. "txtalk_dmatrans_addr returned 0x%xn",
  1706. pconn_vhdl, xconn_vhdl,
  1707. paddr, paddr + req_size - 1,
  1708. xio_addr);
  1709. #endif
  1710. return 0;
  1711.     }
  1712.     /*
  1713.      * find which XIO port this goes to.
  1714.      */
  1715.     if (XIO_PACKED(xio_addr)) {
  1716. if (xio_addr == XIO_NOWHERE) {
  1717. #if PCIBR_DMA_DEBUG
  1718.     printk("pcibr_dmatrans_addr:n"
  1719.     "tpciio connection point %vn"
  1720.     "txtalk connection point %vn"
  1721.     "twanted paddr [0x%x..0x%x]n"
  1722.     "txtalk_dmatrans_addr returned 0x%xn",
  1723.     pconn_vhdl, xconn_vhdl,
  1724.     paddr, paddr + req_size - 1,
  1725.     xio_addr);
  1726. #endif
  1727.     return 0;
  1728. }
  1729. xio_port = XIO_PORT(xio_addr);
  1730. xio_addr = XIO_ADDR(xio_addr);
  1731.     } else
  1732. xio_port = pcibr_soft->bs_mxid;
  1733.     /*
  1734.      * If this DMA comes back to us,
  1735.      * return the PCI MEM address on
  1736.      * which it would land, or NULL
  1737.      * if the target is something
  1738.      * on bridge other than PCI MEM.
  1739.      */
  1740.     if (xio_port == pcibr_soft->bs_xid) {
  1741. pci_addr = pcibr_addr_xio_to_pci(pcibr_soft, xio_addr, req_size);
  1742. return pci_addr;
  1743.     }
  1744.     /* If the caller can use A64, try to
  1745.      * satisfy the request with the 64-bit
  1746.      * direct map. This can fail if the
  1747.      * configuration bits in Device(x)
  1748.      * conflict with our flags.
  1749.      */
  1750.     if (flags & PCIIO_DMA_A64) {
  1751. pci_addr = slotp->bss_d64_base;
  1752. if (!(flags & PCIBR_VCHAN1))
  1753.     flags |= PCIBR_VCHAN0;
  1754. if ((pci_addr != PCIBR_D64_BASE_UNSET) &&
  1755.     (flags == slotp->bss_d64_flags)) {
  1756.     pci_addr |= xio_addr
  1757. | ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT);
  1758. #if DEBUG && PCIBR_DMA_DEBUG
  1759. #if HWG_PERF_CHECK
  1760.     if (xio_addr != 0x20000000)
  1761. #endif
  1762. printk("pcibr_dmatrans_addr: [reuse]n"
  1763. "tpciio connection point %vn"
  1764. "txtalk connection point %vn"
  1765. "twanted paddr [0x%x..0x%x]n"
  1766. "txtalk_dmatrans_addr returned 0x%xn"
  1767. "tdirect 64bit address is 0x%xn",
  1768. pconn_vhdl, xconn_vhdl,
  1769. paddr, paddr + req_size - 1,
  1770. xio_addr, pci_addr);
  1771. #endif
  1772.     return (pci_addr);
  1773. }
  1774. if (!pcibr_try_set_device(pcibr_soft, pciio_slot, flags, BRIDGE_DEV_D64_BITS)) {
  1775.     pci_addr = pcibr_flags_to_d64(flags, pcibr_soft);
  1776.     slotp->bss_d64_flags = flags;
  1777.     slotp->bss_d64_base = pci_addr;
  1778.     pci_addr |= xio_addr
  1779. | ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT);
  1780.     /* Make sure we have an RRB (or two).
  1781.      */
  1782.     if (!(pcibr_soft->bs_rrb_fixed & (1 << pciio_slot))) {
  1783. if (flags & PCIBR_VCHAN1)
  1784.     pciio_slot += PCIBR_RRB_SLOT_VIRTUAL;
  1785. have_rrbs = pcibr_soft->bs_rrb_valid[pciio_slot];
  1786. if (have_rrbs < 2) {
  1787.     if (pci_addr & PCI64_ATTR_PREF)
  1788. min_rrbs = 2;
  1789.     else
  1790. min_rrbs = 1;
  1791.     if (have_rrbs < min_rrbs)
  1792. do_pcibr_rrb_autoalloc(pcibr_soft, pciio_slot, min_rrbs - have_rrbs);
  1793. }
  1794.     }
  1795. #if PCIBR_DMA_DEBUG
  1796. #if HWG_PERF_CHECK
  1797.     if (xio_addr != 0x20000000)
  1798. #endif
  1799. printk("pcibr_dmatrans_addr:n"
  1800. "tpciio connection point %vn"
  1801. "txtalk connection point %vn"
  1802. "twanted paddr [0x%x..0x%x]n"
  1803. "txtalk_dmatrans_addr returned 0x%xn"
  1804. "tdirect 64bit address is 0x%xn"
  1805. "tnew flags: 0x%xn",
  1806. pconn_vhdl, xconn_vhdl,
  1807. paddr, paddr + req_size - 1,
  1808. xio_addr, pci_addr, (uint64_t) flags);
  1809. #endif
  1810.     return (pci_addr);
  1811. }
  1812. /* our flags conflict with Device(x).
  1813.  */
  1814. flags = flags
  1815.     & ~PCIIO_DMA_A64
  1816.     & ~PCIBR_VCHAN0
  1817.     ;
  1818. #if PCIBR_DMA_DEBUG
  1819. printk("pcibr_dmatrans_addr:n"
  1820. "tpciio connection point %vn"
  1821. "txtalk connection point %vn"
  1822. "twanted paddr [0x%x..0x%x]n"
  1823. "txtalk_dmatrans_addr returned 0x%xn"
  1824. "tUnable to set Device(x) bits for Direct-64n",
  1825. pconn_vhdl, xconn_vhdl,
  1826. paddr, paddr + req_size - 1,
  1827. xio_addr);
  1828. #endif
  1829.     }
  1830.     /* Try to satisfy the request with the 32-bit direct
  1831.      * map. This can fail if the configuration bits in
  1832.      * Device(x) conflict with our flags, or if the
  1833.      * target address is outside where DIR_OFF points.
  1834.      */
  1835.     {
  1836. size_t                  map_size = 1ULL << 31;
  1837. iopaddr_t               xio_base = pcibr_soft->bs_dir_xbase;
  1838. iopaddr_t               offset = xio_addr - xio_base;
  1839. iopaddr_t               endoff = req_size + offset;
  1840. if ((req_size > map_size) ||
  1841.     (xio_addr < xio_base) ||
  1842.     (xio_port != pcibr_soft->bs_dir_xport) ||
  1843.     (endoff > map_size)) {
  1844. #if PCIBR_DMA_DEBUG
  1845.     printk("pcibr_dmatrans_addr:n"
  1846.     "tpciio connection point %vn"
  1847.     "txtalk connection point %vn"
  1848.     "twanted paddr [0x%x..0x%x]n"
  1849.     "txtalk_dmatrans_addr returned 0x%xn"
  1850.     "txio region outside direct32 targetn",
  1851.     pconn_vhdl, xconn_vhdl,
  1852.     paddr, paddr + req_size - 1,
  1853.     xio_addr);
  1854. #endif
  1855. } else {
  1856.     pci_addr = slotp->bss_d32_base;
  1857.     if ((pci_addr != PCIBR_D32_BASE_UNSET) &&
  1858. (flags == slotp->bss_d32_flags)) {
  1859. pci_addr |= offset;
  1860. #if DEBUG && PCIBR_DMA_DEBUG
  1861. printk("pcibr_dmatrans_addr: [reuse]n"
  1862. "tpciio connection point %vn"
  1863. "txtalk connection point %vn"
  1864. "twanted paddr [0x%x..0x%x]n"
  1865. "txtalk_dmatrans_addr returned 0x%xn"
  1866. "tmapped via direct32 offset 0x%xn"
  1867. "twill DMA via pci addr 0x%xn",
  1868. pconn_vhdl, xconn_vhdl,
  1869. paddr, paddr + req_size - 1,
  1870. xio_addr, offset, pci_addr);
  1871. #endif
  1872. return (pci_addr);
  1873.     }
  1874.     if (!pcibr_try_set_device(pcibr_soft, pciio_slot, flags, BRIDGE_DEV_D32_BITS)) {
  1875. pci_addr = PCI32_DIRECT_BASE;
  1876. slotp->bss_d32_flags = flags;
  1877. slotp->bss_d32_base = pci_addr;
  1878. pci_addr |= offset;
  1879. /* Make sure we have an RRB (or two).
  1880.  */
  1881. if (!(pcibr_soft->bs_rrb_fixed & (1 << pciio_slot))) {
  1882.     have_rrbs = pcibr_soft->bs_rrb_valid[pciio_slot];
  1883.     if (have_rrbs < 2) {
  1884. if (slotp->bss_device & BRIDGE_DEV_PREF)
  1885.     min_rrbs = 2;
  1886. else
  1887.     min_rrbs = 1;
  1888. if (have_rrbs < min_rrbs)
  1889.     do_pcibr_rrb_autoalloc(pcibr_soft, pciio_slot, min_rrbs - have_rrbs);
  1890.     }
  1891. }
  1892. #if PCIBR_DMA_DEBUG
  1893. #if HWG_PERF_CHECK
  1894. if (xio_addr != 0x20000000)
  1895. #endif
  1896.     printk("pcibr_dmatrans_addr:n"
  1897.     "tpciio connection point %vn"
  1898.     "txtalk connection point %vn"
  1899.     "twanted paddr [0x%x..0x%x]n"
  1900.     "txtalk_dmatrans_addr returned 0x%xn"
  1901.     "tmapped via direct32 offset 0x%xn"
  1902.     "twill DMA via pci addr 0x%xn"
  1903.     "tnew flags: 0x%xn",
  1904.     pconn_vhdl, xconn_vhdl,
  1905.     paddr, paddr + req_size - 1,
  1906.     xio_addr, offset, pci_addr, (uint64_t) flags);
  1907. #endif
  1908. return (pci_addr);
  1909.     }
  1910.     /* our flags conflict with Device(x).
  1911.      */
  1912. #if PCIBR_DMA_DEBUG
  1913.     printk("pcibr_dmatrans_addr:n"
  1914.     "tpciio connection point %vn"
  1915.     "txtalk connection point %vn"
  1916.     "twanted paddr [0x%x..0x%x]n"
  1917.     "txtalk_dmatrans_addr returned 0x%xn"
  1918.     "tUnable to set Device(x) bits for Direct-32n",
  1919.     pconn_vhdl, xconn_vhdl,
  1920.     paddr, paddr + req_size - 1,
  1921.     xio_addr);
  1922. #endif
  1923. }
  1924.     }
  1925. #if PCIBR_DMA_DEBUG
  1926.     printk("pcibr_dmatrans_addr:n"
  1927.     "tpciio connection point %vn"
  1928.     "txtalk connection point %vn"
  1929.     "twanted paddr [0x%x..0x%x]n"
  1930.     "txtalk_dmatrans_addr returned 0x%xn"
  1931.     "tno acceptable PCI address found or constructablen",
  1932.     pconn_vhdl, xconn_vhdl,
  1933.     paddr, paddr + req_size - 1,
  1934.     xio_addr);
  1935. #endif
  1936.     return 0;
  1937. }
  1938. /*ARGSUSED */
  1939. alenlist_t
  1940. pcibr_dmatrans_list(devfs_handle_t pconn_vhdl,
  1941.     device_desc_t dev_desc,
  1942.     alenlist_t palenlist,
  1943.     unsigned flags)
  1944. {
  1945.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  1946.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  1947.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  1948.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  1949.     pcibr_soft_slot_t       slotp = &pcibr_soft->bs_slot[pciio_slot];
  1950.     xwidgetnum_t            xio_port;
  1951.     alenlist_t              pciio_alenlist = 0;
  1952.     alenlist_t              xtalk_alenlist = 0;
  1953.     int                     inplace;
  1954.     unsigned                direct64;
  1955.     unsigned                al_flags;
  1956.     iopaddr_t               xio_base;
  1957.     alenaddr_t              xio_addr;
  1958.     size_t                  xio_size;
  1959.     size_t                  map_size;
  1960.     iopaddr_t               pci_base;
  1961.     alenaddr_t              pci_addr;
  1962.     unsigned                relbits = 0;
  1963.     /* merge in forced flags */
  1964.     flags |= pcibr_soft->bs_dma_flags;
  1965.     inplace = flags & PCIIO_INPLACE;
  1966.     direct64 = flags & PCIIO_DMA_A64;
  1967.     al_flags = (flags & PCIIO_NOSLEEP) ? AL_NOSLEEP : 0;
  1968.     if (direct64) {
  1969. map_size = 1ull << 48;
  1970. xio_base = 0;
  1971. pci_base = slotp->bss_d64_base;
  1972. if ((pci_base != PCIBR_D64_BASE_UNSET) &&
  1973.     (flags == slotp->bss_d64_flags)) {
  1974.     /* reuse previous base info */
  1975. } else if (pcibr_try_set_device(pcibr_soft, pciio_slot, flags, BRIDGE_DEV_D64_BITS) < 0) {
  1976.     /* DMA configuration conflict */
  1977.     goto fail;
  1978. } else {
  1979.     relbits = BRIDGE_DEV_D64_BITS;
  1980.     pci_base =
  1981. pcibr_flags_to_d64(flags, pcibr_soft);
  1982. }
  1983.     } else {
  1984. xio_base = pcibr_soft->bs_dir_xbase;
  1985. map_size = 1ull << 31;
  1986. pci_base = slotp->bss_d32_base;
  1987. if ((pci_base != PCIBR_D32_BASE_UNSET) &&
  1988.     (flags == slotp->bss_d32_flags)) {
  1989.     /* reuse previous base info */
  1990. } else if (pcibr_try_set_device(pcibr_soft, pciio_slot, flags, BRIDGE_DEV_D32_BITS) < 0) {
  1991.     /* DMA configuration conflict */
  1992.     goto fail;
  1993. } else {
  1994.     relbits = BRIDGE_DEV_D32_BITS;
  1995.     pci_base = PCI32_DIRECT_BASE;
  1996. }
  1997.     }
  1998.     xtalk_alenlist = xtalk_dmatrans_list(xconn_vhdl, 0, palenlist,
  1999.  flags & DMAMAP_FLAGS);
  2000.     if (!xtalk_alenlist)
  2001. goto fail;
  2002.     alenlist_cursor_init(xtalk_alenlist, 0, NULL);
  2003.     if (inplace) {
  2004. pciio_alenlist = xtalk_alenlist;
  2005.     } else {
  2006. pciio_alenlist = alenlist_create(al_flags);
  2007. if (!pciio_alenlist)
  2008.     goto fail;
  2009.     }
  2010.     while (ALENLIST_SUCCESS ==
  2011.    alenlist_get(xtalk_alenlist, NULL, 0,
  2012. &xio_addr, &xio_size, al_flags)) {
  2013. /*
  2014.  * find which XIO port this goes to.
  2015.  */
  2016. if (XIO_PACKED(xio_addr)) {
  2017.     if (xio_addr == XIO_NOWHERE) {
  2018. #if PCIBR_DMA_DEBUG
  2019. printk("pcibr_dmatrans_addr:n"
  2020. "tpciio connection point %vn"
  2021. "txtalk connection point %vn"
  2022. "twanted paddr [0x%x..0x%x]n"
  2023. "txtalk_dmatrans_addr returned 0x%xn",
  2024. pconn_vhdl, xconn_vhdl,
  2025. paddr, paddr + req_size - 1,
  2026. xio_addr);
  2027. #endif
  2028. return 0;
  2029.     }
  2030.     xio_port = XIO_PORT(xio_addr);
  2031.     xio_addr = XIO_ADDR(xio_addr);
  2032. } else
  2033.     xio_port = pcibr_soft->bs_mxid;
  2034. /*
  2035.  * If this DMA comes back to us,
  2036.  * return the PCI MEM address on
  2037.  * which it would land, or NULL
  2038.  * if the target is something
  2039.  * on bridge other than PCI MEM.
  2040.  */
  2041. if (xio_port == pcibr_soft->bs_xid) {
  2042.     pci_addr = pcibr_addr_xio_to_pci(pcibr_soft, xio_addr, xio_size);
  2043.     if ( (pci_addr == (alenaddr_t)NULL) )
  2044. goto fail;
  2045. } else if (direct64) {
  2046.     ASSERT(xio_port != 0);
  2047.     pci_addr = pci_base | xio_addr
  2048. | ((uint64_t) xio_port << PCI64_ATTR_TARG_SHFT);
  2049. } else {
  2050.     iopaddr_t               offset = xio_addr - xio_base;
  2051.     iopaddr_t               endoff = xio_size + offset;
  2052.     if ((xio_size > map_size) ||
  2053. (xio_addr < xio_base) ||
  2054. (xio_port != pcibr_soft->bs_dir_xport) ||
  2055. (endoff > map_size))
  2056. goto fail;
  2057.     pci_addr = pci_base + (xio_addr - xio_base);
  2058. }
  2059. /* write the PCI DMA address
  2060.  * out to the scatter-gather list.
  2061.  */
  2062. if (inplace) {
  2063.     if (ALENLIST_SUCCESS !=
  2064. alenlist_replace(pciio_alenlist, NULL,
  2065.  &pci_addr, &xio_size, al_flags))
  2066. goto fail;
  2067. } else {
  2068.     if (ALENLIST_SUCCESS !=
  2069. alenlist_append(pciio_alenlist,
  2070. pci_addr, xio_size, al_flags))
  2071. goto fail;
  2072. }
  2073.     }
  2074.     if (relbits) {
  2075. if (direct64) {
  2076.     slotp->bss_d64_flags = flags;
  2077.     slotp->bss_d64_base = pci_base;
  2078. } else {
  2079.     slotp->bss_d32_flags = flags;
  2080.     slotp->bss_d32_base = pci_base;
  2081. }
  2082.     }
  2083.     if (!inplace)
  2084. alenlist_done(xtalk_alenlist);
  2085.     /* Reset the internal cursor of the alenlist to be returned back
  2086.      * to the caller.
  2087.      */
  2088.     alenlist_cursor_init(pciio_alenlist, 0, NULL);
  2089.     return pciio_alenlist;
  2090.   fail:
  2091.     if (relbits)
  2092. pcibr_release_device(pcibr_soft, pciio_slot, relbits);
  2093.     if (pciio_alenlist && !inplace)
  2094. alenlist_destroy(pciio_alenlist);
  2095.     return 0;
  2096. }
  2097. void
  2098. pcibr_dmamap_drain(pcibr_dmamap_t map)
  2099. {
  2100.     xtalk_dmamap_drain(map->bd_xtalk);
  2101. }
  2102. void
  2103. pcibr_dmaaddr_drain(devfs_handle_t pconn_vhdl,
  2104.     paddr_t paddr,
  2105.     size_t bytes)
  2106. {
  2107.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  2108.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  2109.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  2110.     xtalk_dmaaddr_drain(xconn_vhdl, paddr, bytes);
  2111. }
  2112. void
  2113. pcibr_dmalist_drain(devfs_handle_t pconn_vhdl,
  2114.     alenlist_t list)
  2115. {
  2116.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  2117.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  2118.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  2119.     xtalk_dmalist_drain(xconn_vhdl, list);
  2120. }
  2121. /*
  2122.  * Get the starting PCIbus address out of the given DMA map.
  2123.  * This function is supposed to be used by a close friend of PCI bridge
  2124.  * since it relies on the fact that the starting address of the map is fixed at
  2125.  * the allocation time in the current implementation of PCI bridge.
  2126.  */
  2127. iopaddr_t
  2128. pcibr_dmamap_pciaddr_get(pcibr_dmamap_t pcibr_dmamap)
  2129. {
  2130.     return (pcibr_dmamap->bd_pci_addr);
  2131. }
  2132. /*
  2133.  * There are end cases where a deadlock can occur if interrupt 
  2134.  * processing completes and the Bridge b_int_status bit is still set.
  2135.  *
  2136.  * One scenerio is if a second PCI interrupt occurs within 60ns of
  2137.  * the previous interrupt being cleared. In this case the Bridge
  2138.  * does not detect the transition, the Bridge b_int_status bit
  2139.  * remains set, and because no transition was detected no interrupt
  2140.  * packet is sent to the Hub/Heart.
  2141.  *
  2142.  * A second scenerio is possible when a b_int_status bit is being
  2143.  * shared by multiple devices:
  2144.  * Device #1 generates interrupt
  2145.  * Bridge b_int_status bit set
  2146.  * Device #2 generates interrupt
  2147.  * interrupt processing begins
  2148.  *   ISR for device #1 runs and
  2149.  * clears interrupt
  2150.  * Device #1 generates interrupt
  2151.  *   ISR for device #2 runs and
  2152.  * clears interrupt
  2153.  * (b_int_status bit still set)
  2154.  * interrupt processing completes
  2155.  *   
  2156.  * Interrupt processing is now complete, but an interrupt is still
  2157.  * outstanding for Device #1. But because there was no transition of
  2158.  * the b_int_status bit, no interrupt packet will be generated and
  2159.  * a deadlock will occur.
  2160.  *
  2161.  * To avoid these deadlock situations, this function is used
  2162.  * to check if a specific Bridge b_int_status bit is set, and if so,
  2163.  * cause the setting of the corresponding interrupt bit.
  2164.  *
  2165.  * On a XBridge (IP35), we do this by writing the appropriate Bridge Force 
  2166.  * Interrupt register.
  2167.  */
  2168. void
  2169. pcibr_force_interrupt(pcibr_intr_wrap_t wrap)
  2170. {
  2171. unsigned bit;
  2172. pcibr_soft_t    pcibr_soft = wrap->iw_soft;
  2173. bridge_t       *bridge = pcibr_soft->bs_base;
  2174. cpuid_t cpuvertex_to_cpuid(devfs_handle_t vhdl);
  2175. bit = wrap->iw_intr;
  2176. if (pcibr_soft->bs_xbridge) {
  2177.     bridge->b_force_pin[bit].intr = 1;
  2178. } else if ((1 << bit) & *wrap->iw_stat) {
  2179.     cpuid_t     cpu;
  2180.     unsigned        intr_bit;
  2181.     xtalk_intr_t    xtalk_intr =
  2182. pcibr_soft->bs_intr[bit].bsi_xtalk_intr;
  2183.     intr_bit = (short) xtalk_intr_vector_get(xtalk_intr);
  2184.     cpu = cpuvertex_to_cpuid(xtalk_intr_cpu_get(xtalk_intr));
  2185. #if defined(CONFIG_IA64_SGI_SN1)
  2186.     REMOTE_CPU_SEND_INTR(cpu, intr_bit);
  2187. #endif
  2188. }
  2189. }
  2190. /* =====================================================================
  2191.  *    INTERRUPT MANAGEMENT
  2192.  */
  2193. static unsigned
  2194. pcibr_intr_bits(pciio_info_t info,
  2195. pciio_intr_line_t lines)
  2196. {
  2197.     pciio_slot_t            slot = pciio_info_slot_get(info);
  2198.     unsigned     bbits = 0;
  2199.     /*
  2200.      * Currently favored mapping from PCI
  2201.      * slot number and INTA/B/C/D to Bridge
  2202.      * PCI Interrupt Bit Number:
  2203.      *
  2204.      *     SLOT     A B C D
  2205.      *      0       0 4 0 4
  2206.      *      1       1 5 1 5
  2207.      *      2       2 6 2 6
  2208.      *      3       3 7 3 7
  2209.      *      4       4 0 4 0
  2210.      *      5       5 1 5 1
  2211.      *      6       6 2 6 2
  2212.      *      7       7 3 7 3
  2213.      */
  2214.     if (slot < 8) {
  2215. if (lines & (PCIIO_INTR_LINE_A| PCIIO_INTR_LINE_C))
  2216.     bbits |= 1 << slot;
  2217. if (lines & (PCIIO_INTR_LINE_B| PCIIO_INTR_LINE_D))
  2218.     bbits |= 1 << (slot ^ 4);
  2219.     }
  2220.     return bbits;
  2221. }
  2222. /*ARGSUSED */
  2223. pcibr_intr_t
  2224. pcibr_intr_alloc(devfs_handle_t pconn_vhdl,
  2225.  device_desc_t dev_desc,
  2226.  pciio_intr_line_t lines,
  2227.  devfs_handle_t owner_dev)
  2228. {
  2229.     pcibr_info_t            pcibr_info = pcibr_info_get(pconn_vhdl);
  2230.     pciio_slot_t            pciio_slot = pcibr_info->f_slot;
  2231.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pcibr_info->f_mfast;
  2232.     devfs_handle_t            xconn_vhdl = pcibr_soft->bs_conn;
  2233.     bridge_t               *bridge = pcibr_soft->bs_base;
  2234.     int                     is_threaded = 0;
  2235.     int                     thread_swlevel;
  2236.     xtalk_intr_t           *xtalk_intr_p;
  2237.     pcibr_intr_t           *pcibr_intr_p;
  2238.     pcibr_intr_list_t      *intr_list_p;
  2239.     unsigned                pcibr_int_bits;
  2240.     unsigned                pcibr_int_bit;
  2241.     xtalk_intr_t            xtalk_intr = (xtalk_intr_t)0;
  2242.     hub_intr_t     hub_intr;
  2243.     pcibr_intr_t            pcibr_intr;
  2244.     pcibr_intr_list_t       intr_entry;
  2245.     pcibr_intr_list_t       intr_list;
  2246.     bridgereg_t             int_dev;
  2247. #if DEBUG && INTR_DEBUG
  2248.     printk("%v: pcibr_intr_allocn"
  2249.     "%v:%s%s%s%s%sn",
  2250.     owner_dev, pconn_vhdl,
  2251.     !(lines & 15) ? " No INTs?" : "",
  2252.     lines & 1 ? " INTA" : "",
  2253.     lines & 2 ? " INTB" : "",
  2254.     lines & 4 ? " INTC" : "",
  2255.     lines & 8 ? " INTD" : "");
  2256. #endif
  2257.     NEW(pcibr_intr);
  2258.     if (!pcibr_intr)
  2259. return NULL;
  2260.     if (dev_desc) {
  2261. cpuid_t intr_target_from_desc(device_desc_t, int);
  2262.     } else {
  2263. extern int default_intr_pri;
  2264. is_threaded = 1; /* PCI interrupts are threaded, by default */
  2265. thread_swlevel = default_intr_pri;
  2266.     }
  2267.     pcibr_intr->bi_dev = pconn_vhdl;
  2268.     pcibr_intr->bi_lines = lines;
  2269.     pcibr_intr->bi_soft = pcibr_soft;
  2270.     pcibr_intr->bi_ibits = 0; /* bits will be added below */
  2271.     pcibr_intr->bi_flags = is_threaded ? 0 : PCIIO_INTR_NOTHREAD;
  2272.     pcibr_intr->bi_mustruncpu = CPU_NONE;
  2273.     mutex_spinlock_init(&pcibr_intr->bi_ibuf.ib_lock);
  2274.     pcibr_int_bits = pcibr_soft->bs_intr_bits((pciio_info_t)pcibr_info, lines);
  2275.     /*
  2276.      * For each PCI interrupt line requested, figure
  2277.      * out which Bridge PCI Interrupt Line it maps
  2278.      * to, and make sure there are xtalk resources
  2279.      * allocated for it.
  2280.      */
  2281. #if DEBUG && INTR_DEBUG
  2282.     printk("pcibr_int_bits: 0x%Xn", pcibr_int_bits);
  2283. #endif 
  2284.     for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit ++) {
  2285. if (pcibr_int_bits & (1 << pcibr_int_bit)) {
  2286.     xtalk_intr_p = &pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr;
  2287.     xtalk_intr = *xtalk_intr_p;
  2288.     if (xtalk_intr == NULL) {
  2289. /*
  2290.  * This xtalk_intr_alloc is constrained for two reasons:
  2291.  * 1) Normal interrupts and error interrupts need to be delivered
  2292.  *    through a single xtalk target widget so that there aren't any
  2293.  *    ordering problems with DMA, completion interrupts, and error
  2294.  *    interrupts. (Use of xconn_vhdl forces this.)
  2295.  *
  2296.  * 2) On IP35, addressing constraints on IP35 and Bridge force
  2297.  *    us to use a single PI number for all interrupts from a
  2298.  *    single Bridge. (IP35-specific code forces this, and we
  2299.  *    verify in pcibr_setwidint.)
  2300.  */
  2301. /*
  2302.  * All code dealing with threaded PCI interrupt handlers
  2303.  * is located at the pcibr level. Because of this,
  2304.  * we always want the lower layers (hub/heart_intr_alloc, 
  2305.  * intr_level_connect) to treat us as non-threaded so we
  2306.  * don't set up a duplicate threaded environment. We make
  2307.  * this happen by calling a special xtalk interface.
  2308.  */
  2309. xtalk_intr = xtalk_intr_alloc_nothd(xconn_vhdl, dev_desc, 
  2310. owner_dev);
  2311. #if DEBUG && INTR_DEBUG
  2312. printk("%v: xtalk_intr=0x%Xn", xconn_vhdl, xtalk_intr);
  2313. #endif
  2314. /* both an assert and a runtime check on this:
  2315.  * we need to check in non-DEBUG kernels, and
  2316.  * the ASSERT gets us more information when
  2317.  * we use DEBUG kernels.
  2318.  */
  2319. ASSERT(xtalk_intr != NULL);
  2320. if (xtalk_intr == NULL) {
  2321.     /* it is quite possible that our
  2322.      * xtalk_intr_alloc failed because
  2323.      * someone else got there first,
  2324.      * and we can find their results
  2325.      * in xtalk_intr_p.
  2326.      */
  2327.     if (!*xtalk_intr_p) {
  2328. #ifdef SUPPORT_PRINTING_V_FORMAT
  2329. printk(KERN_ALERT  
  2330. "pcibr_intr_alloc %v: unable to get xtalk interrupt resources",
  2331. xconn_vhdl);
  2332. #else
  2333. printk(KERN_ALERT  
  2334. "pcibr_intr_alloc 0x%p: unable to get xtalk interrupt resources",
  2335. (void *)xconn_vhdl);
  2336. #endif
  2337. /* yes, we leak resources here. */
  2338. return 0;
  2339.     }
  2340. } else if (compare_and_swap_ptr((void **) xtalk_intr_p, NULL, xtalk_intr)) {
  2341.     /*
  2342.      * now tell the bridge which slot is
  2343.      * using this interrupt line.
  2344.      */
  2345.     int_dev = bridge->b_int_device;
  2346.     int_dev &= ~BRIDGE_INT_DEV_MASK(pcibr_int_bit);
  2347.     int_dev |= pciio_slot << BRIDGE_INT_DEV_SHFT(pcibr_int_bit);
  2348.     bridge->b_int_device = int_dev; /* XXXMP */
  2349. #if DEBUG && INTR_DEBUG
  2350.     printk("%v: bridge intr bit %d clears my wrbn",
  2351.     pconn_vhdl, pcibr_int_bit);
  2352. #endif
  2353. } else {
  2354.     /* someone else got one allocated first;
  2355.      * free the one we just created, and
  2356.      * retrieve the one they allocated.
  2357.      */
  2358.     xtalk_intr_free(xtalk_intr);
  2359.     xtalk_intr = *xtalk_intr_p;
  2360. #if PARANOID
  2361.     /* once xtalk_intr is set, we never clear it,
  2362.      * so if the CAS fails above, this condition
  2363.      * can "never happen" ...
  2364.      */
  2365.     if (!xtalk_intr) {
  2366. printk(KERN_ALERT  
  2367. "pcibr_intr_alloc %v: unable to set xtalk interrupt resources",
  2368. xconn_vhdl);
  2369. /* yes, we leak resources here. */
  2370. return 0;
  2371.     }
  2372. #endif
  2373. }
  2374.     }
  2375.     pcibr_intr->bi_ibits |= 1 << pcibr_int_bit;
  2376.     NEW(intr_entry);
  2377.     intr_entry->il_next = NULL;
  2378.     intr_entry->il_intr = pcibr_intr;
  2379.     intr_entry->il_wrbf = &(bridge->b_wr_req_buf[pciio_slot].reg);
  2380.     intr_list_p = 
  2381. &pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_list;
  2382. #if DEBUG && INTR_DEBUG
  2383. #if defined(SUPPORT_PRINTING_V_FORMAT)
  2384.     printk("0x%x: Bridge bit %d wrap=0x%xn",
  2385. pconn_vhdl, pcibr_int_bit,
  2386. pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap);
  2387. #else
  2388.     printk("%v: Bridge bit %d wrap=0x%xn",
  2389. pconn_vhdl, pcibr_int_bit,
  2390. pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap);
  2391. #endif
  2392. #endif
  2393.     if (compare_and_swap_ptr((void **) intr_list_p, NULL, intr_entry)) {
  2394. /* we are the first interrupt on this bridge bit.
  2395.  */
  2396. #if DEBUG && INTR_DEBUG
  2397. printk("%v INT 0x%x (bridge bit %d) allocated [FIRST]n",
  2398. pconn_vhdl, pcibr_int_bits, pcibr_int_bit);
  2399. #endif
  2400. continue;
  2401.     }
  2402.     intr_list = *intr_list_p;
  2403.     pcibr_intr_p = &intr_list->il_intr;
  2404.     if (compare_and_swap_ptr((void **) pcibr_intr_p, NULL, pcibr_intr)) {
  2405. /* first entry on list was erased,
  2406.  * and we replaced it, so we
  2407.  * don't need our intr_entry.
  2408.  */
  2409. DEL(intr_entry);
  2410. #if DEBUG && INTR_DEBUG
  2411. printk("%v INT 0x%x (bridge bit %d) replaces erased firstn",
  2412. pconn_vhdl, pcibr_int_bits, pcibr_int_bit);
  2413. #endif
  2414. continue;
  2415.     }
  2416.     intr_list_p = &intr_list->il_next;
  2417.     if (compare_and_swap_ptr((void **) intr_list_p, NULL, intr_entry)) {
  2418. /* we are the new second interrupt on this bit.
  2419.  */
  2420. pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared = 1;
  2421. #if DEBUG && INTR_DEBUG
  2422. printk("%v INT 0x%x (bridge bit %d) is new SECONDn",
  2423. pconn_vhdl, pcibr_int_bits, pcibr_int_bit);
  2424. #endif
  2425. continue;
  2426.     }
  2427.     while (1) {
  2428. pcibr_intr_p = &intr_list->il_intr;
  2429. if (compare_and_swap_ptr((void **) pcibr_intr_p, NULL, pcibr_intr)) {
  2430.     /* an entry on list was erased,
  2431.      * and we replaced it, so we
  2432.      * don't need our intr_entry.
  2433.      */
  2434.     DEL(intr_entry);
  2435. #if DEBUG && INTR_DEBUG
  2436.     printk("%v INT 0x%x (bridge bit %d) replaces erased Nthn",
  2437.     pconn_vhdl, pcibr_int_bits, pcibr_int_bit);
  2438. #endif
  2439.     break;
  2440. }
  2441. intr_list_p = &intr_list->il_next;
  2442. if (compare_and_swap_ptr((void **) intr_list_p, NULL, intr_entry)) {
  2443.     /* entry appended to share list
  2444.      */
  2445. #if DEBUG && INTR_DEBUG
  2446.     printk("%v INT 0x%x (bridge bit %d) is new Nthn",
  2447.     pconn_vhdl, pcibr_int_bits, pcibr_int_bit);
  2448. #endif
  2449.     break;
  2450. }
  2451. /* step to next record in chain
  2452.  */
  2453. intr_list = *intr_list_p;
  2454.     }
  2455. }
  2456.     }
  2457. #if DEBUG && INTR_DEBUG
  2458.     printk("%v pcibr_intr_alloc completen", pconn_vhdl);
  2459. #endif
  2460.     hub_intr = (hub_intr_t)xtalk_intr;
  2461.     pcibr_intr->bi_irq = hub_intr->i_bit;
  2462.     pcibr_intr->bi_cpu = hub_intr->i_cpuid;
  2463.     return pcibr_intr;
  2464. }
  2465. /*ARGSUSED */
  2466. void
  2467. pcibr_intr_free(pcibr_intr_t pcibr_intr)
  2468. {
  2469.     unsigned                pcibr_int_bits = pcibr_intr->bi_ibits;
  2470.     pcibr_soft_t            pcibr_soft = pcibr_intr->bi_soft;
  2471.     unsigned                pcibr_int_bit;
  2472.     pcibr_intr_list_t       intr_list;
  2473.     int     intr_shared;
  2474.     xtalk_intr_t     *xtalk_intrp;
  2475.     for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit++) {
  2476. if (pcibr_int_bits & (1 << pcibr_int_bit)) {
  2477.     for (intr_list = 
  2478.      pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_list;
  2479.  intr_list != NULL;
  2480.  intr_list = intr_list->il_next)
  2481. if (compare_and_swap_ptr((void **) &intr_list->il_intr, 
  2482.  pcibr_intr, 
  2483.  NULL)) {
  2484. #if DEBUG && INTR_DEBUG
  2485.     printk("%s: cleared a handler from bit %dn",
  2486.     pcibr_soft->bs_name, pcibr_int_bit);
  2487. #endif
  2488. }
  2489.     /* If this interrupt line is not being shared between multiple
  2490.      * devices release the xtalk interrupt resources.
  2491.      */
  2492.     intr_shared = 
  2493. pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared;
  2494.     xtalk_intrp = &pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr;
  2495.     if ((!intr_shared) && (*xtalk_intrp)) {
  2496. bridge_t  *bridge = pcibr_soft->bs_base;
  2497. bridgereg_t int_dev;
  2498. xtalk_intr_free(*xtalk_intrp);
  2499. *xtalk_intrp = 0;
  2500. /* Clear the PCI device interrupt to bridge interrupt pin
  2501.  * mapping.
  2502.  */
  2503. int_dev = bridge->b_int_device;
  2504. int_dev &= ~BRIDGE_INT_DEV_MASK(pcibr_int_bit);
  2505. bridge->b_int_device = int_dev;
  2506.     }
  2507. }
  2508.     }
  2509.     DEL(pcibr_intr);
  2510. }
  2511. LOCAL void
  2512. pcibr_setpciint(xtalk_intr_t xtalk_intr)
  2513. {
  2514.     iopaddr_t               addr = xtalk_intr_addr_get(xtalk_intr);
  2515.     xtalk_intr_vector_t     vect = xtalk_intr_vector_get(xtalk_intr);
  2516.     bridgereg_t            *int_addr = (bridgereg_t *)
  2517.     xtalk_intr_sfarg_get(xtalk_intr);
  2518. #ifdef CONFIG_IA64_SGI_SN2
  2519.     *int_addr = ((BRIDGE_INT_ADDR_HOST & (addr >> 26)) |
  2520.  (BRIDGE_INT_ADDR_FLD & vect));
  2521. #elif CONFIG_IA64_SGI_SN1
  2522.     *int_addr = ((BRIDGE_INT_ADDR_HOST & (addr >> 30)) |
  2523.  (BRIDGE_INT_ADDR_FLD & vect));
  2524. #endif
  2525. }
  2526. /*ARGSUSED */
  2527. int
  2528. pcibr_intr_connect(pcibr_intr_t pcibr_intr)
  2529. {
  2530.     pcibr_soft_t            pcibr_soft = pcibr_intr->bi_soft;
  2531.     bridge_t               *bridge = pcibr_soft->bs_base;
  2532.     unsigned                pcibr_int_bits = pcibr_intr->bi_ibits;
  2533.     unsigned                pcibr_int_bit;
  2534.     bridgereg_t             b_int_enable;
  2535.     unsigned long           s;
  2536.     if (pcibr_intr == NULL)
  2537. return -1;
  2538. #if DEBUG && INTR_DEBUG
  2539.     printk("%v: pcibr_intr_connectn",
  2540.     pcibr_intr->bi_dev);
  2541. #endif
  2542.     *((volatile unsigned *)&pcibr_intr->bi_flags) |= PCIIO_INTR_CONNECTED;
  2543.     /*
  2544.      * For each PCI interrupt line requested, figure
  2545.      * out which Bridge PCI Interrupt Line it maps
  2546.      * to, and make sure there are xtalk resources
  2547.      * allocated for it.
  2548.      */
  2549.     for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit++)
  2550. if (pcibr_int_bits & (1 << pcibr_int_bit)) {
  2551.     xtalk_intr_t            xtalk_intr;
  2552.     xtalk_intr = pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr;
  2553.     /*
  2554.      * If this interrupt line is being shared and the connect has
  2555.      * already been done, no need to do it again.
  2556.      */
  2557.     if (pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_connected)
  2558. continue;
  2559.     /*
  2560.      * Use the pcibr wrapper function to handle all Bridge interrupts
  2561.      * regardless of whether the interrupt line is shared or not.
  2562.      */
  2563.     xtalk_intr_connect(xtalk_intr, (xtalk_intr_setfunc_t) pcibr_setpciint,
  2564.        (void *)&(bridge->b_int_addr[pcibr_int_bit].addr));
  2565.     pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_connected = 1;
  2566. #if DEBUG && INTR_DEBUG
  2567.     printk("%v bridge bit %d wrapper connectedn",
  2568.     pcibr_intr->bi_dev, pcibr_int_bit);
  2569. #endif
  2570. }
  2571.     s = pcibr_lock(pcibr_soft);
  2572.     b_int_enable = bridge->b_int_enable;
  2573.     b_int_enable |= pcibr_int_bits;
  2574.     bridge->b_int_enable = b_int_enable;
  2575.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  2576.     pcibr_unlock(pcibr_soft, s);
  2577.     return 0;
  2578. }
  2579. /*ARGSUSED */
  2580. void
  2581. pcibr_intr_disconnect(pcibr_intr_t pcibr_intr)
  2582. {
  2583.     pcibr_soft_t            pcibr_soft = pcibr_intr->bi_soft;
  2584.     bridge_t               *bridge = pcibr_soft->bs_base;
  2585.     unsigned                pcibr_int_bits = pcibr_intr->bi_ibits;
  2586.     unsigned                pcibr_int_bit;
  2587.     bridgereg_t             b_int_enable;
  2588.     unsigned long           s;
  2589.     /* Stop calling the function. Now.
  2590.      */
  2591.     *((volatile unsigned *)&pcibr_intr->bi_flags) &= ~PCIIO_INTR_CONNECTED;
  2592.     /*
  2593.      * For each PCI interrupt line requested, figure
  2594.      * out which Bridge PCI Interrupt Line it maps
  2595.      * to, and disconnect the interrupt.
  2596.      */
  2597.     /* don't disable interrupts for lines that
  2598.      * are shared between devices.
  2599.      */
  2600.     for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit++)
  2601. if ((pcibr_int_bits & (1 << pcibr_int_bit)) &&
  2602.     (pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared))
  2603.     pcibr_int_bits &= ~(1 << pcibr_int_bit);
  2604.     if (!pcibr_int_bits)
  2605. return;
  2606.     s = pcibr_lock(pcibr_soft);
  2607.     b_int_enable = bridge->b_int_enable;
  2608.     b_int_enable &= ~pcibr_int_bits;
  2609.     bridge->b_int_enable = b_int_enable;
  2610.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  2611.     pcibr_unlock(pcibr_soft, s);
  2612.     for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit++)
  2613. if (pcibr_int_bits & (1 << pcibr_int_bit)) {
  2614.     /* if the interrupt line is now shared,
  2615.      * do not disconnect it.
  2616.      */
  2617.     if (pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared)
  2618. continue;
  2619.     xtalk_intr_disconnect(pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr);
  2620.     pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_connected = 0;
  2621. #if DEBUG && INTR_DEBUG
  2622.     printk("%s: xtalk disconnect done for Bridge bit %dn",
  2623. pcibr_soft->bs_name, pcibr_int_bit);
  2624. #endif
  2625.     /* if we are sharing the interrupt line,
  2626.      * connect us up; this closes the hole
  2627.      * where the another pcibr_intr_alloc()
  2628.      * was in progress as we disconnected.
  2629.      */
  2630.     if (!pcibr_soft->bs_intr[pcibr_int_bit].bsi_pcibr_intr_wrap.iw_shared)
  2631. continue;
  2632.     xtalk_intr_connect(pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr,
  2633.        (xtalk_intr_setfunc_t)pcibr_setpciint,
  2634.        (void *) &(bridge->b_int_addr[pcibr_int_bit].addr));
  2635. }
  2636. }
  2637. /*ARGSUSED */
  2638. devfs_handle_t
  2639. pcibr_intr_cpu_get(pcibr_intr_t pcibr_intr)
  2640. {
  2641.     pcibr_soft_t            pcibr_soft = pcibr_intr->bi_soft;
  2642.     unsigned                pcibr_int_bits = pcibr_intr->bi_ibits;
  2643.     unsigned                pcibr_int_bit;
  2644.     for (pcibr_int_bit = 0; pcibr_int_bit < 8; pcibr_int_bit++)
  2645. if (pcibr_int_bits & (1 << pcibr_int_bit))
  2646.     return xtalk_intr_cpu_get(pcibr_soft->bs_intr[pcibr_int_bit].bsi_xtalk_intr);
  2647.     return 0;
  2648. }
  2649. /* =====================================================================
  2650.  *    INTERRUPT HANDLING
  2651.  */
  2652. LOCAL void
  2653. pcibr_clearwidint(bridge_t *bridge)
  2654. {
  2655.     bridge->b_wid_int_upper = 0;
  2656.     bridge->b_wid_int_lower = 0;
  2657. }
  2658. LOCAL void
  2659. pcibr_setwidint(xtalk_intr_t intr)
  2660. {
  2661.     xwidgetnum_t            targ = xtalk_intr_target_get(intr);
  2662.     iopaddr_t               addr = xtalk_intr_addr_get(intr);
  2663.     xtalk_intr_vector_t     vect = xtalk_intr_vector_get(intr);
  2664.     widgetreg_t     NEW_b_wid_int_upper, NEW_b_wid_int_lower;
  2665.     widgetreg_t     OLD_b_wid_int_upper, OLD_b_wid_int_lower;
  2666.     bridge_t               *bridge = (bridge_t *)xtalk_intr_sfarg_get(intr);
  2667.     NEW_b_wid_int_upper = ( (0x000F0000 & (targ << 16)) |
  2668.        XTALK_ADDR_TO_UPPER(addr));
  2669.     NEW_b_wid_int_lower = XTALK_ADDR_TO_LOWER(addr);
  2670.     OLD_b_wid_int_upper = bridge->b_wid_int_upper;
  2671.     OLD_b_wid_int_lower = bridge->b_wid_int_lower;
  2672.     /* Verify that all interrupts from this Bridge are using a single PI */
  2673.     if ((OLD_b_wid_int_upper != 0) && (OLD_b_wid_int_lower != 0)) {
  2674. /*
  2675.  * Once set, these registers shouldn't change; they should
  2676.  * be set multiple times with the same values.
  2677.  *
  2678.  * If we're attempting to change these registers, it means
  2679.  * that our heuristics for allocating interrupts in a way
  2680.  * appropriate for IP35 have failed, and the admin needs to
  2681.  * explicitly direct some interrupts (or we need to make the
  2682.  * heuristics more clever).
  2683.  *
  2684.  * In practice, we hope this doesn't happen very often, if
  2685.  * at all.
  2686.  */
  2687. if ((OLD_b_wid_int_upper != NEW_b_wid_int_upper) ||
  2688.     (OLD_b_wid_int_lower != NEW_b_wid_int_lower)) {
  2689. printk(KERN_WARNING  "Interrupt allocation is too complex.n");
  2690. printk(KERN_WARNING  "Use explicit administrative interrupt targetting.n");
  2691. printk(KERN_WARNING  "bridge=0x%lx targ=0x%xn", (unsigned long)bridge, targ);
  2692. printk(KERN_WARNING  "NEW=0x%x/0x%x  OLD=0x%x/0x%xn",
  2693. NEW_b_wid_int_upper, NEW_b_wid_int_lower,
  2694. OLD_b_wid_int_upper, OLD_b_wid_int_lower);
  2695. PRINT_PANIC("PCI Bridge interrupt targetting errorn");
  2696. }
  2697.     }
  2698.     bridge->b_wid_int_upper = NEW_b_wid_int_upper;
  2699.     bridge->b_wid_int_lower = NEW_b_wid_int_lower;
  2700.     bridge->b_int_host_err = vect;
  2701. }
  2702. /*
  2703.  * pcibr_intr_preset: called during mlreset time
  2704.  * if the platform specific code needs to route
  2705.  * one of the Bridge's xtalk interrupts before the
  2706.  * xtalk infrastructure is available.
  2707.  */
  2708. void
  2709. pcibr_xintr_preset(void *which_widget,
  2710.    int which_widget_intr,
  2711.    xwidgetnum_t targ,
  2712.    iopaddr_t addr,
  2713.    xtalk_intr_vector_t vect)
  2714. {
  2715.     bridge_t               *bridge = (bridge_t *) which_widget;
  2716.     if (which_widget_intr == -1) {
  2717. /* bridge widget error interrupt */
  2718. bridge->b_wid_int_upper = ( (0x000F0000 & (targ << 16)) |
  2719.    XTALK_ADDR_TO_UPPER(addr));
  2720. bridge->b_wid_int_lower = XTALK_ADDR_TO_LOWER(addr);
  2721. bridge->b_int_host_err = vect;
  2722. /* turn on all interrupts except
  2723.  * the PCI interrupt requests,
  2724.  * at least at heart.
  2725.  */
  2726. bridge->b_int_enable |= ~BRIDGE_IMR_INT_MSK;
  2727.     } else {
  2728. /* routing a PCI device interrupt.
  2729.  * targ and low 38 bits of addr must
  2730.  * be the same as the already set
  2731.  * value for the widget error interrupt.
  2732.  */
  2733. bridge->b_int_addr[which_widget_intr].addr =
  2734.     ((BRIDGE_INT_ADDR_HOST & (addr >> 30)) |
  2735.      (BRIDGE_INT_ADDR_FLD & vect));
  2736. /*
  2737.  * now bridge can let it through;
  2738.  * NB: still should be blocked at
  2739.  * xtalk provider end, until the service
  2740.  * function is set.
  2741.  */
  2742. bridge->b_int_enable |= 1 << vect;
  2743.     }
  2744.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  2745. }
  2746. /*
  2747.  * pcibr_intr_func()
  2748.  *
  2749.  * This is the pcibr interrupt "wrapper" function that is called,
  2750.  * in interrupt context, to initiate the interrupt handler(s) registered
  2751.  * (via pcibr_intr_alloc/connect) for the occuring interrupt. Non-threaded 
  2752.  * handlers will be called directly, and threaded handlers will have their 
  2753.  * thread woken up.
  2754.  */
  2755. void
  2756. pcibr_intr_func(intr_arg_t arg)
  2757. {
  2758.     pcibr_intr_wrap_t       wrap = (pcibr_intr_wrap_t) arg;
  2759.     reg_p                   wrbf;
  2760.     pcibr_intr_t            intr;
  2761.     pcibr_intr_list_t       list;
  2762.     int                     clearit;
  2763.     int     do_nonthreaded = 1;
  2764.     int     is_threaded = 0;
  2765.     int     x = 0;
  2766. /*
  2767.  * If any handler is still running from a previous interrupt
  2768.  * just return. If there's a need to call the handler(s) again,
  2769.  * another interrupt will be generated either by the device or by
  2770.  * pcibr_force_interrupt().
  2771.  */
  2772. if (wrap->iw_hdlrcnt) {
  2773. return;
  2774. }
  2775.     /*
  2776.      * Call all interrupt handlers registered.
  2777.      * First, the pcibr_intrd threads for any threaded handlers will be
  2778.      * awoken, then any non-threaded handlers will be called sequentially.
  2779.      */
  2780. clearit = 1;
  2781. while (do_nonthreaded) {
  2782.     for (list = wrap->iw_list; list != NULL; list = list->il_next) {
  2783. if ((intr = list->il_intr) &&
  2784.     (intr->bi_flags & PCIIO_INTR_CONNECTED)) {
  2785. /*
  2786.  * This device may have initiated write
  2787.  * requests since the bridge last saw
  2788.  * an edge on this interrupt input; flushing
  2789.  * the buffer prior to invoking the handler
  2790.  * should help but may not be sufficient if we 
  2791.  * get more requests after the flush, followed
  2792.  * by the card deciding it wants service, before
  2793.  * the interrupt handler checks to see if things need
  2794.  * to be done.
  2795.  *
  2796.  * There is a similar race condition if
  2797.  * an interrupt handler loops around and
  2798.  * notices further service is required.
  2799.  * Perhaps we need to have an explicit
  2800.  * call that interrupt handlers need to
  2801.  * do between noticing that DMA to memory
  2802.  * has completed, but before observing the
  2803.  * contents of memory?
  2804.  */
  2805. if ((do_nonthreaded) && (!is_threaded)) {
  2806. /* Non-threaded. 
  2807.  * Call the interrupt handler at interrupt level
  2808.  */
  2809. /* Only need to flush write buffers if sharing */
  2810. if ((wrap->iw_shared) && (wrbf = list->il_wrbf)) {
  2811.     if ((x = *wrbf)) /* write request buffer flush */
  2812. #ifdef SUPPORT_PRINTING_V_FORMAT
  2813. printk(KERN_ALERT  "pcibr_intr_func %v: n"
  2814.     "write buffer flush failed, wrbf=0x%xn", 
  2815.     list->il_intr->bi_dev, wrbf);
  2816. #else
  2817. printk(KERN_ALERT  "pcibr_intr_func %p: n"
  2818.     "write buffer flush failed, wrbf=0x%lxn", 
  2819.     (void *)list->il_intr->bi_dev, (long) wrbf);
  2820. #endif
  2821. }
  2822.     }
  2823.     clearit = 0;
  2824. }
  2825.     }
  2826. do_nonthreaded = 0;
  2827. /*
  2828.  * If the non-threaded handler was the last to complete,
  2829.  * (i.e., no threaded handlers still running) force an
  2830.  * interrupt to avoid a potential deadlock situation.
  2831.  */
  2832. if (wrap->iw_hdlrcnt == 0) {
  2833. pcibr_force_interrupt(wrap);
  2834. }
  2835. }
  2836. /* If there were no handlers,
  2837.  * disable the interrupt and return.
  2838.  * It will get enabled again after
  2839.  * a handler is connected.
  2840.  * If we don't do this, we would
  2841.  * sit here and spin through the
  2842.  * list forever.
  2843.  */
  2844. if (clearit) {
  2845.     pcibr_soft_t            pcibr_soft = wrap->iw_soft;
  2846.     bridge_t               *bridge = pcibr_soft->bs_base;
  2847.     bridgereg_t             b_int_enable;
  2848.     bridgereg_t     mask = 1 << wrap->iw_intr;
  2849.     unsigned long           s;
  2850.     s = pcibr_lock(pcibr_soft);
  2851.     b_int_enable = bridge->b_int_enable;
  2852.     b_int_enable &= ~mask;
  2853.     bridge->b_int_enable = b_int_enable;
  2854.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  2855.     pcibr_unlock(pcibr_soft, s);
  2856.     return;
  2857. }
  2858. }
  2859. /* =====================================================================
  2860.  *    CONFIGURATION MANAGEMENT
  2861.  */
  2862. /*ARGSUSED */
  2863. void
  2864. pcibr_provider_startup(devfs_handle_t pcibr)
  2865. {
  2866. }
  2867. /*ARGSUSED */
  2868. void
  2869. pcibr_provider_shutdown(devfs_handle_t pcibr)
  2870. {
  2871. }
  2872. int
  2873. pcibr_reset(devfs_handle_t conn)
  2874. {
  2875.     pciio_info_t            pciio_info = pciio_info_get(conn);
  2876.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  2877.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  2878.     bridge_t               *bridge = pcibr_soft->bs_base;
  2879.     bridgereg_t             ctlreg;
  2880.     unsigned                cfgctl[8];
  2881.     unsigned long           s;
  2882.     int                     f, nf;
  2883.     pcibr_info_h            pcibr_infoh;
  2884.     pcibr_info_t            pcibr_info;
  2885.     int                     win;
  2886.     if (pcibr_soft->bs_slot[pciio_slot].has_host) {
  2887. pciio_slot = pcibr_soft->bs_slot[pciio_slot].host_slot;
  2888. pcibr_info = pcibr_soft->bs_slot[pciio_slot].bss_infos[0];
  2889.     }
  2890.     if (pciio_slot < 4) {
  2891. s = pcibr_lock(pcibr_soft);
  2892. nf = pcibr_soft->bs_slot[pciio_slot].bss_ninfo;
  2893. pcibr_infoh = pcibr_soft->bs_slot[pciio_slot].bss_infos;
  2894. for (f = 0; f < nf; ++f)
  2895.     if (pcibr_infoh[f])
  2896. cfgctl[f] = bridge->b_type0_cfg_dev[pciio_slot].f[f].l[PCI_CFG_COMMAND / 4];
  2897. ctlreg = bridge->b_wid_control;
  2898. bridge->b_wid_control = ctlreg | BRIDGE_CTRL_RST(pciio_slot);
  2899. /* XXX delay? */
  2900. bridge->b_wid_control = ctlreg;
  2901. /* XXX delay? */
  2902. for (f = 0; f < nf; ++f)
  2903.     if ((pcibr_info = pcibr_infoh[f]))
  2904. for (win = 0; win < 6; ++win)
  2905.     if (pcibr_info->f_window[win].w_base != 0)
  2906. bridge->b_type0_cfg_dev[pciio_slot].f[f].l[PCI_CFG_BASE_ADDR(win) / 4] =
  2907.     pcibr_info->f_window[win].w_base;
  2908. for (f = 0; f < nf; ++f)
  2909.     if (pcibr_infoh[f])
  2910. bridge->b_type0_cfg_dev[pciio_slot].f[f].l[PCI_CFG_COMMAND / 4] = cfgctl[f];
  2911. pcibr_unlock(pcibr_soft, s);
  2912. return 0;
  2913.     }
  2914. #ifdef SUPPORT_PRINTING_V_FORMAT
  2915.     printk(KERN_WARNING   "%v: pcibr_reset unimplemented for slot %dn",
  2916.     conn, pciio_slot);
  2917. #endif
  2918.     return -1;
  2919. }
  2920. pciio_endian_t
  2921. pcibr_endian_set(devfs_handle_t pconn_vhdl,
  2922.  pciio_endian_t device_end,
  2923.  pciio_endian_t desired_end)
  2924. {
  2925.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  2926.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  2927.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  2928.     bridgereg_t             devreg;
  2929.     unsigned long           s;
  2930.     /*
  2931.      * Bridge supports hardware swapping; so we can always
  2932.      * arrange for the caller's desired endianness.
  2933.      */
  2934.     s = pcibr_lock(pcibr_soft);
  2935.     devreg = pcibr_soft->bs_slot[pciio_slot].bss_device;
  2936.     if (device_end != desired_end)
  2937. devreg |= BRIDGE_DEV_SWAP_BITS;
  2938.     else
  2939. devreg &= ~BRIDGE_DEV_SWAP_BITS;
  2940.     /* NOTE- if we ever put SWAP bits
  2941.      * onto the disabled list, we will
  2942.      * have to change the logic here.
  2943.      */
  2944.     if (pcibr_soft->bs_slot[pciio_slot].bss_device != devreg) {
  2945. bridge_t               *bridge = pcibr_soft->bs_base;
  2946. bridge->b_device[pciio_slot].reg = devreg;
  2947. pcibr_soft->bs_slot[pciio_slot].bss_device = devreg;
  2948. bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  2949.     }
  2950.     pcibr_unlock(pcibr_soft, s);
  2951. #if DEBUG && PCIBR_DEV_DEBUG
  2952.     printk("pcibr Device(%d): 0x%pn", pciio_slot, bridge->b_device[pciio_slot].reg);
  2953. #endif
  2954.     return desired_end;
  2955. }
  2956. /* This (re)sets the GBR and REALTIME bits and also keeps track of how
  2957.  * many sets are outstanding. Reset succeeds only if the number of outstanding
  2958.  * sets == 1.
  2959.  */
  2960. int
  2961. pcibr_priority_bits_set(pcibr_soft_t pcibr_soft,
  2962. pciio_slot_t pciio_slot,
  2963. pciio_priority_t device_prio)
  2964. {
  2965.     unsigned long           s;
  2966.     int                    *counter;
  2967.     bridgereg_t             rtbits = 0;
  2968.     bridgereg_t             devreg;
  2969.     int                     rc = PRIO_SUCCESS;
  2970.     /* in dual-slot configurations, the host and the
  2971.      * guest have separate DMA resources, so they
  2972.      * have separate requirements for priority bits.
  2973.      */
  2974.     counter = &(pcibr_soft->bs_slot[pciio_slot].bss_pri_uctr);
  2975.     /*
  2976.      * Bridge supports PCI notions of LOW and HIGH priority
  2977.      * arbitration rings via a "REAL_TIME" bit in the per-device
  2978.      * Bridge register. The "GBR" bit controls access to the GBR
  2979.      * ring on the xbow. These two bits are (re)set together.
  2980.      *
  2981.      * XXX- Bug in Rev B Bridge Si:
  2982.      * Symptom: Prefetcher starts operating incorrectly. This happens
  2983.      * due to corruption of the address storage ram in the prefetcher
  2984.      * when a non-real time PCI request is pulled and a real-time one is
  2985.      * put in it's place. Workaround: Use only a single arbitration ring
  2986.      * on PCI bus. GBR and RR can still be uniquely used per
  2987.      * device. NETLIST MERGE DONE, WILL BE FIXED IN REV C.
  2988.      */
  2989.     if (pcibr_soft->bs_rev_num != BRIDGE_PART_REV_B)
  2990. rtbits |= BRIDGE_DEV_RT;
  2991.     /* NOTE- if we ever put DEV_RT or DEV_GBR on
  2992.      * the disabled list, we will have to take
  2993.      * it into account here.
  2994.      */
  2995.     s = pcibr_lock(pcibr_soft);
  2996.     devreg = pcibr_soft->bs_slot[pciio_slot].bss_device;
  2997.     if (device_prio == PCI_PRIO_HIGH) {
  2998. if ((++*counter == 1)) {
  2999.     if (rtbits)
  3000. devreg |= rtbits;
  3001.     else
  3002. rc = PRIO_FAIL;
  3003. }
  3004.     } else if (device_prio == PCI_PRIO_LOW) {
  3005. if (*counter <= 0)
  3006.     rc = PRIO_FAIL;
  3007. else if (--*counter == 0)
  3008.     if (rtbits)
  3009. devreg &= ~rtbits;
  3010.     }
  3011.     if (pcibr_soft->bs_slot[pciio_slot].bss_device != devreg) {
  3012. bridge_t               *bridge = pcibr_soft->bs_base;
  3013. bridge->b_device[pciio_slot].reg = devreg;
  3014. pcibr_soft->bs_slot[pciio_slot].bss_device = devreg;
  3015. bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  3016.     }
  3017.     pcibr_unlock(pcibr_soft, s);
  3018.     return rc;
  3019. }
  3020. pciio_priority_t
  3021. pcibr_priority_set(devfs_handle_t pconn_vhdl,
  3022.    pciio_priority_t device_prio)
  3023. {
  3024.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  3025.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  3026.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  3027.     (void) pcibr_priority_bits_set(pcibr_soft, pciio_slot, device_prio);
  3028.     return device_prio;
  3029. }
  3030. /*
  3031.  * Interfaces to allow special (e.g. SGI) drivers to set/clear
  3032.  * Bridge-specific device flags.  Many flags are modified through
  3033.  * PCI-generic interfaces; we don't allow them to be directly
  3034.  * manipulated here.  Only flags that at this point seem pretty
  3035.  * Bridge-specific can be set through these special interfaces.
  3036.  * We may add more flags as the need arises, or remove flags and
  3037.  * create PCI-generic interfaces as the need arises.
  3038.  *
  3039.  * Returns 0 on failure, 1 on success
  3040.  */
  3041. int
  3042. pcibr_device_flags_set(devfs_handle_t pconn_vhdl,
  3043.        pcibr_device_flags_t flags)
  3044. {
  3045.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  3046.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  3047.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  3048.     bridgereg_t             set = 0;
  3049.     bridgereg_t             clr = 0;
  3050.     ASSERT((flags & PCIBR_DEVICE_FLAGS) == flags);
  3051.     if (flags & PCIBR_WRITE_GATHER)
  3052. set |= BRIDGE_DEV_PMU_WRGA_EN;
  3053.     if (flags & PCIBR_NOWRITE_GATHER)
  3054. clr |= BRIDGE_DEV_PMU_WRGA_EN;
  3055.     if (flags & PCIBR_WRITE_GATHER)
  3056. set |= BRIDGE_DEV_DIR_WRGA_EN;
  3057.     if (flags & PCIBR_NOWRITE_GATHER)
  3058. clr |= BRIDGE_DEV_DIR_WRGA_EN;
  3059.     if (flags & PCIBR_PREFETCH)
  3060. set |= BRIDGE_DEV_PREF;
  3061.     if (flags & PCIBR_NOPREFETCH)
  3062. clr |= BRIDGE_DEV_PREF;
  3063.     if (flags & PCIBR_PRECISE)
  3064. set |= BRIDGE_DEV_PRECISE;
  3065.     if (flags & PCIBR_NOPRECISE)
  3066. clr |= BRIDGE_DEV_PRECISE;
  3067.     if (flags & PCIBR_BARRIER)
  3068. set |= BRIDGE_DEV_BARRIER;
  3069.     if (flags & PCIBR_NOBARRIER)
  3070. clr |= BRIDGE_DEV_BARRIER;
  3071.     if (flags & PCIBR_64BIT)
  3072. set |= BRIDGE_DEV_DEV_SIZE;
  3073.     if (flags & PCIBR_NO64BIT)
  3074. clr |= BRIDGE_DEV_DEV_SIZE;
  3075.     if (set || clr) {
  3076. bridgereg_t             devreg;
  3077. unsigned long           s;
  3078. s = pcibr_lock(pcibr_soft);
  3079. devreg = pcibr_soft->bs_slot[pciio_slot].bss_device;
  3080. devreg = (devreg & ~clr) | set;
  3081. if (pcibr_soft->bs_slot[pciio_slot].bss_device != devreg) {
  3082.     bridge_t               *bridge = pcibr_soft->bs_base;
  3083.     bridge->b_device[pciio_slot].reg = devreg;
  3084.     pcibr_soft->bs_slot[pciio_slot].bss_device = devreg;
  3085.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  3086. }
  3087. pcibr_unlock(pcibr_soft, s);
  3088. #if DEBUG && PCIBR_DEV_DEBUG
  3089. printk("pcibr Device(%d): %Rn", pciio_slot, bridge->b_device[pciio_slot].regbridge->b_device[pciio_slot].reg, device_bits);
  3090. #endif
  3091.     }
  3092.     return (1);
  3093. }
  3094. #ifdef LITTLE_ENDIAN
  3095. /*
  3096.  * on sn-ia we need to twiddle the the addresses going out
  3097.  * the pci bus because we use the unswizzled synergy space
  3098.  * (the alternative is to use the swizzled synergy space
  3099.  * and byte swap the data)
  3100.  */
  3101. #define CB(b,r) (((volatile uint8_t *) b)[((r)^4)])
  3102. #define CS(b,r) (((volatile uint16_t *) b)[((r^4)/2)])
  3103. #define CW(b,r) (((volatile uint32_t *) b)[((r^4)/4)])
  3104. #else
  3105. #define CB(b,r) (((volatile uint8_t *) cfgbase)[(r)^3])
  3106. #define CS(b,r) (((volatile uint16_t *) cfgbase)[((r)/2)^1])
  3107. #define CW(b,r) (((volatile uint32_t *) cfgbase)[(r)/4])
  3108. #endif /* LITTLE_ENDIAN */
  3109. LOCAL                   cfg_p
  3110. pcibr_config_addr(devfs_handle_t conn,
  3111.   unsigned reg)
  3112. {
  3113.     pcibr_info_t            pcibr_info;
  3114.     pciio_slot_t            pciio_slot;
  3115.     pciio_function_t        pciio_func;
  3116.     pcibr_soft_t            pcibr_soft;
  3117.     bridge_t               *bridge;
  3118.     cfg_p                   cfgbase = (cfg_p)0;
  3119.     pcibr_info = pcibr_info_get(conn);
  3120.     pciio_slot = pcibr_info->f_slot;
  3121.     if (pciio_slot == PCIIO_SLOT_NONE)
  3122. pciio_slot = PCI_TYPE1_SLOT(reg);
  3123.     pciio_func = pcibr_info->f_func;
  3124.     if (pciio_func == PCIIO_FUNC_NONE)
  3125. pciio_func = PCI_TYPE1_FUNC(reg);
  3126.     pcibr_soft = (pcibr_soft_t) pcibr_info->f_mfast;
  3127.     bridge = pcibr_soft->bs_base;
  3128.     cfgbase = bridge->b_type0_cfg_dev[pciio_slot].f[pciio_func].l;
  3129.     return cfgbase;
  3130. }
  3131. uint64_t
  3132. pcibr_config_get(devfs_handle_t conn,
  3133.  unsigned reg,
  3134.  unsigned size)
  3135. {
  3136.     return do_pcibr_config_get(pcibr_config_addr(conn, reg),
  3137.        PCI_TYPE1_REG(reg), size);
  3138. }
  3139. LOCAL uint64_t
  3140. do_pcibr_config_get(
  3141.        cfg_p cfgbase,
  3142.        unsigned reg,
  3143.        unsigned size)
  3144. {
  3145.     unsigned                value;
  3146.    
  3147.     value = CW(cfgbase, reg);
  3148.     if (reg & 3)
  3149. value >>= 8 * (reg & 3);
  3150.     if (size < 4)
  3151. value &= (1 << (8 * size)) - 1;
  3152.     return value;
  3153. }
  3154. void
  3155. pcibr_config_set(devfs_handle_t conn,
  3156.  unsigned reg,
  3157.  unsigned size,
  3158.  uint64_t value)
  3159. {
  3160.     do_pcibr_config_set(pcibr_config_addr(conn, reg),
  3161. PCI_TYPE1_REG(reg), size, value);
  3162. }
  3163. LOCAL void
  3164. do_pcibr_config_set(cfg_p cfgbase,
  3165.     unsigned reg,
  3166.     unsigned size,
  3167.     uint64_t value)
  3168. {
  3169.     switch (size) {
  3170.     case 1:
  3171. CB(cfgbase, reg) = value;
  3172. break;
  3173.     case 2:
  3174. if (reg & 1) {
  3175.     CB(cfgbase, reg) = value;
  3176.     CB(cfgbase, reg + 1) = value >> 8;
  3177. } else
  3178.     CS(cfgbase, reg) = value;
  3179. break;
  3180.     case 3:
  3181. if (reg & 1) {
  3182.     CB(cfgbase, reg) = value;
  3183.     CS(cfgbase, (reg + 1)) = value >> 8;
  3184. } else {
  3185.     CS(cfgbase, reg) = value;
  3186.     CB(cfgbase, reg + 2) = value >> 16;
  3187. }
  3188. break;
  3189.     case 4:
  3190. CW(cfgbase, reg) = value;
  3191. break;
  3192.     }
  3193. }
  3194. pciio_provider_t        pcibr_provider =
  3195. {
  3196.     (pciio_piomap_alloc_f *) pcibr_piomap_alloc,
  3197.     (pciio_piomap_free_f *) pcibr_piomap_free,
  3198.     (pciio_piomap_addr_f *) pcibr_piomap_addr,
  3199.     (pciio_piomap_done_f *) pcibr_piomap_done,
  3200.     (pciio_piotrans_addr_f *) pcibr_piotrans_addr,
  3201.     (pciio_piospace_alloc_f *) pcibr_piospace_alloc,
  3202.     (pciio_piospace_free_f *) pcibr_piospace_free,
  3203.     (pciio_dmamap_alloc_f *) pcibr_dmamap_alloc,
  3204.     (pciio_dmamap_free_f *) pcibr_dmamap_free,
  3205.     (pciio_dmamap_addr_f *) pcibr_dmamap_addr,
  3206.     (pciio_dmamap_list_f *) pcibr_dmamap_list,
  3207.     (pciio_dmamap_done_f *) pcibr_dmamap_done,
  3208.     (pciio_dmatrans_addr_f *) pcibr_dmatrans_addr,
  3209.     (pciio_dmatrans_list_f *) pcibr_dmatrans_list,
  3210.     (pciio_dmamap_drain_f *) pcibr_dmamap_drain,
  3211.     (pciio_dmaaddr_drain_f *) pcibr_dmaaddr_drain,
  3212.     (pciio_dmalist_drain_f *) pcibr_dmalist_drain,
  3213.     (pciio_intr_alloc_f *) pcibr_intr_alloc,
  3214.     (pciio_intr_free_f *) pcibr_intr_free,
  3215.     (pciio_intr_connect_f *) pcibr_intr_connect,
  3216.     (pciio_intr_disconnect_f *) pcibr_intr_disconnect,
  3217.     (pciio_intr_cpu_get_f *) pcibr_intr_cpu_get,
  3218.     (pciio_provider_startup_f *) pcibr_provider_startup,
  3219.     (pciio_provider_shutdown_f *) pcibr_provider_shutdown,
  3220.     (pciio_reset_f *) pcibr_reset,
  3221.     (pciio_write_gather_flush_f *) pcibr_write_gather_flush,
  3222.     (pciio_endian_set_f *) pcibr_endian_set,
  3223.     (pciio_priority_set_f *) pcibr_priority_set,
  3224.     (pciio_config_get_f *) pcibr_config_get,
  3225.     (pciio_config_set_f *) pcibr_config_set,
  3226.     (pciio_error_devenable_f *) 0,
  3227.     (pciio_error_extract_f *) 0,
  3228. #ifdef LATER
  3229.     (pciio_driver_reg_callback_f *) pcibr_driver_reg_callback,
  3230.     (pciio_driver_unreg_callback_f *) pcibr_driver_unreg_callback,
  3231. #else
  3232.     (pciio_driver_reg_callback_f *) 0,
  3233.     (pciio_driver_unreg_callback_f *) 0,
  3234. #endif
  3235.     (pciio_device_unregister_f  *) pcibr_device_unregister,
  3236.     (pciio_dma_enabled_f *) pcibr_dma_enabled,
  3237. };
  3238. LOCAL                   pcibr_hints_t
  3239. pcibr_hints_get(devfs_handle_t xconn_vhdl, int alloc)
  3240. {
  3241.     arbitrary_info_t        ainfo = 0;
  3242.     graph_error_t     rv;
  3243.     pcibr_hints_t           hint;
  3244.     rv = hwgraph_info_get_LBL(xconn_vhdl, INFO_LBL_PCIBR_HINTS, &ainfo);
  3245.     if (alloc && (rv != GRAPH_SUCCESS)) {
  3246. NEW(hint);
  3247. hint->rrb_alloc_funct = NULL;
  3248. hint->ph_intr_bits = NULL;
  3249. rv = hwgraph_info_add_LBL(xconn_vhdl, 
  3250.   INFO_LBL_PCIBR_HINTS, 
  3251.   (arbitrary_info_t) hint);
  3252. if (rv != GRAPH_SUCCESS)
  3253.     goto abnormal_exit;
  3254. rv = hwgraph_info_get_LBL(xconn_vhdl, INFO_LBL_PCIBR_HINTS, &ainfo);
  3255. if (rv != GRAPH_SUCCESS)
  3256.     goto abnormal_exit;
  3257. if (ainfo != (arbitrary_info_t) hint)
  3258.     goto abnormal_exit;
  3259.     }
  3260.     return (pcibr_hints_t) ainfo;
  3261. abnormal_exit:
  3262. #ifdef LATER
  3263.     printf("SHOULD NOT BE HEREn");
  3264. #endif
  3265.     DEL(hint);
  3266.     return(NULL);
  3267. }
  3268. void
  3269. pcibr_hints_fix_some_rrbs(devfs_handle_t xconn_vhdl, unsigned mask)
  3270. {
  3271.     pcibr_hints_t           hint = pcibr_hints_get(xconn_vhdl, 1);
  3272.     if (hint)
  3273. hint->ph_rrb_fixed = mask;
  3274. #if DEBUG
  3275.     else
  3276. printk("pcibr_hints_fix_rrbs: pcibr_hints_get failed atn"
  3277. "t%pn", xconn_vhdl);
  3278. #endif
  3279. }
  3280. void
  3281. pcibr_hints_fix_rrbs(devfs_handle_t xconn_vhdl)
  3282. {
  3283.     pcibr_hints_fix_some_rrbs(xconn_vhdl, 0xFF);
  3284. }
  3285. void
  3286. pcibr_hints_dualslot(devfs_handle_t xconn_vhdl,
  3287.      pciio_slot_t host,
  3288.      pciio_slot_t guest)
  3289. {
  3290.     pcibr_hints_t           hint = pcibr_hints_get(xconn_vhdl, 1);
  3291.     if (hint)
  3292. hint->ph_host_slot[guest] = host + 1;
  3293. #if DEBUG
  3294.     else
  3295. printk("pcibr_hints_dualslot: pcibr_hints_get failed atn"
  3296. "t%pn", xconn_vhdl);
  3297. #endif
  3298. }
  3299. void
  3300. pcibr_hints_intr_bits(devfs_handle_t xconn_vhdl,
  3301.       pcibr_intr_bits_f *xxx_intr_bits)
  3302. {
  3303.     pcibr_hints_t           hint = pcibr_hints_get(xconn_vhdl, 1);
  3304.     if (hint)
  3305. hint->ph_intr_bits = xxx_intr_bits;
  3306. #if DEBUG
  3307.     else
  3308. printk("pcibr_hints_intr_bits: pcibr_hints_get failed atn"
  3309.        "t%pn", xconn_vhdl);
  3310. #endif
  3311. }
  3312. void
  3313. pcibr_set_rrb_callback(devfs_handle_t xconn_vhdl, rrb_alloc_funct_t rrb_alloc_funct)
  3314. {
  3315.     pcibr_hints_t           hint = pcibr_hints_get(xconn_vhdl, 1);
  3316.     if (hint)
  3317. hint->rrb_alloc_funct = rrb_alloc_funct;
  3318. }
  3319. void
  3320. pcibr_hints_handsoff(devfs_handle_t xconn_vhdl)
  3321. {
  3322.     pcibr_hints_t           hint = pcibr_hints_get(xconn_vhdl, 1);
  3323.     if (hint)
  3324. hint->ph_hands_off = 1;
  3325. #if DEBUG
  3326.     else
  3327. printk("pcibr_hints_handsoff: pcibr_hints_get failed atn"
  3328. "t%pn", xconn_vhdl);
  3329. #endif
  3330. }
  3331. void
  3332. pcibr_hints_subdevs(devfs_handle_t xconn_vhdl,
  3333.     pciio_slot_t slot,
  3334.     uint64_t subdevs)
  3335. {
  3336.     arbitrary_info_t        ainfo = 0;
  3337.     char                    sdname[16];
  3338.     devfs_handle_t            pconn_vhdl = GRAPH_VERTEX_NONE;
  3339.     sprintf(sdname, "pci/%d", slot);
  3340.     (void) hwgraph_path_add(xconn_vhdl, sdname, &pconn_vhdl);
  3341.     if (pconn_vhdl == GRAPH_VERTEX_NONE) {
  3342. #if DEBUG
  3343. printk("pcibr_hints_subdevs: hwgraph_path_create failed atn"
  3344. "t%p (seeking %s)n", xconn_vhdl, sdname);
  3345. #endif
  3346. return;
  3347.     }
  3348.     hwgraph_info_get_LBL(pconn_vhdl, INFO_LBL_SUBDEVS, &ainfo);
  3349.     if (ainfo == 0) {
  3350. uint64_t                *subdevp;
  3351. NEW(subdevp);
  3352. if (!subdevp) {
  3353. #if DEBUG
  3354.     printk("pcibr_hints_subdevs: subdev ptr alloc failed atn"
  3355.     "t%pn", pconn_vhdl);
  3356. #endif
  3357.     return;
  3358. }
  3359. *subdevp = subdevs;
  3360. hwgraph_info_add_LBL(pconn_vhdl, INFO_LBL_SUBDEVS, (arbitrary_info_t) subdevp);
  3361. hwgraph_info_get_LBL(pconn_vhdl, INFO_LBL_SUBDEVS, &ainfo);
  3362. if (ainfo == (arbitrary_info_t) subdevp)
  3363.     return;
  3364. DEL(subdevp);
  3365. if (ainfo == (arbitrary_info_t) NULL) {
  3366. #if DEBUG
  3367.     printk("pcibr_hints_subdevs: null subdevs ptr atn"
  3368.     "t%pn", pconn_vhdl);
  3369. #endif
  3370.     return;
  3371. }
  3372. #if DEBUG
  3373. printk("pcibr_subdevs_get: dup subdev add_LBL atn"
  3374. "t%pn", pconn_vhdl);
  3375. #endif
  3376.     }
  3377.     *(uint64_t *) ainfo = subdevs;
  3378. }
  3379. #ifdef LATER
  3380. #include <sys/idbg.h>
  3381. #include <sys/idbgentry.h>
  3382. char *pci_space[] = {"NONE", 
  3383.      "ROM",
  3384.      "IO",
  3385.      "",
  3386.      "MEM",
  3387.      "MEM32",
  3388.      "MEM64",
  3389.      "CFG",
  3390.      "WIN0",
  3391.      "WIN1",
  3392.      "WIN2",
  3393.      "WIN3",
  3394.      "WIN4",
  3395.      "WIN5",
  3396.      "",
  3397.      "BAD"};
  3398. void
  3399. idbg_pss_func(pcibr_info_h pcibr_infoh, int func)
  3400. {
  3401.     pcibr_info_t pcibr_info = pcibr_infoh[func];
  3402.     char name[MAXDEVNAME];
  3403.     int win;
  3404.     
  3405.     if (!pcibr_info)
  3406. return;
  3407.     qprintf("Per-slot Function Infon");
  3408. #ifdef SUPPORT_PRINTING_V_FORMAT
  3409.     sprintf(name, "%v", pcibr_info->f_vertex);
  3410. #endif
  3411.     qprintf("tSlot Name : %sn",name);
  3412.     qprintf("tPCI Bus : %d ",pcibr_info->f_bus);
  3413.     qprintf("Slot : %d ", pcibr_info->f_slot);
  3414.     qprintf("Function : %d ", pcibr_info->f_func);
  3415.     qprintf("VendorId : 0x%x " , pcibr_info->f_vendor);
  3416.     qprintf("DeviceId : 0x%xn", pcibr_info->f_device);
  3417. #ifdef SUPPORT_PRINTING_V_FORMAT
  3418.     sprintf(name, "%v", pcibr_info->f_master);
  3419. #endif
  3420.     qprintf("tBus provider : %sn",name);
  3421.     qprintf("tProvider Fns : 0x%x ", pcibr_info->f_pops);
  3422.     qprintf("Error Handler : 0x%x Arg 0x%xn", 
  3423.     pcibr_info->f_efunc,pcibr_info->f_einfo);
  3424.     for(win = 0 ; win < 6 ; win++) 
  3425. qprintf("tBase Reg #%d space %s base 0x%x size 0x%xn",
  3426. win,pci_space[pcibr_info->f_window[win].w_space],
  3427. pcibr_info->f_window[win].w_base,
  3428. pcibr_info->f_window[win].w_size);
  3429.     qprintf("tRom base 0x%x size 0x%xn", 
  3430.     pcibr_info->f_rbase,pcibr_info->f_rsize);
  3431.     qprintf("tInterrupt Bit Mapn");
  3432.     qprintf("ttPCI Int#tBridge Pin#n");
  3433.     for (win = 0 ; win < 4; win++)
  3434. qprintf("ttINT%ctt%dn",win+'A',pcibr_info->f_ibit[win]);
  3435.     qprintf("n");
  3436. }
  3437. void
  3438. idbg_pss_info(pcibr_soft_t pcibr_soft, pciio_slot_t slot)
  3439. {
  3440.     pcibr_soft_slot_t pss;
  3441.     char slot_conn_name[MAXDEVNAME];
  3442.     int func;
  3443.     pss = &pcibr_soft->bs_slot[slot];
  3444.     qprintf("PCI INFRASTRUCTURAL INFO FOR SLOT %dn", slot);
  3445.     qprintf("tHost Present ? %s ", pss->has_host ? "yes" : "no");
  3446.     qprintf("tHost Slot : %dn",pss->host_slot);
  3447.     sprintf(slot_conn_name, "%v", pss->slot_conn);
  3448.     qprintf("tSlot Conn : %sn",slot_conn_name);
  3449.     qprintf("t#Functions : %dn",pss->bss_ninfo);
  3450.     for (func = 0; func < pss->bss_ninfo; func++)
  3451. idbg_pss_func(pss->bss_infos,func);
  3452.     qprintf("tSpace : %s ",pci_space[pss->bss_devio.bssd_space]);
  3453.     qprintf("tBase : 0x%x ", pss->bss_devio.bssd_base);
  3454.     qprintf("tShadow Devreg : 0x%xn", pss->bss_device);
  3455.     qprintf("tUsage counts : pmu %d d32 %d d64 %dn",
  3456.     pss->bss_pmu_uctr,pss->bss_d32_uctr,pss->bss_d64_uctr);
  3457.     
  3458.     qprintf("tDirect Trans Info : d64_base 0x%x d64_flags 0x%x"
  3459.     "d32_base 0x%x d32_flags 0x%xn",
  3460.     pss->bss_d64_base, pss->bss_d64_flags,
  3461.     pss->bss_d32_base, pss->bss_d32_flags);
  3462.     
  3463.     qprintf("tExt ATEs active ? %s", 
  3464.     atomic_read(&pss->bss_ext_ates_active) ? "yes" : "no");
  3465.     qprintf(" Command register : 0x%x ", pss->bss_cmd_pointer);
  3466.     qprintf(" Shadow command val : 0x%xn", pss->bss_cmd_shadow);
  3467.     qprintf("tRRB Info : Valid %d+%d Reserved %dn",
  3468.     pcibr_soft->bs_rrb_valid[slot],
  3469.     pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL],
  3470.     pcibr_soft->bs_rrb_res[slot]);
  3471. }
  3472. int ips = 0;
  3473. void
  3474. idbg_pss(pcibr_soft_t pcibr_soft)
  3475. {
  3476.     pciio_slot_t slot;
  3477.     
  3478.     if (ips >= 0 && ips < 8)
  3479. idbg_pss_info(pcibr_soft,ips);
  3480.     else if (ips < 0)
  3481. for (slot = 0; slot < 8; slot++) 
  3482.     idbg_pss_info(pcibr_soft,slot);
  3483.     else
  3484. qprintf("Invalid ips %dn",ips);
  3485. }
  3486. #endif /* LATER */
  3487. int
  3488. pcibr_dma_enabled(devfs_handle_t pconn_vhdl)
  3489. {
  3490.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  3491.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  3492.     return xtalk_dma_enabled(pcibr_soft->bs_conn);
  3493. }