1 /*
2 * linux/arch/alpha/kernel/core_mcpcia.c
3 *
4 * Based on code written by David A Rusling (david.rusling@reo.mts.dec.com).
5 *
6 * Code common to all MCbus-PCI Adaptor core logic chipsets
7 */
8
9 #include <linux/kernel.h>
10 #include <linux/types.h>
11 #include <linux/pci.h>
12 #include <linux/sched.h>
13 #include <linux/init.h>
14 #include <linux/delay.h>
15
16 #include <asm/ptrace.h>
17 #include <asm/system.h>
18 #include <asm/hwrpb.h>
19
20 #define __EXTERN_INLINE inline
21 #include <asm/io.h>
22 #include <asm/core_mcpcia.h>
23 #undef __EXTERN_INLINE
24
25 #include "proto.h"
26 #include "pci_impl.h"
27
28 /*
29 * NOTE: Herein lie back-to-back mb instructions. They are magic.
30 * One plausible explanation is that the i/o controller does not properly
31 * handle the system transaction. Another involves timing. Ho hum.
32 */
33
34 /*
35 * BIOS32-style PCI interface:
36 */
37
38 #define DEBUG_CFG 0
39
40 #if DEBUG_CFG
41 # define DBG_CFG(args) printk args
42 #else
43 # define DBG_CFG(args)
44 #endif
45
46 #define MCPCIA_MAX_HOSES 4
47
48 /*
49 * Given a bus, device, and function number, compute resulting
50 * configuration space address and setup the MCPCIA_HAXR2 register
51 * accordingly. It is therefore not safe to have concurrent
52 * invocations to configuration space access routines, but there
53 * really shouldn't be any need for this.
54 *
55 * Type 0:
56 *
57 * 3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
58 * 3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
59 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
60 * | | |D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|0|
61 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
62 *
63 * 31:11 Device select bit.
64 * 10:8 Function number
65 * 7:2 Register number
66 *
67 * Type 1:
68 *
69 * 3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
70 * 3 2|1 0 9 8|7 6 5 4|3 2 1 0|9 8 7 6|5 4 3 2|1 0 9 8|7 6 5 4|3 2 1 0
71 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
73 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
74 *
75 * 31:24 reserved
76 * 23:16 bus number (8 bits = 128 possible buses)
77 * 15:11 Device number (5 bits)
78 * 10:8 function number
79 * 7:2 register number
80 *
81 * Notes:
82 * The function number selects which function of a multi-function device
83 * (e.g., SCSI and Ethernet).
84 *
85 * The register selects a DWORD (32 bit) register offset. Hence it
86 * doesn't get shifted by 2 bits as we want to "drop" the bottom two
87 * bits.
88 */
89
90 static unsigned int
conf_read(unsigned long addr,unsigned char type1,struct pci_controller * hose)91 conf_read(unsigned long addr, unsigned char type1,
92 struct pci_controller *hose)
93 {
94 unsigned long flags;
95 unsigned long mid = MCPCIA_HOSE2MID(hose->index);
96 unsigned int stat0, value, temp, cpu;
97
98 cpu = smp_processor_id();
99
100 __save_and_cli(flags);
101
102 DBG_CFG(("conf_read(addr=0x%lx, type1=%d, hose=%d)\n",
103 addr, type1, mid));
104
105 /* Reset status register to avoid losing errors. */
106 stat0 = *(vuip)MCPCIA_CAP_ERR(mid);
107 *(vuip)MCPCIA_CAP_ERR(mid) = stat0;
108 mb();
109 temp = *(vuip)MCPCIA_CAP_ERR(mid);
110 DBG_CFG(("conf_read: MCPCIA_CAP_ERR(%d) was 0x%x\n", mid, stat0));
111
112 mb();
113 draina();
114 mcheck_expected(cpu) = 1;
115 mcheck_taken(cpu) = 0;
116 mcheck_extra(cpu) = mid;
117 mb();
118
119 /* Access configuration space. */
120 value = *((vuip)addr);
121 mb();
122 mb(); /* magic */
123
124 if (mcheck_taken(cpu)) {
125 mcheck_taken(cpu) = 0;
126 value = 0xffffffffU;
127 mb();
128 }
129 mcheck_expected(cpu) = 0;
130 mb();
131
132 DBG_CFG(("conf_read(): finished\n"));
133
134 __restore_flags(flags);
135 return value;
136 }
137
138 static void
conf_write(unsigned long addr,unsigned int value,unsigned char type1,struct pci_controller * hose)139 conf_write(unsigned long addr, unsigned int value, unsigned char type1,
140 struct pci_controller *hose)
141 {
142 unsigned long flags;
143 unsigned long mid = MCPCIA_HOSE2MID(hose->index);
144 unsigned int stat0, temp, cpu;
145
146 cpu = smp_processor_id();
147
148 __save_and_cli(flags); /* avoid getting hit by machine check */
149
150 /* Reset status register to avoid losing errors. */
151 stat0 = *(vuip)MCPCIA_CAP_ERR(mid);
152 *(vuip)MCPCIA_CAP_ERR(mid) = stat0; mb();
153 temp = *(vuip)MCPCIA_CAP_ERR(mid);
154 DBG_CFG(("conf_write: MCPCIA CAP_ERR(%d) was 0x%x\n", mid, stat0));
155
156 draina();
157 mcheck_expected(cpu) = 1;
158 mcheck_extra(cpu) = mid;
159 mb();
160
161 /* Access configuration space. */
162 *((vuip)addr) = value;
163 mb();
164 mb(); /* magic */
165 temp = *(vuip)MCPCIA_CAP_ERR(mid); /* read to force the write */
166 mcheck_expected(cpu) = 0;
167 mb();
168
169 DBG_CFG(("conf_write(): finished\n"));
170 __restore_flags(flags);
171 }
172
173 static int
mk_conf_addr(struct pci_dev * dev,int where,struct pci_controller * hose,unsigned long * pci_addr,unsigned char * type1)174 mk_conf_addr(struct pci_dev *dev, int where, struct pci_controller *hose,
175 unsigned long *pci_addr, unsigned char *type1)
176 {
177 u8 bus = dev->bus->number;
178 u8 devfn = dev->devfn;
179 unsigned long addr;
180
181 DBG_CFG(("mk_conf_addr(bus=%d,devfn=0x%x,hose=%d,where=0x%x,"
182 " pci_addr=0x%p, type1=0x%p)\n",
183 bus, devfn, hose->index, where, pci_addr, type1));
184
185 /* Type 1 configuration cycle for *ALL* busses. */
186 *type1 = 1;
187
188 if (dev->bus->number == hose->first_busno)
189 bus = 0;
190 addr = (bus << 16) | (devfn << 8) | (where);
191 addr <<= 5; /* swizzle for SPARSE */
192 addr |= hose->config_space_base;
193
194 *pci_addr = addr;
195 DBG_CFG(("mk_conf_addr: returning pci_addr 0x%lx\n", addr));
196 return 0;
197 }
198
199 static int
mcpcia_read_config_byte(struct pci_dev * dev,int where,u8 * value)200 mcpcia_read_config_byte(struct pci_dev *dev, int where, u8 *value)
201 {
202 struct pci_controller *hose = dev->sysdata;
203 unsigned long addr, w;
204 unsigned char type1;
205
206 if (mk_conf_addr(dev, where, hose, &addr, &type1))
207 return PCIBIOS_DEVICE_NOT_FOUND;
208
209 addr |= 0x00;
210 w = conf_read(addr, type1, hose);
211 *value = __kernel_extbl(w, where & 3);
212 return PCIBIOS_SUCCESSFUL;
213 }
214
215 static int
mcpcia_read_config_word(struct pci_dev * dev,int where,u16 * value)216 mcpcia_read_config_word(struct pci_dev *dev, int where, u16 *value)
217 {
218 struct pci_controller *hose = dev->sysdata;
219 unsigned long addr, w;
220 unsigned char type1;
221
222 if (mk_conf_addr(dev, where, hose, &addr, &type1))
223 return PCIBIOS_DEVICE_NOT_FOUND;
224
225 addr |= 0x08;
226 w = conf_read(addr, type1, hose);
227 *value = __kernel_extwl(w, where & 3);
228 return PCIBIOS_SUCCESSFUL;
229 }
230
231 static int
mcpcia_read_config_dword(struct pci_dev * dev,int where,u32 * value)232 mcpcia_read_config_dword(struct pci_dev *dev, int where, u32 *value)
233 {
234 struct pci_controller *hose = dev->sysdata;
235 unsigned long addr;
236 unsigned char type1;
237
238 if (mk_conf_addr(dev, where, hose, &addr, &type1))
239 return PCIBIOS_DEVICE_NOT_FOUND;
240
241 addr |= 0x18;
242 *value = conf_read(addr, type1, hose);
243 return PCIBIOS_SUCCESSFUL;
244 }
245
246 static int
mcpcia_write_config(struct pci_dev * dev,int where,u32 value,long mask)247 mcpcia_write_config(struct pci_dev *dev, int where, u32 value, long mask)
248 {
249 struct pci_controller *hose = dev->sysdata;
250 unsigned long addr;
251 unsigned char type1;
252
253 if (mk_conf_addr(dev, where, hose, &addr, &type1))
254 return PCIBIOS_DEVICE_NOT_FOUND;
255
256 addr |= mask;
257 value = __kernel_insql(value, where & 3);
258 conf_write(addr, value, type1, hose);
259 return PCIBIOS_SUCCESSFUL;
260 }
261
262 static int
mcpcia_write_config_byte(struct pci_dev * dev,int where,u8 value)263 mcpcia_write_config_byte(struct pci_dev *dev, int where, u8 value)
264 {
265 return mcpcia_write_config(dev, where, value, 0x00);
266 }
267
268 static int
mcpcia_write_config_word(struct pci_dev * dev,int where,u16 value)269 mcpcia_write_config_word(struct pci_dev *dev, int where, u16 value)
270 {
271 return mcpcia_write_config(dev, where, value, 0x08);
272 }
273
274 static int
mcpcia_write_config_dword(struct pci_dev * dev,int where,u32 value)275 mcpcia_write_config_dword(struct pci_dev *dev, int where, u32 value)
276 {
277 return mcpcia_write_config(dev, where, value, 0x18);
278 }
279
280 struct pci_ops mcpcia_pci_ops =
281 {
282 read_byte: mcpcia_read_config_byte,
283 read_word: mcpcia_read_config_word,
284 read_dword: mcpcia_read_config_dword,
285 write_byte: mcpcia_write_config_byte,
286 write_word: mcpcia_write_config_word,
287 write_dword: mcpcia_write_config_dword
288 };
289
290 void
mcpcia_pci_tbi(struct pci_controller * hose,dma_addr_t start,dma_addr_t end)291 mcpcia_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end)
292 {
293 wmb();
294 *(vuip)MCPCIA_SG_TBIA(MCPCIA_HOSE2MID(hose->index)) = 0;
295 mb();
296 }
297
298 static int __init
mcpcia_probe_hose(int h)299 mcpcia_probe_hose(int h)
300 {
301 int cpu = smp_processor_id();
302 int mid = MCPCIA_HOSE2MID(h);
303 unsigned int pci_rev;
304
305 /* Gotta be REAL careful. If hose is absent, we get an mcheck. */
306
307 mb();
308 mb();
309 draina();
310 wrmces(7);
311
312 mcheck_expected(cpu) = 2; /* indicates probing */
313 mcheck_taken(cpu) = 0;
314 mcheck_extra(cpu) = mid;
315 mb();
316
317 /* Access the bus revision word. */
318 pci_rev = *(vuip)MCPCIA_REV(mid);
319
320 mb();
321 mb(); /* magic */
322 if (mcheck_taken(cpu)) {
323 mcheck_taken(cpu) = 0;
324 pci_rev = 0xffffffff;
325 mb();
326 }
327 mcheck_expected(cpu) = 0;
328 mb();
329
330 return (pci_rev >> 16) == PCI_CLASS_BRIDGE_HOST;
331 }
332
333 static void __init
mcpcia_new_hose(int h)334 mcpcia_new_hose(int h)
335 {
336 struct pci_controller *hose;
337 struct resource *io, *mem, *hae_mem;
338 int mid = MCPCIA_HOSE2MID(h);
339
340 hose = alloc_pci_controller();
341 if (h == 0)
342 pci_isa_hose = hose;
343 io = alloc_resource();
344 mem = alloc_resource();
345 hae_mem = alloc_resource();
346
347 hose->io_space = io;
348 hose->mem_space = hae_mem;
349 hose->sparse_mem_base = MCPCIA_SPARSE(mid) - IDENT_ADDR;
350 hose->dense_mem_base = MCPCIA_DENSE(mid) - IDENT_ADDR;
351 hose->sparse_io_base = MCPCIA_IO(mid) - IDENT_ADDR;
352 hose->dense_io_base = 0;
353 hose->config_space_base = MCPCIA_CONF(mid);
354 hose->index = h;
355
356 io->start = MCPCIA_IO(mid) - MCPCIA_IO_BIAS;
357 io->end = io->start + 0xffff;
358 io->name = pci_io_names[h];
359 io->flags = IORESOURCE_IO;
360
361 mem->start = MCPCIA_DENSE(mid) - MCPCIA_MEM_BIAS;
362 mem->end = mem->start + 0xffffffff;
363 mem->name = pci_mem_names[h];
364 mem->flags = IORESOURCE_MEM;
365
366 hae_mem->start = mem->start;
367 hae_mem->end = mem->start + MCPCIA_MEM_MASK;
368 hae_mem->name = pci_hae0_name;
369 hae_mem->flags = IORESOURCE_MEM;
370
371 if (request_resource(&ioport_resource, io) < 0)
372 printk(KERN_ERR "Failed to request IO on hose %d\n", h);
373 if (request_resource(&iomem_resource, mem) < 0)
374 printk(KERN_ERR "Failed to request MEM on hose %d\n", h);
375 if (request_resource(mem, hae_mem) < 0)
376 printk(KERN_ERR "Failed to request HAE_MEM on hose %d\n", h);
377 }
378
379 static void
mcpcia_pci_clr_err(int mid)380 mcpcia_pci_clr_err(int mid)
381 {
382 *(vuip)MCPCIA_CAP_ERR(mid);
383 *(vuip)MCPCIA_CAP_ERR(mid) = 0xffffffff; /* Clear them all. */
384 mb();
385 *(vuip)MCPCIA_CAP_ERR(mid); /* Re-read for force write. */
386 }
387
388 static void __init
mcpcia_startup_hose(struct pci_controller * hose)389 mcpcia_startup_hose(struct pci_controller *hose)
390 {
391 int mid = MCPCIA_HOSE2MID(hose->index);
392 unsigned int tmp;
393
394 mcpcia_pci_clr_err(mid);
395
396 /*
397 * Set up error reporting.
398 */
399 tmp = *(vuip)MCPCIA_CAP_ERR(mid);
400 tmp |= 0x0006; /* master/target abort */
401 *(vuip)MCPCIA_CAP_ERR(mid) = tmp;
402 mb();
403 tmp = *(vuip)MCPCIA_CAP_ERR(mid);
404
405 /*
406 * Set up the PCI->physical memory translation windows.
407 *
408 * Window 0 is scatter-gather 8MB at 8MB (for isa)
409 * Window 1 is scatter-gather (up to) 1GB at 1GB (for pci)
410 * Window 2 is direct access 2GB at 2GB
411 */
412 hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 0);
413 hose->sg_pci = iommu_arena_new(hose, 0x40000000,
414 size_for_memory(0x40000000), 0);
415
416 __direct_map_base = 0x80000000;
417 __direct_map_size = 0x80000000;
418
419 *(vuip)MCPCIA_W0_BASE(mid) = hose->sg_isa->dma_base | 3;
420 *(vuip)MCPCIA_W0_MASK(mid) = (hose->sg_isa->size - 1) & 0xfff00000;
421 *(vuip)MCPCIA_T0_BASE(mid) = virt_to_phys(hose->sg_isa->ptes) >> 8;
422
423 *(vuip)MCPCIA_W1_BASE(mid) = hose->sg_pci->dma_base | 3;
424 *(vuip)MCPCIA_W1_MASK(mid) = (hose->sg_pci->size - 1) & 0xfff00000;
425 *(vuip)MCPCIA_T1_BASE(mid) = virt_to_phys(hose->sg_pci->ptes) >> 8;
426
427 *(vuip)MCPCIA_W2_BASE(mid) = __direct_map_base | 1;
428 *(vuip)MCPCIA_W2_MASK(mid) = (__direct_map_size - 1) & 0xfff00000;
429 *(vuip)MCPCIA_T2_BASE(mid) = 0;
430
431 *(vuip)MCPCIA_W3_BASE(mid) = 0x0;
432
433 mcpcia_pci_tbi(hose, 0, -1);
434
435 *(vuip)MCPCIA_HBASE(mid) = 0x0;
436 mb();
437
438 *(vuip)MCPCIA_HAE_MEM(mid) = 0U;
439 mb();
440 *(vuip)MCPCIA_HAE_MEM(mid); /* read it back. */
441 *(vuip)MCPCIA_HAE_IO(mid) = 0;
442 mb();
443 *(vuip)MCPCIA_HAE_IO(mid); /* read it back. */
444 }
445
446 void __init
mcpcia_init_arch(void)447 mcpcia_init_arch(void)
448 {
449 /* With multiple PCI busses, we play with I/O as physical addrs. */
450 ioport_resource.end = ~0UL;
451 iomem_resource.end = ~0UL;
452
453 /* Allocate hose 0. That's the one that all the ISA junk hangs
454 off of, from which we'll be registering stuff here in a bit.
455 Other hose detection is done in mcpcia_init_hoses, which is
456 called from init_IRQ. */
457
458 mcpcia_new_hose(0);
459 }
460
461 /* This is called from init_IRQ, since we cannot take interrupts
462 before then. Which means we cannot do this in init_arch. */
463
464 void __init
mcpcia_init_hoses(void)465 mcpcia_init_hoses(void)
466 {
467 struct pci_controller *hose;
468 int hose_count;
469 int h;
470
471 /* First, find how many hoses we have. */
472 hose_count = 0;
473 for (h = 0; h < MCPCIA_MAX_HOSES; ++h) {
474 if (mcpcia_probe_hose(h)) {
475 if (h != 0)
476 mcpcia_new_hose(h);
477 hose_count++;
478 }
479 }
480
481 printk("mcpcia_init_hoses: found %d hoses\n", hose_count);
482
483 /* Now do init for each hose. */
484 for (hose = hose_head; hose; hose = hose->next)
485 mcpcia_startup_hose(hose);
486 }
487
488 static void
mcpcia_print_uncorrectable(struct el_MCPCIA_uncorrected_frame_mcheck * logout)489 mcpcia_print_uncorrectable(struct el_MCPCIA_uncorrected_frame_mcheck *logout)
490 {
491 struct el_common_EV5_uncorrectable_mcheck *frame;
492 int i;
493
494 frame = &logout->procdata;
495
496 /* Print PAL fields */
497 for (i = 0; i < 24; i += 2) {
498 printk(" paltmp[%d-%d] = %16lx %16lx\n",
499 i, i+1, frame->paltemp[i], frame->paltemp[i+1]);
500 }
501 for (i = 0; i < 8; i += 2) {
502 printk(" shadow[%d-%d] = %16lx %16lx\n",
503 i, i+1, frame->shadow[i],
504 frame->shadow[i+1]);
505 }
506 printk(" Addr of excepting instruction = %16lx\n",
507 frame->exc_addr);
508 printk(" Summary of arithmetic traps = %16lx\n",
509 frame->exc_sum);
510 printk(" Exception mask = %16lx\n",
511 frame->exc_mask);
512 printk(" Base address for PALcode = %16lx\n",
513 frame->pal_base);
514 printk(" Interrupt Status Reg = %16lx\n",
515 frame->isr);
516 printk(" CURRENT SETUP OF EV5 IBOX = %16lx\n",
517 frame->icsr);
518 printk(" I-CACHE Reg %s parity error = %16lx\n",
519 (frame->ic_perr_stat & 0x800L) ?
520 "Data" : "Tag",
521 frame->ic_perr_stat);
522 printk(" D-CACHE error Reg = %16lx\n",
523 frame->dc_perr_stat);
524 if (frame->dc_perr_stat & 0x2) {
525 switch (frame->dc_perr_stat & 0x03c) {
526 case 8:
527 printk(" Data error in bank 1\n");
528 break;
529 case 4:
530 printk(" Data error in bank 0\n");
531 break;
532 case 20:
533 printk(" Tag error in bank 1\n");
534 break;
535 case 10:
536 printk(" Tag error in bank 0\n");
537 break;
538 }
539 }
540 printk(" Effective VA = %16lx\n",
541 frame->va);
542 printk(" Reason for D-stream = %16lx\n",
543 frame->mm_stat);
544 printk(" EV5 SCache address = %16lx\n",
545 frame->sc_addr);
546 printk(" EV5 SCache TAG/Data parity = %16lx\n",
547 frame->sc_stat);
548 printk(" EV5 BC_TAG_ADDR = %16lx\n",
549 frame->bc_tag_addr);
550 printk(" EV5 EI_ADDR: Phys addr of Xfer = %16lx\n",
551 frame->ei_addr);
552 printk(" Fill Syndrome = %16lx\n",
553 frame->fill_syndrome);
554 printk(" EI_STAT reg = %16lx\n",
555 frame->ei_stat);
556 printk(" LD_LOCK = %16lx\n",
557 frame->ld_lock);
558 }
559
560 static void
mcpcia_print_system_area(unsigned long la_ptr)561 mcpcia_print_system_area(unsigned long la_ptr)
562 {
563 struct el_common *frame;
564 struct pci_controller *hose;
565
566 struct IOD_subpacket {
567 unsigned long base;
568 unsigned int whoami;
569 unsigned int rsvd1;
570 unsigned int pci_rev;
571 unsigned int cap_ctrl;
572 unsigned int hae_mem;
573 unsigned int hae_io;
574 unsigned int int_ctl;
575 unsigned int int_reg;
576 unsigned int int_mask0;
577 unsigned int int_mask1;
578 unsigned int mc_err0;
579 unsigned int mc_err1;
580 unsigned int cap_err;
581 unsigned int rsvd2;
582 unsigned int pci_err1;
583 unsigned int mdpa_stat;
584 unsigned int mdpa_syn;
585 unsigned int mdpb_stat;
586 unsigned int mdpb_syn;
587 unsigned int rsvd3;
588 unsigned int rsvd4;
589 unsigned int rsvd5;
590 } *iodpp;
591
592 frame = (struct el_common *)la_ptr;
593 iodpp = (struct IOD_subpacket *) (la_ptr + frame->sys_offset);
594
595 for (hose = hose_head; hose; hose = hose->next, iodpp++) {
596
597 printk("IOD %d Register Subpacket - Bridge Base Address %16lx\n",
598 hose->index, iodpp->base);
599 printk(" WHOAMI = %8x\n", iodpp->whoami);
600 printk(" PCI_REV = %8x\n", iodpp->pci_rev);
601 printk(" CAP_CTRL = %8x\n", iodpp->cap_ctrl);
602 printk(" HAE_MEM = %8x\n", iodpp->hae_mem);
603 printk(" HAE_IO = %8x\n", iodpp->hae_io);
604 printk(" INT_CTL = %8x\n", iodpp->int_ctl);
605 printk(" INT_REG = %8x\n", iodpp->int_reg);
606 printk(" INT_MASK0 = %8x\n", iodpp->int_mask0);
607 printk(" INT_MASK1 = %8x\n", iodpp->int_mask1);
608 printk(" MC_ERR0 = %8x\n", iodpp->mc_err0);
609 printk(" MC_ERR1 = %8x\n", iodpp->mc_err1);
610 printk(" CAP_ERR = %8x\n", iodpp->cap_err);
611 printk(" PCI_ERR1 = %8x\n", iodpp->pci_err1);
612 printk(" MDPA_STAT = %8x\n", iodpp->mdpa_stat);
613 printk(" MDPA_SYN = %8x\n", iodpp->mdpa_syn);
614 printk(" MDPB_STAT = %8x\n", iodpp->mdpb_stat);
615 printk(" MDPB_SYN = %8x\n", iodpp->mdpb_syn);
616 }
617 }
618
619 void
mcpcia_machine_check(unsigned long vector,unsigned long la_ptr,struct pt_regs * regs)620 mcpcia_machine_check(unsigned long vector, unsigned long la_ptr,
621 struct pt_regs * regs)
622 {
623 struct el_common *mchk_header;
624 struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;
625 unsigned int cpu = smp_processor_id();
626 int expected;
627
628 mchk_header = (struct el_common *)la_ptr;
629 mchk_logout = (struct el_MCPCIA_uncorrected_frame_mcheck *)la_ptr;
630 expected = mcheck_expected(cpu);
631
632 mb();
633 mb(); /* magic */
634 draina();
635
636 switch (expected) {
637 case 0:
638 {
639 /* FIXME: how do we figure out which hose the
640 error was on? */
641 struct pci_controller *hose;
642 for (hose = hose_head; hose; hose = hose->next)
643 mcpcia_pci_clr_err(MCPCIA_HOSE2MID(hose->index));
644 break;
645 }
646 case 1:
647 mcpcia_pci_clr_err(mcheck_extra(cpu));
648 break;
649 default:
650 /* Otherwise, we're being called from mcpcia_probe_hose
651 and there's no hose clear an error from. */
652 break;
653 }
654
655 wrmces(0x7);
656 mb();
657
658 process_mcheck_info(vector, la_ptr, regs, "MCPCIA", expected != 0);
659 if (!expected && vector != 0x620 && vector != 0x630) {
660 mcpcia_print_uncorrectable(mchk_logout);
661 mcpcia_print_system_area(la_ptr);
662 }
663 }
664