summaryrefslogtreecommitdiffstats
path: root/resources/libreboot/patch/kgpe-d16/0068-southbridge-amd-sb700-Recover-if-AHCI-disk-detection.patch
diff options
context:
space:
mode:
Diffstat (limited to 'resources/libreboot/patch/kgpe-d16/0068-southbridge-amd-sb700-Recover-if-AHCI-disk-detection.patch')
-rw-r--r--resources/libreboot/patch/kgpe-d16/0068-southbridge-amd-sb700-Recover-if-AHCI-disk-detection.patch161
1 files changed, 0 insertions, 161 deletions
diff --git a/resources/libreboot/patch/kgpe-d16/0068-southbridge-amd-sb700-Recover-if-AHCI-disk-detection.patch b/resources/libreboot/patch/kgpe-d16/0068-southbridge-amd-sb700-Recover-if-AHCI-disk-detection.patch
deleted file mode 100644
index dbc48be..0000000
--- a/resources/libreboot/patch/kgpe-d16/0068-southbridge-amd-sb700-Recover-if-AHCI-disk-detection.patch
+++ /dev/null
@@ -1,161 +0,0 @@
-From 2c28e8112799a9ec7b72478c0593664dbeab4757 Mon Sep 17 00:00:00 2001
-From: Timothy Pearson <kb9vqf@pearsoncomputing.net>
-Date: Mon, 22 Jun 2015 02:21:29 -0500
-Subject: [PATCH 068/146] southbridge/amd/sb700: Recover if AHCI disk
- detection fails
-
----
- src/southbridge/amd/sb700/sata.c | 83 ++++++++++++++++++++++++++++++++++----
- 1 file changed, 75 insertions(+), 8 deletions(-)
-
-diff --git a/src/southbridge/amd/sb700/sata.c b/src/southbridge/amd/sb700/sata.c
-index 9f610a4..f27ec49 100644
---- a/src/southbridge/amd/sb700/sata.c
-+++ b/src/southbridge/amd/sb700/sata.c
-@@ -31,12 +31,15 @@
- static int sata_drive_detect(int portnum, uint16_t iobar)
- {
- u8 byte, byte2;
-+ u8 byte_prev, byte2_prev;
- int i = 0;
-+ byte_prev = byte2_prev = 0;
- outb(0xa0 + 0x10 * (portnum % 2), iobar + 0x6);
- while (byte = inb(iobar + 0x6), byte2 = inb(iobar + 0x7),
- (byte != (0xa0 + 0x10 * (portnum % 2))) ||
- ((byte2 & 0x88) != 0)) {
-- printk(BIOS_SPEW, "0x6=%x, 0x7=%x\n", byte, byte2);
-+ if ((byte != byte_prev) || (byte2 != byte2_prev))
-+ printk(BIOS_SPEW, "0x6=%x, 0x7=%x\n", byte, byte2);
- if (byte != (0xa0 + 0x10 * (portnum % 2))) {
- /* This will happen at the first iteration of this loop
- * if the first SATA port is unpopulated and the
-@@ -45,11 +48,22 @@ static int sata_drive_detect(int portnum, uint16_t iobar)
- printk(BIOS_DEBUG, "drive no longer selected after %i ms, "
- "retrying init\n", i * 10);
- return 1;
-- } else
-- printk(BIOS_SPEW, "drive detection not yet completed, "
-- "waiting...\n");
-+ } else {
-+ if (i == 0)
-+ printk(BIOS_SPEW, "drive detection not yet completed, "
-+ "waiting...\n");
-+ }
- mdelay(10);
- i++;
-+ byte_prev = byte;
-+ byte2_prev = byte2;
-+
-+ /* Detect stuck SATA controller and attempt reset */
-+ if (i > 1024) {
-+ printk(BIOS_DEBUG, "drive detection not done after %i ms, "
-+ "resetting HBA and retrying init\n", i * 10);
-+ return 2;
-+ }
- }
- printk(BIOS_SPEW, "drive detection done after %i ms\n", i * 10);
- return 0;
-@@ -105,12 +119,13 @@ static void sata_init(struct device *dev)
- uint16_t sata_bar0, sata_bar1, sata_bar2, sata_bar3, sata_bar4;
- uint16_t ide_bar0, ide_bar1, ide_bar2, ide_bar3;
- uint16_t current_bar;
-- int i, j;
-+ int i, j, ret;
- uint8_t nvram;
- uint8_t sata_ahci_mode;
- uint8_t sata_alpm_enable;
- uint8_t port_count;
- uint8_t max_port_count;
-+ uint8_t hba_reset_count;
-
- sata_ahci_mode = 0;
- if (get_option(&nvram, "sata_ahci_mode") == CB_SUCCESS)
-@@ -124,14 +139,23 @@ static void sata_init(struct device *dev)
- /* SATA SMBus Disable */
- sm_dev = dev_find_slot(0, PCI_DEVFN(0x14, 0));
-
-+ hba_reset_count = 0;
-+
-+retry_init:
- byte = pci_read_config8(sm_dev, 0xad);
- /* Disable SATA SMBUS */
-- byte |= (1 << 0);
-- /* Enable SATA and power saving */
- byte |= (1 << 1);
-+ /* Enable SATA and power saving */
-+ byte |= (1 << 0);
- byte |= (1 << 5);
- pci_write_config8(sm_dev, 0xad, byte);
-
-+ /* Take the PHY logic out of reset */
-+ word = pci_read_config16(dev, 0x84);
-+ word |= 0x1 << 2;
-+ word &= ~0x1f8;
-+ pci_write_config16(dev, 0x84, word);
-+
- /* get rev_id */
- rev_id = pci_read_config8(sm_dev, 0x08) - 0x28;
-
-@@ -324,6 +348,26 @@ static void sata_init(struct device *dev)
- if (port_count > max_port_count)
- port_count = max_port_count;
-
-+ /* Send COMRESET to all ports */
-+ for (i = 0; i < port_count; i++) {
-+ /* Read in Port-N Serial ATA Control Register */
-+ byte = read8(sata_bar5 + 0x12C + 0x80 * i);
-+
-+ /* Set Reset Bit */
-+ byte |= 0x1;
-+ 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);
-+ }
-+
- /* RPR7.7 SATA drive detection. */
- /* Use BAR5+0x128,BAR0 for Primary Slave */
- /* Use BAR5+0x1A8,BAR0 for Primary Slave */
-@@ -369,8 +413,31 @@ static void sata_init(struct device *dev)
- current_bar = ((i / 2) == 0) ? sata_bar0 : sata_bar2;
- else
- current_bar = ide_bar0;
-- if (!sata_drive_detect(i, current_bar))
-+ ret = sata_drive_detect(i, current_bar);
-+ if (ret == 0) {
- break;
-+ } else if (ret == 2) {
-+ /* Reset PHY logic */
-+ word = pci_read_config16(dev, 0x84);
-+ word &= ~(0x1 << 2);
-+ word |= 0x1f8;
-+ pci_write_config16(dev, 0x84, word);
-+
-+ /* Disable SATA controller */
-+ byte = pci_read_config8(sm_dev, 0xad);
-+ byte &= ~(0x1);
-+ pci_write_config8(sm_dev, 0xad, byte);
-+
-+ mdelay(100);
-+
-+ /* Retry initialization */
-+ hba_reset_count++;
-+ if (hba_reset_count < 16)
-+ goto retry_init;
-+ else
-+ printk(BIOS_WARNING, "HBA reset count exceeded, "
-+ "continuing but AHCI drives may not function\n");
-+ }
- }
- if (sata_ahci_mode)
- printk(BIOS_DEBUG, "AHCI device %d is %sready after %i tries\n",
---
-1.7.9.5
-