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,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)