cbmk/config/seabios/default/patches/0004-ahci-Only-reset-controller-on-CSM.patch
Leah Rowe d51b995528 Restore SeaBIOS 9029a010 update, but with AHCI fix
I fixed the AHCI bug, with a patch that I wrote. It works by
restoring the old SeaBIOS AHCI initialisation behaviour, whereby
the AHCI controller is enabled from its current state; the patch
that broke AHCI in coreboot (tested on ThinkPad T420), changed
AHCI initialisation behaviour so that the controller's state is
first reset, prior to enablement.

However, my patch also retains the new AHCI initialisation
behaviour, when a CSM is in use. The AHCI reset patch was done,
by the author, specifically for SeaBIOS in CSM mode, so it makes
sense to only change the behaviour conditionally according to that.

This reverts commit 8245f0b3211812ac818adadd6526b0b39c63f3f0.

Signed-off-by: Leah Rowe <leah@libreboot.org>
2025-05-02 02:26:06 +01:00

63 lines
2.1 KiB
Diff

From 5fe2215bc5196d836b54e1e5fb00b63fa096fda7 Mon Sep 17 00:00:00 2001
From: Leah Rowe <leah@libreboot.org>
Date: Thu, 1 May 2025 15:46:54 +0100
Subject: [PATCH 4/4] ahci: Only reset controller on CSM
Please refer to this commit:
commit 8863cbbd15a73b03153553c562f5b1fb939ad4d7
Author: Gerd Hoffmann <kraxel@redhat.com>
Date: Thu Feb 6 12:10:21 2025 +0100
ahci: add controller reset
This commit broke AHCI init on the Lenovo ThinkPad T420,
when tested with SeaBIOS as a coreboot payload.
Since the above commit was made with CSMs in mind, to make
the AHCI driver work there, that change has been re-worked
so as to only apply when a CSM is in use.
Signed-off-by: Leah Rowe <leah@libreboot.org>
---
src/hw/ahci.c | 17 ++++++++++++++---
1 file changed, 14 insertions(+), 3 deletions(-)
diff --git a/src/hw/ahci.c b/src/hw/ahci.c
index 2285d33d..b09b198a 100644
--- a/src/hw/ahci.c
+++ b/src/hw/ahci.c
@@ -637,7 +637,7 @@ static void
ahci_controller_setup(struct pci_device *pci)
{
struct ahci_port_s *port;
- u32 pnr, max;
+ u32 val, pnr, max;
if (create_bounce_buf() < 0)
return;
@@ -660,8 +660,19 @@ ahci_controller_setup(struct pci_device *pci)
pci_enable_busmaster(pci);
- ahci_ctrl_writel(ctrl, HOST_CTL, HOST_CTL_RESET);
- ahci_ctrl_writel(ctrl, HOST_CTL, HOST_CTL_AHCI_EN);
+ /* AHCI controller reset, but only for CSM. Commit 8863cbbd
+ introduced this universally, to make AHCI drivers work in
+ CSM mode, but it broke AHCI setup on the ThinkPad T420 when
+ SeaBIOS is used as a coreboot payload, hence the else clause: */
+ if (CONFIG_CSM) {
+ /* Enable AHCI controller after resetting its state */
+ ahci_ctrl_writel(ctrl, HOST_CTL, HOST_CTL_RESET);
+ ahci_ctrl_writel(ctrl, HOST_CTL, HOST_CTL_AHCI_EN);
+ } else {
+ /* Enable AHCI controller from its current state */
+ val = ahci_ctrl_readl(ctrl, HOST_CTL);
+ ahci_ctrl_writel(ctrl, HOST_CTL, val | HOST_CTL_AHCI_EN);
+ }
ctrl->caps = ahci_ctrl_readl(ctrl, HOST_CAP);
ctrl->ports = ahci_ctrl_readl(ctrl, HOST_PORTS_IMPL);
--
2.39.5