Commit 1f56e32a authored by Markus Armbruster's avatar Markus Armbruster Committed by Kevin Wolf
Browse files

ide: Split qdev "ide-drive" into "ide-hd" and "ide-cd"



An "ide-drive" is either a hard disk or a CD-ROM, depending on the
associated BlockDriverState's type hint.  Unclean; disk vs. CD belongs
to the guest part, not the host part.

Have separate qdevs "ide-hd" and "ide-cd" to model disk vs. CD in
the guest part.

Keep ide-drive for backward compatibility.

"ide-disk" would perhaps be a nicer name than "ide-hd", but there's
already "scsi-disk", which is like "ide-drive", and will be likewise
split in the next commit.  {ide,scsi}-{hd,cd} is the best consistent
set of names I could find within the backward compatibility
straightjacket.

Signed-off-by: default avatarMarkus Armbruster <armbru@redhat.com>
Signed-off-by: default avatarKevin Wolf <kwolf@redhat.com>
parent 77a5a000
Loading
Loading
Loading
Loading
+7 −4
Original line number Diff line number Diff line
@@ -1592,13 +1592,15 @@ void ide_bus_reset(IDEBus *bus)
    bus->dma->ops->reset(bus->dma);
}

int ide_init_drive(IDEState *s, BlockDriverState *bs,
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
                   const char *version, const char *serial)
{
    int cylinders, heads, secs;
    uint64_t nb_sectors;

    s->bs = bs;
    s->drive_kind = kind;

    bdrv_get_geometry(bs, &nb_sectors);
    bdrv_guess_geometry(bs, &cylinders, &heads, &secs);
    if (cylinders < 1 || cylinders > 16383) {
@@ -1623,8 +1625,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs,
    s->smart_autosave = 1;
    s->smart_errors = 0;
    s->smart_selftest_count = 0;
    if (bdrv_get_type_hint(bs) == BDRV_TYPE_CDROM) {
        s->drive_kind = IDE_CD;
    if (kind == IDE_CD) {
        bdrv_set_change_cb(bs, cdrom_change_cb, s);
        bs->buffer_alignment = 2048;
    } else {
@@ -1729,7 +1730,9 @@ void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
        dinfo = i == 0 ? hd0 : hd1;
        ide_init1(bus, i);
        if (dinfo) {
            if (ide_init_drive(&bus->ifs[i], dinfo->bdrv, NULL,
            if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
                               bdrv_get_type_hint(dinfo->bdrv) == BDRV_TYPE_CDROM ? IDE_CD : IDE_HD,
                               NULL,
                               *dinfo->serial ? dinfo->serial : NULL) < 0) {
                error_report("Can't set up IDE drive %s", dinfo->id);
                exit(1);
+1 −1
Original line number Diff line number Diff line
@@ -558,7 +558,7 @@ uint32_t ide_data_readw(void *opaque, uint32_t addr);
void ide_data_writel(void *opaque, uint32_t addr, uint32_t val);
uint32_t ide_data_readl(void *opaque, uint32_t addr);

int ide_init_drive(IDEState *s, BlockDriverState *bs,
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
                   const char *version, const char *serial);
void ide_init2(IDEBus *bus, qemu_irq irq);
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
+66 −17
Original line number Diff line number Diff line
@@ -98,7 +98,9 @@ IDEDevice *ide_create_drive(IDEBus *bus, int unit, DriveInfo *drive)
{
    DeviceState *dev;

    dev = qdev_create(&bus->qbus, "ide-drive");
    dev = qdev_create(&bus->qbus,
                      bdrv_get_type_hint(drive->bdrv) == BDRV_TYPE_CDROM
                      ? "ide-cd" : "ide-hd");
    qdev_prop_set_uint32(dev, "unit", unit);
    qdev_prop_set_drive_nofail(dev, "drive", drive->bdrv);
    qdev_init_nofail(dev);
@@ -118,7 +120,7 @@ typedef struct IDEDrive {
    IDEDevice dev;
} IDEDrive;

static int ide_drive_initfn(IDEDevice *dev)
static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
{
    IDEBus *bus = DO_UPCAST(IDEBus, qbus, dev->qdev.parent_bus);
    IDEState *s = bus->ifs + dev->unit;
@@ -134,7 +136,7 @@ static int ide_drive_initfn(IDEDevice *dev)
        }
    }

    if (ide_init_drive(s, dev->conf.bs, dev->version, serial) < 0) {
    if (ide_init_drive(s, dev->conf.bs, kind, dev->version, serial) < 0) {
        return -1;
    }

@@ -151,22 +153,69 @@ static int ide_drive_initfn(IDEDevice *dev)
    return 0;
}

static IDEDeviceInfo ide_drive_info = {
    .qdev.name  = "ide-drive",
static int ide_hd_initfn(IDEDevice *dev)
{
    return ide_dev_initfn(dev, IDE_HD);
}

static int ide_cd_initfn(IDEDevice *dev)
{
    return ide_dev_initfn(dev, IDE_CD);
}

static int ide_drive_initfn(IDEDevice *dev)
{
    return ide_dev_initfn(dev,
                          bdrv_get_type_hint(dev->conf.bs) == BDRV_TYPE_CDROM
                          ? IDE_CD : IDE_HD);
}

#define DEFINE_IDE_DEV_PROPERTIES()                     \
    DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1), \
    DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf),        \
    DEFINE_PROP_STRING("ver",  IDEDrive, dev.version),  \
    DEFINE_PROP_STRING("serial",  IDEDrive, dev.serial)

static IDEDeviceInfo ide_dev_info[] = {
    {
        .qdev.name    = "ide-hd",
        .qdev.fw_name = "drive",
        .qdev.desc    = "virtual IDE disk",
        .qdev.size    = sizeof(IDEDrive),
        .init         = ide_hd_initfn,
        .qdev.props   = (Property[]) {
            DEFINE_IDE_DEV_PROPERTIES(),
            DEFINE_PROP_END_OF_LIST(),
        }
    },{
        .qdev.name    = "ide-cd",
        .qdev.fw_name = "drive",
        .qdev.desc    = "virtual IDE CD-ROM",
        .qdev.size    = sizeof(IDEDrive),
        .init         = ide_cd_initfn,
        .qdev.props   = (Property[]) {
            DEFINE_IDE_DEV_PROPERTIES(),
            DEFINE_PROP_END_OF_LIST(),
        }
    },{
        .qdev.name    = "ide-drive", /* legacy -device ide-drive */
        .qdev.fw_name = "drive",
        .qdev.desc    = "virtual IDE disk or CD-ROM (legacy)",
        .qdev.size    = sizeof(IDEDrive),
        .init         = ide_drive_initfn,
        .qdev.props   = (Property[]) {
        DEFINE_PROP_UINT32("unit", IDEDrive, dev.unit, -1),
        DEFINE_BLOCK_PROPERTIES(IDEDrive, dev.conf),
        DEFINE_PROP_STRING("ver",  IDEDrive, dev.version),
        DEFINE_PROP_STRING("serial",  IDEDrive, dev.serial),
            DEFINE_IDE_DEV_PROPERTIES(),
            DEFINE_PROP_END_OF_LIST(),
        }
    }
};

static void ide_drive_register(void)
static void ide_dev_register(void)
{
    ide_qdev_register(&ide_drive_info);
    int i;

    for (i = 0; i < ARRAY_SIZE(ide_dev_info); i++) {
        ide_qdev_register(&ide_dev_info[i]);
    }
}
device_init(ide_drive_register);
device_init(ide_dev_register);