v2.4.8 -> v2.4.8.1
[opensuse:kernel.git] / arch / ppc / kernel / prep_pci.c
1 /*
2  * BK Id: SCCS/s.prep_pci.c 1.22 08/05/01 16:18:54 trini
3  */
4 /*
5  * PReP pci functions.
6  * Originally by Gary Thomas
7  * rewritten and updated by Cort Dougan (cort@cs.nmt.edu)
8  *
9  * The motherboard routes/maps will disappear shortly. -- Cort
10  */
11
12 #include <linux/config.h>
13 #include <linux/types.h>
14 #include <linux/pci.h>
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17
18 #include <asm/init.h>
19 #include <asm/byteorder.h>
20 #include <asm/io.h>
21 #include <asm/ptrace.h>
22 #include <asm/prom.h>
23 #include <asm/pci-bridge.h>
24 #include <asm/residual.h>
25 #include <asm/processor.h>
26 #include <asm/irq.h>
27 #include <asm/machdep.h>
28
29 #include "pci.h"
30 #include "open_pic.h"
31
32 #define MAX_DEVNR 22
33
34 /* Which PCI interrupt line does a given device [slot] use? */
35 /* Note: This really should be two dimensional based in slot/pin used */
36 unsigned char *Motherboard_map;
37 unsigned char *Motherboard_map_name;
38
39 /* How is the 82378 PIRQ mapping setup? */
40 unsigned char *Motherboard_routes;
41
42 void (*Motherboard_non0)(struct pci_dev *);
43
44 void Powerplus_Map_Non0(struct pci_dev *);
45
46 /* Used for Motorola to store system config register */
47 static unsigned long    *ProcInfo;
48
49 /* Tables for known hardware */   
50
51 /* Motorola PowerStackII - Utah */
52 static char Utah_pci_IRQ_map[23] __prepdata =
53 {
54         0,   /* Slot 0  - unused */
55         0,   /* Slot 1  - unused */
56         5,   /* Slot 2  - SCSI - NCR825A  */
57         0,   /* Slot 3  - unused */
58         1,   /* Slot 4  - Ethernet - DEC2114x */
59         0,   /* Slot 5  - unused */
60         3,   /* Slot 6  - PCI Card slot #1 */
61         4,   /* Slot 7  - PCI Card slot #2 */
62         5,   /* Slot 8  - PCI Card slot #3 */
63         5,   /* Slot 9  - PCI Bridge */
64              /* added here in case we ever support PCI bridges */
65              /* Secondary PCI bus cards are at slot-9,6 & slot-9,7 */
66         0,   /* Slot 10 - unused */
67         0,   /* Slot 11 - unused */
68         5,   /* Slot 12 - SCSI - NCR825A */
69         0,   /* Slot 13 - unused */
70         3,   /* Slot 14 - enet */
71         0,   /* Slot 15 - unused */
72         2,   /* Slot 16 - unused */
73         3,   /* Slot 17 - unused */
74         5,   /* Slot 18 - unused */
75         0,   /* Slot 19 - unused */
76         0,   /* Slot 20 - unused */
77         0,   /* Slot 21 - unused */
78         0,   /* Slot 22 - unused */
79 };
80
81 static char Utah_pci_IRQ_routes[] __prepdata =
82 {
83         0,   /* Line 0 - Unused */
84         9,   /* Line 1 */
85         10,  /* Line 2 */
86         11,  /* Line 3 */
87         14,  /* Line 4 */
88         15,  /* Line 5 */
89 };
90
91 /* Motorola PowerStackII - Omaha */
92 /* no integrated SCSI or ethernet */
93 static char Omaha_pci_IRQ_map[23] __prepdata =
94 {
95         0,   /* Slot 0  - unused */
96         0,   /* Slot 1  - unused */
97         3,   /* Slot 2  - Winbond EIDE */
98         0,   /* Slot 3  - unused */
99         0,   /* Slot 4  - unused */
100         0,   /* Slot 5  - unused */
101         1,   /* Slot 6  - PCI slot 1 */
102         2,   /* Slot 7  - PCI slot 2  */
103         3,   /* Slot 8  - PCI slot 3 */
104         4,   /* Slot 9  - PCI slot 4 */ /* needs indirect access */
105         0,   /* Slot 10 - unused */
106         0,   /* Slot 11 - unused */
107         0,   /* Slot 12 - unused */
108         0,   /* Slot 13 - unused */
109         0,   /* Slot 14 - unused */
110         0,   /* Slot 15 - unused */
111         1,   /* Slot 16  - PCI slot 1 */
112         2,   /* Slot 17  - PCI slot 2  */
113         3,   /* Slot 18  - PCI slot 3 */
114         4,   /* Slot 19  - PCI slot 4 */ /* needs indirect access */
115         0,
116         0,
117         0,
118 };
119
120 static char Omaha_pci_IRQ_routes[] __prepdata =
121 {
122         0,   /* Line 0 - Unused */
123         9,   /* Line 1 */
124         11,  /* Line 2 */
125         14,  /* Line 3 */
126         15   /* Line 4 */
127 };
128
129 /* Motorola PowerStack */
130 static char Blackhawk_pci_IRQ_map[19] __prepdata =
131 {
132         0,      /* Slot 0  - unused */
133         0,      /* Slot 1  - unused */
134         0,      /* Slot 2  - unused */
135         0,      /* Slot 3  - unused */
136         0,      /* Slot 4  - unused */
137         0,      /* Slot 5  - unused */
138         0,      /* Slot 6  - unused */
139         0,      /* Slot 7  - unused */
140         0,      /* Slot 8  - unused */
141         0,      /* Slot 9  - unused */
142         0,      /* Slot 10 - unused */
143         0,      /* Slot 11 - unused */
144         3,      /* Slot 12 - SCSI */
145         0,      /* Slot 13 - unused */
146         1,      /* Slot 14 - Ethernet */
147         0,      /* Slot 15 - unused */
148         1,      /* Slot P7 */
149         2,      /* Slot P6 */
150         3,      /* Slot P5 */
151 };
152
153 static char Blackhawk_pci_IRQ_routes[] __prepdata =
154 {
155         0,      /* Line 0 - Unused */
156         9,      /* Line 1 */
157         11,     /* Line 2 */
158         15,     /* Line 3 */
159         15      /* Line 4 */
160 };
161    
162 /* Motorola Mesquite */
163 static char Mesquite_pci_IRQ_map[23] __prepdata =
164 {
165         0,      /* Slot 0  - unused */
166         0,      /* Slot 1  - unused */
167         0,      /* Slot 2  - unused */
168         0,      /* Slot 3  - unused */
169         0,      /* Slot 4  - unused */
170         0,      /* Slot 5  - unused */
171         0,      /* Slot 6  - unused */
172         0,      /* Slot 7  - unused */
173         0,      /* Slot 8  - unused */
174         0,      /* Slot 9  - unused */
175         0,      /* Slot 10 - unxued */
176         0,      /* Slot 11 - unused */
177         0,      /* Slot 12 - unused */
178         0,      /* Slot 13 - unused */
179         2,      /* Slot 14 - Ethernet */
180         0,      /* Slot 15 - unused */
181         3,      /* Slot 16 - PMC */
182         0,      /* Slot 17 - unused */
183         0,      /* Slot 18 - unused */
184         0,      /* Slot 19 - unused */
185         0,      /* Slot 20 - unused */
186         0,      /* Slot 21 - unused */
187         0,      /* Slot 22 - unused */
188 };
189
190 /* Motorola Sitka */
191 static char Sitka_pci_IRQ_map[21] __prepdata =
192 {
193         0,      /* Slot 0  - unused */
194         0,      /* Slot 1  - unused */
195         0,      /* Slot 2  - unused */
196         0,      /* Slot 3  - unused */
197         0,      /* Slot 4  - unused */
198         0,      /* Slot 5  - unused */
199         0,      /* Slot 6  - unused */
200         0,      /* Slot 7  - unused */
201         0,      /* Slot 8  - unused */
202         0,      /* Slot 9  - unused */
203         0,      /* Slot 10 - unxued */
204         0,      /* Slot 11 - unused */
205         0,      /* Slot 12 - unused */
206         0,      /* Slot 13 - unused */
207         2,      /* Slot 14 - Ethernet */
208         0,      /* Slot 15 - unused */
209         9,      /* Slot 16 - PMC 1  */
210         12,     /* Slot 17 - PMC 2  */
211         0,      /* Slot 18 - unused */
212         0,      /* Slot 19 - unused */
213         4,      /* Slot 20 - NT P2P bridge */
214 };
215
216 /* Motorola MTX */
217 static char MTX_pci_IRQ_map[23] __prepdata =
218 {
219         0,      /* Slot 0  - unused */
220         0,      /* Slot 1  - unused */
221         0,      /* Slot 2  - unused */
222         0,      /* Slot 3  - unused */
223         0,      /* Slot 4  - unused */
224         0,      /* Slot 5  - unused */
225         0,      /* Slot 6  - unused */
226         0,      /* Slot 7  - unused */
227         0,      /* Slot 8  - unused */
228         0,      /* Slot 9  - unused */
229         0,      /* Slot 10 - unused */
230         0,      /* Slot 11 - unused */
231         3,      /* Slot 12 - SCSI */
232         0,      /* Slot 13 - unused */
233         2,      /* Slot 14 - Ethernet */
234         0,      /* Slot 15 - unused */
235         9,      /* Slot 16 - PCI/PMC slot 1 */
236         10,     /* Slot 17 - PCI/PMC slot 2 */
237         11,     /* Slot 18 - PCI slot 3 */
238         0,      /* Slot 19 - unused */
239         0,      /* Slot 20 - unused */
240         0,      /* Slot 21 - unused */
241         0,      /* Slot 22 - unused */
242 };
243
244 /* Motorola MTX Plus */
245 /* Secondary bus interrupt routing is not supported yet */
246 static char MTXplus_pci_IRQ_map[23] __prepdata =
247 {
248         0,      /* Slot 0  - unused */
249         0,      /* Slot 1  - unused */
250         0,      /* Slot 2  - unused */
251         0,      /* Slot 3  - unused */
252         0,      /* Slot 4  - unused */
253         0,      /* Slot 5  - unused */
254         0,      /* Slot 6  - unused */
255         0,      /* Slot 7  - unused */
256         0,      /* Slot 8  - unused */
257         0,      /* Slot 9  - unused */
258         0,      /* Slot 10 - unused */
259         0,      /* Slot 11 - unused */
260         3,      /* Slot 12 - SCSI */
261         0,      /* Slot 13 - unused */
262         2,      /* Slot 14 - Ethernet 1 */
263         0,      /* Slot 15 - unused */
264         9,      /* Slot 16 - PCI slot 1P */
265         10,     /* Slot 17 - PCI slot 2P */
266         11,     /* Slot 18 - PCI slot 3P */
267         10,     /* Slot 19 - Ethernet 2 */
268         0,      /* Slot 20 - P2P Bridge */
269         0,      /* Slot 21 - unused */
270         0,      /* Slot 22 - unused */
271 };
272
273 static char Raven_pci_IRQ_routes[] __prepdata =
274 {
275         0,      /* This is a dummy structure */
276 };
277    
278 /* Motorola MVME16xx */
279 static char Genesis_pci_IRQ_map[16] __prepdata =
280 {
281         0,      /* Slot 0  - unused */
282         0,      /* Slot 1  - unused */
283         0,      /* Slot 2  - unused */
284         0,      /* Slot 3  - unused */
285         0,      /* Slot 4  - unused */
286         0,      /* Slot 5  - unused */
287         0,      /* Slot 6  - unused */
288         0,      /* Slot 7  - unused */
289         0,      /* Slot 8  - unused */
290         0,      /* Slot 9  - unused */
291         0,      /* Slot 10 - unused */
292         0,      /* Slot 11 - unused */
293         3,      /* Slot 12 - SCSI */
294         0,      /* Slot 13 - unused */
295         1,      /* Slot 14 - Ethernet */
296         0,      /* Slot 15 - unused */
297 };
298
299 static char Genesis_pci_IRQ_routes[] __prepdata =
300 {
301         0,      /* Line 0 - Unused */
302         10,     /* Line 1 */
303         11,     /* Line 2 */
304         14,     /* Line 3 */
305         15      /* Line 4 */
306 };
307    
308 static char Genesis2_pci_IRQ_map[23] __prepdata =
309 {
310         0,      /* Slot 0  - unused */
311         0,      /* Slot 1  - unused */
312         0,      /* Slot 2  - unused */
313         0,      /* Slot 3  - unused */
314         0,      /* Slot 4  - unused */
315         0,      /* Slot 5  - unused */
316         0,      /* Slot 6  - unused */
317         0,      /* Slot 7  - unused */
318         0,      /* Slot 8  - unused */
319         0,      /* Slot 9  - unused */
320         0,      /* Slot 10 - Ethernet */
321         0,      /* Slot 11 - Universe PCI - VME Bridge */
322         3,      /* Slot 12 - unused */
323         0,      /* Slot 13 - unused */
324         2,      /* Slot 14 - SCSI */
325         0,      /* Slot 15 - graphics on 3600 */
326         9,      /* Slot 16 - PMC */
327         12,     /* Slot 17 - pci */
328         11,     /* Slot 18 - pci */
329         10,     /* Slot 19 - pci */
330         0,      /* Slot 20 - pci */
331         0,      /* Slot 21 - unused */
332         0,      /* Slot 22 - unused */
333 };
334
335 /* Motorola Series-E */
336 static char Comet_pci_IRQ_map[23] __prepdata =
337 {
338         0,      /* Slot 0  - unused */
339         0,      /* Slot 1  - unused */
340         0,      /* Slot 2  - unused */
341         0,      /* Slot 3  - unused */
342         0,      /* Slot 4  - unused */
343         0,      /* Slot 5  - unused */
344         0,      /* Slot 6  - unused */
345         0,      /* Slot 7  - unused */
346         0,      /* Slot 8  - unused */
347         0,      /* Slot 9  - unused */
348         0,      /* Slot 10 - unused */
349         0,      /* Slot 11 - unused */
350         3,      /* Slot 12 - SCSI */
351         0,      /* Slot 13 - unused */
352         1,      /* Slot 14 - Ethernet */
353         0,      /* Slot 15 - unused */
354         1,      /* Slot 16 - PCI slot 1 */
355         2,      /* Slot 17 - PCI slot 2 */
356         3,      /* Slot 18 - PCI slot 3 */
357         4,      /* Slot 19 - PCI bridge */
358         0,
359         0,
360         0,
361 };
362
363 static char Comet_pci_IRQ_routes[] __prepdata =
364 {
365         0,      /* Line 0 - Unused */
366         10,     /* Line 1 */
367         11,     /* Line 2 */
368         14,     /* Line 3 */
369         15      /* Line 4 */
370 };
371
372 /* Motorola Series-EX */
373 static char Comet2_pci_IRQ_map[23] __prepdata =
374 {
375         0,      /* Slot 0  - unused */
376         0,      /* Slot 1  - unused */
377         3,      /* Slot 2  - SCSI - NCR825A */
378         0,      /* Slot 3  - unused */
379         1,      /* Slot 4  - Ethernet - DEC2104X */
380         0,      /* Slot 5  - unused */
381         1,      /* Slot 6  - PCI slot 1 */
382         2,      /* Slot 7  - PCI slot 2 */
383         3,      /* Slot 8  - PCI slot 3 */
384         4,      /* Slot 9  - PCI bridge  */
385         0,      /* Slot 10 - unused */
386         0,      /* Slot 11 - unused */
387         3,      /* Slot 12 - SCSI - NCR825A */
388         0,      /* Slot 13 - unused */
389         1,      /* Slot 14 - Ethernet - DEC2104X */
390         0,      /* Slot 15 - unused */
391         1,      /* Slot 16 - PCI slot 1 */
392         2,      /* Slot 17 - PCI slot 2 */
393         3,      /* Slot 18 - PCI slot 3 */
394         4,      /* Slot 19 - PCI bridge */
395         0,
396         0,
397         0,
398 };
399
400 static char Comet2_pci_IRQ_routes[] __prepdata =
401 {
402         0,      /* Line 0 - Unused */
403         10,     /* Line 1 */
404         11,     /* Line 2 */
405         14,     /* Line 3 */
406         15,     /* Line 4 */
407 };
408
409 /*
410  * ibm 830 (and 850?).
411  * This is actually based on the Carolina motherboard
412  * -- Cort
413  */
414 static char ibm8xx_pci_IRQ_map[23] __prepdata = {
415         0, /* Slot 0  - unused */
416         0, /* Slot 1  - unused */
417         0, /* Slot 2  - unused */
418         0, /* Slot 3  - unused */
419         0, /* Slot 4  - unused */
420         0, /* Slot 5  - unused */
421         0, /* Slot 6  - unused */
422         0, /* Slot 7  - unused */
423         0, /* Slot 8  - unused */
424         0, /* Slot 9  - unused */
425         0, /* Slot 10 - unused */
426         0, /* Slot 11 - FireCoral */
427         4, /* Slot 12 - Ethernet  PCIINTD# */
428         2, /* Slot 13 - PCI Slot #2 */
429         2, /* Slot 14 - S3 Video PCIINTD# */
430         0, /* Slot 15 - onboard SCSI (INDI) [1] */
431         3, /* Slot 16 - NCR58C810 RS6000 Only PCIINTC# */
432         0, /* Slot 17 - unused */
433         2, /* Slot 18 - PCI Slot 2 PCIINTx# (See below) */
434         0, /* Slot 19 - unused */
435         0, /* Slot 20 - unused */
436         0, /* Slot 21 - unused */
437         2, /* Slot 22 - PCI slot 1 PCIINTx# (See below) */
438 };
439
440 static char ibm8xx_pci_IRQ_routes[] __prepdata = {
441         0,      /* Line 0 - unused */
442         15,     /* Line 1 */
443         15,     /* Line 2 */
444         15,     /* Line 3 */
445         15,     /* Line 4 */
446 };
447
448 /*
449  * a 6015 ibm board
450  * -- Cort
451  */
452 static char ibm6015_pci_IRQ_map[23] __prepdata = {
453         0, /* Slot 0  - unused */
454         0, /* Slot 1  - unused */
455         0, /* Slot 2  - unused */
456         0, /* Slot 3  - unused */
457         0, /* Slot 4  - unused */
458         0, /* Slot 5  - unused */
459         0, /* Slot 6  - unused */
460         0, /* Slot 7  - unused */
461         0, /* Slot 8  - unused */
462         0, /* Slot 9  - unused */
463         0, /* Slot 10 - unused */
464         0, /* Slot 11 -  */
465         1, /* Slot 12 - SCSI */
466         2, /* Slot 13 -  */
467         2, /* Slot 14 -  */
468         1, /* Slot 15 -  */
469         1, /* Slot 16 -  */
470         0, /* Slot 17 -  */
471         2, /* Slot 18 -  */
472         0, /* Slot 19 -  */
473         0, /* Slot 20 -  */
474         0, /* Slot 21 -  */
475         2, /* Slot 22 -  */
476 };
477 static char ibm6015_pci_IRQ_routes[] __prepdata = {
478         0,      /* Line 0 - unused */
479         13,     /* Line 1 */
480         10,     /* Line 2 */
481         15,     /* Line 3 */
482         15,     /* Line 4 */
483 };
484
485
486 /* IBM Nobis and 850 */
487 static char Nobis_pci_IRQ_map[23] __prepdata ={
488         0, /* Slot 0  - unused */
489         0, /* Slot 1  - unused */
490         0, /* Slot 2  - unused */
491         0, /* Slot 3  - unused */
492         0, /* Slot 4  - unused */
493         0, /* Slot 5  - unused */
494         0, /* Slot 6  - unused */
495         0, /* Slot 7  - unused */
496         0, /* Slot 8  - unused */
497         0, /* Slot 9  - unused */
498         0, /* Slot 10 - unused */
499         0, /* Slot 11 - unused */
500         3, /* Slot 12 - SCSI */
501         0, /* Slot 13 - unused */
502         0, /* Slot 14 - unused */
503         0, /* Slot 15 - unused */
504 };
505
506 static char Nobis_pci_IRQ_routes[] __prepdata = {
507         0, /* Line 0 - Unused */
508         13, /* Line 1 */
509         13, /* Line 2 */
510         13, /* Line 3 */
511         13      /* Line 4 */
512 };
513
514 /* Motorola PowerPlus architecture PCI IRQ tables */
515 /* Interrupt line values for INTA-D on primary/secondary MPIC inputs */
516
517 struct powerplus_irq_list
518 {
519         unsigned char primary[4];       /* INT A-D */
520         unsigned char secondary[4];     /* INT A-D */
521 };
522
523 /*
524  * For standard PowerPlus boards, bus 0 PCI INTs A-D are routed to
525  * OpenPIC inputs 9-12.  PCI INTs A-D from the on board P2P bridge
526  * are routed to OpenPIC inputs 5-8.  These values are offset by
527  * 16 in the table to reflect the Linux kernel interrupt value.
528  */
529 struct powerplus_irq_list Powerplus_pci_IRQ_list =
530 {
531         {25, 26, 27, 28},
532         {21, 22, 23, 24}
533 };
534
535 /*
536  * For the MCP750 (system slot board), cPCI INTs A-D are routed to
537  * OpenPIC inputs 8-11 and the PMC INTs A-D are routed to OpenPIC
538  * input 3.  On a hot swap MCP750, the companion card PCI INTs A-D
539  * are routed to OpenPIC inputs 12-15. These values are offset by
540  * 16 in the table to reflect the Linux kernel interrupt value.
541  */
542 struct powerplus_irq_list Mesquite_pci_IRQ_list =
543 {
544         {24, 25, 26, 27},
545         {28, 29, 30, 31}
546 };
547
548 /*
549  * This table represents the standard PCI swizzle defined in the
550  * PCI bus specification.
551  */
552 static unsigned char prep_pci_intpins[4][4] =
553 {
554         { 1, 2, 3, 4},  /* Buses 0, 4, 8, ... */
555         { 2, 3, 4, 1},  /* Buses 1, 5, 9, ... */
556         { 3, 4, 1, 2},  /* Buses 2, 6, 10 ... */
557         { 4, 1, 2, 3},  /* Buses 3, 7, 11 ... */
558 };
559
560 /* We have to turn on LEVEL mode for changed IRQ's */
561 /* All PCI IRQ's need to be level mode, so this should be something
562  * other than hard-coded as well... IRQ's are individually mappable
563  * to either edge or level.
564  */
565 #define CAROLINA_IRQ_EDGE_MASK_LO   0x00  /* IRQ's 0-7  */
566 #define CAROLINA_IRQ_EDGE_MASK_HI   0xA4  /* IRQ's 8-15 [10,13,15] */
567
568 /*
569  * 8259 edge/level control definitions
570  */
571 #define ISA8259_M_ELCR 0x4d0
572 #define ISA8259_S_ELCR 0x4d1
573
574 #define ELCRS_INT15_LVL         0x80
575 #define ELCRS_INT14_LVL         0x40
576 #define ELCRS_INT12_LVL         0x10
577 #define ELCRS_INT11_LVL         0x08
578 #define ELCRS_INT10_LVL         0x04
579 #define ELCRS_INT9_LVL          0x02
580 #define ELCRS_INT8_LVL          0x01
581 #define ELCRM_INT7_LVL          0x80
582 #define ELCRM_INT5_LVL          0x20
583
584 #define CFGPTR(dev) (0x80800000 | (1<<(dev>>3)) | ((dev&7)<<8) | offset)
585 #define DEVNO(dev)  (dev>>3)                                  
586
587 #define cfg_read(val, addr, type, op)   *val = op((type)(addr))
588 #define cfg_write(val, addr, type, op)  op((type *)(addr), (val))
589
590 #define cfg_read_bad(val, size)         *val = bad_##size;
591 #define cfg_write_bad(val, size)
592
593 #define bad_byte        0xff
594 #define bad_word        0xffff
595 #define bad_dword       0xffffffffU
596
597 #define PREP_PCI_OP(rw, size, type, op)                                 \
598 static int __prep                                                       \
599 prep_##rw##_config_##size(struct pci_dev *dev, int offset, type val)    \
600 {                                                                       \
601         if ((dev->bus->number != 0) || (DEVNO(dev->devfn) > MAX_DEVNR)) \
602         {                                                               \
603                 cfg_##rw##_bad(val, size)                               \
604                 return PCIBIOS_DEVICE_NOT_FOUND;                        \
605         }                                                               \
606         cfg_##rw(val, CFGPTR(dev->devfn), type, op);                    \
607         return PCIBIOS_SUCCESSFUL;                                      \
608 }
609
610 PREP_PCI_OP(read, byte, u8 *, in_8)
611 PREP_PCI_OP(read, word, u16 *, in_le16)
612 PREP_PCI_OP(read, dword, u32 *, in_le32)
613 PREP_PCI_OP(write, byte, u8, out_8)
614 PREP_PCI_OP(write, word, u16, out_le16)
615 PREP_PCI_OP(write, dword, u32, out_le32)
616
617 static struct pci_ops prep_pci_ops =
618 {
619         prep_read_config_byte,
620         prep_read_config_word,
621         prep_read_config_dword,
622         prep_write_config_byte,
623         prep_write_config_word,
624         prep_write_config_dword
625 };
626
627 #define MOTOROLA_CPUTYPE_REG    0x800
628 #define MOTOROLA_BASETYPE_REG   0x803
629 #define MPIC_RAVEN_ID           0x48010000
630 #define MPIC_HAWK_ID            0x48030000
631 #define MOT_PROC2_BIT           0x800
632
633 static u_char mvme2600_openpic_initsenses[] __initdata = {
634     1,  /* MVME2600_INT_SIO */
635     0,  /* MVME2600_INT_FALCN_ECC_ERR */
636     1,  /* MVME2600_INT_PCI_ETHERNET */
637     1,  /* MVME2600_INT_PCI_SCSI */
638     1,  /* MVME2600_INT_PCI_GRAPHICS */
639     1,  /* MVME2600_INT_PCI_VME0 */
640     1,  /* MVME2600_INT_PCI_VME1 */
641     1,  /* MVME2600_INT_PCI_VME2 */
642     1,  /* MVME2600_INT_PCI_VME3 */
643     1,  /* MVME2600_INT_PCI_INTA */
644     1,  /* MVME2600_INT_PCI_INTB */
645     1,  /* MVME2600_INT_PCI_INTC */
646     1,  /* MVME2600_INT_PCI_INTD */
647     1,  /* MVME2600_INT_LM_SIG0 */
648     1,  /* MVME2600_INT_LM_SIG1 */
649 };
650
651 #define MOT_RAVEN_PRESENT       0x1
652 #define MOT_HAWK_PRESENT        0x2
653
654 int mot_entry = -1;
655 int prep_keybd_present = 1;
656 int MotMPIC;
657 int mot_multi;
658
659 int __init raven_init(void)
660 {
661         unsigned int    devid;
662         unsigned int    pci_membase;
663         unsigned char   base_mod;
664
665         /* Check to see if the Raven chip exists. */
666         if ( _prep_type != _PREP_Motorola) {
667                 OpenPIC_Addr = NULL;
668                 return 0;
669         }
670
671         /* Check to see if this board is a type that might have a Raven. */
672         if ((inb(MOTOROLA_CPUTYPE_REG) & 0xF0) != 0xE0) {
673                 OpenPIC_Addr = NULL;
674                 return 0;
675         }
676
677         /* Check the first PCI device to see if it is a Raven. */
678         early_read_config_dword(0, 0, 0, PCI_VENDOR_ID, &devid);
679
680         switch (devid & 0xffff0000) {
681         case MPIC_RAVEN_ID:
682                 MotMPIC = MOT_RAVEN_PRESENT;
683                 break;
684         case MPIC_HAWK_ID:
685                 MotMPIC = MOT_HAWK_PRESENT;
686                 break;
687         default:
688                 OpenPIC_Addr = NULL;
689                 return 0;
690         }
691
692
693         /* Read the memory base register. */
694         early_read_config_dword(0, 0, 0, PCI_BASE_ADDRESS_1, &pci_membase);
695
696         if (pci_membase == 0) {
697                 OpenPIC_Addr = NULL;
698                 return 0;
699         }
700
701         /* Map the Raven MPIC registers to virtual memory. */
702         OpenPIC_Addr = ioremap(pci_membase+0xC0000000, 0x22000);
703
704         OpenPIC_InitSenses = mvme2600_openpic_initsenses;
705         OpenPIC_NumInitSenses = sizeof(mvme2600_openpic_initsenses);
706
707         ppc_md.get_irq = openpic_get_irq;
708         
709         /* If raven is present on Motorola store the system config register
710          * for later use.
711          */
712         ProcInfo = (unsigned long *)ioremap(0xfef80400, 4);
713
714         /* Indicate to system if this is a multiprocessor board */
715         if (!(*ProcInfo & MOT_PROC2_BIT)) {
716                 mot_multi = 1;
717         }
718
719         /* This is a hack.  If this is a 2300 or 2400 mot board then there is
720          * no keyboard controller and we have to indicate that.
721          */
722         base_mod = inb(MOTOROLA_BASETYPE_REG);
723         if ((MotMPIC == MOT_HAWK_PRESENT) || (base_mod == 0xF9) ||
724             (base_mod == 0xFA) || (base_mod == 0xE1))
725                 prep_keybd_present = 0;
726
727         return 1;
728 }
729
730 struct mot_info {
731         int             cpu_type;       /* 0x100 mask assumes for Raven and Hawk boards that the level/edge are set */
732                                         /* 0x200 if this board has a Hawk chip. */
733         int             base_type;
734         int             max_cpu;        /* ored with 0x80 if this board should be checked for multi CPU */
735         const char      *name;
736         unsigned char   *map;
737         unsigned char   *routes;
738         void            (*map_non0_bus)(struct pci_dev *);      /* For boards with more than bus 0 devices. */
739         struct powerplus_irq_list *pci_irq_list; /* List of PCI MPIC inputs */
740         unsigned char   secondary_bridge_devfn; /* devfn of secondary bus transparent bridge */
741 } mot_info[] = {
742         {0x300, 0x00, 0x00, "MVME 2400",                        Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
743         {0x010, 0x00, 0x00, "Genesis",                          Genesis_pci_IRQ_map,    Genesis_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
744         {0x020, 0x00, 0x00, "Powerstack (Series E)",            Comet_pci_IRQ_map,      Comet_pci_IRQ_routes, NULL, NULL, 0x00},
745         {0x040, 0x00, 0x00, "Blackhawk (Powerstack)",           Blackhawk_pci_IRQ_map,  Blackhawk_pci_IRQ_routes, NULL, NULL, 0x00},
746         {0x050, 0x00, 0x00, "Omaha (PowerStack II Pro3000)",    Omaha_pci_IRQ_map,      Omaha_pci_IRQ_routes, NULL, NULL, 0x00},
747         {0x060, 0x00, 0x00, "Utah (Powerstack II Pro4000)",     Utah_pci_IRQ_map,       Utah_pci_IRQ_routes, NULL, NULL, 0x00},
748         {0x0A0, 0x00, 0x00, "Powerstack (Series EX)",           Comet2_pci_IRQ_map,     Comet2_pci_IRQ_routes, NULL, NULL, 0x00},
749         {0x1E0, 0xE0, 0x00, "Mesquite cPCI (MCP750)",           Mesquite_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Mesquite_pci_IRQ_list, 0xFF},
750         {0x1E0, 0xE1, 0x00, "Sitka cPCI (MCPN750)",             Sitka_pci_IRQ_map,      Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
751         {0x1E0, 0xE2, 0x00, "Mesquite cPCI (MCP750) w/ HAC",    Mesquite_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Mesquite_pci_IRQ_list, 0xC0},
752         {0x1E0, 0xF6, 0x80, "MTX Plus",                         MTXplus_pci_IRQ_map,    Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xA0},
753         {0x1E0, 0xF6, 0x81, "Dual MTX Plus",                    MTXplus_pci_IRQ_map,    Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xA0},
754         {0x1E0, 0xF7, 0x80, "MTX wo/ Parallel Port",            MTX_pci_IRQ_map,        Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
755         {0x1E0, 0xF7, 0x81, "Dual MTX wo/ Parallel Port",       MTX_pci_IRQ_map,        Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
756         {0x1E0, 0xF8, 0x80, "MTX w/ Parallel Port",             MTX_pci_IRQ_map,        Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
757         {0x1E0, 0xF8, 0x81, "Dual MTX w/ Parallel Port",        MTX_pci_IRQ_map,        Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
758         {0x1E0, 0xF9, 0x00, "MVME 2300",                        Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
759         {0x1E0, 0xFA, 0x00, "MVME 2300SC/2600",                 Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
760         {0x1E0, 0xFB, 0x00, "MVME 2600 with MVME712M",          Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
761         {0x1E0, 0xFC, 0x00, "MVME 2600/2700 with MVME761",      Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
762         {0x1E0, 0xFD, 0x80, "MVME 3600 with MVME712M",          Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0x00},
763         {0x1E0, 0xFD, 0x81, "MVME 4600 with MVME712M",          Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
764         {0x1E0, 0xFE, 0x80, "MVME 3600 with MVME761",           Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
765         {0x1E0, 0xFE, 0x81, "MVME 4600 with MVME761",           Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
766         {0x1E0, 0xFF, 0x00, "MVME 1600-001 or 1600-011",        Genesis2_pci_IRQ_map,   Raven_pci_IRQ_routes, Powerplus_Map_Non0, &Powerplus_pci_IRQ_list, 0xFF},
767         {0x000, 0x00, 0x00, "",                                 NULL,                   NULL, NULL, NULL, 0x00}
768 };
769
770 unsigned long __init prep_route_pci_interrupts(void)
771 {
772         unsigned char *ibc_pirq = (unsigned char *)0x80800860;
773         unsigned char *ibc_pcicon = (unsigned char *)0x80800840;
774         int i;
775         
776         if ( _prep_type == _PREP_Motorola)
777         {
778                 unsigned short irq_mode;
779                 unsigned char  cpu_type;
780                 unsigned char  base_mod;
781                 int            entry;
782
783                 cpu_type = inb(MOTOROLA_CPUTYPE_REG) & 0xF0;
784                 base_mod = inb(MOTOROLA_BASETYPE_REG);
785
786                 for (entry = 0; mot_info[entry].cpu_type != 0; entry++) {
787                         if (mot_info[entry].cpu_type & 0x200) {                 /* Check for Hawk chip */
788                                 if (!(MotMPIC & MOT_HAWK_PRESENT))
789                                         continue;
790                         } else {                                                /* Check non hawk boards */
791                                 if ((mot_info[entry].cpu_type & 0xff) != cpu_type)
792                                         continue;
793
794                                 if (mot_info[entry].base_type == 0) {
795                                         mot_entry = entry;
796                                         break;
797                                 }
798
799                                 if (mot_info[entry].base_type != base_mod)
800                                         continue;
801                         }
802
803                         if (!(mot_info[entry].max_cpu & 0x80)) {
804                                 mot_entry = entry;
805                                 break;
806                         }
807
808                         /* processor 1 not present and max processor zero indicated */
809                         if ((*ProcInfo & MOT_PROC2_BIT) && !(mot_info[entry].max_cpu & 0x7f)) {
810                                 mot_entry = entry;
811                                 break;
812                         }
813
814                         /* processor 1 present and max processor zero indicated */
815                         if (!(*ProcInfo & MOT_PROC2_BIT) && (mot_info[entry].max_cpu & 0x7f)) {
816                                 mot_entry = entry;
817                                 break;
818                         }
819                 }
820
821                 if (mot_entry == -1)    /* No particular cpu type found - assume Blackhawk */
822                         mot_entry = 3;
823
824                 Motherboard_map_name = (unsigned char *)mot_info[mot_entry].name;
825                 Motherboard_map = mot_info[mot_entry].map;
826                 Motherboard_routes = mot_info[mot_entry].routes;
827                 Motherboard_non0 = mot_info[mot_entry].map_non0_bus;
828
829                 if (!(mot_info[entry].cpu_type & 0x100)) {
830                         /* AJF adjust level/edge control according to routes */
831                         irq_mode = 0;
832                         for (i = 1;  i <= 4;  i++)
833                         {
834                                 irq_mode |= ( 1 << Motherboard_routes[i] );
835                         }
836                         outb( irq_mode & 0xff, 0x4d0 );
837                         outb( (irq_mode >> 8) & 0xff, 0x4d1 );
838                 }
839         } else if ( _prep_type == _PREP_IBM )
840         {
841                 unsigned char pl_id;
842                 /*
843                  * my carolina is 0xf0
844                  * 6015 has 0xfc
845                  * -- Cort
846                  */
847                 printk("IBM ID: %08x\n", inb(0x0852));
848                 switch(inb(0x0852))
849                 {
850                 case 0xff:
851                         Motherboard_map_name = "IBM 850/860 Portable";
852                         Motherboard_map = Nobis_pci_IRQ_map;
853                         Motherboard_routes = Nobis_pci_IRQ_routes;
854                         break;
855                 case 0xfc:
856                         Motherboard_map_name = "IBM 6015";
857                         Motherboard_map = ibm6015_pci_IRQ_map;
858                         Motherboard_routes = ibm6015_pci_IRQ_routes;
859                         break;                  
860                 default:
861                         Motherboard_map_name = "IBM 8xx (Carolina)";
862                         Motherboard_map = ibm8xx_pci_IRQ_map;
863                         Motherboard_routes = ibm8xx_pci_IRQ_routes;
864                         break;
865                 }
866
867                 /*printk("Changing IRQ mode\n");*/
868                 pl_id=inb(0x04d0);
869                 /*printk("Low mask is %#0x\n", pl_id);*/
870                 outb(pl_id|CAROLINA_IRQ_EDGE_MASK_LO, 0x04d0);
871                 
872                 pl_id=inb(0x04d1);
873                 /*printk("Hi mask is  %#0x\n", pl_id);*/
874                 outb(pl_id|CAROLINA_IRQ_EDGE_MASK_HI, 0x04d1);
875                 pl_id=inb(0x04d1);
876                 /*printk("Hi mask now %#0x\n", pl_id);*/
877         }
878         else
879         {
880                 printk("No known machine pci routing!\n");
881                 return -1;
882         }
883         
884         /* Set up mapping from slots */
885         for (i = 1;  i <= 4;  i++)
886         {
887                 ibc_pirq[i-1] = Motherboard_routes[i];
888         }
889         /* Enable PCI interrupts */
890         *ibc_pcicon |= 0x20;
891         return 0;
892 }
893
894 void __init
895 prep_pib_init(void)
896 {
897 unsigned char   reg;
898 unsigned short  short_reg;
899
900 struct pci_dev *dev = NULL;
901
902         if (( _prep_type == _PREP_Motorola) && (OpenPIC_Addr)) {
903                 /*
904                  * Perform specific configuration for the Via Tech or
905                  * or Winbond PCI-ISA-Bridge part.
906                  */
907                 if ((dev = pci_find_device(PCI_VENDOR_ID_VIA, 
908                                         PCI_DEVICE_ID_VIA_82C586_1, dev))) {
909                         /*
910                          * PPCBUG does not set the enable bits
911                          * for the IDE device. Force them on here.
912                          */
913                         pcibios_read_config_byte(dev->bus->number, 
914                                         dev->devfn, 0x40, &reg);
915
916                         reg |= 0x03; /* IDE: Chip Enable Bits */
917                         pcibios_write_config_byte(dev->bus->number, 
918                                         dev->devfn, 0x40, reg);
919
920                         /* Force correct IDE function interrupt */
921                         dev->irq = 14;
922                         pcibios_write_config_byte(dev->bus->number,
923                                         dev->devfn,
924                                         PCI_INTERRUPT_LINE,
925                                         dev->irq);
926
927                 } else if ((dev = pci_find_device(PCI_VENDOR_ID_WINBOND, 
928                                         PCI_DEVICE_ID_WINBOND_83C553, dev))) {
929                         /*
930                          * Clear the PCI Interrupt Routing Control Register.
931                          */
932                         short_reg = 0x0000;
933                         pci_write_config_word(dev, 0x44, short_reg);
934                         if (OpenPIC_Addr){
935                                 /*
936                                  * Route both IDE interrupts to IRQ 14
937                                  */
938                                 reg = 0xEE;
939                                 pci_write_config_byte(dev, 0x44, reg);
940                         }
941                 }
942         }
943         if ((dev = pci_find_device(PCI_VENDOR_ID_WINBOND,
944                                    PCI_DEVICE_ID_WINBOND_82C105, dev))){
945                 if (OpenPIC_Addr){
946                         /* Disable LEGIRQ mode so PCI INTs are routed to
947                            the 8259 */
948                         printk("Set winbond IDE to native mode\n");
949                         pci_write_config_dword(dev, 0x40, 0x10ff00a1);
950                 }else{
951                         /* Enable LEGIRQ for PCI INT -> 8259 IRQ routing */
952                         pci_write_config_dword(dev, 0x40, 0x10ff08a1);
953                 }
954         }
955 }
956
957 void
958 Powerplus_Map_Non0(struct pci_dev *dev)
959 {
960         struct pci_bus  *pbus;          /* Parent bus structure pointer */
961         struct pci_dev  *tdev = dev;    /* Temporary device structure */
962         unsigned int    devnum;         /* Accumulated device number */
963         unsigned char   intline;        /* Linux interrupt value */
964         unsigned char   intpin;         /* PCI interrupt pin */
965
966         /* Check for valid PCI dev pointer */
967         if (dev == NULL) return;
968
969         /* Initialize bridge IDSEL variable */
970         devnum = PCI_SLOT(tdev->devfn);
971
972         /* Read the interrupt pin of the device and adjust for indexing */
973         pcibios_read_config_byte(dev->bus->number, dev->devfn,
974                         PCI_INTERRUPT_PIN, &intpin);
975
976         /* If device doesn't request an interrupt, return */
977         if ( (intpin < 1) || (intpin > 4) )
978                 return;
979
980         intpin--;
981
982         /*
983          * Walk up to bus 0, adjusting the interrupt pin for the standard
984          * PCI bus swizzle.
985          */
986         do {
987                 intpin = (prep_pci_intpins[devnum % 4][intpin]) - 1;
988                 pbus = tdev->bus;        /* up one level */
989                 tdev = pbus->self;
990                 devnum = PCI_SLOT(tdev->devfn);
991         } while(tdev->bus->number);
992
993         /* Use the primary interrupt inputs by default */
994         intline = mot_info[mot_entry].pci_irq_list->primary[intpin];
995
996         /*
997          * If the board has secondary interrupt inputs, walk the bus and
998          * note the devfn of the bridge from bus 0.  If it is the same as
999          * the devfn of the bus bridge with secondary inputs, use those.
1000          * Otherwise, assume it's a PMC site and get the interrupt line
1001          * value from the interrupt routing table.
1002          */ 
1003         if (mot_info[mot_entry].secondary_bridge_devfn)
1004         {
1005                 pbus = dev->bus;
1006
1007                 while (pbus->primary != 0)
1008                         pbus = pbus->parent;
1009
1010                 if ((pbus->self)->devfn != 0xA0)
1011                 {
1012                         if ((pbus->self)->devfn == mot_info[mot_entry].secondary_bridge_devfn)
1013                                 intline = mot_info[mot_entry].pci_irq_list->secondary[intpin];
1014                         else
1015                         {
1016                                 if ((char *)(mot_info[mot_entry].map) == (char *)Mesquite_pci_IRQ_map)
1017                                         intline = mot_info[mot_entry].map[((pbus->self)->devfn)/8] + 16;
1018                                 else
1019                                 {
1020                                         int i;
1021                                         for (i=0;i<3;i++)
1022                                                 intpin = (prep_pci_intpins[devnum % 4][intpin]) - 1;
1023                                         intline = mot_info[mot_entry].pci_irq_list->primary[intpin];
1024                                 }
1025                         }
1026                 }
1027         }
1028
1029         /* Write calculated interrupt value to header and device list */
1030         dev->irq = intline;
1031         pci_write_config_byte(dev, PCI_INTERRUPT_LINE, (u8)dev->irq);
1032 }
1033
1034 void __init
1035 prep_pcibios_fixup(void)
1036 {
1037         struct pci_dev *dev;
1038         extern unsigned char *Motherboard_map;
1039         extern unsigned char *Motherboard_routes;
1040         unsigned char i;
1041
1042         prep_route_pci_interrupts();
1043
1044         printk("Setting PCI interrupts for a \"%s\"\n", Motherboard_map_name);
1045         if (OpenPIC_Addr) {
1046                 /* PCI interrupts are controlled by the OpenPIC */
1047                 pci_for_each_dev(dev) {
1048                         if (dev->bus->number == 0)
1049                         {
1050                                 dev->irq = openpic_to_irq(Motherboard_map[PCI_SLOT(dev->devfn)]);
1051                                 pcibios_write_config_byte(dev->bus->number, dev->devfn, PCI_INTERRUPT_LINE, dev->irq);
1052                         }
1053                         else
1054                         {
1055                                 if (Motherboard_non0 != NULL)
1056                                         Motherboard_non0(dev);
1057                         }
1058                 }
1059
1060                 /* Setup the Winbond or Via PIB */
1061                 prep_pib_init();
1062
1063                 return;
1064         }
1065
1066         pci_for_each_dev(dev) {
1067                 /*
1068                  * Use our old hard-coded kludge to figure out what
1069                  * irq this device uses.  This is necessary on things
1070                  * without residual data. -- Cort
1071                  */
1072                 unsigned char d = PCI_SLOT(dev->devfn);
1073                 dev->irq = Motherboard_routes[Motherboard_map[d]];
1074
1075                 for ( i = 0 ; i <= 5 ; i++ )
1076                 {
1077                         /*
1078                          * Relocate PCI I/O resources if necessary so the
1079                          * standard 256MB BAT covers them.
1080                          */
1081                         if ( (pci_resource_flags(dev, i) & IORESOURCE_IO) &&
1082                                 (dev->resource[i].start > 0x10000000) ) 
1083                         {
1084                                 printk("Relocating PCI address %lx -> %lx\n",
1085                                        dev->resource[i].start,
1086                                        (dev->resource[i].start & 0x00FFFFFF)
1087                                        | 0x01000000);
1088                                 dev->resource[i].start =
1089                                   (dev->resource[i].start & 0x00FFFFFF) | 0x01000000;
1090                                 pci_write_config_dword(dev,
1091                                         PCI_BASE_ADDRESS_0+(i*0x4),
1092                                        dev->resource[i].start );
1093                                 dev->resource[i].end =
1094                                         (dev->resource[i].end & 0x00FFFFFF) | 0x01000000;
1095                         }
1096                 }
1097 #if 0
1098                 /*
1099                  * If we have residual data and if it knows about this
1100                  * device ask it what the irq is.
1101                  *  -- Cort
1102                  */
1103                 ppcd = residual_find_device_id( ~0L, dev->device,
1104                                                 -1,-1,-1, 0);
1105 #endif
1106         }
1107 }
1108
1109 void __init
1110 prep_find_bridges(void)
1111 {
1112         struct pci_controller* hose;
1113
1114         hose = pcibios_alloc_controller();
1115         if (!hose)
1116                 return;
1117
1118         hose->first_busno = 0;
1119         hose->last_busno = 0xff;
1120         hose->pci_mem_offset = PREP_ISA_MEM_BASE;
1121         hose->io_base_virt = (void *)PREP_ISA_IO_BASE;
1122         
1123         printk("PReP architecture\n");
1124         {
1125 #ifdef CONFIG_PREP_RESIDUAL       
1126                 PPC_DEVICE *hostbridge;
1127
1128                 hostbridge = residual_find_device(PROCESSORDEVICE, NULL,
1129                         BridgeController, PCIBridge, -1, 0);
1130                 if (hostbridge &&
1131                         hostbridge->DeviceId.Interface == PCIBridgeIndirect) {
1132                         PnP_TAG_PACKET * pkt;
1133                         pkt = PnP_find_large_vendor_packet(
1134                                 res->DevicePnPHeap+hostbridge->AllocatedOffset,
1135                                 3, 0);
1136                         if(pkt)
1137                         {
1138 #define p pkt->L4_Pack.L4_Data.L4_PPCPack
1139                                 setup_indirect_pci(hose, 
1140                                         ld_le32((unsigned *) (p.PPCData)),
1141                                         ld_le32((unsigned *) (p.PPCData+8)));
1142                         }
1143                         else
1144                         {
1145                                 setup_indirect_pci(hose, 0x80000cf8, 0x80000cfc);
1146                         }
1147                 }
1148                 else
1149 #endif /* CONFIG_PREP_RESIDUAL */
1150                 {
1151                         hose->ops = &prep_pci_ops;
1152                 }
1153         }
1154
1155         ppc_md.pcibios_fixup = prep_pcibios_fixup;
1156 }
1157