Lines Matching +full:dev +full:- +full:ctrl
4 * Copyright (c) 2014-2018 Laurent Vivier <laurent@vivier.eu>
7 * the COPYING file in the top-level directory.
14 #include "qemu/main-loop.h"
16 #include "system/block-backend.h"
21 #include "hw/qdev-properties.h"
155 blk_set_perm(drive->blk, 0, BLK_PERM_ALL, &error_abort); in swim_change_cb()
157 if (!blkconf_apply_backend_options(drive->conf, in swim_change_cb()
158 !blk_supports_write_perm(drive->blk), in swim_change_cb()
170 DEFINE_PROP_INT32("unit", SWIMDrive, unit, -1),
176 SWIMDrive *dev = SWIM_DRIVE(qdev); in swim_drive_realize() local
177 SWIMBus *bus = SWIM_BUS(qdev->parent_bus); in swim_drive_realize()
181 if (dev->unit == -1) { in swim_drive_realize()
182 for (dev->unit = 0; dev->unit < SWIM_MAX_FD; dev->unit++) { in swim_drive_realize()
183 drive = &bus->ctrl->drives[dev->unit]; in swim_drive_realize()
184 if (!drive->blk) { in swim_drive_realize()
190 if (dev->unit >= SWIM_MAX_FD) { in swim_drive_realize()
192 "only %d units", dev->unit, SWIM_MAX_FD); in swim_drive_realize()
196 drive = &bus->ctrl->drives[dev->unit]; in swim_drive_realize()
197 if (drive->blk) { in swim_drive_realize()
198 error_setg(errp, "Floppy unit %d is in use", dev->unit); in swim_drive_realize()
202 if (!dev->conf.blk) { in swim_drive_realize()
204 dev->conf.blk = blk_new(qemu_get_aio_context(), 0, BLK_PERM_ALL); in swim_drive_realize()
205 ret = blk_attach_dev(dev->conf.blk, qdev); in swim_drive_realize()
209 if (!blkconf_blocksizes(&dev->conf, errp)) { in swim_drive_realize()
213 if (dev->conf.logical_block_size != 512 || in swim_drive_realize()
214 dev->conf.physical_block_size != 512) in swim_drive_realize()
226 dev->conf.rerror = BLOCKDEV_ON_ERROR_AUTO; in swim_drive_realize()
227 dev->conf.werror = BLOCKDEV_ON_ERROR_AUTO; in swim_drive_realize()
229 if (!blkconf_apply_backend_options(&dev->conf, in swim_drive_realize()
230 !blk_supports_write_perm(dev->conf.blk), in swim_drive_realize()
236 * 'enospc' is the default for -drive, 'report' is what blk_new() gives us in swim_drive_realize()
239 if (blk_get_on_error(dev->conf.blk, 0) != BLOCKDEV_ON_ERROR_ENOSPC && in swim_drive_realize()
240 blk_get_on_error(dev->conf.blk, 0) != BLOCKDEV_ON_ERROR_REPORT) { in swim_drive_realize()
244 if (blk_get_on_error(dev->conf.blk, 1) != BLOCKDEV_ON_ERROR_REPORT) { in swim_drive_realize()
249 drive->conf = &dev->conf; in swim_drive_realize()
250 drive->blk = dev->conf.blk; in swim_drive_realize()
251 drive->swimctrl = bus->ctrl; in swim_drive_realize()
253 blk_set_dev_ops(drive->blk, &swim_block_ops, drive); in swim_drive_realize()
259 k->realize = swim_drive_realize; in swim_drive_class_init()
260 set_bit(DEVICE_CATEGORY_STORAGE, k->categories); in swim_drive_class_init()
261 k->bus_type = TYPE_SWIM_BUS; in swim_drive_class_init()
263 k->desc = "virtual SWIM drive"; in swim_drive_class_init()
287 /* A3-A1 select a latch, A0 specifies the value */ in iwmctrl_write()
290 swimctrl->iwm_latches |= (1 << latch); in iwmctrl_write()
292 swimctrl->iwm_latches &= ~(1 << latch); in iwmctrl_write()
295 reg = (swimctrl->iwm_latches & 0xc0) >> 5 | in iwmctrl_write()
296 (swimctrl->iwm_latches & 0x10) >> 4; in iwmctrl_write()
298 swimctrl->iwmregs[reg] = value; in iwmctrl_write()
306 switch (swimctrl->iwm_switch) { in iwmctrl_write()
309 swimctrl->iwm_switch++; in iwmctrl_write()
314 swimctrl->iwm_switch++; in iwmctrl_write()
319 swimctrl->iwm_switch++; in iwmctrl_write()
324 swimctrl->iwm_switch++; in iwmctrl_write()
326 swimctrl->mode = SWIM_MODE_ISM; in iwmctrl_write()
327 swimctrl->swim_mode |= (1 << SWIM_MODE_STATUS_BIT); in iwmctrl_write()
328 swimctrl->iwm_switch = 0; in iwmctrl_write()
332 memory_region_del_subregion(&swimctrl->swim, &swimctrl->iwm); in iwmctrl_write()
333 memory_region_add_subregion(&swimctrl->swim, 0x0, in iwmctrl_write()
334 &swimctrl->ism); in iwmctrl_write()
351 /* A3-A1 select a latch, A0 specifies the value */ in iwmctrl_read()
354 swimctrl->iwm_latches |= (1 << latch); in iwmctrl_read()
356 swimctrl->iwm_latches &= ~(1 << latch); in iwmctrl_read()
359 reg = (swimctrl->iwm_latches & 0xc0) >> 5 | in iwmctrl_read()
360 (swimctrl->iwm_latches & 0x10) >> 4; in iwmctrl_read()
392 swimctrl->swim_phase = value; in ismctrl_write()
395 swimctrl->swim_mode &= ~value; in ismctrl_write()
397 swimctrl->pram_idx = 0; in ismctrl_write()
399 if (!(swimctrl->swim_mode & (1 << SWIM_MODE_STATUS_BIT))) { in ismctrl_write()
401 swimctrl->mode = SWIM_MODE_IWM; in ismctrl_write()
402 swimctrl->iwm_latches = 0; in ismctrl_write()
406 memory_region_del_subregion(&swimctrl->swim, &swimctrl->ism); in ismctrl_write()
407 memory_region_add_subregion(&swimctrl->swim, 0x0, in ismctrl_write()
408 &swimctrl->iwm); in ismctrl_write()
412 swimctrl->swim_mode |= value; in ismctrl_write()
415 swimctrl->pram[swimctrl->pram_idx++] = value; in ismctrl_write()
416 swimctrl->pram_idx &= 0xf; in ismctrl_write()
435 value = swimctrl->swim_phase; in ismctrl_read()
438 if (swimctrl->swim_phase == SWIM_DRIVE_PRESENT) { in ismctrl_read()
444 value = swimctrl->pram[swimctrl->pram_idx++]; in ismctrl_read()
445 swimctrl->pram_idx &= 0xf; in ismctrl_read()
448 value = swimctrl->swim_status & ~(1 << SWIM_MODE_STATUS_BIT); in ismctrl_read()
449 if (swimctrl->swim_mode == SWIM_MODE_ISM) { in ismctrl_read()
473 SWIMCtrl *ctrl = &sys->ctrl; in sysbus_swim_reset() local
476 ctrl->mode = 0; in sysbus_swim_reset()
477 ctrl->iwm_switch = 0; in sysbus_swim_reset()
478 memset(ctrl->iwmregs, 0, sizeof(ctrl->iwmregs)); in sysbus_swim_reset()
480 ctrl->swim_phase = 0; in sysbus_swim_reset()
481 ctrl->swim_mode = 0; in sysbus_swim_reset()
482 memset(ctrl->ismregs, 0, sizeof(ctrl->ismregs)); in sysbus_swim_reset()
484 fd_recalibrate(&ctrl->drives[i]); in sysbus_swim_reset()
492 SWIMCtrl *swimctrl = &sbs->ctrl; in sysbus_swim_init()
494 memory_region_init(&swimctrl->swim, obj, "swim", 0x2000); in sysbus_swim_init()
495 memory_region_init_io(&swimctrl->iwm, obj, &swimctrl_iwm_ops, swimctrl, in sysbus_swim_init()
497 memory_region_init_io(&swimctrl->ism, obj, &swimctrl_ism_ops, swimctrl, in sysbus_swim_init()
499 sysbus_init_mmio(sbd, &swimctrl->swim); in sysbus_swim_init()
502 static void sysbus_swim_realize(DeviceState *dev, Error **errp) in sysbus_swim_realize() argument
504 Swim *sys = SWIM(dev); in sysbus_swim_realize()
505 SWIMCtrl *swimctrl = &sys->ctrl; in sysbus_swim_realize()
507 qbus_init(&swimctrl->bus, sizeof(SWIMBus), TYPE_SWIM_BUS, dev, NULL); in sysbus_swim_realize()
508 swimctrl->bus.ctrl = swimctrl; in sysbus_swim_realize()
511 memory_region_add_subregion(&swimctrl->swim, 0x0, &swimctrl->iwm); in sysbus_swim_realize()
548 VMSTATE_STRUCT(ctrl, Swim, 0, vmstate_swim, SWIMCtrl),
557 dc->realize = sysbus_swim_realize; in sysbus_swim_class_init()
559 dc->vmsd = &vmstate_sysbus_swim; in sysbus_swim_class_init()