diff options
author | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-21 18:50:49 -0400 |
---|---|---|
committer | Linus Torvalds <torvalds@linux-foundation.org> | 2008-04-21 18:50:49 -0400 |
commit | 9a64388d83f6ef08dfff405a9d122e3dbcb6bf38 (patch) | |
tree | a77532ce4d6d56be6c6c7f405cd901a0184250fb /arch/powerpc/platforms/pseries/setup.c | |
parent | e80ab411e589e00550e2e6e5a6a02d59cc730357 (diff) | |
parent | 14b3ca4022f050f8622ed282b734ddf445464583 (diff) |
Merge branch 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc
* 'master' of git://git.kernel.org/pub/scm/linux/kernel/git/paulus/powerpc: (202 commits)
[POWERPC] Fix compile breakage for 64-bit UP configs
[POWERPC] Define copy_siginfo_from_user32
[POWERPC] Add compat handler for PTRACE_GETSIGINFO
[POWERPC] i2c: Fix build breakage introduced by OF helpers
[POWERPC] Optimize fls64() on 64-bit processors
[POWERPC] irqtrace support for 64-bit powerpc
[POWERPC] Stacktrace support for lockdep
[POWERPC] Move stackframe definitions to common header
[POWERPC] Fix device-tree locking vs. interrupts
[POWERPC] Make pci_bus_to_host()'s struct pci_bus * argument const
[POWERPC] Remove unused __max_memory variable
[POWERPC] Simplify xics direct/lpar irq_host setup
[POWERPC] Use pseries_setup_i8259_cascade() in pseries_mpic_init_IRQ()
[POWERPC] Turn xics_setup_8259_cascade() into a generic pseries_setup_i8259_cascade()
[POWERPC] Move xics_setup_8259_cascade() into platforms/pseries/setup.c
[POWERPC] Use asm-generic/bitops/find.h in bitops.h
[POWERPC] 83xx: mpc8315 - fix USB UTMI Host setup
[POWERPC] 85xx: Fix the size of qe muram for MPC8568E
[POWERPC] 86xx: mpc86xx_hpcn - Temporarily accept old dts node identifier.
[POWERPC] 86xx: mark functions static, other minor cleanups
...
Diffstat (limited to 'arch/powerpc/platforms/pseries/setup.c')
-rw-r--r-- | arch/powerpc/platforms/pseries/setup.c | 105 |
1 files changed, 61 insertions, 44 deletions
diff --git a/arch/powerpc/platforms/pseries/setup.c b/arch/powerpc/platforms/pseries/setup.c index fdb9b1c8f977..f66aa9c3b135 100644 --- a/arch/powerpc/platforms/pseries/setup.c +++ b/arch/powerpc/platforms/pseries/setup.c | |||
@@ -76,9 +76,6 @@ | |||
76 | #define DBG(fmt...) | 76 | #define DBG(fmt...) |
77 | #endif | 77 | #endif |
78 | 78 | ||
79 | /* move those away to a .h */ | ||
80 | extern void find_udbg_vterm(void); | ||
81 | |||
82 | int fwnmi_active; /* TRUE if an FWNMI handler is present */ | 79 | int fwnmi_active; /* TRUE if an FWNMI handler is present */ |
83 | 80 | ||
84 | static void pseries_shared_idle_sleep(void); | 81 | static void pseries_shared_idle_sleep(void); |
@@ -127,14 +124,60 @@ void pseries_8259_cascade(unsigned int irq, struct irq_desc *desc) | |||
127 | desc->chip->eoi(irq); | 124 | desc->chip->eoi(irq); |
128 | } | 125 | } |
129 | 126 | ||
130 | static void __init pseries_mpic_init_IRQ(void) | 127 | static void __init pseries_setup_i8259_cascade(void) |
131 | { | 128 | { |
132 | struct device_node *np, *old, *cascade = NULL; | 129 | struct device_node *np, *old, *found = NULL; |
133 | const unsigned int *addrp; | 130 | unsigned int cascade; |
131 | const u32 *addrp; | ||
134 | unsigned long intack = 0; | 132 | unsigned long intack = 0; |
133 | int naddr; | ||
134 | |||
135 | for_each_node_by_type(np, "interrupt-controller") { | ||
136 | if (of_device_is_compatible(np, "chrp,iic")) { | ||
137 | found = np; | ||
138 | break; | ||
139 | } | ||
140 | } | ||
141 | |||
142 | if (found == NULL) { | ||
143 | printk(KERN_DEBUG "pic: no ISA interrupt controller\n"); | ||
144 | return; | ||
145 | } | ||
146 | |||
147 | cascade = irq_of_parse_and_map(found, 0); | ||
148 | if (cascade == NO_IRQ) { | ||
149 | printk(KERN_ERR "pic: failed to map cascade interrupt"); | ||
150 | return; | ||
151 | } | ||
152 | pr_debug("pic: cascade mapped to irq %d\n", cascade); | ||
153 | |||
154 | for (old = of_node_get(found); old != NULL ; old = np) { | ||
155 | np = of_get_parent(old); | ||
156 | of_node_put(old); | ||
157 | if (np == NULL) | ||
158 | break; | ||
159 | if (strcmp(np->name, "pci") != 0) | ||
160 | continue; | ||
161 | addrp = of_get_property(np, "8259-interrupt-acknowledge", NULL); | ||
162 | if (addrp == NULL) | ||
163 | continue; | ||
164 | naddr = of_n_addr_cells(np); | ||
165 | intack = addrp[naddr-1]; | ||
166 | if (naddr > 1) | ||
167 | intack |= ((unsigned long)addrp[naddr-2]) << 32; | ||
168 | } | ||
169 | if (intack) | ||
170 | printk(KERN_DEBUG "pic: PCI 8259 intack at 0x%016lx\n", intack); | ||
171 | i8259_init(found, intack); | ||
172 | of_node_put(found); | ||
173 | set_irq_chained_handler(cascade, pseries_8259_cascade); | ||
174 | } | ||
175 | |||
176 | static void __init pseries_mpic_init_IRQ(void) | ||
177 | { | ||
178 | struct device_node *np; | ||
135 | const unsigned int *opprop; | 179 | const unsigned int *opprop; |
136 | unsigned long openpic_addr = 0; | 180 | unsigned long openpic_addr = 0; |
137 | unsigned int cascade_irq; | ||
138 | int naddr, n, i, opplen; | 181 | int naddr, n, i, opplen; |
139 | struct mpic *mpic; | 182 | struct mpic *mpic; |
140 | 183 | ||
@@ -167,43 +210,13 @@ static void __init pseries_mpic_init_IRQ(void) | |||
167 | mpic_init(mpic); | 210 | mpic_init(mpic); |
168 | 211 | ||
169 | /* Look for cascade */ | 212 | /* Look for cascade */ |
170 | for_each_node_by_type(np, "interrupt-controller") | 213 | pseries_setup_i8259_cascade(); |
171 | if (of_device_is_compatible(np, "chrp,iic")) { | 214 | } |
172 | cascade = np; | ||
173 | break; | ||
174 | } | ||
175 | if (cascade == NULL) | ||
176 | return; | ||
177 | |||
178 | cascade_irq = irq_of_parse_and_map(cascade, 0); | ||
179 | if (cascade_irq == NO_IRQ) { | ||
180 | printk(KERN_ERR "mpic: failed to map cascade interrupt"); | ||
181 | return; | ||
182 | } | ||
183 | 215 | ||
184 | /* Check ACK type */ | 216 | static void __init pseries_xics_init_IRQ(void) |
185 | for (old = of_node_get(cascade); old != NULL ; old = np) { | 217 | { |
186 | np = of_get_parent(old); | 218 | xics_init_IRQ(); |
187 | of_node_put(old); | 219 | pseries_setup_i8259_cascade(); |
188 | if (np == NULL) | ||
189 | break; | ||
190 | if (strcmp(np->name, "pci") != 0) | ||
191 | continue; | ||
192 | addrp = of_get_property(np, "8259-interrupt-acknowledge", | ||
193 | NULL); | ||
194 | if (addrp == NULL) | ||
195 | continue; | ||
196 | naddr = of_n_addr_cells(np); | ||
197 | intack = addrp[naddr-1]; | ||
198 | if (naddr > 1) | ||
199 | intack |= ((unsigned long)addrp[naddr-2]) << 32; | ||
200 | } | ||
201 | if (intack) | ||
202 | printk(KERN_DEBUG "mpic: PCI 8259 intack at 0x%016lx\n", | ||
203 | intack); | ||
204 | i8259_init(cascade, intack); | ||
205 | of_node_put(cascade); | ||
206 | set_irq_chained_handler(cascade_irq, pseries_8259_cascade); | ||
207 | } | 220 | } |
208 | 221 | ||
209 | static void pseries_lpar_enable_pmcs(void) | 222 | static void pseries_lpar_enable_pmcs(void) |
@@ -235,7 +248,7 @@ static void __init pseries_discover_pic(void) | |||
235 | smp_init_pseries_mpic(); | 248 | smp_init_pseries_mpic(); |
236 | return; | 249 | return; |
237 | } else if (strstr(typep, "ppc-xicp")) { | 250 | } else if (strstr(typep, "ppc-xicp")) { |
238 | ppc_md.init_IRQ = xics_init_IRQ; | 251 | ppc_md.init_IRQ = pseries_xics_init_IRQ; |
239 | setup_kexec_cpu_down_xics(); | 252 | setup_kexec_cpu_down_xics(); |
240 | smp_init_pseries_xics(); | 253 | smp_init_pseries_xics(); |
241 | return; | 254 | return; |
@@ -393,6 +406,7 @@ static void pseries_dedicated_idle_sleep(void) | |||
393 | { | 406 | { |
394 | unsigned int cpu = smp_processor_id(); | 407 | unsigned int cpu = smp_processor_id(); |
395 | unsigned long start_snooze; | 408 | unsigned long start_snooze; |
409 | unsigned long in_purr, out_purr; | ||
396 | 410 | ||
397 | /* | 411 | /* |
398 | * Indicate to the HV that we are idle. Now would be | 412 | * Indicate to the HV that we are idle. Now would be |
@@ -400,6 +414,7 @@ static void pseries_dedicated_idle_sleep(void) | |||
400 | */ | 414 | */ |
401 | get_lppaca()->idle = 1; | 415 | get_lppaca()->idle = 1; |
402 | get_lppaca()->donate_dedicated_cpu = 1; | 416 | get_lppaca()->donate_dedicated_cpu = 1; |
417 | in_purr = mfspr(SPRN_PURR); | ||
403 | 418 | ||
404 | /* | 419 | /* |
405 | * We come in with interrupts disabled, and need_resched() | 420 | * We come in with interrupts disabled, and need_resched() |
@@ -432,6 +447,8 @@ static void pseries_dedicated_idle_sleep(void) | |||
432 | 447 | ||
433 | out: | 448 | out: |
434 | HMT_medium(); | 449 | HMT_medium(); |
450 | out_purr = mfspr(SPRN_PURR); | ||
451 | get_lppaca()->wait_state_cycles += out_purr - in_purr; | ||
435 | get_lppaca()->donate_dedicated_cpu = 0; | 452 | get_lppaca()->donate_dedicated_cpu = 0; |
436 | get_lppaca()->idle = 0; | 453 | get_lppaca()->idle = 0; |
437 | } | 454 | } |