Commit 4e290a0b714650097f10f9bfb06ab1ef6173afc1
1 parent
3391c818
Share input pins and internal interrupt controller between all PowerPC 40x.
Fix critical input interrupt generation. git-svn-id: svn://svn.savannah.nongnu.org/qemu/trunk@3299 c046a42c-6fe2-441c-8c8c-71466251a162
Showing
3 changed files
with
41 additions
and
39 deletions
hw/ppc.c
@@ -284,8 +284,8 @@ void ppc970_irq_init (CPUState *env) | @@ -284,8 +284,8 @@ void ppc970_irq_init (CPUState *env) | ||
284 | env->irq_inputs = (void **)qemu_allocate_irqs(&ppc970_set_irq, env, 7); | 284 | env->irq_inputs = (void **)qemu_allocate_irqs(&ppc970_set_irq, env, 7); |
285 | } | 285 | } |
286 | 286 | ||
287 | -/* PowerPC 405 internal IRQ controller */ | ||
288 | -static void ppc405_set_irq (void *opaque, int pin, int level) | 287 | +/* PowerPC 40x internal IRQ controller */ |
288 | +static void ppc40x_set_irq (void *opaque, int pin, int level) | ||
289 | { | 289 | { |
290 | CPUState *env = opaque; | 290 | CPUState *env = opaque; |
291 | int cur_level; | 291 | int cur_level; |
@@ -300,7 +300,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -300,7 +300,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
300 | /* Don't generate spurious events */ | 300 | /* Don't generate spurious events */ |
301 | if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) { | 301 | if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) { |
302 | switch (pin) { | 302 | switch (pin) { |
303 | - case PPC405_INPUT_RESET_SYS: | 303 | + case PPC40x_INPUT_RESET_SYS: |
304 | if (level) { | 304 | if (level) { |
305 | #if defined(PPC_DEBUG_IRQ) | 305 | #if defined(PPC_DEBUG_IRQ) |
306 | if (loglevel & CPU_LOG_INT) { | 306 | if (loglevel & CPU_LOG_INT) { |
@@ -311,7 +311,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -311,7 +311,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
311 | ppc40x_system_reset(env); | 311 | ppc40x_system_reset(env); |
312 | } | 312 | } |
313 | break; | 313 | break; |
314 | - case PPC405_INPUT_RESET_CHIP: | 314 | + case PPC40x_INPUT_RESET_CHIP: |
315 | if (level) { | 315 | if (level) { |
316 | #if defined(PPC_DEBUG_IRQ) | 316 | #if defined(PPC_DEBUG_IRQ) |
317 | if (loglevel & CPU_LOG_INT) { | 317 | if (loglevel & CPU_LOG_INT) { |
@@ -321,8 +321,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -321,8 +321,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
321 | ppc40x_chip_reset(env); | 321 | ppc40x_chip_reset(env); |
322 | } | 322 | } |
323 | break; | 323 | break; |
324 | - /* No break here */ | ||
325 | - case PPC405_INPUT_RESET_CORE: | 324 | + case PPC40x_INPUT_RESET_CORE: |
326 | /* XXX: TODO: update DBSR[MRR] */ | 325 | /* XXX: TODO: update DBSR[MRR] */ |
327 | if (level) { | 326 | if (level) { |
328 | #if defined(PPC_DEBUG_IRQ) | 327 | #if defined(PPC_DEBUG_IRQ) |
@@ -333,7 +332,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -333,7 +332,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
333 | ppc40x_core_reset(env); | 332 | ppc40x_core_reset(env); |
334 | } | 333 | } |
335 | break; | 334 | break; |
336 | - case PPC405_INPUT_CINT: | 335 | + case PPC40x_INPUT_CINT: |
337 | /* Level sensitive - active high */ | 336 | /* Level sensitive - active high */ |
338 | #if defined(PPC_DEBUG_IRQ) | 337 | #if defined(PPC_DEBUG_IRQ) |
339 | if (loglevel & CPU_LOG_INT) { | 338 | if (loglevel & CPU_LOG_INT) { |
@@ -341,10 +340,9 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -341,10 +340,9 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
341 | __func__, level); | 340 | __func__, level); |
342 | } | 341 | } |
343 | #endif | 342 | #endif |
344 | - /* XXX: TOFIX */ | ||
345 | - ppc_set_irq(env, PPC_INTERRUPT_RESET, level); | 343 | + ppc_set_irq(env, PPC_INTERRUPT_CEXT, level); |
346 | break; | 344 | break; |
347 | - case PPC405_INPUT_INT: | 345 | + case PPC40x_INPUT_INT: |
348 | /* Level sensitive - active high */ | 346 | /* Level sensitive - active high */ |
349 | #if defined(PPC_DEBUG_IRQ) | 347 | #if defined(PPC_DEBUG_IRQ) |
350 | if (loglevel & CPU_LOG_INT) { | 348 | if (loglevel & CPU_LOG_INT) { |
@@ -354,7 +352,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -354,7 +352,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
354 | #endif | 352 | #endif |
355 | ppc_set_irq(env, PPC_INTERRUPT_EXT, level); | 353 | ppc_set_irq(env, PPC_INTERRUPT_EXT, level); |
356 | break; | 354 | break; |
357 | - case PPC405_INPUT_HALT: | 355 | + case PPC40x_INPUT_HALT: |
358 | /* Level sensitive - active low */ | 356 | /* Level sensitive - active low */ |
359 | if (level) { | 357 | if (level) { |
360 | #if defined(PPC_DEBUG_IRQ) | 358 | #if defined(PPC_DEBUG_IRQ) |
@@ -372,7 +370,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -372,7 +370,7 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
372 | env->halted = 0; | 370 | env->halted = 0; |
373 | } | 371 | } |
374 | break; | 372 | break; |
375 | - case PPC405_INPUT_DEBUG: | 373 | + case PPC40x_INPUT_DEBUG: |
376 | /* Level sensitive - active high */ | 374 | /* Level sensitive - active high */ |
377 | #if defined(PPC_DEBUG_IRQ) | 375 | #if defined(PPC_DEBUG_IRQ) |
378 | if (loglevel & CPU_LOG_INT) { | 376 | if (loglevel & CPU_LOG_INT) { |
@@ -398,9 +396,10 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | @@ -398,9 +396,10 @@ static void ppc405_set_irq (void *opaque, int pin, int level) | ||
398 | } | 396 | } |
399 | } | 397 | } |
400 | 398 | ||
401 | -void ppc405_irq_init (CPUState *env) | 399 | +void ppc40x_irq_init (CPUState *env) |
402 | { | 400 | { |
403 | - env->irq_inputs = (void **)qemu_allocate_irqs(&ppc405_set_irq, env, 7); | 401 | + env->irq_inputs = (void **)qemu_allocate_irqs(&ppc40x_set_irq, |
402 | + env, PPC40x_INPUT_NB); | ||
404 | } | 403 | } |
405 | 404 | ||
406 | /*****************************************************************************/ | 405 | /*****************************************************************************/ |
target-ppc/cpu.h
@@ -1117,23 +1117,15 @@ enum { | @@ -1117,23 +1117,15 @@ enum { | ||
1117 | }; | 1117 | }; |
1118 | 1118 | ||
1119 | enum { | 1119 | enum { |
1120 | - /* PowerPC 401/403 input pins */ | ||
1121 | - PPC401_INPUT_RESET = 0, | ||
1122 | - PPC401_INPUT_CINT = 1, | ||
1123 | - PPC401_INPUT_INT = 2, | ||
1124 | - PPC401_INPUT_BERR = 3, | ||
1125 | - PPC401_INPUT_HALT = 4, | ||
1126 | -}; | ||
1127 | - | ||
1128 | -enum { | ||
1129 | - /* PowerPC 405 input pins */ | ||
1130 | - PPC405_INPUT_RESET_CORE = 0, | ||
1131 | - PPC405_INPUT_RESET_CHIP = 1, | ||
1132 | - PPC405_INPUT_RESET_SYS = 2, | ||
1133 | - PPC405_INPUT_CINT = 3, | ||
1134 | - PPC405_INPUT_INT = 4, | ||
1135 | - PPC405_INPUT_HALT = 5, | ||
1136 | - PPC405_INPUT_DEBUG = 6, | 1120 | + /* PowerPC 40x input pins */ |
1121 | + PPC40x_INPUT_RESET_CORE = 0, | ||
1122 | + PPC40x_INPUT_RESET_CHIP = 1, | ||
1123 | + PPC40x_INPUT_RESET_SYS = 2, | ||
1124 | + PPC40x_INPUT_CINT = 3, | ||
1125 | + PPC40x_INPUT_INT = 4, | ||
1126 | + PPC40x_INPUT_HALT = 5, | ||
1127 | + PPC40x_INPUT_DEBUG = 6, | ||
1128 | + PPC40x_INPUT_NB, | ||
1137 | }; | 1129 | }; |
1138 | 1130 | ||
1139 | enum { | 1131 | enum { |
target-ppc/translate_init.c
@@ -54,8 +54,7 @@ static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \ | @@ -54,8 +54,7 @@ static inline void glue(glue(ppc, name),_irq_init) (CPUPPCState *env) \ | ||
54 | void glue(glue(ppc, name),_irq_init) (CPUPPCState *env); | 54 | void glue(glue(ppc, name),_irq_init) (CPUPPCState *env); |
55 | #endif | 55 | #endif |
56 | 56 | ||
57 | -PPC_IRQ_INIT_FN(401); | ||
58 | -PPC_IRQ_INIT_FN(405); | 57 | +PPC_IRQ_INIT_FN(40x); |
59 | PPC_IRQ_INIT_FN(6xx); | 58 | PPC_IRQ_INIT_FN(6xx); |
60 | PPC_IRQ_INIT_FN(970); | 59 | PPC_IRQ_INIT_FN(970); |
61 | 60 | ||
@@ -2482,7 +2481,8 @@ static void init_proc_401 (CPUPPCState *env) | @@ -2482,7 +2481,8 @@ static void init_proc_401 (CPUPPCState *env) | ||
2482 | &spr_read_generic, &spr_write_generic, | 2481 | &spr_read_generic, &spr_write_generic, |
2483 | 0x00000000); | 2482 | 0x00000000); |
2484 | init_excp_4xx_real(env); | 2483 | init_excp_4xx_real(env); |
2485 | - /* XXX: TODO: allocate internal IRQ controller */ | 2484 | + /* Allocate hardware IRQ controller */ |
2485 | + ppc40x_irq_init(env); | ||
2486 | } | 2486 | } |
2487 | 2487 | ||
2488 | /* PowerPC 401x2 */ | 2488 | /* PowerPC 401x2 */ |
@@ -2518,7 +2518,8 @@ static void init_proc_401x2 (CPUPPCState *env) | @@ -2518,7 +2518,8 @@ static void init_proc_401x2 (CPUPPCState *env) | ||
2518 | env->nb_ways = 1; | 2518 | env->nb_ways = 1; |
2519 | env->id_tlbs = 0; | 2519 | env->id_tlbs = 0; |
2520 | init_excp_4xx_softmmu(env); | 2520 | init_excp_4xx_softmmu(env); |
2521 | - /* XXX: TODO: allocate internal IRQ controller */ | 2521 | + /* Allocate hardware IRQ controller */ |
2522 | + ppc40x_irq_init(env); | ||
2522 | } | 2523 | } |
2523 | 2524 | ||
2524 | /* PowerPC 401x3 */ | 2525 | /* PowerPC 401x3 */ |
@@ -2536,7 +2537,14 @@ static void init_proc_401x2 (CPUPPCState *env) | @@ -2536,7 +2537,14 @@ static void init_proc_401x2 (CPUPPCState *env) | ||
2536 | 2537 | ||
2537 | static void init_proc_401x3 (CPUPPCState *env) | 2538 | static void init_proc_401x3 (CPUPPCState *env) |
2538 | { | 2539 | { |
2540 | + gen_spr_40x(env); | ||
2541 | + gen_spr_401_403(env); | ||
2542 | + gen_spr_401(env); | ||
2543 | + gen_spr_401x2(env); | ||
2544 | + gen_spr_compress(env); | ||
2539 | init_excp_4xx_softmmu(env); | 2545 | init_excp_4xx_softmmu(env); |
2546 | + /* Allocate hardware IRQ controller */ | ||
2547 | + ppc40x_irq_init(env); | ||
2540 | } | 2548 | } |
2541 | #endif /* TODO */ | 2549 | #endif /* TODO */ |
2542 | 2550 | ||
@@ -2573,7 +2581,8 @@ static void init_proc_IOP480 (CPUPPCState *env) | @@ -2573,7 +2581,8 @@ static void init_proc_IOP480 (CPUPPCState *env) | ||
2573 | env->nb_ways = 1; | 2581 | env->nb_ways = 1; |
2574 | env->id_tlbs = 0; | 2582 | env->id_tlbs = 0; |
2575 | init_excp_4xx_softmmu(env); | 2583 | init_excp_4xx_softmmu(env); |
2576 | - /* XXX: TODO: allocate internal IRQ controller */ | 2584 | + /* Allocate hardware IRQ controller */ |
2585 | + ppc40x_irq_init(env); | ||
2577 | } | 2586 | } |
2578 | 2587 | ||
2579 | /* PowerPC 403 */ | 2588 | /* PowerPC 403 */ |
@@ -2594,7 +2603,8 @@ static void init_proc_403 (CPUPPCState *env) | @@ -2594,7 +2603,8 @@ static void init_proc_403 (CPUPPCState *env) | ||
2594 | gen_spr_403(env); | 2603 | gen_spr_403(env); |
2595 | gen_spr_403_real(env); | 2604 | gen_spr_403_real(env); |
2596 | init_excp_4xx_real(env); | 2605 | init_excp_4xx_real(env); |
2597 | - /* XXX: TODO: allocate internal IRQ controller */ | 2606 | + /* Allocate hardware IRQ controller */ |
2607 | + ppc40x_irq_init(env); | ||
2598 | } | 2608 | } |
2599 | 2609 | ||
2600 | /* PowerPC 403 GCX */ | 2610 | /* PowerPC 403 GCX */ |
@@ -2630,7 +2640,8 @@ static void init_proc_403GCX (CPUPPCState *env) | @@ -2630,7 +2640,8 @@ static void init_proc_403GCX (CPUPPCState *env) | ||
2630 | env->nb_ways = 1; | 2640 | env->nb_ways = 1; |
2631 | env->id_tlbs = 0; | 2641 | env->id_tlbs = 0; |
2632 | init_excp_4xx_softmmu(env); | 2642 | init_excp_4xx_softmmu(env); |
2633 | - /* XXX: TODO: allocate internal IRQ controller */ | 2643 | + /* Allocate hardware IRQ controller */ |
2644 | + ppc40x_irq_init(env); | ||
2634 | } | 2645 | } |
2635 | 2646 | ||
2636 | /* PowerPC 405 */ | 2647 | /* PowerPC 405 */ |
@@ -2667,7 +2678,7 @@ static void init_proc_405 (CPUPPCState *env) | @@ -2667,7 +2678,7 @@ static void init_proc_405 (CPUPPCState *env) | ||
2667 | env->id_tlbs = 0; | 2678 | env->id_tlbs = 0; |
2668 | init_excp_4xx_softmmu(env); | 2679 | init_excp_4xx_softmmu(env); |
2669 | /* Allocate hardware IRQ controller */ | 2680 | /* Allocate hardware IRQ controller */ |
2670 | - ppc405_irq_init(env); | 2681 | + ppc40x_irq_init(env); |
2671 | } | 2682 | } |
2672 | 2683 | ||
2673 | /* PowerPC 440 EP */ | 2684 | /* PowerPC 440 EP */ |