Commit 73cfd29fb34568f926386c2f43811362f2c22154
1 parent
df84e4f3
ETRAX: Simplify PIC interface.
Instead of exporting a custom structure to represent different interrupt types, just export the irq array and have the top elements point to the NMI lines. Signed-off-by: Edgar E. Iglesias <edgar.iglesias@gmail.com>
Showing
4 changed files
with
36 additions
and
48 deletions
hw/axis_dev88.c
| ... | ... | @@ -257,7 +257,7 @@ void axisdev88_init (ram_addr_t ram_size, |
| 257 | 257 | const char *initrd_filename, const char *cpu_model) |
| 258 | 258 | { |
| 259 | 259 | CPUState *env; |
| 260 | - struct etraxfs_pic *pic; | |
| 260 | + qemu_irq *irq, *nmi; | |
| 261 | 261 | void *etraxfs_dmac; |
| 262 | 262 | struct etraxfs_dma_client *eth[2] = {NULL, NULL}; |
| 263 | 263 | int kernel_size; |
| ... | ... | @@ -295,18 +295,20 @@ void axisdev88_init (ram_addr_t ram_size, |
| 295 | 295 | cpu_register_physical_memory(0x3001a000, 0x5c, gpio_regs); |
| 296 | 296 | |
| 297 | 297 | |
| 298 | - pic = etraxfs_pic_init(env, 0x3001c000); | |
| 298 | + irq = etraxfs_pic_init(env, 0x3001c000); | |
| 299 | + nmi = irq + 30; | |
| 300 | + | |
| 299 | 301 | etraxfs_dmac = etraxfs_dmac_init(env, 0x30000000, 10); |
| 300 | 302 | for (i = 0; i < 10; i++) { |
| 301 | 303 | /* On ETRAX, odd numbered channels are inputs. */ |
| 302 | - etraxfs_dmac_connect(etraxfs_dmac, i, pic->irq + 7 + i, i & 1); | |
| 304 | + etraxfs_dmac_connect(etraxfs_dmac, i, irq + 7 + i, i & 1); | |
| 303 | 305 | } |
| 304 | 306 | |
| 305 | 307 | /* Add the two ethernet blocks. */ |
| 306 | - eth[0] = etraxfs_eth_init(&nd_table[0], env, pic->irq + 25, 0x30034000, 1); | |
| 308 | + eth[0] = etraxfs_eth_init(&nd_table[0], env, irq + 25, 0x30034000, 1); | |
| 307 | 309 | if (nb_nics > 1) |
| 308 | 310 | eth[1] = etraxfs_eth_init(&nd_table[1], env, |
| 309 | - pic->irq + 26, 0x30036000, 2); | |
| 311 | + irq + 26, 0x30036000, 2); | |
| 310 | 312 | |
| 311 | 313 | /* The DMA Connector block is missing, hardwire things for now. */ |
| 312 | 314 | etraxfs_dmac_connect_client(etraxfs_dmac, 0, eth[0]); |
| ... | ... | @@ -317,12 +319,12 @@ void axisdev88_init (ram_addr_t ram_size, |
| 317 | 319 | } |
| 318 | 320 | |
| 319 | 321 | /* 2 timers. */ |
| 320 | - etraxfs_timer_init(env, pic->irq + 0x1b, pic->nmi + 1, 0x3001e000); | |
| 321 | - etraxfs_timer_init(env, pic->irq + 0x1b, pic->nmi + 1, 0x3005e000); | |
| 322 | + etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3001e000); | |
| 323 | + etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3005e000); | |
| 322 | 324 | |
| 323 | 325 | for (i = 0; i < 4; i++) { |
| 324 | 326 | if (serial_hds[i]) { |
| 325 | - etraxfs_ser_init(env, pic->irq + 0x14 + i, | |
| 327 | + etraxfs_ser_init(env, irq + 0x14 + i, | |
| 326 | 328 | serial_hds[i], 0x30026000 + i * 0x2000); |
| 327 | 329 | } |
| 328 | 330 | } | ... | ... |
hw/etraxfs.c
| ... | ... | @@ -52,7 +52,7 @@ void bareetraxfs_init (ram_addr_t ram_size, |
| 52 | 52 | const char *initrd_filename, const char *cpu_model) |
| 53 | 53 | { |
| 54 | 54 | CPUState *env; |
| 55 | - struct etraxfs_pic *pic; | |
| 55 | + qemu_irq *irq, *nmi; | |
| 56 | 56 | void *etraxfs_dmac; |
| 57 | 57 | struct etraxfs_dma_client *eth[2] = {NULL, NULL}; |
| 58 | 58 | int kernel_size; |
| ... | ... | @@ -86,18 +86,20 @@ void bareetraxfs_init (ram_addr_t ram_size, |
| 86 | 86 | FLASH_SIZE >> 16, |
| 87 | 87 | 1, 2, 0x0000, 0x0000, 0x0000, 0x0000, |
| 88 | 88 | 0x555, 0x2aa); |
| 89 | - pic = etraxfs_pic_init(env, 0x3001c000); | |
| 89 | + irq = etraxfs_pic_init(env, 0x3001c000); | |
| 90 | + nmi = irq + 30; | |
| 91 | + | |
| 90 | 92 | etraxfs_dmac = etraxfs_dmac_init(env, 0x30000000, 10); |
| 91 | 93 | for (i = 0; i < 10; i++) { |
| 92 | 94 | /* On ETRAX, odd numbered channels are inputs. */ |
| 93 | - etraxfs_dmac_connect(etraxfs_dmac, i, pic->irq + 7 + i, i & 1); | |
| 95 | + etraxfs_dmac_connect(etraxfs_dmac, i, irq + 7 + i, i & 1); | |
| 94 | 96 | } |
| 95 | 97 | |
| 96 | 98 | /* Add the two ethernet blocks. */ |
| 97 | - eth[0] = etraxfs_eth_init(&nd_table[0], env, pic->irq + 25, 0x30034000, 1); | |
| 99 | + eth[0] = etraxfs_eth_init(&nd_table[0], env, irq + 25, 0x30034000, 1); | |
| 98 | 100 | if (nb_nics > 1) |
| 99 | 101 | eth[1] = etraxfs_eth_init(&nd_table[1], env, |
| 100 | - pic->irq + 26, 0x30036000, 2); | |
| 102 | + irq + 26, 0x30036000, 2); | |
| 101 | 103 | |
| 102 | 104 | /* The DMA Connector block is missing, hardwire things for now. */ |
| 103 | 105 | etraxfs_dmac_connect_client(etraxfs_dmac, 0, eth[0]); |
| ... | ... | @@ -108,12 +110,12 @@ void bareetraxfs_init (ram_addr_t ram_size, |
| 108 | 110 | } |
| 109 | 111 | |
| 110 | 112 | /* 2 timers. */ |
| 111 | - etraxfs_timer_init(env, pic->irq + 0x1b, pic->nmi + 1, 0x3001e000); | |
| 112 | - etraxfs_timer_init(env, pic->irq + 0x1b, pic->nmi + 1, 0x3005e000); | |
| 113 | + etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3001e000); | |
| 114 | + etraxfs_timer_init(env, irq + 0x1b, nmi + 1, 0x3005e000); | |
| 113 | 115 | |
| 114 | 116 | for (i = 0; i < 4; i++) { |
| 115 | 117 | if (serial_hds[i]) { |
| 116 | - etraxfs_ser_init(env, pic->irq + 0x14 + i, | |
| 118 | + etraxfs_ser_init(env, irq + 0x14 + i, | |
| 117 | 119 | serial_hds[i], 0x30026000 + i * 0x2000); |
| 118 | 120 | } |
| 119 | 121 | } | ... | ... |
hw/etraxfs.h
| ... | ... | @@ -24,16 +24,7 @@ |
| 24 | 24 | |
| 25 | 25 | #include "etraxfs_dma.h" |
| 26 | 26 | |
| 27 | -struct etraxfs_pic | |
| 28 | -{ | |
| 29 | - qemu_irq *irq; | |
| 30 | - qemu_irq *nmi; | |
| 31 | - qemu_irq *guru; | |
| 32 | - | |
| 33 | - void *internal; | |
| 34 | -}; | |
| 35 | - | |
| 36 | -struct etraxfs_pic *etraxfs_pic_init(CPUState *env, target_phys_addr_t base); | |
| 27 | +qemu_irq *etraxfs_pic_init(CPUState *env, target_phys_addr_t base); | |
| 37 | 28 | void etraxfs_timer_init(CPUState *env, qemu_irq *irqs, qemu_irq *nmi, |
| 38 | 29 | target_phys_addr_t base); |
| 39 | 30 | void *etraxfs_eth_init(NICInfo *nd, CPUState *env, | ... | ... |
hw/etraxfs_pic.c
| ... | ... | @@ -118,16 +118,6 @@ void irq_info(Monitor *mon) |
| 118 | 118 | { |
| 119 | 119 | } |
| 120 | 120 | |
| 121 | -static void irq_handler(void *opaque, int irq, int level) | |
| 122 | -{ | |
| 123 | - struct fs_pic_state *fs = (void *)opaque; | |
| 124 | - irq -= 1; | |
| 125 | - fs->regs[R_R_VECT] &= ~(1 << irq); | |
| 126 | - fs->regs[R_R_VECT] |= (!!level << irq); | |
| 127 | - | |
| 128 | - pic_update(fs); | |
| 129 | -} | |
| 130 | - | |
| 131 | 121 | static void nmi_handler(void *opaque, int irq, int level) |
| 132 | 122 | { |
| 133 | 123 | struct fs_pic_state *fs = (void *)opaque; |
| ... | ... | @@ -146,27 +136,30 @@ static void nmi_handler(void *opaque, int irq, int level) |
| 146 | 136 | cpu_reset_interrupt(env, CPU_INTERRUPT_NMI); |
| 147 | 137 | } |
| 148 | 138 | |
| 149 | -static void guru_handler(void *opaque, int irq, int level) | |
| 139 | +static void irq_handler(void *opaque, int irq, int level) | |
| 150 | 140 | { |
| 151 | - hw_error("%s unsupported exception\n", __func__); | |
| 141 | + struct fs_pic_state *fs = (void *)opaque; | |
| 142 | + | |
| 143 | + if (irq >= 30) | |
| 144 | + return nmi_handler(opaque, irq, level); | |
| 145 | + | |
| 146 | + irq -= 1; | |
| 147 | + fs->regs[R_R_VECT] &= ~(1 << irq); | |
| 148 | + fs->regs[R_R_VECT] |= (!!level << irq); | |
| 149 | + pic_update(fs); | |
| 152 | 150 | } |
| 153 | 151 | |
| 154 | -struct etraxfs_pic *etraxfs_pic_init(CPUState *env, target_phys_addr_t base) | |
| 152 | +qemu_irq *etraxfs_pic_init(CPUState *env, target_phys_addr_t base) | |
| 155 | 153 | { |
| 156 | 154 | struct fs_pic_state *fs = NULL; |
| 157 | - struct etraxfs_pic *pic = NULL; | |
| 155 | + qemu_irq *irq; | |
| 158 | 156 | int intr_vect_regs; |
| 159 | 157 | |
| 160 | - pic = qemu_mallocz(sizeof *pic); | |
| 161 | - pic->internal = fs = qemu_mallocz(sizeof *fs); | |
| 162 | - | |
| 158 | + fs = qemu_mallocz(sizeof *fs); | |
| 163 | 159 | fs->env = env; |
| 164 | - pic->irq = qemu_allocate_irqs(irq_handler, fs, 30); | |
| 165 | - pic->nmi = qemu_allocate_irqs(nmi_handler, fs, 2); | |
| 166 | - pic->guru = qemu_allocate_irqs(guru_handler, fs, 1); | |
| 160 | + irq = qemu_allocate_irqs(irq_handler, fs, 32); | |
| 167 | 161 | |
| 168 | 162 | intr_vect_regs = cpu_register_io_memory(0, pic_read, pic_write, fs); |
| 169 | 163 | cpu_register_physical_memory(base, R_MAX * 4, intr_vect_regs); |
| 170 | - | |
| 171 | - return pic; | |
| 164 | + return irq; | |
| 172 | 165 | } | ... | ... |