1
2
3
4
5
6
7
8
9
10#define __EXTERN_INLINE inline
11#include <asm/io.h>
12#include <asm/core_mcpcia.h>
13#undef __EXTERN_INLINE
14
15#include <linux/types.h>
16#include <linux/pci.h>
17#include <linux/sched.h>
18#include <linux/init.h>
19#include <linux/delay.h>
20
21#include <asm/ptrace.h>
22
23#include "proto.h"
24#include "pci_impl.h"
25
26
27
28
29
30
31
32
33
34
35
36#define DEBUG_CFG 0
37
38#if DEBUG_CFG
39# define DBG_CFG(args) printk args
40#else
41# define DBG_CFG(args)
42#endif
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86static unsigned int
87conf_read(unsigned long addr, unsigned char type1,
88 struct pci_controller *hose)
89{
90 unsigned long flags;
91 unsigned long mid = MCPCIA_HOSE2MID(hose->index);
92 unsigned int stat0, value, cpu;
93
94 cpu = smp_processor_id();
95
96 local_irq_save(flags);
97
98 DBG_CFG(("conf_read(addr=0x%lx, type1=%d, hose=%d)\n",
99 addr, type1, mid));
100
101
102 stat0 = *(vuip)MCPCIA_CAP_ERR(mid);
103 *(vuip)MCPCIA_CAP_ERR(mid) = stat0;
104 mb();
105 *(vuip)MCPCIA_CAP_ERR(mid);
106 DBG_CFG(("conf_read: MCPCIA_CAP_ERR(%d) was 0x%x\n", mid, stat0));
107
108 mb();
109 draina();
110 mcheck_expected(cpu) = 1;
111 mcheck_taken(cpu) = 0;
112 mcheck_extra(cpu) = mid;
113 mb();
114
115
116 value = *((vuip)addr);
117 mb();
118 mb();
119
120 if (mcheck_taken(cpu)) {
121 mcheck_taken(cpu) = 0;
122 value = 0xffffffffU;
123 mb();
124 }
125 mcheck_expected(cpu) = 0;
126 mb();
127
128 DBG_CFG(("conf_read(): finished\n"));
129
130 local_irq_restore(flags);
131 return value;
132}
133
134static void
135conf_write(unsigned long addr, unsigned int value, unsigned char type1,
136 struct pci_controller *hose)
137{
138 unsigned long flags;
139 unsigned long mid = MCPCIA_HOSE2MID(hose->index);
140 unsigned int stat0, cpu;
141
142 cpu = smp_processor_id();
143
144 local_irq_save(flags);
145
146
147 stat0 = *(vuip)MCPCIA_CAP_ERR(mid);
148 *(vuip)MCPCIA_CAP_ERR(mid) = stat0; mb();
149 *(vuip)MCPCIA_CAP_ERR(mid);
150 DBG_CFG(("conf_write: MCPCIA CAP_ERR(%d) was 0x%x\n", mid, stat0));
151
152 draina();
153 mcheck_expected(cpu) = 1;
154 mcheck_extra(cpu) = mid;
155 mb();
156
157
158 *((vuip)addr) = value;
159 mb();
160 mb();
161 *(vuip)MCPCIA_CAP_ERR(mid);
162 mcheck_expected(cpu) = 0;
163 mb();
164
165 DBG_CFG(("conf_write(): finished\n"));
166 local_irq_restore(flags);
167}
168
169static int
170mk_conf_addr(struct pci_bus *pbus, unsigned int devfn, int where,
171 struct pci_controller *hose, unsigned long *pci_addr,
172 unsigned char *type1)
173{
174 u8 bus = pbus->number;
175 unsigned long addr;
176
177 DBG_CFG(("mk_conf_addr(bus=%d,devfn=0x%x,hose=%d,where=0x%x,"
178 " pci_addr=0x%p, type1=0x%p)\n",
179 bus, devfn, hose->index, where, pci_addr, type1));
180
181
182 *type1 = 1;
183
184 if (!pbus->parent)
185 bus = 0;
186 addr = (bus << 16) | (devfn << 8) | (where);
187 addr <<= 5;
188 addr |= hose->config_space_base;
189
190 *pci_addr = addr;
191 DBG_CFG(("mk_conf_addr: returning pci_addr 0x%lx\n", addr));
192 return 0;
193}
194
195static int
196mcpcia_read_config(struct pci_bus *bus, unsigned int devfn, int where,
197 int size, u32 *value)
198{
199 struct pci_controller *hose = bus->sysdata;
200 unsigned long addr, w;
201 unsigned char type1;
202
203 if (mk_conf_addr(bus, devfn, where, hose, &addr, &type1))
204 return PCIBIOS_DEVICE_NOT_FOUND;
205
206 addr |= (size - 1) * 8;
207 w = conf_read(addr, type1, hose);
208 switch (size) {
209 case 1:
210 *value = __kernel_extbl(w, where & 3);
211 break;
212 case 2:
213 *value = __kernel_extwl(w, where & 3);
214 break;
215 case 4:
216 *value = w;
217 break;
218 }
219 return PCIBIOS_SUCCESSFUL;
220}
221
222static int
223mcpcia_write_config(struct pci_bus *bus, unsigned int devfn, int where,
224 int size, u32 value)
225{
226 struct pci_controller *hose = bus->sysdata;
227 unsigned long addr;
228 unsigned char type1;
229
230 if (mk_conf_addr(bus, devfn, where, hose, &addr, &type1))
231 return PCIBIOS_DEVICE_NOT_FOUND;
232
233 addr |= (size - 1) * 8;
234 value = __kernel_insql(value, where & 3);
235 conf_write(addr, value, type1, hose);
236 return PCIBIOS_SUCCESSFUL;
237}
238
239struct pci_ops mcpcia_pci_ops =
240{
241 .read = mcpcia_read_config,
242 .write = mcpcia_write_config,
243};
244
245void
246mcpcia_pci_tbi(struct pci_controller *hose, dma_addr_t start, dma_addr_t end)
247{
248 wmb();
249 *(vuip)MCPCIA_SG_TBIA(MCPCIA_HOSE2MID(hose->index)) = 0;
250 mb();
251}
252
253static int __init
254mcpcia_probe_hose(int h)
255{
256 int cpu = smp_processor_id();
257 int mid = MCPCIA_HOSE2MID(h);
258 unsigned int pci_rev;
259
260
261
262 mb();
263 mb();
264 draina();
265 wrmces(7);
266
267 mcheck_expected(cpu) = 2;
268 mcheck_taken(cpu) = 0;
269 mcheck_extra(cpu) = mid;
270 mb();
271
272
273 pci_rev = *(vuip)MCPCIA_REV(mid);
274
275 mb();
276 mb();
277 if (mcheck_taken(cpu)) {
278 mcheck_taken(cpu) = 0;
279 pci_rev = 0xffffffff;
280 mb();
281 }
282 mcheck_expected(cpu) = 0;
283 mb();
284
285 return (pci_rev >> 16) == PCI_CLASS_BRIDGE_HOST;
286}
287
288static void __init
289mcpcia_new_hose(int h)
290{
291 struct pci_controller *hose;
292 struct resource *io, *mem, *hae_mem;
293 int mid = MCPCIA_HOSE2MID(h);
294
295 hose = alloc_pci_controller();
296 if (h == 0)
297 pci_isa_hose = hose;
298 io = alloc_resource();
299 mem = alloc_resource();
300 hae_mem = alloc_resource();
301
302 hose->io_space = io;
303 hose->mem_space = hae_mem;
304 hose->sparse_mem_base = MCPCIA_SPARSE(mid) - IDENT_ADDR;
305 hose->dense_mem_base = MCPCIA_DENSE(mid) - IDENT_ADDR;
306 hose->sparse_io_base = MCPCIA_IO(mid) - IDENT_ADDR;
307 hose->dense_io_base = 0;
308 hose->config_space_base = MCPCIA_CONF(mid);
309 hose->index = h;
310
311 io->start = MCPCIA_IO(mid) - MCPCIA_IO_BIAS;
312 io->end = io->start + 0xffff;
313 io->name = pci_io_names[h];
314 io->flags = IORESOURCE_IO;
315
316 mem->start = MCPCIA_DENSE(mid) - MCPCIA_MEM_BIAS;
317 mem->end = mem->start + 0xffffffff;
318 mem->name = pci_mem_names[h];
319 mem->flags = IORESOURCE_MEM;
320
321 hae_mem->start = mem->start;
322 hae_mem->end = mem->start + MCPCIA_MEM_MASK;
323 hae_mem->name = pci_hae0_name;
324 hae_mem->flags = IORESOURCE_MEM;
325
326 if (request_resource(&ioport_resource, io) < 0)
327 printk(KERN_ERR "Failed to request IO on hose %d\n", h);
328 if (request_resource(&iomem_resource, mem) < 0)
329 printk(KERN_ERR "Failed to request MEM on hose %d\n", h);
330 if (request_resource(mem, hae_mem) < 0)
331 printk(KERN_ERR "Failed to request HAE_MEM on hose %d\n", h);
332}
333
334static void
335mcpcia_pci_clr_err(int mid)
336{
337 *(vuip)MCPCIA_CAP_ERR(mid);
338 *(vuip)MCPCIA_CAP_ERR(mid) = 0xffffffff;
339 mb();
340 *(vuip)MCPCIA_CAP_ERR(mid);
341}
342
343static void __init
344mcpcia_startup_hose(struct pci_controller *hose)
345{
346 int mid = MCPCIA_HOSE2MID(hose->index);
347 unsigned int tmp;
348
349 mcpcia_pci_clr_err(mid);
350
351
352
353
354 tmp = *(vuip)MCPCIA_CAP_ERR(mid);
355 tmp |= 0x0006;
356 *(vuip)MCPCIA_CAP_ERR(mid) = tmp;
357 mb();
358 tmp = *(vuip)MCPCIA_CAP_ERR(mid);
359
360
361
362
363
364
365
366
367 hose->sg_isa = iommu_arena_new(hose, 0x00800000, 0x00800000, 0);
368 hose->sg_pci = iommu_arena_new(hose, 0x40000000,
369 size_for_memory(0x40000000), 0);
370
371 __direct_map_base = 0x80000000;
372 __direct_map_size = 0x80000000;
373
374 *(vuip)MCPCIA_W0_BASE(mid) = hose->sg_isa->dma_base | 3;
375 *(vuip)MCPCIA_W0_MASK(mid) = (hose->sg_isa->size - 1) & 0xfff00000;
376 *(vuip)MCPCIA_T0_BASE(mid) = virt_to_phys(hose->sg_isa->ptes) >> 8;
377
378 *(vuip)MCPCIA_W1_BASE(mid) = hose->sg_pci->dma_base | 3;
379 *(vuip)MCPCIA_W1_MASK(mid) = (hose->sg_pci->size - 1) & 0xfff00000;
380 *(vuip)MCPCIA_T1_BASE(mid) = virt_to_phys(hose->sg_pci->ptes) >> 8;
381
382 *(vuip)MCPCIA_W2_BASE(mid) = __direct_map_base | 1;
383 *(vuip)MCPCIA_W2_MASK(mid) = (__direct_map_size - 1) & 0xfff00000;
384 *(vuip)MCPCIA_T2_BASE(mid) = 0;
385
386 *(vuip)MCPCIA_W3_BASE(mid) = 0x0;
387
388 mcpcia_pci_tbi(hose, 0, -1);
389
390 *(vuip)MCPCIA_HBASE(mid) = 0x0;
391 mb();
392
393 *(vuip)MCPCIA_HAE_MEM(mid) = 0U;
394 mb();
395 *(vuip)MCPCIA_HAE_MEM(mid);
396 *(vuip)MCPCIA_HAE_IO(mid) = 0;
397 mb();
398 *(vuip)MCPCIA_HAE_IO(mid);
399}
400
401void __init
402mcpcia_init_arch(void)
403{
404
405 ioport_resource.end = ~0UL;
406
407
408
409
410
411
412 mcpcia_new_hose(0);
413}
414
415
416
417
418void __init
419mcpcia_init_hoses(void)
420{
421 struct pci_controller *hose;
422 int hose_count;
423 int h;
424
425
426 hose_count = 0;
427 for (h = 0; h < MCPCIA_MAX_HOSES; ++h) {
428 if (mcpcia_probe_hose(h)) {
429 if (h != 0)
430 mcpcia_new_hose(h);
431 hose_count++;
432 }
433 }
434
435 printk("mcpcia_init_hoses: found %d hoses\n", hose_count);
436
437
438 for (hose = hose_head; hose; hose = hose->next)
439 mcpcia_startup_hose(hose);
440}
441
442static void
443mcpcia_print_uncorrectable(struct el_MCPCIA_uncorrected_frame_mcheck *logout)
444{
445 struct el_common_EV5_uncorrectable_mcheck *frame;
446 int i;
447
448 frame = &logout->procdata;
449
450
451 for (i = 0; i < 24; i += 2) {
452 printk(" paltmp[%d-%d] = %16lx %16lx\n",
453 i, i+1, frame->paltemp[i], frame->paltemp[i+1]);
454 }
455 for (i = 0; i < 8; i += 2) {
456 printk(" shadow[%d-%d] = %16lx %16lx\n",
457 i, i+1, frame->shadow[i],
458 frame->shadow[i+1]);
459 }
460 printk(" Addr of excepting instruction = %16lx\n",
461 frame->exc_addr);
462 printk(" Summary of arithmetic traps = %16lx\n",
463 frame->exc_sum);
464 printk(" Exception mask = %16lx\n",
465 frame->exc_mask);
466 printk(" Base address for PALcode = %16lx\n",
467 frame->pal_base);
468 printk(" Interrupt Status Reg = %16lx\n",
469 frame->isr);
470 printk(" CURRENT SETUP OF EV5 IBOX = %16lx\n",
471 frame->icsr);
472 printk(" I-CACHE Reg %s parity error = %16lx\n",
473 (frame->ic_perr_stat & 0x800L) ?
474 "Data" : "Tag",
475 frame->ic_perr_stat);
476 printk(" D-CACHE error Reg = %16lx\n",
477 frame->dc_perr_stat);
478 if (frame->dc_perr_stat & 0x2) {
479 switch (frame->dc_perr_stat & 0x03c) {
480 case 8:
481 printk(" Data error in bank 1\n");
482 break;
483 case 4:
484 printk(" Data error in bank 0\n");
485 break;
486 case 20:
487 printk(" Tag error in bank 1\n");
488 break;
489 case 10:
490 printk(" Tag error in bank 0\n");
491 break;
492 }
493 }
494 printk(" Effective VA = %16lx\n",
495 frame->va);
496 printk(" Reason for D-stream = %16lx\n",
497 frame->mm_stat);
498 printk(" EV5 SCache address = %16lx\n",
499 frame->sc_addr);
500 printk(" EV5 SCache TAG/Data parity = %16lx\n",
501 frame->sc_stat);
502 printk(" EV5 BC_TAG_ADDR = %16lx\n",
503 frame->bc_tag_addr);
504 printk(" EV5 EI_ADDR: Phys addr of Xfer = %16lx\n",
505 frame->ei_addr);
506 printk(" Fill Syndrome = %16lx\n",
507 frame->fill_syndrome);
508 printk(" EI_STAT reg = %16lx\n",
509 frame->ei_stat);
510 printk(" LD_LOCK = %16lx\n",
511 frame->ld_lock);
512}
513
514static void
515mcpcia_print_system_area(unsigned long la_ptr)
516{
517 struct el_common *frame;
518 struct pci_controller *hose;
519
520 struct IOD_subpacket {
521 unsigned long base;
522 unsigned int whoami;
523 unsigned int rsvd1;
524 unsigned int pci_rev;
525 unsigned int cap_ctrl;
526 unsigned int hae_mem;
527 unsigned int hae_io;
528 unsigned int int_ctl;
529 unsigned int int_reg;
530 unsigned int int_mask0;
531 unsigned int int_mask1;
532 unsigned int mc_err0;
533 unsigned int mc_err1;
534 unsigned int cap_err;
535 unsigned int rsvd2;
536 unsigned int pci_err1;
537 unsigned int mdpa_stat;
538 unsigned int mdpa_syn;
539 unsigned int mdpb_stat;
540 unsigned int mdpb_syn;
541 unsigned int rsvd3;
542 unsigned int rsvd4;
543 unsigned int rsvd5;
544 } *iodpp;
545
546 frame = (struct el_common *)la_ptr;
547 iodpp = (struct IOD_subpacket *) (la_ptr + frame->sys_offset);
548
549 for (hose = hose_head; hose; hose = hose->next, iodpp++) {
550
551 printk("IOD %d Register Subpacket - Bridge Base Address %16lx\n",
552 hose->index, iodpp->base);
553 printk(" WHOAMI = %8x\n", iodpp->whoami);
554 printk(" PCI_REV = %8x\n", iodpp->pci_rev);
555 printk(" CAP_CTRL = %8x\n", iodpp->cap_ctrl);
556 printk(" HAE_MEM = %8x\n", iodpp->hae_mem);
557 printk(" HAE_IO = %8x\n", iodpp->hae_io);
558 printk(" INT_CTL = %8x\n", iodpp->int_ctl);
559 printk(" INT_REG = %8x\n", iodpp->int_reg);
560 printk(" INT_MASK0 = %8x\n", iodpp->int_mask0);
561 printk(" INT_MASK1 = %8x\n", iodpp->int_mask1);
562 printk(" MC_ERR0 = %8x\n", iodpp->mc_err0);
563 printk(" MC_ERR1 = %8x\n", iodpp->mc_err1);
564 printk(" CAP_ERR = %8x\n", iodpp->cap_err);
565 printk(" PCI_ERR1 = %8x\n", iodpp->pci_err1);
566 printk(" MDPA_STAT = %8x\n", iodpp->mdpa_stat);
567 printk(" MDPA_SYN = %8x\n", iodpp->mdpa_syn);
568 printk(" MDPB_STAT = %8x\n", iodpp->mdpb_stat);
569 printk(" MDPB_SYN = %8x\n", iodpp->mdpb_syn);
570 }
571}
572
573void
574mcpcia_machine_check(unsigned long vector, unsigned long la_ptr)
575{
576 struct el_MCPCIA_uncorrected_frame_mcheck *mchk_logout;
577 unsigned int cpu = smp_processor_id();
578 int expected;
579
580 mchk_logout = (struct el_MCPCIA_uncorrected_frame_mcheck *)la_ptr;
581 expected = mcheck_expected(cpu);
582
583 mb();
584 mb();
585 draina();
586
587 switch (expected) {
588 case 0:
589 {
590
591
592 struct pci_controller *hose;
593 for (hose = hose_head; hose; hose = hose->next)
594 mcpcia_pci_clr_err(MCPCIA_HOSE2MID(hose->index));
595 break;
596 }
597 case 1:
598 mcpcia_pci_clr_err(mcheck_extra(cpu));
599 break;
600 default:
601
602
603 break;
604 }
605
606 wrmces(0x7);
607 mb();
608
609 process_mcheck_info(vector, la_ptr, "MCPCIA", expected != 0);
610 if (!expected && vector != 0x620 && vector != 0x630) {
611 mcpcia_print_uncorrectable(mchk_logout);
612 mcpcia_print_system_area(la_ptr);
613 }
614}
615