Add new option 'sata_mode' to CMOS and 'SATA_MODE' to Kconfig for AMD SB600
coreboot used to set the chipset to IDE mode unconditionally. Now, the user has a couple of ways to choose the configuration: - If a CMOS variable sata_mode exist, it is used to decide if IDE or AHCI is to be used as interface. - If not, a Kconfig option is used. - If unchanged, the Kconfig option is set to IDE. So unless the cmos.layout is extended or Kconfig is modified, this won't change behaviour. [Patrick: Compared to Josef's version, I changed the Kconfig option to be boolean, instead of a magic string. Also, the "IDE" default is handled in Kconfig, instead of an additional line of code.] Signed-off-by: Josef Kellermann <seppk@arcor.de> Acked-by: Patrick Georgi <patrick.georgi@secunet.com> git-svn-id: svn://svn.coreboot.org/coreboot/trunk@6379 2b7e53f0-3cfb-0310-b3e9-8179ed1497e1
This commit is contained in:
parent
20bd19619e
commit
855224bb28
@ -23,16 +23,36 @@ config SOUTHBRIDGE_AMD_SB600
|
|||||||
select HAVE_USBDEBUG
|
select HAVE_USBDEBUG
|
||||||
select TINY_BOOTBLOCK
|
select TINY_BOOTBLOCK
|
||||||
|
|
||||||
|
if SOUTHBRIDGE_AMD_SB600
|
||||||
config BOOTBLOCK_SOUTHBRIDGE_INIT
|
config BOOTBLOCK_SOUTHBRIDGE_INIT
|
||||||
string
|
string
|
||||||
default "southbridge/amd/sb600/bootblock.c"
|
default "southbridge/amd/sb600/bootblock.c"
|
||||||
depends on SOUTHBRIDGE_AMD_SB600
|
|
||||||
|
|
||||||
config EHCI_BAR
|
config EHCI_BAR
|
||||||
hex
|
hex
|
||||||
default 0xfef00000 if SOUTHBRIDGE_AMD_SB600
|
default 0xfef00000
|
||||||
|
|
||||||
config EHCI_DEBUG_OFFSET
|
config EHCI_DEBUG_OFFSET
|
||||||
hex
|
hex
|
||||||
default 0xe0 if SOUTHBRIDGE_AMD_SB600
|
default 0xe0
|
||||||
|
|
||||||
|
choice
|
||||||
|
prompt "SATA Mode"
|
||||||
|
default SATA_MODE_IDE
|
||||||
|
help
|
||||||
|
Select the mode in which SATA should be driven. IDE or AHCI.
|
||||||
|
The default is IDE.
|
||||||
|
|
||||||
|
config SATA_MODE_IDE
|
||||||
|
bool "IDE"
|
||||||
|
|
||||||
|
config SATA_MODE_AHCI
|
||||||
|
bool "AHCI"
|
||||||
|
endchoice
|
||||||
|
|
||||||
|
config SATA_MODE
|
||||||
|
int
|
||||||
|
default 1 if SATA_MODE_IDE
|
||||||
|
default 0 if SATA_MODE_AHCI
|
||||||
|
|
||||||
|
endif
|
||||||
|
@ -26,6 +26,10 @@
|
|||||||
#include <device/pci_ops.h>
|
#include <device/pci_ops.h>
|
||||||
#include <arch/io.h>
|
#include <arch/io.h>
|
||||||
#include "sb600.h"
|
#include "sb600.h"
|
||||||
|
#include <pc80/mc146818rtc.h>
|
||||||
|
|
||||||
|
#define SATA_MODE_IDE 1
|
||||||
|
#define SATA_MODE_AHCI 0
|
||||||
|
|
||||||
static int sata_drive_detect(int portnum, u16 iobar)
|
static int sata_drive_detect(int portnum, u16 iobar)
|
||||||
{
|
{
|
||||||
@ -98,10 +102,6 @@ static void sata_init(struct device *dev)
|
|||||||
printk(BIOS_SPEW, "sata_bar4=%x\n", sata_bar4); /* 3000 */
|
printk(BIOS_SPEW, "sata_bar4=%x\n", sata_bar4); /* 3000 */
|
||||||
printk(BIOS_SPEW, "sata_bar5=%x\n", sata_bar5); /* e0309000 */
|
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 */
|
/* SERR-Enable */
|
||||||
word = pci_read_config16(dev, 0x04);
|
word = pci_read_config16(dev, 0x04);
|
||||||
word |= (1 << 8);
|
word |= (1 << 8);
|
||||||
@ -112,13 +112,25 @@ static void sata_init(struct device *dev)
|
|||||||
byte |= (1 << 2);
|
byte |= (1 << 2);
|
||||||
pci_write_config8(dev, 0x40, byte);
|
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 = pci_read_config8(dev, 0x40);
|
||||||
byte |= (1 << 0);
|
byte |= (1 << 0);
|
||||||
byte |= (1 << 4);
|
byte |= (1 << 4);
|
||||||
pci_write_config8(dev, 0x40, byte);
|
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 = CONFIG_SATA_MODE;
|
||||||
|
}
|
||||||
|
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);
|
pci_write_config32(dev, 0x8, dword);
|
||||||
|
|
||||||
byte = pci_read_config8(dev, 0x40);
|
byte = pci_read_config8(dev, 0x40);
|
||||||
@ -245,7 +257,7 @@ static void sata_init(struct device *dev)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static struct pci_operations lops_pci = {
|
static struct pci_operations lops_pci = {
|
||||||
/* .set_subsystem = pci_dev_set_subsystem, */
|
.set_subsystem = pci_dev_set_subsystem,
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct device_operations sata_ops = {
|
static struct device_operations sata_ops = {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user