Arthur Heymans has uploaded this change for review.

View Change

sb/intel/i82801gx: Detect if the southbridge supports AHCI

This automatically detects whether the southbridge supports AHCI.
If AHCI support is selected it will be used unless "sata_no_ahci" is
set in the devicetree to override the behavior.

Change-Id: I8d9f4e63ae8b2862c422938f3103c44e761bcda4
Signed-off-by: Arthur Heymans <arthur@aheymans.xyz>
---
M src/mainboard/apple/macbook21/devicetree.cb
M src/mainboard/asrock/g41c-gs/variants/g41c-gs-r2/devicetree.cb
M src/mainboard/asrock/g41c-gs/variants/g41m-gs/devicetree.cb
M src/mainboard/asrock/g41c-gs/variants/g41m-s3/devicetree.cb
M src/mainboard/asrock/g41c-gs/variants/g41m-vs3-r2/devicetree.cb
M src/mainboard/asus/p5gc-mx/devicetree.cb
M src/mainboard/asus/p5qpl-am/devicetree.cb
M src/mainboard/foxconn/d41s/devicetree.cb
M src/mainboard/foxconn/g41s-k/devicetree.cb
M src/mainboard/getac/p470/devicetree.cb
M src/mainboard/gigabyte/ga-945gcm-s2l/devicetree.cb
M src/mainboard/gigabyte/ga-g41m-es2l/devicetree.cb
M src/mainboard/ibase/mb899/devicetree.cb
M src/mainboard/intel/d510mo/devicetree.cb
M src/mainboard/intel/d945gclf/devicetree.cb
M src/mainboard/intel/dg41wv/devicetree.cb
M src/mainboard/kontron/986lcd-m/devicetree.cb
M src/mainboard/lenovo/t60/devicetree.cb
M src/mainboard/lenovo/thinkcentre_a58/devicetree.cb
M src/mainboard/lenovo/x60/devicetree.cb
M src/mainboard/lenovo/z61t/devicetree.cb
M src/mainboard/roda/rk886ex/devicetree.cb
M src/southbridge/intel/i82801gx/chip.h
M src/southbridge/intel/i82801gx/i82801gx.h
M src/southbridge/intel/i82801gx/sata.c
25 files changed, 18 insertions(+), 35 deletions(-)

git pull ssh://review.coreboot.org:29418/coreboot refs/changes/22/30822/1
diff --git a/src/mainboard/apple/macbook21/devicetree.cb b/src/mainboard/apple/macbook21/devicetree.cb
index 898aae4..84c923b 100644
--- a/src/mainboard/apple/macbook21/devicetree.cb
+++ b/src/mainboard/apple/macbook21/devicetree.cb
@@ -64,7 +64,6 @@
register "gpi1_routing" = "2"
register "gpi7_routing" = "2"

- register "sata_ahci" = "0x1"
register "sata_ports_implemented" = "0x04"

register "gpe0_en" = "0x11000006"
diff --git a/src/mainboard/asrock/g41c-gs/variants/g41c-gs-r2/devicetree.cb b/src/mainboard/asrock/g41c-gs/variants/g41c-gs-r2/devicetree.cb
index 156fe3f..acb8ac6 100644
--- a/src/mainboard/asrock/g41c-gs/variants/g41c-gs-r2/devicetree.cb
+++ b/src/mainboard/asrock/g41c-gs/variants/g41c-gs-r2/devicetree.cb
@@ -51,7 +51,6 @@
register "gpi13_routing" = "2"

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "sata_ports_implemented" = "0x3"
register "gpe0_en" = "0x440"

diff --git a/src/mainboard/asrock/g41c-gs/variants/g41m-gs/devicetree.cb b/src/mainboard/asrock/g41c-gs/variants/g41m-gs/devicetree.cb
index ba2f00d..f4d1dc4 100644
--- a/src/mainboard/asrock/g41c-gs/variants/g41m-gs/devicetree.cb
+++ b/src/mainboard/asrock/g41c-gs/variants/g41m-gs/devicetree.cb
@@ -46,7 +46,6 @@
register "pirqh_routing" = "0x0b"

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "sata_ports_implemented" = "0x3"
register "gpe0_en" = "0x440"

