Revision a3d12d07 hw/slavio_timer.c
b/hw/slavio_timer.c | ||
---|---|---|
61 | 61 |
} SLAVIO_TIMERState; |
62 | 62 |
|
63 | 63 |
typedef struct TimerContext { |
64 |
MemoryRegion iomem; |
|
64 | 65 |
SLAVIO_TIMERState *s; |
65 | 66 |
unsigned int timer_index; /* 0 for system, 1 ... MAX_CPUS for CPU timers */ |
66 | 67 |
} TimerContext; |
... | ... | |
128 | 129 |
} |
129 | 130 |
} |
130 | 131 |
|
131 |
static uint32_t slavio_timer_mem_readl(void *opaque, target_phys_addr_t addr) |
|
132 |
static uint64_t slavio_timer_mem_readl(void *opaque, target_phys_addr_t addr, |
|
133 |
unsigned size) |
|
132 | 134 |
{ |
133 | 135 |
TimerContext *tc = opaque; |
134 | 136 |
SLAVIO_TIMERState *s = tc->s; |
... | ... | |
188 | 190 |
} |
189 | 191 |
|
190 | 192 |
static void slavio_timer_mem_writel(void *opaque, target_phys_addr_t addr, |
191 |
uint32_t val)
|
|
193 |
uint64_t val, unsigned size)
|
|
192 | 194 |
{ |
193 | 195 |
TimerContext *tc = opaque; |
194 | 196 |
SLAVIO_TIMERState *s = tc->s; |
... | ... | |
311 | 313 |
} |
312 | 314 |
} |
313 | 315 |
|
314 |
static CPUReadMemoryFunc * const slavio_timer_mem_read[3] = { |
|
315 |
NULL, |
|
316 |
NULL, |
|
317 |
slavio_timer_mem_readl, |
|
318 |
}; |
|
319 |
|
|
320 |
static CPUWriteMemoryFunc * const slavio_timer_mem_write[3] = { |
|
321 |
NULL, |
|
322 |
NULL, |
|
323 |
slavio_timer_mem_writel, |
|
316 |
static const MemoryRegionOps slavio_timer_mem_ops = { |
|
317 |
.read = slavio_timer_mem_readl, |
|
318 |
.write = slavio_timer_mem_writel, |
|
319 |
.endianness = DEVICE_NATIVE_ENDIAN, |
|
320 |
.valid = { |
|
321 |
.min_access_size = 4, |
|
322 |
.max_access_size = 4, |
|
323 |
}, |
|
324 | 324 |
}; |
325 | 325 |
|
326 | 326 |
static const VMStateDescription vmstate_timer = { |
... | ... | |
374 | 374 |
|
375 | 375 |
static int slavio_timer_init1(SysBusDevice *dev) |
376 | 376 |
{ |
377 |
int io; |
|
378 | 377 |
SLAVIO_TIMERState *s = FROM_SYSBUS(SLAVIO_TIMERState, dev); |
379 | 378 |
QEMUBH *bh; |
380 | 379 |
unsigned int i; |
381 | 380 |
TimerContext *tc; |
382 | 381 |
|
383 | 382 |
for (i = 0; i <= MAX_CPUS; i++) { |
383 |
uint64_t size; |
|
384 |
char timer_name[20]; |
|
385 |
|
|
384 | 386 |
tc = g_malloc0(sizeof(TimerContext)); |
385 | 387 |
tc->s = s; |
386 | 388 |
tc->timer_index = i; |
... | ... | |
389 | 391 |
s->cputimer[i].timer = ptimer_init(bh); |
390 | 392 |
ptimer_set_period(s->cputimer[i].timer, TIMER_PERIOD); |
391 | 393 |
|
392 |
io = cpu_register_io_memory(slavio_timer_mem_read, |
|
393 |
slavio_timer_mem_write, tc, |
|
394 |
DEVICE_NATIVE_ENDIAN); |
|
395 |
if (i == 0) { |
|
396 |
sysbus_init_mmio(dev, SYS_TIMER_SIZE, io); |
|
397 |
} else { |
|
398 |
sysbus_init_mmio(dev, CPU_TIMER_SIZE, io); |
|
399 |
} |
|
394 |
size = i == 0 ? SYS_TIMER_SIZE : CPU_TIMER_SIZE; |
|
395 |
snprintf(timer_name, sizeof(timer_name), "timer-%i", i); |
|
396 |
memory_region_init_io(&tc->iomem, &slavio_timer_mem_ops, tc, |
|
397 |
timer_name, size); |
|
398 |
sysbus_init_mmio_region(dev, &tc->iomem); |
|
400 | 399 |
|
401 | 400 |
sysbus_init_irq(dev, &s->cputimer[i].irq); |
402 | 401 |
} |
Also available in: Unified diff