summaryrefslogtreecommitdiffstats
path: root/resources/libreboot/patch/kgpe-d16/0067-southbridge-amd-sb700-Fix-SATA-port-4-5-drive-detect.patch
blob: 64663549821e4a9593adf4c18da12ea863aae263 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
From 0785e1c4b21ee56c6265df7b6c7f95ad94a43fbb Mon Sep 17 00:00:00 2001
From: Timothy Pearson <tpearson@raptorengineeringinc.com>
Date: Mon, 22 Jun 2015 02:56:10 -0500
Subject: [PATCH 067/139] southbridge/amd/sb700: Fix SATA port 4/5 drive
 detection

Change-Id: I01481f25189d01b6f4ed778902b2ecc4d39c7912
Signed-off-by: Timothy Pearson <tpearson@raptorengineeringinc.com>
---
 src/southbridge/amd/sb700/sata.c | 42 ++++++++++++++++++++++++++++++++++++----
 1 file changed, 38 insertions(+), 4 deletions(-)

diff --git a/src/southbridge/amd/sb700/sata.c b/src/southbridge/amd/sb700/sata.c
index ce242c1..dc64082 100644
--- a/src/southbridge/amd/sb700/sata.c
+++ b/src/southbridge/amd/sb700/sata.c
@@ -126,6 +126,8 @@ static void sata_init(struct device *dev)
 	uint8_t port_count;
 	uint8_t max_port_count;
 	uint8_t hba_reset_count;
+	uint8_t ide_io_enabled;
+	uint8_t ide_legacy_io_enabled;
 
 	sata_ahci_mode = 0;
 	if (get_option(&nvram, "sata_ahci_mode") == CB_SUCCESS)
@@ -170,15 +172,27 @@ retry_init:
 		}
 	}
 
-	/* Disable combined mode */
+	/* Enable combined mode */
 	byte = pci_read_config8(sm_dev, 0xad);
-	byte &= ~(1 << 3);
+	byte |= (1 << 3);
 	pci_write_config8(sm_dev, 0xad, byte);
 
 	device_t ide_dev;
 	/* IDE Device */
 	ide_dev = dev_find_slot(0, PCI_DEVFN(0x14, 1));
 
+	/* Disable legacy IDE mode (enable PATA_BAR0/2) */
+	byte = pci_read_config8(ide_dev, 0x09);
+	ide_legacy_io_enabled = !(byte & 0x1);
+	byte |= 0x1;
+	pci_write_config8(ide_dev, 0x09, byte);
+
+	/* Enable IDE I/O access (enable PATA_BAR0/2) */
+	byte = pci_read_config8(ide_dev, 0x04);
+	ide_io_enabled = byte & 0x1;
+	byte |= 0x1;
+	pci_write_config8(ide_dev, 0x04, byte);
+
 	/* RPR 7.2 SATA Initialization */
 	/* Set the interrupt Mapping to INTG# */
 	byte = pci_read_config8(sm_dev, 0xaf);
@@ -425,7 +439,8 @@ retry_init:
 
 					/* Disable SATA controller */
 					byte = pci_read_config8(sm_dev, 0xad);
-					byte &= ~(0x1);
+					byte &= ~(1 << 0);
+					byte &= ~(1 << 3);
 					pci_write_config8(sm_dev, 0xad, byte);
 
 					mdelay(100);
@@ -460,8 +475,27 @@ retry_init:
 		}
 	}
 
+	/* Restore IDE I/O access */
+	if (!ide_io_enabled) {
+		byte = pci_read_config8(ide_dev, 0x04);
+		byte &= ~0x1;
+		pci_write_config8(ide_dev, 0x04, byte);
+	}
+
+	/* Re-enable legacy IDE mode */
+	if (ide_legacy_io_enabled) {
+		byte = pci_read_config8(ide_dev, 0x09);
+		byte &= ~0x1;
+		pci_write_config8(ide_dev, 0x09, byte);
+	}
+
 	/* Below is CIM InitSataLateFar */
-	if (!sata_ahci_mode) {
+	if (sata_ahci_mode) {
+		/* Disable combined mode */
+		byte = pci_read_config8(sm_dev, 0xad);
+		byte &= ~(1 << 3);
+		pci_write_config8(sm_dev, 0xad, byte);
+	} else {
 		/* Enable interrupts from the HBA  */
 		byte = read8(sata_bar5 + 0x4);
 		byte |= 1 << 1;
-- 
1.9.1