fdc: add drive type qapi enum

Change the floppy drive type to a QAPI enum type, to allow us to
specify the floppy drive type from the CLI in a forthcoming patch.

Reviewed-by: Eric Blake <eblake@redhat.com>
Signed-off-by: John Snow <jsnow@redhat.com>
Message-id: 1453495865-9649-4-git-send-email-jsnow@redhat.com
This commit is contained in:
John Snow 2016-01-22 15:50:56 -05:00
parent 21862658fd
commit 2da44dd0c6
4 changed files with 66 additions and 56 deletions

View File

@ -61,7 +61,7 @@ typedef enum FDriveRate {
} FDriveRate; } FDriveRate;
typedef struct FDFormat { typedef struct FDFormat {
FDriveType drive; FloppyDriveType drive;
uint8_t last_sect; uint8_t last_sect;
uint8_t max_track; uint8_t max_track;
uint8_t max_head; uint8_t max_head;
@ -71,48 +71,48 @@ typedef struct FDFormat {
static const FDFormat fd_formats[] = { static const FDFormat fd_formats[] = {
/* First entry is default format */ /* First entry is default format */
/* 1.44 MB 3"1/2 floppy disks */ /* 1.44 MB 3"1/2 floppy disks */
{ FDRIVE_DRV_144, 18, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 18, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 20, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 20, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 21, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 21, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 21, 82, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 21, 82, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 21, 83, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 21, 83, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 22, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 22, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 23, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 23, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_144, 24, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_144, 24, 80, 1, FDRIVE_RATE_500K, },
/* 2.88 MB 3"1/2 floppy disks */ /* 2.88 MB 3"1/2 floppy disks */
{ FDRIVE_DRV_288, 36, 80, 1, FDRIVE_RATE_1M, }, { FLOPPY_DRIVE_TYPE_288, 36, 80, 1, FDRIVE_RATE_1M, },
{ FDRIVE_DRV_288, 39, 80, 1, FDRIVE_RATE_1M, }, { FLOPPY_DRIVE_TYPE_288, 39, 80, 1, FDRIVE_RATE_1M, },
{ FDRIVE_DRV_288, 40, 80, 1, FDRIVE_RATE_1M, }, { FLOPPY_DRIVE_TYPE_288, 40, 80, 1, FDRIVE_RATE_1M, },
{ FDRIVE_DRV_288, 44, 80, 1, FDRIVE_RATE_1M, }, { FLOPPY_DRIVE_TYPE_288, 44, 80, 1, FDRIVE_RATE_1M, },
{ FDRIVE_DRV_288, 48, 80, 1, FDRIVE_RATE_1M, }, { FLOPPY_DRIVE_TYPE_288, 48, 80, 1, FDRIVE_RATE_1M, },
/* 720 kB 3"1/2 floppy disks */ /* 720 kB 3"1/2 floppy disks */
{ FDRIVE_DRV_144, 9, 80, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 9, 80, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_144, 10, 80, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 10, 80, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_144, 10, 82, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 10, 82, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_144, 10, 83, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 10, 83, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_144, 13, 80, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 13, 80, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_144, 14, 80, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 14, 80, 1, FDRIVE_RATE_250K, },
/* 1.2 MB 5"1/4 floppy disks */ /* 1.2 MB 5"1/4 floppy disks */
{ FDRIVE_DRV_120, 15, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_120, 15, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_120, 18, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_120, 18, 80, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_120, 18, 82, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_120, 18, 82, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_120, 18, 83, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_120, 18, 83, 1, FDRIVE_RATE_500K, },
{ FDRIVE_DRV_120, 20, 80, 1, FDRIVE_RATE_500K, }, { FLOPPY_DRIVE_TYPE_120, 20, 80, 1, FDRIVE_RATE_500K, },
/* 720 kB 5"1/4 floppy disks */ /* 720 kB 5"1/4 floppy disks */
{ FDRIVE_DRV_120, 9, 80, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_120, 9, 80, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_120, 11, 80, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_120, 11, 80, 1, FDRIVE_RATE_250K, },
/* 360 kB 5"1/4 floppy disks */ /* 360 kB 5"1/4 floppy disks */
{ FDRIVE_DRV_120, 9, 40, 1, FDRIVE_RATE_300K, }, { FLOPPY_DRIVE_TYPE_120, 9, 40, 1, FDRIVE_RATE_300K, },
{ FDRIVE_DRV_120, 9, 40, 0, FDRIVE_RATE_300K, }, { FLOPPY_DRIVE_TYPE_120, 9, 40, 0, FDRIVE_RATE_300K, },
{ FDRIVE_DRV_120, 10, 41, 1, FDRIVE_RATE_300K, }, { FLOPPY_DRIVE_TYPE_120, 10, 41, 1, FDRIVE_RATE_300K, },
{ FDRIVE_DRV_120, 10, 42, 1, FDRIVE_RATE_300K, }, { FLOPPY_DRIVE_TYPE_120, 10, 42, 1, FDRIVE_RATE_300K, },
/* 320 kB 5"1/4 floppy disks */ /* 320 kB 5"1/4 floppy disks */
{ FDRIVE_DRV_120, 8, 40, 1, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_120, 8, 40, 1, FDRIVE_RATE_250K, },
{ FDRIVE_DRV_120, 8, 40, 0, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_120, 8, 40, 0, FDRIVE_RATE_250K, },
/* 360 kB must match 5"1/4 better than 3"1/2... */ /* 360 kB must match 5"1/4 better than 3"1/2... */
{ FDRIVE_DRV_144, 9, 80, 0, FDRIVE_RATE_250K, }, { FLOPPY_DRIVE_TYPE_144, 9, 80, 0, FDRIVE_RATE_250K, },
/* end */ /* end */
{ FDRIVE_DRV_NONE, -1, -1, 0, 0, }, { FLOPPY_DRIVE_TYPE_NONE, -1, -1, 0, 0, },
}; };
#define GET_CUR_DRV(fdctrl) ((fdctrl)->cur_drv) #define GET_CUR_DRV(fdctrl) ((fdctrl)->cur_drv)
@ -134,7 +134,7 @@ typedef struct FDrive {
FDCtrl *fdctrl; FDCtrl *fdctrl;
BlockBackend *blk; BlockBackend *blk;
/* Drive status */ /* Drive status */
FDriveType drive; FloppyDriveType drive; /* CMOS drive type */
uint8_t perpendicular; /* 2.88 MB access mode */ uint8_t perpendicular; /* 2.88 MB access mode */
/* Position */ /* Position */
uint8_t head; uint8_t head;
@ -155,7 +155,7 @@ typedef struct FDrive {
static void fd_init(FDrive *drv) static void fd_init(FDrive *drv)
{ {
/* Drive */ /* Drive */
drv->drive = FDRIVE_DRV_NONE; drv->drive = FLOPPY_DRIVE_TYPE_NONE;
drv->perpendicular = 0; drv->perpendicular = 0;
/* Disk */ /* Disk */
drv->last_sect = 0; drv->last_sect = 0;
@ -254,11 +254,11 @@ static void pick_geometry(FDrive *drv)
first_match = -1; first_match = -1;
for (i = 0; ; i++) { for (i = 0; ; i++) {
parse = &fd_formats[i]; parse = &fd_formats[i];
if (parse->drive == FDRIVE_DRV_NONE) { if (parse->drive == FLOPPY_DRIVE_TYPE_NONE) {
break; break;
} }
if (drv->drive == parse->drive || if (drv->drive == parse->drive ||
drv->drive == FDRIVE_DRV_NONE) { drv->drive == FLOPPY_DRIVE_TYPE_NONE) {
size = (parse->max_head + 1) * parse->max_track * size = (parse->max_head + 1) * parse->max_track *
parse->last_sect; parse->last_sect;
if (nb_sectors == size) { if (nb_sectors == size) {
@ -2397,7 +2397,7 @@ static void sysbus_fdc_common_realize(DeviceState *dev, Error **errp)
fdctrl_realize_common(fdctrl, errp); fdctrl_realize_common(fdctrl, errp);
} }
FDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i) FloppyDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i)
{ {
FDCtrlISABus *isa = ISA_FDC(fdc); FDCtrlISABus *isa = ISA_FDC(fdc);

View File

@ -199,24 +199,24 @@ static void pic_irq_request(void *opaque, int irq, int level)
#define REG_EQUIPMENT_BYTE 0x14 #define REG_EQUIPMENT_BYTE 0x14
static int cmos_get_fd_drive_type(FDriveType fd0) static int cmos_get_fd_drive_type(FloppyDriveType fd0)
{ {
int val; int val;
switch (fd0) { switch (fd0) {
case FDRIVE_DRV_144: case FLOPPY_DRIVE_TYPE_144:
/* 1.44 Mb 3"5 drive */ /* 1.44 Mb 3"5 drive */
val = 4; val = 4;
break; break;
case FDRIVE_DRV_288: case FLOPPY_DRIVE_TYPE_288:
/* 2.88 Mb 3"5 drive */ /* 2.88 Mb 3"5 drive */
val = 5; val = 5;
break; break;
case FDRIVE_DRV_120: case FLOPPY_DRIVE_TYPE_120:
/* 1.2 Mb 5"5 drive */ /* 1.2 Mb 5"5 drive */
val = 2; val = 2;
break; break;
case FDRIVE_DRV_NONE: case FLOPPY_DRIVE_TYPE_NONE:
default: default:
val = 0; val = 0;
break; break;
@ -287,7 +287,8 @@ static void pc_boot_set(void *opaque, const char *boot_device, Error **errp)
static void pc_cmos_init_floppy(ISADevice *rtc_state, ISADevice *floppy) static void pc_cmos_init_floppy(ISADevice *rtc_state, ISADevice *floppy)
{ {
int val, nb, i; int val, nb, i;
FDriveType fd_type[2] = { FDRIVE_DRV_NONE, FDRIVE_DRV_NONE }; FloppyDriveType fd_type[2] = { FLOPPY_DRIVE_TYPE_NONE,
FLOPPY_DRIVE_TYPE_NONE };
/* floppy type */ /* floppy type */
if (floppy) { if (floppy) {
@ -301,10 +302,10 @@ static void pc_cmos_init_floppy(ISADevice *rtc_state, ISADevice *floppy)
val = rtc_get_memory(rtc_state, REG_EQUIPMENT_BYTE); val = rtc_get_memory(rtc_state, REG_EQUIPMENT_BYTE);
nb = 0; nb = 0;
if (fd_type[0] < FDRIVE_DRV_NONE) { if (fd_type[0] != FLOPPY_DRIVE_TYPE_NONE) {
nb++; nb++;
} }
if (fd_type[1] < FDRIVE_DRV_NONE) { if (fd_type[1] != FLOPPY_DRIVE_TYPE_NONE) {
nb++; nb++;
} }
switch (nb) { switch (nb) {

View File

@ -6,13 +6,6 @@
/* fdc.c */ /* fdc.c */
#define MAX_FD 2 #define MAX_FD 2
typedef enum FDriveType {
FDRIVE_DRV_144 = 0x00, /* 1.44 MB 3"5 drive */
FDRIVE_DRV_288 = 0x01, /* 2.88 MB 3"5 drive */
FDRIVE_DRV_120 = 0x02, /* 1.2 MB 5"25 drive */
FDRIVE_DRV_NONE = 0x03, /* No drive connected */
} FDriveType;
#define TYPE_ISA_FDC "isa-fdc" #define TYPE_ISA_FDC "isa-fdc"
ISADevice *fdctrl_init_isa(ISABus *bus, DriveInfo **fds); ISADevice *fdctrl_init_isa(ISABus *bus, DriveInfo **fds);
@ -21,6 +14,6 @@ void fdctrl_init_sysbus(qemu_irq irq, int dma_chann,
void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base, void sun4m_fdctrl_init(qemu_irq irq, hwaddr io_base,
DriveInfo **fds, qemu_irq *fdc_tc); DriveInfo **fds, qemu_irq *fdc_tc);
FDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i); FloppyDriveType isa_fdc_get_drive_type(ISADevice *fdc, int i);
#endif #endif

View File

@ -39,6 +39,22 @@
{ 'enum': 'BiosAtaTranslation', { 'enum': 'BiosAtaTranslation',
'data': ['auto', 'none', 'lba', 'large', 'rechs']} 'data': ['auto', 'none', 'lba', 'large', 'rechs']}
##
# @FloppyDriveType
#
# Type of Floppy drive to be emulated by the Floppy Disk Controller.
#
# @144: 1.44MB 3.5" drive
# @288: 2.88MB 3.5" drive
# @120: 1.2MB 5.25" drive
# @none: No drive connected
# @auto: Automatically determined by inserted media at boot
#
# Since: 2.6
##
{ 'enum': 'FloppyDriveType',
'data': ['144', '288', '120', 'none', 'auto']}
## ##
# @BlockdevSnapshotInternal # @BlockdevSnapshotInternal
# #