Comments
Patch
@@ -35,4 +35,7 @@ config EHCI_BAR
config EHCI_DEBUG_OFFSET
hex
default 0xe0 if SOUTHBRIDGE_AMD_SB600
-
+
+config SATA_MODE
+ string
+ default "ide"
@@ -17,7 +17,6 @@
* along with this program; if not, write to the Free Software
* Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
-
#include <console/console.h>
#include <device/device.h>
#include <delay.h>
@@ -26,6 +25,10 @@
#include <device/pci_ops.h>
#include <arch/io.h>
#include "sb600.h"
+#include <pc80/mc146818rtc.h>
+
+#define SATA_MODE_IDE 1
+#define SATA_MODE_AHCI !(SATA_MODE_IDE)
static int sata_drive_detect(int portnum, u16 iobar)
{
@@ -98,10 +101,6 @@ static void sata_init(struct device *dev)
printk(BIOS_SPEW, "sata_bar4=%x\n", sata_bar4); /* 3000 */
printk(BIOS_SPEW, "sata_bar5=%x\n", sata_bar5); /* e0309000 */
- /* Program the 2C to 0x43801002 */
- dword = 0x43801002;
- pci_write_config32(dev, 0x2c, dword);
-
/* SERR-Enable */
word = pci_read_config16(dev, 0x04);
word |= (1 << 8);
@@ -112,13 +111,28 @@ static void sata_init(struct device *dev)
byte |= (1 << 2);
pci_write_config8(dev, 0x40, byte);
- /* Set SATA Operation Mode, Set to IDE mode */
+ /* Set SATA Operation Mode */
byte = pci_read_config8(dev, 0x40);
byte |= (1 << 0);
byte |= (1 << 4);
pci_write_config8(dev, 0x40, byte);
- dword = 0x01018f00;
+ // 1 means IDE, 0 means AHCI
+ if( get_option(&i, "sata_mode") < 0 ) {
+ // no cmos option
+ i = SATA_MODE_IDE; // default
+#if defined(CONFIG_SATA_MODE)
+ i = ((CONFIG_SATA_MODE[0] & ~0x20) == 'A') ? SATA_MODE_AHCI : SATA_MODE_IDE;
+#endif
+ }
+ printk(BIOS_INFO, "%s: setting sata mode = %s\n",__func__, (i == SATA_MODE_IDE) ? "ide" : "ahci" );
+
+ dword = pci_read_config32(dev, 0x8);
+ dword &= 0xff0000ff;
+ if( i == SATA_MODE_IDE )
+ dword |= 0x00018f00; // IDE mode
+ else
+ dword |= 0x00060100; // AHCI mode
pci_write_config32(dev, 0x8, dword);
byte = pci_read_config8(dev, 0x40);
@@ -245,7 +259,7 @@ static void sata_init(struct device *dev)
}
static struct pci_operations lops_pci = {
- /* .set_subsystem = pci_dev_set_subsystem, */
+ .set_subsystem = pci_dev_set_subsystem,
};
static struct device_operations sata_ops = {