[coreboot] Why boot from floppy not working?

Kevin O'Connor kevin at koconnor.net
Wed Dec 4 19:57:45 CET 2013


On Wed, Dec 04, 2013 at 10:22:17AM -0500, Kevin O'Connor wrote:
> 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

Sorry, try the patch below with the very latest seabios git.

-Kevin


diff --git a/src/hw/floppy.c b/src/hw/floppy.c
index d43b489..190ef30 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);
 }
 
@@ -219,6 +220,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;
@@ -276,6 +278,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)
@@ -292,6 +295,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);
 
@@ -305,6 +309,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;
@@ -324,6 +329,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;
@@ -356,6 +362,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;
@@ -383,6 +391,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);
@@ -416,6 +425,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;
 }
@@ -428,6 +439,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