diff --git a/src/mainboard/asrock/g41c-gs/variants/g41m-s3/devicetree.cb b/src/mainboard/asrock/g41c-gs/variants/g41m-s3/devicetree.cb
index 2fa0fe4..2b74e7e 100644
--- a/src/mainboard/asrock/g41c-gs/variants/g41m-s3/devicetree.cb
+++ b/src/mainboard/asrock/g41c-gs/variants/g41m-s3/devicetree.cb
@@ -46,7 +46,6 @@
register "pirqh_routing" = "0x0b"

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "sata_ports_implemented" = "0x3"
register "gpe0_en" = "0x440"

diff --git a/src/mainboard/asrock/g41c-gs/variants/g41m-vs3-r2/devicetree.cb b/src/mainboard/asrock/g41c-gs/variants/g41m-vs3-r2/devicetree.cb
index b458115..5479faf 100644
--- a/src/mainboard/asrock/g41c-gs/variants/g41m-vs3-r2/devicetree.cb
+++ b/src/mainboard/asrock/g41c-gs/variants/g41m-vs3-r2/devicetree.cb
@@ -46,7 +46,6 @@
register "pirqh_routing" = "0x0b"

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "gpe0_en" = "0x440"

device pci 1b.0 on # Audio
diff --git a/src/mainboard/asus/p5gc-mx/devicetree.cb b/src/mainboard/asus/p5gc-mx/devicetree.cb
index 2f7d278..de63da2 100644
--- a/src/mainboard/asus/p5gc-mx/devicetree.cb
+++ b/src/mainboard/asus/p5gc-mx/devicetree.cb
@@ -53,7 +53,6 @@
register "ide_legacy_combined" = "0x0"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0"

register "p_cnt_throttling_supported" = "0"

diff --git a/src/mainboard/asus/p5qpl-am/devicetree.cb b/src/mainboard/asus/p5qpl-am/devicetree.cb
index 5bf582b..4e39ac5 100644
--- a/src/mainboard/asus/p5qpl-am/devicetree.cb
+++ b/src/mainboard/asus/p5qpl-am/devicetree.cb
@@ -43,7 +43,6 @@
# 2 SCI (if corresponding GPIO_EN bit is also set)

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "gpe0_en" = "0x04000440"

device pci 1b.0 on end # Audio
diff --git a/src/mainboard/foxconn/d41s/devicetree.cb b/src/mainboard/foxconn/d41s/devicetree.cb
index 75df88e..a611ee3 100644
--- a/src/mainboard/foxconn/d41s/devicetree.cb
+++ b/src/mainboard/foxconn/d41s/devicetree.cb
@@ -40,7 +40,6 @@
register "pirqf_routing" = "0x0b"
register "pirqg_routing" = "0x0b"
register "pirqh_routing" = "0x0b"
- register "sata_ahci" = "0x1"
register "sata_ports_implemented" = "0x3"
register "gpe0_en" = "0x441"

diff --git a/src/mainboard/foxconn/g41s-k/devicetree.cb b/src/mainboard/foxconn/g41s-k/devicetree.cb
index 237e22d..a00718f 100644
--- a/src/mainboard/foxconn/g41s-k/devicetree.cb
+++ b/src/mainboard/foxconn/g41s-k/devicetree.cb
@@ -48,7 +48,6 @@

register "ide_enable_primary" = "0x0"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0" # AHCI does not work
register "sata_ports_implemented" = "0x3"

device pci 1b.0 on end # Audio
diff --git a/src/mainboard/getac/p470/devicetree.cb b/src/mainboard/getac/p470/devicetree.cb
index a81ef3a..f2a3912 100644
--- a/src/mainboard/getac/p470/devicetree.cb
+++ b/src/mainboard/getac/p470/devicetree.cb
@@ -57,7 +57,6 @@
register "ide_legacy_combined" = "0x1"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0"

