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