This source file includes following definitions.
- sio_init_irq
- alphabook1_init_arch
- sio_pci_route
- sio_pci_dev_irq_needs_level
- sio_collect_irq_levels
- __sio_fixup_irq_levels
- sio_fixup_irq_levels
- noname_map_irq
- p2k_map_irq
- noname_init_pci
- alphabook1_init_pci
- sio_kill_arch
1
2
3
4
5
6
7
8
9
10
11
12
13
14 #include <linux/kernel.h>
15 #include <linux/types.h>
16 #include <linux/mm.h>
17 #include <linux/sched.h>
18 #include <linux/pci.h>
19 #include <linux/init.h>
20 #include <linux/screen_info.h>
21
22 #include <asm/compiler.h>
23 #include <asm/ptrace.h>
24 #include <asm/dma.h>
25 #include <asm/irq.h>
26 #include <asm/mmu_context.h>
27 #include <asm/io.h>
28 #include <asm/pgtable.h>
29 #include <asm/core_apecs.h>
30 #include <asm/core_lca.h>
31 #include <asm/tlbflush.h>
32
33 #include "proto.h"
34 #include "irq_impl.h"
35 #include "pci_impl.h"
36 #include "machvec_impl.h"
37 #include "pc873xx.h"
38
39 #if defined(ALPHA_RESTORE_SRM_SETUP)
40
41 struct
42 {
43 unsigned int orig_route_tab;
44 } saved_config __attribute((common));
45 #endif
46
47
48 static void __init
49 sio_init_irq(void)
50 {
51 if (alpha_using_srm)
52 alpha_mv.device_interrupt = srm_device_interrupt;
53
54 init_i8259a_irqs();
55 common_init_isa_dma();
56 }
57
58 static inline void __init
59 alphabook1_init_arch(void)
60 {
61
62
63 screen_info.orig_y = 37;
64 screen_info.orig_video_cols = 100;
65 screen_info.orig_video_lines = 37;
66
67 lca_init_arch();
68 }
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85 static void __init
86 sio_pci_route(void)
87 {
88 unsigned int orig_route_tab;
89
90
91 pci_bus_read_config_dword(pci_isa_hose->bus, PCI_DEVFN(7, 0), 0x60,
92 &orig_route_tab);
93 printk("%s: PIRQ original 0x%x new 0x%x\n", __func__,
94 orig_route_tab, alpha_mv.sys.sio.route_tab);
95
96 #if defined(ALPHA_RESTORE_SRM_SETUP)
97 saved_config.orig_route_tab = orig_route_tab;
98 #endif
99
100
101 pci_bus_write_config_dword(pci_isa_hose->bus, PCI_DEVFN(7, 0), 0x60,
102 alpha_mv.sys.sio.route_tab);
103 }
104
105 static bool sio_pci_dev_irq_needs_level(const struct pci_dev *dev)
106 {
107 if ((dev->class >> 16 == PCI_BASE_CLASS_BRIDGE) &&
108 (dev->class >> 8 != PCI_CLASS_BRIDGE_PCMCIA))
109 return false;
110
111 return true;
112 }
113
114 static unsigned int __init
115 sio_collect_irq_levels(void)
116 {
117 unsigned int level_bits = 0;
118 struct pci_dev *dev = NULL;
119
120
121 for_each_pci_dev(dev) {
122 if (!sio_pci_dev_irq_needs_level(dev))
123 continue;
124
125 if (dev->irq)
126 level_bits |= (1 << dev->irq);
127 }
128 return level_bits;
129 }
130
131 static void __sio_fixup_irq_levels(unsigned int level_bits, bool reset)
132 {
133 unsigned int old_level_bits;
134
135
136
137
138
139
140
141
142
143
144
145
146
147 old_level_bits = inb(0x4d0) | (inb(0x4d1) << 8);
148
149 if (reset)
150 old_level_bits &= 0x71ff;
151
152 level_bits |= old_level_bits;
153
154 outb((level_bits >> 0) & 0xff, 0x4d0);
155 outb((level_bits >> 8) & 0xff, 0x4d1);
156 }
157
158 static inline void
159 sio_fixup_irq_levels(unsigned int level_bits)
160 {
161 __sio_fixup_irq_levels(level_bits, true);
162 }
163
164 static inline int
165 noname_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
166 {
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185 static char irq_tab[][5] = {
186
187 { 3, 3, 3, 3, 3},
188 {-1, -1, -1, -1, -1},
189 { 2, 2, -1, -1, -1},
190 {-1, -1, -1, -1, -1},
191 {-1, -1, -1, -1, -1},
192 { 0, 0, 2, 1, 0},
193 { 1, 1, 0, 2, 1},
194 { 2, 2, 1, 0, 2},
195 { 0, 0, 0, 0, 0},
196 };
197 const long min_idsel = 6, max_idsel = 14, irqs_per_slot = 5;
198 int irq = COMMON_TABLE_LOOKUP, tmp;
199 tmp = __kernel_extbl(alpha_mv.sys.sio.route_tab, irq);
200
201 irq = irq >= 0 ? tmp : -1;
202
203
204 if (sio_pci_dev_irq_needs_level(dev) && irq >= 0)
205 __sio_fixup_irq_levels(1 << irq, false);
206
207 return irq;
208 }
209
210 static inline int
211 p2k_map_irq(const struct pci_dev *dev, u8 slot, u8 pin)
212 {
213 static char irq_tab[][5] = {
214
215 { 0, 0, -1, -1, -1},
216 {-1, -1, -1, -1, -1},
217 { 1, 1, 2, 3, 0},
218 { 2, 2, 3, 0, 1},
219 {-1, -1, -1, -1, -1},
220 {-1, -1, -1, -1, -1},
221 { 3, 3, -1, -1, -1},
222 };
223 const long min_idsel = 6, max_idsel = 12, irqs_per_slot = 5;
224 int irq = COMMON_TABLE_LOOKUP, tmp;
225 tmp = __kernel_extbl(alpha_mv.sys.sio.route_tab, irq);
226 return irq >= 0 ? tmp : -1;
227 }
228
229 static inline void __init
230 noname_init_pci(void)
231 {
232 common_init_pci();
233 sio_pci_route();
234 sio_fixup_irq_levels(sio_collect_irq_levels());
235
236 if (pc873xx_probe() == -1) {
237 printk(KERN_ERR "Probing for PC873xx Super IO chip failed.\n");
238 } else {
239 printk(KERN_INFO "Found %s Super IO chip at 0x%x\n",
240 pc873xx_get_model(), pc873xx_get_base());
241
242
243
244
245
246
247
248 #if !defined(CONFIG_ALPHA_AVANTI)
249
250
251
252 pc873xx_enable_ide();
253 #endif
254 pc873xx_enable_epp19();
255 }
256 }
257
258 static inline void __init
259 alphabook1_init_pci(void)
260 {
261 struct pci_dev *dev;
262 unsigned char orig, config;
263
264 common_init_pci();
265 sio_pci_route();
266
267
268
269
270
271
272
273
274
275
276
277
278 dev = NULL;
279 while ((dev = pci_get_device(PCI_VENDOR_ID_NCR, PCI_ANY_ID, dev))) {
280 if (dev->device == PCI_DEVICE_ID_NCR_53C810
281 || dev->device == PCI_DEVICE_ID_NCR_53C815
282 || dev->device == PCI_DEVICE_ID_NCR_53C820
283 || dev->device == PCI_DEVICE_ID_NCR_53C825) {
284 unsigned long io_port;
285 unsigned char ctest4;
286
287 io_port = dev->resource[0].start;
288 ctest4 = inb(io_port+0x21);
289 if (!(ctest4 & 0x80)) {
290 printk("AlphaBook1 NCR init: setting"
291 " burst disable\n");
292 outb(ctest4 | 0x80, io_port+0x21);
293 }
294 }
295 }
296
297
298 sio_fixup_irq_levels(0);
299
300
301 outb(0x0f, 0x3ce); orig = inb(0x3cf);
302 outb(0x0f, 0x3ce); outb(0x05, 0x3cf);
303 outb(0x0b, 0x3ce); config = inb(0x3cf);
304 if ((config & 0xc0) != 0xc0) {
305 printk("AlphaBook1 VGA init: setting 1Mb memory\n");
306 config |= 0xc0;
307 outb(0x0b, 0x3ce); outb(config, 0x3cf);
308 }
309 outb(0x0f, 0x3ce); outb(orig, 0x3cf);
310 }
311
312 void
313 sio_kill_arch(int mode)
314 {
315 #if defined(ALPHA_RESTORE_SRM_SETUP)
316
317
318
319
320
321
322 pci_bus_write_config_dword(pci_isa_hose->bus, PCI_DEVFN(7, 0), 0x60,
323 saved_config.orig_route_tab);
324 #endif
325 }
326
327
328
329
330
331
332 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_BOOK1)
333 struct alpha_machine_vector alphabook1_mv __initmv = {
334 .vector_name = "AlphaBook1",
335 DO_EV4_MMU,
336 DO_DEFAULT_RTC,
337 DO_LCA_IO,
338 .machine_check = lca_machine_check,
339 .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS,
340 .min_io_address = DEFAULT_IO_BASE,
341 .min_mem_address = APECS_AND_LCA_DEFAULT_MEM_BASE,
342
343 .nr_irqs = 16,
344 .device_interrupt = isa_device_interrupt,
345
346 .init_arch = alphabook1_init_arch,
347 .init_irq = sio_init_irq,
348 .init_rtc = common_init_rtc,
349 .init_pci = alphabook1_init_pci,
350 .kill_arch = sio_kill_arch,
351 .pci_map_irq = noname_map_irq,
352 .pci_swizzle = common_swizzle,
353
354 .sys = { .sio = {
355
356 .route_tab = 0x0e0f0a0a,
357 }}
358 };
359 ALIAS_MV(alphabook1)
360 #endif
361
362 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_AVANTI)
363 struct alpha_machine_vector avanti_mv __initmv = {
364 .vector_name = "Avanti",
365 DO_EV4_MMU,
366 DO_DEFAULT_RTC,
367 DO_APECS_IO,
368 .machine_check = apecs_machine_check,
369 .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS,
370 .min_io_address = DEFAULT_IO_BASE,
371 .min_mem_address = APECS_AND_LCA_DEFAULT_MEM_BASE,
372
373 .nr_irqs = 16,
374 .device_interrupt = isa_device_interrupt,
375
376 .init_arch = apecs_init_arch,
377 .init_irq = sio_init_irq,
378 .init_rtc = common_init_rtc,
379 .init_pci = noname_init_pci,
380 .kill_arch = sio_kill_arch,
381 .pci_map_irq = noname_map_irq,
382 .pci_swizzle = common_swizzle,
383
384 .sys = { .sio = {
385 .route_tab = 0x0b0a050f,
386 }}
387 };
388 ALIAS_MV(avanti)
389 #endif
390
391 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_NONAME)
392 struct alpha_machine_vector noname_mv __initmv = {
393 .vector_name = "Noname",
394 DO_EV4_MMU,
395 DO_DEFAULT_RTC,
396 DO_LCA_IO,
397 .machine_check = lca_machine_check,
398 .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS,
399 .min_io_address = DEFAULT_IO_BASE,
400 .min_mem_address = APECS_AND_LCA_DEFAULT_MEM_BASE,
401
402 .nr_irqs = 16,
403 .device_interrupt = srm_device_interrupt,
404
405 .init_arch = lca_init_arch,
406 .init_irq = sio_init_irq,
407 .init_rtc = common_init_rtc,
408 .init_pci = noname_init_pci,
409 .kill_arch = sio_kill_arch,
410 .pci_map_irq = noname_map_irq,
411 .pci_swizzle = common_swizzle,
412
413 .sys = { .sio = {
414
415
416
417
418
419
420
421
422
423 .route_tab = 0x0b0a0f0d,
424 }}
425 };
426 ALIAS_MV(noname)
427 #endif
428
429 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_P2K)
430 struct alpha_machine_vector p2k_mv __initmv = {
431 .vector_name = "Platform2000",
432 DO_EV4_MMU,
433 DO_DEFAULT_RTC,
434 DO_LCA_IO,
435 .machine_check = lca_machine_check,
436 .max_isa_dma_address = ALPHA_MAX_ISA_DMA_ADDRESS,
437 .min_io_address = DEFAULT_IO_BASE,
438 .min_mem_address = APECS_AND_LCA_DEFAULT_MEM_BASE,
439
440 .nr_irqs = 16,
441 .device_interrupt = srm_device_interrupt,
442
443 .init_arch = lca_init_arch,
444 .init_irq = sio_init_irq,
445 .init_rtc = common_init_rtc,
446 .init_pci = noname_init_pci,
447 .kill_arch = sio_kill_arch,
448 .pci_map_irq = p2k_map_irq,
449 .pci_swizzle = common_swizzle,
450
451 .sys = { .sio = {
452 .route_tab = 0x0b0a090f,
453 }}
454 };
455 ALIAS_MV(p2k)
456 #endif
457
458 #if defined(CONFIG_ALPHA_GENERIC) || defined(CONFIG_ALPHA_XL)
459 struct alpha_machine_vector xl_mv __initmv = {
460 .vector_name = "XL",
461 DO_EV4_MMU,
462 DO_DEFAULT_RTC,
463 DO_APECS_IO,
464 .machine_check = apecs_machine_check,
465 .max_isa_dma_address = ALPHA_XL_MAX_ISA_DMA_ADDRESS,
466 .min_io_address = DEFAULT_IO_BASE,
467 .min_mem_address = XL_DEFAULT_MEM_BASE,
468
469 .nr_irqs = 16,
470 .device_interrupt = isa_device_interrupt,
471
472 .init_arch = apecs_init_arch,
473 .init_irq = sio_init_irq,
474 .init_rtc = common_init_rtc,
475 .init_pci = noname_init_pci,
476 .kill_arch = sio_kill_arch,
477 .pci_map_irq = noname_map_irq,
478 .pci_swizzle = common_swizzle,
479
480 .sys = { .sio = {
481 .route_tab = 0x0b0a090f,
482 }}
483 };
484 ALIAS_MV(xl)
485 #endif