[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