Commit c70c59eeecf11fe0cfb64aa0165e188bbc41ae96
1 parent
6c319c82
Sparc32: convert slavio timers to qdev
Signed-off-by: Blue Swirl <blauwirbel@gmail.com>
Showing
1 changed file
with
64 additions
and
24 deletions
hw/slavio_timer.c
@@ -21,9 +21,10 @@ | @@ -21,9 +21,10 @@ | ||
21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN | 21 | * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN |
22 | * THE SOFTWARE. | 22 | * THE SOFTWARE. |
23 | */ | 23 | */ |
24 | -#include "hw.h" | 24 | + |
25 | #include "sun4m.h" | 25 | #include "sun4m.h" |
26 | #include "qemu-timer.h" | 26 | #include "qemu-timer.h" |
27 | +#include "sysbus.h" | ||
27 | 28 | ||
28 | //#define DEBUG_TIMER | 29 | //#define DEBUG_TIMER |
29 | 30 | ||
@@ -52,6 +53,7 @@ | @@ -52,6 +53,7 @@ | ||
52 | #define MAX_CPUS 16 | 53 | #define MAX_CPUS 16 |
53 | 54 | ||
54 | typedef struct SLAVIO_TIMERState { | 55 | typedef struct SLAVIO_TIMERState { |
56 | + SysBusDevice busdev; | ||
55 | qemu_irq irq; | 57 | qemu_irq irq; |
56 | ptimer_state *timer; | 58 | ptimer_state *timer; |
57 | uint32_t count, counthigh, reached; | 59 | uint32_t count, counthigh, reached; |
@@ -364,36 +366,56 @@ static void slavio_timer_reset(void *opaque) | @@ -364,36 +366,56 @@ static void slavio_timer_reset(void *opaque) | ||
364 | static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, | 366 | static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr, |
365 | qemu_irq irq, | 367 | qemu_irq irq, |
366 | SLAVIO_TIMERState *master, | 368 | SLAVIO_TIMERState *master, |
367 | - uint32_t slave_index) | 369 | + uint32_t slave_index, |
370 | + uint32_t num_slaves) | ||
368 | { | 371 | { |
369 | - int slavio_timer_io_memory; | ||
370 | - SLAVIO_TIMERState *s; | 372 | + DeviceState *dev; |
373 | + SysBusDevice *s; | ||
374 | + SLAVIO_TIMERState *d; | ||
375 | + | ||
376 | + dev = qdev_create(NULL, "slavio_timer"); | ||
377 | + qdev_set_prop_int(dev, "slave_index", slave_index); | ||
378 | + qdev_set_prop_int(dev, "num_slaves", num_slaves); | ||
379 | + qdev_set_prop_ptr(dev, "master", master); | ||
380 | + qdev_init(dev); | ||
381 | + s = sysbus_from_qdev(dev); | ||
382 | + sysbus_connect_irq(s, 0, irq); | ||
383 | + sysbus_mmio_map(s, 0, addr); | ||
384 | + | ||
385 | + d = FROM_SYSBUS(SLAVIO_TIMERState, s); | ||
386 | + | ||
387 | + return d; | ||
388 | +} | ||
389 | + | ||
390 | +static void slavio_timer_init1(SysBusDevice *dev) | ||
391 | +{ | ||
392 | + int io; | ||
393 | + SLAVIO_TIMERState *s = FROM_SYSBUS(SLAVIO_TIMERState, dev); | ||
371 | QEMUBH *bh; | 394 | QEMUBH *bh; |
372 | 395 | ||
373 | - s = qemu_mallocz(sizeof(SLAVIO_TIMERState)); | ||
374 | - s->irq = irq; | ||
375 | - s->master = master; | ||
376 | - s->slave_index = slave_index; | ||
377 | - if (!master || slave_index < master->num_slaves) { | 396 | + sysbus_init_irq(dev, &s->irq); |
397 | + s->num_slaves = qdev_get_prop_int(&dev->qdev, "num_slaves", 0); | ||
398 | + s->slave_index = qdev_get_prop_int(&dev->qdev, "slave_index", 0); | ||
399 | + s->master = qdev_get_prop_ptr(&dev->qdev, "master"); | ||
400 | + | ||
401 | + if (!s->master || s->slave_index < s->master->num_slaves) { | ||
378 | bh = qemu_bh_new(slavio_timer_irq, s); | 402 | bh = qemu_bh_new(slavio_timer_irq, s); |
379 | s->timer = ptimer_init(bh); | 403 | s->timer = ptimer_init(bh); |
380 | ptimer_set_period(s->timer, TIMER_PERIOD); | 404 | ptimer_set_period(s->timer, TIMER_PERIOD); |
381 | } | 405 | } |
382 | 406 | ||
383 | - slavio_timer_io_memory = cpu_register_io_memory(slavio_timer_mem_read, | ||
384 | - slavio_timer_mem_write, s); | ||
385 | - if (master) | ||
386 | - cpu_register_physical_memory(addr, CPU_TIMER_SIZE, | ||
387 | - slavio_timer_io_memory); | ||
388 | - else | ||
389 | - cpu_register_physical_memory(addr, SYS_TIMER_SIZE, | ||
390 | - slavio_timer_io_memory); | ||
391 | - register_savevm("slavio_timer", addr, 3, slavio_timer_save, | 407 | + io = cpu_register_io_memory(slavio_timer_mem_read, slavio_timer_mem_write, |
408 | + s); | ||
409 | + if (s->master) { | ||
410 | + sysbus_init_mmio(dev, CPU_TIMER_SIZE, io); | ||
411 | + } else { | ||
412 | + sysbus_init_mmio(dev, SYS_TIMER_SIZE, io); | ||
413 | + } | ||
414 | + | ||
415 | + register_savevm("slavio_timer", -1, 3, slavio_timer_save, | ||
392 | slavio_timer_load, s); | 416 | slavio_timer_load, s); |
393 | qemu_register_reset(slavio_timer_reset, s); | 417 | qemu_register_reset(slavio_timer_reset, s); |
394 | slavio_timer_reset(s); | 418 | slavio_timer_reset(s); |
395 | - | ||
396 | - return s; | ||
397 | } | 419 | } |
398 | 420 | ||
399 | void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, | 421 | void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, |
@@ -402,13 +424,31 @@ void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, | @@ -402,13 +424,31 @@ void slavio_timer_init_all(target_phys_addr_t base, qemu_irq master_irq, | ||
402 | SLAVIO_TIMERState *master; | 424 | SLAVIO_TIMERState *master; |
403 | unsigned int i; | 425 | unsigned int i; |
404 | 426 | ||
405 | - master = slavio_timer_init(base + SYS_TIMER_OFFSET, master_irq, NULL, 0); | ||
406 | - | ||
407 | - master->num_slaves = num_cpus; | 427 | + master = slavio_timer_init(base + SYS_TIMER_OFFSET, master_irq, NULL, 0, |
428 | + num_cpus); | ||
408 | 429 | ||
409 | for (i = 0; i < MAX_CPUS; i++) { | 430 | for (i = 0; i < MAX_CPUS; i++) { |
410 | master->slave[i] = slavio_timer_init(base + (target_phys_addr_t) | 431 | master->slave[i] = slavio_timer_init(base + (target_phys_addr_t) |
411 | CPU_TIMER_OFFSET(i), | 432 | CPU_TIMER_OFFSET(i), |
412 | - cpu_irqs[i], master, i); | 433 | + cpu_irqs[i], master, i, 0); |
413 | } | 434 | } |
414 | } | 435 | } |
436 | + | ||
437 | +static SysBusDeviceInfo slavio_timer_info = { | ||
438 | + .init = slavio_timer_init1, | ||
439 | + .qdev.name = "slavio_timer", | ||
440 | + .qdev.size = sizeof(SLAVIO_TIMERState), | ||
441 | + .qdev.props = (DevicePropList[]) { | ||
442 | + {.name = "num_slaves", .type = PROP_TYPE_INT}, | ||
443 | + {.name = "slave_index", .type = PROP_TYPE_INT}, | ||
444 | + {.name = "master", .type = PROP_TYPE_PTR}, | ||
445 | + {.name = NULL} | ||
446 | + } | ||
447 | +}; | ||
448 | + | ||
449 | +static void slavio_timer_register_devices(void) | ||
450 | +{ | ||
451 | + sysbus_register_withprop(&slavio_timer_info); | ||
452 | +} | ||
453 | + | ||
454 | +device_init(slavio_timer_register_devices) |