[coreboot] Why boot from floppy not working?
Kevin O'Connor
kevin at koconnor.net
Wed Dec 4 16:22:17 CET 2013
On Wed, Dec 04, 2013 at 09:27:20AM +0100, Gelip wrote:
> Hi. I try set floppy support in SeaBIOS like this:
The floppy support in SeaBIOS has been tested on qemu, but has never
been tested on real hardware. Your test indicates the SeaBIOS floppy
support is not complete.
If you want to help debug this, apply the patch below to the latest
seabios code from the seabios git, compile seabios with a debug level
of 8, retry the test, and forward the results back to
seabios at seabios.org. If you can capture the serial port traffic with
the scripts/readserial.py tool from the seabios repo that would help
(by providing additional timing information).
-Kevin
diff --git a/src/hw/floppy.c b/src/hw/floppy.c
index e73b303..4cf9684 100644
--- a/src/hw/floppy.c
+++ b/src/hw/floppy.c
@@ -183,6 +183,7 @@ find_floppy_type(u32 size)
static void
floppy_disable_controller(void)
{
+ dprintf(1, "floppy_disable_controller\n");
outb(inb(PORT_FD_DOR) & ~0x04, PORT_FD_DOR);
}
@@ -191,8 +192,10 @@ floppy_wait_irq(void)
{
u8 frs = GET_BDA(floppy_recalibration_status);
SET_BDA(floppy_recalibration_status, frs & ~FRS_IRQ);
+ dprintf(1, "floppy_wait_irq frs=%x\n", frs);
for (;;) {
if (!GET_BDA(floppy_motor_counter)) {
+ warn_timeout();
floppy_disable_controller();
return DISK_RET_ETIMEOUT;
}
@@ -218,6 +221,7 @@ struct floppy_pio_s {
static int
floppy_pio(struct floppy_pio_s *pio)
{
+ dprintf(1, "floppy_pio\n");
// Send command to controller.
u32 end = timer_calc(FLOPPY_PIO_TIMEOUT);
int i = 0;
@@ -225,6 +229,7 @@ floppy_pio(struct floppy_pio_s *pio)
u8 sts = inb(PORT_FD_STATUS);
if (!(sts & 0x80)) {
if (timer_check(end)) {
+ warn_timeout();
floppy_disable_controller();
return DISK_RET_ETIMEOUT;
}
@@ -253,6 +258,7 @@ floppy_pio(struct floppy_pio_s *pio)
u8 sts = inb(PORT_FD_STATUS);
if (!(sts & 0x80)) {
if (timer_check(end)) {
+ warn_timeout();
floppy_disable_controller();
return DISK_RET_ETIMEOUT;
}
@@ -273,6 +279,7 @@ floppy_pio(struct floppy_pio_s *pio)
static int
floppy_enable_controller(void)
{
+ dprintf(1, "floppy_enable_controller\n");
outb(inb(PORT_FD_DOR) | 0x04, PORT_FD_DOR);
int ret = floppy_wait_irq();
if (ret)
@@ -289,6 +296,7 @@ floppy_enable_controller(void)
static int
floppy_select_drive(u8 floppyid)
{
+ dprintf(1, "floppy_select_drive %d\n", floppyid);
// reset the disk motor timeout value of INT 08
SET_BDA(floppy_motor_counter, FLOPPY_MOTOR_TICKS);
@@ -302,6 +310,7 @@ floppy_select_drive(u8 floppyid)
// Turn on motor of selected drive, DMA & int enabled, normal operation
dor = (floppyid ? 0x20 : 0x10) | 0x0c | floppyid;
+ dprintf(1, "floppy_select_drive enable motor dor=%x\n", dor);
outb(dor, PORT_FD_DOR);
return DISK_RET_SUCCESS;
@@ -321,6 +330,7 @@ set_diskette_current_cyl(u8 floppyid, u8 cyl)
static int
floppy_drive_recal(u8 floppyid)
{
+ dprintf(1, "floppy_drive_recal %d\n", floppyid);
int ret = floppy_select_drive(floppyid);
if (ret)
return ret;
@@ -353,6 +363,8 @@ floppy_drive_recal(u8 floppyid)
static int
floppy_drive_readid(u8 floppyid, u8 data_rate, u8 head)
{
+ dprintf(1, "floppy_drive_readid %d rate=%x head=%x\n"
+ , floppyid, data_rate, head);
int ret = floppy_select_drive(floppyid);
if (ret)
return ret;
@@ -380,6 +392,7 @@ floppy_media_sense(struct drive_s *drive_gf)
{
u8 ftype = GET_GLOBALFLAT(drive_gf->floppy_type), stype = ftype;
u8 floppyid = GET_GLOBALFLAT(drive_gf->cntl_id);
+ dprintf(1, "floppy_media_sense %d ftype=%x\n", floppyid, ftype);
u8 data_rate = GET_GLOBAL(FloppyInfo[stype].data_rate);
int ret = floppy_drive_readid(floppyid, data_rate, 0);
@@ -413,6 +426,8 @@ floppy_media_sense(struct drive_s *drive_gf)
< GET_GLOBAL(FloppyInfo[ftype].chs.cylinder))
fms |= FMS_DOUBLE_STEPPING;
SET_BDA(floppy_media_state[floppyid], fms);
+ dprintf(1, "floppy_media_sense finish %d data_rate=%x fms=%x stype=%x\n"
+ , floppyid, data_rate, fms, stype);
return DISK_RET_SUCCESS;
}
@@ -425,6 +440,7 @@ check_recal_drive(struct drive_s *drive_gf)
&& (GET_BDA(floppy_media_state[floppyid]) & FMS_MEDIA_DRIVE_ESTABLISHED))
// Media is known.
return DISK_RET_SUCCESS;
+ dprintf(1, "check_recal_drive %d\n", floppyid);
// Recalibrate drive.
int ret = floppy_drive_recal(floppyid);
More information about the coreboot
mailing list