static int virtio_ccw_blk_init(VirtioCcwDevice *ccw_dev) { VirtIOBlkCcw *dev = VIRTIO_BLK_CCW(ccw_dev); DeviceState *vdev = DEVICE(&dev->vdev); virtio_blk_set_conf(vdev, &(dev->blk)); qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus)); if (qdev_init(vdev) < 0) { return -1; } return virtio_ccw_device_init(ccw_dev, VIRTIO_DEVICE(vdev)); }
/* Legacy helper function. Should go away when machine config files are implemented. */ void smc91c111_init(NICInfo *nd, uint32_t base, qemu_irq irq) { DeviceState *dev; SysBusDevice *s; qemu_check_nic_model(nd, "smc91c111"); dev = qdev_create(NULL, "smc91c111"); qdev_set_netdev(dev, nd); qdev_init(dev); s = sysbus_from_qdev(dev); sysbus_mmio_map(s, 0, base); sysbus_connect_irq(s, 0, irq); }
/* FIXME callers should check for failure, but don't */ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, DriveInfo *dinfo, int unit) { const char *driver; DeviceState *dev; driver = bdrv_is_sg(dinfo->bdrv) ? "scsi-generic" : "scsi-disk"; dev = qdev_create(&bus->qbus, driver); qdev_prop_set_uint32(dev, "scsi-id", unit); qdev_prop_set_drive(dev, "drive", dinfo); if (qdev_init(dev) < 0) return NULL; return DO_UPCAST(SCSIDevice, qdev, dev); }
static int macio_newworld_initfn(PCIDevice *d) { MacIOState *s = MACIO(d); NewWorldMacIOState *ns = NEWWORLD_MACIO(d); SysBusDevice *sysbus_dev; int ret = macio_common_initfn(d); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&s->cuda); sysbus_connect_irq(sysbus_dev, 0, ns->irqs[0]); if (s->pic_mem) { /* OpenPIC */ memory_region_add_subregion(&s->bar, 0x40000, s->pic_mem); } sysbus_dev = SYS_BUS_DEVICE(&ns->ide[0]); sysbus_connect_irq(sysbus_dev, 0, ns->irqs[1]); sysbus_connect_irq(sysbus_dev, 1, ns->irqs[2]); macio_ide_register_dma(&ns->ide[0], s->dbdma, 0x16); ret = qdev_init(DEVICE(&ns->ide[0])); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&ns->ide[1]); sysbus_connect_irq(sysbus_dev, 0, ns->irqs[3]); sysbus_connect_irq(sysbus_dev, 1, ns->irqs[4]); macio_ide_register_dma(&ns->ide[1], s->dbdma, 0x1a); ret = qdev_init(DEVICE(&ns->ide[1])); if (ret < 0) { return ret; } return 0; }
static int macio_oldworld_initfn(PCIDevice *d) { MacIOState *s = MACIO(d); OldWorldMacIOState *os = OLDWORLD_MACIO(d); SysBusDevice *sysbus_dev; int ret = macio_common_initfn(d); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&s->cuda); sysbus_connect_irq(sysbus_dev, 0, os->irqs[0]); ret = qdev_init(DEVICE(&os->nvram)); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&os->nvram); memory_region_add_subregion(&s->bar, 0x60000, sysbus_mmio_get_region(sysbus_dev, 0)); pmac_format_nvram_partition(&os->nvram, os->nvram.size); if (s->pic_mem) { /* Heathrow PIC */ memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem); } sysbus_dev = SYS_BUS_DEVICE(&os->ide); sysbus_connect_irq(sysbus_dev, 0, os->irqs[1]); sysbus_connect_irq(sysbus_dev, 1, os->irqs[2]); macio_ide_register_dma(&os->ide, s->dbdma, 0x16); ret = qdev_init(DEVICE(&os->ide)); if (ret < 0) { return ret; } return 0; }
bool serial_isa_init(ISABus *bus, int index, CharDriverState *chr) { ISADevice *dev; dev = isa_try_create(bus, TYPE_ISA_SERIAL); if (!dev) { return false; } qdev_prop_set_uint32(&dev->qdev, "index", index); qdev_prop_set_chr(&dev->qdev, "chardev", chr); if (qdev_init(&dev->qdev) < 0) { return false; } return true; }
static int virtio_ccw_rng_init(VirtioCcwDevice *ccw_dev) { VirtIORNGCcw *dev = VIRTIO_RNG_CCW(ccw_dev); DeviceState *vdev = DEVICE(&dev->vdev); qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus)); if (qdev_init(vdev) < 0) { return -1; } object_property_set_link(OBJECT(dev), OBJECT(dev->vdev.conf.rng), "rng", NULL); return virtio_ccw_device_init(ccw_dev, VIRTIO_DEVICE(vdev)); }
static int virtio_ccw_net_init(VirtioCcwDevice *ccw_dev) { DeviceState *qdev = DEVICE(ccw_dev); VirtIONetCcw *dev = VIRTIO_NET_CCW(ccw_dev); DeviceState *vdev = DEVICE(&dev->vdev); virtio_net_set_config_size(&dev->vdev, ccw_dev->host_features[0]); virtio_net_set_netclient_name(&dev->vdev, qdev->id, object_get_typename(OBJECT(qdev))); qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus)); if (qdev_init(vdev) < 0) { return -1; } return virtio_ccw_device_init(ccw_dev, VIRTIO_DEVICE(vdev)); }
void s390_flic_init(void) { DeviceState *dev; int r; dev = s390_flic_kvm_create(); if (!dev) { dev = qdev_create(NULL, TYPE_QEMU_S390_FLIC); object_property_add_child(qdev_get_machine(), TYPE_QEMU_S390_FLIC, OBJECT(dev), NULL); } r = qdev_init(dev); if (r) { error_report("flic: couldn't create qdev"); } }
bool serial_isa_init(ISABus *bus, int index, CharDriverState *chr) { DeviceState *dev; ISADevice *isadev; isadev = isa_try_create(bus, TYPE_ISA_SERIAL); if (!isadev) { return false; } dev = DEVICE(isadev); qdev_prop_set_uint32(dev, "index", index); qdev_prop_set_chr(dev, "chardev", chr); if (qdev_init(dev) < 0) { return false; } return true; }
static int macio_oldworld_initfn(PCIDevice *d) { MacIOState *s = MACIO(d); OldWorldMacIOState *os = OLDWORLD_MACIO(d); SysBusDevice *sysbus_dev; int i; int cur_irq = 0; int ret = macio_common_initfn(d); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&s->cuda); sysbus_connect_irq(sysbus_dev, 0, os->irqs[cur_irq++]); ret = qdev_init(DEVICE(&os->nvram)); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&os->nvram); memory_region_add_subregion(&s->bar, 0x60000, sysbus_mmio_get_region(sysbus_dev, 0)); pmac_format_nvram_partition(&os->nvram, os->nvram.size); if (s->pic_mem) { /* Heathrow PIC */ memory_region_add_subregion(&s->bar, 0x00000, s->pic_mem); } /* IDE buses */ for (i = 0; i < ARRAY_SIZE(os->ide); i++) { qemu_irq irq0 = os->irqs[cur_irq++]; qemu_irq irq1 = os->irqs[cur_irq++]; ret = macio_initfn_ide(s, &os->ide[i], irq0, irq1, 0x16 + (i * 4)); if (ret < 0) { return ret; } } return 0; }
/* handle legacy '-drive if=scsi,...' cmd line args */ SCSIDevice *scsi_bus_legacy_add_drive(SCSIBus *bus, BlockDriverState *bdrv, int unit, bool removable) { const char *driver; DeviceState *dev; driver = bdrv_is_sg(bdrv) ? "scsi-generic" : "scsi-disk"; dev = qdev_create(&bus->qbus, driver); qdev_prop_set_uint32(dev, "scsi-id", unit); if (qdev_prop_exists(dev, "removable")) { qdev_prop_set_bit(dev, "removable", removable); } if (qdev_prop_set_drive(dev, "drive", bdrv) < 0) { qdev_free(dev); return NULL; } if (qdev_init(dev) < 0) return NULL; return DO_UPCAST(SCSIDevice, qdev, dev); }
static int macio_common_initfn(PCIDevice *d) { MacIOState *s = MACIO(d); SysBusDevice *sysbus_dev; int ret; d->config[0x3d] = 0x01; // interrupt on pin 1 ret = qdev_init(DEVICE(&s->cuda)); if (ret < 0) { return ret; } sysbus_dev = SYS_BUS_DEVICE(&s->cuda); memory_region_add_subregion(&s->bar, 0x16000, sysbus_mmio_get_region(sysbus_dev, 0)); macio_bar_setup(s); pci_register_bar(d, 0, PCI_BASE_ADDRESS_SPACE_MEMORY, &s->bar); return 0; }
static int virtio_ccw_scsi_init(VirtioCcwDevice *ccw_dev) { VirtIOSCSICcw *dev = VIRTIO_SCSI_CCW(ccw_dev); DeviceState *vdev = DEVICE(&dev->vdev); DeviceState *qdev = DEVICE(ccw_dev); char *bus_name; /* * For command line compatibility, this sets the virtio-scsi-device bus * name as before. */ if (qdev->id) { bus_name = g_strdup_printf("%s.0", qdev->id); virtio_device_set_child_bus_name(VIRTIO_DEVICE(vdev), bus_name); g_free(bus_name); } qdev_set_parent_bus(vdev, BUS(&ccw_dev->bus)); if (qdev_init(vdev) < 0) { return -1; } return virtio_ccw_device_init(ccw_dev, VIRTIO_DEVICE(vdev)); }
static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, const char *devaddr, const char *opts) { PCIDevice *dev; DriveInfo *dinfo = NULL; int type = -1; char buf[128]; PCIBus *bus; int devfn; if (get_param_value(buf, sizeof(buf), "if", opts)) { if (!strcmp(buf, "scsi")) type = IF_SCSI; else if (!strcmp(buf, "virtio")) { type = IF_VIRTIO; } else { monitor_printf(mon, "type %s not a hotpluggable PCI device.\n", buf); return NULL; } } else { monitor_printf(mon, "no if= specified\n"); return NULL; } if (get_param_value(buf, sizeof(buf), "file", opts)) { dinfo = add_init_drive(opts); if (!dinfo) return NULL; if (dinfo->devaddr) { monitor_printf(mon, "Parameter addr not supported\n"); return NULL; } } else { dinfo = NULL; } bus = pci_get_bus_devfn(&devfn, devaddr); if (!bus) { monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); return NULL; } if (!((BusState*)bus)->allow_hotplug) { monitor_printf(mon, "PCI bus doesn't support hotplug\n"); return NULL; } switch (type) { case IF_SCSI: dev = pci_create(bus, devfn, "lsi53c895a"); if (qdev_init(&dev->qdev) < 0) dev = NULL; if (dev && dinfo) { if (scsi_hot_add(mon, &dev->qdev, dinfo, 0) != 0) { qdev_unplug(&dev->qdev, NULL); dev = NULL; } } break; case IF_VIRTIO: if (!dinfo) { monitor_printf(mon, "virtio requires a backing file/device.\n"); return NULL; } dev = pci_create(bus, devfn, "virtio-blk-pci"); if (qdev_prop_set_drive(&dev->qdev, "drive", dinfo->bdrv) < 0) { qdev_free(&dev->qdev); dev = NULL; break; } if (qdev_init(&dev->qdev) < 0) dev = NULL; break; default: dev = NULL; } return dev; }
static PCIDevice *qemu_pci_hot_add_storage(Monitor *mon, const char *devaddr, const char *opts) { PCIDevice *dev; DriveInfo *dinfo = NULL; int type = -1; char buf[128]; PCIBus *root = pci_find_primary_bus(); PCIBus *bus; int devfn; if (get_param_value(buf, sizeof(buf), "if", opts)) { if (!strcmp(buf, "scsi")) type = IF_SCSI; else if (!strcmp(buf, "virtio")) { type = IF_VIRTIO; } else { monitor_printf(mon, "type %s not a hotpluggable PCI device.\n", buf); return NULL; } } else { monitor_printf(mon, "no if= specified\n"); return NULL; } if (get_param_value(buf, sizeof(buf), "file", opts)) { dinfo = add_init_drive(opts); if (!dinfo) return NULL; if (dinfo->devaddr) { monitor_printf(mon, "Parameter addr not supported\n"); return NULL; } } else { dinfo = NULL; } if (!root) { monitor_printf(mon, "no primary PCI bus (if there are multiple" " PCI roots, you must use device_add instead)"); return NULL; } bus = pci_get_bus_devfn(&devfn, root, devaddr); if (!bus) { monitor_printf(mon, "Invalid PCI device address %s\n", devaddr); return NULL; } if (!qbus_is_hotpluggable(BUS(bus))) { monitor_printf(mon, "PCI bus doesn't support hotplug\n"); return NULL; } switch (type) { case IF_SCSI: dev = pci_create(bus, devfn, "lsi53c895a"); if (qdev_init(&dev->qdev) < 0) dev = NULL; if (dev && dinfo) { if (scsi_hot_add(mon, &dev->qdev, dinfo, 0) != 0) { qdev_unplug(&dev->qdev, NULL); dev = NULL; } } break; case IF_VIRTIO: if (!dinfo) { monitor_printf(mon, "virtio requires a backing file/device.\n"); return NULL; } dev = pci_create(bus, devfn, "virtio-blk-pci"); if (qdev_prop_set_drive(&dev->qdev, "drive", blk_by_legacy_dinfo(dinfo)) < 0) { object_unparent(OBJECT(dev)); dev = NULL; break; } if (qdev_init(&dev->qdev) < 0) dev = NULL; break; default: dev = NULL; } return dev; }
static void at91sam9_init(ram_addr_t ram_size, const char *boot_device, const char *kernel_filename, const char *kernel_cmdline, const char *initrd_filename, const char *cpu_model) { CPUState *env; DriveInfo *dinfo; struct at91sam9_state *sam9; int iomemtype; qemu_irq *cpu_pic; qemu_irq pic[32]; qemu_irq pic1[32]; DeviceState *dev; DeviceState *pit; DeviceState *pmc; DeviceState *spi; int i; int bms; SPIControl *cs0_spi_handler; cs0_spi_handler = qemu_mallocz(sizeof(SPIControl)); DEBUG("begin, ram_size %llu, boot dev %s\n", (unsigned long long)ram_size, boot_device ? boot_device : "<empty>"); if (option_rom[0] && boot_device[0] == 'n') { printf("Emulate ROM code\n"); bms = 1; } else { printf("Emulate start from EBI0_NCS0\n"); bms = 0; } #ifdef TRACE_ON trace_file = fopen("/tmp/trace.log", "w"); #endif if (!cpu_model) cpu_model = "arm926"; env = cpu_init(cpu_model); if (!env) { fprintf(stderr, "Unable to find CPU definition\n"); exit(EXIT_FAILURE); } /* SDRAM at chipselect 1. */ cpu_register_physical_memory(AT91SAM9263EK_SDRAM_OFF, AT91SAM9263EK_SDRAM_SIZE, qemu_ram_alloc(AT91SAM9263EK_SDRAM_SIZE) | IO_MEM_RAM); sam9 = (struct at91sam9_state *)qemu_mallocz(sizeof(*sam9)); if (!sam9) { fprintf(stderr, "allocation failed\n"); exit(EXIT_FAILURE); } sam9->env = env; /* Internal SRAM */ sam9->internal_sram = qemu_ram_alloc(80 * 1024); cpu_register_physical_memory(0x00300000, 80 * 1024, sam9->internal_sram | IO_MEM_RAM); sam9->bootrom = qemu_ram_alloc(0x100000); cpu_register_physical_memory(0x00400000, 0x100000, sam9->bootrom | IO_MEM_RAM); if (option_rom[0]) { sam9->rom_size = load_image_targphys(option_rom[0], 0x00400000, 0x100000); printf("load bootrom, size %d\n", sam9->rom_size); } /*Internal Peripherals */ iomemtype = cpu_register_io_memory(at91_periph_readfn, at91_periph_writefn, sam9); cpu_register_physical_memory(0xF0000000, 0xFFFFFFFF - 0xF0000000, iomemtype); cpu_pic = arm_pic_init_cpu(env); dev = sysbus_create_varargs("at91,aic", AT91_AIC_BASE, cpu_pic[ARM_PIC_CPU_IRQ], cpu_pic[ARM_PIC_CPU_FIQ], NULL); for (i = 0; i < 32; i++) { pic[i] = qdev_get_gpio_in(dev, i); } dev = sysbus_create_simple("at91,intor", -1, pic[1]); for (i = 0; i < 32; i++) { pic1[i] = qdev_get_gpio_in(dev, i); } sysbus_create_simple("at91,dbgu", AT91_DBGU_BASE, pic1[0]); pmc = sysbus_create_simple("at91,pmc", AT91_PMC_BASE, pic1[1]); qdev_prop_set_uint32(pmc, "mo_freq", 16000000); pit = sysbus_create_simple("at91,pit", AT91_PITC_BASE, pic1[3]); sysbus_create_varargs("at91,tc", AT91_TC012_BASE, pic[19], pic[19], pic[19], NULL); spi = sysbus_create_simple("at91,spi", AT91_SPI0_BASE, pic[14]); at91_init_bus_matrix(sam9); memset(&sam9->ccfg_regs, 0, sizeof(sam9->ccfg_regs)); sysbus_create_simple("at91,pio", AT91_PIOA_BASE, pic[2]); sysbus_create_simple("at91,pio", AT91_PIOB_BASE, pic[3]); sysbus_create_simple("at91,pio", AT91_PIOC_BASE, pic[4]); sysbus_create_simple("at91,pio", AT91_PIOD_BASE, pic[4]); sysbus_create_simple("at91,pio", AT91_PIOE_BASE, pic[4]); sysbus_create_varargs("at91,rstc", AT91_RSTC_BASE, NULL); memset(&sam9->sdramc0_regs, 0, sizeof(sam9->sdramc0_regs)); memset(&sam9->smc0_regs, 0, sizeof(sam9->smc0_regs)); memset(sam9->usart0_regs, 0, sizeof(sam9->usart0_regs)); qemu_check_nic_model(&nd_table[0], "at91"); dev = qdev_create(NULL, "at91,emac"); dev->nd = &nd_table[0]; qdev_init(dev); sysbus_mmio_map(sysbus_from_qdev(dev), 0, AT91_EMAC_BASE); sysbus_connect_irq(sysbus_from_qdev(dev), 0, pic[21]); sysbus_create_simple("at91,lcdc", AT91_LCDC_BASE, pic[26]); /* we use variant of booting from external memory (NOR FLASH), it mapped to 0x0 at start, and also it is accessable from 0x10000000 address */ dinfo = drive_get(IF_PFLASH, 0, 0); if (dinfo) { if (bms) { NANDFlashState *nand_state; if (spi_flash_register(dinfo->bdrv, 4 * 1024 * 1024, cs0_spi_handler) < 0) { fprintf(stderr, "init of spi flash failed\n"); exit(EXIT_FAILURE); } qdev_prop_set_ptr(spi, "spi_control", cs0_spi_handler); //rom cpu_register_physical_memory(0x0, 100 * 1024, sam9->bootrom | IO_MEM_ROMD); nand_state = nand_init(NAND_MFR_MICRON, 0xba); at91_nand_register(nand_state); } else { //nor flash ram_addr_t nor_flash_mem = qemu_ram_alloc(NOR_FLASH_SIZE); if (!nor_flash_mem) { fprintf(stderr, "allocation failed\n"); exit(EXIT_FAILURE); } sam9->norflash = pflash_cfi_atmel_register(AT91SAM9263EK_NORFLASH_OFF, nor_flash_mem, dinfo->bdrv, 4 * 1024 * 2, 8, 32 * 1024 * 2, (135 - 8), 2, 0x001F, 0x01D6, 0, 0); if (!sam9->norflash) { fprintf(stderr, "qemu: error registering flash memory.\n"); exit(EXIT_FAILURE); } DEBUG("register flash at 0x0\n"); //register only part of flash, to prevent conflict with internal sram cpu_register_physical_memory(0x0, 100 * 1024, nor_flash_mem | IO_MEM_ROMD); } } else { fprintf(stderr, "qemu: can not start without flash.\n"); exit(EXIT_FAILURE); } g_env = env; env->regs[15] = 0x0; }