[coreboot-gerrit] Patch set updated for coreboot: southbridge/amd/sb700: Do drive detection even in AHCI mode

Timothy Pearson (tpearson@raptorengineeringinc.com) gerrit at coreboot.org
Sun Oct 18 07:44:34 CEST 2015


Timothy Pearson (tpearson at raptorengineeringinc.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/11997

-gerrit

commit a7e49d5e3812fb5072df94d26553f212d32063bd
Author: Timothy Pearson <tpearson at raptorengineeringinc.com>
Date:   Sat Jun 20 21:31:15 2015 -0500

    southbridge/amd/sb700: Do drive detection even in AHCI mode
    
    SeaBIOS AHCI drive detection randomly fails for drives present
    on the secondary channel of each AHCI SATA BAR.  Forcing native
    drive detection in AHCI mode resolves this issue.
    
    Change-Id: I34eb1d5d3f2f8aefb749a4eeb911c1373d184938
    Signed-off-by: Timothy Pearson <tpearson at raptorengineeringinc.com>
---
 src/southbridge/amd/sb700/sata.c | 101 +++++++++++++++++++++------------------
 1 file changed, 54 insertions(+), 47 deletions(-)

diff --git a/src/southbridge/amd/sb700/sata.c b/src/southbridge/amd/sb700/sata.c
index 10dbca2..6afdfdf 100644
--- a/src/southbridge/amd/sb700/sata.c
+++ b/src/southbridge/amd/sb700/sata.c
@@ -301,65 +301,72 @@ static void sata_init(struct device *dev)
 	if (port_count > max_port_count)
 		port_count = max_port_count;
 
-	if (!sata_ahci_mode) {
-		/* RPR7.7 SATA drive detection. */
-		/* Use BAR5+0x128,BAR0 for Primary Slave */
-		/* Use BAR5+0x1A8,BAR0 for Primary Slave */
-		/* Use BAR5+0x228,BAR2 for Secondary Master */
-		/* Use BAR5+0x2A8,BAR2 for Secondary Slave */
-		/* Use BAR5+0x328,PATA_BAR0/2 for Primary/Secondary Master emulation */
-		/* Use BAR5+0x3A8,PATA_BAR0/2 for Primary/Secondary Slave emulation */
-		for (i = 0; i < port_count; i++) {
+	/* RPR7.7 SATA drive detection. */
+	/* Use BAR5+0x128,BAR0 for Primary Slave */
+	/* Use BAR5+0x1A8,BAR0 for Primary Slave */
+	/* Use BAR5+0x228,BAR2 for Secondary Master */
+	/* Use BAR5+0x2A8,BAR2 for Secondary Slave */
+	/* Use BAR5+0x328,PATA_BAR0/2 for Primary/Secondary Master emulation */
+	/* Use BAR5+0x3A8,PATA_BAR0/2 for Primary/Secondary Slave emulation */
+	for (i = 0; i < port_count; i++) {
+		byte = read8(sata_bar5 + 0x128 + 0x80 * i);
+		printk(BIOS_SPEW, "SATA port %i status = %x\n", i, byte);
+		byte &= 0xF;
+		if (byte == 0x1) {
+			/* If the drive status is 0x1 then we see it but we aren't talking to it. */
+			/* Try to do something about it. */
+			printk(BIOS_SPEW, "SATA device detected but not talking. Trying lower speed.\n");
+
+			/* Read in Port-N Serial ATA Control Register */
+			byte = read8(sata_bar5 + 0x12C + 0x80 * i);
+
+			/* Set Reset Bit and 1.5g bit */
+			byte |= 0x11;
+			write8((sata_bar5 + 0x12C + 0x80 * i), byte);
+
+			/* Wait 1ms */
+			mdelay(1);
+
+			/* Clear Reset Bit */
+			byte &= ~0x01;
+			write8((sata_bar5 + 0x12C + 0x80 * i), byte);
+
+			/* Wait 1ms */
+			mdelay(1);
+
+			/* Reread status */
 			byte = read8(sata_bar5 + 0x128 + 0x80 * i);
 			printk(BIOS_SPEW, "SATA port %i status = %x\n", i, byte);
 			byte &= 0xF;
-			if (byte == 0x1) {
-				/* If the drive status is 0x1 then we see it but we aren't talking to it. */
-				/* Try to do something about it. */
-				printk(BIOS_SPEW, "SATA device detected but not talking. Trying lower speed.\n");
-	
-				/* Read in Port-N Serial ATA Control Register */
-				byte = read8(sata_bar5 + 0x12C + 0x80 * i);
-	
-				/* Set Reset Bit and 1.5g bit */
-				byte |= 0x11;
-				write8((sata_bar5 + 0x12C + 0x80 * i), byte);
-	
-				/* Wait 1ms */
-				mdelay(1);
-	
-				/* Clear Reset Bit */
-				byte &= ~0x01;
-				write8((sata_bar5 + 0x12C + 0x80 * i), byte);
-	
-				/* Wait 1ms */
-				mdelay(1);
-	
-				/* Reread status */
-				byte = read8(sata_bar5 + 0x128 + 0x80 * i);
-				printk(BIOS_SPEW, "SATA port %i status = %x\n", i, byte);
-				byte &= 0xF;
+		}
+
+		if (byte == 0x3) {
+			for (j = 0; j < 10; j++) {
+				if (i < 4)
+					current_bar = ((i / 2) == 0) ? sata_bar0 : sata_bar2;
+				else
+					current_bar = ide_bar0;
+				if (!sata_drive_detect(i, current_bar))
+					break;
 			}
-	
-			if (byte == 0x3) {
-				for (j = 0; j < 10; j++) {
-					if (i < 4)
-						current_bar = ((i / 2) == 0) ? sata_bar0 : sata_bar2;
-					else
-						current_bar = ide_bar0;
-					if (!sata_drive_detect(i, current_bar))
-						break;
-				}
+			if (sata_ahci_mode)
+				printk(BIOS_DEBUG, "AHCI device %d is %sready after %i tries\n",
+						i,
+						(j == 10) ? "not " : "",
+						(j == 10) ? j : j + 1);
+			else 
 				printk(BIOS_DEBUG, "%s %s device is %sready after %i tries\n",
 						(i / 2) ? "Secondary" : "Primary",
 						(i % 2 ) ? "Slave" : "Master",
 						(j == 10) ? "not " : "",
 						(j == 10) ? j : j + 1);
-			} else {
+		} else {
+			if (sata_ahci_mode)
+				printk(BIOS_DEBUG, "No AHCI SATA drive on Slot%i\n", i);
+			else
 				printk(BIOS_DEBUG, "No %s %s SATA drive on Slot%i\n",
 						(i / 2) ? "Secondary" : "Primary",
 						(i % 2 ) ? "Slave" : "Master", i);
-			}
 		}
 	}
 



More information about the coreboot-gerrit mailing list