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
6 * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved.
9 #include <linux/types.h>
10 #include <linux/config.h>
11 #include <linux/slab.h>
12 #include <linux/smp.h>
13 #include <asm/sn/sgi.h>
14 #include <asm/sn/io.h>
15 #include <asm/sn/sn_cpuid.h>
16 #include <asm/sn/klconfig.h>
17 #include <asm/sn/sn_private.h>
18 #include <asm/sn/pda.h>
20 extern void init_all_devices(void);
21 extern void klhwg_add_all_modules(vertex_hdl_t);
22 extern void klhwg_add_all_nodes(vertex_hdl_t);
24 extern int init_hcl(void);
25 extern vertex_hdl_t hwgraph_root;
26 extern void io_module_init(void);
27 extern int pci_bus_to_hcl_cvlink(void);
29 nasid_t console_nasid = (nasid_t) - 1;
30 char master_baseio_wid;
32 nasid_t master_baseio_nasid;
33 nasid_t master_nasid = INVALID_NASID; /* This is the partition master nasid */
38 * This code is executed once for each Hub chip.
41 per_hub_init(cnodeid_t cnode)
47 ii_ilcsr_u_t ii_ilcsr;
49 nasid = cnodeid_to_nasid(cnode);
51 ASSERT(nasid != INVALID_NASID);
52 ASSERT(nasid_to_cnodeid(nasid) == cnode);
54 npdap = NODEPDA(cnode);
56 /* Disable the request and reply errors. */
57 REMOTE_HUB_S(nasid, IIO_IWEIM, 0xC000);
60 * Set the total number of CRBs that can be used.
62 ii_icmr.ii_icmr_regval = 0x0;
63 ii_icmr.ii_icmr_fld_s.i_c_cnt = 0xf;
64 if (enable_shub_wars_1_1()) {
65 // Set bit one of ICMR to prevent II from sending interrupt for II bug.
66 ii_icmr.ii_icmr_regval |= 0x1;
68 REMOTE_HUB_S(nasid, IIO_ICMR, ii_icmr.ii_icmr_regval);
71 * Set the number of CRBs that both of the BTEs combined
74 ii_ibcr.ii_ibcr_regval = 0x0;
75 ii_ilcsr.ii_ilcsr_regval = REMOTE_HUB_L(nasid, IIO_LLP_CSR);
76 if (ii_ilcsr.ii_ilcsr_fld_s.i_llp_stat & LNK_STAT_WORKING) {
77 ii_ibcr.ii_ibcr_fld_s.i_count = 0x8;
80 * if the LLP is down, there is no attached I/O, so
81 * give BTE all the CRBs.
83 ii_ibcr.ii_ibcr_fld_s.i_count = 0x14;
85 REMOTE_HUB_S(nasid, IIO_IBCR, ii_ibcr.ii_ibcr_regval);
88 * Set CRB timeout to be 10ms.
90 REMOTE_HUB_S(nasid, IIO_ICTP, 0xffffff);
91 REMOTE_HUB_S(nasid, IIO_ICTO, 0xff);
93 /* Initialize error interrupts for this hub. */
94 hub_error_init(cnode);
98 * This routine is responsible for the setup of all the IRIX hwgraph style
99 * stuff that's been pulled into linux. It's called by sn_pci_find_bios which
100 * is called just before the generic Linux PCI layer does its probing (by
101 * platform_pci_fixup aka sn_pci_fixup).
103 * It is very IMPORTANT that this call is only made by the Master CPU!
108 sgi_master_io_infr_init(void)
112 if (init_hcl() < 0) { /* Sets up the hwgraph compatibility layer */
113 printk("sgi_master_io_infr_init: Cannot init hcl\n");
118 * Initialize platform-dependent vertices in the hwgraph:
129 io_module_init(); /* Use to be called module_init() .. */
130 klhwg_add_all_modules(hwgraph_root);
131 klhwg_add_all_nodes(hwgraph_root);
133 for (cnode = 0; cnode < numionodes; cnode++) {
134 extern void per_hub_init(cnodeid_t);
140 * Our IO Infrastructure drivers are in place ..
141 * Initialize the whole IO Infrastructure .. xwidget/device probes.
145 pci_bus_to_hcl_cvlink();
149 check_nasid_equiv(nasid_t nasida, nasid_t nasidb)
151 if ((nasida == nasidb)
152 || (nasida == NODEPDA(nasid_to_cnodeid(nasidb))->xbow_peer))
159 is_master_baseio_nasid_widget(nasid_t test_nasid, xwidgetnum_t test_wid)
162 * If the widget numbers are different, we're not the master.
164 if (test_wid != (xwidgetnum_t) master_baseio_wid) {
169 * If the NASIDs are the same or equivalent, we're the master.
171 if (check_nasid_equiv(test_nasid, master_baseio_nasid)) {