Revision 9fdc60bf
b/hw/ppc.c | ||
---|---|---|
314 | 314 |
env, PPC40x_INPUT_NB); |
315 | 315 |
} |
316 | 316 |
|
317 |
/* PowerPC E500 internal IRQ controller */ |
|
318 |
static void ppce500_set_irq (void *opaque, int pin, int level) |
|
319 |
{ |
|
320 |
CPUState *env = opaque; |
|
321 |
int cur_level; |
|
322 |
|
|
323 |
LOG_IRQ("%s: env %p pin %d level %d\n", __func__, |
|
324 |
env, pin, level); |
|
325 |
cur_level = (env->irq_input_state >> pin) & 1; |
|
326 |
/* Don't generate spurious events */ |
|
327 |
if ((cur_level == 1 && level == 0) || (cur_level == 0 && level != 0)) { |
|
328 |
switch (pin) { |
|
329 |
case PPCE500_INPUT_MCK: |
|
330 |
if (level) { |
|
331 |
LOG_IRQ("%s: reset the PowerPC system\n", |
|
332 |
__func__); |
|
333 |
qemu_system_reset_request(); |
|
334 |
} |
|
335 |
break; |
|
336 |
case PPCE500_INPUT_RESET_CORE: |
|
337 |
if (level) { |
|
338 |
LOG_IRQ("%s: reset the PowerPC core\n", __func__); |
|
339 |
ppc_set_irq(env, PPC_INTERRUPT_MCK, level); |
|
340 |
} |
|
341 |
break; |
|
342 |
case PPCE500_INPUT_CINT: |
|
343 |
/* Level sensitive - active high */ |
|
344 |
LOG_IRQ("%s: set the critical IRQ state to %d\n", |
|
345 |
__func__, level); |
|
346 |
ppc_set_irq(env, PPC_INTERRUPT_CEXT, level); |
|
347 |
break; |
|
348 |
case PPCE500_INPUT_INT: |
|
349 |
/* Level sensitive - active high */ |
|
350 |
LOG_IRQ("%s: set the core IRQ state to %d\n", |
|
351 |
__func__, level); |
|
352 |
ppc_set_irq(env, PPC_INTERRUPT_EXT, level); |
|
353 |
break; |
|
354 |
case PPCE500_INPUT_DEBUG: |
|
355 |
/* Level sensitive - active high */ |
|
356 |
LOG_IRQ("%s: set the debug pin state to %d\n", |
|
357 |
__func__, level); |
|
358 |
ppc_set_irq(env, PPC_INTERRUPT_DEBUG, level); |
|
359 |
break; |
|
360 |
default: |
|
361 |
/* Unknown pin - do nothing */ |
|
362 |
LOG_IRQ("%s: unknown IRQ pin %d\n", __func__, pin); |
|
363 |
return; |
|
364 |
} |
|
365 |
if (level) |
|
366 |
env->irq_input_state |= 1 << pin; |
|
367 |
else |
|
368 |
env->irq_input_state &= ~(1 << pin); |
|
369 |
} |
|
370 |
} |
|
371 |
|
|
372 |
void ppce500_irq_init (CPUState *env) |
|
373 |
{ |
|
374 |
env->irq_inputs = (void **)qemu_allocate_irqs(&ppce500_set_irq, |
|
375 |
env, PPCE500_INPUT_NB); |
|
376 |
} |
|
317 | 377 |
/*****************************************************************************/ |
318 | 378 |
/* PowerPC time base and decrementer emulation */ |
319 | 379 |
struct ppc_tb_t { |
b/hw/ppc.h | ||
---|---|---|
31 | 31 |
void PPC_debug_write (void *opaque, uint32_t addr, uint32_t val); |
32 | 32 |
|
33 | 33 |
void ppc40x_irq_init (CPUState *env); |
34 |
void ppce500_irq_init (CPUState *env); |
|
34 | 35 |
void ppc6xx_irq_init (CPUState *env); |
35 | 36 |
void ppc970_irq_init (CPUState *env); |
36 | 37 |
|
b/target-ppc/cpu.h | ||
---|---|---|
1356 | 1356 |
}; |
1357 | 1357 |
|
1358 | 1358 |
enum { |
1359 |
/* PowerPC E500 input pins */ |
|
1360 |
PPCE500_INPUT_RESET_CORE = 0, |
|
1361 |
PPCE500_INPUT_MCK = 1, |
|
1362 |
PPCE500_INPUT_CINT = 3, |
|
1363 |
PPCE500_INPUT_INT = 4, |
|
1364 |
PPCE500_INPUT_DEBUG = 6, |
|
1365 |
PPCE500_INPUT_NB, |
|
1366 |
}; |
|
1367 |
|
|
1368 |
enum { |
|
1359 | 1369 |
/* PowerPC 40x input pins */ |
1360 | 1370 |
PPC40x_INPUT_RESET_CORE = 0, |
1361 | 1371 |
PPC40x_INPUT_RESET_CHIP = 1, |
b/target-ppc/translate_init.c | ||
---|---|---|
63 | 63 |
PPC_IRQ_INIT_FN(40x); |
64 | 64 |
PPC_IRQ_INIT_FN(6xx); |
65 | 65 |
PPC_IRQ_INIT_FN(970); |
66 |
PPC_IRQ_INIT_FN(e500); |
|
66 | 67 |
|
67 | 68 |
/* Generic callbacks: |
68 | 69 |
* do nothing but store/retrieve spr value |
... | ... | |
4198 | 4199 |
#define check_pow_e500v2 check_pow_hid0 |
4199 | 4200 |
#define init_proc_e500v2 init_proc_e500 |
4200 | 4201 |
|
4201 |
__attribute__ (( unused )) |
|
4202 | 4202 |
static void init_proc_e500 (CPUPPCState *env) |
4203 | 4203 |
{ |
4204 | 4204 |
/* Time base */ |
... | ... | |
4300 | 4300 |
init_excp_e200(env); |
4301 | 4301 |
env->dcache_line_size = 32; |
4302 | 4302 |
env->icache_line_size = 32; |
4303 |
/* XXX: TODO: allocate internal IRQ controller */ |
|
4303 |
/* Allocate hardware IRQ controller */ |
|
4304 |
ppce500_irq_init(env); |
|
4304 | 4305 |
} |
4305 | 4306 |
|
4306 | 4307 |
/* Non-embedded PowerPC */ |
Also available in: Unified diff