Revision e1f8c729 hw/pxa2xx_pic.c
b/hw/pxa2xx_pic.c | ||
---|---|---|
10 | 10 |
|
11 | 11 |
#include "hw.h" |
12 | 12 |
#include "pxa.h" |
13 |
#include "sysbus.h" |
|
13 | 14 |
|
14 | 15 |
#define ICIP 0x00 /* Interrupt Controller IRQ Pending register */ |
15 | 16 |
#define ICMR 0x04 /* Interrupt Controller Mask register */ |
... | ... | |
31 | 32 |
#define PXA2XX_PIC_SRCS 40 |
32 | 33 |
|
33 | 34 |
typedef struct { |
35 |
SysBusDevice busdev; |
|
34 | 36 |
CPUState *cpu_env; |
35 | 37 |
uint32_t int_enabled[2]; |
36 | 38 |
uint32_t int_pending[2]; |
... | ... | |
241 | 243 |
pxa2xx_pic_mem_write, |
242 | 244 |
}; |
243 | 245 |
|
244 |
static void pxa2xx_pic_save(QEMUFile *f, void *opaque)
|
|
246 |
static int pxa2xx_pic_post_load(void *opaque, int version_id)
|
|
245 | 247 |
{ |
246 |
PXA2xxPICState *s = (PXA2xxPICState *) opaque; |
|
247 |
int i; |
|
248 |
|
|
249 |
for (i = 0; i < 2; i ++) |
|
250 |
qemu_put_be32s(f, &s->int_enabled[i]); |
|
251 |
for (i = 0; i < 2; i ++) |
|
252 |
qemu_put_be32s(f, &s->int_pending[i]); |
|
253 |
for (i = 0; i < 2; i ++) |
|
254 |
qemu_put_be32s(f, &s->is_fiq[i]); |
|
255 |
qemu_put_be32s(f, &s->int_idle); |
|
256 |
for (i = 0; i < PXA2XX_PIC_SRCS; i ++) |
|
257 |
qemu_put_be32s(f, &s->priority[i]); |
|
258 |
} |
|
259 |
|
|
260 |
static int pxa2xx_pic_load(QEMUFile *f, void *opaque, int version_id) |
|
261 |
{ |
|
262 |
PXA2xxPICState *s = (PXA2xxPICState *) opaque; |
|
263 |
int i; |
|
264 |
|
|
265 |
for (i = 0; i < 2; i ++) |
|
266 |
qemu_get_be32s(f, &s->int_enabled[i]); |
|
267 |
for (i = 0; i < 2; i ++) |
|
268 |
qemu_get_be32s(f, &s->int_pending[i]); |
|
269 |
for (i = 0; i < 2; i ++) |
|
270 |
qemu_get_be32s(f, &s->is_fiq[i]); |
|
271 |
qemu_get_be32s(f, &s->int_idle); |
|
272 |
for (i = 0; i < PXA2XX_PIC_SRCS; i ++) |
|
273 |
qemu_get_be32s(f, &s->priority[i]); |
|
274 |
|
|
275 | 248 |
pxa2xx_pic_update(opaque); |
276 | 249 |
return 0; |
277 | 250 |
} |
278 | 251 |
|
279 |
qemu_irq *pxa2xx_pic_init(target_phys_addr_t base, CPUState *env)
|
|
252 |
DeviceState *pxa2xx_pic_init(target_phys_addr_t base, CPUState *env)
|
|
280 | 253 |
{ |
281 |
PXA2xxPICState *s;
|
|
254 |
DeviceState *dev = qdev_create(NULL, "pxa2xx_pic");
|
|
282 | 255 |
int iomemtype; |
283 |
qemu_irq *qi; |
|
284 |
|
|
285 |
s = (PXA2xxPICState *) |
|
286 |
qemu_mallocz(sizeof(PXA2xxPICState)); |
|
287 |
if (!s) |
|
288 |
return NULL; |
|
256 |
PXA2xxPICState *s = FROM_SYSBUS(PXA2xxPICState, sysbus_from_qdev(dev)); |
|
289 | 257 |
|
290 | 258 |
s->cpu_env = env; |
291 | 259 |
|
... | ... | |
296 | 264 |
s->is_fiq[0] = 0; |
297 | 265 |
s->is_fiq[1] = 0; |
298 | 266 |
|
299 |
qi = qemu_allocate_irqs(pxa2xx_pic_set_irq, s, PXA2XX_PIC_SRCS); |
|
267 |
qdev_init_nofail(dev); |
|
268 |
|
|
269 |
qdev_init_gpio_in(dev, pxa2xx_pic_set_irq, PXA2XX_PIC_SRCS); |
|
300 | 270 |
|
301 | 271 |
/* Enable IC memory-mapped registers access. */ |
302 | 272 |
iomemtype = cpu_register_io_memory(pxa2xx_pic_readfn, |
303 | 273 |
pxa2xx_pic_writefn, s, DEVICE_NATIVE_ENDIAN); |
304 |
cpu_register_physical_memory(base, 0x00100000, iomemtype);
|
|
274 |
sysbus_init_mmio(sysbus_from_qdev(dev), 0x00100000, iomemtype);
|
|
305 | 275 |
|
306 | 276 |
/* Enable IC coprocessor access. */ |
307 | 277 |
cpu_arm_set_cp_io(env, 6, pxa2xx_pic_cp_read, pxa2xx_pic_cp_write, s); |
308 | 278 |
|
309 |
register_savevm(NULL, "pxa2xx_pic", 0, 0, pxa2xx_pic_save, |
|
310 |
pxa2xx_pic_load, s); |
|
279 |
return dev; |
|
280 |
} |
|
281 |
|
|
282 |
static VMStateDescription vmstate_pxa2xx_pic_regs = { |
|
283 |
.name = "pxa2xx_pic", |
|
284 |
.version_id = 0, |
|
285 |
.minimum_version_id = 0, |
|
286 |
.minimum_version_id_old = 0, |
|
287 |
.post_load = pxa2xx_pic_post_load, |
|
288 |
.fields = (VMStateField[]) { |
|
289 |
VMSTATE_UINT32_ARRAY(int_enabled, PXA2xxPICState, 2), |
|
290 |
VMSTATE_UINT32_ARRAY(int_pending, PXA2xxPICState, 2), |
|
291 |
VMSTATE_UINT32_ARRAY(is_fiq, PXA2xxPICState, 2), |
|
292 |
VMSTATE_UINT32(int_idle, PXA2xxPICState), |
|
293 |
VMSTATE_UINT32_ARRAY(priority, PXA2xxPICState, PXA2XX_PIC_SRCS), |
|
294 |
VMSTATE_END_OF_LIST(), |
|
295 |
}, |
|
296 |
}; |
|
311 | 297 |
|
312 |
return qi; |
|
298 |
static int pxa2xx_pic_initfn(SysBusDevice *dev) |
|
299 |
{ |
|
300 |
return 0; |
|
301 |
} |
|
302 |
|
|
303 |
static SysBusDeviceInfo pxa2xx_pic_info = { |
|
304 |
.init = pxa2xx_pic_initfn, |
|
305 |
.qdev.name = "pxa2xx_pic", |
|
306 |
.qdev.desc = "PXA2xx PIC", |
|
307 |
.qdev.size = sizeof(PXA2xxPICState), |
|
308 |
.qdev.vmsd = &vmstate_pxa2xx_pic_regs, |
|
309 |
}; |
|
310 |
|
|
311 |
static void pxa2xx_pic_register(void) |
|
312 |
{ |
|
313 |
sysbus_register_withprop(&pxa2xx_pic_info); |
|
313 | 314 |
} |
315 |
device_init(pxa2xx_pic_register); |
Also available in: Unified diff