1 // SPDX-License-Identifier: GPL-2.0
3 * linux/arch/alpha/kernel/core_mcpcia.c
5 * Based on code written by David A Rusling (david.rusling@reo.mts.dec.com).
7 * Code common to all MCbus-PCI Adaptor core logic chipsets
10 #define __EXTERN_INLINE inline
12 #include <asm/core_mcpcia.h>
13 #undef __EXTERN_INLINE
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>
21 #include <asm/ptrace.h>
27 * NOTE: Herein lie back-to-back mb instructions. They are magic.
28 * One plausible explanation is that the i/o controller does not properly
29 * handle the system transaction. Another involves timing. Ho hum.
33 * BIOS32-style PCI interface:
39 # define DBG_CFG(args) printk args
41 # define DBG_CFG(args)
45 * Given a bus, device, and function number, compute resulting
46 * configuration space address and setup the MCPCIA_HAXR2 register
47 * accordingly. It is therefore not safe to have concurrent
48 * invocations to configuration space access routines, but there
49 * really shouldn't be any need for this.
53 * 3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
54 * 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
55 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
56 * | | |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|
57 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
59 * 31:11 Device select bit.
60 * 10:8 Function number
65 * 3 3|3 3 2 2|2 2 2 2|2 2 2 2|1 1 1 1|1 1 1 1|1 1
66 * 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
67 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
68 * | | | | | | | | | | |B|B|B|B|B|B|B|B|D|D|D|D|D|F|F|F|R|R|R|R|R|R|0|1|
69 * +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
72 * 23:16 bus number (8 bits = 128 possible buses)
73 * 15:11 Device number (5 bits)
74 * 10:8 function number
78 * The function number selects which function of a multi-function device
79 * (e.g., SCSI and Ethernet).
81 * The register selects a DWORD (32 bit) register offset. Hence it
82 * doesn't get shifted by 2 bits as we want to "drop" the bottom two
87 conf_read(unsigned long addr
, unsigned char type1
,
88 struct pci_controller
*hose
)
91 unsigned long mid
= MCPCIA_HOSE2MID(hose
->index
);
92 unsigned int stat0
, value
, cpu
;
94 cpu
= smp_processor_id();
96 local_irq_save(flags
);
98 DBG_CFG(("conf_read(addr=0x%lx, type1=%d, hose=%d)\n",
101 /* Reset status register to avoid losing errors. */
102 stat0
= *(vuip
)MCPCIA_CAP_ERR(mid
);
103 *(vuip
)MCPCIA_CAP_ERR(mid
) = stat0
;
105 *(vuip
)MCPCIA_CAP_ERR(mid
);
106 DBG_CFG(("conf_read: MCPCIA_CAP_ERR(%d) was 0x%x\n", mid
, stat0
));
110 mcheck_expected(cpu
) = 1;
111 mcheck_taken(cpu
) = 0;
112 mcheck_extra(cpu
) = mid
;
115 /* Access configuration space. */
116 value
= *((vuip
)addr
);
120 if (mcheck_taken(cpu
)) {
121 mcheck_taken(cpu
) = 0;
125 mcheck_expected(cpu
) = 0;
128 DBG_CFG(("conf_read(): finished\n"));
130 local_irq_restore(flags
);
135 conf_write(unsigned long addr
, unsigned int value
, unsigned char type1
,
136 struct pci_controller
*hose
)
139 unsigned long mid
= MCPCIA_HOSE2MID(hose
->index
);
140 unsigned int stat0
, cpu
;
142 cpu
= smp_processor_id();
144 local_irq_save(flags
); /* avoid getting hit by machine check */
146 /* Reset status register to avoid losing errors. */
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
));
153 mcheck_expected(cpu
) = 1;
154 mcheck_extra(cpu
) = mid
;
157 /* Access configuration space. */
158 *((vuip
)addr
) = value
;
161 *(vuip
)MCPCIA_CAP_ERR(mid
); /* read to force the write */
162 mcheck_expected(cpu
) = 0;
165 DBG_CFG(("conf_write(): finished\n"));
166 local_irq_restore(flags
);
170 mk_conf_addr(struct pci_bus
*pbus
, unsigned int devfn
, int where
,
171 struct pci_controller
*hose
, unsigned long *pci_addr
,
172 unsigned char *type1
)
174 u8 bus
= pbus
->number
;
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
));
181 /* Type 1 configuration cycle for *ALL* busses. */
184 if (!pbus
->parent
) /* No parent means peer PCI bus. */
186 addr
= (bus
<< 16) | (devfn
<< 8) | (where
);
187 addr
<<= 5; /* swizzle for SPARSE */
188 addr
|= hose
->config_space_base
;
191 DBG_CFG(("mk_conf_addr: returning pci_addr 0x%lx\n", addr
));
196 mcpcia_read_config(struct pci_bus
*bus
, unsigned int devfn
, int where
,
197 int size
, u32
*value
)
199 struct pci_controller
*hose
= bus
->sysdata
;
200 unsigned long addr
, w
;
203 if (mk_conf_addr(bus
, devfn
, where
, hose
, &addr
, &type1
))
204 return PCIBIOS_DEVICE_NOT_FOUND
;
206 addr
|= (size
- 1) * 8;
207 w
= conf_read(addr
, type1
, hose
);
210 *value
= __kernel_extbl(w
, where
& 3);
213 *value
= __kernel_extwl(w
, where
& 3);
219 return PCIBIOS_SUCCESSFUL
;
223 mcpcia_write_config(struct pci_bus
*bus
, unsigned int devfn
, int where
,
226 struct pci_controller
*hose
= bus
->sysdata
;
230 if (mk_conf_addr(bus
, devfn
, where
, hose
, &addr
, &type1
))
231 return PCIBIOS_DEVICE_NOT_FOUND
;
233 addr
|= (size
- 1) * 8;
234 value
= __kernel_insql(value
, where
& 3);
235 conf_write(addr
, value
, type1
, hose
);
236 return PCIBIOS_SUCCESSFUL
;
239 struct pci_ops mcpcia_pci_ops
=
241 .read
= mcpcia_read_config
,
242 .write
= mcpcia_write_config
,
246 mcpcia_pci_tbi(struct pci_controller
*hose
, dma_addr_t start
, dma_addr_t end
)
249 *(vuip
)MCPCIA_SG_TBIA(MCPCIA_HOSE2MID(hose
->index
)) = 0;
254 mcpcia_probe_hose(int h
)
256 int cpu
= smp_processor_id();
257 int mid
= MCPCIA_HOSE2MID(h
);
258 unsigned int pci_rev
;
260 /* Gotta be REAL careful. If hose is absent, we get an mcheck. */
267 mcheck_expected(cpu
) = 2; /* indicates probing */
268 mcheck_taken(cpu
) = 0;
269 mcheck_extra(cpu
) = mid
;
272 /* Access the bus revision word. */
273 pci_rev
= *(vuip
)MCPCIA_REV(mid
);
277 if (mcheck_taken(cpu
)) {
278 mcheck_taken(cpu
) = 0;
279 pci_rev
= 0xffffffff;
282 mcheck_expected(cpu
) = 0;
285 return (pci_rev
>> 16) == PCI_CLASS_BRIDGE_HOST
;
289 mcpcia_new_hose(int h
)
291 struct pci_controller
*hose
;
292 struct resource
*io
, *mem
, *hae_mem
;
293 int mid
= MCPCIA_HOSE2MID(h
);
295 hose
= alloc_pci_controller();
298 io
= alloc_resource();
299 mem
= alloc_resource();
300 hae_mem
= alloc_resource();
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
);
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
;
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
;
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
;
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
);
335 mcpcia_pci_clr_err(int mid
)
337 *(vuip
)MCPCIA_CAP_ERR(mid
);
338 *(vuip
)MCPCIA_CAP_ERR(mid
) = 0xffffffff; /* Clear them all. */
340 *(vuip
)MCPCIA_CAP_ERR(mid
); /* Re-read for force write. */
344 mcpcia_startup_hose(struct pci_controller
*hose
)
346 int mid
= MCPCIA_HOSE2MID(hose
->index
);
349 mcpcia_pci_clr_err(mid
);
352 * Set up error reporting.
354 tmp
= *(vuip
)MCPCIA_CAP_ERR(mid
);
355 tmp
|= 0x0006; /* master/target abort */
356 *(vuip
)MCPCIA_CAP_ERR(mid
) = tmp
;
358 tmp
= *(vuip
)MCPCIA_CAP_ERR(mid
);
361 * Set up the PCI->physical memory translation windows.
363 * Window 0 is scatter-gather 8MB at 8MB (for isa)
364 * Window 1 is scatter-gather (up to) 1GB at 1GB (for pci)
365 * Window 2 is direct access 2GB at 2GB
367 hose
->sg_isa
= iommu_arena_new(hose
, 0x00800000, 0x00800000,
369 hose
->sg_pci
= iommu_arena_new(hose
, 0x40000000,
370 size_for_memory(0x40000000),
373 __direct_map_base
= 0x80000000;
374 __direct_map_size
= 0x80000000;
376 *(vuip
)MCPCIA_W0_BASE(mid
) = hose
->sg_isa
->dma_base
| 3;
377 *(vuip
)MCPCIA_W0_MASK(mid
) = (hose
->sg_isa
->size
- 1) & 0xfff00000;
378 *(vuip
)MCPCIA_T0_BASE(mid
) = virt_to_phys(hose
->sg_isa
->ptes
) >> 8;
380 *(vuip
)MCPCIA_W1_BASE(mid
) = hose
->sg_pci
->dma_base
| 3;
381 *(vuip
)MCPCIA_W1_MASK(mid
) = (hose
->sg_pci
->size
- 1) & 0xfff00000;
382 *(vuip
)MCPCIA_T1_BASE(mid
) = virt_to_phys(hose
->sg_pci
->ptes
) >> 8;
384 *(vuip
)MCPCIA_W2_BASE(mid
) = __direct_map_base
| 1;
385 *(vuip
)MCPCIA_W2_MASK(mid
) = (__direct_map_size
- 1) & 0xfff00000;
386 *(vuip
)MCPCIA_T2_BASE(mid
) = 0;
388 *(vuip
)MCPCIA_W3_BASE(mid
) = 0x0;
390 mcpcia_pci_tbi(hose
, 0, -1);
392 *(vuip
)MCPCIA_HBASE(mid
) = 0x0;
395 *(vuip
)MCPCIA_HAE_MEM(mid
) = 0U;
397 *(vuip
)MCPCIA_HAE_MEM(mid
); /* read it back. */
398 *(vuip
)MCPCIA_HAE_IO(mid
) = 0;
400 *(vuip
)MCPCIA_HAE_IO(mid
); /* read it back. */
404 mcpcia_init_arch(void)
406 /* With multiple PCI busses, we play with I/O as physical addrs. */
407 ioport_resource
.end
= ~0UL;
409 /* Allocate hose 0. That's the one that all the ISA junk hangs
410 off of, from which we'll be registering stuff here in a bit.
411 Other hose detection is done in mcpcia_init_hoses, which is
412 called from init_IRQ. */
417 /* This is called from init_IRQ, since we cannot take interrupts
418 before then. Which means we cannot do this in init_arch. */
421 mcpcia_init_hoses(void)
423 struct pci_controller
*hose
;
427 /* First, find how many hoses we have. */
429 for (h
= 0; h
< MCPCIA_MAX_HOSES
; ++h
) {
430 if (mcpcia_probe_hose(h
)) {
437 printk("mcpcia_init_hoses: found %d hoses\n", hose_count
);
439 /* Now do init for each hose. */
440 for (hose
= hose_head
; hose
; hose
= hose
->next
)
441 mcpcia_startup_hose(hose
);
445 mcpcia_print_uncorrectable(struct el_MCPCIA_uncorrected_frame_mcheck
*logout
)
447 struct el_common_EV5_uncorrectable_mcheck
*frame
;
450 frame
= &logout
->procdata
;
452 /* Print PAL fields */
453 for (i
= 0; i
< 24; i
+= 2) {
454 printk(" paltmp[%d-%d] = %16lx %16lx\n",
455 i
, i
+1, frame
->paltemp
[i
], frame
->paltemp
[i
+1]);
457 for (i
= 0; i
< 8; i
+= 2) {
458 printk(" shadow[%d-%d] = %16lx %16lx\n",
459 i
, i
+1, frame
->shadow
[i
],
462 printk(" Addr of excepting instruction = %16lx\n",
464 printk(" Summary of arithmetic traps = %16lx\n",
466 printk(" Exception mask = %16lx\n",
468 printk(" Base address for PALcode = %16lx\n",
470 printk(" Interrupt Status Reg = %16lx\n",
472 printk(" CURRENT SETUP OF EV5 IBOX = %16lx\n",
474 printk(" I-CACHE Reg %s parity error = %16lx\n",
475 (frame
->ic_perr_stat
& 0x800L
) ?
477 frame
->ic_perr_stat
);
478 printk(" D-CACHE error Reg = %16lx\n",
479 frame
->dc_perr_stat
);
480 if (frame
->dc_perr_stat
& 0x2) {
481 switch (frame
->dc_perr_stat
& 0x03c) {
483 printk(" Data error in bank 1\n");
486 printk(" Data error in bank 0\n");
489 printk(" Tag error in bank 1\n");
492 printk(" Tag error in bank 0\n");
496 printk(" Effective VA = %16lx\n",
498 printk(" Reason for D-stream = %16lx\n",
500 printk(" EV5 SCache address = %16lx\n",
502 printk(" EV5 SCache TAG/Data parity = %16lx\n",
504 printk(" EV5 BC_TAG_ADDR = %16lx\n",
506 printk(" EV5 EI_ADDR: Phys addr of Xfer = %16lx\n",
508 printk(" Fill Syndrome = %16lx\n",
509 frame
->fill_syndrome
);
510 printk(" EI_STAT reg = %16lx\n",
512 printk(" LD_LOCK = %16lx\n",
517 mcpcia_print_system_area(unsigned long la_ptr
)
519 struct el_common
*frame
;
520 struct pci_controller
*hose
;
522 struct IOD_subpacket
{
526 unsigned int pci_rev
;
527 unsigned int cap_ctrl
;
528 unsigned int hae_mem
;
530 unsigned int int_ctl
;
531 unsigned int int_reg
;
532 unsigned int int_mask0
;
533 unsigned int int_mask1
;
534 unsigned int mc_err0
;
535 unsigned int mc_err1
;
536 unsigned int cap_err
;
538 unsigned int pci_err1
;
539 unsigned int mdpa_stat
;
540 unsigned int mdpa_syn
;
541 unsigned int mdpb_stat
;
542 unsigned int mdpb_syn
;
548 frame
= (struct el_common
*)la_ptr
;
549 iodpp
= (struct IOD_subpacket
*) (la_ptr
+ frame
->sys_offset
);
551 for (hose
= hose_head
; hose
; hose
= hose
->next
, iodpp
++) {
553 printk("IOD %d Register Subpacket - Bridge Base Address %16lx\n",
554 hose
->index
, iodpp
->base
);
555 printk(" WHOAMI = %8x\n", iodpp
->whoami
);
556 printk(" PCI_REV = %8x\n", iodpp
->pci_rev
);
557 printk(" CAP_CTRL = %8x\n", iodpp
->cap_ctrl
);
558 printk(" HAE_MEM = %8x\n", iodpp
->hae_mem
);
559 printk(" HAE_IO = %8x\n", iodpp
->hae_io
);
560 printk(" INT_CTL = %8x\n", iodpp
->int_ctl
);
561 printk(" INT_REG = %8x\n", iodpp
->int_reg
);
562 printk(" INT_MASK0 = %8x\n", iodpp
->int_mask0
);
563 printk(" INT_MASK1 = %8x\n", iodpp
->int_mask1
);
564 printk(" MC_ERR0 = %8x\n", iodpp
->mc_err0
);
565 printk(" MC_ERR1 = %8x\n", iodpp
->mc_err1
);
566 printk(" CAP_ERR = %8x\n", iodpp
->cap_err
);
567 printk(" PCI_ERR1 = %8x\n", iodpp
->pci_err1
);
568 printk(" MDPA_STAT = %8x\n", iodpp
->mdpa_stat
);
569 printk(" MDPA_SYN = %8x\n", iodpp
->mdpa_syn
);
570 printk(" MDPB_STAT = %8x\n", iodpp
->mdpb_stat
);
571 printk(" MDPB_SYN = %8x\n", iodpp
->mdpb_syn
);
576 mcpcia_machine_check(unsigned long vector
, unsigned long la_ptr
)
578 struct el_MCPCIA_uncorrected_frame_mcheck
*mchk_logout
;
579 unsigned int cpu
= smp_processor_id();
582 mchk_logout
= (struct el_MCPCIA_uncorrected_frame_mcheck
*)la_ptr
;
583 expected
= mcheck_expected(cpu
);
592 /* FIXME: how do we figure out which hose the
594 struct pci_controller
*hose
;
595 for (hose
= hose_head
; hose
; hose
= hose
->next
)
596 mcpcia_pci_clr_err(MCPCIA_HOSE2MID(hose
->index
));
600 mcpcia_pci_clr_err(mcheck_extra(cpu
));
603 /* Otherwise, we're being called from mcpcia_probe_hose
604 and there's no hose clear an error from. */
611 process_mcheck_info(vector
, la_ptr
, "MCPCIA", expected
!= 0);
612 if (!expected
&& vector
!= 0x620 && vector
!= 0x630) {
613 mcpcia_print_uncorrectable(mchk_logout
);
614 mcpcia_print_system_area(la_ptr
);