i386/pc: expose identifying the floppy controller
Factor out and expose the function to locate the floppy controller in the system. It will allow to dynamically populate the relevant objects in the ACPI tables. Signed-off-by: Roman Kagan <rkagan@virtuozzo.com> Cc: "Michael S. Tsirkin" <mst@redhat.com> Cc: Eduardo Habkost <ehabkost@redhat.com> Cc: Igor Mammedov <imammedo@redhat.com> Cc: John Snow <jsnow@redhat.com> Cc: Kevin Wolf <kwolf@redhat.com> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: Richard Henderson <rth@twiddle.net> Cc: qemu-block@nongnu.org Cc: qemu-stable@nongnu.org Reviewed-by: Michael S. Tsirkin <mst@redhat.com> Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
This commit is contained in:
parent
9fc6502606
commit
424e4a87d2
44
hw/i386/pc.c
44
hw/i386/pc.c
@ -360,6 +360,31 @@ static const char * const fdc_container_path[] = {
|
|||||||
"/unattached", "/peripheral", "/peripheral-anon"
|
"/unattached", "/peripheral", "/peripheral-anon"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Locate the FDC at IO address 0x3f0, in order to configure the CMOS registers
|
||||||
|
* and ACPI objects.
|
||||||
|
*/
|
||||||
|
ISADevice *pc_find_fdc0(void)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
Object *container;
|
||||||
|
CheckFdcState state = { 0 };
|
||||||
|
|
||||||
|
for (i = 0; i < ARRAY_SIZE(fdc_container_path); i++) {
|
||||||
|
container = container_get(qdev_get_machine(), fdc_container_path[i]);
|
||||||
|
object_child_foreach(container, check_fdc, &state);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (state.multiple) {
|
||||||
|
error_report("warning: multiple floppy disk controllers with "
|
||||||
|
"iobase=0x3f0 have been found;\n"
|
||||||
|
"the one being picked for CMOS setup might not reflect "
|
||||||
|
"your intent");
|
||||||
|
}
|
||||||
|
|
||||||
|
return state.floppy;
|
||||||
|
}
|
||||||
|
|
||||||
static void pc_cmos_init_late(void *opaque)
|
static void pc_cmos_init_late(void *opaque)
|
||||||
{
|
{
|
||||||
pc_cmos_init_late_arg *arg = opaque;
|
pc_cmos_init_late_arg *arg = opaque;
|
||||||
@ -368,8 +393,6 @@ static void pc_cmos_init_late(void *opaque)
|
|||||||
int8_t heads, sectors;
|
int8_t heads, sectors;
|
||||||
int val;
|
int val;
|
||||||
int i, trans;
|
int i, trans;
|
||||||
Object *container;
|
|
||||||
CheckFdcState state = { 0 };
|
|
||||||
|
|
||||||
val = 0;
|
val = 0;
|
||||||
if (ide_get_geometry(arg->idebus[0], 0,
|
if (ide_get_geometry(arg->idebus[0], 0,
|
||||||
@ -399,22 +422,7 @@ static void pc_cmos_init_late(void *opaque)
|
|||||||
}
|
}
|
||||||
rtc_set_memory(s, 0x39, val);
|
rtc_set_memory(s, 0x39, val);
|
||||||
|
|
||||||
/*
|
pc_cmos_init_floppy(s, pc_find_fdc0());
|
||||||
* Locate the FDC at IO address 0x3f0, and configure the CMOS registers
|
|
||||||
* accordingly.
|
|
||||||
*/
|
|
||||||
for (i = 0; i < ARRAY_SIZE(fdc_container_path); i++) {
|
|
||||||
container = container_get(qdev_get_machine(), fdc_container_path[i]);
|
|
||||||
object_child_foreach(container, check_fdc, &state);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (state.multiple) {
|
|
||||||
error_report("warning: multiple floppy disk controllers with "
|
|
||||||
"iobase=0x3f0 have been found;\n"
|
|
||||||
"the one being picked for CMOS setup might not reflect "
|
|
||||||
"your intent");
|
|
||||||
}
|
|
||||||
pc_cmos_init_floppy(s, state.floppy);
|
|
||||||
|
|
||||||
qemu_unregister_reset(pc_cmos_init_late, opaque);
|
qemu_unregister_reset(pc_cmos_init_late, opaque);
|
||||||
}
|
}
|
||||||
|
@ -267,6 +267,8 @@ typedef void (*cpu_set_smm_t)(int smm, void *arg);
|
|||||||
|
|
||||||
void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
|
void ioapic_init_gsi(GSIState *gsi_state, const char *parent_name);
|
||||||
|
|
||||||
|
ISADevice *pc_find_fdc0(void);
|
||||||
|
|
||||||
/* acpi_piix.c */
|
/* acpi_piix.c */
|
||||||
|
|
||||||
I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
|
I2CBus *piix4_pm_init(PCIBus *bus, int devfn, uint32_t smb_io_base,
|
||||||
|
Loading…
Reference in New Issue
Block a user