--- trunk/src/devices/dev_openpic.c 2007/10/13 15:05:59 63 +++ trunk/src/devices/dev_openpic.c 2007/10/14 12:03:25 66 @@ -27,7 +27,7 @@ * $Id: dev_openpic.c,v 1.14 2007/09/11 21:42:52 debug Exp $ * * COMMENT: OpenPIC Interrupt controller (used by sandpoint ppc) - * based on dev_openpic.c + * based on dev_gc.c */ #include @@ -82,17 +82,47 @@ INTERRUPT_DEASSERT(d->cpu_irq); } +#define OPENPIC_MASK 0x80000000 +#define OPENPIC_ACTIVITY 0x40000000 /* Read Only */ +#define OPENPIC_PRIORITY_MASK 0x000f0000 +#define OPENPIC_PRIORITY_SHIFT 16 +#define OPENPIC_VECTOR_MASK 0x000000ff + +#define OPENPIC_VEC_TIMER 64 /* and up */ +#define OPENPIC_VEC_IPI 72 /* and up */ +#define OPENPIC_VEC_SPURIOUS 127 DEVICE_ACCESS(openpic) { - struct openpic_data *d = extra; +// struct openpic_data *d = extra; uint64_t idata = 0, odata = 0; if (writeflag == MEM_WRITE) idata = memory_readmax64(cpu, data, len); + uint64_t priority,vector, active; + priority = ( relative_addr & 0xf000 ); + vector = ( relative_addr & 0x00ff ); + active = ( relative_addr & 0x4000 ); + + debug("[ openpic: access at %04x -> priority: %x vector: 0x%02x %d active: %x ]\n", + (int)relative_addr, (int)priority, (int)vector, (int)vector, (int)active ); + switch (relative_addr) { + case 0x00: + if (writeflag == MEM_READ) { + // version 1.2 + odata = 0x02000000; + fatal("[ openpic: read from " + "offset 0x%x (OpenPIC version) = %x]\n", (int) + relative_addr, (int)odata); + } + fatal("[ openpic: unimplemented write to " + "offset 0x%x: data=0x%x (OpenPIC version) ]\n", (int) + relative_addr, (int)idata); + break; + #if 0 #define INT_STATE_REG_H (interrupt_reg + 0x00) #define INT_ENABLE_REG_H (interrupt_reg + 0x04) @@ -104,6 +134,7 @@ #define INT_LEVEL_REG_L (interrupt_reg + 0x1c) #endif +#if 0 case 0x10: if (writeflag == MEM_READ) odata = d->status_hi & d->enable_hi; @@ -190,7 +221,7 @@ case 0x2c: /* Avoid a debug message. */ break; - +#endif default:if (writeflag == MEM_WRITE) { fatal("[ openpic: unimplemented write to " "offset 0x%x: data=0x%x ]\n", (int) @@ -220,12 +251,12 @@ INTERRUPT_CONNECT(devinit->interrupt_path, d->cpu_irq); /* - * Register the 64 Grand Central interrupts (32 lo, 32 hi): + * Register the 126 OpenPIC interrupts */ - for (i=0; i<32; i++) { + for (i=0; i<126; i++) { struct interrupt template; char n[300]; - snprintf(n, sizeof(n), "%s.openpic.lo.%i", + snprintf(n, sizeof(n), "%s.openpic.%i", devinit->interrupt_path, i); memset(&template, 0, sizeof(template)); template.line = 1 << i; @@ -234,16 +265,6 @@ template.interrupt_assert = openpic_lo_interrupt_assert; template.interrupt_deassert = openpic_lo_interrupt_deassert; interrupt_handler_register(&template); - - snprintf(n, sizeof(n), "%s.openpic.hi.%i", - devinit->interrupt_path, i); - memset(&template, 0, sizeof(template)); - template.line = 1 << i; - template.name = n; - template.extra = d; - template.interrupt_assert = openpic_hi_interrupt_assert; - template.interrupt_deassert = openpic_hi_interrupt_deassert; - interrupt_handler_register(&template); } memory_device_register(devinit->machine->memory, "openpic",