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