register "c3_latency" = "85"
register "docking_supported" = "1"
diff --git a/src/mainboard/gigabyte/ga-945gcm-s2l/devicetree.cb b/src/mainboard/gigabyte/ga-945gcm-s2l/devicetree.cb
index 7ed4d19..1c69613 100644
--- a/src/mainboard/gigabyte/ga-945gcm-s2l/devicetree.cb
+++ b/src/mainboard/gigabyte/ga-945gcm-s2l/devicetree.cb
@@ -76,7 +76,6 @@
register "ide_legacy_combined" = "0x0"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0"
register "c3_latency" = "85"

register "p_cnt_throttling_supported" = "0"
diff --git a/src/mainboard/gigabyte/ga-g41m-es2l/devicetree.cb b/src/mainboard/gigabyte/ga-g41m-es2l/devicetree.cb
index 8b47c4f..d24eb5d 100644
--- a/src/mainboard/gigabyte/ga-g41m-es2l/devicetree.cb
+++ b/src/mainboard/gigabyte/ga-g41m-es2l/devicetree.cb
@@ -48,7 +48,6 @@
register "ide_legacy_combined" = "0x0" # Combined mode broken
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0" # AHCI does not work
register "sata_ports_implemented" = "0x3"
register "gpe0_en" = "0x40"

diff --git a/src/mainboard/ibase/mb899/devicetree.cb b/src/mainboard/ibase/mb899/devicetree.cb
index 3544c96..8b170e1 100644
--- a/src/mainboard/ibase/mb899/devicetree.cb
+++ b/src/mainboard/ibase/mb899/devicetree.cb
@@ -36,7 +36,6 @@
register "ide_legacy_combined" = "0x0"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x1"

register "c3_latency" = "85"
register "p_cnt_throttling_supported" = "0"
diff --git a/src/mainboard/intel/d510mo/devicetree.cb b/src/mainboard/intel/d510mo/devicetree.cb
index a008610..825611e 100644
--- a/src/mainboard/intel/d510mo/devicetree.cb
+++ b/src/mainboard/intel/d510mo/devicetree.cb
@@ -38,7 +38,6 @@
register "pirqf_routing" = "0x0b"
register "pirqg_routing" = "0x0b"
register "pirqh_routing" = "0x0b"
- register "sata_ahci" = "0x1"
register "sata_ports_implemented" = "0x3"
register "gpe0_en" = "0x20000040"

diff --git a/src/mainboard/intel/d945gclf/devicetree.cb b/src/mainboard/intel/d945gclf/devicetree.cb
index 716654c..573b9c8 100644
--- a/src/mainboard/intel/d945gclf/devicetree.cb
+++ b/src/mainboard/intel/d945gclf/devicetree.cb
@@ -50,7 +50,6 @@
register "ide_legacy_combined" = "0x0"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0"
register "c3_latency" = "85"
register "p_cnt_throttling_supported" = "0"

diff --git a/src/mainboard/intel/dg41wv/devicetree.cb b/src/mainboard/intel/dg41wv/devicetree.cb
index be28763..295fbc4 100644
--- a/src/mainboard/intel/dg41wv/devicetree.cb
+++ b/src/mainboard/intel/dg41wv/devicetree.cb
@@ -63,7 +63,6 @@
register "gpi15_routing" = "2"

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "gpe0_en" = "0x440"

device pci 1b.0 on # Audio
diff --git a/src/mainboard/kontron/986lcd-m/devicetree.cb b/src/mainboard/kontron/986lcd-m/devicetree.cb
index 06f29e0..023c516 100644
--- a/src/mainboard/kontron/986lcd-m/devicetree.cb
+++ b/src/mainboard/kontron/986lcd-m/devicetree.cb
@@ -36,7 +36,6 @@
register "ide_legacy_combined" = "0x1"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x1"
- register "sata_ahci" = "0x0"
register "c3_latency" = "85"
register "p_cnt_throttling_supported" = "0"

