mirror of https://github.com/xqemu/xqemu.git
ide: qdev properties for disk geometry
Geometry needs to be qdev properties, because it belongs to the disk's guest part. Maintain backward compatibility exactly like for serial: fall back to DriveInfo's geometry, set with -drive cyls=... Do this only for ide-hd. ide-drive is legacy. ide-cd doesn't have a geometry. Bonus: info qtree now shows the geometry. Signed-off-by: Markus Armbruster <armbru@redhat.com> Signed-off-by: Kevin Wolf <kwolf@redhat.com>
This commit is contained in:
parent
e63e7fde24
commit
ba801960db
|
@ -1925,16 +1925,16 @@ static const BlockDevOps ide_cd_block_ops = {
|
|||
|
||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
||||
const char *version, const char *serial, const char *model,
|
||||
uint64_t wwn)
|
||||
uint64_t wwn,
|
||||
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
||||
int chs_trans)
|
||||
{
|
||||
uint32_t cylinders, heads, secs;
|
||||
uint64_t nb_sectors;
|
||||
|
||||
s->bs = bs;
|
||||
s->drive_kind = kind;
|
||||
|
||||
bdrv_get_geometry(bs, &nb_sectors);
|
||||
hd_geometry_guess(bs, &cylinders, &heads, &secs, &s->chs_trans);
|
||||
if (cylinders < 1 || cylinders > 16383) {
|
||||
error_report("cyls must be between 1 and 16383");
|
||||
return -1;
|
||||
|
@ -1950,6 +1950,7 @@ int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
|||
s->cylinders = cylinders;
|
||||
s->heads = heads;
|
||||
s->sectors = secs;
|
||||
s->chs_trans = chs_trans;
|
||||
s->nb_sectors = nb_sectors;
|
||||
s->wwn = wwn;
|
||||
/* The SMART values should be preserved across power cycles
|
||||
|
@ -2076,17 +2077,25 @@ void ide_init2(IDEBus *bus, qemu_irq irq)
|
|||
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
|
||||
DriveInfo *hd1, qemu_irq irq)
|
||||
{
|
||||
int i;
|
||||
int i, trans;
|
||||
DriveInfo *dinfo;
|
||||
uint32_t cyls, heads, secs;
|
||||
|
||||
for(i = 0; i < 2; i++) {
|
||||
dinfo = i == 0 ? hd0 : hd1;
|
||||
ide_init1(bus, i);
|
||||
if (dinfo) {
|
||||
cyls = dinfo->cyls;
|
||||
heads = dinfo->heads;
|
||||
secs = dinfo->secs;
|
||||
trans = dinfo->trans;
|
||||
if (!cyls && !heads && !secs) {
|
||||
hd_geometry_guess(dinfo->bdrv, &cyls, &heads, &secs, &trans);
|
||||
}
|
||||
if (ide_init_drive(&bus->ifs[i], dinfo->bdrv,
|
||||
dinfo->media_cd ? IDE_CD : IDE_HD, NULL,
|
||||
*dinfo->serial ? dinfo->serial : NULL,
|
||||
NULL, 0) < 0) {
|
||||
NULL, 0, cyls, heads, secs, trans) < 0) {
|
||||
error_report("Can't set up IDE drive %s", dinfo->id);
|
||||
exit(1);
|
||||
}
|
||||
|
|
|
@ -545,7 +545,9 @@ uint32_t ide_data_readl(void *opaque, uint32_t addr);
|
|||
|
||||
int ide_init_drive(IDEState *s, BlockDriverState *bs, IDEDriveKind kind,
|
||||
const char *version, const char *serial, const char *model,
|
||||
uint64_t wwn);
|
||||
uint64_t wwn,
|
||||
uint32_t cylinders, uint32_t heads, uint32_t secs,
|
||||
int chs_trans);
|
||||
void ide_init2(IDEBus *bus, qemu_irq irq);
|
||||
void ide_init2_with_non_qdev_drives(IDEBus *bus, DriveInfo *hd0,
|
||||
DriveInfo *hd1, qemu_irq irq);
|
||||
|
|
|
@ -21,6 +21,7 @@
|
|||
#include "qemu-error.h"
|
||||
#include <hw/ide/internal.h>
|
||||
#include "blockdev.h"
|
||||
#include "hw/block-common.h"
|
||||
#include "sysemu.h"
|
||||
|
||||
/* --------------------------------- */
|
||||
|
@ -143,6 +144,7 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
|
|||
IDEState *s = bus->ifs + dev->unit;
|
||||
const char *serial;
|
||||
DriveInfo *dinfo;
|
||||
int trans;
|
||||
|
||||
if (dev->conf.discard_granularity && dev->conf.discard_granularity != 512) {
|
||||
error_report("discard_granularity must be 512 for ide");
|
||||
|
@ -158,8 +160,25 @@ static int ide_dev_initfn(IDEDevice *dev, IDEDriveKind kind)
|
|||
}
|
||||
}
|
||||
|
||||
trans = BIOS_ATA_TRANSLATION_AUTO;
|
||||
if (!dev->conf.cyls && !dev->conf.heads && !dev->conf.secs) {
|
||||
/* try to fall back to value set with legacy -drive cyls=... */
|
||||
dinfo = drive_get_by_blockdev(dev->conf.bs);
|
||||
dev->conf.cyls = dinfo->cyls;
|
||||
dev->conf.heads = dinfo->heads;
|
||||
dev->conf.secs = dinfo->secs;
|
||||
trans = dinfo->trans;
|
||||
}
|
||||
if (!dev->conf.cyls && !dev->conf.heads && !dev->conf.secs) {
|
||||
hd_geometry_guess(dev->conf.bs,
|
||||
&dev->conf.cyls, &dev->conf.heads, &dev->conf.secs,
|
||||
&trans);
|
||||
}
|
||||
|
||||
if (ide_init_drive(s, dev->conf.bs, kind,
|
||||
dev->version, serial, dev->model, dev->wwn) < 0) {
|
||||
dev->version, serial, dev->model, dev->wwn,
|
||||
dev->conf.cyls, dev->conf.heads, dev->conf.secs,
|
||||
trans) < 0) {
|
||||
return -1;
|
||||
}
|
||||
|
||||
|
@ -202,6 +221,7 @@ static int ide_drive_initfn(IDEDevice *dev)
|
|||
|
||||
static Property ide_hd_properties[] = {
|
||||
DEFINE_IDE_DEV_PROPERTIES(),
|
||||
DEFINE_BLOCK_CHS_PROPERTIES(IDEDrive, dev.conf),
|
||||
DEFINE_PROP_END_OF_LIST(),
|
||||
};
|
||||
|
||||
|
|
Loading…
Reference in New Issue