1/*
2 * Machine vector for IA-64.
3 *
4 * Copyright (C) 1999 Silicon Graphics, Inc.
5 * Copyright (C) Srinivasa Thirumalachar <sprasad@engr.sgi.com>
6 * Copyright (C) Vijay Chander <vijay@engr.sgi.com>
7 * Copyright (C) 1999-2001 Hewlett-Packard Co.
8 *	David Mosberger-Tang <davidm@hpl.hp.com>
9 */
10#ifndef _ASM_IA64_MACHVEC_H
11#define _ASM_IA64_MACHVEC_H
12
13#include <linux/config.h>
14#include <linux/types.h>
15
16/* forward declarations: */
17struct pci_dev;
18struct pt_regs;
19struct scatterlist;
20struct irq_desc;
21struct page;
22
23typedef void ia64_mv_setup_t (char **);
24typedef void ia64_mv_cpu_init_t(void);
25typedef void ia64_mv_irq_init_t (void);
26typedef void ia64_mv_pci_fixup_t (int);
27typedef void ia64_mv_pci_enable_device_t (struct pci_dev *);
28typedef unsigned long ia64_mv_map_nr_t (unsigned long);
29typedef void ia64_mv_mca_init_t (void);
30typedef void ia64_mv_mca_handler_t (void);
31typedef void ia64_mv_cmci_handler_t (int, void *, struct pt_regs *);
32typedef void ia64_mv_log_print_t (void);
33typedef void ia64_mv_send_ipi_t (int, int, int, int);
34typedef void ia64_mv_global_tlb_purge_t (unsigned long, unsigned long, unsigned long);
35typedef struct irq_desc *ia64_mv_irq_desc (unsigned int);
36typedef u8 ia64_mv_irq_to_vector (u8);
37typedef unsigned int ia64_mv_local_vector_to_irq (u8 vector);
38
39/* PCI-DMA interface: */
40typedef void ia64_mv_pci_dma_init (void);
41typedef void *ia64_mv_pci_alloc_consistent (struct pci_dev *, size_t, dma_addr_t *);
42typedef void ia64_mv_pci_free_consistent (struct pci_dev *, size_t, void *, dma_addr_t);
43typedef dma_addr_t ia64_mv_pci_map_single (struct pci_dev *, void *, size_t, int);
44typedef void ia64_mv_pci_unmap_single (struct pci_dev *, dma_addr_t, size_t, int);
45typedef int ia64_mv_pci_map_sg (struct pci_dev *, struct scatterlist *, int, int);
46typedef void ia64_mv_pci_unmap_sg (struct pci_dev *, struct scatterlist *, int, int);
47typedef void ia64_mv_pci_dma_sync_single (struct pci_dev *, dma_addr_t, size_t, int);
48typedef void ia64_mv_pci_dma_sync_sg (struct pci_dev *, struct scatterlist *, int, int);
49typedef unsigned long ia64_mv_pci_dma_address (struct scatterlist *);
50typedef int ia64_mv_pci_dma_supported (struct pci_dev *, u64);
51
52/*
53 * WARNING: The legacy I/O space is _architected_.  Platforms are
54 * expected to follow this architected model (see Section 10.7 in the
55 * IA-64 Architecture Software Developer's Manual).  Unfortunately,
56 * some broken machines do not follow that model, which is why we have
57 * to make the inX/outX operations part of the machine vector.
58 * Platform designers should follow the architected model whenever
59 * possible.
60 */
61typedef unsigned int ia64_mv_inb_t (unsigned long);
62typedef unsigned int ia64_mv_inw_t (unsigned long);
63typedef unsigned int ia64_mv_inl_t (unsigned long);
64typedef void ia64_mv_outb_t (unsigned char, unsigned long);
65typedef void ia64_mv_outw_t (unsigned short, unsigned long);
66typedef void ia64_mv_outl_t (unsigned int, unsigned long);
67
68extern void machvec_noop (void);
69
70# if defined (CONFIG_IA64_HP_SIM)
71#  include <asm/machvec_hpsim.h>
72# elif defined (CONFIG_IA64_DIG)
73#  include <asm/machvec_dig.h>
74# elif defined (CONFIG_IA64_HP_ZX1)
75#  include <asm/machvec_hpzx1.h>
76# elif defined (CONFIG_IA64_SGI_SN1)
77#  include <asm/machvec_sn1.h>
78# elif defined (CONFIG_IA64_SGI_SN2)
79#  include <asm/machvec_sn2.h>
80# elif defined (CONFIG_IA64_GENERIC)
81
82# ifdef MACHVEC_PLATFORM_HEADER
83#  include MACHVEC_PLATFORM_HEADER
84# else
85#  define platform_name		ia64_mv.name
86#  define platform_setup	ia64_mv.setup
87#  define platform_cpu_init	ia64_mv.cpu_init
88#  define platform_irq_init	ia64_mv.irq_init
89#  define platform_map_nr	ia64_mv.map_nr
90#  define platform_mca_init	ia64_mv.mca_init
91#  define platform_mca_handler	ia64_mv.mca_handler
92#  define platform_cmci_handler	ia64_mv.cmci_handler
93#  define platform_log_print	ia64_mv.log_print
94#  define platform_pci_fixup	ia64_mv.pci_fixup
95#  define platform_pci_enable_device	ia64_mv.pci_enable_device
96#  define platform_send_ipi		ia64_mv.send_ipi
97#  define platform_global_tlb_purge	ia64_mv.global_tlb_purge
98#  define platform_pci_dma_init		ia64_mv.dma_init
99#  define platform_pci_alloc_consistent	ia64_mv.alloc_consistent
100#  define platform_pci_free_consistent	ia64_mv.free_consistent
101#  define platform_pci_map_single	ia64_mv.map_single
102#  define platform_pci_unmap_single	ia64_mv.unmap_single
103#  define platform_pci_map_sg		ia64_mv.map_sg
104#  define platform_pci_unmap_sg		ia64_mv.unmap_sg
105#  define platform_pci_dma_sync_single	ia64_mv.sync_single
106#  define platform_pci_dma_sync_sg	ia64_mv.sync_sg
107#  define platform_pci_dma_address	ia64_mv.dma_address
108#  define platform_pci_dma_supported	ia64_mv.dma_supported
109#  define platform_irq_desc		ia64_mv.irq_desc
110#  define platform_irq_to_vector	ia64_mv.irq_to_vector
111#  define platform_local_vector_to_irq	ia64_mv.local_vector_to_irq
112#  define platform_inb		ia64_mv.inb
113#  define platform_inw		ia64_mv.inw
114#  define platform_inl		ia64_mv.inl
115#  define platform_outb		ia64_mv.outb
116#  define platform_outw		ia64_mv.outw
117#  define platform_outl		ia64_mv.outl
118# endif
119
120struct ia64_machine_vector {
121	const char *name;
122	ia64_mv_setup_t *setup;
123	ia64_mv_cpu_init_t *cpu_init;
124	ia64_mv_irq_init_t *irq_init;
125	ia64_mv_pci_fixup_t *pci_fixup;
126	ia64_mv_pci_enable_device_t *pci_enable_device;
127	ia64_mv_map_nr_t *map_nr;
128	ia64_mv_mca_init_t *mca_init;
129	ia64_mv_mca_handler_t *mca_handler;
130	ia64_mv_cmci_handler_t *cmci_handler;
131	ia64_mv_log_print_t *log_print;
132	ia64_mv_send_ipi_t *send_ipi;
133	ia64_mv_global_tlb_purge_t *global_tlb_purge;
134	ia64_mv_pci_dma_init *dma_init;
135	ia64_mv_pci_alloc_consistent *alloc_consistent;
136	ia64_mv_pci_free_consistent *free_consistent;
137	ia64_mv_pci_map_single *map_single;
138	ia64_mv_pci_unmap_single *unmap_single;
139	ia64_mv_pci_map_sg *map_sg;
140	ia64_mv_pci_unmap_sg *unmap_sg;
141	ia64_mv_pci_dma_sync_single *sync_single;
142	ia64_mv_pci_dma_sync_sg *sync_sg;
143	ia64_mv_pci_dma_address *dma_address;
144	ia64_mv_pci_dma_supported *dma_supported;
145	ia64_mv_irq_desc *irq_desc;
146	ia64_mv_irq_to_vector *irq_to_vector;
147	ia64_mv_local_vector_to_irq *local_vector_to_irq;
148	ia64_mv_inb_t *inb;
149	ia64_mv_inw_t *inw;
150	ia64_mv_inl_t *inl;
151	ia64_mv_outb_t *outb;
152	ia64_mv_outw_t *outw;
153	ia64_mv_outl_t *outl;
154};
155
156#define MACHVEC_INIT(name)			\
157{						\
158	#name,					\
159	platform_setup,				\
160	platform_cpu_init,			\
161	platform_irq_init,			\
162	platform_pci_fixup,			\
163	platform_pci_enable_device,		\
164	platform_map_nr,			\
165	platform_mca_init,			\
166	platform_mca_handler,			\
167	platform_cmci_handler,			\
168	platform_log_print,			\
169	platform_send_ipi,			\
170	platform_global_tlb_purge,		\
171	platform_pci_dma_init,			\
172	platform_pci_alloc_consistent,		\
173	platform_pci_free_consistent,		\
174	platform_pci_map_single,		\
175	platform_pci_unmap_single,		\
176	platform_pci_map_sg,			\
177	platform_pci_unmap_sg,			\
178	platform_pci_dma_sync_single,		\
179	platform_pci_dma_sync_sg,		\
180	platform_pci_dma_address,		\
181	platform_pci_dma_supported,		\
182	platform_irq_desc,			\
183	platform_irq_to_vector,			\
184	platform_local_vector_to_irq,		\
185	platform_inb,				\
186	platform_inw,				\
187	platform_inl,				\
188	platform_outb,				\
189	platform_outw,				\
190	platform_outl				\
191}
192
193extern struct ia64_machine_vector ia64_mv;
194extern void machvec_init (const char *name);
195
196# else
197#  error Unknown configuration.  Update asm-ia64/machvec.h.
198# endif /* CONFIG_IA64_GENERIC */
199
200/*
201 * Declare default routines which aren't declared anywhere else:
202 */
203extern ia64_mv_pci_dma_init swiotlb_init;
204extern ia64_mv_pci_alloc_consistent swiotlb_alloc_consistent;
205extern ia64_mv_pci_free_consistent swiotlb_free_consistent;
206extern ia64_mv_pci_map_single swiotlb_map_single;
207extern ia64_mv_pci_unmap_single swiotlb_unmap_single;
208extern ia64_mv_pci_map_sg swiotlb_map_sg;
209extern ia64_mv_pci_unmap_sg swiotlb_unmap_sg;
210extern ia64_mv_pci_dma_sync_single swiotlb_sync_single;
211extern ia64_mv_pci_dma_sync_sg swiotlb_sync_sg;
212extern ia64_mv_pci_dma_address swiotlb_dma_address;
213extern ia64_mv_pci_dma_supported swiotlb_pci_dma_supported;
214
215/*
216 * Define default versions so we can extend machvec for new platforms without having
217 * to update the machvec files for all existing platforms.
218 */
219#ifndef platform_setup
220# define platform_setup		((ia64_mv_setup_t *) machvec_noop)
221#endif
222#ifndef platform_cpu_init
223# define platform_cpu_init	((ia64_mv_cpu_init_t *) machvec_noop)
224#endif
225#ifndef platform_irq_init
226# define platform_irq_init	((ia64_mv_irq_init_t *) machvec_noop)
227#endif
228#ifndef platform_mca_init
229# define platform_mca_init	((ia64_mv_mca_init_t *) machvec_noop)
230#endif
231#ifndef platform_mca_handler
232# define platform_mca_handler	((ia64_mv_mca_handler_t *) machvec_noop)
233#endif
234#ifndef platform_cmci_handler
235# define platform_cmci_handler	((ia64_mv_cmci_handler_t *) machvec_noop)
236#endif
237#ifndef platform_log_print
238# define platform_log_print	((ia64_mv_log_print_t *) machvec_noop)
239#endif
240#ifndef platform_pci_fixup
241# define platform_pci_fixup	((ia64_mv_pci_fixup_t *) machvec_noop)
242#endif
243#ifndef platform_pci_enable_device
244# define platform_pci_enable_device	((ia64_mv_pci_enable_device_t *) machvec_noop)
245#endif
246#ifndef platform_send_ipi
247# define platform_send_ipi	ia64_send_ipi	/* default to architected version */
248#endif
249#ifndef platform_global_tlb_purge
250# define platform_global_tlb_purge	ia64_global_tlb_purge /* default to architected version */
251#endif
252#ifndef platform_pci_dma_init
253# define platform_pci_dma_init		swiotlb_init
254#endif
255#ifndef platform_pci_alloc_consistent
256# define platform_pci_alloc_consistent	swiotlb_alloc_consistent
257#endif
258#ifndef platform_pci_free_consistent
259# define platform_pci_free_consistent	swiotlb_free_consistent
260#endif
261#ifndef platform_pci_map_single
262# define platform_pci_map_single	swiotlb_map_single
263#endif
264#ifndef platform_pci_unmap_single
265# define platform_pci_unmap_single	swiotlb_unmap_single
266#endif
267#ifndef platform_pci_map_sg
268# define platform_pci_map_sg		swiotlb_map_sg
269#endif
270#ifndef platform_pci_unmap_sg
271# define platform_pci_unmap_sg		swiotlb_unmap_sg
272#endif
273#ifndef platform_pci_dma_sync_single
274# define platform_pci_dma_sync_single	swiotlb_sync_single
275#endif
276#ifndef platform_pci_dma_sync_sg
277# define platform_pci_dma_sync_sg	swiotlb_sync_sg
278#endif
279#ifndef platform_pci_dma_address
280# define  platform_pci_dma_address	swiotlb_dma_address
281#endif
282#ifndef platform_pci_dma_supported
283# define  platform_pci_dma_supported	swiotlb_pci_dma_supported
284#endif
285#ifndef platform_irq_desc
286# define platform_irq_desc		__ia64_irq_desc
287#endif
288#ifndef platform_irq_to_vector
289# define platform_irq_to_vector		__ia64_irq_to_vector
290#endif
291#ifndef platform_local_vector_to_irq
292# define platform_local_vector_to_irq	__ia64_local_vector_to_irq
293#endif
294#ifndef platform_inb
295# define platform_inb		__ia64_inb
296#endif
297#ifndef platform_inw
298# define platform_inw		__ia64_inw
299#endif
300#ifndef platform_inl
301# define platform_inl		__ia64_inl
302#endif
303#ifndef platform_outb
304# define platform_outb		__ia64_outb
305#endif
306#ifndef platform_outw
307# define platform_outw		__ia64_outw
308#endif
309#ifndef platform_outl
310# define platform_outl		__ia64_outl
311#endif
312
313#endif /* _ASM_IA64_MACHVEC_H */
314