1 /* $Id: sn_private.h,v 1.1 2002/02/28 17:31:26 marcelo Exp $
2  *
3  * This file is subject to the terms and conditions of the GNU General Public
4  * License.  See the file "COPYING" in the main directory of this archive
5  * for more details.
6  *
7  * Copyright (C) 1992 - 1997, 2000-2003 Silicon Graphics, Inc. All rights reserved.
8  */
9 #ifndef _ASM_IA64_SN_SN2_SN_PRIVATE_H
10 #define _ASM_IA64_SN_SN2_SN_PRIVATE_H
11 
12 #include <asm/sn/nodepda.h>
13 #include <asm/sn/io.h>
14 #include <asm/sn/xtalk/xwidget.h>
15 #include <asm/sn/xtalk/xtalk_private.h>
16 
17 extern nasid_t master_nasid;
18 
19 /* promif.c */
20 extern void he_arcs_set_vectors(void);
21 extern void mem_init(void);
22 extern void cpu_unenable(cpuid_t);
23 extern nasid_t get_lowest_nasid(void);
24 extern __psunsigned_t get_master_bridge_base(void);
25 extern void set_master_bridge_base(void);
26 extern int check_nasid_equiv(nasid_t, nasid_t);
27 extern char get_console_pcislot(void);
28 
29 extern int is_master_baseio_nasid_widget(nasid_t test_nasid, xwidgetnum_t test_wid);
30 
31 /* memsupport.c */
32 extern void poison_state_alter_range(__psunsigned_t start, int len, int poison);
33 extern int memory_present(paddr_t);
34 extern int memory_read_accessible(paddr_t);
35 extern int memory_write_accessible(paddr_t);
36 extern void memory_set_access(paddr_t, int, int);
37 extern void show_dir_state(paddr_t, void (*)(char *, ...));
38 extern void check_dir_state(nasid_t, int, void (*)(char *, ...));
39 extern void set_dir_owner(paddr_t, int);
40 extern void set_dir_state(paddr_t, int);
41 extern void set_dir_state_POISONED(paddr_t);
42 extern void set_dir_state_UNOWNED(paddr_t);
43 extern int is_POISONED_dir_state(paddr_t);
44 extern int is_UNOWNED_dir_state(paddr_t);
45 #ifdef LATER
46 extern void get_dir_ent(paddr_t paddr, int *state,
47 			uint64_t *vec_ptr, hubreg_t *elo);
48 #endif
49 
50 /* intr.c */
51 extern int intr_reserve_level(cpuid_t cpu, int level, int err, vertex_hdl_t owner_dev, char *name);
52 extern void intr_unreserve_level(cpuid_t cpu, int level);
53 extern int intr_connect_level(cpuid_t cpu, int bit, ilvl_t mask_no,
54 			intr_func_t intr_prefunc);
55 extern int intr_disconnect_level(cpuid_t cpu, int bit);
56 extern cpuid_t intr_heuristic(vertex_hdl_t dev, device_desc_t dev_desc,
57 			      int req_bit,int intr_resflags,vertex_hdl_t owner_dev,
58 			      char *intr_name,int *resp_bit);
59 extern void intr_block_bit(cpuid_t cpu, int bit);
60 extern void intr_unblock_bit(cpuid_t cpu, int bit);
61 extern void setrtvector(intr_func_t);
62 extern void install_cpuintr(cpuid_t cpu);
63 extern void install_dbgintr(cpuid_t cpu);
64 extern void install_tlbintr(cpuid_t cpu);
65 extern void hub_migrintr_init(cnodeid_t /*cnode*/);
66 extern int cause_intr_connect(int level, intr_func_t handler, uint intr_spl_mask);
67 extern int cause_intr_disconnect(int level);
68 extern void intr_dumpvec(cnodeid_t cnode, void (*pf)(char *, ...));
69 
70 /* error_dump.c */
71 extern char *hub_rrb_err_type[];
72 extern char *hub_wrb_err_type[];
73 
74 void nmi_dump(void);
75 void install_cpu_nmi_handler(int slice);
76 
77 /* klclock.c */
78 extern void hub_rtc_init(cnodeid_t);
79 
80 /* bte.c */
81 void bte_lateinit(void);
82 void bte_wait_for_xfer_completion(void *);
83 
84 /* klgraph.c */
85 void klhwg_add_all_nodes(vertex_hdl_t);
86 void klhwg_add_all_modules(vertex_hdl_t);
87 
88 /* klidbg.c */
89 void install_klidbg_functions(void);
90 
91 /* klnuma.c */
92 extern void replicate_kernel_text(int numnodes);
93 extern __psunsigned_t get_freemem_start(cnodeid_t cnode);
94 extern void setup_replication_mask(int maxnodes);
95 
96 /* init.c */
97 extern cnodeid_t get_compact_nodeid(void);	/* get compact node id */
98 extern void init_platform_nodepda(nodepda_t *npda, cnodeid_t node);
99 extern void per_cpu_init(void);
100 extern int is_fine_dirmode(void);
101 extern void update_node_information(cnodeid_t);
102 
103 /* shubio.c */
104 extern void hubio_init(void);
105 extern void hub_merge_clean(nasid_t nasid);
106 extern void hub_set_piomode(nasid_t nasid, int conveyor);
107 
108 /* shuberror.c */
109 extern void hub_error_init(cnodeid_t);
110 extern void dump_error_spool(cpuid_t cpu, void (*pf)(char *, ...));
111 extern void hubni_error_handler(char *, int);
112 extern int check_ni_errors(void);
113 
114 /* Used for debugger to signal upper software a breakpoint has taken place */
115 
116 extern void		*debugger_update;
117 extern __psunsigned_t	debugger_stopped;
118 
119 /*
120  * piomap, created by shub_pio_alloc.
121  * xtalk_info MUST BE FIRST, since this structure is cast to a
122  * xtalk_piomap_s by generic xtalk routines.
123  */
124 struct hub_piomap_s {
125 	struct xtalk_piomap_s	hpio_xtalk_info;/* standard crosstalk pio info */
126 	vertex_hdl_t		hpio_hub;	/* which shub's mapping registers are set up */
127 	short			hpio_holdcnt;	/* count of current users of bigwin mapping */
128 	char			hpio_bigwin_num;/* if big window map, which one */
129 	int 			hpio_flags;	/* defined below */
130 };
131 /* hub_piomap flags */
132 #define HUB_PIOMAP_IS_VALID		0x1
133 #define HUB_PIOMAP_IS_BIGWINDOW		0x2
134 #define HUB_PIOMAP_IS_FIXED		0x4
135 
136 #define	hub_piomap_xt_piomap(hp)	(&hp->hpio_xtalk_info)
137 #define	hub_piomap_hub_v(hp)	(hp->hpio_hub)
138 #define	hub_piomap_winnum(hp)	(hp->hpio_bigwin_num)
139 
140 /*
141  * dmamap, created by shub_pio_alloc.
142  * xtalk_info MUST BE FIRST, since this structure is cast to a
143  * xtalk_dmamap_s by generic xtalk routines.
144  */
145 struct hub_dmamap_s {
146 	struct xtalk_dmamap_s	hdma_xtalk_info;/* standard crosstalk dma info */
147 	vertex_hdl_t		hdma_hub;	/* which shub we go through */
148 	int			hdma_flags;	/* defined below */
149 };
150 /* shub_dmamap flags */
151 #define HUB_DMAMAP_IS_VALID		0x1
152 #define HUB_DMAMAP_USED			0x2
153 #define	HUB_DMAMAP_IS_FIXED		0x4
154 
155 /*
156  * interrupt handle, created by shub_intr_alloc.
157  * xtalk_info MUST BE FIRST, since this structure is cast to a
158  * xtalk_intr_s by generic xtalk routines.
159  */
160 struct hub_intr_s {
161 	struct xtalk_intr_s	i_xtalk_info;	/* standard crosstalk intr info */
162 	ilvl_t			i_swlevel;	/* software level for blocking intr */
163 	cpuid_t			i_cpuid;	/* which cpu */
164 	int			i_bit;		/* which bit */
165 	int			i_flags;
166 };
167 /* flag values */
168 #define HUB_INTR_IS_ALLOCED	0x1	/* for debug: allocated */
169 #define HUB_INTR_IS_CONNECTED	0x4	/* for debug: connected to a software driver */
170 
171 typedef struct hubinfo_s {
172 	nodepda_t			*h_nodepda;	/* pointer to node's private data area */
173 	cnodeid_t			h_cnodeid;	/* compact nodeid */
174 	nasid_t				h_nasid;	/* nasid */
175 
176 	/* structures for PIO management */
177 	xwidgetnum_t			h_widgetid;	/* my widget # (as viewed from xbow) */
178 	struct hub_piomap_s		h_small_window_piomap[HUB_WIDGET_ID_MAX+1];
179 	sv_t				h_bwwait;	/* wait for big window to free */
180 	spinlock_t			h_bwlock;	/* guard big window piomap's */
181 	spinlock_t			h_crblock;      /* gaurd CRB error handling */
182 	int				h_num_big_window_fixed;	/* count number of FIXED maps */
183 	struct hub_piomap_s		h_big_window_piomap[HUB_NUM_BIG_WINDOW];
184 	hub_intr_t			hub_ii_errintr;
185 } *hubinfo_t;
186 
187 #define hubinfo_get(vhdl, infoptr) ((void)hwgraph_info_get_LBL \
188 	(vhdl, INFO_LBL_NODE_INFO, (arbitrary_info_t *)infoptr))
189 
190 #define hubinfo_set(vhdl, infoptr) (void)hwgraph_info_add_LBL \
191 	(vhdl, INFO_LBL_NODE_INFO, (arbitrary_info_t)infoptr)
192 
193 #define	hubinfo_to_hubv(hinfo, hub_v)	(hinfo->h_nodepda->node_vertex)
194 
195 /*
196  * Hub info PIO map access functions.
197  */
198 #define	hubinfo_bwin_piomap_get(hinfo, win) 	\
199 			(&hinfo->h_big_window_piomap[win])
200 #define	hubinfo_swin_piomap_get(hinfo, win)	\
201 			(&hinfo->h_small_window_piomap[win])
202 
203 /* cpu-specific information stored under INFO_LBL_CPU_INFO */
204 typedef struct cpuinfo_s {
205 	cpuid_t		ci_cpuid;	/* CPU ID */
206 } *cpuinfo_t;
207 
208 #define cpuinfo_get(vhdl, infoptr) ((void)hwgraph_info_get_LBL \
209 	(vhdl, INFO_LBL_CPU_INFO, (arbitrary_info_t *)infoptr))
210 
211 #define cpuinfo_set(vhdl, infoptr) (void)hwgraph_info_add_LBL \
212 	(vhdl, INFO_LBL_CPU_INFO, (arbitrary_info_t)infoptr)
213 
214 /* Special initialization function for xswitch vertices created during startup. */
215 extern void xswitch_vertex_init(vertex_hdl_t xswitch);
216 
217 extern xtalk_provider_t hub_provider;
218 
219 /* du.c */
220 int ducons_write(char *buf, int len);
221 
222 /* memerror.c */
223 
224 extern void install_eccintr(cpuid_t cpu);
225 extern void memerror_get_stats(cnodeid_t cnode,
226 			       int *bank_stats, int *bank_stats_max);
227 extern void probe_md_errors(nasid_t);
228 /* sysctlr.c */
229 extern void sysctlr_init(void);
230 extern void sysctlr_power_off(int sdonly);
231 extern void sysctlr_keepalive(void);
232 
233 #define valid_cpuid(_x)		(((_x) >= 0) && ((_x) < maxcpus))
234 
235 /* Useful definitions to get the memory dimm given a physical
236  * address.
237  */
238 #define paddr_dimm(_pa)		((_pa & MD_BANK_MASK) >> MD_BANK_SHFT)
239 #define paddr_cnode(_pa)	(NASID_TO_COMPACT_NODEID(NASID_GET(_pa)))
240 extern void membank_pathname_get(paddr_t,char *);
241 
242 /* To redirect the output into the error buffer */
243 #define errbuf_print(_s)	printf("#%s",_s)
244 
245 extern void crbx(nasid_t nasid, void (*pf)(char *, ...));
246 void bootstrap(void);
247 
248 /* sndrv.c */
249 extern int sndrv_attach(vertex_hdl_t vertex);
250 
251 #endif /* _ASM_IA64_SN_SN2_SN_PRIVATE_H */
252