diff --git a/src/mainboard/lenovo/t60/devicetree.cb b/src/mainboard/lenovo/t60/devicetree.cb
index 7b1721e..67b7794 100644
--- a/src/mainboard/lenovo/t60/devicetree.cb
+++ b/src/mainboard/lenovo/t60/devicetree.cb
@@ -72,7 +72,6 @@
register "gpi12_routing" = "2"
register "gpi8_routing" = "2"

- register "sata_ahci" = "0x1"
register "sata_ports_implemented" = "0x01"

register "gpe0_en" = "0x11000006"
diff --git a/src/mainboard/lenovo/thinkcentre_a58/devicetree.cb b/src/mainboard/lenovo/thinkcentre_a58/devicetree.cb
index cc3ef49..ace2bfb 100644
--- a/src/mainboard/lenovo/thinkcentre_a58/devicetree.cb
+++ b/src/mainboard/lenovo/thinkcentre_a58/devicetree.cb
@@ -44,7 +44,6 @@
register "gpi13_routing" = "1" # ??vendor

register "ide_enable_primary" = "0x1"
- register "sata_ahci" = "0x0" # AHCI not supported on this ICH7 variant
register "gpe0_en" = "0x440"

device pci 1b.0 on end # Audio
diff --git a/src/mainboard/lenovo/x60/devicetree.cb b/src/mainboard/lenovo/x60/devicetree.cb
index 2a60b87..ad31557 100644
--- a/src/mainboard/lenovo/x60/devicetree.cb
+++ b/src/mainboard/lenovo/x60/devicetree.cb
@@ -65,7 +65,6 @@
register "gpi12_routing" = "1"
register "gpi8_routing" = "2"

- register "sata_ahci" = "0x1"
register "sata_ports_implemented" = "0x01"

register "gpe0_en" = "0x11000006"
diff --git a/src/mainboard/lenovo/z61t/devicetree.cb b/src/mainboard/lenovo/z61t/devicetree.cb
index 92bf3ce..6e2450a 100644
--- a/src/mainboard/lenovo/z61t/devicetree.cb
+++ b/src/mainboard/lenovo/z61t/devicetree.cb
@@ -71,7 +71,6 @@
register "gpi12_routing" = "2"
register "gpi8_routing" = "2"

- register "sata_ahci" = "0x1"
register "sata_ports_implemented" = "0x01"

register "gpe0_en" = "0x11000006"
diff --git a/src/mainboard/roda/rk886ex/devicetree.cb b/src/mainboard/roda/rk886ex/devicetree.cb
index ec42766..efe8ce1 100644
--- a/src/mainboard/roda/rk886ex/devicetree.cb
+++ b/src/mainboard/roda/rk886ex/devicetree.cb
@@ -61,7 +61,6 @@
register "ide_legacy_combined" = "0x1"
register "ide_enable_primary" = "0x1"
register "ide_enable_secondary" = "0x0"
- register "sata_ahci" = "0x0"

device pci 1b.0 off end # High Definition Audio
device pci 1c.0 on end # PCIe port 1
diff --git a/src/southbridge/intel/i82801gx/chip.h b/src/southbridge/intel/i82801gx/chip.h
index db27ef7..019c65e 100644
--- a/src/southbridge/intel/i82801gx/chip.h
+++ b/src/southbridge/intel/i82801gx/chip.h
@@ -65,7 +65,7 @@
uint32_t ide_legacy_combined;
uint32_t ide_enable_primary;
uint32_t ide_enable_secondary;
- uint32_t sata_ahci;
+ uint32_t sata_no_ahci;
uint32_t sata_ports_implemented;

