2 * MPC85xx setup and early boot code plus other random bits.
4 * Maintained by Kumar Gala (see MAINTAINERS for contact information)
6 * Copyright 2005, 2011-2012 Freescale Semiconductor Inc.
8 * This program is free software; you can redistribute it and/or modify it
9 * under the terms of the GNU General Public License as published by the
10 * Free Software Foundation; either version 2 of the License, or (at your
11 * option) any later version.
14 #include <linux/stddef.h>
15 #include <linux/kernel.h>
16 #include <linux/init.h>
17 #include <linux/errno.h>
18 #include <linux/reboot.h>
19 #include <linux/pci.h>
20 #include <linux/kdev_t.h>
21 #include <linux/major.h>
22 #include <linux/console.h>
23 #include <linux/delay.h>
24 #include <linux/seq_file.h>
25 #include <linux/initrd.h>
26 #include <linux/interrupt.h>
27 #include <linux/fsl_devices.h>
28 #include <linux/of_platform.h>
30 #include <asm/pgtable.h>
32 #include <linux/atomic.h>
35 #include <asm/machdep.h>
37 #include <asm/pci-bridge.h>
39 #include <mm/mmu_decl.h>
43 #include <asm/i8259.h>
45 #include <sysdev/fsl_soc.h>
46 #include <sysdev/fsl_pci.h>
51 * The CDS board contains an FPGA/CPLD called "Cadmus", which collects
52 * various logic and performs system control functions.
53 * Here is the FPGA/CPLD register map.
56 u8 cm_ver
; /* Board version */
57 u8 cm_csr
; /* General control/status */
58 u8 cm_rst
; /* Reset control */
59 u8 cm_hsclk
; /* High speed clock */
60 u8 cm_hsxclk
; /* High speed clock extended */
61 u8 cm_led
; /* LED data */
62 u8 cm_pci
; /* PCI control/status */
63 u8 cm_dma
; /* DMA control */
64 u8 res
[248]; /* Total 256 bytes */
67 static struct cadmus_reg
*cadmus
;
71 #define ARCADIA_HOST_BRIDGE_IDSEL 17
72 #define ARCADIA_2ND_BRIDGE_IDSEL 3
74 static int mpc85xx_exclude_device(struct pci_controller
*hose
,
75 u_char bus
, u_char devfn
)
77 /* We explicitly do not go past the Tundra 320 Bridge */
78 if ((bus
== 1) && (PCI_SLOT(devfn
) == ARCADIA_2ND_BRIDGE_IDSEL
))
79 return PCIBIOS_DEVICE_NOT_FOUND
;
80 if ((bus
== 0) && (PCI_SLOT(devfn
) == ARCADIA_2ND_BRIDGE_IDSEL
))
81 return PCIBIOS_DEVICE_NOT_FOUND
;
83 return PCIBIOS_SUCCESSFUL
;
86 static int mpc85xx_cds_restart(struct notifier_block
*this,
87 unsigned long mode
, void *cmd
)
92 if ((dev
= pci_get_device(PCI_VENDOR_ID_VIA
, PCI_DEVICE_ID_VIA_82C686
,
95 /* Use the VIA Super Southbridge to force a PCI reset */
96 pci_read_config_byte(dev
, 0x47, &tmp
);
97 pci_write_config_byte(dev
, 0x47, tmp
| 1);
99 /* Flush the outbound PCI write queues */
100 pci_read_config_byte(dev
, 0x47, &tmp
);
103 * At this point, the hardware reset should have triggered.
104 * However, if it doesn't work for some mysterious reason,
105 * just fall through to the default reset below.
112 * If we can't find the VIA chip (maybe the P2P bridge is
113 * disabled) or the VIA chip reset didn't work, just return
114 * and let default reset sequence happen.
119 static int mpc85xx_cds_restart_register(void)
121 static struct notifier_block restart_handler
;
123 restart_handler
.notifier_call
= mpc85xx_cds_restart
;
124 restart_handler
.priority
= 192;
126 return register_restart_handler(&restart_handler
);
128 machine_arch_initcall(mpc85xx_cds
, mpc85xx_cds_restart_register
);
131 static void __init
mpc85xx_cds_pci_irq_fixup(struct pci_dev
*dev
)
134 if (dev
->vendor
== PCI_VENDOR_ID_VIA
) {
135 switch (dev
->device
) {
136 case PCI_DEVICE_ID_VIA_82C586_1
:
138 * U-Boot does not set the enable bits
139 * for the IDE device. Force them on here.
141 pci_read_config_byte(dev
, 0x40, &c
);
142 c
|= 0x03; /* IDE: Chip Enable Bits */
143 pci_write_config_byte(dev
, 0x40, c
);
146 * Since only primary interface works, force the
147 * IDE function to standard primary IDE interrupt
151 pci_write_config_byte(dev
, PCI_INTERRUPT_LINE
, dev
->irq
);
154 * Force legacy USB interrupt routing
156 case PCI_DEVICE_ID_VIA_82C586_2
:
157 /* There are two USB controllers.
158 * Identify them by functon number
160 if (PCI_FUNC(dev
->devfn
) == 3)
164 pci_write_config_byte(dev
, PCI_INTERRUPT_LINE
, dev
->irq
);
171 static void skip_fake_bridge(struct pci_dev
*dev
)
173 /* Make it an error to skip the fake bridge
174 * in pci_setup_device() in probe.c */
175 dev
->hdr_type
= 0x7f;
177 DECLARE_PCI_FIXUP_EARLY(0x1957, 0x3fff, skip_fake_bridge
);
178 DECLARE_PCI_FIXUP_EARLY(0x3fff, 0x1957, skip_fake_bridge
);
179 DECLARE_PCI_FIXUP_EARLY(0xff3f, 0x5719, skip_fake_bridge
);
181 #define PCI_DEVICE_ID_IDT_TSI310 0x01a7
184 * Fix Tsi310 PCI-X bridge resource.
185 * Force the bridge to open a window from 0x0000-0x1fff in PCI I/O space.
186 * This allows legacy I/O(i8259, etc) on the VIA southbridge to be accessed.
188 void mpc85xx_cds_fixup_bus(struct pci_bus
*bus
)
190 struct pci_dev
*dev
= bus
->self
;
191 struct resource
*res
= bus
->resource
[0];
194 dev
->vendor
== PCI_VENDOR_ID_IBM
&&
195 dev
->device
== PCI_DEVICE_ID_IDT_TSI310
) {
199 res
->flags
= IORESOURCE_IO
;
200 pr_info("mpc85xx_cds: PCI bridge resource fixup applied\n");
201 pr_info("mpc85xx_cds: %pR\n", res
);
205 fsl_pcibios_fixup_bus(bus
);
208 #ifdef CONFIG_PPC_I8259
209 static void mpc85xx_8259_cascade_handler(struct irq_desc
*desc
)
211 unsigned int cascade_irq
= i8259_irq();
214 /* handle an interrupt from the 8259 */
215 generic_handle_irq(cascade_irq
);
217 /* check for any interrupts from the shared IRQ line */
218 handle_fasteoi_irq(desc
);
221 static irqreturn_t
mpc85xx_8259_cascade_action(int irq
, void *dev_id
)
226 static struct irqaction mpc85xxcds_8259_irqaction
= {
227 .handler
= mpc85xx_8259_cascade_action
,
228 .flags
= IRQF_SHARED
| IRQF_NO_THREAD
,
229 .name
= "8259 cascade",
231 #endif /* PPC_I8259 */
232 #endif /* CONFIG_PCI */
234 static void __init
mpc85xx_cds_pic_init(void)
237 mpic
= mpic_alloc(NULL
, 0, MPIC_BIG_ENDIAN
,
238 0, 256, " OpenPIC ");
239 BUG_ON(mpic
== NULL
);
243 #if defined(CONFIG_PPC_I8259) && defined(CONFIG_PCI)
244 static int mpc85xx_cds_8259_attach(void)
247 struct device_node
*np
= NULL
;
248 struct device_node
*cascade_node
= NULL
;
251 /* Initialize the i8259 controller */
252 for_each_node_by_type(np
, "interrupt-controller")
253 if (of_device_is_compatible(np
, "chrp,iic")) {
258 if (cascade_node
== NULL
) {
259 printk(KERN_DEBUG
"Could not find i8259 PIC\n");
263 cascade_irq
= irq_of_parse_and_map(cascade_node
, 0);
265 printk(KERN_ERR
"Failed to map cascade interrupt\n");
269 i8259_init(cascade_node
, 0);
270 of_node_put(cascade_node
);
273 * Hook the interrupt to make sure desc->action is never NULL.
274 * This is required to ensure that the interrupt does not get
275 * disabled when the last user of the shared IRQ line frees their
278 if ((ret
= setup_irq(cascade_irq
, &mpc85xxcds_8259_irqaction
))) {
279 printk(KERN_ERR
"Failed to setup cascade interrupt\n");
283 /* Success. Connect our low-level cascade handler. */
284 irq_set_handler(cascade_irq
, mpc85xx_8259_cascade_handler
);
288 machine_device_initcall(mpc85xx_cds
, mpc85xx_cds_8259_attach
);
290 #endif /* CONFIG_PPC_I8259 */
292 static void mpc85xx_cds_pci_assign_primary(void)
295 struct device_node
*np
;
301 * MPC85xx_CDS has ISA bridge but unfortunately there is no
302 * isa node in device tree. We now looking for i8259 node as
303 * a workaround for such a broken device tree. This routine
304 * is for complying to all device trees.
306 np
= of_find_node_by_name(NULL
, "i8259");
307 while ((fsl_pci_primary
= of_get_parent(np
))) {
309 np
= fsl_pci_primary
;
311 if ((of_device_is_compatible(np
, "fsl,mpc8540-pci") ||
312 of_device_is_compatible(np
, "fsl,mpc8548-pcie")) &&
313 of_device_is_available(np
))
320 * Setup the architecture
322 static void __init
mpc85xx_cds_setup_arch(void)
324 struct device_node
*np
;
328 ppc_md
.progress("mpc85xx_cds_setup_arch()", 0);
330 np
= of_find_compatible_node(NULL
, NULL
, "fsl,mpc8548cds-fpga");
332 pr_err("Could not find FPGA node.\n");
336 cadmus
= of_iomap(np
, 0);
339 pr_err("Fail to map FPGA area.\n");
343 if (ppc_md
.progress
) {
345 cds_pci_slot
= ((in_8(&cadmus
->cm_csr
) >> 6) & 0x3) + 1;
346 snprintf(buf
, 40, "CDS Version = 0x%x in slot %d\n",
347 in_8(&cadmus
->cm_ver
), cds_pci_slot
);
348 ppc_md
.progress(buf
, 0);
352 ppc_md
.pci_irq_fixup
= mpc85xx_cds_pci_irq_fixup
;
353 ppc_md
.pci_exclude_device
= mpc85xx_exclude_device
;
356 mpc85xx_cds_pci_assign_primary();
357 fsl_pci_assign_primary();
360 static void mpc85xx_cds_show_cpuinfo(struct seq_file
*m
)
362 uint pvid
, svid
, phid1
;
364 pvid
= mfspr(SPRN_PVR
);
365 svid
= mfspr(SPRN_SVR
);
367 seq_printf(m
, "Vendor\t\t: Freescale Semiconductor\n");
368 seq_printf(m
, "Machine\t\t: MPC85xx CDS (0x%x)\n",
369 in_8(&cadmus
->cm_ver
));
370 seq_printf(m
, "PVR\t\t: 0x%x\n", pvid
);
371 seq_printf(m
, "SVR\t\t: 0x%x\n", svid
);
373 /* Display cpu Pll setting */
374 phid1
= mfspr(SPRN_HID1
);
375 seq_printf(m
, "PLL setting\t: 0x%x\n", ((phid1
>> 24) & 0x3f));
380 * Called very early, device-tree isn't unflattened
382 static int __init
mpc85xx_cds_probe(void)
384 return of_machine_is_compatible("MPC85xxCDS");
387 machine_arch_initcall(mpc85xx_cds
, mpc85xx_common_publish_devices
);
389 define_machine(mpc85xx_cds
) {
390 .name
= "MPC85xx CDS",
391 .probe
= mpc85xx_cds_probe
,
392 .setup_arch
= mpc85xx_cds_setup_arch
,
393 .init_IRQ
= mpc85xx_cds_pic_init
,
394 .show_cpuinfo
= mpc85xx_cds_show_cpuinfo
,
395 .get_irq
= mpic_get_irq
,
397 .pcibios_fixup_bus
= mpc85xx_cds_fixup_bus
,
398 .pcibios_fixup_phb
= fsl_pcibios_fixup_phb
,
400 .calibrate_decr
= generic_calibrate_decr
,
401 .progress
= udbg_progress
,