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 | } | ... | ... |