Commit c70c59eeecf11fe0cfb64aa0165e188bbc41ae96

Authored by Blue Swirl
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 21 * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
22 22 * THE SOFTWARE.
23 23 */
24   -#include "hw.h"
  24 +
25 25 #include "sun4m.h"
26 26 #include "qemu-timer.h"
  27 +#include "sysbus.h"
27 28  
28 29 //#define DEBUG_TIMER
29 30  
... ... @@ -52,6 +53,7 @@
52 53 #define MAX_CPUS 16
53 54  
54 55 typedef struct SLAVIO_TIMERState {
  56 + SysBusDevice busdev;
55 57 qemu_irq irq;
56 58 ptimer_state *timer;
57 59 uint32_t count, counthigh, reached;
... ... @@ -364,36 +366,56 @@ static void slavio_timer_reset(void *opaque)
364 366 static SLAVIO_TIMERState *slavio_timer_init(target_phys_addr_t addr,
365 367 qemu_irq irq,
366 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 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 402 bh = qemu_bh_new(slavio_timer_irq, s);
379 403 s->timer = ptimer_init(bh);
380 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 416 slavio_timer_load, s);
393 417 qemu_register_reset(slavio_timer_reset, s);
394 418 slavio_timer_reset(s);
395   -
396   - return s;
397 419 }
398 420  
399 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 424 SLAVIO_TIMERState *master;
403 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 430 for (i = 0; i < MAX_CPUS; i++) {
410 431 master->slave[i] = slavio_timer_init(base + (target_phys_addr_t)
411 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)
... ...