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 */ |