Revision 5f750b2e

b/hw/iommu.c
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
#include "sysbus.h"
26 27

  
27 28
/* debug iommu */
28 29
//#define DEBUG_IOMMU
......
127 128
#define IOMMU_PAGE_MASK     ~(IOMMU_PAGE_SIZE - 1)
128 129

  
129 130
typedef struct IOMMUState {
131
    SysBusDevice busdev;
130 132
    uint32_t regs[IOMMU_NREGS];
131 133
    target_phys_addr_t iostart;
132 134
    uint32_t version;
......
366 368

  
367 369
void *iommu_init(target_phys_addr_t addr, uint32_t version, qemu_irq irq)
368 370
{
369
    IOMMUState *s;
370
    int iommu_io_memory;
371
    DeviceState *dev;
372
    SysBusDevice *s;
373
    IOMMUState *d;
374

  
375
    dev = qdev_create(NULL, "iommu");
376
    qdev_set_prop_int(dev, "version", version);
377
    qdev_init(dev);
378
    s = sysbus_from_qdev(dev);
379
    sysbus_connect_irq(s, 0, irq);
380
    sysbus_mmio_map(s, 0, addr);
381

  
382
    d = FROM_SYSBUS(IOMMUState, s);
383

  
384
    return d;
385
}
386

  
387
static void iommu_init1(SysBusDevice *dev)
388
{
389
    IOMMUState *s = FROM_SYSBUS(IOMMUState, dev);
390
    int io;
371 391

  
372
    s = qemu_mallocz(sizeof(IOMMUState));
392
    sysbus_init_irq(dev, &s->irq);
373 393

  
374
    s->version = version;
375
    s->irq = irq;
394
    s->version = qdev_get_prop_int(&dev->qdev, "version", 0);
376 395

  
377
    iommu_io_memory = cpu_register_io_memory(iommu_mem_read,
378
                                             iommu_mem_write, s);
379
    cpu_register_physical_memory(addr, IOMMU_NREGS * 4, iommu_io_memory);
396
    io = cpu_register_io_memory(iommu_mem_read, iommu_mem_write, s);
397
    sysbus_init_mmio(dev, IOMMU_NREGS * sizeof(uint32_t), io);
380 398

  
381
    register_savevm("iommu", addr, 2, iommu_save, iommu_load, s);
399
    register_savevm("iommu", -1, 2, iommu_save, iommu_load, s);
382 400
    qemu_register_reset(iommu_reset, s);
383 401
    iommu_reset(s);
384
    return s;
385 402
}
403

  
404
static SysBusDeviceInfo iommu_info = {
405
    .init = iommu_init1,
406
    .qdev.name  = "iommu",
407
    .qdev.size  = sizeof(IOMMUState),
408
    .qdev.props = (DevicePropList[]) {
409
        {.name = "version", .type = PROP_TYPE_INT},
410
        {.name = NULL}
411
    }
412
};
413

  
414
static void iommu_register_devices(void)
415
{
416
    sysbus_register_withprop(&iommu_info);
417
}
418

  
419
device_init(iommu_register_devices)

Also available in: Unified diff