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

Linux/Unix编程

开发平台:

Unix_Linux

  1. /*
  2.  * This file is subject to the terms and conditions of the GNU General Public
  3.  * License.  See the file "COPYING" in the main directory of this archive
  4.  * for more details.
  5.  *
  6.  * Copyright (C) 1992 - 1997, 2000-2002 Silicon Graphics, Inc. All rights reserved.
  7.  */
  8. int NeedXbridgeSwap = 0;
  9. #include <linux/types.h>
  10. #include <linux/config.h>
  11. #include <linux/slab.h>
  12. #include <linux/module.h>
  13. #include <asm/sn/sgi.h>
  14. #include <asm/sn/sn_cpuid.h>
  15. #include <asm/sn/addrs.h>
  16. #include <asm/sn/arch.h>
  17. #include <asm/sn/iograph.h>
  18. #include <asm/sn/invent.h>
  19. #include <asm/sn/hcl.h>
  20. #include <asm/sn/labelcl.h>
  21. #include <asm/sn/xtalk/xwidget.h>
  22. #include <asm/sn/pci/bridge.h>
  23. #include <asm/sn/pci/pciio.h>
  24. #include <asm/sn/pci/pcibr.h>
  25. #include <asm/sn/pci/pcibr_private.h>
  26. #include <asm/sn/pci/pci_defs.h>
  27. #include <asm/sn/prio.h>
  28. #include <asm/sn/xtalk/xbow.h>
  29. #include <asm/sn/ioc3.h>
  30. #include <asm/sn/eeprom.h>
  31. #include <asm/sn/io.h>
  32. #include <asm/sn/sn_private.h>
  33. #ifdef __ia64
  34. #define rmallocmap atemapalloc
  35. #define rmfreemap atemapfree
  36. #define rmfree atefree
  37. #define rmalloc atealloc
  38. #endif
  39. extern boolean_t                is_sys_critical_vertex(devfs_handle_t);
  40. #undef PCIBR_ATE_DEBUG
  41. #if 0
  42. #define DEBUG 1  /* To avoid lots of bad printk() formats leave off */
  43. #endif
  44. #define PCI_DEBUG 1
  45. #define ATTACH_DEBUG 1
  46. #define PCIBR_SOFT_LIST 1
  47. #ifndef LOCAL
  48. #define LOCAL static
  49. #endif
  50. /*
  51.  * Macros related to the Lucent USS 302/312 usb timeout workaround.  It
  52.  * appears that if the lucent part can get into a retry loop if it sees a
  53.  * DAC on the bus during a pio read retry.  The loop is broken after about
  54.  * 1ms, so we need to set up bridges holding this part to allow at least
  55.  * 1ms for pio.
  56.  */
  57. #define USS302_TIMEOUT_WAR
  58. #ifdef USS302_TIMEOUT_WAR
  59. #define LUCENT_USBHC_VENDOR_ID_NUM 0x11c1
  60. #define LUCENT_USBHC302_DEVICE_ID_NUM 0x5801
  61. #define LUCENT_USBHC312_DEVICE_ID_NUM 0x5802
  62. #define USS302_BRIDGE_TIMEOUT_HLD 4
  63. #endif
  64. #define PCIBR_LLP_CONTROL_WAR
  65. #if defined (PCIBR_LLP_CONTROL_WAR)
  66. int                     pcibr_llp_control_war_cnt;
  67. #endif /* PCIBR_LLP_CONTROL_WAR */
  68. int                     pcibr_devflag = D_MP;
  69. #ifdef LATER
  70. #define F(s,n) { 1l<<(s),-(s), n }
  71. struct reg_desc         bridge_int_status_desc[] =
  72. {
  73.     F(31, "MULTI_ERR"),
  74.     F(30, "PMU_ESIZE_EFAULT"),
  75.     F(29, "UNEXPECTED_RESP"),
  76.     F(28, "BAD_XRESP_PACKET"),
  77.     F(27, "BAD_XREQ_PACKET"),
  78.     F(26, "RESP_XTALK_ERROR"),
  79.     F(25, "REQ_XTALK_ERROR"),
  80.     F(24, "INVALID_ADDRESS"),
  81.     F(23, "UNSUPPORTED_XOP"),
  82.     F(22, "XREQ_FIFO_OFLOW"),
  83.     F(21, "LLP_REC_SNERROR"),
  84.     F(20, "LLP_REC_CBERROR"),
  85.     F(19, "LLP_RCTY"),
  86.     F(18, "LLP_TX_RETRY"),
  87.     F(17, "LLP_TCTY"),
  88.     F(16, "SSRAM_PERR"),
  89.     F(15, "PCI_ABORT"),
  90.     F(14, "PCI_PARITY"),
  91.     F(13, "PCI_SERR"),
  92.     F(12, "PCI_PERR"),
  93.     F(11, "PCI_MASTER_TOUT"),
  94.     F(10, "PCI_RETRY_CNT"),
  95.     F(9, "XREAD_REQ_TOUT"),
  96.     F(8, "GIO_BENABLE_ERR"),
  97.     F(7, "INT7"),
  98.     F(6, "INT6"),
  99.     F(5, "INT5"),
  100.     F(4, "INT4"),
  101.     F(3, "INT3"),
  102.     F(2, "INT2"),
  103.     F(1, "INT1"),
  104.     F(0, "INT0"),
  105.     {0}
  106. };
  107. struct reg_values       space_v[] =
  108. {
  109.     {PCIIO_SPACE_NONE, "none"},
  110.     {PCIIO_SPACE_ROM, "ROM"},
  111.     {PCIIO_SPACE_IO, "I/O"},
  112.     {PCIIO_SPACE_MEM, "MEM"},
  113.     {PCIIO_SPACE_MEM32, "MEM(32)"},
  114.     {PCIIO_SPACE_MEM64, "MEM(64)"},
  115.     {PCIIO_SPACE_CFG, "CFG"},
  116.     {PCIIO_SPACE_WIN(0), "WIN(0)"},
  117.     {PCIIO_SPACE_WIN(1), "WIN(1)"},
  118.     {PCIIO_SPACE_WIN(2), "WIN(2)"},
  119.     {PCIIO_SPACE_WIN(3), "WIN(3)"},
  120.     {PCIIO_SPACE_WIN(4), "WIN(4)"},
  121.     {PCIIO_SPACE_WIN(5), "WIN(5)"},
  122.     {PCIIO_SPACE_BAD, "BAD"},
  123.     {0}
  124. };
  125. struct reg_desc         space_desc[] =
  126. {
  127.     {0xFF, 0, "space", 0, space_v},
  128.     {0}
  129. };
  130. #if DEBUG
  131. #define device_desc device_bits
  132. LOCAL struct reg_desc   device_bits[] =
  133. {
  134.     {BRIDGE_DEV_ERR_LOCK_EN, 0, "ERR_LOCK_EN"},
  135.     {BRIDGE_DEV_PAGE_CHK_DIS, 0, "PAGE_CHK_DIS"},
  136.     {BRIDGE_DEV_FORCE_PCI_PAR, 0, "FORCE_PCI_PAR"},
  137.     {BRIDGE_DEV_VIRTUAL_EN, 0, "VIRTUAL_EN"},
  138.     {BRIDGE_DEV_PMU_WRGA_EN, 0, "PMU_WRGA_EN"},
  139.     {BRIDGE_DEV_DIR_WRGA_EN, 0, "DIR_WRGA_EN"},
  140.     {BRIDGE_DEV_DEV_SIZE, 0, "DEV_SIZE"},
  141.     {BRIDGE_DEV_RT, 0, "RT"},
  142.     {BRIDGE_DEV_SWAP_PMU, 0, "SWAP_PMU"},
  143.     {BRIDGE_DEV_SWAP_DIR, 0, "SWAP_DIR"},
  144.     {BRIDGE_DEV_PREF, 0, "PREF"},
  145.     {BRIDGE_DEV_PRECISE, 0, "PRECISE"},
  146.     {BRIDGE_DEV_COH, 0, "COH"},
  147.     {BRIDGE_DEV_BARRIER, 0, "BARRIER"},
  148.     {BRIDGE_DEV_GBR, 0, "GBR"},
  149.     {BRIDGE_DEV_DEV_SWAP, 0, "DEV_SWAP"},
  150.     {BRIDGE_DEV_DEV_IO_MEM, 0, "DEV_IO_MEM"},
  151.     {BRIDGE_DEV_OFF_MASK, BRIDGE_DEV_OFF_ADDR_SHFT, "DEV_OFF", "%x"},
  152.     {0}
  153. };
  154. #endif /* DEBUG */
  155. #ifdef SUPPORT_PRINTING_R_FORMAT
  156. LOCAL struct reg_values xio_cmd_pactyp[] =
  157. {
  158.     {0x0, "RdReq"},
  159.     {0x1, "RdResp"},
  160.     {0x2, "WrReqWithResp"},
  161.     {0x3, "WrResp"},
  162.     {0x4, "WrReqNoResp"},
  163.     {0x5, "Reserved(5)"},
  164.     {0x6, "FetchAndOp"},
  165.     {0x7, "Reserved(7)"},
  166.     {0x8, "StoreAndOp"},
  167.     {0x9, "Reserved(9)"},
  168.     {0xa, "Reserved(a)"},
  169.     {0xb, "Reserved(b)"},
  170.     {0xc, "Reserved(c)"},
  171.     {0xd, "Reserved(d)"},
  172.     {0xe, "SpecialReq"},
  173.     {0xf, "SpecialResp"},
  174.     {0}
  175. };
  176. LOCAL struct reg_desc   xio_cmd_bits[] =
  177. {
  178.     {WIDGET_DIDN, -28, "DIDN", "%x"},
  179.     {WIDGET_SIDN, -24, "SIDN", "%x"},
  180.     {WIDGET_PACTYP, -20, "PACTYP", 0, xio_cmd_pactyp},
  181.     {WIDGET_TNUM, -15, "TNUM", "%x"},
  182.     {WIDGET_COHERENT, 0, "COHERENT"},
  183.     {WIDGET_DS, 0, "DS"},
  184.     {WIDGET_GBR, 0, "GBR"},
  185.     {WIDGET_VBPM, 0, "VBPM"},
  186.     {WIDGET_ERROR, 0, "ERROR"},
  187.     {WIDGET_BARRIER, 0, "BARRIER"},
  188.     {0}
  189. };
  190. #endif /* SUPPORT_PRINTING_R_FORMAT */
  191. #if PCIBR_FREEZE_TIME || PCIBR_ATE_DEBUG
  192. LOCAL struct reg_desc   ate_bits[] =
  193. {
  194.     {0xFFFF000000000000ull, -48, "RMF", "%x"},
  195.     {~(IOPGSIZE - 1) & /* may trim off some low bits */
  196.      0x0000FFFFFFFFF000ull, 0, "XIO", "%x"},
  197.     {0x0000000000000F00ull, -8, "port", "%x"},
  198.     {0x0000000000000010ull, 0, "Barrier"},
  199.     {0x0000000000000008ull, 0, "Prefetch"},
  200.     {0x0000000000000004ull, 0, "Precise"},
  201.     {0x0000000000000002ull, 0, "Coherent"},
  202.     {0x0000000000000001ull, 0, "Valid"},
  203.     {0}
  204. };
  205. #endif
  206. #if PCIBR_ATE_DEBUG
  207. LOCAL struct reg_values ssram_sizes[] =
  208. {
  209.     {BRIDGE_CTRL_SSRAM_512K, "512k"},
  210.     {BRIDGE_CTRL_SSRAM_128K, "128k"},
  211.     {BRIDGE_CTRL_SSRAM_64K, "64k"},
  212.     {BRIDGE_CTRL_SSRAM_1K, "1k"},
  213.     {0}
  214. };
  215. LOCAL struct reg_desc   control_bits[] =
  216. {
  217.     {BRIDGE_CTRL_FLASH_WR_EN, 0, "FLASH_WR_EN"},
  218.     {BRIDGE_CTRL_EN_CLK50, 0, "EN_CLK50"},
  219.     {BRIDGE_CTRL_EN_CLK40, 0, "EN_CLK40"},
  220.     {BRIDGE_CTRL_EN_CLK33, 0, "EN_CLK33"},
  221.     {BRIDGE_CTRL_RST_MASK, -24, "RST", "%x"},
  222.     {BRIDGE_CTRL_IO_SWAP, 0, "IO_SWAP"},
  223.     {BRIDGE_CTRL_MEM_SWAP, 0, "MEM_SWAP"},
  224.     {BRIDGE_CTRL_PAGE_SIZE, 0, "PAGE_SIZE"},
  225.     {BRIDGE_CTRL_SS_PAR_BAD, 0, "SS_PAR_BAD"},
  226.     {BRIDGE_CTRL_SS_PAR_EN, 0, "SS_PAR_EN"},
  227.     {BRIDGE_CTRL_SSRAM_SIZE_MASK, 0, "SSRAM_SIZE", 0, ssram_sizes},
  228.     {BRIDGE_CTRL_F_BAD_PKT, 0, "F_BAD_PKT"},
  229.     {BRIDGE_CTRL_LLP_XBAR_CRD_MASK, -12, "LLP_XBAR_CRD", "%d"},
  230.     {BRIDGE_CTRL_CLR_RLLP_CNT, 0, "CLR_RLLP_CNT"},
  231.     {BRIDGE_CTRL_CLR_TLLP_CNT, 0, "CLR_TLLP_CNT"},
  232.     {BRIDGE_CTRL_SYS_END, 0, "SYS_END"},
  233.     {BRIDGE_CTRL_MAX_TRANS_MASK, -4, "MAX_TRANS", "%d"},
  234.     {BRIDGE_CTRL_WIDGET_ID_MASK, 0, "WIDGET_ID", "%x"},
  235.     {0}
  236. };
  237. #endif
  238. #endif /* LATER */
  239. /* kbrick widgetnum-to-bus layout */
  240. int p_busnum[MAX_PORT_NUM] = {                  /* widget#      */
  241.         0, 0, 0, 0, 0, 0, 0, 0,                 /* 0x0 - 0x7    */
  242.         2,                                      /* 0x8          */
  243.         1,                                      /* 0x9          */
  244.         0, 0,                                   /* 0xa - 0xb    */
  245.         5,                                      /* 0xc          */
  246.         6,                                      /* 0xd          */
  247.         4,                                      /* 0xe          */
  248.         3,                                      /* 0xf          */
  249. };
  250. /*
  251.  * Additional PIO spaces per slot are
  252.  * recorded in this structure.
  253.  */
  254. struct pciio_piospace_s {
  255.     pciio_piospace_t        next; /* another space for this device */
  256.     char                    free; /* 1 if free, 0 if in use               */
  257.     pciio_space_t           space; /* Which space is in use                */
  258.     iopaddr_t               start; /* Starting address of the PIO space    */
  259.     size_t                  count; /* size of PIO space                    */
  260. };
  261. #if PCIBR_SOFT_LIST
  262. pcibr_list_p            pcibr_list = 0;
  263. #endif
  264. #define INFO_LBL_PCIBR_ASIC_REV "_pcibr_asic_rev"
  265. #define PCIBR_D64_BASE_UNSET (0xFFFFFFFFFFFFFFFF)
  266. #define PCIBR_D32_BASE_UNSET (0xFFFFFFFF)
  267. #define PCIBR_VALID_SLOT(s) (s < 8)
  268. #ifdef SN_XXX
  269. extern int      hub_device_flags_set(devfs_handle_t       widget_dev,
  270.                                      hub_widget_flags_t flags);
  271. #endif
  272. extern pciio_dmamap_t get_free_pciio_dmamap(devfs_handle_t);
  273. extern void free_pciio_dmamap(pcibr_dmamap_t);
  274. /*
  275.  * This is the file operation table for the pcibr driver.
  276.  * As each of the functions are implemented, put the 
  277.  * appropriate function name below.
  278.  */
  279. struct file_operations pcibr_fops = {
  280.         owner:  THIS_MODULE,
  281.         llseek: NULL,
  282.         read: NULL,
  283.         write: NULL,
  284.         readdir: NULL,
  285.         poll: NULL,
  286.         ioctl: NULL,
  287.         mmap: NULL,
  288.         open: NULL,
  289.         flush: NULL,
  290.         release: NULL,
  291.         fsync: NULL,
  292.         fasync: NULL,
  293.         lock: NULL,
  294.         readv: NULL,
  295.         writev: NULL
  296. };
  297. extern devfs_handle_t hwgraph_root;
  298. extern graph_error_t hwgraph_vertex_unref(devfs_handle_t vhdl);
  299. extern int cap_able(uint64_t x);
  300. extern uint64_t rmalloc(struct map *mp, size_t size);
  301. extern void rmfree(struct map *mp, size_t size, uint64_t a);
  302. extern int hwgraph_vertex_name_get(devfs_handle_t vhdl, char *buf, uint buflen);
  303. extern long atoi(register char *p);
  304. extern void *swap_ptr(void **loc, void *new);
  305. extern char *dev_to_name(devfs_handle_t dev, char *buf, uint buflen);
  306. extern cnodeid_t nodevertex_to_cnodeid(devfs_handle_t vhdl);
  307. extern graph_error_t hwgraph_edge_remove(devfs_handle_t from, char *name, devfs_handle_t *toptr);
  308. extern struct map *rmallocmap(uint64_t mapsiz);
  309. extern void rmfreemap(struct map *mp);
  310. extern int compare_and_swap_ptr(void **location, void *old_ptr, void *new_ptr);
  311. extern int io_path_map_widget(devfs_handle_t vertex);
  312. /* =====================================================================
  313.  *    Function Table of Contents
  314.  *
  315.  *      The order of functions in this file has stopped
  316.  *      making much sense. We might want to take a look
  317.  *      at it some time and bring back some sanity, or
  318.  *      perhaps bust this file into smaller chunks.
  319.  */
  320. LOCAL void              do_pcibr_rrb_clear(bridge_t *, int);
  321. LOCAL void              do_pcibr_rrb_flush(bridge_t *, int);
  322. LOCAL int               do_pcibr_rrb_count_valid(bridge_t *, pciio_slot_t);
  323. LOCAL int               do_pcibr_rrb_count_avail(bridge_t *, pciio_slot_t);
  324. LOCAL int               do_pcibr_rrb_alloc(bridge_t *, pciio_slot_t, int);
  325. LOCAL int               do_pcibr_rrb_free(bridge_t *, pciio_slot_t, int);
  326. LOCAL void              do_pcibr_rrb_autoalloc(pcibr_soft_t, int, int);
  327. int pcibr_wrb_flush(devfs_handle_t);
  328. int                     pcibr_rrb_alloc(devfs_handle_t, int *, int *);
  329. int                     pcibr_rrb_check(devfs_handle_t, int *, int *, int *, int *);
  330. int                     pcibr_alloc_all_rrbs(devfs_handle_t, int, int, int, int, int, int, int, int, int);
  331. void                    pcibr_rrb_flush(devfs_handle_t);
  332. LOCAL int               pcibr_try_set_device(pcibr_soft_t, pciio_slot_t, unsigned, bridgereg_t);
  333. void                    pcibr_release_device(pcibr_soft_t, pciio_slot_t, bridgereg_t);
  334. LOCAL void              pcibr_clearwidint(bridge_t *);
  335. LOCAL void              pcibr_setwidint(xtalk_intr_t);
  336. LOCAL int               pcibr_probe_slot(bridge_t *, cfg_p, unsigned *);
  337. void                    pcibr_init(void);
  338. int                     pcibr_attach(devfs_handle_t);
  339. int pcibr_detach(devfs_handle_t);
  340. int                     pcibr_open(devfs_handle_t *, int, int, cred_t *);
  341. int                     pcibr_close(devfs_handle_t, int, int, cred_t *);
  342. int                     pcibr_map(devfs_handle_t, vhandl_t *, off_t, size_t, uint);
  343. int                     pcibr_unmap(devfs_handle_t, vhandl_t *);
  344. int                     pcibr_ioctl(devfs_handle_t, int, void *, int, struct cred *, int *);
  345. void                    pcibr_freeblock_sub(iopaddr_t *, iopaddr_t *, iopaddr_t, size_t);
  346. LOCAL int               pcibr_init_ext_ate_ram(bridge_t *);
  347. LOCAL int               pcibr_ate_alloc(pcibr_soft_t, int);
  348. LOCAL void              pcibr_ate_free(pcibr_soft_t, int, int);
  349. LOCAL pcibr_info_t      pcibr_info_get(devfs_handle_t);
  350. LOCAL pcibr_info_t      pcibr_device_info_new(pcibr_soft_t, pciio_slot_t, pciio_function_t, pciio_vendor_id_t, pciio_device_id_t);
  351. LOCAL void pcibr_device_info_free(devfs_handle_t, pciio_slot_t);
  352. LOCAL iopaddr_t         pcibr_addr_pci_to_xio(devfs_handle_t, pciio_slot_t, pciio_space_t, iopaddr_t, size_t, unsigned);
  353. pcibr_piomap_t          pcibr_piomap_alloc(devfs_handle_t, device_desc_t, pciio_space_t, iopaddr_t, size_t, size_t, unsigned);
  354. void                    pcibr_piomap_free(pcibr_piomap_t);
  355. caddr_t                 pcibr_piomap_addr(pcibr_piomap_t, iopaddr_t, size_t);
  356. void                    pcibr_piomap_done(pcibr_piomap_t);
  357. caddr_t                 pcibr_piotrans_addr(devfs_handle_t, device_desc_t, pciio_space_t, iopaddr_t, size_t, unsigned);
  358. iopaddr_t               pcibr_piospace_alloc(devfs_handle_t, device_desc_t, pciio_space_t, size_t, size_t);
  359. void                    pcibr_piospace_free(devfs_handle_t, pciio_space_t, iopaddr_t, size_t);
  360. LOCAL iopaddr_t         pcibr_flags_to_d64(unsigned, pcibr_soft_t);
  361. LOCAL bridge_ate_t      pcibr_flags_to_ate(unsigned);
  362. pcibr_dmamap_t          pcibr_dmamap_alloc(devfs_handle_t, device_desc_t, size_t, unsigned);
  363. void                    pcibr_dmamap_free(pcibr_dmamap_t);
  364. LOCAL bridge_ate_p      pcibr_ate_addr(pcibr_soft_t, int);
  365. LOCAL iopaddr_t         pcibr_addr_xio_to_pci(pcibr_soft_t, iopaddr_t, size_t);
  366. iopaddr_t               pcibr_dmamap_addr(pcibr_dmamap_t, paddr_t, size_t);
  367. alenlist_t              pcibr_dmamap_list(pcibr_dmamap_t, alenlist_t, unsigned);
  368. void                    pcibr_dmamap_done(pcibr_dmamap_t);
  369. cnodeid_t pcibr_get_dmatrans_node(devfs_handle_t);
  370. iopaddr_t               pcibr_dmatrans_addr(devfs_handle_t, device_desc_t, paddr_t, size_t, unsigned);
  371. alenlist_t              pcibr_dmatrans_list(devfs_handle_t, device_desc_t, alenlist_t, unsigned);
  372. void                    pcibr_dmamap_drain(pcibr_dmamap_t);
  373. void                    pcibr_dmaaddr_drain(devfs_handle_t, paddr_t, size_t);
  374. void                    pcibr_dmalist_drain(devfs_handle_t, alenlist_t);
  375. iopaddr_t               pcibr_dmamap_pciaddr_get(pcibr_dmamap_t);
  376. static unsigned pcibr_intr_bits(pciio_info_t info, pciio_intr_line_t lines);
  377. pcibr_intr_t            pcibr_intr_alloc(devfs_handle_t, device_desc_t, pciio_intr_line_t, devfs_handle_t);
  378. void                    pcibr_intr_free(pcibr_intr_t);
  379. LOCAL void              pcibr_setpciint(xtalk_intr_t);
  380. int                     pcibr_intr_connect(pcibr_intr_t);
  381. void                    pcibr_intr_disconnect(pcibr_intr_t);
  382. devfs_handle_t            pcibr_intr_cpu_get(pcibr_intr_t);
  383. void                    pcibr_xintr_preset(void *, int, xwidgetnum_t, iopaddr_t, xtalk_intr_vector_t);
  384. void                    pcibr_intr_func(intr_arg_t);
  385. void                    pcibr_provider_startup(devfs_handle_t);
  386. void                    pcibr_provider_shutdown(devfs_handle_t);
  387. int                     pcibr_reset(devfs_handle_t);
  388. pciio_endian_t          pcibr_endian_set(devfs_handle_t, pciio_endian_t, pciio_endian_t);
  389. int                     pcibr_priority_bits_set(pcibr_soft_t, pciio_slot_t, pciio_priority_t);
  390. pciio_priority_t        pcibr_priority_set(devfs_handle_t, pciio_priority_t);
  391. int                     pcibr_device_flags_set(devfs_handle_t, pcibr_device_flags_t);
  392. LOCAL cfg_p             pcibr_config_addr(devfs_handle_t, unsigned);
  393. uint64_t                pcibr_config_get(devfs_handle_t, unsigned, unsigned);
  394. LOCAL uint64_t          do_pcibr_config_get(cfg_p, unsigned, unsigned);
  395. void                    pcibr_config_set(devfs_handle_t, unsigned, unsigned, uint64_t);
  396. LOCAL void              do_pcibr_config_set(cfg_p, unsigned, unsigned, uint64_t);
  397. LOCAL pcibr_hints_t     pcibr_hints_get(devfs_handle_t, int);
  398. void                    pcibr_hints_fix_rrbs(devfs_handle_t);
  399. void                    pcibr_hints_dualslot(devfs_handle_t, pciio_slot_t, pciio_slot_t);
  400. void pcibr_hints_intr_bits(devfs_handle_t, pcibr_intr_bits_f *);
  401. void                    pcibr_set_rrb_callback(devfs_handle_t, rrb_alloc_funct_t);
  402. void                    pcibr_hints_handsoff(devfs_handle_t);
  403. void                    pcibr_hints_subdevs(devfs_handle_t, pciio_slot_t, ulong);
  404. LOCAL int pcibr_slot_info_init(devfs_handle_t,pciio_slot_t);
  405. LOCAL int pcibr_slot_info_free(devfs_handle_t,pciio_slot_t);
  406. #ifdef LATER
  407. LOCAL int         pcibr_slot_info_return(pcibr_soft_t, pciio_slot_t,
  408.                                                pcibr_slot_info_resp_t);
  409. LOCAL void        pcibr_slot_func_info_return(pcibr_info_h, int,
  410.                                                     pcibr_slot_func_info_resp_t);
  411. #endif /* LATER */
  412. LOCAL int pcibr_slot_addr_space_init(devfs_handle_t,pciio_slot_t);
  413. LOCAL int pcibr_slot_device_init(devfs_handle_t, pciio_slot_t);
  414. LOCAL int pcibr_slot_guest_info_init(devfs_handle_t,pciio_slot_t);
  415. LOCAL int pcibr_slot_initial_rrb_alloc(devfs_handle_t,pciio_slot_t);
  416. LOCAL int pcibr_slot_call_device_attach(devfs_handle_t,
  417.       pciio_slot_t, int);
  418. LOCAL int pcibr_slot_call_device_detach(devfs_handle_t,
  419.       pciio_slot_t, int);
  420. LOCAL int               pcibr_slot_detach(devfs_handle_t, pciio_slot_t, int);
  421. LOCAL int  pcibr_is_slot_sys_critical(devfs_handle_t, pciio_slot_t);
  422. #ifdef LATER
  423. LOCAL int pcibr_slot_query(devfs_handle_t, pcibr_slot_info_req_t);
  424. #endif
  425. /* =====================================================================
  426.  *    RRB management
  427.  */
  428. #define LSBIT(word) ((word) &~ ((word)-1))
  429. #define PCIBR_RRB_SLOT_VIRTUAL 8
  430. LOCAL void
  431. do_pcibr_rrb_clear(bridge_t *bridge, int rrb)
  432. {
  433.     bridgereg_t             status;
  434.     /* bridge_lock must be held;
  435.      * this RRB must be disabled.
  436.      */
  437.     /* wait until RRB has no outstanduing XIO packets. */
  438.     while ((status = bridge->b_resp_status) & BRIDGE_RRB_INUSE(rrb)) {
  439. ; /* XXX- beats on bridge. bad idea? */
  440.     }
  441.     /* if the RRB has data, drain it. */
  442.     if (status & BRIDGE_RRB_VALID(rrb)) {
  443. bridge->b_resp_clear = BRIDGE_RRB_CLEAR(rrb);
  444. /* wait until RRB is no longer valid. */
  445. while ((status = bridge->b_resp_status) & BRIDGE_RRB_VALID(rrb)) {
  446.     ; /* XXX- beats on bridge. bad idea? */
  447. }
  448.     }
  449. }
  450. LOCAL void
  451. do_pcibr_rrb_flush(bridge_t *bridge, int rrbn)
  452. {
  453.     reg_p                   rrbp = &bridge->b_rrb_map[rrbn & 1].reg;
  454.     bridgereg_t             rrbv;
  455.     int                     shft = 4 * (rrbn >> 1);
  456.     unsigned                ebit = BRIDGE_RRB_EN << shft;
  457.     rrbv = *rrbp;
  458.     if (rrbv & ebit)
  459. *rrbp = rrbv & ~ebit;
  460.     do_pcibr_rrb_clear(bridge, rrbn);
  461.     if (rrbv & ebit)
  462. *rrbp = rrbv;
  463. }
  464. /*
  465.  *    pcibr_rrb_count_valid: count how many RRBs are
  466.  *      marked valid for the specified PCI slot on this
  467.  *      bridge.
  468.  *
  469.  *      NOTE: The "slot" parameter for all pcibr_rrb
  470.  *      management routines must include the "virtual"
  471.  *      bit; when manageing both the normal and the
  472.  *      virtual channel, separate calls to these
  473.  *      routines must be made. To denote the virtual
  474.  *      channel, add PCIBR_RRB_SLOT_VIRTUAL to the slot
  475.  *      number.
  476.  *
  477.  *      IMPL NOTE: The obvious algorithm is to iterate
  478.  *      through the RRB fields, incrementing a count if
  479.  *      the RRB is valid and matches the slot. However,
  480.  *      it is much simpler to use an algorithm derived
  481.  *      from the "partitioned add" idea. First, XOR in a
  482.  *      pattern such that the fields that match this
  483.  *      slot come up "all ones" and all other fields
  484.  *      have zeros in the mismatching bits. Then AND
  485.  *      together the bits in the field, so we end up
  486.  *      with one bit turned on for each field that
  487.  *      matched. Now we need to count these bits. This
  488.  *      can be done either with a series of shift/add
  489.  *      instructions or by using "tmp % 15"; I expect
  490.  *      that the cascaded shift/add will be faster.
  491.  */
  492. LOCAL int
  493. do_pcibr_rrb_count_valid(bridge_t *bridge,
  494.  pciio_slot_t slot)
  495. {
  496.     bridgereg_t             tmp;
  497.     tmp = bridge->b_rrb_map[slot & 1].reg;
  498.     tmp ^= 0x11111111 * (7 - slot / 2);
  499.     tmp &= (0xCCCCCCCC & tmp) >> 2;
  500.     tmp &= (0x22222222 & tmp) >> 1;
  501.     tmp += tmp >> 4;
  502.     tmp += tmp >> 8;
  503.     tmp += tmp >> 16;
  504.     return tmp & 15;
  505. }
  506. /*
  507.  *    do_pcibr_rrb_count_avail: count how many RRBs are
  508.  *      available to be allocated for the specified slot.
  509.  *
  510.  *      IMPL NOTE: similar to the above, except we are
  511.  *      just counting how many fields have the valid bit
  512.  *      turned off.
  513.  */
  514. LOCAL int
  515. do_pcibr_rrb_count_avail(bridge_t *bridge,
  516.  pciio_slot_t slot)
  517. {
  518.     bridgereg_t             tmp;
  519.     tmp = bridge->b_rrb_map[slot & 1].reg;
  520.     tmp = (0x88888888 & ~tmp) >> 3;
  521.     tmp += tmp >> 4;
  522.     tmp += tmp >> 8;
  523.     tmp += tmp >> 16;
  524.     return tmp & 15;
  525. }
  526. /*
  527.  *    do_pcibr_rrb_alloc: allocate some additional RRBs
  528.  *      for the specified slot. Returns -1 if there were
  529.  *      insufficient free RRBs to satisfy the request,
  530.  *      or 0 if the request was fulfilled.
  531.  *
  532.  *      Note that if a request can be partially filled,
  533.  *      it will be, even if we return failure.
  534.  *
  535.  *      IMPL NOTE: again we avoid iterating across all
  536.  *      the RRBs; instead, we form up a word containing
  537.  *      one bit for each free RRB, then peel the bits
  538.  *      off from the low end.
  539.  */
  540. LOCAL int
  541. do_pcibr_rrb_alloc(bridge_t *bridge,
  542.    pciio_slot_t slot,
  543.    int more)
  544. {
  545.     int                     rv = 0;
  546.     bridgereg_t             reg, tmp, bit;
  547.     reg = bridge->b_rrb_map[slot & 1].reg;
  548.     tmp = (0x88888888 & ~reg) >> 3;
  549.     while (more-- > 0) {
  550. bit = LSBIT(tmp);
  551. if (!bit) {
  552.     rv = -1;
  553.     break;
  554. }
  555. tmp &= ~bit;
  556. reg = ((reg & ~(bit * 15)) | (bit * (8 + slot / 2)));
  557.     }
  558.     bridge->b_rrb_map[slot & 1].reg = reg;
  559.     return rv;
  560. }
  561. /*
  562.  *    do_pcibr_rrb_free: release some of the RRBs that
  563.  *      have been allocated for the specified
  564.  *      slot. Returns zero for success, or negative if
  565.  *      it was unable to free that many RRBs.
  566.  *
  567.  *      IMPL NOTE: We form up a bit for each RRB
  568.  *      allocated to the slot, aligned with the VALID
  569.  *      bitfield this time; then we peel bits off one at
  570.  *      a time, releasing the corresponding RRB.
  571.  */
  572. LOCAL int
  573. do_pcibr_rrb_free(bridge_t *bridge,
  574.   pciio_slot_t slot,
  575.   int less)
  576. {
  577.     int                     rv = 0;
  578.     bridgereg_t             reg, tmp, clr, bit;
  579.     int                     i;
  580.     clr = 0;
  581.     reg = bridge->b_rrb_map[slot & 1].reg;
  582.     /* This needs to be done otherwise the rrb's on the virtual channel
  583.      * for this slot won't be freed !!
  584.      */
  585.     tmp = reg & 0xbbbbbbbb;
  586.     tmp ^= (0x11111111 * (7 - slot / 2));
  587.     tmp &= (0x33333333 & tmp) << 2;
  588.     tmp &= (0x44444444 & tmp) << 1;
  589.     while (less-- > 0) {
  590. bit = LSBIT(tmp);
  591. if (!bit) {
  592.     rv = -1;
  593.     break;
  594. }
  595. tmp &= ~bit;
  596. reg &= ~bit;
  597. clr |= bit;
  598.     }
  599.     bridge->b_rrb_map[slot & 1].reg = reg;
  600.     for (i = 0; i < 8; i++)
  601. if (clr & (8 << (4 * i)))
  602.     do_pcibr_rrb_clear(bridge, (2 * i) + (slot & 1));
  603.     return rv;
  604. }
  605. LOCAL void
  606. do_pcibr_rrb_autoalloc(pcibr_soft_t pcibr_soft,
  607.        int slot,
  608.        int more_rrbs)
  609. {
  610.     bridge_t               *bridge = pcibr_soft->bs_base;
  611.     int                     got;
  612.     for (got = 0; got < more_rrbs; ++got) {
  613. if (pcibr_soft->bs_rrb_res[slot & 7] > 0)
  614.     pcibr_soft->bs_rrb_res[slot & 7]--;
  615. else if (pcibr_soft->bs_rrb_avail[slot & 1] > 0)
  616.     pcibr_soft->bs_rrb_avail[slot & 1]--;
  617. else
  618.     break;
  619. if (do_pcibr_rrb_alloc(bridge, slot, 1) < 0)
  620.     break;
  621. #if PCIBR_RRB_DEBUG
  622. printk( "do_pcibr_rrb_autoalloc: add one to slot %d%sn",
  623. slot & 7, slot & 8 ? "v" : "");
  624. #endif
  625. pcibr_soft->bs_rrb_valid[slot]++;
  626.     }
  627. #if PCIBR_RRB_DEBUG
  628.     printk("%s: %d+%d free RRBs. Allocation list:n", pcibr_soft->bs_name,
  629.     pcibr_soft->bs_rrb_avail[0],
  630.     pcibr_soft->bs_rrb_avail[1]);
  631.     for (slot = 0; slot < 8; ++slot)
  632. printk("t%d+%d+%d",
  633. 0xFFF & pcibr_soft->bs_rrb_valid[slot],
  634. 0xFFF & pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL],
  635. pcibr_soft->bs_rrb_res[slot]);
  636. printk("n");
  637. #endif
  638. }
  639. /*
  640.  * Device driver interface to flush the write buffers for a specified
  641.  * device hanging off the bridge.
  642.  */
  643. int
  644. pcibr_wrb_flush(devfs_handle_t pconn_vhdl)
  645. {
  646.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  647.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  648.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  649.     bridge_t               *bridge = pcibr_soft->bs_base;
  650.     volatile bridgereg_t   *wrb_flush;
  651.     wrb_flush = &(bridge->b_wr_req_buf[pciio_slot].reg);
  652.     while (*wrb_flush);
  653.     return(0);
  654. }
  655. /*
  656.  * Device driver interface to request RRBs for a specified device
  657.  * hanging off a Bridge.  The driver requests the total number of
  658.  * RRBs it would like for the normal channel (vchan0) and for the
  659.  * "virtual channel" (vchan1).  The actual number allocated to each
  660.  * channel is returned.
  661.  *
  662.  * If we cannot allocate at least one RRB to a channel that needs
  663.  * at least one, return -1 (failure).  Otherwise, satisfy the request
  664.  * as best we can and return 0.
  665.  */
  666. int
  667. pcibr_rrb_alloc(devfs_handle_t pconn_vhdl,
  668. int *count_vchan0,
  669. int *count_vchan1)
  670. {
  671.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  672.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  673.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  674.     bridge_t               *bridge = pcibr_soft->bs_base;
  675.     int                     desired_vchan0;
  676.     int                     desired_vchan1;
  677.     int                     orig_vchan0;
  678.     int                     orig_vchan1;
  679.     int                     delta_vchan0;
  680.     int                     delta_vchan1;
  681.     int                     final_vchan0;
  682.     int                     final_vchan1;
  683.     int                     avail_rrbs;
  684.     unsigned long           s;
  685.     int                     error;
  686.     /*
  687.      * TBD: temper request with admin info about RRB allocation,
  688.      * and according to demand from other devices on this Bridge.
  689.      *
  690.      * One way of doing this would be to allocate two RRBs
  691.      * for each device on the bus, before any drivers start
  692.      * asking for extras. This has the weakness that one
  693.      * driver might not give back an "extra" RRB until after
  694.      * another driver has already failed to get one that
  695.      * it wanted.
  696.      */
  697.     s = pcibr_lock(pcibr_soft);
  698.     /* How many RRBs do we own? */
  699.     orig_vchan0 = pcibr_soft->bs_rrb_valid[pciio_slot];
  700.     orig_vchan1 = pcibr_soft->bs_rrb_valid[pciio_slot + PCIBR_RRB_SLOT_VIRTUAL];
  701.     /* How many RRBs do we want? */
  702.     desired_vchan0 = count_vchan0 ? *count_vchan0 : orig_vchan0;
  703.     desired_vchan1 = count_vchan1 ? *count_vchan1 : orig_vchan1;
  704.     /* How many RRBs are free? */
  705.     avail_rrbs = pcibr_soft->bs_rrb_avail[pciio_slot & 1]
  706. + pcibr_soft->bs_rrb_res[pciio_slot];
  707.     /* Figure desired deltas */
  708.     delta_vchan0 = desired_vchan0 - orig_vchan0;
  709.     delta_vchan1 = desired_vchan1 - orig_vchan1;
  710.     /* Trim back deltas to something
  711.      * that we can actually meet, by
  712.      * decreasing the ending allocation
  713.      * for whichever channel wants
  714.      * more RRBs. If both want the same
  715.      * number, cut the second channel.
  716.      * NOTE: do not change the allocation for
  717.      * a channel that was passed as NULL.
  718.      */
  719.     while ((delta_vchan0 + delta_vchan1) > avail_rrbs) {
  720. if (count_vchan0 &&
  721.     (!count_vchan1 ||
  722.      ((orig_vchan0 + delta_vchan0) >
  723.       (orig_vchan1 + delta_vchan1))))
  724.     delta_vchan0--;
  725. else
  726.     delta_vchan1--;
  727.     }
  728.     /* Figure final RRB allocations
  729.      */
  730.     final_vchan0 = orig_vchan0 + delta_vchan0;
  731.     final_vchan1 = orig_vchan1 + delta_vchan1;
  732.     /* If either channel wants RRBs but our actions
  733.      * would leave it with none, declare an error,
  734.      * but DO NOT change any RRB allocations.
  735.      */
  736.     if ((desired_vchan0 && !final_vchan0) ||
  737. (desired_vchan1 && !final_vchan1)) {
  738. error = -1;
  739.     } else {
  740. /* Commit the allocations: free, then alloc.
  741.  */
  742. if (delta_vchan0 < 0)
  743.     (void) do_pcibr_rrb_free(bridge, pciio_slot, -delta_vchan0);
  744. if (delta_vchan1 < 0)
  745.     (void) do_pcibr_rrb_free(bridge, PCIBR_RRB_SLOT_VIRTUAL + pciio_slot, -delta_vchan1);
  746. if (delta_vchan0 > 0)
  747.     (void) do_pcibr_rrb_alloc(bridge, pciio_slot, delta_vchan0);
  748. if (delta_vchan1 > 0)
  749.     (void) do_pcibr_rrb_alloc(bridge, PCIBR_RRB_SLOT_VIRTUAL + pciio_slot, delta_vchan1);
  750. /* Return final values to caller.
  751.  */
  752. if (count_vchan0)
  753.     *count_vchan0 = final_vchan0;
  754. if (count_vchan1)
  755.     *count_vchan1 = final_vchan1;
  756. /* prevent automatic changes to this slot's RRBs
  757.  */
  758. pcibr_soft->bs_rrb_fixed |= 1 << pciio_slot;
  759. /* Track the actual allocations, release
  760.  * any further reservations, and update the
  761.  * number of available RRBs.
  762.  */
  763. pcibr_soft->bs_rrb_valid[pciio_slot] = final_vchan0;
  764. pcibr_soft->bs_rrb_valid[pciio_slot + PCIBR_RRB_SLOT_VIRTUAL] = final_vchan1;
  765. pcibr_soft->bs_rrb_avail[pciio_slot & 1] =
  766.     pcibr_soft->bs_rrb_avail[pciio_slot & 1]
  767.     + pcibr_soft->bs_rrb_res[pciio_slot]
  768.     - delta_vchan0
  769.     - delta_vchan1;
  770. pcibr_soft->bs_rrb_res[pciio_slot] = 0;
  771. #if PCIBR_RRB_DEBUG
  772. printk("pcibr_rrb_alloc: slot %d set to %d+%d; %d+%d freen",
  773. pciio_slot, final_vchan0, final_vchan1,
  774. pcibr_soft->bs_rrb_avail[0],
  775. pcibr_soft->bs_rrb_avail[1]);
  776. for (pciio_slot = 0; pciio_slot < 8; ++pciio_slot)
  777.     printk("t%d+%d+%d",
  778.     0xFFF & pcibr_soft->bs_rrb_valid[pciio_slot],
  779.     0xFFF & pcibr_soft->bs_rrb_valid[pciio_slot + PCIBR_RRB_SLOT_VIRTUAL],
  780.     pcibr_soft->bs_rrb_res[pciio_slot]);
  781. printk("n");
  782. #endif
  783. error = 0;
  784.     }
  785.     pcibr_unlock(pcibr_soft, s);
  786.     return error;
  787. }
  788. /*
  789.  * Device driver interface to check the current state
  790.  * of the RRB allocations.
  791.  *
  792.  *   pconn_vhdl is your PCI connection point (specifies which
  793.  *      PCI bus and which slot).
  794.  *
  795.  *   count_vchan0 points to where to return the number of RRBs
  796.  *      assigned to the primary DMA channel, used by all DMA
  797.  *      that does not explicitly ask for the alternate virtual
  798.  *      channel.
  799.  *
  800.  *   count_vchan1 points to where to return the number of RRBs
  801.  *      assigned to the secondary DMA channel, used when
  802.  *      PCIBR_VCHAN1 and PCIIO_DMA_A64 are specified.
  803.  *
  804.  *   count_reserved points to where to return the number of RRBs
  805.  *      that have been automatically reserved for your device at
  806.  *      startup, but which have not been assigned to a
  807.  *      channel. RRBs must be assigned to a channel to be used;
  808.  *      this can be done either with an explicit pcibr_rrb_alloc
  809.  *      call, or automatically by the infrastructure when a DMA
  810.  *      translation is constructed. Any call to pcibr_rrb_alloc
  811.  *      will release any unassigned reserved RRBs back to the
  812.  *      free pool.
  813.  *
  814.  *   count_pool points to where to return the number of RRBs
  815.  *      that are currently unassigned and unreserved. This
  816.  *      number can (and will) change as other drivers make calls
  817.  *      to pcibr_rrb_alloc, or automatically allocate RRBs for
  818.  *      DMA beyond their initial reservation.
  819.  *
  820.  * NULL may be passed for any of the return value pointers
  821.  * the caller is not interested in.
  822.  *
  823.  * The return value is "0" if all went well, or "-1" if
  824.  * there is a problem. Additionally, if the wrong vertex
  825.  * is passed in, one of the subsidiary support functions
  826.  * could panic with a "bad pciio fingerprint."
  827.  */
  828. int
  829. pcibr_rrb_check(devfs_handle_t pconn_vhdl,
  830. int *count_vchan0,
  831. int *count_vchan1,
  832. int *count_reserved,
  833. int *count_pool)
  834. {
  835.     pciio_info_t            pciio_info;
  836.     pciio_slot_t            pciio_slot;
  837.     pcibr_soft_t            pcibr_soft;
  838.     unsigned long           s;
  839.     int                     error = -1;
  840.     if ((pciio_info = pciio_info_get(pconn_vhdl)) &&
  841. (pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info)) &&
  842. ((pciio_slot = pciio_info_slot_get(pciio_info)) < 8)) {
  843. s = pcibr_lock(pcibr_soft);
  844. if (count_vchan0)
  845.     *count_vchan0 =
  846. pcibr_soft->bs_rrb_valid[pciio_slot];
  847. if (count_vchan1)
  848.     *count_vchan1 =
  849. pcibr_soft->bs_rrb_valid[pciio_slot + PCIBR_RRB_SLOT_VIRTUAL];
  850. if (count_reserved)
  851.     *count_reserved =
  852. pcibr_soft->bs_rrb_res[pciio_slot];
  853. if (count_pool)
  854.     *count_pool =
  855. pcibr_soft->bs_rrb_avail[pciio_slot & 1];
  856. error = 0;
  857. pcibr_unlock(pcibr_soft, s);
  858.     }
  859.     return error;
  860. }
  861. /* pcibr_alloc_all_rrbs allocates all the rrbs available in the quantities
  862.  * requested for each of the devies.  The evn_odd argument indicates whether
  863.  * allcoation for the odd or even rrbs is requested and next group of four pairse
  864.  * are the amount to assign to each device (they should sum to <= 8) and
  865.  * whether to set the viritual bit for that device (1 indictaes yes, 0 indicates no)
  866.  * the devices in order are either 0, 2, 4, 6 or 1, 3, 5, 7
  867.  * if even_odd is even we alloc even rrbs else we allocate odd rrbs
  868.  * returns 0 if no errors else returns -1
  869.  */
  870. int
  871. pcibr_alloc_all_rrbs(devfs_handle_t vhdl, int even_odd,
  872.      int dev_1_rrbs, int virt1, int dev_2_rrbs, int virt2,
  873.      int dev_3_rrbs, int virt3, int dev_4_rrbs, int virt4)
  874. {
  875.     devfs_handle_t            pcibr_vhdl;
  876.     pcibr_soft_t            pcibr_soft = NULL;
  877.     bridge_t               *bridge = NULL;
  878.     uint32_t              rrb_setting = 0;
  879.     int                     rrb_shift = 7;
  880.     uint32_t              cur_rrb;
  881.     int                     dev_rrbs[4];
  882.     int                     virt[4];
  883.     int                     i, j;
  884.     unsigned long           s;
  885.     if (GRAPH_SUCCESS ==
  886. hwgraph_traverse(vhdl, EDGE_LBL_PCI, &pcibr_vhdl)) {
  887. pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  888. if (pcibr_soft)
  889.     bridge = pcibr_soft->bs_base;
  890. hwgraph_vertex_unref(pcibr_vhdl);
  891.     }
  892.     if (bridge == NULL)
  893. bridge = (bridge_t *) xtalk_piotrans_addr
  894.     (vhdl, NULL, 0, sizeof(bridge_t), 0);
  895.     even_odd &= 1;
  896.     dev_rrbs[0] = dev_1_rrbs;
  897.     dev_rrbs[1] = dev_2_rrbs;
  898.     dev_rrbs[2] = dev_3_rrbs;
  899.     dev_rrbs[3] = dev_4_rrbs;
  900.     virt[0] = virt1;
  901.     virt[1] = virt2;
  902.     virt[2] = virt3;
  903.     virt[3] = virt4;
  904.     if ((dev_1_rrbs + dev_2_rrbs + dev_3_rrbs + dev_4_rrbs) > 8) {
  905. return -1;
  906.     }
  907.     if ((dev_1_rrbs < 0) || (dev_2_rrbs < 0) || (dev_3_rrbs < 0) || (dev_4_rrbs < 0)) {
  908. return -1;
  909.     }
  910.     /* walk through rrbs */
  911.     for (i = 0; i < 4; i++) {
  912. if (virt[i]) {
  913.     cur_rrb = i | 0xc;
  914.     cur_rrb = cur_rrb << (rrb_shift * 4);
  915.     rrb_shift--;
  916.     rrb_setting = rrb_setting | cur_rrb;
  917.     dev_rrbs[i] = dev_rrbs[i] - 1;
  918. }
  919. for (j = 0; j < dev_rrbs[i]; j++) {
  920.     cur_rrb = i | 0x8;
  921.     cur_rrb = cur_rrb << (rrb_shift * 4);
  922.     rrb_shift--;
  923.     rrb_setting = rrb_setting | cur_rrb;
  924. }
  925.     }
  926.     if (pcibr_soft)
  927. s = pcibr_lock(pcibr_soft);
  928.     bridge->b_rrb_map[even_odd].reg = rrb_setting;
  929.     if (pcibr_soft) {
  930. pcibr_soft->bs_rrb_fixed |= 0x55 << even_odd;
  931. /* since we've "FIXED" the allocations
  932.  * for these slots, we probably can dispense
  933.  * with tracking avail/res/valid data, but
  934.  * keeping it up to date helps debugging.
  935.  */
  936. pcibr_soft->bs_rrb_avail[even_odd] =
  937.     8 - (dev_1_rrbs + dev_2_rrbs + dev_3_rrbs + dev_4_rrbs);
  938. pcibr_soft->bs_rrb_res[even_odd + 0] = 0;
  939. pcibr_soft->bs_rrb_res[even_odd + 2] = 0;
  940. pcibr_soft->bs_rrb_res[even_odd + 4] = 0;
  941. pcibr_soft->bs_rrb_res[even_odd + 6] = 0;
  942. pcibr_soft->bs_rrb_valid[even_odd + 0] = dev_1_rrbs - virt1;
  943. pcibr_soft->bs_rrb_valid[even_odd + 2] = dev_2_rrbs - virt2;
  944. pcibr_soft->bs_rrb_valid[even_odd + 4] = dev_3_rrbs - virt3;
  945. pcibr_soft->bs_rrb_valid[even_odd + 6] = dev_4_rrbs - virt4;
  946. pcibr_soft->bs_rrb_valid[even_odd + 0 + PCIBR_RRB_SLOT_VIRTUAL] = virt1;
  947. pcibr_soft->bs_rrb_valid[even_odd + 2 + PCIBR_RRB_SLOT_VIRTUAL] = virt2;
  948. pcibr_soft->bs_rrb_valid[even_odd + 4 + PCIBR_RRB_SLOT_VIRTUAL] = virt3;
  949. pcibr_soft->bs_rrb_valid[even_odd + 6 + PCIBR_RRB_SLOT_VIRTUAL] = virt4;
  950. pcibr_unlock(pcibr_soft, s);
  951.     }
  952.     return 0;
  953. }
  954. /*
  955.  *    pcibr_rrb_flush: chase down all the RRBs assigned
  956.  *      to the specified connection point, and flush
  957.  *      them.
  958.  */
  959. void
  960. pcibr_rrb_flush(devfs_handle_t pconn_vhdl)
  961. {
  962.     pciio_info_t            pciio_info = pciio_info_get(pconn_vhdl);
  963.     pcibr_soft_t            pcibr_soft = (pcibr_soft_t) pciio_info_mfast_get(pciio_info);
  964.     pciio_slot_t            pciio_slot = pciio_info_slot_get(pciio_info);
  965.     bridge_t               *bridge = pcibr_soft->bs_base;
  966.     unsigned long           s;
  967.     reg_p                   rrbp;
  968.     unsigned                rrbm;
  969.     int                     i;
  970.     int                     rrbn;
  971.     unsigned                sval;
  972.     unsigned                mask;
  973.     sval = BRIDGE_RRB_EN | (pciio_slot >> 1);
  974.     mask = BRIDGE_RRB_EN | BRIDGE_RRB_PDEV;
  975.     rrbn = pciio_slot & 1;
  976.     rrbp = &bridge->b_rrb_map[rrbn].reg;
  977.     s = pcibr_lock(pcibr_soft);
  978.     rrbm = *rrbp;
  979.     for (i = 0; i < 8; ++i) {
  980. if ((rrbm & mask) == sval)
  981.     do_pcibr_rrb_flush(bridge, rrbn);
  982. rrbm >>= 4;
  983. rrbn += 2;
  984.     }
  985.     pcibr_unlock(pcibr_soft, s);
  986. }
  987. /* =====================================================================
  988.  *    Device(x) register management
  989.  */
  990. /* pcibr_try_set_device: attempt to modify Device(x)
  991.  * for the specified slot on the specified bridge
  992.  * as requested in flags, limited to the specified
  993.  * bits. Returns which BRIDGE bits were in conflict,
  994.  * or ZERO if everything went OK.
  995.  *
  996.  * Caller MUST hold pcibr_lock when calling this function.
  997.  */
  998. LOCAL int
  999. pcibr_try_set_device(pcibr_soft_t pcibr_soft,
  1000.      pciio_slot_t slot,
  1001.      unsigned flags,
  1002.      bridgereg_t mask)
  1003. {
  1004.     bridge_t               *bridge;
  1005.     pcibr_soft_slot_t       slotp;
  1006.     bridgereg_t             old;
  1007.     bridgereg_t             new;
  1008.     bridgereg_t             chg;
  1009.     bridgereg_t             bad;
  1010.     bridgereg_t             badpmu;
  1011.     bridgereg_t             badd32;
  1012.     bridgereg_t             badd64;
  1013.     bridgereg_t             fix;
  1014.     unsigned long           s;
  1015.     bridgereg_t             xmask;
  1016.     xmask = mask;
  1017.     if (pcibr_soft->bs_xbridge) {
  1018.      if (mask == BRIDGE_DEV_PMU_BITS)
  1019. xmask = XBRIDGE_DEV_PMU_BITS;
  1020. if (mask == BRIDGE_DEV_D64_BITS)
  1021. xmask = XBRIDGE_DEV_D64_BITS;
  1022.     }
  1023.     slotp = &pcibr_soft->bs_slot[slot];
  1024.     s = pcibr_lock(pcibr_soft);
  1025.     bridge = pcibr_soft->bs_base;
  1026.     old = slotp->bss_device;
  1027.     /* figure out what the desired
  1028.      * Device(x) bits are based on
  1029.      * the flags specified.
  1030.      */
  1031.     new = old;
  1032.     /* Currently, we inherit anything that
  1033.      * the new caller has not specified in
  1034.      * one way or another, unless we take
  1035.      * action here to not inherit.
  1036.      *
  1037.      * This is needed for the "swap" stuff,
  1038.      * since it could have been set via
  1039.      * pcibr_endian_set -- altho note that
  1040.      * any explicit PCIBR_BYTE_STREAM or
  1041.      * PCIBR_WORD_VALUES will freely override
  1042.      * the effect of that call (and vice
  1043.      * versa, no protection either way).
  1044.      *
  1045.      * I want to get rid of pcibr_endian_set
  1046.      * in favor of tracking DMA endianness
  1047.      * using the flags specified when DMA
  1048.      * channels are created.
  1049.      */
  1050. #define BRIDGE_DEV_WRGA_BITS (BRIDGE_DEV_PMU_WRGA_EN | BRIDGE_DEV_DIR_WRGA_EN)
  1051. #define BRIDGE_DEV_SWAP_BITS (BRIDGE_DEV_SWAP_PMU | BRIDGE_DEV_SWAP_DIR)
  1052.     /* Do not use Barrier, Write Gather,
  1053.      * or Prefetch unless asked.
  1054.      * Leave everything else as it
  1055.      * was from the last time.
  1056.      */
  1057.     new = new
  1058. & ~BRIDGE_DEV_BARRIER
  1059. & ~BRIDGE_DEV_WRGA_BITS
  1060. & ~BRIDGE_DEV_PREF
  1061. ;
  1062.     /* Generic macro flags
  1063.      */
  1064.     if (flags & PCIIO_DMA_DATA) {
  1065. new = (new
  1066.             & ~BRIDGE_DEV_BARRIER)      /* barrier off */
  1067.             | BRIDGE_DEV_PREF;          /* prefetch on */
  1068.     }
  1069.     if (flags & PCIIO_DMA_CMD) {
  1070.         new = ((new
  1071.             & ~BRIDGE_DEV_PREF)         /* prefetch off */
  1072.             & ~BRIDGE_DEV_WRGA_BITS)    /* write gather off */
  1073.             | BRIDGE_DEV_BARRIER;       /* barrier on */
  1074.     }
  1075.     /* Generic detail flags
  1076.      */
  1077.     if (flags & PCIIO_WRITE_GATHER)
  1078. new |= BRIDGE_DEV_WRGA_BITS;
  1079.     if (flags & PCIIO_NOWRITE_GATHER)
  1080. new &= ~BRIDGE_DEV_WRGA_BITS;
  1081.     if (flags & PCIIO_PREFETCH)
  1082. new |= BRIDGE_DEV_PREF;
  1083.     if (flags & PCIIO_NOPREFETCH)
  1084. new &= ~BRIDGE_DEV_PREF;
  1085.     if (flags & PCIBR_WRITE_GATHER)
  1086. new |= BRIDGE_DEV_WRGA_BITS;
  1087.     if (flags & PCIBR_NOWRITE_GATHER)
  1088. new &= ~BRIDGE_DEV_WRGA_BITS;
  1089.     if (flags & PCIIO_BYTE_STREAM)
  1090. new |= (pcibr_soft->bs_xbridge) ? 
  1091. BRIDGE_DEV_SWAP_DIR : BRIDGE_DEV_SWAP_BITS;
  1092.     if (flags & PCIIO_WORD_VALUES)
  1093. new &= (pcibr_soft->bs_xbridge) ? 
  1094. ~BRIDGE_DEV_SWAP_DIR : ~BRIDGE_DEV_SWAP_BITS;
  1095.     /* Provider-specific flags
  1096.      */
  1097.     if (flags & PCIBR_PREFETCH)
  1098. new |= BRIDGE_DEV_PREF;
  1099.     if (flags & PCIBR_NOPREFETCH)
  1100. new &= ~BRIDGE_DEV_PREF;
  1101.     if (flags & PCIBR_PRECISE)
  1102. new |= BRIDGE_DEV_PRECISE;
  1103.     if (flags & PCIBR_NOPRECISE)
  1104. new &= ~BRIDGE_DEV_PRECISE;
  1105.     if (flags & PCIBR_BARRIER)
  1106. new |= BRIDGE_DEV_BARRIER;
  1107.     if (flags & PCIBR_NOBARRIER)
  1108. new &= ~BRIDGE_DEV_BARRIER;
  1109.     if (flags & PCIBR_64BIT)
  1110. new |= BRIDGE_DEV_DEV_SIZE;
  1111.     if (flags & PCIBR_NO64BIT)
  1112. new &= ~BRIDGE_DEV_DEV_SIZE;
  1113.     chg = old ^ new; /* what are we changing, */
  1114.     chg &= xmask; /* of the interesting bits */
  1115.     if (chg) {
  1116. badd32 = slotp->bss_d32_uctr ? (BRIDGE_DEV_D32_BITS & chg) : 0;
  1117. if (pcibr_soft->bs_xbridge) {
  1118. badpmu = slotp->bss_pmu_uctr ? (XBRIDGE_DEV_PMU_BITS & chg) : 0;
  1119. badd64 = slotp->bss_d64_uctr ? (XBRIDGE_DEV_D64_BITS & chg) : 0;
  1120. } else {
  1121. badpmu = slotp->bss_pmu_uctr ? (BRIDGE_DEV_PMU_BITS & chg) : 0;
  1122. badd64 = slotp->bss_d64_uctr ? (BRIDGE_DEV_D64_BITS & chg) : 0;
  1123. }
  1124. bad = badpmu | badd32 | badd64;
  1125. if (bad) {
  1126.     /* some conflicts can be resolved by
  1127.      * forcing the bit on. this may cause
  1128.      * some performance degredation in
  1129.      * the stream(s) that want the bit off,
  1130.      * but the alternative is not allowing
  1131.      * the new stream at all.
  1132.      */
  1133.             if ( (fix = bad & (BRIDGE_DEV_PRECISE |
  1134.                              BRIDGE_DEV_BARRIER)) ){
  1135. bad &= ~fix;
  1136. /* don't change these bits if
  1137.  * they are already set in "old"
  1138.  */
  1139. chg &= ~(fix & old);
  1140.     }
  1141.     /* some conflicts can be resolved by
  1142.      * forcing the bit off. this may cause
  1143.      * some performance degredation in
  1144.      * the stream(s) that want the bit on,
  1145.      * but the alternative is not allowing
  1146.      * the new stream at all.
  1147.      */
  1148.     if ( (fix = bad & (BRIDGE_DEV_WRGA_BITS |
  1149.      BRIDGE_DEV_PREF)) ) {
  1150. bad &= ~fix;
  1151. /* don't change these bits if
  1152.  * we wanted to turn them on.
  1153.  */
  1154. chg &= ~(fix & new);
  1155.     }
  1156.     /* conflicts in other bits mean
  1157.      * we can not establish this DMA
  1158.      * channel while the other(s) are
  1159.      * still present.
  1160.      */
  1161.     if (bad) {
  1162. pcibr_unlock(pcibr_soft, s);
  1163. #if (DEBUG && PCIBR_DEV_DEBUG)
  1164. printk("pcibr_try_set_device: mod blocked by %Rn", bad, device_bits);
  1165. #endif
  1166. return bad;
  1167.     }
  1168. }
  1169.     }
  1170.     if (mask == BRIDGE_DEV_PMU_BITS)
  1171. slotp->bss_pmu_uctr++;
  1172.     if (mask == BRIDGE_DEV_D32_BITS)
  1173. slotp->bss_d32_uctr++;
  1174.     if (mask == BRIDGE_DEV_D64_BITS)
  1175. slotp->bss_d64_uctr++;
  1176.     /* the value we want to write is the
  1177.      * original value, with the bits for
  1178.      * our selected changes flipped, and
  1179.      * with any disabled features turned off.
  1180.      */
  1181.     new = old ^ chg; /* only change what we want to change */
  1182.     if (slotp->bss_device == new) {
  1183. pcibr_unlock(pcibr_soft, s);
  1184. return 0;
  1185.     }
  1186.     bridge->b_device[slot].reg = new;
  1187.     slotp->bss_device = new;
  1188.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  1189.     pcibr_unlock(pcibr_soft, s);
  1190. #if DEBUG && PCIBR_DEV_DEBUG
  1191.     printk("pcibr Device(%d): 0x%pn", slot, bridge->b_device[slot].reg);
  1192. #endif
  1193.     return 0;
  1194. }
  1195. void
  1196. pcibr_release_device(pcibr_soft_t pcibr_soft,
  1197.      pciio_slot_t slot,
  1198.      bridgereg_t mask)
  1199. {
  1200.     pcibr_soft_slot_t       slotp;
  1201.     unsigned long           s;
  1202.     slotp = &pcibr_soft->bs_slot[slot];
  1203.     s = pcibr_lock(pcibr_soft);
  1204.     if (mask == BRIDGE_DEV_PMU_BITS)
  1205. slotp->bss_pmu_uctr--;
  1206.     if (mask == BRIDGE_DEV_D32_BITS)
  1207. slotp->bss_d32_uctr--;
  1208.     if (mask == BRIDGE_DEV_D64_BITS)
  1209. slotp->bss_d64_uctr--;
  1210.     pcibr_unlock(pcibr_soft, s);
  1211. }
  1212. /*
  1213.  * flush write gather buffer for slot
  1214.  */
  1215. LOCAL void
  1216. pcibr_device_write_gather_flush(pcibr_soft_t pcibr_soft,
  1217.               pciio_slot_t slot)
  1218. {
  1219.     bridge_t               *bridge;
  1220.     unsigned long          s;
  1221.     volatile uint32_t     wrf;
  1222.     s = pcibr_lock(pcibr_soft);
  1223.     bridge = pcibr_soft->bs_base;
  1224.     wrf = bridge->b_wr_req_buf[slot].reg;
  1225.     pcibr_unlock(pcibr_soft, s);
  1226. }
  1227. /* =====================================================================
  1228.  *    Bridge (pcibr) "Device Driver" entry points
  1229.  */
  1230. /*
  1231.  * pcibr_probe_slot: read a config space word
  1232.  * while trapping any errors; reutrn zero if
  1233.  * all went OK, or nonzero if there was an error.
  1234.  * The value read, if any, is passed back
  1235.  * through the valp parameter.
  1236.  */
  1237. LOCAL int
  1238. pcibr_probe_slot(bridge_t *bridge,
  1239.  cfg_p cfg,
  1240.  unsigned *valp)
  1241. {
  1242.     int                     rv;
  1243.     bridgereg_t             old_enable, new_enable;
  1244.     int badaddr_val(volatile void *, int, volatile void *);
  1245.     old_enable = bridge->b_int_enable;
  1246.     new_enable = old_enable & ~BRIDGE_IMR_PCI_MST_TIMEOUT;
  1247.     bridge->b_int_enable = new_enable;
  1248. /*
  1249.  * The xbridge doesn't clear b_err_int_view unless
  1250.  * multi-err is cleared...
  1251.  */
  1252. if (is_xbridge(bridge))
  1253.     if (bridge->b_err_int_view & BRIDGE_ISR_PCI_MST_TIMEOUT) {
  1254. bridge->b_int_rst_stat = BRIDGE_IRR_MULTI_CLR;
  1255.     }
  1256.     if (bridge->b_int_status & BRIDGE_IRR_PCI_GRP) {
  1257. bridge->b_int_rst_stat = BRIDGE_IRR_PCI_GRP_CLR;
  1258. (void) bridge->b_wid_tflush; /* flushbus */
  1259.     }
  1260.     rv = badaddr_val((void *) cfg, 4, valp);
  1261. /*
  1262.  * The xbridge doesn't set master timeout in b_int_status
  1263.  * here.  Fortunately it's in error_interrupt_view.
  1264.  */
  1265. if (is_xbridge(bridge))
  1266.     if (bridge->b_err_int_view & BRIDGE_ISR_PCI_MST_TIMEOUT) {
  1267. bridge->b_int_rst_stat = BRIDGE_IRR_MULTI_CLR;
  1268. rv = 1; /* unoccupied slot */
  1269.     }
  1270.     bridge->b_int_enable = old_enable;
  1271.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  1272.     return rv;
  1273. }
  1274. /*
  1275.  *    pcibr_init: called once during system startup or
  1276.  *      when a loadable driver is loaded.
  1277.  *
  1278.  *      The driver_register function should normally
  1279.  *      be in _reg, not _init.  But the pcibr driver is
  1280.  *      required by devinit before the _reg routines
  1281.  *      are called, so this is an exception.
  1282.  */
  1283. void
  1284. pcibr_init(void)
  1285. {
  1286. #if DEBUG && ATTACH_DEBUG
  1287.     printk("pcibr_initn");
  1288. #endif
  1289.     xwidget_driver_register(XBRIDGE_WIDGET_PART_NUM,
  1290.     XBRIDGE_WIDGET_MFGR_NUM,
  1291.     "pcibr_",
  1292.     0);
  1293.     xwidget_driver_register(BRIDGE_WIDGET_PART_NUM,
  1294.     BRIDGE_WIDGET_MFGR_NUM,
  1295.     "pcibr_",
  1296.     0);
  1297. }
  1298. /*
  1299.  * open/close mmap/munmap interface would be used by processes
  1300.  * that plan to map the PCI bridge, and muck around with the
  1301.  * registers. This is dangerous to do, and will be allowed
  1302.  * to a select brand of programs. Typically these are
  1303.  * diagnostics programs, or some user level commands we may
  1304.  * write to do some weird things.
  1305.  * To start with expect them to have root priveleges.
  1306.  * We will ask for more later.
  1307.  */
  1308. /* ARGSUSED */
  1309. int
  1310. pcibr_open(devfs_handle_t *devp, int oflag, int otyp, cred_t *credp)
  1311. {
  1312.     return 0;
  1313. }
  1314. /*ARGSUSED */
  1315. int
  1316. pcibr_close(devfs_handle_t dev, int oflag, int otyp, cred_t *crp)
  1317. {
  1318.     return 0;
  1319. }
  1320. /*ARGSUSED */
  1321. int
  1322. pcibr_map(devfs_handle_t dev, vhandl_t *vt, off_t off, size_t len, uint prot)
  1323. {
  1324.     int                     error;
  1325.     devfs_handle_t            vhdl = dev_to_vhdl(dev);
  1326.     devfs_handle_t            pcibr_vhdl = hwgraph_connectpt_get(vhdl);
  1327.     pcibr_soft_t            pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  1328.     bridge_t               *bridge = pcibr_soft->bs_base;
  1329.     hwgraph_vertex_unref(pcibr_vhdl);
  1330.     ASSERT(pcibr_soft);
  1331.     len = ctob(btoc(len)); /* Make len page aligned */
  1332.     error = v_mapphys(vt, (void *) ((__psunsigned_t) bridge + off), len);
  1333.     /*
  1334.      * If the offset being mapped corresponds to the flash prom
  1335.      * base, and if the mapping succeeds, and if the user
  1336.      * has requested the protections to be WRITE, enable the
  1337.      * flash prom to be written.
  1338.      *
  1339.      * XXX- deprecate this in favor of using the
  1340.      * real flash driver ...
  1341.      */
  1342.     if (!error &&
  1343. ((off == BRIDGE_EXTERNAL_FLASH) ||
  1344.  (len > BRIDGE_EXTERNAL_FLASH))) {
  1345. int                     s;
  1346. /*
  1347.  * ensure that we write and read without any interruption.
  1348.  * The read following the write is required for the Bridge war
  1349.  */
  1350. s = splhi();
  1351. bridge->b_wid_control |= BRIDGE_CTRL_FLASH_WR_EN;
  1352. bridge->b_wid_control; /* inval addr bug war */
  1353. splx(s);
  1354.     }
  1355.     return error;
  1356. }
  1357. /*ARGSUSED */
  1358. int
  1359. pcibr_unmap(devfs_handle_t dev, vhandl_t *vt)
  1360. {
  1361.     devfs_handle_t            pcibr_vhdl = hwgraph_connectpt_get((devfs_handle_t) dev);
  1362.     pcibr_soft_t            pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  1363.     bridge_t               *bridge = pcibr_soft->bs_base;
  1364.     hwgraph_vertex_unref(pcibr_vhdl);
  1365.     /*
  1366.      * If flashprom write was enabled, disable it, as
  1367.      * this is the last unmap.
  1368.      */
  1369.     if (bridge->b_wid_control & BRIDGE_CTRL_FLASH_WR_EN) {
  1370. int                     s;
  1371. /*
  1372.  * ensure that we write and read without any interruption.
  1373.  * The read following the write is required for the Bridge war
  1374.  */
  1375. s = splhi();
  1376. bridge->b_wid_control &= ~BRIDGE_CTRL_FLASH_WR_EN;
  1377. bridge->b_wid_control; /* inval addr bug war */
  1378. splx(s);
  1379.     }
  1380.     return 0;
  1381. }
  1382. /* This is special case code used by grio. There are plans to make
  1383.  * this a bit more general in the future, but till then this should
  1384.  * be sufficient.
  1385.  */
  1386. pciio_slot_t
  1387. pcibr_device_slot_get(devfs_handle_t dev_vhdl)
  1388. {
  1389.     char                    devname[MAXDEVNAME];
  1390.     devfs_handle_t            tdev;
  1391.     pciio_info_t            pciio_info;
  1392.     pciio_slot_t            slot = PCIIO_SLOT_NONE;
  1393.     vertex_to_name(dev_vhdl, devname, MAXDEVNAME);
  1394.     /* run back along the canonical path
  1395.      * until we find a PCI connection point.
  1396.      */
  1397.     tdev = hwgraph_connectpt_get(dev_vhdl);
  1398.     while (tdev != GRAPH_VERTEX_NONE) {
  1399. pciio_info = pciio_info_chk(tdev);
  1400. if (pciio_info) {
  1401.     slot = pciio_info_slot_get(pciio_info);
  1402.     break;
  1403. }
  1404. hwgraph_vertex_unref(tdev);
  1405. tdev = hwgraph_connectpt_get(tdev);
  1406.     }
  1407.     hwgraph_vertex_unref(tdev);
  1408.     return slot;
  1409. }
  1410. /*==========================================================================
  1411.  * BRIDGE PCI SLOT RELATED IOCTLs
  1412.  */
  1413. char *pci_space_name[] = {"NONE", 
  1414.   "ROM",
  1415.   "IO",
  1416.   "",
  1417.   "MEM",
  1418.   "MEM32",
  1419.   "MEM64",
  1420.   "CFG",
  1421.   "WIN0",
  1422.   "WIN1",
  1423.   "WIN2",
  1424.   "WIN3",
  1425.   "WIN4",
  1426.   "WIN5",
  1427.   "",
  1428.   "BAD"};
  1429. #ifdef LATER
  1430. void
  1431. pcibr_slot_func_info_return(pcibr_info_h pcibr_infoh,
  1432.                             int func,
  1433.                             pcibr_slot_func_info_resp_t funcp)
  1434. {
  1435.     pcibr_info_t                 pcibr_info = pcibr_infoh[func];
  1436.     int                          win;
  1437.     funcp->resp_f_status = 0;
  1438.     if (!pcibr_info) {
  1439.         return;
  1440.     }
  1441.     funcp->resp_f_status |= FUNC_IS_VALID;
  1442. #ifdef SUPPORT_PRINTING_V_FORMAT
  1443.     sprintf(funcp->resp_f_slot_name, "%v", pcibr_info->f_vertex);
  1444. #else
  1445.     sprintf(funcp->resp_f_slot_name, "%x", pcibr_info->f_vertex);
  1446. #endif
  1447.     if(is_sys_critical_vertex(pcibr_info->f_vertex)) {
  1448.         funcp->resp_f_status |= FUNC_IS_SYS_CRITICAL;
  1449.     }
  1450.     funcp->resp_f_bus = pcibr_info->f_bus;
  1451.     funcp->resp_f_slot = pcibr_info->f_slot;
  1452.     funcp->resp_f_func = pcibr_info->f_func;
  1453. #ifdef SUPPORT_PRINTING_V_FORMAT
  1454.     sprintf(funcp->resp_f_master_name, "%v", pcibr_info->f_master);
  1455. #else
  1456.     sprintf(funcp->resp_f_master_name, "%x", pcibr_info->f_master);
  1457. #endif
  1458.     funcp->resp_f_pops = pcibr_info->f_pops;
  1459.     funcp->resp_f_efunc = pcibr_info->f_efunc;
  1460.     funcp->resp_f_einfo = pcibr_info->f_einfo;
  1461.     funcp->resp_f_vendor = pcibr_info->f_vendor;
  1462.     funcp->resp_f_device = pcibr_info->f_device;
  1463.     for(win = 0 ; win < 6 ; win++) {
  1464.         funcp->resp_f_window[win].resp_w_base =
  1465.                                   pcibr_info->f_window[win].w_base;
  1466.         funcp->resp_f_window[win].resp_w_size =
  1467.                                   pcibr_info->f_window[win].w_size;
  1468.         sprintf(funcp->resp_f_window[win].resp_w_space,
  1469.                 "%s",
  1470.                 pci_space_name[pcibr_info->f_window[win].w_space]);
  1471.     }
  1472.     funcp->resp_f_rbase = pcibr_info->f_rbase;
  1473.     funcp->resp_f_rsize = pcibr_info->f_rsize;
  1474.     for (win = 0 ; win < 4; win++) {
  1475.         funcp->resp_f_ibit[win] = pcibr_info->f_ibit[win];
  1476.     }
  1477.     funcp->resp_f_att_det_error = pcibr_info->f_att_det_error;
  1478. }
  1479. int
  1480. pcibr_slot_info_return(pcibr_soft_t             pcibr_soft,
  1481.                        pciio_slot_t             slot,
  1482.                        pcibr_slot_info_resp_t   respp)
  1483. {
  1484.     pcibr_soft_slot_t            pss;
  1485.     int                          func;
  1486.     bridge_t                    *bridge = pcibr_soft->bs_base;
  1487.     reg_p                        b_respp;
  1488.     pcibr_slot_info_resp_t       slotp;
  1489.     pcibr_slot_func_info_resp_t  funcp;
  1490.     slotp = snia_kmem_zalloc(sizeof(*slotp), KM_SLEEP);
  1491.     if (slotp == NULL) {
  1492.         return(ENOMEM);
  1493.     }
  1494.     pss = &pcibr_soft->bs_slot[slot];
  1495.     
  1496.     printk("nPCI INFRASTRUCTURAL INFO FOR SLOT %dnn", slot);
  1497.     slotp->resp_has_host = pss->has_host;
  1498.     slotp->resp_host_slot = pss->host_slot;
  1499. #ifdef SUPPORT_PRINTING_V_FORMAT
  1500.     sprintf(slotp->resp_slot_conn_name, "%v", pss->slot_conn);
  1501. #else
  1502.     sprintf(slotp->resp_slot_conn_name, "%x", pss->slot_conn);
  1503. #endif
  1504.     slotp->resp_slot_status = pss->slot_status;
  1505.     slotp->resp_l1_bus_num = io_path_map_widget(pcibr_soft->bs_vhdl);
  1506.     if (is_sys_critical_vertex(pss->slot_conn)) {
  1507.         slotp->resp_slot_status |= SLOT_IS_SYS_CRITICAL;
  1508.     }
  1509.     slotp->resp_bss_ninfo = pss->bss_ninfo;
  1510.     for (func = 0; func < pss->bss_ninfo; func++) {
  1511.         funcp = &(slotp->resp_func[func]);
  1512.         pcibr_slot_func_info_return(pss->bss_infos, func, funcp);
  1513.     }
  1514.     sprintf(slotp->resp_bss_devio_bssd_space, "%s",
  1515.             pci_space_name[pss->bss_devio.bssd_space]);
  1516.     slotp->resp_bss_devio_bssd_base = pss->bss_devio.bssd_base;
  1517.     slotp->resp_bss_device = pss->bss_device;
  1518.     slotp->resp_bss_pmu_uctr = pss->bss_pmu_uctr;
  1519.     slotp->resp_bss_d32_uctr = pss->bss_d32_uctr;
  1520.     slotp->resp_bss_d64_uctr = pss->bss_d64_uctr;
  1521.     slotp->resp_bss_d64_base = pss->bss_d64_base;
  1522.     slotp->resp_bss_d64_flags = pss->bss_d64_flags;
  1523.     slotp->resp_bss_d32_base = pss->bss_d32_base;
  1524.     slotp->resp_bss_d32_flags = pss->bss_d32_flags;
  1525.     slotp->resp_bss_ext_ates_active = atomic_read(&pss->bss_ext_ates_active);
  1526.     slotp->resp_bss_cmd_pointer = pss->bss_cmd_pointer;
  1527.     slotp->resp_bss_cmd_shadow = pss->bss_cmd_shadow;
  1528.     slotp->resp_bs_rrb_valid = pcibr_soft->bs_rrb_valid[slot];
  1529.     slotp->resp_bs_rrb_valid_v = pcibr_soft->bs_rrb_valid[slot +
  1530.                                                       PCIBR_RRB_SLOT_VIRTUAL];
  1531.     slotp->resp_bs_rrb_res = pcibr_soft->bs_rrb_res[slot];
  1532.     if (slot & 1) {
  1533.         b_respp = &bridge->b_odd_resp;
  1534.     } else {
  1535.         b_respp = &bridge->b_even_resp;
  1536.     }
  1537.     slotp->resp_b_resp = *b_respp;
  1538.     slotp->resp_b_int_device = bridge->b_int_device;
  1539.     slotp->resp_b_int_enable = bridge->b_int_enable;
  1540.     slotp->resp_b_int_host = bridge->b_int_addr[slot].addr;
  1541.     if (COPYOUT(slotp, respp, sizeof(*respp))) {
  1542.         return(EFAULT);
  1543.     }
  1544.     snia_kmem_free(slotp, sizeof(*slotp));
  1545.     return(0);
  1546. }
  1547. /*
  1548.  * pcibr_slot_query
  1549.  * Return information about the PCI slot maintained by the infrastructure.
  1550.  * Information is requested in the request structure.
  1551.  *
  1552.  *      Information returned in the response structure:
  1553.  * Slot hwgraph name
  1554.  * Vendor/Device info
  1555.  * Base register info
  1556.  * Interrupt mapping from device pins to the bridge pins
  1557.  * Devio register
  1558.  * Software RRB info
  1559.  * RRB register info
  1560.  * Host/Gues info
  1561.  * PCI Bus #,slot #, function #
  1562.  * Slot provider hwgraph name
  1563.  * Provider Functions
  1564.  * Error handler
  1565.  * DMA mapping usage counters
  1566.  * DMA direct translation info
  1567.  * External SSRAM workaround info
  1568.  */
  1569. int
  1570. pcibr_slot_query(devfs_handle_t pcibr_vhdl, pcibr_slot_info_req_t reqp)
  1571. {
  1572.     pcibr_soft_t            pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  1573.     pciio_slot_t            slot = reqp->req_slot;
  1574.     pciio_slot_t            tmp_slot;
  1575.     pcibr_slot_info_resp_t  respp = (pcibr_slot_info_resp_t) reqp->req_respp;
  1576.     int                     size = reqp->req_size;
  1577.     int                     error;
  1578.     /* Make sure that we are dealing with a bridge device vertex */
  1579.     if (!pcibr_soft) {
  1580.         return(EINVAL);
  1581.     }
  1582.     /* Make sure that we have a valid PCI slot number or PCIIO_SLOT_NONE */
  1583.     if ((!PCIBR_VALID_SLOT(slot)) && (slot != PCIIO_SLOT_NONE)) {
  1584.         return(EINVAL);
  1585.     }
  1586.     /* Return information for the requested PCI slot */
  1587.     if (slot != PCIIO_SLOT_NONE) {
  1588.         if (size < sizeof(*respp)) {
  1589.             return(EINVAL);
  1590.         }
  1591.         /* Acquire read access to the slot */
  1592.         mrlock(pcibr_soft->bs_slot[slot].slot_lock, MR_ACCESS, PZERO);
  1593.         error = pcibr_slot_info_return(pcibr_soft, slot, respp);
  1594.         /* Release the slot lock */
  1595.         mrunlock(pcibr_soft->bs_slot[slot].slot_lock);
  1596.         return(error);
  1597.     }
  1598.     /* Return information for all the slots */
  1599.     for (tmp_slot = 0; tmp_slot < 8; tmp_slot++) {
  1600.         if (size < sizeof(*respp)) {
  1601.             return(EINVAL);
  1602.         }
  1603.         /* Acquire read access to the slot */
  1604.         mrlock(pcibr_soft->bs_slot[tmp_slot].slot_lock, MR_ACCESS, PZERO);
  1605.         error = pcibr_slot_info_return(pcibr_soft, tmp_slot, respp);
  1606.         /* Release the slot lock */
  1607.         mrunlock(pcibr_soft->bs_slot[tmp_slot].slot_lock);
  1608.         if (error) {
  1609.             return(error);
  1610.         }
  1611.         ++respp;
  1612.         size -= sizeof(*respp);
  1613.     }
  1614.     return(error);
  1615. }
  1616. #endif /* LATER */
  1617. /*ARGSUSED */
  1618. int
  1619. pcibr_ioctl(devfs_handle_t dev,
  1620.     int cmd,
  1621.     void *arg,
  1622.     int flag,
  1623.     struct cred *cr,
  1624.     int *rvalp)
  1625. {
  1626.     devfs_handle_t            pcibr_vhdl = hwgraph_connectpt_get((devfs_handle_t)dev);
  1627. #ifdef LATER
  1628.     pcibr_soft_t            pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  1629. #endif
  1630.     int                     error = 0;
  1631.     hwgraph_vertex_unref(pcibr_vhdl);
  1632.     switch (cmd) {
  1633. #ifdef LATER
  1634.     case GIOCSETBW:
  1635. {
  1636.     grio_ioctl_info_t       info;
  1637.     pciio_slot_t            slot = 0;
  1638.     if (!cap_able((uint64_t)CAP_DEVICE_MGT)) {
  1639. error = EPERM;
  1640. break;
  1641.     }
  1642.     if (COPYIN(arg, &info, sizeof(grio_ioctl_info_t))) {
  1643. error = EFAULT;
  1644. break;
  1645.     }
  1646. #ifdef GRIO_DEBUG
  1647.     printk("pcibr:: prev_vhdl: %d reqbw: %lldn",
  1648.     info.prev_vhdl, info.reqbw);
  1649. #endif /* GRIO_DEBUG */
  1650.     if ((slot = pcibr_device_slot_get(info.prev_vhdl)) ==
  1651. PCIIO_SLOT_NONE) {
  1652. error = EIO;
  1653. break;
  1654.     }
  1655.     if (info.reqbw)
  1656. pcibr_priority_bits_set(pcibr_soft, slot, PCI_PRIO_HIGH);
  1657.     break;
  1658. }
  1659.     case GIOCRELEASEBW:
  1660. {
  1661.     grio_ioctl_info_t       info;
  1662.     pciio_slot_t            slot = 0;
  1663.     if (!cap_able(CAP_DEVICE_MGT)) {
  1664. error = EPERM;
  1665. break;
  1666.     }
  1667.     if (COPYIN(arg, &info, sizeof(grio_ioctl_info_t))) {
  1668. error = EFAULT;
  1669. break;
  1670.     }
  1671. #ifdef GRIO_DEBUG
  1672.     printk("pcibr:: prev_vhdl: %d reqbw: %lldn",
  1673.     info.prev_vhdl, info.reqbw);
  1674. #endif /* GRIO_DEBUG */
  1675.     if ((slot = pcibr_device_slot_get(info.prev_vhdl)) ==
  1676. PCIIO_SLOT_NONE) {
  1677. error = EIO;
  1678. break;
  1679.     }
  1680.     if (info.reqbw)
  1681. pcibr_priority_bits_set(pcibr_soft, slot, PCI_PRIO_LOW);
  1682.     break;
  1683. }
  1684.     case PCIBR_SLOT_POWERUP:
  1685. {
  1686.     pciio_slot_t slot;
  1687.     if (!cap_able(CAP_DEVICE_MGT)) {
  1688. error = EPERM;
  1689. break;
  1690.     }
  1691.     slot = (pciio_slot_t)(uint64_t)arg;
  1692.     error = pcibr_slot_powerup(pcibr_vhdl,slot);
  1693.     break;
  1694. }
  1695.     case PCIBR_SLOT_SHUTDOWN:
  1696.     if (!cap_able(CAP_DEVICE_MGT)) {
  1697. error = EPERM;
  1698. break;
  1699.     }
  1700.     slot = (pciio_slot_t)(uint64_t)arg;
  1701.     error = pcibr_slot_powerup(pcibr_vhdl,slot);
  1702.     break;
  1703. }
  1704.     case PCIBR_SLOT_QUERY:
  1705. {
  1706.     struct pcibr_slot_info_req_s        req;
  1707.     if (!cap_able(CAP_DEVICE_MGT)) {
  1708. error = EPERM;
  1709. break;
  1710.     }
  1711.             if (COPYIN(arg, &req, sizeof(req))) {
  1712.                 error = EFAULT;
  1713.                 break;
  1714.             }
  1715.             error = pcibr_slot_query(pcibr_vhdl, &req);
  1716.     break;
  1717. }
  1718. #endif /* LATER */
  1719.     default:
  1720. break;
  1721.     }
  1722.     return error;
  1723. }
  1724. void
  1725. pcibr_freeblock_sub(iopaddr_t *free_basep,
  1726.     iopaddr_t *free_lastp,
  1727.     iopaddr_t base,
  1728.     size_t size)
  1729. {
  1730.     iopaddr_t               free_base = *free_basep;
  1731.     iopaddr_t               free_last = *free_lastp;
  1732.     iopaddr_t               last = base + size - 1;
  1733.     if ((last < free_base) || (base > free_last)); /* free block outside arena */
  1734.     else if ((base <= free_base) && (last >= free_last))
  1735. /* free block contains entire arena */
  1736. *free_basep = *free_lastp = 0;
  1737.     else if (base <= free_base)
  1738. /* free block is head of arena */
  1739. *free_basep = last + 1;
  1740.     else if (last >= free_last)
  1741. /* free block is tail of arena */
  1742. *free_lastp = base - 1;
  1743.     /*
  1744.      * We are left with two regions: the free area
  1745.      * in the arena "below" the block, and the free
  1746.      * area in the arena "above" the block. Keep
  1747.      * the one that is bigger.
  1748.      */
  1749.     else if ((base - free_base) > (free_last - last))
  1750. *free_lastp = base - 1; /* keep lower chunk */
  1751.     else
  1752. *free_basep = last + 1; /* keep upper chunk */
  1753. }
  1754. /* Convert from ssram_bits in control register to number of SSRAM entries */
  1755. #define ATE_NUM_ENTRIES(n) _ate_info[n]
  1756. /* Possible choices for number of ATE entries in Bridge's SSRAM */
  1757. LOCAL int               _ate_info[] =
  1758. {
  1759.     0, /* 0 entries */
  1760.     8 * 1024, /* 8K entries */
  1761.     16 * 1024, /* 16K entries */
  1762.     64 * 1024 /* 64K entries */
  1763. };
  1764. #define ATE_NUM_SIZES (sizeof(_ate_info) / sizeof(int))
  1765. #define ATE_PROBE_VALUE 0x0123456789abcdefULL
  1766. /*
  1767.  * Determine the size of this bridge's external mapping SSRAM, and set
  1768.  * the control register appropriately to reflect this size, and initialize
  1769.  * the external SSRAM.
  1770.  */
  1771. LOCAL int
  1772. pcibr_init_ext_ate_ram(bridge_t *bridge)
  1773. {
  1774.     int                     largest_working_size = 0;
  1775.     int                     num_entries, entry;
  1776.     int                     i, j;
  1777.     bridgereg_t             old_enable, new_enable;
  1778.     int                     s;
  1779.     /* Probe SSRAM to determine its size. */
  1780.     old_enable = bridge->b_int_enable;
  1781.     new_enable = old_enable & ~BRIDGE_IMR_PCI_MST_TIMEOUT;
  1782.     bridge->b_int_enable = new_enable;
  1783.     for (i = 1; i < ATE_NUM_SIZES; i++) {
  1784. /* Try writing a value */
  1785. bridge->b_ext_ate_ram[ATE_NUM_ENTRIES(i) - 1] = ATE_PROBE_VALUE;
  1786. /* Guard against wrap */
  1787. for (j = 1; j < i; j++)
  1788.     bridge->b_ext_ate_ram[ATE_NUM_ENTRIES(j) - 1] = 0;
  1789. /* See if value was written */
  1790. if (bridge->b_ext_ate_ram[ATE_NUM_ENTRIES(i) - 1] == ATE_PROBE_VALUE)
  1791.     largest_working_size = i;
  1792.     }
  1793.     bridge->b_int_enable = old_enable;
  1794.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  1795.     /*
  1796.      * ensure that we write and read without any interruption.
  1797.      * The read following the write is required for the Bridge war
  1798.      */
  1799.     s = splhi();
  1800.     bridge->b_wid_control = (bridge->b_wid_control
  1801. & ~BRIDGE_CTRL_SSRAM_SIZE_MASK)
  1802. | BRIDGE_CTRL_SSRAM_SIZE(largest_working_size);
  1803.     bridge->b_wid_control; /* inval addr bug war */
  1804.     splx(s);
  1805.     num_entries = ATE_NUM_ENTRIES(largest_working_size);
  1806. #if PCIBR_ATE_DEBUG
  1807.     if (num_entries)
  1808. printk("bridge at 0x%x: clearing %d external ATEsn", bridge, num_entries);
  1809.     else
  1810. printk("bridge at 0x%x: no externa9422l ATE RAM foundn", bridge);
  1811. #endif
  1812.     /* Initialize external mapping entries */
  1813.     for (entry = 0; entry < num_entries; entry++)
  1814. bridge->b_ext_ate_ram[entry] = 0;
  1815.     return (num_entries);
  1816. }
  1817. /*
  1818.  * Allocate "count" contiguous Bridge Address Translation Entries
  1819.  * on the specified bridge to be used for PCI to XTALK mappings.
  1820.  * Indices in rm map range from 1..num_entries.  Indicies returned
  1821.  * to caller range from 0..num_entries-1.
  1822.  *
  1823.  * Return the start index on success, -1 on failure.
  1824.  */
  1825. LOCAL int
  1826. pcibr_ate_alloc(pcibr_soft_t pcibr_soft, int count)
  1827. {
  1828.     int                     index = 0;
  1829.     index = (int) rmalloc(pcibr_soft->bs_int_ate_map, (size_t) count);
  1830. /* printk("Colin: pcibr_ate_alloc - index %d count %d n", index, count); */
  1831.     if (!index && pcibr_soft->bs_ext_ate_map)
  1832. index = (int) rmalloc(pcibr_soft->bs_ext_ate_map, (size_t) count);
  1833.     /* rmalloc manages resources in the 1..n
  1834.      * range, with 0 being failure.
  1835.      * pcibr_ate_alloc manages resources
  1836.      * in the 0..n-1 range, with -1 being failure.
  1837.      */
  1838.     return index - 1;
  1839. }
  1840. LOCAL void
  1841. pcibr_ate_free(pcibr_soft_t pcibr_soft, int index, int count)
  1842. /* Who says there's no such thing as a free meal? :-) */
  1843. {
  1844.     /* note the "+1" since rmalloc handles 1..n but
  1845.      * we start counting ATEs at zero.
  1846.      */
  1847. /* printk("Colin: pcibr_ate_free - index %d count %dn", index, count); */
  1848.     rmfree((index < pcibr_soft->bs_int_ate_size)
  1849.    ? pcibr_soft->bs_int_ate_map
  1850.    : pcibr_soft->bs_ext_ate_map,
  1851.    count, index + 1);
  1852. }
  1853. LOCAL pcibr_info_t
  1854. pcibr_info_get(devfs_handle_t vhdl)
  1855. {
  1856.     return (pcibr_info_t) pciio_info_get(vhdl);
  1857. }
  1858. pcibr_info_t
  1859. pcibr_device_info_new(
  1860.  pcibr_soft_t pcibr_soft,
  1861.  pciio_slot_t slot,
  1862.  pciio_function_t rfunc,
  1863.  pciio_vendor_id_t vendor,
  1864.  pciio_device_id_t device)
  1865. {
  1866.     pcibr_info_t            pcibr_info;
  1867.     pciio_function_t        func;
  1868.     int                     ibit;
  1869.     func = (rfunc == PCIIO_FUNC_NONE) ? 0 : rfunc;
  1870.     NEW(pcibr_info);
  1871.     pciio_device_info_new(&pcibr_info->f_c,
  1872.   pcibr_soft->bs_vhdl,
  1873.   slot, rfunc,
  1874.   vendor, device);
  1875.     if (slot != PCIIO_SLOT_NONE) {
  1876. /*
  1877.  * Currently favored mapping from PCI
  1878.  * slot number and INTA/B/C/D to Bridge
  1879.  * PCI Interrupt Bit Number:
  1880.  *
  1881.  *     SLOT     A B C D
  1882.  *      0       0 4 0 4
  1883.  *      1       1 5 1 5
  1884.  *      2       2 6 2 6
  1885.  *      3       3 7 3 7
  1886.  *      4       4 0 4 0
  1887.  *      5       5 1 5 1
  1888.  *      6       6 2 6 2
  1889.  *      7       7 3 7 3
  1890.  *
  1891.  * XXX- allow pcibr_hints to override default
  1892.  * XXX- allow ADMIN to override pcibr_hints
  1893.  */
  1894. for (ibit = 0; ibit < 4; ++ibit)
  1895.     pcibr_info->f_ibit[ibit] =
  1896. (slot + 4 * ibit) & 7;
  1897. /*
  1898.  * Record the info in the sparse func info space.
  1899.  */
  1900. if (func < pcibr_soft->bs_slot[slot].bss_ninfo)
  1901.     pcibr_soft->bs_slot[slot].bss_infos[func] = pcibr_info;
  1902.     }
  1903.     return pcibr_info;
  1904. }
  1905. void
  1906. pcibr_device_info_free(devfs_handle_t pcibr_vhdl, pciio_slot_t slot)
  1907. {
  1908.     pcibr_soft_t pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  1909.     pcibr_info_t pcibr_info;
  1910.     pciio_function_t func;
  1911.     pcibr_soft_slot_t slotp = &pcibr_soft->bs_slot[slot];
  1912.     int nfunc = slotp->bss_ninfo;
  1913.     for (func = 0; func < nfunc; func++) {
  1914. pcibr_info = slotp->bss_infos[func];
  1915. if (!pcibr_info) 
  1916.     continue;
  1917. slotp->bss_infos[func] = 0;
  1918. pciio_device_info_unregister(pcibr_vhdl, &pcibr_info->f_c);
  1919. pciio_device_info_free(&pcibr_info->f_c);
  1920. DEL(pcibr_info);
  1921.     }
  1922.     /* Clear the DEVIO(x) for this slot */
  1923.     slotp->bss_devio.bssd_space = PCIIO_SPACE_NONE;
  1924.     slotp->bss_devio.bssd_base = PCIBR_D32_BASE_UNSET;
  1925.     slotp->bss_device  = 0;
  1926.     
  1927.     /* Reset the mapping usage counters */
  1928.     slotp->bss_pmu_uctr = 0;
  1929.     slotp->bss_d32_uctr = 0;
  1930.     slotp->bss_d64_uctr = 0;
  1931.     /* Clear the Direct translation info */
  1932.     slotp->bss_d64_base = PCIBR_D64_BASE_UNSET;
  1933.     slotp->bss_d64_flags = 0;
  1934.     slotp->bss_d32_base = PCIBR_D32_BASE_UNSET;
  1935.     slotp->bss_d32_flags = 0;
  1936.     /* Clear out shadow info necessary for the external SSRAM workaround */
  1937.     slotp->bss_ext_ates_active = ATOMIC_INIT(0);
  1938.     slotp->bss_cmd_pointer = 0;
  1939.     slotp->bss_cmd_shadow = 0;
  1940. }
  1941. /* 
  1942.  * PCI_ADDR_SPACE_LIMITS_LOAD
  1943.  * Gets the current values of 
  1944.  * pci io base, 
  1945.  * pci io last,
  1946.  * pci low memory base,
  1947.  * pci low memory last,
  1948.  * pci high memory base,
  1949.  *  pci high memory last
  1950.  */
  1951. #define PCI_ADDR_SPACE_LIMITS_LOAD()
  1952.     pci_io_fb = pcibr_soft->bs_spinfo.pci_io_base;
  1953.     pci_io_fl = pcibr_soft->bs_spinfo.pci_io_last;
  1954.     pci_lo_fb = pcibr_soft->bs_spinfo.pci_swin_base;
  1955.     pci_lo_fl = pcibr_soft->bs_spinfo.pci_swin_last;
  1956.     pci_hi_fb = pcibr_soft->bs_spinfo.pci_mem_base;
  1957.     pci_hi_fl = pcibr_soft->bs_spinfo.pci_mem_last;
  1958. /*
  1959.  * PCI_ADDR_SPACE_LIMITS_STORE
  1960.  * Sets the current values of
  1961.  * pci io base, 
  1962.  * pci io last,
  1963.  * pci low memory base,
  1964.  * pci low memory last,
  1965.  * pci high memory base,
  1966.  *  pci high memory last
  1967.  */
  1968. #define PCI_ADDR_SPACE_LIMITS_STORE()
  1969.     pcibr_soft->bs_spinfo.pci_io_base = pci_io_fb;
  1970.     pcibr_soft->bs_spinfo.pci_io_last = pci_io_fl;
  1971.     pcibr_soft->bs_spinfo.pci_swin_base = pci_lo_fb;
  1972.     pcibr_soft->bs_spinfo.pci_swin_last = pci_lo_fl;
  1973.     pcibr_soft->bs_spinfo.pci_mem_base = pci_hi_fb;
  1974.     pcibr_soft->bs_spinfo.pci_mem_last = pci_hi_fl;
  1975. #define PCI_ADDR_SPACE_LIMITS_PRINT()
  1976.     printf("+++++++++++++++++++++++n"
  1977.    "IO base 0x%x last 0x%xn"
  1978.    "SWIN base 0x%x last 0x%xn"
  1979.    "MEM base 0x%x last 0x%xn"
  1980.    "+++++++++++++++++++++++n",
  1981.    pcibr_soft->bs_spinfo.pci_io_base,
  1982.    pcibr_soft->bs_spinfo.pci_io_last,
  1983.    pcibr_soft->bs_spinfo.pci_swin_base,
  1984.    pcibr_soft->bs_spinfo.pci_swin_last,
  1985.    pcibr_soft->bs_spinfo.pci_mem_base,
  1986.    pcibr_soft->bs_spinfo.pci_mem_last);
  1987. /*
  1988.  * pcibr_slot_info_init
  1989.  * Probe for this slot and see if it is populated.
  1990.  * If it is populated initialize the generic PCI infrastructural
  1991.  *  information associated with this particular PCI device.
  1992.  */
  1993. int
  1994. pcibr_slot_info_init(devfs_handle_t  pcibr_vhdl,
  1995.      pciio_slot_t  slot)
  1996. {
  1997.     pcibr_soft_t     pcibr_soft;
  1998.     pcibr_info_h     pcibr_infoh;
  1999.     pcibr_info_t     pcibr_info;
  2000.     bridge_t    *bridge;
  2001.     cfg_p                   cfgw;
  2002.     unsigned                idword;
  2003.     unsigned                pfail;
  2004.     unsigned                idwords[8];
  2005.     pciio_vendor_id_t       vendor;
  2006.     pciio_device_id_t       device;
  2007.     unsigned                htype;
  2008.     cfg_p                   wptr;
  2009.     int                     win;
  2010.     pciio_space_t           space;
  2011.     iopaddr_t     pci_io_fb, pci_io_fl;
  2012.     iopaddr_t     pci_lo_fb,  pci_lo_fl;
  2013.     iopaddr_t     pci_hi_fb,  pci_hi_fl;
  2014.     int     nfunc;
  2015.     pciio_function_t     rfunc;
  2016.     int     func;
  2017.     devfs_handle_t     conn_vhdl;
  2018.     pcibr_soft_slot_t     slotp;
  2019.     
  2020.     /* Get the basic software information required to proceed */
  2021.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2022.     if (!pcibr_soft)
  2023. return(EINVAL);
  2024.     bridge = pcibr_soft->bs_base;
  2025.     if (!PCIBR_VALID_SLOT(slot))
  2026. return(EINVAL);
  2027.     /* If we have a host slot (eg:- IOC3 has 2 PCI slots and the initialization
  2028.      * is done by the host slot then we are done.
  2029.      */
  2030.     if (pcibr_soft->bs_slot[slot].has_host) {
  2031. return(0);    
  2032.     }
  2033.     /* Check for a slot with any system critical functions */
  2034.     if (pcibr_is_slot_sys_critical(pcibr_vhdl, slot))
  2035.         return(EPERM);
  2036.     /* Load the current values of allocated PCI address spaces */
  2037.     PCI_ADDR_SPACE_LIMITS_LOAD();
  2038.     
  2039.     /* Try to read the device-id/vendor-id from the config space */
  2040.     cfgw = bridge->b_type0_cfg_dev[slot].l;
  2041.     if (pcibr_probe_slot(bridge, cfgw, &idword)) 
  2042. return(ENODEV);
  2043.     slotp = &pcibr_soft->bs_slot[slot];
  2044.     slotp->slot_status |= SLOT_POWER_UP;
  2045.     vendor = 0xFFFF & idword;
  2046.     /* If the vendor id is not valid then the slot is not populated
  2047.      * and we are done.
  2048.      */
  2049.     if (vendor == 0xFFFF) 
  2050. return(ENODEV);
  2051.     
  2052.     device = 0xFFFF & (idword >> 16);
  2053.     htype = do_pcibr_config_get(cfgw, PCI_CFG_HEADER_TYPE, 1);
  2054.     nfunc = 1;
  2055.     rfunc = PCIIO_FUNC_NONE;
  2056.     pfail = 0;
  2057.     /* NOTE: if a card claims to be multifunction
  2058.      * but only responds to config space 0, treat
  2059.      * it as a unifunction card.
  2060.      */
  2061.     if (htype & 0x80) { /* MULTIFUNCTION */
  2062. for (func = 1; func < 8; ++func) {
  2063.     cfgw = bridge->b_type0_cfg_dev[slot].f[func].l;
  2064.     if (pcibr_probe_slot(bridge, cfgw, &idwords[func])) {
  2065. pfail |= 1 << func;
  2066. continue;
  2067.     }
  2068.     vendor = 0xFFFF & idwords[func];
  2069.     if (vendor == 0xFFFF) {
  2070. pfail |= 1 << func;
  2071. continue;
  2072.     }
  2073.     nfunc = func + 1;
  2074.     rfunc = 0;
  2075. }
  2076. cfgw = bridge->b_type0_cfg_dev[slot].l;
  2077.     }
  2078.     NEWA(pcibr_infoh, nfunc);
  2079.     
  2080.     pcibr_soft->bs_slot[slot].bss_ninfo = nfunc;
  2081.     pcibr_soft->bs_slot[slot].bss_infos = pcibr_infoh;
  2082.     for (func = 0; func < nfunc; ++func) {
  2083. unsigned                cmd_reg;
  2084. if (func) {
  2085.     if (pfail & (1 << func))
  2086. continue;
  2087.     
  2088.     idword = idwords[func];
  2089.     cfgw = bridge->b_type0_cfg_dev[slot].f[func].l;
  2090.     
  2091.     device = 0xFFFF & (idword >> 16);
  2092.     htype = do_pcibr_config_get(cfgw, PCI_CFG_HEADER_TYPE, 1);
  2093.     rfunc = func;
  2094. }
  2095. htype &= 0x7f;
  2096. if (htype != 0x00) {
  2097.     printk(KERN_WARNING  "%s pcibr: pci slot %d func %d has strange header type 0x%xn",
  2098.     pcibr_soft->bs_name, slot, func, htype);
  2099.     continue;
  2100. }
  2101. #if DEBUG && ATTACH_DEBUG
  2102. printk(KERN_NOTICE   
  2103. "%s pcibr: pci slot %d func %d: vendor 0x%x device 0x%x",
  2104. pcibr_soft->bs_name, slot, func, vendor, device);
  2105. #endif
  2106. pcibr_info = pcibr_device_info_new
  2107.     (pcibr_soft, slot, rfunc, vendor, device);
  2108. conn_vhdl = pciio_device_info_register(pcibr_vhdl, &pcibr_info->f_c);
  2109. if (func == 0)
  2110.     slotp->slot_conn = conn_vhdl;
  2111. #ifdef LITTLE_ENDIAN
  2112. cmd_reg = cfgw[(PCI_CFG_COMMAND ^ 4) / 4];
  2113. #else
  2114. cmd_reg = cfgw[PCI_CFG_COMMAND / 4];
  2115. #endif
  2116. wptr = cfgw + PCI_CFG_BASE_ADDR_0 / 4;
  2117. for (win = 0; win < PCI_CFG_BASE_ADDRS; ++win) {
  2118.     iopaddr_t               base, mask, code;
  2119.     size_t                  size;
  2120.     /*
  2121.      * GET THE BASE & SIZE OF THIS WINDOW:
  2122.      *
  2123.      * The low two or four bits of the BASE register
  2124.      * determines which address space we are in; the
  2125.      * rest is a base address. BASE registers
  2126.      * determine windows that are power-of-two sized
  2127.      * and naturally aligned, so we can get the size
  2128.      * of a window by writing all-ones to the
  2129.      * register, reading it back, and seeing which
  2130.      * bits are used for decode; the least
  2131.      * significant nonzero bit is also the size of
  2132.      * the window.
  2133.      *
  2134.      * WARNING: someone may already have allocated
  2135.      * some PCI space to this window, and in fact
  2136.      * PIO may be in process at this very moment
  2137.      * from another processor (or even from this
  2138.      * one, if we get interrupted)! So, if the BASE
  2139.      * already has a nonzero address, be generous
  2140.      * and use the LSBit of that address as the
  2141.      * size; this could overstate the window size.
  2142.      * Usually, when one card is set up, all are set
  2143.      * up; so, since we don't bitch about
  2144.      * overlapping windows, we are ok.
  2145.      *
  2146.      * UNFORTUNATELY, some cards do not clear their
  2147.      * BASE registers on reset. I have two heuristics
  2148.      * that can detect such cards: first, if the
  2149.      * decode enable is turned off for the space
  2150.      * that the window uses, we can disregard the
  2151.      * initial value. second, if the address is
  2152.      * outside the range that we use, we can disregard
  2153.      * it as well.
  2154.      *
  2155.      * This is looking very PCI generic. Except for
  2156.      * knowing how many slots and where their config
  2157.      * spaces are, this window loop and the next one
  2158.      * could probably be shared with other PCI host
  2159.      * adapters. It would be interesting to see if
  2160.      * this could be pushed up into pciio, when we
  2161.      * start supporting more PCI providers.
  2162.      */
  2163. #ifdef LITTLE_ENDIAN
  2164.     base = wptr[((win*4)^4)/4];
  2165. #else
  2166.     base = wptr[win];
  2167. #endif
  2168.     if (base & PCI_BA_IO_SPACE) {
  2169. /* BASE is in I/O space. */
  2170. space = PCIIO_SPACE_IO;
  2171. mask = -4;
  2172. code = base & 3;
  2173. base = base & mask;
  2174. if (base == 0) {
  2175.     ; /* not assigned */
  2176. } else if (!(cmd_reg & PCI_CMD_IO_SPACE)) {
  2177.     base = 0; /* decode not enabled */
  2178. }
  2179.     } else {
  2180. /* BASE is in MEM space. */
  2181. space = PCIIO_SPACE_MEM;
  2182. mask = -16;
  2183. code = base & PCI_BA_MEM_LOCATION; /* extract BAR type */
  2184. base = base & mask;
  2185. if (base == 0) {
  2186.     ; /* not assigned */
  2187. } else if (!(cmd_reg & PCI_CMD_MEM_SPACE)) {
  2188.     base = 0; /* decode not enabled */
  2189. } else if (base & 0xC0000000) {
  2190.     base = 0; /* outside permissable range */
  2191. } else if ((code == PCI_BA_MEM_64BIT) &&
  2192. #ifdef LITTLE_ENDIAN
  2193.    (wptr[(((win + 1)*4)^4)/4] != 0)) {
  2194. #else 
  2195.    (wptr[win + 1] != 0)) {
  2196. #endif /* LITTLE_ENDIAN */
  2197.     base = 0; /* outside permissable range */
  2198. }
  2199.     }
  2200.     if (base != 0) { /* estimate size */
  2201. size = base & -base;
  2202.     } else { /* calculate size */
  2203. #ifdef LITTLE_ENDIAN
  2204. wptr[((win*4)^4)/4] = ~0; /* turn on all bits */
  2205. size = wptr[((win*4)^4)/4]; /* get stored bits */
  2206. #else 
  2207. wptr[win] = ~0; /* turn on all bits */
  2208. size = wptr[win]; /* get stored bits */
  2209. #endif /* LITTLE_ENDIAN */
  2210. size &= mask; /* keep addr */
  2211. size &= -size; /* keep lsbit */
  2212. if (size == 0)
  2213.     continue;
  2214.     }
  2215.     pcibr_info->f_window[win].w_space = space;
  2216.     pcibr_info->f_window[win].w_base = base;
  2217.     pcibr_info->f_window[win].w_size = size;
  2218.     /*
  2219.      * If this window already has PCI space
  2220.      * allocated for it, "subtract" that space from
  2221.      * our running freeblocks. Don't worry about
  2222.      * overlaps in existing allocated windows; we
  2223.      * may be overstating their sizes anyway.
  2224.      */
  2225.     if (base && size) {
  2226. if (space == PCIIO_SPACE_IO) {
  2227.     pcibr_freeblock_sub(&pci_io_fb,
  2228. &pci_io_fl,
  2229. base, size);
  2230. } else {
  2231.     pcibr_freeblock_sub(&pci_lo_fb,
  2232. &pci_lo_fl,
  2233. base, size);
  2234.     pcibr_freeblock_sub(&pci_hi_fb,
  2235. &pci_hi_fl,
  2236. base, size);
  2237. }
  2238.     }
  2239. #if defined(IOC3_VENDOR_ID_NUM) && defined(IOC3_DEVICE_ID_NUM)
  2240.     /*
  2241.      * IOC3 BASE_ADDR* BUG WORKAROUND
  2242.      *
  2243.      
  2244.      * If we write to BASE1 on the IOC3, the
  2245.      * data in BASE0 is replaced. The
  2246.      * original workaround was to remember
  2247.      * the value of BASE0 and restore it
  2248.      * when we ran off the end of the BASE
  2249.      * registers; however, a later
  2250.      * workaround was added (I think it was
  2251.      * rev 1.44) to avoid setting up
  2252.      * anything but BASE0, with the comment
  2253.      * that writing all ones to BASE1 set
  2254.      * the enable-parity-error test feature
  2255.      * in IOC3's SCR bit 14.
  2256.      *
  2257.      * So, unless we defer doing any PCI
  2258.      * space allocation until drivers
  2259.      * attach, and set up a way for drivers
  2260.      * (the IOC3 in paricular) to tell us
  2261.      * generically to keep our hands off
  2262.      * BASE registers, we gotta "know" about
  2263.      * the IOC3 here.
  2264.      *
  2265.      * Too bad the PCI folks didn't reserve the
  2266.      * all-zero value for 'no BASE here' (it is a
  2267.      * valid code for an uninitialized BASE in
  2268.      * 32-bit PCI memory space).
  2269.      */
  2270.     
  2271.     if ((vendor == IOC3_VENDOR_ID_NUM) &&
  2272. (device == IOC3_DEVICE_ID_NUM))
  2273. break;
  2274. #endif
  2275.     if (code == PCI_BA_MEM_64BIT) {
  2276. win++; /* skip upper half */
  2277. #ifdef LITTLE_ENDIAN
  2278. wptr[((win*4)^4)/4] = 0; /* which must be zero */
  2279. #else 
  2280. wptr[win] = 0; /* which must be zero */
  2281. #endif /* LITTLE_ENDIAN */
  2282.     }
  2283. } /* next win */
  2284.     } /* next func */
  2285.     /* Store back the values for allocated PCI address spaces */
  2286.     PCI_ADDR_SPACE_LIMITS_STORE();
  2287.     return(0);
  2288. }
  2289. /*
  2290.  * pcibr_slot_info_free
  2291.  * Remove all the PCI infrastructural information associated
  2292.  *  with a particular PCI device.
  2293.  */
  2294. int
  2295. pcibr_slot_info_free(devfs_handle_t pcibr_vhdl,
  2296.                      pciio_slot_t slot)
  2297. {
  2298.     pcibr_soft_t pcibr_soft;
  2299.     pcibr_info_h pcibr_infoh;
  2300.     int nfunc;
  2301.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2302.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2303. return(EINVAL);
  2304.     nfunc = pcibr_soft->bs_slot[slot].bss_ninfo;
  2305.     pcibr_device_info_free(pcibr_vhdl, slot);
  2306.     pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos;
  2307.     DELA(pcibr_infoh,nfunc);
  2308.     pcibr_soft->bs_slot[slot].bss_ninfo = 0;
  2309.     return(0);
  2310. }
  2311. int as_debug = 0;
  2312. /*
  2313.  * pcibr_slot_addr_space_init
  2314.  * Reserve chunks of PCI address space as required by 
  2315.  *  the base registers in the card.
  2316.  */
  2317. int
  2318. pcibr_slot_addr_space_init(devfs_handle_t pcibr_vhdl,
  2319.    pciio_slot_t slot)
  2320. {
  2321.     pcibr_soft_t pcibr_soft;
  2322.     pcibr_info_h pcibr_infoh;
  2323.     pcibr_info_t pcibr_info;
  2324.     bridge_t *bridge;
  2325.     iopaddr_t pci_io_fb, pci_io_fl;
  2326.     iopaddr_t pci_lo_fb, pci_lo_fl;
  2327.     iopaddr_t pci_hi_fb, pci_hi_fl;
  2328.     size_t              align;
  2329.     iopaddr_t           mask;
  2330.     int      nbars;
  2331.     int         nfunc;
  2332.     int func;
  2333.     int win;
  2334.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2335.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2336. return(EINVAL);
  2337.     bridge = pcibr_soft->bs_base;
  2338.     /* Get the current values for the allocated PCI address spaces */
  2339.     PCI_ADDR_SPACE_LIMITS_LOAD();
  2340.     if (as_debug)
  2341. #ifdef LATER
  2342.     PCI_ADDR_SPACE_LIMITS_PRINT();
  2343. #endif
  2344.     /* allocate address space,
  2345.      * for windows that have not been
  2346.      * previously assigned.
  2347.      */
  2348.     if (pcibr_soft->bs_slot[slot].has_host) {
  2349. return(0);
  2350.     }
  2351.     nfunc = pcibr_soft->bs_slot[slot].bss_ninfo;
  2352.     if (nfunc < 1)
  2353. return(EINVAL);
  2354.     pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos;
  2355.     if (!pcibr_infoh)
  2356. return(EINVAL);
  2357.     /*
  2358.      * Try to make the DevIO windows not
  2359.      * overlap by pushing the "io" and "hi"
  2360.      * allocation areas up to the next one
  2361.      * or two megabyte bound. This also
  2362.      * keeps them from being zero.
  2363.      *
  2364.      * DO NOT do this with "pci_lo" since
  2365.      * the entire "lo" area is only a
  2366.      * megabyte, total ...
  2367.      */
  2368.     align = (slot < 2) ? 0x200000 : 0x100000;
  2369.     mask = -align;
  2370.     pci_io_fb = (pci_io_fb + align - 1) & mask;
  2371.     pci_hi_fb = (pci_hi_fb + align - 1) & mask;
  2372.     for (func = 0; func < nfunc; ++func) {
  2373. cfg_p                   cfgw;
  2374. cfg_p                   wptr;
  2375. pciio_space_t           space;
  2376. iopaddr_t               base;
  2377. size_t                  size;
  2378. cfg_p                   pci_cfg_cmd_reg_p;
  2379. unsigned                pci_cfg_cmd_reg;
  2380. unsigned                pci_cfg_cmd_reg_add = 0;
  2381. pcibr_info = pcibr_infoh[func];
  2382. if (!pcibr_info)
  2383.     continue;
  2384. if (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE)
  2385.     continue;
  2386. cfgw = bridge->b_type0_cfg_dev[slot].f[func].l;
  2387. wptr = cfgw + PCI_CFG_BASE_ADDR_0 / 4;
  2388. nbars = PCI_CFG_BASE_ADDRS;
  2389. for (win = 0; win < nbars; ++win) {
  2390.     space = pcibr_info->f_window[win].w_space;
  2391.     base = pcibr_info->f_window[win].w_base;
  2392.     size = pcibr_info->f_window[win].w_size;
  2393.     
  2394.     if (size < 1)
  2395. continue;
  2396.     if (base >= size) {
  2397. #if DEBUG && PCI_DEBUG
  2398. printk("pcibr: slot %d func %d window %d is in %d[0x%x..0x%x], alloc by promn",
  2399. slot, func, win, space, base, base + size - 1);
  2400. #endif
  2401. continue; /* already allocated */
  2402.     }
  2403.     align = size; /* ie. 0x00001000 */
  2404.     if (align < _PAGESZ)
  2405. align = _PAGESZ; /* ie. 0x00004000 */
  2406.     mask = -align; /* ie. 0xFFFFC000 */
  2407.     switch (space) {
  2408.     case PCIIO_SPACE_IO:
  2409. base = (pci_io_fb + align - 1) & mask;
  2410. if ((base + size) > pci_io_fl) {
  2411.     base = 0;
  2412.     break;
  2413. }
  2414. pci_io_fb = base + size;
  2415. break;
  2416.     case PCIIO_SPACE_MEM:
  2417. #ifdef LITTLE_ENDIAN
  2418. if ((wptr[((win*4)^4)/4] & PCI_BA_MEM_LOCATION) ==
  2419. #else
  2420. if ((wptr[win] & PCI_BA_MEM_LOCATION) ==
  2421. #endif  /* LITTLE_ENDIAN */
  2422.     PCI_BA_MEM_1MEG) {
  2423.     /* allocate from 20-bit PCI space */
  2424.     base = (pci_lo_fb + align - 1) & mask;
  2425.     if ((base + size) > pci_lo_fl) {
  2426. base = 0;
  2427. break;
  2428.     }
  2429.     pci_lo_fb = base + size;
  2430. } else {
  2431.     /* allocate from 32-bit or 64-bit PCI space */
  2432.     base = (pci_hi_fb + align - 1) & mask;
  2433.     if ((base + size) > pci_hi_fl) {
  2434. base = 0;
  2435. break;
  2436.     }
  2437.     pci_hi_fb = base + size;
  2438. }
  2439. break;
  2440.     default:
  2441. base = 0;
  2442. #if DEBUG && PCI_DEBUG
  2443. printk("pcibr: slot %d window %d had bad space code %dn",
  2444. slot, win, space);
  2445. #endif
  2446.     }
  2447.     pcibr_info->f_window[win].w_base = base;
  2448. #ifdef LITTLE_ENDIAN
  2449.     wptr[((win*4)^4)/4] = base;
  2450. #if DEBUG && PCI_DEBUG
  2451. printk("Setting base address 0x%p base 0x%xn", &(wptr[((win*4)^4)/4]), base);
  2452. #endif
  2453. #else
  2454.     wptr[win] = base;
  2455. #endif  /* LITTLE_ENDIAN */
  2456. #if DEBUG && PCI_DEBUG
  2457.     if (base >= size)
  2458. printk("pcibr: slot %d func %d window %d is in %d [0x%x..0x%x], alloc by pcibrn",
  2459. slot, func, win, space, base, base + size - 1);
  2460.     else
  2461. printk("pcibr: slot %d func %d window %d, unable to alloc 0x%x in 0x%pn",
  2462. slot, func, win, size, space);
  2463. #endif
  2464. } /* next base */
  2465. /*
  2466.  * Allocate space for the EXPANSION ROM
  2467.  * NOTE: DO NOT DO THIS ON AN IOC3,
  2468.  * as it blows the system away.
  2469.  */
  2470. base = size = 0;
  2471. if ((pcibr_soft->bs_slot[slot].bss_vendor_id != IOC3_VENDOR_ID_NUM) ||
  2472.     (pcibr_soft->bs_slot[slot].bss_device_id != IOC3_DEVICE_ID_NUM)) {
  2473.     wptr = cfgw + PCI_EXPANSION_ROM / 4;
  2474. #ifdef LITTLE_ENDIAN
  2475.     wptr[1] = 0xFFFFF000;
  2476.     mask = wptr[1];
  2477. #else
  2478.     *wptr = 0xFFFFF000;
  2479.     mask = *wptr;
  2480. #endif  /* LITTLE_ENDIAN */
  2481.     if (mask & 0xFFFFF000) {
  2482. size = mask & -mask;
  2483. align = size;
  2484. if (align < _PAGESZ)
  2485.     align = _PAGESZ;
  2486. mask = -align;
  2487. base = (pci_hi_fb + align - 1) & mask;
  2488. if ((base + size) > pci_hi_fl)
  2489.     base = size = 0;
  2490. else {
  2491.     pci_hi_fb = base + size;
  2492. #ifdef LITTLE_ENDIAN
  2493.     wptr[1] = base;
  2494. #else
  2495.     *wptr = base;
  2496. #endif  /* LITTLE_ENDIAN */
  2497. #if DEBUG && PCI_DEBUG
  2498.     printk("%s/%d ROM in 0x%lx..0x%lx (alloc by pcibr)n",
  2499.     pcibr_soft->bs_name, slot,
  2500.     base, base + size - 1);
  2501. #endif
  2502. }
  2503.     }
  2504. }
  2505. pcibr_info->f_rbase = base;
  2506. pcibr_info->f_rsize = size;
  2507. /*
  2508.  * if necessary, update the board's
  2509.  * command register to enable decoding
  2510.  * in the windows we added.
  2511.  *
  2512.  * There are some bits we always want to
  2513.  * be sure are set.
  2514.  */
  2515. pci_cfg_cmd_reg_add |= PCI_CMD_IO_SPACE;
  2516. /*
  2517.  * The Adaptec 1160 FC Controller WAR #767995:
  2518.  * The part incorrectly ignores the upper 32 bits of a 64 bit
  2519.  * address when decoding references to it's registers so to
  2520.  * keep it from responding to a bus cycle that it shouldn't
  2521.  * we only use I/O space to get at it's registers.  Don't
  2522.  * enable memory space accesses on that PCI device.
  2523.  */
  2524. #define FCADP_VENDID 0x9004 /* Adaptec Vendor ID from fcadp.h */
  2525. #define FCADP_DEVID 0x1160  /* Adaptec 1160 Device ID from fcadp.h */
  2526. if ((pcibr_info->f_vendor != FCADP_VENDID) ||
  2527.     (pcibr_info->f_device != FCADP_DEVID))
  2528.     pci_cfg_cmd_reg_add |= PCI_CMD_MEM_SPACE;
  2529. pci_cfg_cmd_reg_add |= PCI_CMD_BUS_MASTER;
  2530. pci_cfg_cmd_reg_p = cfgw + PCI_CFG_COMMAND / 4;
  2531. pci_cfg_cmd_reg = *pci_cfg_cmd_reg_p;
  2532. #if PCI_FBBE /* XXX- check here to see if dev can do fast-back-to-back */
  2533. if (!((pci_cfg_cmd_reg >> 16) & PCI_STAT_F_BK_BK_CAP))
  2534.     fast_back_to_back_enable = 0;
  2535. #endif
  2536. pci_cfg_cmd_reg &= 0xFFFF;
  2537. if (pci_cfg_cmd_reg_add & ~pci_cfg_cmd_reg)
  2538.     *pci_cfg_cmd_reg_p = pci_cfg_cmd_reg | pci_cfg_cmd_reg_add;
  2539.     } /* next func */
  2540.     /* Now that we have allocated new chunks of PCI address spaces to this
  2541.      * card we need to update the bookkeeping values which indicate
  2542.      * the current PCI address space allocations.
  2543.      */
  2544.     PCI_ADDR_SPACE_LIMITS_STORE();
  2545.     return(0);
  2546. }
  2547. /*
  2548.  * pcibr_slot_device_init
  2549.  *  Setup the device register in the bridge for this PCI slot.
  2550.  */
  2551. int
  2552. pcibr_slot_device_init(devfs_handle_t pcibr_vhdl,
  2553.        pciio_slot_t slot)
  2554. {
  2555.     pcibr_soft_t  pcibr_soft;
  2556.     bridge_t *bridge;
  2557.     bridgereg_t  devreg;
  2558.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2559.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2560. return(EINVAL);
  2561.     bridge = pcibr_soft->bs_base;
  2562.     /*
  2563.      * Adjustments to Device(x)
  2564.      * and init of bss_device shadow
  2565.      */
  2566.     devreg = bridge->b_device[slot].reg;
  2567.     devreg &= ~BRIDGE_DEV_PAGE_CHK_DIS;
  2568.     devreg |= BRIDGE_DEV_COH | BRIDGE_DEV_VIRTUAL_EN;
  2569. #ifdef LITTLE_ENDIAN
  2570.     devreg |= BRIDGE_DEV_DEV_SWAP;
  2571. #endif
  2572.     pcibr_soft->bs_slot[slot].bss_device = devreg;
  2573.     bridge->b_device[slot].reg = devreg;
  2574. #if DEBUG && PCI_DEBUG
  2575. printk("pcibr Device(%d): 0x%lxn", slot, bridge->b_device[slot].reg);
  2576. #endif
  2577. #if DEBUG && PCI_DEBUG
  2578.     printk("pcibr: PCI space allocation done.n");
  2579. #endif
  2580.     return(0);
  2581. }
  2582. /*
  2583.  * pcibr_slot_guest_info_init
  2584.  * Setup the host/guest relations for a PCI slot.
  2585.  */
  2586. int
  2587. pcibr_slot_guest_info_init(devfs_handle_t pcibr_vhdl,
  2588.    pciio_slot_t slot)
  2589. {
  2590.     pcibr_soft_t pcibr_soft;
  2591.     pcibr_info_h pcibr_infoh;
  2592.     pcibr_info_t pcibr_info;
  2593.     pcibr_soft_slot_t slotp;
  2594.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2595.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2596. return(EINVAL);
  2597.     slotp = &pcibr_soft->bs_slot[slot];
  2598.     /* create info and verticies for guest slots;
  2599.      * for compatibilitiy macros, create info
  2600.      * for even unpopulated slots (but do not
  2601.      * build verticies for them).
  2602.      */
  2603.     if (pcibr_soft->bs_slot[slot].bss_ninfo < 1) {
  2604. NEWA(pcibr_infoh, 1);
  2605. pcibr_soft->bs_slot[slot].bss_ninfo = 1;
  2606. pcibr_soft->bs_slot[slot].bss_infos = pcibr_infoh;
  2607. pcibr_info = pcibr_device_info_new
  2608.     (pcibr_soft, slot, PCIIO_FUNC_NONE,
  2609.      PCIIO_VENDOR_ID_NONE, PCIIO_DEVICE_ID_NONE);
  2610. if (pcibr_soft->bs_slot[slot].has_host) {
  2611.     slotp->slot_conn = pciio_device_info_register
  2612. (pcibr_vhdl, &pcibr_info->f_c);
  2613. }
  2614.     }
  2615.     /* generate host/guest relations
  2616.      */
  2617.     if (pcibr_soft->bs_slot[slot].has_host) {
  2618. int  host = pcibr_soft->bs_slot[slot].host_slot;
  2619. pcibr_soft_slot_t host_slotp = &pcibr_soft->bs_slot[host];
  2620. hwgraph_edge_add(slotp->slot_conn,
  2621.  host_slotp->slot_conn,
  2622.  EDGE_LBL_HOST);
  2623. /* XXX- only gives us one guest edge per
  2624.  * host. If/when we have a host with more than
  2625.  * one guest, we will need to figure out how
  2626.  * the host finds all its guests, and sorts
  2627.  * out which one is which.
  2628.  */
  2629. hwgraph_edge_add(host_slotp->slot_conn,
  2630.  slotp->slot_conn,
  2631.  EDGE_LBL_GUEST);
  2632.     }
  2633.     return(0);
  2634. }
  2635. /*
  2636.  * pcibr_slot_initial_rrb_alloc
  2637.  * Allocate a default number of rrbs for this slot on 
  2638.  *  the two channels.  This is dictated by the rrb allocation
  2639.  *  strategy routine defined per platform.
  2640.  */
  2641. int
  2642. pcibr_slot_initial_rrb_alloc(devfs_handle_t pcibr_vhdl,
  2643.      pciio_slot_t slot)
  2644. {
  2645.     pcibr_soft_t pcibr_soft;
  2646.     pcibr_info_h pcibr_infoh;
  2647.     pcibr_info_t pcibr_info;
  2648.     bridge_t *bridge;
  2649.     int                 c0, c1;
  2650.     int r;
  2651.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2652.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2653. return(EINVAL);
  2654.     bridge = pcibr_soft->bs_base;
  2655.     /* How may RRBs are on this slot?
  2656.      */
  2657.     c0 = do_pcibr_rrb_count_valid(bridge, slot);
  2658.     c1 = do_pcibr_rrb_count_valid(bridge, slot + PCIBR_RRB_SLOT_VIRTUAL);
  2659. #if PCIBR_RRB_DEBUG
  2660.     printk("pcibr_attach: slot %d started with %d+%dn", slot, c0, c1);
  2661. #endif
  2662.     /* Do we really need any?
  2663.      */
  2664.     pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos;
  2665.     pcibr_info = pcibr_infoh[0];
  2666.     if ((pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE) &&
  2667. !pcibr_soft->bs_slot[slot].has_host) {
  2668. if (c0 > 0)
  2669.     do_pcibr_rrb_free(bridge, slot, c0);
  2670. if (c1 > 0)
  2671.     do_pcibr_rrb_free(bridge, slot + PCIBR_RRB_SLOT_VIRTUAL, c1);
  2672. pcibr_soft->bs_rrb_valid[slot] = 0x1000;
  2673. pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL] = 0x1000;
  2674. return(ENODEV);
  2675.     }
  2676.     pcibr_soft->bs_rrb_avail[slot & 1] -= c0 + c1;
  2677.     pcibr_soft->bs_rrb_valid[slot] = c0;
  2678.     pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL] = c1;
  2679.     pcibr_soft->bs_rrb_avail[0] = do_pcibr_rrb_count_avail(bridge, 0);
  2680.     pcibr_soft->bs_rrb_avail[1] = do_pcibr_rrb_count_avail(bridge, 1);
  2681.     r = 3 - (c0 + c1);
  2682.     if (r > 0) {
  2683. pcibr_soft->bs_rrb_res[slot] = r;
  2684. pcibr_soft->bs_rrb_avail[slot & 1] -= r;
  2685.     }
  2686. #if PCIBR_RRB_DEBUG
  2687.     printk("t%d+%d+%d",
  2688.     0xFFF & pcibr_soft->bs_rrb_valid[slot],
  2689.     0xFFF & pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL],
  2690.     pcibr_soft->bs_rrb_res[slot]);
  2691.     printk("n");
  2692. #endif
  2693.     return(0);
  2694. }
  2695. /*
  2696.  * pcibr_slot_call_device_attach
  2697.  * This calls the associated driver attach routine for the PCI
  2698.  *  card in this slot.
  2699.  */
  2700. int
  2701. pcibr_slot_call_device_attach(devfs_handle_t pcibr_vhdl,
  2702.       pciio_slot_t slot,
  2703.       int          drv_flags)
  2704. {
  2705.     pcibr_soft_t pcibr_soft;
  2706.     pcibr_info_h pcibr_infoh;
  2707.     pcibr_info_t pcibr_info;
  2708.     async_attach_t aa = NULL;
  2709.     int func;
  2710.     devfs_handle_t xconn_vhdl,conn_vhdl;
  2711.     int nfunc;
  2712.     int                 error_func;
  2713.     int                 error_slot = 0;
  2714.     int                 error = ENODEV;
  2715.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2716.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2717. return(EINVAL);
  2718.     if (pcibr_soft->bs_slot[slot].has_host) {
  2719.         return(EPERM);
  2720.     }
  2721.     
  2722.     xconn_vhdl = pcibr_soft->bs_conn;
  2723.     aa = async_attach_get_info(xconn_vhdl);
  2724.     nfunc = pcibr_soft->bs_slot[slot].bss_ninfo;
  2725.     pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos;
  2726.     for (func = 0; func < nfunc; ++func) {
  2727. pcibr_info = pcibr_infoh[func];
  2728. if (!pcibr_info)
  2729.     continue;
  2730. if (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE)
  2731.     continue;
  2732. conn_vhdl = pcibr_info->f_vertex;
  2733. #ifdef LATER
  2734. /*
  2735.  * Activate if and when we support cdl.
  2736.  */
  2737. if (aa)
  2738.     async_attach_add_info(conn_vhdl, aa);
  2739. #endif /* LATER */
  2740. error_func = pciio_device_attach(conn_vhdl, drv_flags);
  2741.         pcibr_info->f_att_det_error = error_func;
  2742. if (error_func)
  2743.     error_slot = error_func;
  2744.         error = error_slot;
  2745.     } /* next func */
  2746.     if (error) {
  2747. if ((error != ENODEV) && (error != EUNATCH))
  2748.     pcibr_soft->bs_slot[slot].slot_status |= SLOT_STARTUP_INCMPLT;
  2749.     } else {
  2750.         pcibr_soft->bs_slot[slot].slot_status |= SLOT_STARTUP_CMPLT;
  2751.     }
  2752.         
  2753.     return(error);
  2754. }
  2755. /*
  2756.  * pcibr_slot_call_device_detach
  2757.  * This calls the associated driver detach routine for the PCI
  2758.  *  card in this slot.
  2759.  */
  2760. int
  2761. pcibr_slot_call_device_detach(devfs_handle_t pcibr_vhdl,
  2762.       pciio_slot_t slot,
  2763.       int          drv_flags)
  2764. {
  2765.     pcibr_soft_t pcibr_soft;
  2766.     pcibr_info_h pcibr_infoh;
  2767.     pcibr_info_t pcibr_info;
  2768.     int func;
  2769.     devfs_handle_t conn_vhdl = GRAPH_VERTEX_NONE;
  2770.     int nfunc;
  2771.     int                 error_func;
  2772.     int                 error_slot = 0;
  2773.     int                 error = ENODEV;
  2774.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2775.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2776. return(EINVAL);
  2777.     if (pcibr_soft->bs_slot[slot].has_host)
  2778.         return(EPERM);
  2779.     /* Make sure that we do not detach a system critical function vertex */
  2780.     if(pcibr_is_slot_sys_critical(pcibr_vhdl, slot))
  2781.         return(EPERM);
  2782.     nfunc = pcibr_soft->bs_slot[slot].bss_ninfo;
  2783.     pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos;
  2784.     for (func = 0; func < nfunc; ++func) {
  2785. pcibr_info = pcibr_infoh[func];
  2786. if (!pcibr_info)
  2787.     continue;
  2788. if (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE)
  2789.     continue;
  2790. conn_vhdl = pcibr_info->f_vertex;
  2791. error_func = pciio_device_detach(conn_vhdl, drv_flags);
  2792.         pcibr_info->f_att_det_error = error_func;
  2793. if (error_func)
  2794.     error_slot = error_func;
  2795. error = error_slot;
  2796.     } /* next func */
  2797.     pcibr_soft->bs_slot[slot].slot_status &= ~SLOT_STATUS_MASK;
  2798.     if (error) {
  2799. if ((error != ENODEV) && (error != EUNATCH))
  2800.             pcibr_soft->bs_slot[slot].slot_status |= SLOT_SHUTDOWN_INCMPLT;
  2801.     } else {
  2802.         if (conn_vhdl != GRAPH_VERTEX_NONE) 
  2803.             pcibr_device_unregister(conn_vhdl);
  2804.         pcibr_soft->bs_slot[slot].slot_status |= SLOT_SHUTDOWN_CMPLT;
  2805.     }
  2806.         
  2807.     return(error);
  2808. }
  2809. /*
  2810.  * pcibr_slot_detach
  2811.  * This is a place holder routine to keep track of all the
  2812.  * slot-specific freeing that needs to be done.
  2813.  */
  2814. int
  2815. pcibr_slot_detach(devfs_handle_t pcibr_vhdl,
  2816.   pciio_slot_t slot,
  2817.   int          drv_flags)
  2818. {
  2819.     int   error;
  2820.     
  2821.     /* Call the device detach function */
  2822.     error = (pcibr_slot_call_device_detach(pcibr_vhdl, slot, drv_flags));
  2823.     return (error);
  2824. }
  2825. /*
  2826.  * pcibr_is_slot_sys_critical
  2827.  *      Check slot for any functions that are system critical.
  2828.  *      Return 1 if any are system critical or 0 otherwise.
  2829.  *
  2830.  *      This function will always return 0 when called by 
  2831.  *      pcibr_attach() because the system critical vertices 
  2832.  *      have not yet been set in the hwgraph.
  2833.  */
  2834. int
  2835. pcibr_is_slot_sys_critical(devfs_handle_t pcibr_vhdl,
  2836.                       pciio_slot_t slot)
  2837. {
  2838.     pcibr_soft_t        pcibr_soft;
  2839.     pcibr_info_h        pcibr_infoh;
  2840.     pcibr_info_t        pcibr_info;
  2841.     devfs_handle_t        conn_vhdl = GRAPH_VERTEX_NONE;
  2842.     int                 nfunc;
  2843.     int                 func;
  2844.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2845.     if (!pcibr_soft || !PCIBR_VALID_SLOT(slot))
  2846.         return(0);
  2847.     nfunc = pcibr_soft->bs_slot[slot].bss_ninfo;
  2848.     pcibr_infoh = pcibr_soft->bs_slot[slot].bss_infos;
  2849.     for (func = 0; func < nfunc; ++func) {
  2850.         pcibr_info = pcibr_infoh[func];
  2851.         if (!pcibr_info)
  2852.             continue;
  2853.         if (pcibr_info->f_vendor == PCIIO_VENDOR_ID_NONE)
  2854.             continue;
  2855.         conn_vhdl = pcibr_info->f_vertex;
  2856.         if (is_sys_critical_vertex(conn_vhdl)) { 
  2857. #if defined(SUPPORT_PRINTING_V_FORMAT)
  2858.             printk(KERN_WARNING  "%v is a system critical device vertexn", conn_vhdl);
  2859. #else
  2860.             printk(KERN_WARNING  "%p is a system critical device vertexn", (void *)conn_vhdl);
  2861. #endif
  2862.             return(1); 
  2863.         }
  2864.     }
  2865.     return(0);
  2866. }
  2867. /*
  2868.  * pcibr_device_unregister
  2869.  * This frees up any hardware resources reserved for this PCI device
  2870.  *  and removes any PCI infrastructural information setup for it.
  2871.  * This is usually used at the time of shutting down of the PCI card.
  2872.  */
  2873. int
  2874. pcibr_device_unregister(devfs_handle_t pconn_vhdl)
  2875. {
  2876.     pciio_info_t  pciio_info;
  2877.     devfs_handle_t  pcibr_vhdl;
  2878.     pciio_slot_t  slot;
  2879.     pcibr_soft_t  pcibr_soft;
  2880.     bridge_t *bridge;
  2881.     int  error_call;
  2882.     int  error = 0;
  2883.     pciio_info = pciio_info_get(pconn_vhdl);
  2884.     pcibr_vhdl = pciio_info_master_get(pciio_info);
  2885.     slot = pciio_info_slot_get(pciio_info);
  2886.     pcibr_soft = pcibr_soft_get(pcibr_vhdl);
  2887.     bridge = pcibr_soft->bs_base;
  2888.     /* Clear all the hardware xtalk resources for this device */
  2889.     xtalk_widgetdev_shutdown(pcibr_soft->bs_conn, slot);
  2890.     /* Flush all the rrbs */
  2891.     pcibr_rrb_flush(pconn_vhdl);
  2892.     /* Free the rrbs allocated to this slot */
  2893.     error_call = do_pcibr_rrb_free(bridge, slot, 
  2894.                    pcibr_soft->bs_rrb_valid[slot] +
  2895.                    pcibr_soft->bs_rrb_valid[slot + 
  2896.                                    PCIBR_RRB_SLOT_VIRTUAL]);
  2897.     if (error_call)
  2898.         error = ERANGE;
  2899.     pcibr_soft->bs_rrb_valid[slot] = 0;
  2900.     pcibr_soft->bs_rrb_valid[slot + PCIBR_RRB_SLOT_VIRTUAL] = 0;
  2901.     pcibr_soft->bs_rrb_res[slot] = 0;
  2902.     /* Flush the write buffers !! */
  2903.     error_call = pcibr_wrb_flush(pconn_vhdl);
  2904.     if (error_call)
  2905.         error = error_call;
  2906.     /* Clear the information specific to the slot */
  2907.     error_call = pcibr_slot_info_free(pcibr_vhdl, slot);
  2908.     if (error_call)
  2909.         error = error_call;
  2910.     return(error);
  2911.     
  2912. }
  2913. /* 
  2914.  * build a convenience link path in the
  2915.  * form of ".../<iobrick>/bus/<busnum>"
  2916.  * 
  2917.  * returns 1 on success, 0 otherwise
  2918.  *
  2919.  * depends on hwgraph separator == '/'
  2920.  */
  2921. int
  2922. pcibr_bus_cnvlink(devfs_handle_t f_c, int slot)
  2923. {
  2924.         char dst[MAXDEVNAME];
  2925. char *dp = dst;
  2926.         char *cp, *xp;
  2927.         int widgetnum;
  2928.         char pcibus[8];
  2929. devfs_handle_t nvtx, svtx;
  2930. int rv;
  2931. #if DEBUG
  2932. printk("pcibr_bus_cnvlink: slot= %d f_c= %pn", 
  2933. slot, f_c);
  2934. {
  2935. int pos;
  2936. char dname[256];
  2937. pos = devfs_generate_path(f_c, dname, 256);
  2938. printk("%s : path= %sn", __FUNCTION__, &dname[pos]);
  2939. }
  2940. #endif
  2941. if (GRAPH_SUCCESS != hwgraph_vertex_name_get(f_c, dst, MAXDEVNAME))
  2942. return 0;
  2943. /* dst example == /hw/module/001c02/Pbrick/xtalk/8/pci/direct */
  2944. /* find the widget number */
  2945. xp = strstr(dst, "/"EDGE_LBL_XTALK"/");
  2946. if (xp == NULL)
  2947. return 0;
  2948. widgetnum = atoi(xp+7);
  2949. if (widgetnum < XBOW_PORT_8 || widgetnum > XBOW_PORT_F)
  2950. return 0;
  2951. /* remove "/pci/direct" from path */
  2952. cp = strstr(dst, "/" EDGE_LBL_PCI "/" "direct");
  2953. if (cp == NULL)
  2954. return 0;
  2955. *cp = (char)NULL;
  2956. /* get the vertex for the widget */
  2957. if (GRAPH_SUCCESS != hwgraph_traverse(NULL, dp, &svtx))
  2958. return 0;
  2959. *xp = (char)NULL; /* remove "/xtalk/..." from path */
  2960. /* dst example now == /hw/module/001c02/Pbrick */
  2961. /* get the bus number */
  2962.         strcat(dst, "/bus");
  2963.         sprintf(pcibus, "%d", p_busnum[widgetnum]);
  2964. /* link to bus to widget */
  2965. rv = hwgraph_path_add(NULL, dp, &nvtx);
  2966. if (GRAPH_SUCCESS == rv)
  2967. rv = hwgraph_edge_add(nvtx, svtx, pcibus);
  2968. return (rv == GRAPH_SUCCESS);
  2969. }
  2970. /*
  2971.  *    pcibr_attach: called every time the crosstalk
  2972.  *      infrastructure is asked to initialize a widget
  2973.  *      that matches the part number we handed to the
  2974.  *      registration routine above.
  2975.  */
  2976. /*ARGSUSED */
  2977. int
  2978. pcibr_attach(devfs_handle_t xconn_vhdl)
  2979. {
  2980.     /* REFERENCED */
  2981.     graph_error_t           rc;
  2982.     devfs_handle_t            pcibr_vhdl;
  2983.     devfs_handle_t            ctlr_vhdl;
  2984.     bridge_t               *bridge = NULL;
  2985.     bridgereg_t             id;
  2986.     int                     rev;
  2987.     pcibr_soft_t            pcibr_soft;
  2988.     pcibr_info_t            pcibr_info;
  2989.     xwidget_info_t          info;
  2990.     xtalk_intr_t            xtalk_intr;
  2991.     device_desc_t           dev_desc = (device_desc_t)0;
  2992.     int                     slot;
  2993.     int                     ibit;
  2994.     devfs_handle_t            noslot_conn;
  2995.     char                    devnm[MAXDEVNAME], *s;
  2996.     pcibr_hints_t           pcibr_hints;
  2997.     bridgereg_t             b_int_enable;
  2998.     unsigned                rrb_fixed = 0;
  2999.     iopaddr_t               pci_io_fb, pci_io_fl;
  3000.     iopaddr_t               pci_lo_fb, pci_lo_fl;
  3001.     iopaddr_t               pci_hi_fb, pci_hi_fl;
  3002.     int                     spl_level;
  3003. #ifdef LATER
  3004.     char     *nicinfo = (char *)0;
  3005. #endif
  3006. #if PCI_FBBE
  3007.     int                     fast_back_to_back_enable;
  3008. #endif
  3009.     l1sc_t     *scp;
  3010.     nasid_t     nasid;
  3011.     async_attach_t          aa = NULL;
  3012.     aa = async_attach_get_info(xconn_vhdl);
  3013. #if DEBUG && ATTACH_DEBUG
  3014.     printk("pcibr_attach: xconn_vhdl=  %pn", xconn_vhdl);
  3015.     {
  3016. int pos;
  3017. char dname[256];
  3018. pos = devfs_generate_path(xconn_vhdl, dname, 256);
  3019. printk("%s : path= %s n", __FUNCTION__, &dname[pos]);
  3020.     }
  3021. #endif
  3022.     /* Setup the PRB for the bridge in CONVEYOR BELT
  3023.      * mode. PRBs are setup in default FIRE-AND-FORGET
  3024.      * mode during the initialization.
  3025.      */
  3026.     hub_device_flags_set(xconn_vhdl, HUB_PIO_CONVEYOR);
  3027.     bridge = (bridge_t *)
  3028. xtalk_piotrans_addr(xconn_vhdl, NULL,
  3029.     0, sizeof(bridge_t), 0);
  3030. #ifndef MEDUSA_HACK
  3031.     if ((bridge->b_wid_stat & BRIDGE_STAT_PCI_GIO_N) == 0)
  3032. return -1; /* someone else handles GIO bridges. */
  3033. #endif
  3034.     if (XWIDGET_PART_REV_NUM(bridge->b_wid_id) == XBRIDGE_PART_REV_A)
  3035. NeedXbridgeSwap = 1;
  3036.     /*
  3037.      * Create the vertex for the PCI bus, which we
  3038.      * will also use to hold the pcibr_soft and
  3039.      * which will be the "master" vertex for all the
  3040.      * pciio connection points we will hang off it.
  3041.      * This needs to happen before we call nic_bridge_vertex_info
  3042.      * as we are some of the *_vmc functions need access to the edges.
  3043.      *
  3044.      * Opening this vertex will provide access to
  3045.      * the Bridge registers themselves.
  3046.      */
  3047.     rc = hwgraph_path_add(xconn_vhdl, EDGE_LBL_PCI, &pcibr_vhdl);
  3048.     ASSERT(rc == GRAPH_SUCCESS);
  3049.     ctlr_vhdl = NULL;
  3050.     ctlr_vhdl = hwgraph_register(pcibr_vhdl, EDGE_LBL_CONTROLLER,
  3051.                 0, DEVFS_FL_AUTO_DEVNUM,
  3052.                 0, 0,
  3053.                 S_IFCHR | S_IRUSR | S_IWUSR | S_IRGRP, 0, 0,
  3054.                 &pcibr_fops, NULL);
  3055.     ASSERT(ctlr_vhdl != NULL);
  3056.     /*
  3057.      * decode the nic, and hang its stuff off our
  3058.      * connection point where other drivers can get
  3059.      * at it.
  3060.      */
  3061. #ifdef LATER
  3062.     nicinfo = BRIDGE_VERTEX_MFG_INFO(xconn_vhdl, (nic_data_t) & bridge->b_nic);
  3063. #endif
  3064.     /*
  3065.      * Get the hint structure; if some NIC callback
  3066.      * marked this vertex as "hands-off" then we
  3067.      * just return here, before doing anything else.
  3068.      */
  3069.     pcibr_hints = pcibr_hints_get(xconn_vhdl, 0);
  3070.     if (pcibr_hints && pcibr_hints->ph_hands_off)
  3071. return -1; /* generic operations disabled */
  3072.     id = bridge->b_wid_id;
  3073.     rev = XWIDGET_PART_REV_NUM(id);
  3074.     hwgraph_info_add_LBL(pcibr_vhdl, INFO_LBL_PCIBR_ASIC_REV, (arbitrary_info_t) rev);
  3075.     /*
  3076.      * allocate soft state structure, fill in some
  3077.      * fields, and hook it up to our vertex.
  3078.      */
  3079.     NEW(pcibr_soft);
  3080.     BZERO(pcibr_soft, sizeof *pcibr_soft);
  3081.     pcibr_soft_set(pcibr_vhdl, pcibr_soft);
  3082.     pcibr_soft->bs_conn = xconn_vhdl;
  3083.     pcibr_soft->bs_vhdl = pcibr_vhdl;
  3084.     pcibr_soft->bs_base = bridge;
  3085.     pcibr_soft->bs_rev_num = rev;
  3086.     pcibr_soft->bs_intr_bits = pcibr_intr_bits;
  3087.     if (is_xbridge(bridge)) {
  3088. pcibr_soft->bs_int_ate_size = XBRIDGE_INTERNAL_ATES;
  3089. pcibr_soft->bs_xbridge = 1;
  3090.     } else {
  3091. pcibr_soft->bs_int_ate_size = BRIDGE_INTERNAL_ATES;
  3092. pcibr_soft->bs_xbridge = 0;
  3093.     }
  3094.     nasid = NASID_GET(bridge);
  3095.     scp = &NODEPDA( NASID_TO_COMPACT_NODEID(nasid) )->module->elsc;
  3096.     pcibr_soft->bs_l1sc = scp;
  3097.     pcibr_soft->bs_moduleid = iobrick_module_get(scp);
  3098.     pcibr_soft->bsi_err_intr = 0;
  3099.     /* Bridges up through REV C
  3100.      * are unable to set the direct
  3101.      * byteswappers to BYTE_STREAM.
  3102.      */
  3103.     if (pcibr_soft->bs_rev_num <= BRIDGE_PART_REV_C) {
  3104. pcibr_soft->bs_pio_end_io = PCIIO_WORD_VALUES;
  3105. pcibr_soft->bs_pio_end_mem = PCIIO_WORD_VALUES;
  3106.     }
  3107. #if PCIBR_SOFT_LIST
  3108.     {
  3109. pcibr_list_p            self;
  3110. NEW(self);
  3111. self->bl_soft = pcibr_soft;
  3112. self->bl_vhdl = pcibr_vhdl;
  3113. self->bl_next = pcibr_list;
  3114. self->bl_next = swap_ptr((void **) &pcibr_list, (void *)self);
  3115.     }
  3116. #endif
  3117.     /*
  3118.      * get the name of this bridge vertex and keep the info. Use this
  3119.      * only where it is really needed now: like error interrupts.
  3120.      */
  3121.     s = dev_to_name(pcibr_vhdl, devnm, MAXDEVNAME);
  3122.     pcibr_soft->bs_name = kmalloc(strlen(s) + 1, GFP_KERNEL);
  3123.     strcpy(pcibr_soft->bs_name, s);
  3124. #if SHOW_REVS || DEBUG
  3125. #if !DEBUG
  3126.     if (kdebug)
  3127. #endif
  3128. printk("%sBridge ASIC: rev %s (code=0x%x) at %sn",
  3129. is_xbridge(bridge) ? "X" : "",
  3130. (rev == BRIDGE_PART_REV_A) ? "A" :
  3131. (rev == BRIDGE_PART_REV_B) ? "B" :
  3132. (rev == BRIDGE_PART_REV_C) ? "C" :
  3133. (rev == BRIDGE_PART_REV_D) ? "D" :
  3134. (rev == XBRIDGE_PART_REV_A) ? "A" :
  3135. (rev == XBRIDGE_PART_REV_B) ? "B" :
  3136. "unknown",
  3137. rev, pcibr_soft->bs_name);
  3138. #endif
  3139.     info = xwidget_info_get(xconn_vhdl);
  3140.     pcibr_soft->bs_xid = xwidget_info_id_get(info);
  3141.     pcibr_soft->bs_master = xwidget_info_master_get(info);
  3142.     pcibr_soft->bs_mxid = xwidget_info_masterid_get(info);
  3143.     /*
  3144.      * Init bridge lock.
  3145.      */
  3146.     spin_lock_init(&pcibr_soft->bs_lock);
  3147.     /*
  3148.      * If we have one, process the hints structure.
  3149.      */
  3150.     if (pcibr_hints) {
  3151. rrb_fixed = pcibr_hints->ph_rrb_fixed;
  3152. pcibr_soft->bs_rrb_fixed = rrb_fixed;
  3153. if (pcibr_hints->ph_intr_bits)
  3154.     pcibr_soft->bs_intr_bits = pcibr_hints->ph_intr_bits;
  3155. for (slot = 0; slot < 8; ++slot) {
  3156.     int                     hslot = pcibr_hints->ph_host_slot[slot] - 1;
  3157.     if (hslot < 0) {
  3158. pcibr_soft->bs_slot[slot].host_slot = slot;
  3159.     } else {
  3160. pcibr_soft->bs_slot[slot].has_host = 1;
  3161. pcibr_soft->bs_slot[slot].host_slot = hslot;
  3162.     }
  3163. }
  3164.     }
  3165.     /*
  3166.      * set up initial values for state fields
  3167.      */
  3168.     for (slot = 0; slot < 8; ++slot) {
  3169. pcibr_soft->bs_slot[slot].bss_devio.bssd_space = PCIIO_SPACE_NONE;
  3170. pcibr_soft->bs_slot[slot].bss_d64_base = PCIBR_D64_BASE_UNSET;
  3171. pcibr_soft->bs_slot[slot].bss_d32_base = PCIBR_D32_BASE_UNSET;
  3172. pcibr_soft->bs_slot[slot].bss_ext_ates_active = ATOMIC_INIT(0);
  3173.     }
  3174.     for (ibit = 0; ibit < 8; ++ibit) {
  3175. pcibr_soft->bs_intr[ibit].bsi_xtalk_intr = 0;
  3176. pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_soft = pcibr_soft;
  3177. pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_list = NULL;
  3178. pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_stat = 
  3179. &(bridge->b_int_status);
  3180. pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_hdlrcnt = 0;
  3181. pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_shared = 0;
  3182. pcibr_soft->bs_intr[ibit].bsi_pcibr_intr_wrap.iw_connected = 0;
  3183.     }
  3184.     /*
  3185.      * Initialize various Bridge registers.
  3186.      */
  3187.     /*
  3188.      * On pre-Rev.D bridges, set the PCI_RETRY_CNT
  3189.      * to zero to avoid dropping stores. (#475347)
  3190.      */
  3191.     if (rev < BRIDGE_PART_REV_D)
  3192. bridge->b_bus_timeout &= ~BRIDGE_BUS_PCI_RETRY_MASK;
  3193.     /*
  3194.      * Clear all pending interrupts.
  3195.      */
  3196.     bridge->b_int_rst_stat = (BRIDGE_IRR_ALL_CLR);
  3197.     /*
  3198.      * Until otherwise set up,
  3199.      * assume all interrupts are
  3200.      * from slot 7.
  3201.      */
  3202.     bridge->b_int_device = (uint32_t) 0xffffffff;
  3203.     {
  3204. bridgereg_t             dirmap;
  3205. paddr_t                 paddr;
  3206. iopaddr_t               xbase;
  3207. xwidgetnum_t            xport;
  3208. iopaddr_t               offset;
  3209. int                     num_entries = 0;
  3210. int                     entry;
  3211. cnodeid_t cnodeid;
  3212. nasid_t nasid;
  3213. /* Set the Bridge's 32-bit PCI to XTalk
  3214.  * Direct Map register to the most useful
  3215.  * value we can determine.  Note that we
  3216.  * must use a single xid for all of:
  3217.  *      direct-mapped 32-bit DMA accesses
  3218.  *      direct-mapped 64-bit DMA accesses
  3219.  *      DMA accesses through the PMU
  3220.  *      interrupts
  3221.  * This is the only way to guarantee that
  3222.  * completion interrupts will reach a CPU
  3223.  * after all DMA data has reached memory.
  3224.  * (Of course, there may be a few special
  3225.  * drivers/controlers that explicitly manage
  3226.  * this ordering problem.)
  3227.  */
  3228. cnodeid = 0;  /* default node id */
  3229. /*
  3230.  * Determine the base address node id to be used for all 32-bit
  3231.  * Direct Mapping I/O. The default is node 0, but this can be changed
  3232.  * via a DEVICE_ADMIN directive and the PCIBUS_DMATRANS_NODE
  3233.  * attribute in the irix.sm config file. A device driver can obtain
  3234.  * this node value via a call to pcibr_get_dmatrans_node().
  3235.  */
  3236. nasid = COMPACT_TO_NASID_NODEID(cnodeid);
  3237. paddr = NODE_OFFSET(nasid) + 0;
  3238. /* currently, we just assume that if we ask
  3239.  * for a DMA mapping to "zero" the XIO
  3240.  * host will transmute this into a request
  3241.  * for the lowest hunk of memory.
  3242.  */
  3243. xbase = xtalk_dmatrans_addr(xconn_vhdl, 0,
  3244.     paddr, _PAGESZ, 0);
  3245. if (xbase != XIO_NOWHERE) {
  3246.     if (XIO_PACKED(xbase)) {
  3247. xport = XIO_PORT(xbase);
  3248. xbase = XIO_ADDR(xbase);
  3249.     } else
  3250. xport = pcibr_soft->bs_mxid;
  3251.     offset = xbase & ((1ull << BRIDGE_DIRMAP_OFF_ADDRSHFT) - 1ull);
  3252.     xbase >>= BRIDGE_DIRMAP_OFF_ADDRSHFT;
  3253.     dirmap = xport << BRIDGE_DIRMAP_W_ID_SHFT;
  3254.     if (xbase)
  3255. dirmap |= BRIDGE_DIRMAP_OFF & xbase;
  3256.     else if (offset >= (512 << 20))
  3257. dirmap |= BRIDGE_DIRMAP_ADD512;
  3258.     bridge->b_dir_map = dirmap;
  3259. }
  3260. /*
  3261.  * Set bridge's idea of page size according to the system's
  3262.  * idea of "IO page size".  TBD: The idea of IO page size
  3263.  * should really go away.
  3264.  */
  3265. /*
  3266.  * ensure that we write and read without any interruption.
  3267.  * The read following the write is required for the Bridge war
  3268.  */
  3269. spl_level = splhi();
  3270. #if IOPGSIZE == 4096
  3271. bridge->b_wid_control &= ~BRIDGE_CTRL_PAGE_SIZE;
  3272. #elif IOPGSIZE == 16384
  3273. bridge->b_wid_control |= BRIDGE_CTRL_PAGE_SIZE;
  3274. #else
  3275. <<<Unable to deal with IOPGSIZE >>>;
  3276. #endif
  3277. bridge->b_wid_control; /* inval addr bug war */
  3278. splx(spl_level);
  3279. /* Initialize internal mapping entries */
  3280. for (entry = 0; entry < pcibr_soft->bs_int_ate_size; entry++)
  3281.     bridge->b_int_ate_ram[entry].wr = 0;
  3282. /*
  3283.  * Determine if there's external mapping SSRAM on this
  3284.  * bridge.  Set up Bridge control register appropriately,
  3285.  * inititlize SSRAM, and set software up to manage RAM
  3286.  * entries as an allocatable resource.
  3287.  *
  3288.  * Currently, we just use the rm* routines to manage ATE
  3289.  * allocation.  We should probably replace this with a
  3290.  * Best Fit allocator.
  3291.  *
  3292.  * For now, if we have external SSRAM, avoid using
  3293.  * the internal ssram: we can't turn PREFETCH on
  3294.  * when we use the internal SSRAM; and besides,
  3295.  * this also guarantees that no allocation will
  3296.  * straddle the internal/external line, so we
  3297.  * can increment ATE write addresses rather than
  3298.  * recomparing against BRIDGE_INTERNAL_ATES every
  3299.  * time.
  3300.  */
  3301. if (is_xbridge(bridge))
  3302. num_entries = 0;
  3303. else
  3304. num_entries = pcibr_init_ext_ate_ram(bridge);
  3305. /* we always have 128 ATEs (512 for Xbridge) inside the chip
  3306.  * even if disabled for debugging.
  3307.  */
  3308. pcibr_soft->bs_int_ate_map = rmallocmap(pcibr_soft->bs_int_ate_size);
  3309. pcibr_ate_free(pcibr_soft, 0, pcibr_soft->bs_int_ate_size);
  3310. #if PCIBR_ATE_DEBUG
  3311. printk("pcibr_attach: %d INTERNAL ATEsn", pcibr_soft->bs_int_ate_size);
  3312. #endif
  3313. if (num_entries > pcibr_soft->bs_int_ate_size) {
  3314. #if PCIBR_ATE_NOTBOTH /* for debug -- forces us to use external ates */
  3315.     printk("pcibr_attach: disabling internal ATEs.n");
  3316.     pcibr_ate_alloc(pcibr_soft, pcibr_soft->bs_int_ate_size);
  3317. #endif
  3318.     pcibr_soft->bs_ext_ate_map = rmallocmap(num_entries);
  3319.     pcibr_ate_free(pcibr_soft, pcibr_soft->bs_int_ate_size,
  3320.    num_entries - pcibr_soft->bs_int_ate_size);
  3321. #if PCIBR_ATE_DEBUG
  3322.     printk("pcibr_attach: %d EXTERNAL ATEsn",
  3323.     num_entries - pcibr_soft->bs_int_ate_size);
  3324. #endif
  3325. }
  3326.     }
  3327.     {
  3328. bridgereg_t             dirmap;
  3329. iopaddr_t               xbase;
  3330. /*
  3331.  * now figure the *real* xtalk base address
  3332.  * that dirmap sends us to.
  3333.  */
  3334. dirmap = bridge->b_dir_map;
  3335. if (dirmap & BRIDGE_DIRMAP_OFF)
  3336.     xbase = (iopaddr_t)(dirmap & BRIDGE_DIRMAP_OFF)
  3337. << BRIDGE_DIRMAP_OFF_ADDRSHFT;
  3338. else if (dirmap & BRIDGE_DIRMAP_ADD512)
  3339.     xbase = 512 << 20;
  3340. else
  3341.     xbase = 0;
  3342. pcibr_soft->bs_dir_xbase = xbase;
  3343. /* it is entirely possible that we may, at this
  3344.  * point, have our dirmap pointing somewhere
  3345.  * other than our "master" port.
  3346.  */
  3347. pcibr_soft->bs_dir_xport =
  3348.     (dirmap & BRIDGE_DIRMAP_W_ID) >> BRIDGE_DIRMAP_W_ID_SHFT;
  3349.     }
  3350.     /* pcibr sources an error interrupt;
  3351.      * figure out where to send it.
  3352.      *
  3353.      * If any interrupts are enabled in bridge,
  3354.      * then the prom set us up and our interrupt
  3355.      * has already been reconnected in mlreset
  3356.      * above.
  3357.      *
  3358.      * Need to set the D_INTR_ISERR flag
  3359.      * in the dev_desc used for allocating the
  3360.      * error interrupt, so our interrupt will
  3361.      * be properly routed and prioritized.
  3362.      *
  3363.      * If our crosstalk provider wants to
  3364.      * fix widget error interrupts to specific
  3365.      * destinations, D_INTR_ISERR is how it
  3366.      * knows to do this.
  3367.      */
  3368.     xtalk_intr = xtalk_intr_alloc(xconn_vhdl, dev_desc, pcibr_vhdl);
  3369.     ASSERT(xtalk_intr != NULL);
  3370.     pcibr_soft->bsi_err_intr = xtalk_intr;
  3371.     /*
  3372.      * On IP35 with XBridge, we do some extra checks in pcibr_setwidint
  3373.      * in order to work around some addressing limitations.  In order
  3374.      * for that fire wall to work properly, we need to make sure we
  3375.      * start from a known clean state.
  3376.      */
  3377.     pcibr_clearwidint(bridge);
  3378.     xtalk_intr_connect(xtalk_intr, (xtalk_intr_setfunc_t)pcibr_setwidint, (void *)bridge);
  3379.     /*
  3380.      * now we can start handling error interrupts;
  3381.      * enable all of them.
  3382.      * NOTE: some PCI ints may already be enabled.
  3383.      */
  3384.     b_int_enable = bridge->b_int_enable | BRIDGE_ISR_ERRORS;
  3385.     bridge->b_int_enable = b_int_enable;
  3386.     bridge->b_int_mode = 0; /* do not send "clear interrupt" packets */
  3387.     bridge->b_wid_tflush; /* wait until Bridge PIO complete */
  3388.     /*
  3389.      * Depending on the rev of bridge, disable certain features.
  3390.      * Easiest way seems to be to force the PCIBR_NOwhatever
  3391.      * flag to be on for all DMA calls, which overrides any
  3392.      * PCIBR_whatever flag or even the setting of whatever
  3393.      * from the PCIIO_DMA_class flags (or even from the other
  3394.      * PCIBR flags, since NO overrides YES).
  3395.      */
  3396.     pcibr_soft->bs_dma_flags = 0;
  3397.     /* PREFETCH:
  3398.      * Always completely disabled for REV.A;
  3399.      * at "pcibr_prefetch_enable_rev", anyone
  3400.      * asking for PCIIO_PREFETCH gets it.
  3401.      * Between these two points, you have to ask
  3402.      * for PCIBR_PREFETCH, which promises that
  3403.      * your driver knows about known Bridge WARs.
  3404.      */
  3405.     if (pcibr_soft->bs_rev_num < BRIDGE_PART_REV_B)
  3406. pcibr_soft->bs_dma_flags |= PCIBR_NOPREFETCH;
  3407.     else if (pcibr_soft->bs_rev_num < 
  3408. (BRIDGE_WIDGET_PART_NUM << 4 | pcibr_prefetch_enable_rev))
  3409. pcibr_soft->bs_dma_flags |= PCIIO_NOPREFETCH;
  3410.     /* WRITE_GATHER:
  3411.      * Disabled up to but not including the
  3412.      * rev number in pcibr_wg_enable_rev. There
  3413.      * is no "WAR range" as with prefetch.
  3414.      */
  3415.     if (pcibr_soft->bs_rev_num < 
  3416. (BRIDGE_WIDGET_PART_NUM << 4 | pcibr_wg_enable_rev))
  3417. pcibr_soft->bs_dma_flags |= PCIBR_NOWRITE_GATHER;
  3418.     pciio_provider_register(pcibr_vhdl, &pcibr_provider);
  3419.     pciio_provider_startup(pcibr_vhdl);
  3420.     pci_io_fb = 0x00000004; /* I/O FreeBlock Base */
  3421.     pci_io_fl = 0xFFFFFFFF; /* I/O FreeBlock Last */
  3422.     pci_lo_fb = 0x00000010; /* Low Memory FreeBlock Base */
  3423.     pci_lo_fl = 0x001FFFFF; /* Low Memory FreeBlock Last */