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:
		
							parent
							
								
									21862658fd
								
							
						
					
					
						commit
						2da44dd0c6
					
				@ -61,7 +61,7 @@ typedef enum FDriveRate {
 | 
			
		||||
} FDriveRate;
 | 
			
		||||
 | 
			
		||||
typedef struct FDFormat {
 | 
			
		||||
    FDriveType drive;
 | 
			
		||||
    FloppyDriveType drive;
 | 
			
		||||
    uint8_t last_sect;
 | 
			
		||||
    uint8_t max_track;
 | 
			
		||||
    uint8_t max_head;
 | 
			
		||||
@ -71,48 +71,48 @@ typedef struct FDFormat {
 | 
			
		||||
static const FDFormat fd_formats[] = {
 | 
			
		||||
    /* First entry is default format */
 | 
			
		||||
    /* 1.44 MB 3"1/2 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_144, 18, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 20, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 21, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 21, 82, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 21, 83, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 22, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 23, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 24, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 18, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 20, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 21, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 21, 82, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 21, 83, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 22, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 23, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 24, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    /* 2.88 MB 3"1/2 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_288, 36, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FDRIVE_DRV_288, 39, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FDRIVE_DRV_288, 40, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FDRIVE_DRV_288, 44, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FDRIVE_DRV_288, 48, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_288, 36, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_288, 39, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_288, 40, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_288, 44, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_288, 48, 80, 1, FDRIVE_RATE_1M, },
 | 
			
		||||
    /* 720 kB 3"1/2 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_144,  9, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 10, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 10, 82, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 10, 83, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 13, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_144, 14, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144,  9, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 10, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 10, 82, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 10, 83, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 13, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144, 14, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    /* 1.2 MB 5"1/4 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_120, 15, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 18, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 18, 82, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 18, 83, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 20, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 15, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 18, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 18, 82, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 18, 83, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 20, 80, 1, FDRIVE_RATE_500K, },
 | 
			
		||||
    /* 720 kB 5"1/4 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_120,  9, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 11, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120,  9, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 11, 80, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    /* 360 kB 5"1/4 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_120,  9, 40, 1, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FDRIVE_DRV_120,  9, 40, 0, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 10, 41, 1, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FDRIVE_DRV_120, 10, 42, 1, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120,  9, 40, 1, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120,  9, 40, 0, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 10, 41, 1, FDRIVE_RATE_300K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120, 10, 42, 1, FDRIVE_RATE_300K, },
 | 
			
		||||
    /* 320 kB 5"1/4 floppy disks */
 | 
			
		||||
    { FDRIVE_DRV_120,  8, 40, 1, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FDRIVE_DRV_120,  8, 40, 0, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_120,  8, 40, 1, 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... */
 | 
			
		||||
    { FDRIVE_DRV_144,  9, 80, 0, FDRIVE_RATE_250K, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_144,  9, 80, 0, FDRIVE_RATE_250K, },
 | 
			
		||||
    /* end */
 | 
			
		||||
    { FDRIVE_DRV_NONE, -1, -1, 0, 0, },
 | 
			
		||||
    { FLOPPY_DRIVE_TYPE_NONE, -1, -1, 0, 0, },
 | 
			
		||||
};
 | 
			
		||||
 | 
			
		||||
#define GET_CUR_DRV(fdctrl) ((fdctrl)->cur_drv)
 | 
			
		||||
@ -134,7 +134,7 @@ typedef struct FDrive {
 | 
			
		||||
    FDCtrl *fdctrl;
 | 
			
		||||
    BlockBackend *blk;
 | 
			
		||||
    /* Drive status */
 | 
			
		||||
    FDriveType drive;
 | 
			
		||||
    FloppyDriveType drive;    /* CMOS drive type        */
 | 
			
		||||
    uint8_t perpendicular;    /* 2.88 MB access mode    */
 | 
			
		||||
    /* Position */
 | 
			
		||||
    uint8_t head;
 | 
			
		||||
@ -155,7 +155,7 @@ typedef struct FDrive {
 | 
			
		||||
static void fd_init(FDrive *drv)
 | 
			
		||||
{
 | 
			
		||||
    /* Drive */
 | 
			
		||||
    drv->drive = FDRIVE_DRV_NONE;
 | 
			
		||||
    drv->drive = FLOPPY_DRIVE_TYPE_NONE;
 | 
			
		||||
    drv->perpendicular = 0;
 | 
			
		||||
    /* Disk */
 | 
			
		||||
    drv->last_sect = 0;
 | 
			
		||||
@ -254,11 +254,11 @@ static void pick_geometry(FDrive *drv)
 | 
			
		||||
    first_match = -1;
 | 
			
		||||
    for (i = 0; ; i++) {
 | 
			
		||||
        parse = &fd_formats[i];
 | 
			
		||||
        if (parse->drive == FDRIVE_DRV_NONE) {
 | 
			
		||||
        if (parse->drive == FLOPPY_DRIVE_TYPE_NONE) {
 | 
			
		||||
            break;
 | 
			
		||||
        }
 | 
			
		||||
        if (drv->drive == parse->drive ||
 | 
			
		||||
            drv->drive == FDRIVE_DRV_NONE) {
 | 
			
		||||
            drv->drive == FLOPPY_DRIVE_TYPE_NONE) {
 | 
			
		||||
            size = (parse->max_head + 1) * parse->max_track *
 | 
			
		||||
                parse->last_sect;
 | 
			
		||||
            if (nb_sectors == size) {
 | 
			
		||||
@ -2397,7 +2397,7 @@ static void sysbus_fdc_common_realize(DeviceState *dev, Error **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);
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
							
								
								
									
										17
									
								
								hw/i386/pc.c
									
									
									
									
									
								
							
							
						
						
									
										17
									
								
								hw/i386/pc.c
									
									
									
									
									
								
							@ -199,24 +199,24 @@ static void pic_irq_request(void *opaque, int irq, int level)
 | 
			
		||||
 | 
			
		||||
#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;
 | 
			
		||||
 | 
			
		||||
    switch (fd0) {
 | 
			
		||||
    case FDRIVE_DRV_144:
 | 
			
		||||
    case FLOPPY_DRIVE_TYPE_144:
 | 
			
		||||
        /* 1.44 Mb 3"5 drive */
 | 
			
		||||
        val = 4;
 | 
			
		||||
        break;
 | 
			
		||||
    case FDRIVE_DRV_288:
 | 
			
		||||
    case FLOPPY_DRIVE_TYPE_288:
 | 
			
		||||
        /* 2.88 Mb 3"5 drive */
 | 
			
		||||
        val = 5;
 | 
			
		||||
        break;
 | 
			
		||||
    case FDRIVE_DRV_120:
 | 
			
		||||
    case FLOPPY_DRIVE_TYPE_120:
 | 
			
		||||
        /* 1.2 Mb 5"5 drive */
 | 
			
		||||
        val = 2;
 | 
			
		||||
        break;
 | 
			
		||||
    case FDRIVE_DRV_NONE:
 | 
			
		||||
    case FLOPPY_DRIVE_TYPE_NONE:
 | 
			
		||||
    default:
 | 
			
		||||
        val = 0;
 | 
			
		||||
        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)
 | 
			
		||||
{
 | 
			
		||||
    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 */
 | 
			
		||||
    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);
 | 
			
		||||
    nb = 0;
 | 
			
		||||
    if (fd_type[0] < FDRIVE_DRV_NONE) {
 | 
			
		||||
    if (fd_type[0] != FLOPPY_DRIVE_TYPE_NONE) {
 | 
			
		||||
        nb++;
 | 
			
		||||
    }
 | 
			
		||||
    if (fd_type[1] < FDRIVE_DRV_NONE) {
 | 
			
		||||
    if (fd_type[1] != FLOPPY_DRIVE_TYPE_NONE) {
 | 
			
		||||
        nb++;
 | 
			
		||||
    }
 | 
			
		||||
    switch (nb) {
 | 
			
		||||
 | 
			
		||||
@ -6,13 +6,6 @@
 | 
			
		||||
/* fdc.c */
 | 
			
		||||
#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"
 | 
			
		||||
 | 
			
		||||
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,
 | 
			
		||||
                       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
 | 
			
		||||
 | 
			
		||||
@ -39,6 +39,22 @@
 | 
			
		||||
{ 'enum': 'BiosAtaTranslation',
 | 
			
		||||
  '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
 | 
			
		||||
#
 | 
			
		||||
 | 
			
		||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user