Commit 4e290a0b714650097f10f9bfb06ab1ef6173afc1

Authored by j_mayer
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
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 */