/* Enable linear PCIe Root Port function numbers starting at zero */
diff --git a/src/southbridge/intel/i82801gx/i82801gx.h b/src/southbridge/intel/i82801gx/i82801gx.h
index d37a822..521d372 100644
--- a/src/southbridge/intel/i82801gx/i82801gx.h
+++ b/src/southbridge/intel/i82801gx/i82801gx.h
@@ -90,6 +90,7 @@

#define FDVCT 0xe4
#define PCIE_4_PORTS_MAX (1 << 7)
+#define AHCI_UNSUPPORTED (1 << 3)

/* GEN_PMCON_3 bits */
#define RTC_BATTERY_DEAD (1 << 2)
diff --git a/src/southbridge/intel/i82801gx/sata.c b/src/southbridge/intel/i82801gx/sata.c
index 567c1e5..dcd9b80 100644
--- a/src/southbridge/intel/i82801gx/sata.c
+++ b/src/southbridge/intel/i82801gx/sata.c
@@ -71,6 +71,10 @@
u32 *ahci_bar;
u8 ports;

+
+ struct device *lpc_dev = pcidev_path_on_root(PCI_DEVFN(31, 0));
+ bool ahci_supported = pci_read_config32(lpc_dev, FDVCT) & ACHI_UNSUPPORTED ? false : true;
+
/* Get the chip configuration */
config_t *config = dev->chip_info;

@@ -87,7 +91,18 @@
/* Enable BARs */
pci_write_config16(dev, PCI_COMMAND, 0x0007);

- if (config->ide_legacy_combined) {
+ if (ahci_supported && !config->sata_no_ahci) {
+ printk(BIOS_DEBUG, "SATA controller in AHCI mode.\n");
+ /* Allow both Legacy and Native mode */
+ pci_write_config8(dev, 0x09, 0x8f);
+
+ /* Set Interrupt Line */
+ /* Interrupt Pin is set by D31IP.PIP */
+ pci_write_config8(dev, INTR_LN, 0x0a);
+
+ ahci_bar = (u32 *)(pci_read_config32(dev, 0x27) & ~0x3ff);
+ ahci_bar[3] = config->sata_ports_implemented;
+ } else if (config->ide_legacy_combined) {
printk(BIOS_DEBUG, "SATA controller in combined mode.\n");
/* No AHCI: clear AHCI base */
pci_write_config32(dev, 0x24, 0x00000000);
@@ -118,17 +133,6 @@

/* Restrict ports - 0 and 2 only available */
ports &= 0x5;
- } else if (config->sata_ahci) {
- printk(BIOS_DEBUG, "SATA controller in AHCI mode.\n");
- /* Allow both Legacy and Native mode */
- pci_write_config8(dev, 0x09, 0x8f);
-
- /* Set Interrupt Line */
- /* Interrupt Pin is set by D31IP.PIP */
- pci_write_config8(dev, INTR_LN, 0x0a);
-
- ahci_bar = (u32 *)(pci_read_config32(dev, 0x27) & ~0x3ff);
- ahci_bar[3] = config->sata_ports_implemented;
} else {
printk(BIOS_DEBUG, "SATA controller in plain mode.\n");
/* Set Sata Controller Mode. No Mapping(?) */

To view, visit change 30822. To unsubscribe, or for help writing mail filters, visit settings.

Gerrit-Project: coreboot
Gerrit-Branch: master
Gerrit-Change-Id: I8d9f4e63ae8b2862c422938f3103c44e761bcda4
Gerrit-Change-Number: 30822
Gerrit-PatchSet: 1
Gerrit-Owner: Arthur Heymans <arthur@aheymans.xyz>
Gerrit-Reviewer: Alexander Couzens <lynxis@fe80.eu>
Gerrit-Reviewer: Angel Pons <th3fanbus@gmail.com>
Gerrit-Reviewer: Arthur Heymans <arthur@aheymans.xyz>
Gerrit-Reviewer: Patrick Rudolph <siro@das-labor.org>
Gerrit-MessageType: newchange