Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
awilliam
GitHub Repository: awilliam/linux-vfio
Path: blob/master/arch/powerpc/platforms/embedded6xx/mpc7448_hpc2.c
10819 views
1
/*
2
* mpc7448_hpc2.c
3
*
4
* Board setup routines for the Freescale mpc7448hpc2(taiga) platform
5
*
6
* Author: Jacob Pan
7
* [email protected]
8
* Author: Xianghua Xiao
9
* [email protected]
10
* Maintainer: Roy Zang <[email protected]>
11
* Add Flat Device Tree support fot mpc7448hpc2 board
12
*
13
* Copyright 2004-2006 Freescale Semiconductor, Inc.
14
*
15
* This program is free software; you can redistribute it and/or
16
* modify it under the terms of the GNU General Public License
17
* as published by the Free Software Foundation; either version
18
* 2 of the License, or (at your option) any later version.
19
*/
20
21
#include <linux/stddef.h>
22
#include <linux/kernel.h>
23
#include <linux/pci.h>
24
#include <linux/kdev_t.h>
25
#include <linux/console.h>
26
#include <linux/delay.h>
27
#include <linux/irq.h>
28
#include <linux/seq_file.h>
29
#include <linux/root_dev.h>
30
#include <linux/serial.h>
31
#include <linux/tty.h>
32
#include <linux/serial_core.h>
33
34
#include <asm/system.h>
35
#include <asm/time.h>
36
#include <asm/machdep.h>
37
#include <asm/prom.h>
38
#include <asm/udbg.h>
39
#include <asm/tsi108.h>
40
#include <asm/pci-bridge.h>
41
#include <asm/reg.h>
42
#include <mm/mmu_decl.h>
43
#include <asm/tsi108_pci.h>
44
#include <asm/tsi108_irq.h>
45
#include <asm/mpic.h>
46
47
#undef DEBUG
48
#ifdef DEBUG
49
#define DBG(fmt...) do { printk(fmt); } while(0)
50
#else
51
#define DBG(fmt...) do { } while(0)
52
#endif
53
54
#define MPC7448HPC2_PCI_CFG_PHYS 0xfb000000
55
56
int mpc7448_hpc2_exclude_device(struct pci_controller *hose,
57
u_char bus, u_char devfn)
58
{
59
if (bus == 0 && PCI_SLOT(devfn) == 0)
60
return PCIBIOS_DEVICE_NOT_FOUND;
61
else
62
return PCIBIOS_SUCCESSFUL;
63
}
64
65
static void __init mpc7448_hpc2_setup_arch(void)
66
{
67
struct device_node *np;
68
if (ppc_md.progress)
69
ppc_md.progress("mpc7448_hpc2_setup_arch():set_bridge", 0);
70
71
tsi108_csr_vir_base = get_vir_csrbase();
72
73
/* setup PCI host bridge */
74
#ifdef CONFIG_PCI
75
for_each_compatible_node(np, "pci", "tsi108-pci")
76
tsi108_setup_pci(np, MPC7448HPC2_PCI_CFG_PHYS, 0);
77
78
ppc_md.pci_exclude_device = mpc7448_hpc2_exclude_device;
79
if (ppc_md.progress)
80
ppc_md.progress("tsi108: resources set", 0x100);
81
#endif
82
83
printk(KERN_INFO "MPC7448HPC2 (TAIGA) Platform\n");
84
printk(KERN_INFO
85
"Jointly ported by Freescale and Tundra Semiconductor\n");
86
printk(KERN_INFO
87
"Enabling L2 cache then enabling the HID0 prefetch engine.\n");
88
}
89
90
/*
91
* Interrupt setup and service. Interrupts on the mpc7448_hpc2 come
92
* from the four external INT pins, PCI interrupts are routed via
93
* PCI interrupt control registers, it generates internal IRQ23
94
*
95
* Interrupt routing on the Taiga Board:
96
* TSI108:PB_INT[0] -> CPU0:INT#
97
* TSI108:PB_INT[1] -> CPU0:MCP#
98
* TSI108:PB_INT[2] -> N/C
99
* TSI108:PB_INT[3] -> N/C
100
*/
101
static void __init mpc7448_hpc2_init_IRQ(void)
102
{
103
struct mpic *mpic;
104
phys_addr_t mpic_paddr = 0;
105
struct device_node *tsi_pic;
106
#ifdef CONFIG_PCI
107
unsigned int cascade_pci_irq;
108
struct device_node *tsi_pci;
109
struct device_node *cascade_node = NULL;
110
#endif
111
112
tsi_pic = of_find_node_by_type(NULL, "open-pic");
113
if (tsi_pic) {
114
unsigned int size;
115
const void *prop = of_get_property(tsi_pic, "reg", &size);
116
mpic_paddr = of_translate_address(tsi_pic, prop);
117
}
118
119
if (mpic_paddr == 0) {
120
printk("%s: No tsi108 PIC found !\n", __func__);
121
return;
122
}
123
124
DBG("%s: tsi108 pic phys_addr = 0x%x\n", __func__,
125
(u32) mpic_paddr);
126
127
mpic = mpic_alloc(tsi_pic, mpic_paddr,
128
MPIC_PRIMARY | MPIC_BIG_ENDIAN | MPIC_WANTS_RESET |
129
MPIC_SPV_EOI | MPIC_NO_PTHROU_DIS | MPIC_REGSET_TSI108,
130
24,
131
NR_IRQS-4, /* num_sources used */
132
"Tsi108_PIC");
133
134
BUG_ON(mpic == NULL);
135
136
mpic_assign_isu(mpic, 0, mpic_paddr + 0x100);
137
138
mpic_init(mpic);
139
140
#ifdef CONFIG_PCI
141
tsi_pci = of_find_node_by_type(NULL, "pci");
142
if (tsi_pci == NULL) {
143
printk("%s: No tsi108 pci node found !\n", __func__);
144
return;
145
}
146
cascade_node = of_find_node_by_type(NULL, "pic-router");
147
if (cascade_node == NULL) {
148
printk("%s: No tsi108 pci cascade node found !\n", __func__);
149
return;
150
}
151
152
cascade_pci_irq = irq_of_parse_and_map(tsi_pci, 0);
153
DBG("%s: tsi108 cascade_pci_irq = 0x%x\n", __func__,
154
(u32) cascade_pci_irq);
155
tsi108_pci_int_init(cascade_node);
156
irq_set_handler_data(cascade_pci_irq, mpic);
157
irq_set_chained_handler(cascade_pci_irq, tsi108_irq_cascade);
158
#endif
159
/* Configure MPIC outputs to CPU0 */
160
tsi108_write_reg(TSI108_MPIC_OFFSET + 0x30c, 0);
161
of_node_put(tsi_pic);
162
}
163
164
void mpc7448_hpc2_show_cpuinfo(struct seq_file *m)
165
{
166
seq_printf(m, "vendor\t\t: Freescale Semiconductor\n");
167
}
168
169
void mpc7448_hpc2_restart(char *cmd)
170
{
171
local_irq_disable();
172
173
/* Set exception prefix high - to the firmware */
174
_nmask_and_or_msr(0, MSR_IP);
175
176
for (;;) ; /* Spin until reset happens */
177
}
178
179
void mpc7448_hpc2_power_off(void)
180
{
181
local_irq_disable();
182
for (;;) ; /* No way to shut power off with software */
183
}
184
185
void mpc7448_hpc2_halt(void)
186
{
187
mpc7448_hpc2_power_off();
188
}
189
190
/*
191
* Called very early, device-tree isn't unflattened
192
*/
193
static int __init mpc7448_hpc2_probe(void)
194
{
195
unsigned long root = of_get_flat_dt_root();
196
197
if (!of_flat_dt_is_compatible(root, "mpc74xx"))
198
return 0;
199
return 1;
200
}
201
202
static int mpc7448_machine_check_exception(struct pt_regs *regs)
203
{
204
const struct exception_table_entry *entry;
205
206
/* Are we prepared to handle this fault */
207
if ((entry = search_exception_tables(regs->nip)) != NULL) {
208
tsi108_clear_pci_cfg_error();
209
regs->msr |= MSR_RI;
210
regs->nip = entry->fixup;
211
return 1;
212
}
213
return 0;
214
}
215
216
define_machine(mpc7448_hpc2){
217
.name = "MPC7448 HPC2",
218
.probe = mpc7448_hpc2_probe,
219
.setup_arch = mpc7448_hpc2_setup_arch,
220
.init_IRQ = mpc7448_hpc2_init_IRQ,
221
.show_cpuinfo = mpc7448_hpc2_show_cpuinfo,
222
.get_irq = mpic_get_irq,
223
.restart = mpc7448_hpc2_restart,
224
.calibrate_decr = generic_calibrate_decr,
225
.machine_check_exception= mpc7448_machine_check_exception,
226
.progress = udbg_progress,
227
};
228
229