hw/i386/pc: factor out pc_cmos_init_floppy()
Extract the pc_cmos_init_floppy() function from pc_cmos_init(). The function sets two RTC registers: floppy drive types (0x10), overwriting the earlier value in there), and REG_EQUIPMENT_BYTE (0x14), setting bits in the prior value. Cc: Jan Tomko <jtomko@redhat.com> Cc: John Snow <jsnow@redhat.com> Cc: Markus Armbruster <armbru@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Signed-off-by: Laszlo Ersek <lersek@redhat.com> Reviewed-by: John Snow <jsnow@redhat.com> Reviewed-by: Markus Armbruster <armbru@redhat.com> Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
5add35bec1
commit
7444ca4ee2
67
hw/i386/pc.c
67
hw/i386/pc.c
@ -293,6 +293,42 @@ static void pc_boot_set(void *opaque, const char *boot_device, Error **errp)
|
|||||||
set_boot_dev(opaque, boot_device, errp);
|
set_boot_dev(opaque, boot_device, 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 };
|
||||||
|
|
||||||
|
/* floppy type */
|
||||||
|
if (floppy) {
|
||||||
|
for (i = 0; i < 2; i++) {
|
||||||
|
fd_type[i] = isa_fdc_get_drive_type(floppy, i);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
val = (cmos_get_fd_drive_type(fd_type[0]) << 4) |
|
||||||
|
cmos_get_fd_drive_type(fd_type[1]);
|
||||||
|
rtc_set_memory(rtc_state, 0x10, val);
|
||||||
|
|
||||||
|
val = rtc_get_memory(rtc_state, REG_EQUIPMENT_BYTE);
|
||||||
|
nb = 0;
|
||||||
|
if (fd_type[0] < FDRIVE_DRV_NONE) {
|
||||||
|
nb++;
|
||||||
|
}
|
||||||
|
if (fd_type[1] < FDRIVE_DRV_NONE) {
|
||||||
|
nb++;
|
||||||
|
}
|
||||||
|
switch (nb) {
|
||||||
|
case 0:
|
||||||
|
break;
|
||||||
|
case 1:
|
||||||
|
val |= 0x01; /* 1 drive, ready for boot */
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
val |= 0x41; /* 2 drives, ready for boot */
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
rtc_set_memory(rtc_state, REG_EQUIPMENT_BYTE, val);
|
||||||
|
}
|
||||||
|
|
||||||
typedef struct pc_cmos_init_late_arg {
|
typedef struct pc_cmos_init_late_arg {
|
||||||
ISADevice *rtc_state;
|
ISADevice *rtc_state;
|
||||||
BusState *idebus[2];
|
BusState *idebus[2];
|
||||||
@ -343,8 +379,7 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
|||||||
ISADevice *floppy, BusState *idebus0, BusState *idebus1,
|
ISADevice *floppy, BusState *idebus0, BusState *idebus1,
|
||||||
ISADevice *s)
|
ISADevice *s)
|
||||||
{
|
{
|
||||||
int val, nb, i;
|
int val;
|
||||||
FDriveType fd_type[2] = { FDRIVE_DRV_NONE, FDRIVE_DRV_NONE };
|
|
||||||
static pc_cmos_init_late_arg arg;
|
static pc_cmos_init_late_arg arg;
|
||||||
PCMachineState *pc_machine = PC_MACHINE(machine);
|
PCMachineState *pc_machine = PC_MACHINE(machine);
|
||||||
Error *local_err = NULL;
|
Error *local_err = NULL;
|
||||||
@ -401,37 +436,11 @@ void pc_cmos_init(ram_addr_t ram_size, ram_addr_t above_4g_mem_size,
|
|||||||
exit(1);
|
exit(1);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* floppy type */
|
|
||||||
if (floppy) {
|
|
||||||
for (i = 0; i < 2; i++) {
|
|
||||||
fd_type[i] = isa_fdc_get_drive_type(floppy, i);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
val = (cmos_get_fd_drive_type(fd_type[0]) << 4) |
|
|
||||||
cmos_get_fd_drive_type(fd_type[1]);
|
|
||||||
rtc_set_memory(s, 0x10, val);
|
|
||||||
|
|
||||||
val = 0;
|
val = 0;
|
||||||
nb = 0;
|
|
||||||
if (fd_type[0] < FDRIVE_DRV_NONE) {
|
|
||||||
nb++;
|
|
||||||
}
|
|
||||||
if (fd_type[1] < FDRIVE_DRV_NONE) {
|
|
||||||
nb++;
|
|
||||||
}
|
|
||||||
switch (nb) {
|
|
||||||
case 0:
|
|
||||||
break;
|
|
||||||
case 1:
|
|
||||||
val |= 0x01; /* 1 drive, ready for boot */
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
val |= 0x41; /* 2 drives, ready for boot */
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
val |= 0x02; /* FPU is there */
|
val |= 0x02; /* FPU is there */
|
||||||
val |= 0x04; /* PS/2 mouse installed */
|
val |= 0x04; /* PS/2 mouse installed */
|
||||||
rtc_set_memory(s, REG_EQUIPMENT_BYTE, val);
|
rtc_set_memory(s, REG_EQUIPMENT_BYTE, val);
|
||||||
|
pc_cmos_init_floppy(s, floppy);
|
||||||
|
|
||||||
/* hard drives */
|
/* hard drives */
|
||||||
arg.rtc_state = s;
|
arg.rtc_state = s;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user