This series replaces the monolithic SataControllerDxe driver, which was copied from another platform and then expanded to add platform specific initialization routines and PCI I/O emulation, and instead switches to a simple platform SATA driver, which exposes the SATA IP blocks via a pair of UEFI driver model handles, and relegates all further handling to the generic platform PCI I/O driver, and the generic SATA driver.
This not only allows us to remove a fair chunk of (copied and unmaintained) code, it also makes it possible to easily use both SATA controllers at the same time. On Overdrive B1, all 14 SATA ports are available to UEFI and to the OS (with the caveat that the kernel fails to bring up the second controller in ACPI mode, but this looks like a kernel issue not a UEFI issue)
Patch #1 is an unrelated but useful patch that re-enables the descriptive names of drivers. It is unclear why this was disabled in the first place.
Patch #2 creates a new StyxSataPlatformDxe driver containing the existing SATA init code, and some simple calls to instantiate the device handles that identify the controllers as AHCI compatible and suitable for being driven by the PCI based generic driver
Patch #3 - #5 switch Overdrive, Cello and SoftIron 1000 to the new driver.
Patch #6 enables the second AHCI ACPI node if any ports are enabled on controller #2
Patch #7 enables the second AHCI DT node if any ports are enabled on controller #2
Patch #8 removes the old SataControllerDxe now that it is no longer used.
Note that this series relies on patches that are not yet in mainline Tianocore. Those patches can be found here:
https://git.linaro.org/people/ard.biesheuvel/uefi-next.git/log/?h=pciio-emu
Ard Biesheuvel (8): Platforms/AMD/Styx: don't disable component names and driver diagnostics Platforms/AMD/Styx: split off SATA init code into StyxSataPlatformDxe driver Platforms/AMD/Overdrive: switch to generic AHCI driver Platforms/AMD/Cello: switch to generic AHCI driver Platforms/AMD/Overdrive1000: switch to generic AHCI driver Platforms/AMD/Styx/AcpiTables: enable second SATA controller Platforms/AMD/Styx/FdtDxe: enable second SATA controller Platforms/AMD/Styx: remove SataControllerDxe
Platforms/AMD/Styx/AcpiTables/AcpiTables.inf | 1 + Platforms/AMD/Styx/AcpiTables/Dsdt.c | 9 +- Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc | 16 +- Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf | 4 +- Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c | 7 +- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf | 1 + Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c | 178 ---- Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c | 172 ---- Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c | 442 --------- Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h | 289 ------ Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c | 307 ------ Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c | 1027 -------------------- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h | 555 ----------- Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c | 181 ++++ Platforms/AMD/Styx/Drivers/{SataControllerDxe => StyxSataPlatformDxe}/SataRegisters.h | 0 Platforms/AMD/Styx/Drivers/{SataControllerDxe/SataControllerDxe.inf => StyxSataPlatformDxe/StyxSataPlatformDxe.inf} | 42 +- Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc | 12 +- Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf | 4 +- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc | 16 +- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf | 4 +- 20 files changed, 224 insertions(+), 3043 deletions(-) delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c delete mode 100644 Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h create mode 100644 Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c rename Platforms/AMD/Styx/Drivers/{SataControllerDxe => StyxSataPlatformDxe}/SataRegisters.h (100%) rename Platforms/AMD/Styx/Drivers/{SataControllerDxe/SataControllerDxe.inf => StyxSataPlatformDxe/StyxSataPlatformDxe.inf} (59%)
Drop the following PCD settings from Cello and Overdrive, which remove support for display descriptive names when listing drivers and devices.
gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc | 5 ----- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc | 5 ----- 2 files changed, 10 deletions(-)
diff --git a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc index dda107ceca06..e668b6b06d13 100644 --- a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc +++ b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc @@ -272,11 +272,6 @@ DEFINE DO_KCS = 0 ################################################################################
[PcdsFeatureFlag.common] - gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE - gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE - gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE - gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE - # All pages are cached by default gEmbeddedTokenSpaceGuid.PcdCacheEnable|TRUE
diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc index 232bab7fc888..70b94df7d6da 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc @@ -279,11 +279,6 @@ DEFINE DO_KCS = 1 ################################################################################
[PcdsFeatureFlag.common] - gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE - gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE - gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE - gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE - # All pages are cached by default gEmbeddedTokenSpaceGuid.PcdCacheEnable|TRUE
On Tue, Nov 01, 2016 at 05:25:08PM +0000, Ard Biesheuvel wrote:
Drop the following PCD settings from Cello and Overdrive, which remove support for display descriptive names when listing drivers and devices.
Suggest rewording as: --- Enable displaying of descriptive names when listing drivers and devices by dropping the following overrides of default PCD values: --- With that: Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
(No need to include for any v2 of the series, this one stands on its own.)
gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc | 5 ----- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc | 5 ----- 2 files changed, 10 deletions(-)
diff --git a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc index dda107ceca06..e668b6b06d13 100644 --- a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc +++ b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc @@ -272,11 +272,6 @@ DEFINE DO_KCS = 0 ################################################################################ [PcdsFeatureFlag.common]
- gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
- # All pages are cached by default gEmbeddedTokenSpaceGuid.PcdCacheEnable|TRUE
diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc index 232bab7fc888..70b94df7d6da 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc @@ -279,11 +279,6 @@ DEFINE DO_KCS = 1 ################################################################################ [PcdsFeatureFlag.common]
- gEfiMdePkgTokenSpaceGuid.PcdComponentNameDisable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnosticsDisable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdComponentName2Disable|TRUE
- gEfiMdePkgTokenSpaceGuid.PcdDriverDiagnostics2Disable|TRUE
- # All pages are cached by default gEmbeddedTokenSpaceGuid.PcdCacheEnable|TRUE
2.7.4
On 1 November 2016 at 23:16, Leif Lindholm leif.lindholm@linaro.org wrote:
On Tue, Nov 01, 2016 at 05:25:08PM +0000, Ard Biesheuvel wrote:
Drop the following PCD settings from Cello and Overdrive, which remove support for display descriptive names when listing drivers and devices.
Suggest rewording as:
Enable displaying of descriptive names when listing drivers and devices by dropping the following overrides of default PCD values:
With that: Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
(No need to include for any v2 of the series, this one stands on its own.)
Pushed, thanks.
Create a new Styx platform driver StyxSataPlatformDxe which contains the existing platform specific SATA initialization code, but uses the new platform PCI I/O driver to register the platform AHCI devices.
This has two advantages: - we can use generic drivers for the platform PCI I/O emulation, and for the AHCI support built on top of it, - we can register both SATA devices, allowing us to use all 14 ports on Overdrive B1
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c | 181 ++++++++++++++++++++ Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h | 180 +++++++++++++++++++ Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf | 61 +++++++ 3 files changed, 422 insertions(+)
diff --git a/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c new file mode 100644 index 000000000000..e9cc1f9d52c7 --- /dev/null +++ b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c @@ -0,0 +1,181 @@ +/** @file + Initialize SATA Phy, Serdes, and Controller. + + Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> + Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR> + + This program and the accompanying materials are licensed and made available + under the terms and conditions of the BSD License which accompanies this + distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +**/ + +#include "SataRegisters.h" + +#include <Library/AmdSataInitLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> +#include <Library/PlatformPciIoDeviceRegistrationLib.h> + +STATIC +VOID +ResetSataController ( + EFI_PHYSICAL_ADDRESS AhciBaseAddr + ) +{ + // Make a minimal global reset for HBA regiser + MmioOr32 (AhciBaseAddr + EFI_AHCI_GHC_OFFSET, EFI_AHCI_GHC_RESET); + + // Clear all interrupts + MmioWrite32 (AhciBaseAddr + EFI_AHCI_PORT_IS, EFI_AHCI_PORT_IS_CLEAR); + + // Turn on interrupts and ensure that the HBA is working in AHCI mode + MmioOr32 (AhciBaseAddr + EFI_AHCI_GHC_OFFSET, + EFI_AHCI_GHC_IE | EFI_AHCI_GHC_ENABLE); +} + +STATIC +VOID +SetSataCapabilities ( + EFI_PHYSICAL_ADDRESS AhciBaseAddr + ) +{ + UINT32 Capability; + + Capability = 0; + if (FixedPcdGetBool (PcdSataSssSupport)) // Staggered Spin-Up Support bit + Capability |= EFI_AHCI_CAP_SSS; + if (FixedPcdGetBool (PcdSataSmpsSupport)) // Mechanical Presence Support bit + Capability |= EFI_AHCI_CAP_SMPS; + + MmioOr32 (AhciBaseAddr + EFI_AHCI_CAPABILITY_OFFSET, Capability); +} + +STATIC +VOID +InitializeSataPorts ( + EFI_PHYSICAL_ADDRESS AhciBaseAddr, + UINTN PortCount + ) +{ + INTN PortNum; + BOOLEAN IsCpd; + BOOLEAN IsMpsp; + UINT32 PortRegAddr; + UINT32 RegVal; + + // Set Ports Implemented (PI) + MmioWrite32 (AhciBaseAddr + EFI_AHCI_PI_OFFSET, (1 << PortCount) - 1); + + IsCpd = FixedPcdGetBool (PcdSataPortCpd); + IsMpsp = FixedPcdGetBool (PcdSataPortMpsp); + if (!IsCpd && !IsMpsp) { + return; + } + + for (PortNum = 0; PortNum < PortCount; PortNum++) { + PortRegAddr = EFI_AHCI_PORT_OFFSET (PortNum) + EFI_AHCI_PORT_CMD; + RegVal = MmioRead32(AhciBaseAddr + PortRegAddr); + if (IsCpd) + RegVal |= EFI_AHCI_PORT_CMD_CPD; + else + RegVal &= ~EFI_AHCI_PORT_CMD_CPD; + if (IsMpsp) + RegVal |= EFI_AHCI_PORT_CMD_MPSP; + else + RegVal &= ~EFI_AHCI_PORT_CMD_MPSP; + RegVal |= EFI_AHCI_PORT_CMD_HPCP; + MmioWrite32(AhciBaseAddr + PortRegAddr, RegVal); + } +} + +STATIC +EFI_STATUS +InitializeSataController ( + EFI_PHYSICAL_ADDRESS AhciBaseAddr, + UINTN SataPortCount, + UINTN StartPort + ) +{ + UINT8 SataChPerSerdes; + UINT32 PortNum; + UINT32 EvenPort; + UINT32 OddPort; + + SataChPerSerdes = FixedPcdGet8 (PcdSataNumChPerSerdes); + + for (PortNum = 0; PortNum < SataPortCount; PortNum += SataChPerSerdes) { + EvenPort = (UINT32)(FixedPcdGet16 (PcdSataPortMode) >> (PortNum * 2)) & 3; + OddPort = (UINT32)(FixedPcdGet16 (PcdSataPortMode) >> ((PortNum+1) * 2)) & 3; + SataPhyInit ((StartPort + PortNum) / SataChPerSerdes, EvenPort, OddPort); + } + + // + // Reset SATA controller + // + ResetSataController (AhciBaseAddr); + + // + // Set SATA capabilities + // + SetSataCapabilities (AhciBaseAddr); + + // + // Set and intialize the Sata ports + // + InitializeSataPorts (AhciBaseAddr, SataPortCount); + + return PlatformPciIoRegisterDevice (AhciBaseAddr, PlatformPciIoDeviceAhci, + PlatformPciIoDmaCoherent, NULL, NULL); +} + +EFI_STATUS +EFIAPI +StyxSataPlatformDxeEntryPoint ( + IN EFI_HANDLE ImageHandle, + IN EFI_SYSTEM_TABLE *SystemTable + ) +{ + UINT32 PortNum; + EFI_STATUS Status; + + // + // Perform SATA workarounds + // + for (PortNum = 0; PortNum < FixedPcdGet8(PcdSataPortCount); PortNum++) { + SetCwMinSata0 (PortNum); + } + + Status = InitializeSataController (FixedPcdGet32(PcdSataCtrlAxiSlvPort), + FixedPcdGet8(PcdSataPortCount), 0); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: failed to initialize primary SATA controller!\n", + __FUNCTION__)); + return Status; + } + + for (PortNum = 0; PortNum < FixedPcdGet8(PcdSataPortCount); PortNum++) { + SetPrdSingleSata0 (PortNum); + } + + if (FixedPcdGet8(PcdSata1PortCount) > 0) { + for (PortNum = 0; PortNum < FixedPcdGet8(PcdSata1PortCount); PortNum++) { + SetCwMinSata1 (PortNum); + } + + Status = InitializeSataController (FixedPcdGet32(PcdSata1CtrlAxiSlvPort), + FixedPcdGet8(PcdSata1PortCount), FixedPcdGet8(PcdSataPortCount)); + if (EFI_ERROR (Status)) { + DEBUG ((DEBUG_WARN, "%a: failed to initialize secondary SATA controller!\n", + __FUNCTION__)); + } else { + for (PortNum = 0; PortNum < FixedPcdGet8(PcdSata1PortCount); PortNum++) { + SetPrdSingleSata1 (PortNum); + } + } + } + return EFI_SUCCESS; +} diff --git a/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h new file mode 100644 index 000000000000..ff78f4ac3c67 --- /dev/null +++ b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h @@ -0,0 +1,180 @@ +/** @file + Header file for AHCI mode of ATA host controller. + + Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> + Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> + + This program and the accompanying materials + are licensed and made available under the terms and conditions of the BSD License + which accompanies this distribution. The full text of the license may be found at + http://opensource.org/licenses/bsd-license.php + + THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, + WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ +#ifndef __SATA_REGISTERS_H__ +#define __SATA_REGISTERS_H__ + +#define EFI_AHCI_BAR_INDEX 0x05 + +#define EFI_AHCI_CAPABILITY_OFFSET 0x0000 +#define EFI_AHCI_CAP_SSS BIT27 +#define EFI_AHCI_CAP_SMPS BIT28 +#define EFI_AHCI_CAP_S64A BIT31 +#define EFI_AHCI_GHC_OFFSET 0x0004 +#define EFI_AHCI_GHC_RESET BIT0 +#define EFI_AHCI_GHC_IE BIT1 +#define EFI_AHCI_GHC_ENABLE BIT31 +#define EFI_AHCI_IS_OFFSET 0x0008 +#define EFI_AHCI_PI_OFFSET 0x000C + +#define EFI_AHCI_MAX_PORTS 32 + +// +// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms. +// +#define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 10 +// +// Refer SATA1.0a spec, the FIS enable time should be less than 500ms. +// +#define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500) +// +// Refer SATA1.0a spec, the bus reset time should be less than 1s. +// +#define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1) + +#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000 +#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000 +#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000 +#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000 + +// +// Each PRDT entry can point to a memory block up to 4M byte +// +#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000 + +#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device +#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20 +#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host +#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20 +#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host +#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4 +#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional +#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28 +#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional +#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional +#define EFI_AHCI_FIS_BIST_LENGTH 12 +#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host +#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20 +#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host +#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8 + +#define EFI_AHCI_D2H_FIS_OFFSET 0x40 +#define EFI_AHCI_DMA_FIS_OFFSET 0x00 +#define EFI_AHCI_PIO_FIS_OFFSET 0x20 +#define EFI_AHCI_SDB_FIS_OFFSET 0x58 +#define EFI_AHCI_FIS_TYPE_MASK 0xFF +#define EFI_AHCI_U_FIS_OFFSET 0x60 + +// +// Port register +// +#define EFI_AHCI_PORT_START 0x0100 +#define EFI_AHCI_PORT_REG_WIDTH 0x0080 +#define EFI_AHCI_PORT_CLB 0x0000 +#define EFI_AHCI_PORT_CLBU 0x0004 +#define EFI_AHCI_PORT_FB 0x0008 +#define EFI_AHCI_PORT_FBU 0x000C +#define EFI_AHCI_PORT_IS 0x0010 +#define EFI_AHCI_PORT_IS_DHRS BIT0 +#define EFI_AHCI_PORT_IS_PSS BIT1 +#define EFI_AHCI_PORT_IS_SSS BIT2 +#define EFI_AHCI_PORT_IS_SDBS BIT3 +#define EFI_AHCI_PORT_IS_UFS BIT4 +#define EFI_AHCI_PORT_IS_DPS BIT5 +#define EFI_AHCI_PORT_IS_PCS BIT6 +#define EFI_AHCI_PORT_IS_DIS BIT7 +#define EFI_AHCI_PORT_IS_PRCS BIT22 +#define EFI_AHCI_PORT_IS_IPMS BIT23 +#define EFI_AHCI_PORT_IS_OFS BIT24 +#define EFI_AHCI_PORT_IS_INFS BIT26 +#define EFI_AHCI_PORT_IS_IFS BIT27 +#define EFI_AHCI_PORT_IS_HBDS BIT28 +#define EFI_AHCI_PORT_IS_HBFS BIT29 +#define EFI_AHCI_PORT_IS_TFES BIT30 +#define EFI_AHCI_PORT_IS_CPDS BIT31 +#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF +#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F + +#define EFI_AHCI_PORT_OFFSET(PortNum) \ + (EFI_AHCI_PORT_START + ((PortNum) * EFI_AHCI_PORT_REG_WIDTH)) + +#define EFI_AHCI_PORT_IE 0x0014 +#define EFI_AHCI_PORT_CMD 0x0018 +#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE +#define EFI_AHCI_PORT_CMD_ST BIT0 +#define EFI_AHCI_PORT_CMD_SUD BIT1 +#define EFI_AHCI_PORT_CMD_POD BIT2 +#define EFI_AHCI_PORT_CMD_CLO BIT3 +#define EFI_AHCI_PORT_CMD_CR BIT15 +#define EFI_AHCI_PORT_CMD_FRE BIT4 +#define EFI_AHCI_PORT_CMD_FR BIT14 +#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL) +#define EFI_AHCI_PORT_CMD_PMA BIT17 +#define EFI_AHCI_PORT_CMD_HPCP BIT18 +#define EFI_AHCI_PORT_CMD_MPSP BIT19 +#define EFI_AHCI_PORT_CMD_CPD BIT20 +#define EFI_AHCI_PORT_CMD_ESP BIT21 +#define EFI_AHCI_PORT_CMD_ATAPI BIT24 +#define EFI_AHCI_PORT_CMD_DLAE BIT25 +#define EFI_AHCI_PORT_CMD_ALPE BIT26 +#define EFI_AHCI_PORT_CMD_ASP BIT27 +#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) +#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 ) +#define EFI_AHCI_PORT_TFD 0x0020 +#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) +#define EFI_AHCI_PORT_TFD_BSY BIT7 +#define EFI_AHCI_PORT_TFD_DRQ BIT3 +#define EFI_AHCI_PORT_TFD_ERR BIT0 +#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00 +#define EFI_AHCI_PORT_SIG 0x0024 +#define EFI_AHCI_PORT_SSTS 0x0028 +#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F +#define EFI_AHCI_PORT_SSTS_DET 0x0001 +#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003 +#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0 +#define EFI_AHCI_PORT_SCTL 0x002C +#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F +#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK) +#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001 +#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003 +#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0 +#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00 +#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300 +#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100 +#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200 +#define EFI_AHCI_PORT_SERR 0x0030 +#define EFI_AHCI_PORT_SERR_RDIE BIT0 +#define EFI_AHCI_PORT_SERR_RCE BIT1 +#define EFI_AHCI_PORT_SERR_TDIE BIT8 +#define EFI_AHCI_PORT_SERR_PCDIE BIT9 +#define EFI_AHCI_PORT_SERR_PE BIT10 +#define EFI_AHCI_PORT_SERR_IE BIT11 +#define EFI_AHCI_PORT_SERR_PRC BIT16 +#define EFI_AHCI_PORT_SERR_PIE BIT17 +#define EFI_AHCI_PORT_SERR_CW BIT18 +#define EFI_AHCI_PORT_SERR_BDE BIT19 +#define EFI_AHCI_PORT_SERR_DE BIT20 +#define EFI_AHCI_PORT_SERR_CRCE BIT21 +#define EFI_AHCI_PORT_SERR_HE BIT22 +#define EFI_AHCI_PORT_SERR_LSE BIT23 +#define EFI_AHCI_PORT_SERR_TSTE BIT24 +#define EFI_AHCI_PORT_SERR_UFT BIT25 +#define EFI_AHCI_PORT_SERR_EX BIT26 +#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF +#define EFI_AHCI_PORT_SACT 0x0034 +#define EFI_AHCI_PORT_CI 0x0038 +#define EFI_AHCI_PORT_SNTF 0x003C + +#endif diff --git a/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf new file mode 100644 index 000000000000..da9e667da1ab --- /dev/null +++ b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf @@ -0,0 +1,61 @@ +## @file +# +# Component description file for the Styx SATA platform driver. +# +# Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> +# Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR> +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +## + +[Defines] + INF_VERSION = 0x00010005 + BASE_NAME = StyxSataPlatformDxe + FILE_GUID = 4703fac4-9de9-4010-87d1-11402894296a + MODULE_TYPE = DXE_DRIVER + VERSION_STRING = 1.0 + ENTRY_POINT = StyxSataPlatformDxeEntryPoint + +[Sources] + InitController.c + +[Packages] + MdePkg/MdePkg.dec + MdeModulePkg/MdeModulePkg.dec + EmbeddedPkg/EmbeddedPkg.dec + AmdModulePkg/AmdModulePkg.dec + OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec + +[LibraryClasses] + AmdSataInit + UefiDriverEntryPoint + DebugLib + BaseLib + PlatformPciIoDeviceRegistrationLib + UefiBootServicesTableLib + +[FixedPcd] + gAmdModulePkgTokenSpaceGuid.PcdSataSerdesBase + gAmdModulePkgTokenSpaceGuid.PcdSataSerdesOffset + gAmdModulePkgTokenSpaceGuid.PcdSataNumChPerSerdes + + gAmdStyxTokenSpaceGuid.PcdSataCtrlAxiSlvPort + gAmdStyxTokenSpaceGuid.PcdSataPortCount + gAmdStyxTokenSpaceGuid.PcdSataPortMode + gAmdStyxTokenSpaceGuid.PcdSataSmpsSupport + gAmdStyxTokenSpaceGuid.PcdSataSssSupport + gAmdStyxTokenSpaceGuid.PcdSataPortCpd + gAmdStyxTokenSpaceGuid.PcdSataPortMpsp + gAmdStyxTokenSpaceGuid.PcdSata1CtrlAxiSlvPort + gAmdStyxTokenSpaceGuid.PcdSata1PortCount + +[Depex] + TRUE +
On Tue, Nov 01, 2016 at 05:25:09PM +0000, Ard Biesheuvel wrote:
Create a new Styx platform driver StyxSataPlatformDxe which contains the existing platform specific SATA initialization code, but uses the new platform PCI I/O driver to register the platform AHCI devices.
This has two advantages:
- we can use generic drivers for the platform PCI I/O emulation, and for the AHCI support built on top of it,
- we can register both SATA devices, allowing us to use all 14 ports on Overdrive B1
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c | 181 ++++++++++++++++++++ Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h | 180 +++++++++++++++++++ Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf | 61 +++++++ 3 files changed, 422 insertions(+)
diff --git a/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c new file mode 100644 index 000000000000..e9cc1f9d52c7 --- /dev/null +++ b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/InitController.c @@ -0,0 +1,181 @@ +/** @file
- Initialize SATA Phy, Serdes, and Controller.
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR>
- This program and the accompanying materials are licensed and made available
- under the terms and conditions of the BSD License which accompanies this
- distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/
+#include "SataRegisters.h"
+#include <Library/AmdSataInitLib.h> +#include <Library/DebugLib.h> +#include <Library/IoLib.h> +#include <Library/PlatformPciIoDeviceRegistrationLib.h>
+STATIC +VOID +ResetSataController (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- )
+{
- // Make a minimal global reset for HBA regiser
- MmioOr32 (AhciBaseAddr + EFI_AHCI_GHC_OFFSET, EFI_AHCI_GHC_RESET);
- // Clear all interrupts
- MmioWrite32 (AhciBaseAddr + EFI_AHCI_PORT_IS, EFI_AHCI_PORT_IS_CLEAR);
- // Turn on interrupts and ensure that the HBA is working in AHCI mode
- MmioOr32 (AhciBaseAddr + EFI_AHCI_GHC_OFFSET,
- EFI_AHCI_GHC_IE | EFI_AHCI_GHC_ENABLE);
+}
+STATIC +VOID +SetSataCapabilities (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- )
+{
- UINT32 Capability;
- Capability = 0;
- if (FixedPcdGetBool (PcdSataSssSupport)) // Staggered Spin-Up Support bit
- Capability |= EFI_AHCI_CAP_SSS;
- if (FixedPcdGetBool (PcdSataSmpsSupport)) // Mechanical Presence Support bit
- Capability |= EFI_AHCI_CAP_SMPS;
- MmioOr32 (AhciBaseAddr + EFI_AHCI_CAPABILITY_OFFSET, Capability);
+}
+STATIC +VOID +InitializeSataPorts (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr,
- UINTN PortCount
- )
+{
- INTN PortNum;
- BOOLEAN IsCpd;
- BOOLEAN IsMpsp;
- UINT32 PortRegAddr;
- UINT32 RegVal;
- // Set Ports Implemented (PI)
- MmioWrite32 (AhciBaseAddr + EFI_AHCI_PI_OFFSET, (1 << PortCount) - 1);
- IsCpd = FixedPcdGetBool (PcdSataPortCpd);
- IsMpsp = FixedPcdGetBool (PcdSataPortMpsp);
- if (!IsCpd && !IsMpsp) {
- return;
- }
- for (PortNum = 0; PortNum < PortCount; PortNum++) {
- PortRegAddr = EFI_AHCI_PORT_OFFSET (PortNum) + EFI_AHCI_PORT_CMD;
- RegVal = MmioRead32(AhciBaseAddr + PortRegAddr);
- if (IsCpd)
RegVal |= EFI_AHCI_PORT_CMD_CPD;
- else
RegVal &= ~EFI_AHCI_PORT_CMD_CPD;
- if (IsMpsp)
RegVal |= EFI_AHCI_PORT_CMD_MPSP;
- else
RegVal &= ~EFI_AHCI_PORT_CMD_MPSP;
- RegVal |= EFI_AHCI_PORT_CMD_HPCP;
- MmioWrite32(AhciBaseAddr + PortRegAddr, RegVal);
- }
+}
+STATIC +EFI_STATUS +InitializeSataController (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr,
- UINTN SataPortCount,
- UINTN StartPort
- )
+{
- UINT8 SataChPerSerdes;
- UINT32 PortNum;
- UINT32 EvenPort;
- UINT32 OddPort;
- SataChPerSerdes = FixedPcdGet8 (PcdSataNumChPerSerdes);
- for (PortNum = 0; PortNum < SataPortCount; PortNum += SataChPerSerdes) {
- EvenPort = (UINT32)(FixedPcdGet16 (PcdSataPortMode) >> (PortNum * 2)) & 3;
- OddPort = (UINT32)(FixedPcdGet16 (PcdSataPortMode) >> ((PortNum+1) * 2)) & 3;
- SataPhyInit ((StartPort + PortNum) / SataChPerSerdes, EvenPort, OddPort);
- }
- //
- // Reset SATA controller
- //
- ResetSataController (AhciBaseAddr);
- //
- // Set SATA capabilities
- //
- SetSataCapabilities (AhciBaseAddr);
- //
- // Set and intialize the Sata ports
- //
- InitializeSataPorts (AhciBaseAddr, SataPortCount);
- return PlatformPciIoRegisterDevice (AhciBaseAddr, PlatformPciIoDeviceAhci,
PlatformPciIoDmaCoherent, NULL, NULL);
+}
+EFI_STATUS +EFIAPI +StyxSataPlatformDxeEntryPoint (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
+{
- UINT32 PortNum;
- EFI_STATUS Status;
- //
- // Perform SATA workarounds
- //
- for (PortNum = 0; PortNum < FixedPcdGet8(PcdSataPortCount); PortNum++) {
SetCwMinSata0 (PortNum);
- }
- Status = InitializeSataController (FixedPcdGet32(PcdSataCtrlAxiSlvPort),
FixedPcdGet8(PcdSataPortCount), 0);
- if (EFI_ERROR (Status)) {
- DEBUG ((DEBUG_WARN, "%a: failed to initialize primary SATA controller!\n",
__FUNCTION__));
- return Status;
- }
- for (PortNum = 0; PortNum < FixedPcdGet8(PcdSataPortCount); PortNum++) {
SetPrdSingleSata0 (PortNum);
- }
- if (FixedPcdGet8(PcdSata1PortCount) > 0) {
OK, I realise now that this has been in AmdStyx.dec all along, but I didn't spot it before. Could we rename the PCDs so we have PcdSata0* and PcdSata1* instead of PcdSata/PcdSata1?
- for (PortNum = 0; PortNum < FixedPcdGet8(PcdSata1PortCount); PortNum++) {
SetCwMinSata1 (PortNum);
- }
- Status = InitializeSataController (FixedPcdGet32(PcdSata1CtrlAxiSlvPort),
FixedPcdGet8(PcdSata1PortCount), FixedPcdGet8(PcdSataPortCount));
- if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_WARN, "%a: failed to initialize secondary SATA controller!\n",
__FUNCTION__));
- } else {
for (PortNum = 0; PortNum < FixedPcdGet8(PcdSata1PortCount); PortNum++) {
SetPrdSingleSata1 (PortNum);
}
- }
- }
- return EFI_SUCCESS;
+} diff --git a/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h new file mode 100644 index 000000000000..ff78f4ac3c67 --- /dev/null +++ b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/SataRegisters.h
Is this a straight copy of Drivers/SataControllerDxe/SataRegisters.h ? If so, worth stating in commit message?
@@ -0,0 +1,180 @@ +/** @file
- Header file for AHCI mode of ATA host controller.
- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
+**/ +#ifndef __SATA_REGISTERS_H__ +#define __SATA_REGISTERS_H__
+#define EFI_AHCI_BAR_INDEX 0x05
+#define EFI_AHCI_CAPABILITY_OFFSET 0x0000 +#define EFI_AHCI_CAP_SSS BIT27 +#define EFI_AHCI_CAP_SMPS BIT28 +#define EFI_AHCI_CAP_S64A BIT31 +#define EFI_AHCI_GHC_OFFSET 0x0004 +#define EFI_AHCI_GHC_RESET BIT0 +#define EFI_AHCI_GHC_IE BIT1 +#define EFI_AHCI_GHC_ENABLE BIT31 +#define EFI_AHCI_IS_OFFSET 0x0008 +#define EFI_AHCI_PI_OFFSET 0x000C
+#define EFI_AHCI_MAX_PORTS 32
+// +// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms. +// +#define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 10 +// +// Refer SATA1.0a spec, the FIS enable time should be less than 500ms. +// +#define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500) +// +// Refer SATA1.0a spec, the bus reset time should be less than 1s. +// +#define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1)
+#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000 +#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000 +#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000 +#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000
+// +// Each PRDT entry can point to a memory block up to 4M byte +// +#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000
+#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device +#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20 +#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host +#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20 +#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host +#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4 +#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional +#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28 +#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional +#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional +#define EFI_AHCI_FIS_BIST_LENGTH 12 +#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host +#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20 +#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host +#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
+#define EFI_AHCI_D2H_FIS_OFFSET 0x40 +#define EFI_AHCI_DMA_FIS_OFFSET 0x00 +#define EFI_AHCI_PIO_FIS_OFFSET 0x20 +#define EFI_AHCI_SDB_FIS_OFFSET 0x58 +#define EFI_AHCI_FIS_TYPE_MASK 0xFF +#define EFI_AHCI_U_FIS_OFFSET 0x60
+// +// Port register +// +#define EFI_AHCI_PORT_START 0x0100 +#define EFI_AHCI_PORT_REG_WIDTH 0x0080 +#define EFI_AHCI_PORT_CLB 0x0000 +#define EFI_AHCI_PORT_CLBU 0x0004 +#define EFI_AHCI_PORT_FB 0x0008 +#define EFI_AHCI_PORT_FBU 0x000C +#define EFI_AHCI_PORT_IS 0x0010 +#define EFI_AHCI_PORT_IS_DHRS BIT0 +#define EFI_AHCI_PORT_IS_PSS BIT1 +#define EFI_AHCI_PORT_IS_SSS BIT2 +#define EFI_AHCI_PORT_IS_SDBS BIT3 +#define EFI_AHCI_PORT_IS_UFS BIT4 +#define EFI_AHCI_PORT_IS_DPS BIT5 +#define EFI_AHCI_PORT_IS_PCS BIT6 +#define EFI_AHCI_PORT_IS_DIS BIT7 +#define EFI_AHCI_PORT_IS_PRCS BIT22 +#define EFI_AHCI_PORT_IS_IPMS BIT23 +#define EFI_AHCI_PORT_IS_OFS BIT24 +#define EFI_AHCI_PORT_IS_INFS BIT26 +#define EFI_AHCI_PORT_IS_IFS BIT27 +#define EFI_AHCI_PORT_IS_HBDS BIT28 +#define EFI_AHCI_PORT_IS_HBFS BIT29 +#define EFI_AHCI_PORT_IS_TFES BIT30 +#define EFI_AHCI_PORT_IS_CPDS BIT31 +#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF +#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
+#define EFI_AHCI_PORT_OFFSET(PortNum) \
(EFI_AHCI_PORT_START + ((PortNum) * EFI_AHCI_PORT_REG_WIDTH))
+#define EFI_AHCI_PORT_IE 0x0014 +#define EFI_AHCI_PORT_CMD 0x0018 +#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE +#define EFI_AHCI_PORT_CMD_ST BIT0 +#define EFI_AHCI_PORT_CMD_SUD BIT1 +#define EFI_AHCI_PORT_CMD_POD BIT2 +#define EFI_AHCI_PORT_CMD_CLO BIT3 +#define EFI_AHCI_PORT_CMD_CR BIT15 +#define EFI_AHCI_PORT_CMD_FRE BIT4 +#define EFI_AHCI_PORT_CMD_FR BIT14 +#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL) +#define EFI_AHCI_PORT_CMD_PMA BIT17 +#define EFI_AHCI_PORT_CMD_HPCP BIT18 +#define EFI_AHCI_PORT_CMD_MPSP BIT19 +#define EFI_AHCI_PORT_CMD_CPD BIT20 +#define EFI_AHCI_PORT_CMD_ESP BIT21 +#define EFI_AHCI_PORT_CMD_ATAPI BIT24 +#define EFI_AHCI_PORT_CMD_DLAE BIT25 +#define EFI_AHCI_PORT_CMD_ALPE BIT26 +#define EFI_AHCI_PORT_CMD_ASP BIT27 +#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) +#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 ) +#define EFI_AHCI_PORT_TFD 0x0020 +#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) +#define EFI_AHCI_PORT_TFD_BSY BIT7 +#define EFI_AHCI_PORT_TFD_DRQ BIT3 +#define EFI_AHCI_PORT_TFD_ERR BIT0 +#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00 +#define EFI_AHCI_PORT_SIG 0x0024 +#define EFI_AHCI_PORT_SSTS 0x0028 +#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F +#define EFI_AHCI_PORT_SSTS_DET 0x0001 +#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003 +#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0 +#define EFI_AHCI_PORT_SCTL 0x002C +#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F +#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK) +#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001 +#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003 +#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0 +#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00 +#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300 +#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100 +#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200 +#define EFI_AHCI_PORT_SERR 0x0030 +#define EFI_AHCI_PORT_SERR_RDIE BIT0 +#define EFI_AHCI_PORT_SERR_RCE BIT1 +#define EFI_AHCI_PORT_SERR_TDIE BIT8 +#define EFI_AHCI_PORT_SERR_PCDIE BIT9 +#define EFI_AHCI_PORT_SERR_PE BIT10 +#define EFI_AHCI_PORT_SERR_IE BIT11 +#define EFI_AHCI_PORT_SERR_PRC BIT16 +#define EFI_AHCI_PORT_SERR_PIE BIT17 +#define EFI_AHCI_PORT_SERR_CW BIT18 +#define EFI_AHCI_PORT_SERR_BDE BIT19 +#define EFI_AHCI_PORT_SERR_DE BIT20 +#define EFI_AHCI_PORT_SERR_CRCE BIT21 +#define EFI_AHCI_PORT_SERR_HE BIT22 +#define EFI_AHCI_PORT_SERR_LSE BIT23 +#define EFI_AHCI_PORT_SERR_TSTE BIT24 +#define EFI_AHCI_PORT_SERR_UFT BIT25 +#define EFI_AHCI_PORT_SERR_EX BIT26 +#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF +#define EFI_AHCI_PORT_SACT 0x0034 +#define EFI_AHCI_PORT_CI 0x0038 +#define EFI_AHCI_PORT_SNTF 0x003C
+#endif diff --git a/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf new file mode 100644 index 000000000000..da9e667da1ab --- /dev/null +++ b/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf @@ -0,0 +1,61 @@ +## @file +# +# Component description file for the Styx SATA platform driver. +# +# Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> +# Copyright (c) 2016, Linaro, Ltd. All rights reserved.<BR> +# +# This program and the accompanying materials +# are licensed and made available under the terms and conditions of the BSD License +# which accompanies this distribution. The full text of the license may be found at +# http://opensource.org/licenses/bsd-license.php +# +# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. +# +##
+[Defines]
- INF_VERSION = 0x00010005
<random coment>
- BASE_NAME = StyxSataPlatformDxe
- FILE_GUID = 4703fac4-9de9-4010-87d1-11402894296a
- MODULE_TYPE = DXE_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = StyxSataPlatformDxeEntryPoint
+[Sources]
- InitController.c
+[Packages]
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
- EmbeddedPkg/EmbeddedPkg.dec
- AmdModulePkg/AmdModulePkg.dec
- OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec
+[LibraryClasses]
- AmdSataInit
- UefiDriverEntryPoint
- DebugLib
- BaseLib
- PlatformPciIoDeviceRegistrationLib
- UefiBootServicesTableLib
Could the LibraryClasses and Packages be OCD sorted, or is there a particular reason to have them in this order?
/ Leif
+[FixedPcd]
- gAmdModulePkgTokenSpaceGuid.PcdSataSerdesBase
- gAmdModulePkgTokenSpaceGuid.PcdSataSerdesOffset
- gAmdModulePkgTokenSpaceGuid.PcdSataNumChPerSerdes
- gAmdStyxTokenSpaceGuid.PcdSataCtrlAxiSlvPort
- gAmdStyxTokenSpaceGuid.PcdSataPortCount
- gAmdStyxTokenSpaceGuid.PcdSataPortMode
- gAmdStyxTokenSpaceGuid.PcdSataSmpsSupport
- gAmdStyxTokenSpaceGuid.PcdSataSssSupport
- gAmdStyxTokenSpaceGuid.PcdSataPortCpd
- gAmdStyxTokenSpaceGuid.PcdSataPortMpsp
- gAmdStyxTokenSpaceGuid.PcdSata1CtrlAxiSlvPort
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount
+[Depex]
- TRUE
-- 2.7.4
Switch to the new Styx platform SATA driver, which allows the generic platform PCI I/O emulation driver and the generic AHCI driver to be used.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc | 11 +++++++---- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc index 70b94df7d6da..510a3ebe19a2 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc @@ -217,6 +217,7 @@ DEFINE DO_KCS = 1 SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + PlatformPciIoDeviceRegistrationLib|EmbeddedPkg/Library/PlatformPciIoDeviceRegistrationLib/PlatformPciIoDeviceRegistrationLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf @@ -409,10 +410,10 @@ DEFINE DO_KCS = 1 gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|187500000
# - # Bitmask for ports implemented on the SATA controller - # (enabling 4 ports by default: 00001111b) + # Overdrive B1 has 14 SATA ports across 2 controllers. # - gAmdStyxTokenSpaceGuid.PcdSataPi|0x0F + gAmdStyxTokenSpaceGuid.PcdSataPortCount|8 + gAmdStyxTokenSpaceGuid.PcdSata1PortCount|6
# PCIe Support gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xF0000000 @@ -606,7 +607,9 @@ DEFINE DO_KCS = 1 MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf + MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf + OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf index 404810f8831d..17f5d691491f 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf @@ -162,7 +162,9 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf + INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + INF EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf + INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support
On Tue, Nov 01, 2016 at 05:25:10PM +0000, Ard Biesheuvel wrote:
Switch to the new Styx platform SATA driver, which allows the generic platform PCI I/O emulation driver and the generic AHCI driver to be used.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Not tested, but: Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc | 11 +++++++---- Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc index 70b94df7d6da..510a3ebe19a2 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.dsc @@ -217,6 +217,7 @@ DEFINE DO_KCS = 1 SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
- PlatformPciIoDeviceRegistrationLib|EmbeddedPkg/Library/PlatformPciIoDeviceRegistrationLib/PlatformPciIoDeviceRegistrationLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf @@ -409,10 +410,10 @@ DEFINE DO_KCS = 1 gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|187500000 #
- # Bitmask for ports implemented on the SATA controller
- # (enabling 4 ports by default: 00001111b)
- # Overdrive B1 has 14 SATA ports across 2 controllers. #
- gAmdStyxTokenSpaceGuid.PcdSataPi|0x0F
- gAmdStyxTokenSpaceGuid.PcdSataPortCount|8
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount|6
# PCIe Support gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xF0000000 @@ -606,7 +607,9 @@ DEFINE DO_KCS = 1 MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
- OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf
- MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
- EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf
- OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support diff --git a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf index 404810f8831d..17f5d691491f 100644 --- a/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf +++ b/Platforms/AMD/Styx/OverdriveBoard/OverdriveBoard.fdf @@ -162,7 +162,9 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
- INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf
- INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
- INF EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf
- INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
#
# USB Support
2.7.4
Switch to the new Styx platform SATA driver, which allows the generic platform PCI I/O emulation driver and the generic AHCI driver to be used.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc | 11 +++++++---- Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc index e668b6b06d13..22aba0be414a 100644 --- a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc +++ b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc @@ -210,6 +210,7 @@ DEFINE DO_KCS = 0 SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + PlatformPciIoDeviceRegistrationLib|EmbeddedPkg/Library/PlatformPciIoDeviceRegistrationLib/PlatformPciIoDeviceRegistrationLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf @@ -402,10 +403,10 @@ DEFINE DO_KCS = 0 gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|187500000
# - # Bitmask for ports implemented on the SATA controller - # (enabling 4 ports by default: 00001111b) + # Cello has 2 SATA ports on the first controller. # - gAmdStyxTokenSpaceGuid.PcdSataPi|0x0F + gAmdStyxTokenSpaceGuid.PcdSataPortCount|2 + gAmdStyxTokenSpaceGuid.PcdSata1PortCount|0
# PCIe Support gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xF0000000 @@ -555,7 +556,9 @@ DEFINE DO_KCS = 0 MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf + MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf + OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support diff --git a/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf b/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf index 7a75197858be..7cad75856436 100644 --- a/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf +++ b/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf @@ -153,7 +153,9 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf + INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + INF EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf + INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support
On Tue, Nov 01, 2016 at 05:25:11PM +0000, Ard Biesheuvel wrote:
Switch to the new Styx platform SATA driver, which allows the generic platform PCI I/O emulation driver and the generic AHCI driver to be used.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc | 11 +++++++---- Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf | 4 +++- 2 files changed, 10 insertions(+), 5 deletions(-)
diff --git a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc index e668b6b06d13..22aba0be414a 100644 --- a/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc +++ b/Platforms/AMD/Styx/CelloBoard/CelloBoard.dsc @@ -210,6 +210,7 @@ DEFINE DO_KCS = 0 SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
- PlatformPciIoDeviceRegistrationLib|EmbeddedPkg/Library/PlatformPciIoDeviceRegistrationLib/PlatformPciIoDeviceRegistrationLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf @@ -402,10 +403,10 @@ DEFINE DO_KCS = 0 gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|187500000 #
- # Bitmask for ports implemented on the SATA controller
- # (enabling 4 ports by default: 00001111b)
- # Cello has 2 SATA ports on the first controller. #
- gAmdStyxTokenSpaceGuid.PcdSataPi|0x0F
- gAmdStyxTokenSpaceGuid.PcdSataPortCount|2
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount|0
# PCIe Support gEfiMdePkgTokenSpaceGuid.PcdPciExpressBaseAddress|0xF0000000 @@ -555,7 +556,9 @@ DEFINE DO_KCS = 0 MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
- OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf
- MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
- EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf
- OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support diff --git a/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf b/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf index 7a75197858be..7cad75856436 100644 --- a/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf +++ b/Platforms/AMD/Styx/CelloBoard/CelloBoard.fdf @@ -153,7 +153,9 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
- INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf
- INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
- INF EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf
- INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
#
# USB Support
2.7.4
Switch to the new Styx platform SATA driver, which allows the generic platform PCI I/O emulation driver and the generic AHCI driver to be used.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc | 12 +++++------- Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf | 4 +++- 2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc index 5fd6d841072d..71b60e2789c4 100644 --- a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc +++ b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc @@ -216,6 +216,7 @@ DEFINE DO_KCS = 1 SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf + PlatformPciIoDeviceRegistrationLib|EmbeddedPkg/Library/PlatformPciIoDeviceRegistrationLib/PlatformPciIoDeviceRegistrationLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf @@ -407,13 +408,8 @@ DEFINE DO_KCS = 1 gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|187500000
# - # Bitmask for ports implemented on the SATA controller - # (2 ports active on Overdrive 1000: 0b00000011 = 0x03) + # 2 ports active on Overdrive 1000 # - gAmdStyxTokenSpaceGuid.PcdSataPi|0x03 - - # Only PcdSataPortCount or PcdSata1PortCount are used. The selection is - # made by #define in Drivers/SataControllerDxe/InitController.c gAmdStyxTokenSpaceGuid.PcdSataPortCount|2 gAmdStyxTokenSpaceGuid.PcdSata1PortCount|0
@@ -592,7 +588,9 @@ DEFINE DO_KCS = 1 MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf + MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf + OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support diff --git a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf index 95fd8356cbe2..774d69ce6ea9 100644 --- a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf +++ b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf @@ -162,7 +162,9 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf - INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf + INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf + INF EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf + INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support
On Tue, Nov 01, 2016 at 05:25:12PM +0000, Ard Biesheuvel wrote:
Switch to the new Styx platform SATA driver, which allows the generic platform PCI I/O emulation driver and the generic AHCI driver to be used.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Would like a comment from Alan, but from my point of view: Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
(All of these obviously pending finalised path names to the core protocol and stuff.)
Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc | 12 +++++------- Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf | 4 +++- 2 files changed, 8 insertions(+), 8 deletions(-)
diff --git a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc index 5fd6d841072d..71b60e2789c4 100644 --- a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc +++ b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.dsc @@ -216,6 +216,7 @@ DEFINE DO_KCS = 1 SecurityManagementLib|MdeModulePkg/Library/DxeSecurityManagementLib/DxeSecurityManagementLib.inf PerformanceLib|MdeModulePkg/Library/DxePerformanceLib/DxePerformanceLib.inf MemoryAllocationLib|MdePkg/Library/UefiMemoryAllocationLib/UefiMemoryAllocationLib.inf
- PlatformPciIoDeviceRegistrationLib|EmbeddedPkg/Library/PlatformPciIoDeviceRegistrationLib/PlatformPciIoDeviceRegistrationLib.inf
[LibraryClasses.common.DXE_RUNTIME_DRIVER] HobLib|MdePkg/Library/DxeHobLib/DxeHobLib.inf @@ -407,13 +408,8 @@ DEFINE DO_KCS = 1 gArmTokenSpaceGuid.PcdArmArchTimerFreqInHz|187500000 #
- # Bitmask for ports implemented on the SATA controller
- # (2 ports active on Overdrive 1000: 0b00000011 = 0x03)
- # 2 ports active on Overdrive 1000 #
- gAmdStyxTokenSpaceGuid.PcdSataPi|0x03
- # Only PcdSataPortCount or PcdSata1PortCount are used. The selection is
- # made by #define in Drivers/SataControllerDxe/InitController.c gAmdStyxTokenSpaceGuid.PcdSataPortCount|2 gAmdStyxTokenSpaceGuid.PcdSata1PortCount|0
@@ -592,7 +588,9 @@ DEFINE DO_KCS = 1 MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
- OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf
- MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
- EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf
- OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
# # USB Support diff --git a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf index 95fd8356cbe2..774d69ce6ea9 100644 --- a/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf +++ b/Platforms/AMD/Styx/Overdrive1000Board/Overdrive1000Board.fdf @@ -162,7 +162,9 @@ READ_LOCK_STATUS = TRUE INF MdeModulePkg/Bus/Ata/AtaBusDxe/AtaBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiBusDxe/ScsiBusDxe.inf INF MdeModulePkg/Bus/Scsi/ScsiDiskDxe/ScsiDiskDxe.inf
- INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf
- INF MdeModulePkg/Bus/Pci/SataControllerDxe/SataControllerDxe.inf
- INF EmbeddedPkg/Drivers/PlatformPciIoDxe/PlatformPciIoDxe.inf
- INF OpenPlatformPkg/Platforms/AMD/Styx/Drivers/StyxSataPlatformDxe/StyxSataPlatformDxe.inf
#
# USB Support
2.7.4
Enable the second AHCI ACPI node when any ports are enabled on the second SATA controller.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/AcpiTables/AcpiTables.inf | 1 + Platforms/AMD/Styx/AcpiTables/Dsdt.c | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf b/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf index 72272aa0b85a..12e0444009ef 100644 --- a/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf +++ b/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf @@ -83,6 +83,7 @@ gAmdStyxTokenSpaceGuid.PcdPsciOsSupport gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport gAmdStyxTokenSpaceGuid.PcdParkingProtocolVersion + gAmdStyxTokenSpaceGuid.PcdSata1PortCount
[Depex] gAmdMpCoreInfoProtocolGuid diff --git a/Platforms/AMD/Styx/AcpiTables/Dsdt.c b/Platforms/AMD/Styx/AcpiTables/Dsdt.c index 922d7214adf4..360a446f7631 100644 --- a/Platforms/AMD/Styx/AcpiTables/Dsdt.c +++ b/Platforms/AMD/Styx/AcpiTables/Dsdt.c @@ -174,15 +174,10 @@ DsdtHeader ( else if (AsciiStrCmp(Table->Pathname, "_SB_.ETH1._DSD") == 0) { OverrideMacAddr ((UINT8 *)&AmlCode[Table->Offset], PcdGet64 (PcdEthMacB)); } -#if DO_SATA1 else if (AsciiStrCmp(Table->Pathname, "_SB_.AHC1._STA") == 0) { - OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], EnableOnB1); - } -#else - else if (AsciiStrCmp(Table->Pathname, "_SB_.AHC1._STA") == 0) { - OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], FALSE); + OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], + EnableOnB1 && FixedPcdGet8(PcdSata1PortCount) > 0); } -#endif else if (AsciiStrCmp(Table->Pathname, "_SB_.GIO2._STA") == 0) { OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], EnableOnB1); }
On 1 November 2016 at 17:25, Ard Biesheuvel ard.biesheuvel@linaro.org wrote:
Enable the second AHCI ACPI node when any ports are enabled on the second SATA controller.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
With the following hunk folded in, both SATA controllers are detected correctly under Linux using ACPI as well as DT.
diff --git a/Platforms/AMD/Styx/AcpiTables/Dsdt.asl b/Platforms/AMD/Styx/AcpiTables/Dsdt.asl index 4e80e4e59547..7edec3d1ec28 100644 --- a/Platforms/AMD/Styx/AcpiTables/Dsdt.asl +++ b/Platforms/AMD/Styx/AcpiTables/Dsdt.asl @@ -130,7 +130,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, "AMDINC", "SEATTLE ", 3) 0xE000007C, // Address Base (SGPIO) 0x00000001, // Address Length ) - Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, ) {0x00000189, } + Interrupt (ResourceConsumer, Level, ActiveHigh, Exclusive, ,, ) {0x00000182, } }) }
Platforms/AMD/Styx/AcpiTables/AcpiTables.inf | 1 + Platforms/AMD/Styx/AcpiTables/Dsdt.c | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf b/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf index 72272aa0b85a..12e0444009ef 100644 --- a/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf +++ b/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf @@ -83,6 +83,7 @@ gAmdStyxTokenSpaceGuid.PcdPsciOsSupport gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport gAmdStyxTokenSpaceGuid.PcdParkingProtocolVersion
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount
[Depex] gAmdMpCoreInfoProtocolGuid diff --git a/Platforms/AMD/Styx/AcpiTables/Dsdt.c b/Platforms/AMD/Styx/AcpiTables/Dsdt.c index 922d7214adf4..360a446f7631 100644 --- a/Platforms/AMD/Styx/AcpiTables/Dsdt.c +++ b/Platforms/AMD/Styx/AcpiTables/Dsdt.c @@ -174,15 +174,10 @@ DsdtHeader ( else if (AsciiStrCmp(Table->Pathname, "_SB_.ETH1._DSD") == 0) { OverrideMacAddr ((UINT8 *)&AmlCode[Table->Offset], PcdGet64 (PcdEthMacB)); } -#if DO_SATA1 else if (AsciiStrCmp(Table->Pathname, "_SB_.AHC1._STA") == 0) {
OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], EnableOnB1);
- }
-#else
- else if (AsciiStrCmp(Table->Pathname, "_SB_.AHC1._STA") == 0) {
OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], FALSE);
OverrideStatus ((UINT8 *)&AmlCode[Table->Offset],
}EnableOnB1 && FixedPcdGet8(PcdSata1PortCount) > 0);
-#endif else if (AsciiStrCmp(Table->Pathname, "_SB_.GIO2._STA") == 0) { OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], EnableOnB1); } -- 2.7.4
On Tue, Nov 01, 2016 at 07:27:14PM +0000, Ard Biesheuvel wrote:
On 1 November 2016 at 17:25, Ard Biesheuvel ard.biesheuvel@linaro.org wrote:
Enable the second AHCI ACPI node when any ports are enabled on the second SATA controller.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
With the following hunk folded in, both SATA controllers are detected correctly under Linux using ACPI as well as DT.
diff --git a/Platforms/AMD/Styx/AcpiTables/Dsdt.asl b/Platforms/AMD/Styx/AcpiTables/Dsdt.asl index 4e80e4e59547..7edec3d1ec28 100644 --- a/Platforms/AMD/Styx/AcpiTables/Dsdt.asl +++ b/Platforms/AMD/Styx/AcpiTables/Dsdt.asl @@ -130,7 +130,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, "AMDINC", "SEATTLE ", 3) 0xE000007C, // Address Base (SGPIO) 0x00000001, // Address Length )
Interrupt (ResourceConsumer, Level, ActiveHigh,
Exclusive, ,, ) {0x00000189, }
Interrupt (ResourceConsumer, Level, ActiveHigh,
Exclusive, ,, ) {0x00000182, } }) }
Do you want to fold this into 6/8 or submit separately? It looks like a bugfix on current tables that is independent of the changes in the Pci/Ahci sets.
/ Leif
Platforms/AMD/Styx/AcpiTables/AcpiTables.inf | 1 + Platforms/AMD/Styx/AcpiTables/Dsdt.c | 9 ++------- 2 files changed, 3 insertions(+), 7 deletions(-)
diff --git a/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf b/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf index 72272aa0b85a..12e0444009ef 100644 --- a/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf +++ b/Platforms/AMD/Styx/AcpiTables/AcpiTables.inf @@ -83,6 +83,7 @@ gAmdStyxTokenSpaceGuid.PcdPsciOsSupport gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport gAmdStyxTokenSpaceGuid.PcdParkingProtocolVersion
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount
[Depex] gAmdMpCoreInfoProtocolGuid diff --git a/Platforms/AMD/Styx/AcpiTables/Dsdt.c b/Platforms/AMD/Styx/AcpiTables/Dsdt.c index 922d7214adf4..360a446f7631 100644 --- a/Platforms/AMD/Styx/AcpiTables/Dsdt.c +++ b/Platforms/AMD/Styx/AcpiTables/Dsdt.c @@ -174,15 +174,10 @@ DsdtHeader ( else if (AsciiStrCmp(Table->Pathname, "_SB_.ETH1._DSD") == 0) { OverrideMacAddr ((UINT8 *)&AmlCode[Table->Offset], PcdGet64 (PcdEthMacB)); } -#if DO_SATA1 else if (AsciiStrCmp(Table->Pathname, "_SB_.AHC1._STA") == 0) {
OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], EnableOnB1);
- }
-#else
- else if (AsciiStrCmp(Table->Pathname, "_SB_.AHC1._STA") == 0) {
OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], FALSE);
OverrideStatus ((UINT8 *)&AmlCode[Table->Offset],
}EnableOnB1 && FixedPcdGet8(PcdSata1PortCount) > 0);
-#endif else if (AsciiStrCmp(Table->Pathname, "_SB_.GIO2._STA") == 0) { OverrideStatus ((UINT8 *)&AmlCode[Table->Offset], EnableOnB1); } -- 2.7.4
On 2 November 2016 at 16:55, Leif Lindholm leif.lindholm@linaro.org wrote:
On Tue, Nov 01, 2016 at 07:27:14PM +0000, Ard Biesheuvel wrote:
On 1 November 2016 at 17:25, Ard Biesheuvel ard.biesheuvel@linaro.org wrote:
Enable the second AHCI ACPI node when any ports are enabled on the second SATA controller.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
With the following hunk folded in, both SATA controllers are detected correctly under Linux using ACPI as well as DT.
diff --git a/Platforms/AMD/Styx/AcpiTables/Dsdt.asl b/Platforms/AMD/Styx/AcpiTables/Dsdt.asl index 4e80e4e59547..7edec3d1ec28 100644 --- a/Platforms/AMD/Styx/AcpiTables/Dsdt.asl +++ b/Platforms/AMD/Styx/AcpiTables/Dsdt.asl @@ -130,7 +130,7 @@ DefinitionBlock ("DSDT.aml", "DSDT", 2, "AMDINC", "SEATTLE ", 3) 0xE000007C, // Address Base (SGPIO) 0x00000001, // Address Length )
Interrupt (ResourceConsumer, Level, ActiveHigh,
Exclusive, ,, ) {0x00000189, }
Interrupt (ResourceConsumer, Level, ActiveHigh,
Exclusive, ,, ) {0x00000182, } }) }
Do you want to fold this into 6/8 or submit separately? It looks like a bugfix on current tables that is independent of the changes in the Pci/Ahci sets.
It makes sense to keep it separate, although it currently requires the preprocessor symbol DO_SATA1 to be defined, which we never do, so it does not matter much in practice.
Enable the second AHCI DT node when any ports are enabled on the second SATA controller.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c | 7 ++----- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf | 1 + 2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c b/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c index 13fc9c152bdc..aa595045ca3c 100644 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c +++ b/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c @@ -247,11 +247,8 @@ SetSocIdStatus ( SocId = PcdGet32 (PcdSocCpuId); IsRevB1 = (SocId & 0xFF0) && (SocId & 0x00F);
-#if DO_SATA1 - SetDeviceStatus (fdt, "sata@e0d00000", IsRevB1); -#else - SetDeviceStatus (fdt, "sata@e0d00000", FALSE); -#endif + SetDeviceStatus (fdt, "sata@e0d00000", + IsRevB1 && FixedPcdGet8(PcdSata1PortCount) > 0); SetDeviceStatus (fdt, "gpio@e0020000", IsRevB1); SetDeviceStatus (fdt, "gpio@e0030000", IsRevB1); SetDeviceStatus (fdt, "gwdt@e0bb0000", IsRevB1); diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf index 43f084d820fa..5479c7b0abfb 100644 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf +++ b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf @@ -70,6 +70,7 @@ gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment gAmdStyxTokenSpaceGuid.PcdPsciOsSupport gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport + gAmdStyxTokenSpaceGuid.PcdSata1PortCount
[Depex] TRUE
On Tue, Nov 01, 2016 at 05:25:14PM +0000, Ard Biesheuvel wrote:
Enable the second AHCI DT node when any ports are enabled on the second SATA controller.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c | 7 ++----- Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf | 1 + 2 files changed, 3 insertions(+), 5 deletions(-)
diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c b/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c index 13fc9c152bdc..aa595045ca3c 100644 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c +++ b/Platforms/AMD/Styx/Drivers/FdtDxe/BdsLinuxFdt.c @@ -247,11 +247,8 @@ SetSocIdStatus ( SocId = PcdGet32 (PcdSocCpuId); IsRevB1 = (SocId & 0xFF0) && (SocId & 0x00F); -#if DO_SATA1
- SetDeviceStatus (fdt, "sata@e0d00000", IsRevB1);
-#else
- SetDeviceStatus (fdt, "sata@e0d00000", FALSE);
-#endif
- SetDeviceStatus (fdt, "sata@e0d00000",
- IsRevB1 && FixedPcdGet8(PcdSata1PortCount) > 0); SetDeviceStatus (fdt, "gpio@e0020000", IsRevB1); SetDeviceStatus (fdt, "gpio@e0030000", IsRevB1); SetDeviceStatus (fdt, "gwdt@e0bb0000", IsRevB1);
diff --git a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf index 43f084d820fa..5479c7b0abfb 100644 --- a/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf +++ b/Platforms/AMD/Styx/Drivers/FdtDxe/FdtDxe.inf @@ -70,6 +70,7 @@ gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment gAmdStyxTokenSpaceGuid.PcdPsciOsSupport gAmdStyxTokenSpaceGuid.PcdTrustedFWSupport
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount
[Depex] TRUE -- 2.7.4
This driver is no longer used, so remove it.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org --- Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c | 178 ---- Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c | 172 ---- Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c | 442 --------- Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h | 289 ------ Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c | 307 ------ Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c | 1027 -------------------- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h | 555 ----------- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf | 85 -- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h | 180 ---- 9 files changed, 3235 deletions(-)
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c deleted file mode 100644 index 943daac37a73..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c +++ /dev/null @@ -1,178 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for Sata Controller driver. - - Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php. - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "SataController.h" - -// -/// EFI Component Name Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gSataControllerComponentName = { - SataControllerComponentNameGetDriverName, - SataControllerComponentNameGetControllerName, - "eng" -}; - -// -/// EFI Component Name 2 Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gSataControllerComponentName2 = { - (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) SataControllerComponentNameGetDriverName, - (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) SataControllerComponentNameGetControllerName, - "en" -}; - -// -/// Driver Name Strings -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSataControllerDriverNameTable[] = { - { - "eng;en", - (CHAR16 *)L"Sata Controller Init Driver" - }, - { - NULL, - NULL - } -}; - -/// -/// Controller Name Strings -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSataControllerControllerNameTable[] = { - { - "eng;en", - (CHAR16 *)L"Sata Controller" - }, - { - NULL, - NULL - } -}; - -/** - Retrieves a Unicode string that is the user readable name of the UEFI Driver. - - @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param Language A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - @param DriverName A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER DriverName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -{ - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mSataControllerDriverNameTable, - DriverName, - (BOOLEAN)(This == &gSataControllerComponentName) - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an UEFI Driver. - - @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param ControllerHandle The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - @param ChildHandle OPTIONAL The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - @param Language A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - @param ControllerName A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language - specified by Language from the point of view of the - driver specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -{ - EFI_STATUS Status; - - // - // Make sure this driver is currently managing ControllHandle - // - Status = EfiTestManagedDevice ( - ControllerHandle, - gSataControllerDriverBinding.DriverBindingHandle, - &gEfiPciIoProtocolGuid - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (ChildHandle != NULL) { - return EFI_UNSUPPORTED; - } - - return LookupUnicodeString2 ( - Language, - This->SupportedLanguages, - mSataControllerControllerNameTable, - ControllerName, - (BOOLEAN)(This == &gSataControllerComponentName) - ); -} diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c deleted file mode 100644 index f605bf7fd168..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c +++ /dev/null @@ -1,172 +0,0 @@ -/** @file - Initialize SATA Phy, Serdes, and Controller. - - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials are licensed and made available - under the terms and conditions of the BSD License which accompanies this - distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -**/ - -#include "SataController.h" -#include <Library/IoLib.h> -#include "SataRegisters.h" -#include "PciEmulation.h" -#include <Library/AmdSataInitLib.h> - -VOID -ResetSataController ( - EFI_PHYSICAL_ADDRESS AhciBaseAddr - ) -{ - UINT32 RegVal; - - // Make a minimal global reset for HBA regiser - RegVal = MmioRead32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET); - RegVal |= EFI_AHCI_GHC_RESET; - MmioWrite32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET, RegVal); - - // Clear all interrupts - MmioWrite32(AhciBaseAddr + EFI_AHCI_PORT_IS, EFI_AHCI_PORT_IS_CLEAR); - - // Turn on interrupts and ensure that the HBA is working in AHCI mode - RegVal = MmioRead32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET); - RegVal |= EFI_AHCI_GHC_IE | EFI_AHCI_GHC_ENABLE; - MmioWrite32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET, RegVal); -} - - -VOID -SetSataCapabilities ( - EFI_PHYSICAL_ADDRESS AhciBaseAddr - ) -{ - UINT32 Capability; - - Capability = MmioRead32(AhciBaseAddr + EFI_AHCI_CAPABILITY_OFFSET); - if (PcdGetBool(PcdSataSssSupport)) // Staggered Spin-Up Support bit - Capability |= EFI_AHCI_CAP_SSS; - if (PcdGetBool(PcdSataSmpsSupport)) // Mechanical Presence Support bit - Capability |= EFI_AHCI_CAP_SMPS; - MmioWrite32(AhciBaseAddr + EFI_AHCI_CAPABILITY_OFFSET, Capability); -} - - -VOID -InitializeSataPorts ( - EFI_PHYSICAL_ADDRESS AhciBaseAddr - ) -{ - INTN PortNum; - UINT32 SataPi; - BOOLEAN IsPortImplemented; - BOOLEAN IsCpd; - BOOLEAN IsMpsp; - UINT32 PortRegAddr; - UINT32 RegVal; - - // Set Ports Implemented (PI) - SataPi = PcdGet32(PcdSataPi); - MmioWrite32(AhciBaseAddr + EFI_AHCI_PI_OFFSET, SataPi); - - IsCpd = PcdGetBool(PcdSataPortCpd); - IsMpsp = PcdGetBool(PcdSataPortMpsp); - for (PortNum = 0; PortNum < EFI_AHCI_MAX_PORTS; PortNum++) { - IsPortImplemented = (SataPi & (1 << PortNum)) ? 1 : 0; - if (IsPortImplemented && (IsCpd || IsMpsp)) { - PortRegAddr = EFI_AHCI_PORT_OFFSET(PortNum) + EFI_AHCI_PORT_CMD; - RegVal = MmioRead32(AhciBaseAddr + PortRegAddr); - if (IsCpd) - RegVal |= EFI_AHCI_PORT_CMD_CPD; - else - RegVal &= ~EFI_AHCI_PORT_CMD_CPD; - if (IsMpsp) - RegVal |= EFI_AHCI_PORT_CMD_MPSP; - else - RegVal &= ~EFI_AHCI_PORT_CMD_MPSP; - RegVal |= EFI_AHCI_PORT_CMD_HPCP; - MmioWrite32(AhciBaseAddr + PortRegAddr, RegVal); - } - } -} - - -EFI_STATUS -InitializeSataController ( - VOID - ) -{ - EFI_PHYSICAL_ADDRESS AhciBaseAddr; - UINT8 SataPortCount; - UINT8 SataChPerSerdes; - UINT32 StartPort; - UINT32 PortNum; - UINT32 EvenPort; - UINT32 OddPort; - EFI_STATUS Status; - -#ifdef BUILD_FOR_SATA1 - AhciBaseAddr = PcdGet32(PcdSata1CtrlAxiSlvPort); - SataPortCount = PcdGet8(PcdSata1PortCount); - StartPort = PcdGet8(PcdSataPortCount); -#else - AhciBaseAddr = PcdGet32(PcdSataCtrlAxiSlvPort); - SataPortCount = PcdGet8(PcdSataPortCount); - StartPort = 0; -#endif - - SataChPerSerdes = PcdGet8(PcdSataNumChPerSerdes); - - // - // Perform SATA workarounds - // - for (PortNum = 0; PortNum < SataPortCount; PortNum++) { -#ifdef BUILD_FOR_SATA1 - SetCwMinSata1(PortNum); -#else - SetCwMinSata0(PortNum); -#endif - } - - for (PortNum = 0; PortNum < SataPortCount; PortNum += SataChPerSerdes) { - EvenPort = (UINT32)(PcdGet16(PcdSataPortMode) >> (PortNum * 2)) & 3; - OddPort = (UINT32)(PcdGet16(PcdSataPortMode) >> ((PortNum+1) * 2)) & 3; - SataPhyInit((StartPort + PortNum)/SataChPerSerdes, EvenPort, OddPort); - } - - for (PortNum = 0; PortNum < SataPortCount; PortNum++) { -#ifdef BUILD_FOR_SATA1 - SetPrdSingleSata1(PortNum); -#else - SetPrdSingleSata0(PortNum); -#endif - } - - // - // Reset SATA controller - // - ResetSataController(AhciBaseAddr); - - // - // Set SATA capabilities - // - SetSataCapabilities(AhciBaseAddr); - - // - // Set and intialize the Sata ports - // - InitializeSataPorts(AhciBaseAddr); - - // - // Emulate a PCI configuration for this device - // - Status = PciEmulationEntryPoint(AhciBaseAddr); - ASSERT_EFI_ERROR (Status); - - return EFI_SUCCESS; -} - diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c deleted file mode 100644 index 137a4862226a..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c +++ /dev/null @@ -1,442 +0,0 @@ -/** @file - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "PciEmulation.h" -#include "SataRegisters.h" - - -typedef struct { - ACPI_HID_DEVICE_PATH AcpiDevicePath; - PCI_DEVICE_PATH PciDevicePath; - EFI_DEVICE_PATH_PROTOCOL EndDevicePath; -} EFI_PCI_IO_DEVICE_PATH; - -typedef struct { - UINT32 Signature; - EFI_PCI_IO_DEVICE_PATH DevicePath; - EFI_PCI_IO_PROTOCOL PciIoProtocol; - PCI_TYPE00 *ConfigSpace; - PCI_ROOT_BRIDGE RootBridge; - UINTN Segment; -} EFI_PCI_IO_PRIVATE_DATA; - -#define EFI_PCI_IO_PRIVATE_DATA_SIGNATURE SIGNATURE_32('p', 'c', 'i', 'o') -#define EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(a) CR (a, EFI_PCI_IO_PRIVATE_DATA, PciIoProtocol, EFI_PCI_IO_PRIVATE_DATA_SIGNATURE) - -EFI_PCI_IO_DEVICE_PATH PciIoDevicePathTemplate = -{ - { - { ACPI_DEVICE_PATH, ACPI_DP, { sizeof (ACPI_HID_DEVICE_PATH), 0 } }, - EISA_PNP_ID(0x0A03), // HID - 0 // UID - }, - { - { HARDWARE_DEVICE_PATH, HW_PCI_DP, { sizeof (PCI_DEVICE_PATH), 0 } }, - 0, - 0 - }, - { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} } -}; - - -EFI_STATUS -PciIoPollMem ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 BarIndex, - IN UINT64 Offset, - IN UINT64 Mask, - IN UINT64 Value, - IN UINT64 Delay, - OUT UINT64 *Result - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_STATUS -PciIoPollIo ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 BarIndex, - IN UINT64 Offset, - IN UINT64 Mask, - IN UINT64 Value, - IN UINT64 Delay, - OUT UINT64 *Result - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_STATUS -PciIoMemRead ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 BarIndex, - IN UINT64 Offset, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This); - - return PciRootBridgeIoMemRead (&Private->RootBridge.Io, - (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, - Private->ConfigSpace->Device.Bar[BarIndex] + Offset, - Count, - Buffer - ); -} - -EFI_STATUS -PciIoMemWrite ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 BarIndex, - IN UINT64 Offset, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This); - - return PciRootBridgeIoMemWrite (&Private->RootBridge.Io, - (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, - Private->ConfigSpace->Device.Bar[BarIndex] + Offset, - Count, - Buffer - ); -} - -EFI_STATUS -PciIoIoRead ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 BarIndex, - IN UINT64 Offset, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_STATUS -PciIoIoWrite ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 BarIndex, - IN UINT64 Offset, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_STATUS -PciIoPciRead ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT32 Offset, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This); - - return PciRootBridgeIoMemRW ((EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH)Width, - Count, - TRUE, - (PTR)(UINTN)Buffer, - TRUE, - (PTR)(UINTN)(((UINT8 *)Private->ConfigSpace) + Offset) - ); -} - -EFI_STATUS -PciIoPciWrite ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT32 Offset, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This); - - return PciRootBridgeIoMemRW ((EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width, - Count, - TRUE, - (PTR)(UINTN)(((UINT8 *)Private->ConfigSpace) + Offset), - TRUE, - (PTR)(UINTN)Buffer - ); -} - -EFI_STATUS -PciIoCopyMem ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_WIDTH Width, - IN UINT8 DestBarIndex, - IN UINT64 DestOffset, - IN UINT8 SrcBarIndex, - IN UINT64 SrcOffset, - IN UINTN Count - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_STATUS -PciIoMap ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_OPERATION Operation, - IN VOID *HostAddress, - IN OUT UINTN *NumberOfBytes, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ) -{ - *DeviceAddress = (EFI_PHYSICAL_ADDRESS) HostAddress; - return EFI_SUCCESS; -} - -EFI_STATUS -PciIoUnmap ( - IN EFI_PCI_IO_PROTOCOL *This, - IN VOID *Mapping - ) -{ - return EFI_SUCCESS; -} - - -EFI_STATUS -PciIoAllocateBuffer ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_ALLOCATE_TYPE Type, - IN EFI_MEMORY_TYPE MemoryType, - IN UINTN Pages, - OUT VOID **HostAddress, - IN UINT64 Attributes - ) -{ - EFI_PHYSICAL_ADDRESS Memory; - EFI_STATUS Status; - - if (Attributes & EFI_PCI_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER) { - // Check this - return EFI_UNSUPPORTED; - } - Status = gBS->AllocatePages(AllocateAnyPages, MemoryType, Pages, &Memory); - if (Status == EFI_SUCCESS) - *HostAddress = (VOID *)Memory; - return Status; -} - - -EFI_STATUS -PciIoFreeBuffer ( - IN EFI_PCI_IO_PROTOCOL *This, - IN UINTN Pages, - IN VOID *HostAddress - ) -{ - return gBS->FreePages((EFI_PHYSICAL_ADDRESS)HostAddress, Pages); -} - - -EFI_STATUS -PciIoFlush ( - IN EFI_PCI_IO_PROTOCOL *This - ) -{ - return EFI_SUCCESS; -} - -EFI_STATUS -PciIoGetLocation ( - IN EFI_PCI_IO_PROTOCOL *This, - OUT UINTN *SegmentNumber, - OUT UINTN *BusNumber, - OUT UINTN *DeviceNumber, - OUT UINTN *FunctionNumber - ) -{ - EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This); - - if (SegmentNumber != NULL) { - *SegmentNumber = Private->Segment; - } - - if (BusNumber != NULL) { - *BusNumber = 0xff; - } - - if (DeviceNumber != NULL) { - *DeviceNumber = 0; - } - - if (FunctionNumber != NULL) { - *FunctionNumber = 0; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -PciIoAttributes ( - IN EFI_PCI_IO_PROTOCOL *This, - IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation, - IN UINT64 Attributes, - OUT UINT64 *Result OPTIONAL - ) -{ - switch (Operation) { - case EfiPciIoAttributeOperationGet: - case EfiPciIoAttributeOperationSupported: - if (Result == NULL) { - return EFI_INVALID_PARAMETER; - } - // We are not a real PCI device so just say things we kind of do - *Result = EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER | EFI_PCI_DEVICE_ENABLE; - break; - - case EfiPciIoAttributeOperationSet: - case EfiPciIoAttributeOperationEnable: - case EfiPciIoAttributeOperationDisable: - // Since we are not a real PCI device no enable/set or disable operations exist. - return EFI_SUCCESS; - - default: - ASSERT (FALSE); - return EFI_INVALID_PARAMETER; - }; - return EFI_SUCCESS; -} - -EFI_STATUS -PciIoGetBarAttributes ( - IN EFI_PCI_IO_PROTOCOL *This, - IN UINT8 BarIndex, - OUT UINT64 *Supports, OPTIONAL - OUT VOID **Resources OPTIONAL - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_STATUS -PciIoSetBarAttributes ( - IN EFI_PCI_IO_PROTOCOL *This, - IN UINT64 Attributes, - IN UINT8 BarIndex, - IN OUT UINT64 *Offset, - IN OUT UINT64 *Length - ) -{ - ASSERT (FALSE); - return EFI_UNSUPPORTED; -} - -EFI_PCI_IO_PROTOCOL PciIoTemplate = -{ - PciIoPollMem, - PciIoPollIo, - { PciIoMemRead, PciIoMemWrite }, - { PciIoIoRead, PciIoIoWrite }, - { PciIoPciRead, PciIoPciWrite }, - PciIoCopyMem, - PciIoMap, - PciIoUnmap, - PciIoAllocateBuffer, - PciIoFreeBuffer, - PciIoFlush, - PciIoGetLocation, - PciIoAttributes, - PciIoGetBarAttributes, - PciIoSetBarAttributes, - 0, - 0 -}; - -EFI_STATUS -PciEmulationEntryPoint ( - EFI_PHYSICAL_ADDRESS AhciBaseAddr - ) -{ - EFI_STATUS Status; - EFI_HANDLE Handle; - EFI_PCI_IO_PRIVATE_DATA *Private; - - // Create a private structure - Private = AllocatePool(sizeof(EFI_PCI_IO_PRIVATE_DATA)); - if (Private == NULL) { - Status = EFI_OUT_OF_RESOURCES; - return Status; - } - - Private->Signature = EFI_PCI_IO_PRIVATE_DATA_SIGNATURE; // Fill in signature - Private->RootBridge.Signature = PCI_ROOT_BRIDGE_SIGNATURE; // Fake Root Bridge structure needs a signature too - Private->RootBridge.MemoryStart = AhciBaseAddr; // Get the SATA capability register base - Private->Segment = 0; // Default to segment zero - - // Total size of the SATA registers. - Private->RootBridge.MemorySize = 1024; - - // Create fake PCI config space. - Private->ConfigSpace = AllocateZeroPool(sizeof(PCI_TYPE00)); - if (Private->ConfigSpace == NULL) { - Status = EFI_OUT_OF_RESOURCES; - FreePool(Private); - return Status; - } - - // Configure PCI config space - Private->ConfigSpace->Hdr.VendorId = 0x3530; - Private->ConfigSpace->Hdr.DeviceId = 0x3530; - Private->ConfigSpace->Hdr.ClassCode[0] = PCI_IF_APIC_CONTROLLER2; - Private->ConfigSpace->Hdr.ClassCode[1] = PCI_CLASS_MASS_STORAGE_SATADPA; - Private->ConfigSpace->Hdr.ClassCode[2] = PCI_CLASS_MASS_STORAGE; - Private->ConfigSpace->Device.Bar[EFI_AHCI_BAR_INDEX] = Private->RootBridge.MemoryStart; - - Handle = NULL; - - // Unique device path. - CopyMem(&Private->DevicePath, &PciIoDevicePathTemplate, sizeof(PciIoDevicePathTemplate)); - Private->DevicePath.AcpiDevicePath.UID = 1; - - // Copy protocol structure - CopyMem(&Private->PciIoProtocol, &PciIoTemplate, sizeof(PciIoTemplate)); - - Status = gBS->InstallMultipleProtocolInterfaces(&Handle, - &gEfiPciIoProtocolGuid, &Private->PciIoProtocol, - &gEfiDevicePathProtocolGuid, &Private->DevicePath, - NULL); - if (EFI_ERROR(Status)) { - DEBUG((EFI_D_ERROR, "PciEmulationEntryPoint InstallMultipleProtocolInterfaces() failed.\n")); - } - - return Status; -} - diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h b/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h deleted file mode 100644 index 067aea21e33f..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h +++ /dev/null @@ -1,289 +0,0 @@ -/** @file - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _PCI_ROOT_BRIDGE_H_ -#define _PCI_ROOT_BRIDGE_H_ - -#include <PiDxe.h> - -#include <Library/BaseLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/DebugLib.h> -#include <Library/DxeServicesTableLib.h> -#include <Library/IoLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/PciLib.h> -#include <Library/UefiLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/DmaLib.h> - -#include <Protocol/EmbeddedExternalDevice.h> -#include <Protocol/DevicePath.h> -#include <Protocol/PciIo.h> -#include <Protocol/PciRootBridgeIo.h> -#include <Protocol/PciHostBridgeResourceAllocation.h> - -#include <IndustryStandard/Pci22.h> -#include <IndustryStandard/Pci30.h> -#include <IndustryStandard/Acpi.h> - - - -#define EFI_RESOURCE_NONEXISTENT 0xFFFFFFFFFFFFFFFFULL -#define EFI_RESOURCE_LESS 0xFFFFFFFFFFFFFFFEULL -#define EFI_RESOURCE_SATISFIED 0x0000000000000000ULL - - -typedef struct { - ACPI_HID_DEVICE_PATH AcpiDevicePath; - EFI_DEVICE_PATH_PROTOCOL EndDevicePath; -} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH; - - -#define ACPI_CONFIG_IO 0 -#define ACPI_CONFIG_MMIO 1 -#define ACPI_CONFIG_BUS 2 - -typedef struct { - EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR Desc[3]; - EFI_ACPI_END_TAG_DESCRIPTOR EndDesc; -} ACPI_CONFIG_INFO; - - -#define PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32 ('P', 'c', 'i', 'F') - -typedef struct { - UINT32 Signature; - EFI_HANDLE Handle; - EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL Io; - EFI_PCI_ROOT_BRIDGE_DEVICE_PATH DevicePath; - - UINT8 StartBus; - UINT8 EndBus; - UINT16 Type; - UINT32 MemoryStart; - UINT32 MemorySize; - UINTN IoOffset; - UINT32 IoStart; - UINT32 IoSize; - UINT64 PciAttributes; - - ACPI_CONFIG_INFO *Config; - -} PCI_ROOT_BRIDGE; - - -#define INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) CR (a, PCI_ROOT_BRIDGE, Io, PCI_ROOT_BRIDGE_SIGNATURE) - - -typedef union { - UINT8 volatile *buf; - UINT8 volatile *ui8; - UINT16 volatile *ui16; - UINT32 volatile *ui32; - UINT64 volatile *ui64; - UINTN volatile ui; -} PTR; - - - -EFI_STATUS -EFIAPI -PciRootBridgeIoPollMem ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINT64 Mask, - IN UINT64 Value, - IN UINT64 Delay, - OUT UINT64 *Result - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoPollIo ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINT64 Mask, - IN UINT64 Value, - IN UINT64 Delay, - OUT UINT64 *Result - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoMemRead ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoMemWrite ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoIoRead ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - IN OUT VOID *UserBuffer - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoIoWrite ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - IN OUT VOID *UserBuffer - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoCopyMem ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 DestAddress, - IN UINT64 SrcAddress, - IN UINTN Count - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoPciRead ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoPciWrite ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoMap ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation, - IN VOID *HostAddress, - IN OUT UINTN *NumberOfBytes, - OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, - OUT VOID **Mapping - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoUnmap ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN VOID *Mapping - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoAllocateBuffer ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_ALLOCATE_TYPE Type, - IN EFI_MEMORY_TYPE MemoryType, - IN UINTN Pages, - OUT VOID **HostAddress, - IN UINT64 Attributes - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoFreeBuffer ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN UINTN Pages, - OUT VOID *HostAddress - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoFlush ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoGetAttributes ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - OUT UINT64 *Supported, - OUT UINT64 *Attributes - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoSetAttributes ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN UINT64 Attributes, - IN OUT UINT64 *ResourceBase, - IN OUT UINT64 *ResourceLength - ); - -EFI_STATUS -EFIAPI -PciRootBridgeIoConfiguration ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - OUT VOID **Resources - ); - -// -// Private Function Prototypes -// -EFI_STATUS -EFIAPI -PciRootBridgeIoMemRW ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINTN Count, - IN BOOLEAN InStrideFlag, - IN PTR In, - IN BOOLEAN OutStrideFlag, - OUT PTR Out - ); - -BOOLEAN -PciIoMemAddressValid ( - IN EFI_PCI_IO_PROTOCOL *This, - IN UINT64 Address - ); - -EFI_STATUS -PciEmulationEntryPoint ( - EFI_PHYSICAL_ADDRESS AhciBaseAddr - ); - -#endif - diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c deleted file mode 100644 index 9fcb402bc326..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c +++ /dev/null @@ -1,307 +0,0 @@ -/** @file - - Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "PciEmulation.h" - -BOOLEAN -PciRootBridgeMemAddressValid ( - IN PCI_ROOT_BRIDGE *Private, - IN UINT64 Address - ) -{ - if ((Address >= Private->MemoryStart) && (Address < (Private->MemoryStart + Private->MemorySize))) { - return TRUE; - } - - return FALSE; -} - - -EFI_STATUS -PciRootBridgeIoMemRW ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINTN Count, - IN BOOLEAN InStrideFlag, - IN PTR In, - IN BOOLEAN OutStrideFlag, - OUT PTR Out - ) -{ - UINTN Stride; - UINTN InStride; - UINTN OutStride; - - - Width = (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) (Width & 0x03); - Stride = (UINTN)1 << Width; - InStride = InStrideFlag ? Stride : 0; - OutStride = OutStrideFlag ? Stride : 0; - - // - // Loop for each iteration and move the data - // - switch (Width) { - case EfiPciWidthUint8: - for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) { - *In.ui8 = *Out.ui8; - } - break; - case EfiPciWidthUint16: - for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) { - *In.ui16 = *Out.ui16; - } - break; - case EfiPciWidthUint32: - for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) { - *In.ui32 = *Out.ui32; - } - break; - default: - return EFI_INVALID_PARAMETER; - } - - return EFI_SUCCESS; -} - -EFI_STATUS -PciRootBridgeIoPciRW ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN BOOLEAN Write, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 UserAddress, - IN UINTN Count, - IN OUT VOID *UserBuffer - ) -{ - return EFI_SUCCESS; -} - -/** - Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space. - - @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. - @param Width Signifies the width of the memory operations. - @param Address The base address of the memory operations. - @param Count The number of memory operations to perform. - @param Buffer For read operations, the destination buffer to store the results. For write - operations, the source buffer to write data from. - - @retval EFI_SUCCESS The data was read from or written to the PCI root bridge. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoMemRead ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - PCI_ROOT_BRIDGE *Private; - UINTN AlignMask; - PTR In; - PTR Out; - - if ( Buffer == NULL ) { - return EFI_INVALID_PARAMETER; - } - - Private = INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS (This); - - if (!PciRootBridgeMemAddressValid (Private, Address)) { - return EFI_INVALID_PARAMETER; - } - - AlignMask = (1 << (Width & 0x03)) - 1; - if (Address & AlignMask) { - return EFI_INVALID_PARAMETER; - } - - In.buf = Buffer; - Out.buf = (VOID *)(UINTN) Address; - - switch (Width) { - case EfiPciWidthUint8: - case EfiPciWidthUint16: - case EfiPciWidthUint32: - case EfiPciWidthUint64: - return PciRootBridgeIoMemRW (Width, Count, TRUE, In, TRUE, Out); - - case EfiPciWidthFifoUint8: - case EfiPciWidthFifoUint16: - case EfiPciWidthFifoUint32: - case EfiPciWidthFifoUint64: - return PciRootBridgeIoMemRW (Width, Count, TRUE, In, FALSE, Out); - - case EfiPciWidthFillUint8: - case EfiPciWidthFillUint16: - case EfiPciWidthFillUint32: - case EfiPciWidthFillUint64: - return PciRootBridgeIoMemRW (Width, Count, FALSE, In, TRUE, Out); - - default: - break; - } - - return EFI_INVALID_PARAMETER; -} - - - -/** - Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space. - - @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. - @param Width Signifies the width of the memory operations. - @param Address The base address of the memory operations. - @param Count The number of memory operations to perform. - @param Buffer For read operations, the destination buffer to store the results. For write - operations, the source buffer to write data from. - - @retval EFI_SUCCESS The data was read from or written to the PCI root bridge. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoMemWrite ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - PCI_ROOT_BRIDGE *Private; - UINTN AlignMask; - PTR In; - PTR Out; - - if ( Buffer == NULL ) { - return EFI_INVALID_PARAMETER; - } - - Private = INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS (This); - - if (!PciRootBridgeMemAddressValid (Private, Address)) { - return EFI_INVALID_PARAMETER; - } - - AlignMask = (1 << (Width & 0x03)) - 1; - if (Address & AlignMask) { - return EFI_INVALID_PARAMETER; - } - - In.buf = (VOID *)(UINTN) Address; - Out.buf = Buffer; - - switch (Width) { - case EfiPciWidthUint8: - case EfiPciWidthUint16: - case EfiPciWidthUint32: - case EfiPciWidthUint64: - return PciRootBridgeIoMemRW (Width, Count, TRUE, In, TRUE, Out); - - case EfiPciWidthFifoUint8: - case EfiPciWidthFifoUint16: - case EfiPciWidthFifoUint32: - case EfiPciWidthFifoUint64: - return PciRootBridgeIoMemRW (Width, Count, FALSE, In, TRUE, Out); - - case EfiPciWidthFillUint8: - case EfiPciWidthFillUint16: - case EfiPciWidthFillUint32: - case EfiPciWidthFillUint64: - return PciRootBridgeIoMemRW (Width, Count, TRUE, In, FALSE, Out); - - default: - break; - } - - return EFI_INVALID_PARAMETER; -} - -/** - Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space. - - @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. - @param Width Signifies the width of the memory operations. - @param Address The base address of the memory operations. - @param Count The number of memory operations to perform. - @param Buffer For read operations, the destination buffer to store the results. For write - operations, the source buffer to write data from. - - @retval EFI_SUCCESS The data was read from or written to the PCI root bridge. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoPciRead ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - if (Buffer == NULL) { - return EFI_INVALID_PARAMETER; - } - - return PciRootBridgeIoPciRW (This, FALSE, Width, Address, Count, Buffer); -} - - - -/** - Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space. - - @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL. - @param Width Signifies the width of the memory operations. - @param Address The base address of the memory operations. - @param Count The number of memory operations to perform. - @param Buffer For read operations, the destination buffer to store the results. For write - operations, the source buffer to write data from. - - @retval EFI_SUCCESS The data was read from or written to the PCI root bridge. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval EFI_INVALID_PARAMETER One or more parameters are invalid. - -**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoPciWrite ( - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This, - IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width, - IN UINT64 Address, - IN UINTN Count, - IN OUT VOID *Buffer - ) -{ - if (Buffer == NULL) { - return EFI_INVALID_PARAMETER; - } - - return PciRootBridgeIoPciRW (This, TRUE, Width, Address, Count, Buffer); -} - - diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c deleted file mode 100644 index 93d940cff055..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c +++ /dev/null @@ -1,1027 +0,0 @@ -/** @file - This driver module produces IDE_CONTROLLER_INIT protocol for Sata Controllers. - - Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "SataController.h" - -/// -/// EFI_DRIVER_BINDING_PROTOCOL instance -/// -EFI_DRIVER_BINDING_PROTOCOL gSataControllerDriverBinding = { - SataControllerSupported, - SataControllerStart, - SataControllerStop, - 0xa, - NULL, - NULL -}; - -/** - Read AHCI Operation register. - - @param PciIo The PCI IO protocol instance. - @param Offset The operation register offset. - - @return The register content read. - -**/ -UINT32 -EFIAPI -AhciReadReg ( - IN EFI_PCI_IO_PROTOCOL *PciIo, - IN UINT32 Offset - ) -{ - UINT32 Data; - - ASSERT (PciIo != NULL); - - Data = 0; - - PciIo->Mem.Read ( - PciIo, - EfiPciIoWidthUint32, - AHCI_BAR_INDEX, - (UINT64) Offset, - 1, - &Data - ); - - return Data; -} - -/** - Write AHCI Operation register. - - @param PciIo The PCI IO protocol instance. - @param Offset The operation register offset. - @param Data The data used to write down. - -**/ -VOID -EFIAPI -AhciWriteReg ( - IN EFI_PCI_IO_PROTOCOL *PciIo, - IN UINT32 Offset, - IN UINT32 Data - ) -{ - ASSERT (PciIo != NULL); - - PciIo->Mem.Write ( - PciIo, - EfiPciIoWidthUint32, - AHCI_BAR_INDEX, - (UINT64) Offset, - 1, - &Data - ); - - return; -} - -/** - This function is used to calculate the best PIO mode supported by specific IDE device - - @param IdentifyData The identify data of specific IDE device. - @param DisPioMode Disqualified PIO modes collection. - @param SelectedMode Available PIO modes collection. - - @retval EFI_SUCCESS Best PIO modes are returned. - @retval EFI_UNSUPPORTED The device doesn't support PIO mode, - or all supported modes have been disqualified. -**/ -EFI_STATUS -CalculateBestPioMode ( - IN EFI_IDENTIFY_DATA *IdentifyData, - IN UINT16 *DisPioMode OPTIONAL, - OUT UINT16 *SelectedMode - ) -{ - UINT16 PioMode; - UINT16 AdvancedPioMode; - UINT16 Temp; - UINT16 Index; - UINT16 MinimumPioCycleTime; - - Temp = 0xff; - -DEBUG ((EFI_D_INFO, "CalculateBestPioMode()\n")); - - PioMode = (UINT8) (((ATA5_IDENTIFY_DATA *) (&(IdentifyData->AtaData)))->pio_cycle_timing >> 8); - - // - // See whether Identify Data word 64 - 70 are valid - // - if ((IdentifyData->AtaData.field_validity & 0x02) == 0x02) { - - AdvancedPioMode = IdentifyData->AtaData.advanced_pio_modes; - DEBUG ((EFI_D_INFO, "CalculateBestPioMode: AdvancedPioMode = %x\n", AdvancedPioMode)); - - for (Index = 0; Index < 8; Index++) { - if ((AdvancedPioMode & 0x01) != 0) { - Temp = Index; - } - - AdvancedPioMode >>= 1; - } - - // - // If Temp is modified, mean the advanced_pio_modes is not zero; - // if Temp is not modified, mean there is no advanced PIO mode supported, - // the best PIO Mode is the value in pio_cycle_timing. - // - if (Temp != 0xff) { - AdvancedPioMode = (UINT16) (Temp + 3); - } else { - AdvancedPioMode = PioMode; - } - - // - // Limit the PIO mode to at most PIO4. - // - PioMode = (UINT16) MIN (AdvancedPioMode, 4); - - MinimumPioCycleTime = IdentifyData->AtaData.min_pio_cycle_time_with_flow_control; - - if (MinimumPioCycleTime <= 120) { - PioMode = (UINT16) MIN (4, PioMode); - } else if (MinimumPioCycleTime <= 180) { - PioMode = (UINT16) MIN (3, PioMode); - } else if (MinimumPioCycleTime <= 240) { - PioMode = (UINT16) MIN (2, PioMode); - } else { - PioMode = 0; - } - - // - // Degrade the PIO mode if the mode has been disqualified - // - if (DisPioMode != NULL) { - if (*DisPioMode < 2) { - return EFI_UNSUPPORTED; // no mode below ATA_PIO_MODE_BELOW_2 - } - - if (PioMode >= *DisPioMode) { - PioMode = (UINT16) (*DisPioMode - 1); - } - } - - if (PioMode < 2) { - *SelectedMode = 1; // ATA_PIO_MODE_BELOW_2; - } else { - *SelectedMode = PioMode; // ATA_PIO_MODE_2 to ATA_PIO_MODE_4; - } - - } else { - // - // Identify Data word 64 - 70 are not valid - // Degrade the PIO mode if the mode has been disqualified - // - if (DisPioMode != NULL) { - if (*DisPioMode < 2) { - return EFI_UNSUPPORTED; // no mode below ATA_PIO_MODE_BELOW_2 - } - - if (PioMode == *DisPioMode) { - PioMode--; - } - } - - if (PioMode < 2) { - *SelectedMode = 1; // ATA_PIO_MODE_BELOW_2; - } else { - *SelectedMode = 2; // ATA_PIO_MODE_2; - } - - } - - return EFI_SUCCESS; -} - -/** - This function is used to calculate the best UDMA mode supported by specific IDE device - - @param IdentifyData The identify data of specific IDE device. - @param DisUDmaMode Disqualified UDMA modes collection. - @param SelectedMode Available UDMA modes collection. - - @retval EFI_SUCCESS Best UDMA modes are returned. - @retval EFI_UNSUPPORTED The device doesn't support UDMA mode, - or all supported modes have been disqualified. -**/ -EFI_STATUS -CalculateBestUdmaMode ( - IN EFI_IDENTIFY_DATA *IdentifyData, - IN UINT16 *DisUDmaMode OPTIONAL, - OUT UINT16 *SelectedMode - ) -{ - UINT16 TempMode; - UINT16 DeviceUDmaMode; - - DeviceUDmaMode = 0; - -DEBUG ((EFI_D_INFO, "CalculateBestUdmaMode()\n")); - // - // Check whether the WORD 88 (supported UltraDMA by drive) is valid - // - if ((IdentifyData->AtaData.field_validity & 0x04) == 0x00) { - return EFI_UNSUPPORTED; - } - - DeviceUDmaMode = IdentifyData->AtaData.ultra_dma_mode; - DEBUG ((EFI_D_INFO, "CalculateBestUdmaMode: DeviceUDmaMode = %x\n", DeviceUDmaMode)); - DeviceUDmaMode &= 0x3f; - TempMode = 0; // initialize it to UDMA-0 - - while ((DeviceUDmaMode >>= 1) != 0) { - TempMode++; - } - - // - // Degrade the UDMA mode if the mode has been disqualified - // - if (DisUDmaMode != NULL) { - if (*DisUDmaMode == 0) { - *SelectedMode = 0; - return EFI_UNSUPPORTED; // no mode below ATA_UDMA_MODE_0 - } - - if (TempMode >= *DisUDmaMode) { - TempMode = (UINT16) (*DisUDmaMode - 1); - } - } - - // - // Possible returned mode is between ATA_UDMA_MODE_0 and ATA_UDMA_MODE_5 - // - *SelectedMode = TempMode; - - return EFI_SUCCESS; -} - -/** - The Entry Point of module. It follows the standard UEFI driver model. - - @param[in] ImageHandle The firmware allocated handle for the EFI image. - @param[in] SystemTable A pointer to the EFI System Table. - - @retval EFI_SUCCESS The entry point is executed successfully. - @retval other Some error occurs when executing this entry point. - -**/ -EFI_STATUS -EFIAPI -InitializeSataControllerDriver ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - -DEBUG ((EFI_D_INFO, "InitializeSataControllerDriver()\n")); - // - // Initialize the SATA controller - // - Status = InitializeSataController(); - ASSERT_EFI_ERROR (Status); - - // - // Install driver model protocol(s). - // - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gSataControllerDriverBinding, - ImageHandle, - &gSataControllerComponentName, - &gSataControllerComponentName2 - ); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -/** - Supported function of Driver Binding protocol for this driver. - Test to see if this driver supports ControllerHandle. - - @param This Protocol instance pointer. - @param Controller Handle of device to test. - @param RemainingDevicePath A pointer to the device path. - it should be ignored by device driver. - - @retval EFI_SUCCESS This driver supports this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -SataControllerSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_PCI_IO_PROTOCOL *PciIo; - PCI_TYPE00 PciData; - -//DEBUG ((EFI_D_INFO, "SataControllerSupported()\n")); - // - // Attempt to open PCI I/O Protocol - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - (VOID **) &PciIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Now further check the PCI header: Base Class (offset 0x0B) and - // Sub Class (offset 0x0A). This controller should be an SATA controller - // - Status = PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint8, - PCI_CLASSCODE_OFFSET, - sizeof (PciData.Hdr.ClassCode), - PciData.Hdr.ClassCode - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - if (IS_PCI_IDE (&PciData) || IS_PCI_SATADPA (&PciData)) { - return EFI_SUCCESS; - } - - return EFI_UNSUPPORTED; -} - -/** - This routine is called right after the .Supported() called and - Start this driver on ControllerHandle. - - @param This Protocol instance pointer. - @param Controller Handle of device to bind driver to. - @param RemainingDevicePath A pointer to the device path. - it should be ignored by device driver. - - @retval EFI_SUCCESS This driver is added to this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other Some error occurs when binding this driver to this device. - -**/ -EFI_STATUS -EFIAPI -SataControllerStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_PCI_IO_PROTOCOL *PciIo; - PCI_TYPE00 PciData; - EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; - UINT32 Data32; - UINTN ChannelDeviceCount; - - DEBUG ((EFI_D_INFO, "SataControllerStart START\n")); - - SataPrivateData = NULL; - - // - // Now test and open PCI I/O Protocol - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - (VOID **) &PciIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR (Status)) { - DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status)); - return Status; - } - - // - // Allocate Sata Private Data structure - // - SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA)); - if (SataPrivateData == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - - // - // Initialize Sata Private Data - // - SataPrivateData->Signature = SATA_CONTROLLER_SIGNATURE; - SataPrivateData->PciIo = PciIo; - SataPrivateData->IdeInit.GetChannelInfo = IdeInitGetChannelInfo; - SataPrivateData->IdeInit.NotifyPhase = IdeInitNotifyPhase; - SataPrivateData->IdeInit.SubmitData = IdeInitSubmitData; - SataPrivateData->IdeInit.DisqualifyMode = IdeInitDisqualifyMode; - SataPrivateData->IdeInit.CalculateMode = IdeInitCalculateMode; - SataPrivateData->IdeInit.SetTiming = IdeInitSetTiming; - SataPrivateData->IdeInit.EnumAll = SATA_ENUMER_ALL; - - Status = PciIo->Pci.Read ( - PciIo, - EfiPciIoWidthUint8, - PCI_CLASSCODE_OFFSET, - sizeof (PciData.Hdr.ClassCode), - PciData.Hdr.ClassCode - ); - ASSERT_EFI_ERROR (Status); - - if (IS_PCI_IDE (&PciData)) { - SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL; - SataPrivateData->DeviceCount = IDE_MAX_DEVICES; - } else if (IS_PCI_SATADPA (&PciData)) { - // - // Read Host Capability Register(CAP) to get Number of Ports(NPS) and Supports Port Multiplier(SPM) - // NPS is 0's based value indicating the maximum number of ports supported by the HBA silicon. - // A maximum of 32 ports can be supported. A value of '0h', indicating one port, is the minimum requirement. - // - Data32 = AhciReadReg (PciIo, R_AHCI_CAP); - SataPrivateData->IdeInit.ChannelCount = (UINT8) ((Data32 & B_AHCI_CAP_NPS) + 1); - SataPrivateData->DeviceCount = AHCI_MAX_DEVICES; - if ((Data32 & B_AHCI_CAP_SPM) == B_AHCI_CAP_SPM) { - SataPrivateData->DeviceCount = AHCI_MULTI_MAX_DEVICES; - } - } - - ChannelDeviceCount = (UINTN) (SataPrivateData->IdeInit.ChannelCount) * (UINTN) (SataPrivateData->DeviceCount); - DEBUG ((EFI_D_INFO, "ChannelDeviceCount %d\n", ChannelDeviceCount)); - SataPrivateData->DisqulifiedModes = AllocateZeroPool ((sizeof (EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount); - if (SataPrivateData->DisqulifiedModes == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - - SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof (EFI_IDENTIFY_DATA)) * ChannelDeviceCount); - if (SataPrivateData->IdentifyData == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - - SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * ChannelDeviceCount); - if (SataPrivateData->IdentifyValid == NULL) { - Status = EFI_OUT_OF_RESOURCES; - goto Done; - } - - // - // Install IDE Controller Init Protocol to this instance - // - Status = gBS->InstallMultipleProtocolInterfaces ( - &Controller, - &gEfiIdeControllerInitProtocolGuid, - &(SataPrivateData->IdeInit), - NULL - ); - -Done: - if (EFI_ERROR (Status)) { - - gBS->CloseProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - This->DriverBindingHandle, - Controller - ); - if (SataPrivateData != NULL) { - if (SataPrivateData->DisqulifiedModes != NULL) { - FreePool (SataPrivateData->DisqulifiedModes); - } - if (SataPrivateData->IdentifyData != NULL) { - FreePool (SataPrivateData->IdentifyData); - } - if (SataPrivateData->IdentifyValid != NULL) { - FreePool (SataPrivateData->IdentifyValid); - } - FreePool (SataPrivateData); - } - } - - DEBUG ((EFI_D_INFO, "SataControllerStart END status = %r\n", Status)); - - return Status; -} - -/** - Stop this driver on ControllerHandle. - - @param This Protocol instance pointer. - @param Controller Handle of device to stop driver on. - @param NumberOfChildren Not used. - @param ChildHandleBuffer Not used. - - @retval EFI_SUCCESS This driver is removed from this device. - @retval other Some error occurs when removing this driver from this device. - -**/ -EFI_STATUS -EFIAPI -SataControllerStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -{ - EFI_STATUS Status; - EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeInit; - EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; - -DEBUG ((EFI_D_INFO, "SataControllerStop()\n")); - // - // Open the produced protocol - // - Status = gBS->OpenProtocol ( - Controller, - &gEfiIdeControllerInitProtocolGuid, - (VOID **) &IdeInit, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR (Status)) { - return EFI_UNSUPPORTED; - } - - SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (IdeInit); - ASSERT (SataPrivateData != NULL); - - // - // Uninstall the IDE Controller Init Protocol from this instance - // - Status = gBS->UninstallMultipleProtocolInterfaces ( - Controller, - &gEfiIdeControllerInitProtocolGuid, - &(SataPrivateData->IdeInit), - NULL - ); - if (EFI_ERROR (Status)) { - return Status; - } - - if (SataPrivateData != NULL) { - if (SataPrivateData->DisqulifiedModes != NULL) { - FreePool (SataPrivateData->DisqulifiedModes); - } - if (SataPrivateData->IdentifyData != NULL) { - FreePool (SataPrivateData->IdentifyData); - } - if (SataPrivateData->IdentifyValid != NULL) { - FreePool (SataPrivateData->IdentifyValid); - } - FreePool (SataPrivateData); - } - - // - // Close protocols opened by Sata Controller driver - // - return gBS->CloseProtocol ( - Controller, - &gEfiPciIoProtocolGuid, - This->DriverBindingHandle, - Controller - ); -} - -// -// Interface functions of IDE_CONTROLLER_INIT protocol -// -/** - Returns the information about the specified IDE channel. - - This function can be used to obtain information about a particular IDE channel. - The driver entity uses this information during the enumeration process. - - If Enabled is set to FALSE, the driver entity will not scan the channel. Note - that it will not prevent an operating system driver from scanning the channel. - - For most of today's controllers, MaxDevices will either be 1 or 2. For SATA - controllers, this value will always be 1. SATA configurations can contain SATA - port multipliers. SATA port multipliers behave like SATA bridges and can support - up to 16 devices on the other side. If a SATA port out of the IDE controller - is connected to a port multiplier, MaxDevices will be set to the number of SATA - devices that the port multiplier supports. Because today's port multipliers - support up to fifteen SATA devices, this number can be as large as fifteen. The IDE - bus driver is required to scan for the presence of port multipliers behind an SATA - controller and enumerate up to MaxDevices number of devices behind the port - multiplier. - - In this context, the devices behind a port multiplier constitute a channel. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel Zero-based channel number. - @param[out] Enabled TRUE if this channel is enabled. Disabled channels - are not scanned to see if any devices are present. - @param[out] MaxDevices The maximum number of IDE devices that the bus driver - can expect on this channel. For the ATA/ATAPI - specification, version 6, this number will either be - one or two. For Serial ATA (SATA) configurations with a - port multiplier, this number can be as large as fifteen. - - @retval EFI_SUCCESS Information was returned without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - -**/ -EFI_STATUS -EFIAPI -IdeInitGetChannelInfo ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - OUT BOOLEAN *Enabled, - OUT UINT8 *MaxDevices - ) -{ - EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; - SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This); - ASSERT (SataPrivateData != NULL); - -DEBUG ((EFI_D_INFO, "IdeInitGetChannelInfo()\n")); - if (Channel < This->ChannelCount) { - *Enabled = TRUE; - *MaxDevices = SataPrivateData->DeviceCount; - return EFI_SUCCESS; - } - - *Enabled = FALSE; - return EFI_INVALID_PARAMETER; -} - -/** - The notifications from the driver entity that it is about to enter a certain - phase of the IDE channel enumeration process. - - This function can be used to notify the IDE controller driver to perform - specific actions, including any chipset-specific initialization, so that the - chipset is ready to enter the next phase. Seven notification points are defined - at this time. - - More synchronization points may be added as required in the future. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Phase The phase during enumeration. - @param[in] Channel Zero-based channel number. - - @retval EFI_SUCCESS The notification was accepted without any errors. - @retval EFI_UNSUPPORTED Phase is not supported. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_NOT_READY This phase cannot be entered at this time; for - example, an attempt was made to enter a Phase - without having entered one or more previous - Phase. - -**/ -EFI_STATUS -EFIAPI -IdeInitNotifyPhase ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN EFI_IDE_CONTROLLER_ENUM_PHASE Phase, - IN UINT8 Channel - ) -{ - return EFI_SUCCESS; -} - -/** - Submits the device information to the IDE controller driver. - - This function is used by the driver entity to pass detailed information about - a particular device to the IDE controller driver. The driver entity obtains - this information by issuing an ATA or ATAPI IDENTIFY_DEVICE command. IdentifyData - is the pointer to the response data buffer. The IdentifyData buffer is owned - by the driver entity, and the IDE controller driver must make a local copy - of the entire buffer or parts of the buffer as needed. The original IdentifyData - buffer pointer may not be valid when - - - EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() or - - EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() is called at a later point. - - The IDE controller driver may consult various fields of EFI_IDENTIFY_DATA to - compute the optimum mode for the device. These fields are not limited to the - timing information. For example, an implementation of the IDE controller driver - may examine the vendor and type/mode field to match known bad drives. - - The driver entity may submit drive information in any order, as long as it - submits information for all the devices belonging to the enumeration group - before EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() is called for any device - in that enumeration group. If a device is absent, EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - should be called with IdentifyData set to NULL. The IDE controller driver may - not have any other mechanism to know whether a device is present or not. Therefore, - setting IdentifyData to NULL does not constitute an error condition. - EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() can be called only once for a - given (Channel, Device) pair. - - @param[in] This A pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel Zero-based channel number. - @param[in] Device Zero-based device number on the Channel. - @param[in] IdentifyData The device's response to the ATA IDENTIFY_DEVICE command. - - @retval EFI_SUCCESS The information was accepted without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - -**/ -EFI_STATUS -EFIAPI -IdeInitSubmitData ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - IN EFI_IDENTIFY_DATA *IdentifyData - ) -{ - EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; - SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This); - ASSERT (SataPrivateData != NULL); - -DEBUG ((EFI_D_INFO, "IdeInitSubmitData()\n")); - if ((Channel >= This->ChannelCount) || (Device >= SataPrivateData->DeviceCount)) { - return EFI_INVALID_PARAMETER; - } - - // - // Make a local copy of device's IdentifyData and mark the valid flag - // - if (IdentifyData != NULL) { - CopyMem ( - &(SataPrivateData->IdentifyData[Channel * Device]), - IdentifyData, - sizeof (EFI_IDENTIFY_DATA) - ); - - SataPrivateData->IdentifyValid[Channel * Device] = TRUE; - } else { - SataPrivateData->IdentifyValid[Channel * Device] = FALSE; - } - - return EFI_SUCCESS; -} - -/** - Disqualifies specific modes for an IDE device. - - This function allows the driver entity or other drivers (such as platform - drivers) to reject certain timing modes and request the IDE controller driver - to recalculate modes. This function allows the driver entity and the IDE - controller driver to negotiate the timings on a per-device basis. This function - is useful in the case of drives that lie about their capabilities. An example - is when the IDE device fails to accept the timing modes that are calculated - by the IDE controller driver based on the response to the Identify Drive command. - - If the driver entity does not want to limit the ATA timing modes and leave that - decision to the IDE controller driver, it can either not call this function for - the given device or call this function and set the Valid flag to FALSE for all - modes that are listed in EFI_ATA_COLLECTIVE_MODE. - - The driver entity may disqualify modes for a device in any order and any number - of times. - - This function can be called multiple times to invalidate multiple modes of the - same type (e.g., Programmed Input/Output [PIO] modes 3 and 4). See the ATA/ATAPI - specification for more information on PIO modes. - - For Serial ATA (SATA) controllers, this member function can be used to disqualify - a higher transfer rate mode on a given channel. For example, a platform driver - may inform the IDE controller driver to not use second-generation (Gen2) speeds - for a certain SATA drive. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel The zero-based channel number. - @param[in] Device The zero-based device number on the Channel. - @param[in] BadModes The modes that the device does not support and that - should be disqualified. - - @retval EFI_SUCCESS The modes were accepted without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - @retval EFI_INVALID_PARAMETER IdentifyData is NULL. - -**/ -EFI_STATUS -EFIAPI -IdeInitDisqualifyMode ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - IN EFI_ATA_COLLECTIVE_MODE *BadModes - ) -{ - EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; - SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This); - ASSERT (SataPrivateData != NULL); - -DEBUG ((EFI_D_INFO, "IdeInitDisqualifyMode()\n")); - - if ((Channel >= This->ChannelCount) || (BadModes == NULL) || (Device >= SataPrivateData->DeviceCount)) { - return EFI_INVALID_PARAMETER; - } - - // - // Record the disqualified modes per channel per device. From ATA/ATAPI spec, - // if a mode is not supported, the modes higher than it is also not supported. - // - CopyMem ( - &(SataPrivateData->DisqulifiedModes[Channel * Device]), - BadModes, - sizeof (EFI_ATA_COLLECTIVE_MODE) - ); - - return EFI_SUCCESS; -} - -/** - Returns the information about the optimum modes for the specified IDE device. - - This function is used by the driver entity to obtain the optimum ATA modes for - a specific device. The IDE controller driver takes into account the following - while calculating the mode: - - The IdentifyData inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - - The BadModes inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() - - The driver entity is required to call EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - for all the devices that belong to an enumeration group before calling - EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() for any device in the same group. - - The IDE controller driver will use controller- and possibly platform-specific - algorithms to arrive at SupportedModes. The IDE controller may base its - decision on user preferences and other considerations as well. This function - may be called multiple times because the driver entity may renegotiate the mode - with the IDE controller driver using EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode(). - - The driver entity may collect timing information for various devices in any - order. The driver entity is responsible for making sure that all the dependencies - are satisfied. For example, the SupportedModes information for device A that - was previously returned may become stale after a call to - EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() for device B. - - The buffer SupportedModes is allocated by the callee because the caller does - not necessarily know the size of the buffer. The type EFI_ATA_COLLECTIVE_MODE - is defined in a way that allows for future extensibility and can be of variable - length. This memory pool should be deallocated by the caller when it is no - longer necessary. - - The IDE controller driver for a Serial ATA (SATA) controller can use this - member function to force a lower speed (first-generation [Gen1] speeds on a - second-generation [Gen2]-capable hardware). The IDE controller driver can - also allow the driver entity to stay with the speed that has been negotiated - by the physical layer. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel A zero-based channel number. - @param[in] Device A zero-based device number on the Channel. - @param[out] SupportedModes The optimum modes for the device. - - @retval EFI_SUCCESS SupportedModes was returned. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - @retval EFI_INVALID_PARAMETER SupportedModes is NULL. - @retval EFI_NOT_READY Modes cannot be calculated due to a lack of - data. This error may happen if - EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - and EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyData() - were not called for at least one drive in the - same enumeration group. - -**/ -EFI_STATUS -EFIAPI -IdeInitCalculateMode ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - OUT EFI_ATA_COLLECTIVE_MODE **SupportedModes - ) -{ - EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData; - EFI_IDENTIFY_DATA *IdentifyData; - BOOLEAN IdentifyValid; - EFI_ATA_COLLECTIVE_MODE *DisqulifiedModes; - UINT16 SelectedMode; - EFI_STATUS Status; - -DEBUG ((EFI_D_INFO, "IdeInitCalculateMode()\n")); - SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This); - ASSERT (SataPrivateData != NULL); - - if ((Channel >= This->ChannelCount) || (SupportedModes == NULL) || (Device >= SataPrivateData->DeviceCount)) { - return EFI_INVALID_PARAMETER; - } - - *SupportedModes = AllocateZeroPool (sizeof (EFI_ATA_COLLECTIVE_MODE)); - if (*SupportedModes == NULL) { - ASSERT (*SupportedModes != NULL); - return EFI_OUT_OF_RESOURCES; - } - - IdentifyData = &(SataPrivateData->IdentifyData[Channel * Device]); - IdentifyValid = SataPrivateData->IdentifyValid[Channel * Device]; - DisqulifiedModes = &(SataPrivateData->DisqulifiedModes[Channel * Device]); - - // - // Make sure we've got the valid identify data of the device from SubmitData() - // - if (!IdentifyValid) { - FreePool (*SupportedModes); - return EFI_NOT_READY; - } - - Status = CalculateBestPioMode ( - IdentifyData, - (DisqulifiedModes->PioMode.Valid ? ((UINT16 *) &(DisqulifiedModes->PioMode.Mode)) : NULL), - &SelectedMode - ); - if (!EFI_ERROR (Status)) { - (*SupportedModes)->PioMode.Valid = TRUE; - (*SupportedModes)->PioMode.Mode = SelectedMode; - - } else { - (*SupportedModes)->PioMode.Valid = FALSE; - } - DEBUG ((EFI_D_INFO, "IdeInitCalculateMode: PioMode = %x\n", (*SupportedModes)->PioMode.Mode)); - - Status = CalculateBestUdmaMode ( - IdentifyData, - (DisqulifiedModes->UdmaMode.Valid ? ((UINT16 *) &(DisqulifiedModes->UdmaMode.Mode)) : NULL), - &SelectedMode - ); - - if (!EFI_ERROR (Status)) { - (*SupportedModes)->UdmaMode.Valid = TRUE; - (*SupportedModes)->UdmaMode.Mode = SelectedMode; - - } else { - (*SupportedModes)->UdmaMode.Valid = FALSE; - } - DEBUG ((EFI_D_INFO, "IdeInitCalculateMode: UdmaMode = %x\n", (*SupportedModes)->UdmaMode.Mode)); - - // - // The modes other than PIO and UDMA are not supported - // - return EFI_SUCCESS; -} - -/** - Commands the IDE controller driver to program the IDE controller hardware - so that the specified device can operate at the specified mode. - - This function is used by the driver entity to instruct the IDE controller - driver to program the IDE controller hardware to the specified modes. This - function can be called only once for a particular device. For a Serial ATA - (SATA) Advanced Host Controller Interface (AHCI) controller, no controller- - specific programming may be required. - - @param[in] This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel Zero-based channel number. - @param[in] Device Zero-based device number on the Channel. - @param[in] Modes The modes to set. - - @retval EFI_SUCCESS The command was accepted without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - @retval EFI_NOT_READY Modes cannot be set at this time due to lack of data. - @retval EFI_DEVICE_ERROR Modes cannot be set due to hardware failure. - The driver entity should not use this device. - -**/ -EFI_STATUS -EFIAPI -IdeInitSetTiming ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - IN EFI_ATA_COLLECTIVE_MODE *Modes - ) -{ - return EFI_SUCCESS; -} diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h deleted file mode 100644 index cb9b84be2d1b..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h +++ /dev/null @@ -1,555 +0,0 @@ -/** @file - Header file for Sata Controller driver. - - Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _SATA_CONTROLLER_H_ -#define _SATA_CONTROLLER_H_ - -#include <Uefi.h> -#include <Protocol/ComponentName.h> -#include <Protocol/DriverBinding.h> -#include <Protocol/PciIo.h> -#include <Protocol/IdeControllerInit.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/DebugLib.h> -#include <Library/UefiLib.h> -#include <Library/BaseLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <IndustryStandard/Pci.h> - -// -// Global Variables definitions -// -extern EFI_DRIVER_BINDING_PROTOCOL gSataControllerDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gSataControllerComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gSataControllerComponentName2; - -#define AHCI_BAR_INDEX 0x05 -#define R_AHCI_CAP 0x0 -#define B_AHCI_CAP_NPS (BIT4 | BIT3 | BIT2 | BIT1 | BIT0) // Number of Ports -#define B_AHCI_CAP_SPM BIT17 // Supports Port Multiplier - -/// -/// AHCI each channel can have up to 1 device -/// -#define AHCI_MAX_DEVICES 0x01 - -/// -/// AHCI each channel can have 15 devices in the presence of a multiplier -/// -#define AHCI_MULTI_MAX_DEVICES 0x0F - -/// -/// IDE supports 2 channel max -/// -#define IDE_MAX_CHANNEL 0x02 - -/// -/// IDE supports 2 devices max -/// -#define IDE_MAX_DEVICES 0x02 - -#define SATA_ENUMER_ALL FALSE - -// -// Sata Controller driver private data structure -// - -#define SATA_CONTROLLER_SIGNATURE SIGNATURE_32('S','A','T','A') - -typedef struct _EFI_SATA_CONTROLLER_PRIVATE_DATA { - // - // Standard signature used to identify Sata Controller private data - // - UINT32 Signature; - - // - // Protocol instance of IDE_CONTROLLER_INIT produced by this driver - // - EFI_IDE_CONTROLLER_INIT_PROTOCOL IdeInit; - - // - // Copy of protocol pointers used by this driver - // - EFI_PCI_IO_PROTOCOL *PciIo; - - // - // The number of devices that are supported by this channel - // - UINT8 DeviceCount; - - // - // The highest disqulified mode for each attached device, - // From ATA/ATAPI spec, if a mode is not supported, - // the modes higher than it is also not supported - // - EFI_ATA_COLLECTIVE_MODE *DisqulifiedModes; - - // - // A copy of EFI_IDENTIFY_DATA data for each attached SATA device and its flag - // - EFI_IDENTIFY_DATA *IdentifyData; - BOOLEAN *IdentifyValid; -} EFI_SATA_CONTROLLER_PRIVATE_DATA; - -#define SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS(a) CR(a, EFI_SATA_CONTROLLER_PRIVATE_DATA, IdeInit, SATA_CONTROLLER_SIGNATURE) - -/** - Initialize the Sata controller hardware. - - @retval EFI_SUCCESS This driver is removed from this device. - @retval other Some error occurs when removing this driver from this device. -**/ -EFI_STATUS -InitializeSataController ( - VOID - ); - -// -// Driver binding functions declaration -// -/** - Supported function of Driver Binding protocol for this driver. - Test to see if this driver supports ControllerHandle. - - @param This Protocol instance pointer. - @param Controller Handle of device to test. - @param RemainingDevicePath A pointer to the device path. Should be ignored by - device driver. - - @retval EFI_SUCCESS This driver supports this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -SataControllerSupported ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -; - -/** - This routine is called right after the .Supported() called and - Start this driver on ControllerHandle. - - @param This Protocol instance pointer. - @param Controller Handle of device to bind driver to. - @param RemainingDevicePath A pointer to the device path. Should be ignored by - device driver. - - @retval EFI_SUCCESS This driver is added to this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other Some error occurs when binding this driver to this device. - -**/ -EFI_STATUS -EFIAPI -SataControllerStart ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath - ) -; - -/** - Stop this driver on ControllerHandle. - - @param This Protocol instance pointer. - @param Controller Handle of device to stop driver on. - @param NumberOfChildren Not used. - @param ChildHandleBuffer Not used. - - @retval EFI_SUCCESS This driver is removed from this device. - @retval other Some error occurs when removing this driver from this device. - -**/ -EFI_STATUS -EFIAPI -SataControllerStop ( - IN EFI_DRIVER_BINDING_PROTOCOL *This, - IN EFI_HANDLE Controller, - IN UINTN NumberOfChildren, - IN EFI_HANDLE *ChildHandleBuffer - ) -; - -// -// IDE controller init functions declaration -// -/** - Returns the information about the specified IDE channel. - - This function can be used to obtain information about a particular IDE channel. - The driver entity uses this information during the enumeration process. - - If Enabled is set to FALSE, the driver entity will not scan the channel. Note - that it will not prevent an operating system driver from scanning the channel. - - For most of today's controllers, MaxDevices will either be 1 or 2. For SATA - controllers, this value will always be 1. SATA configurations can contain SATA - port multipliers. SATA port multipliers behave like SATA bridges and can support - up to 16 devices on the other side. If a SATA port out of the IDE controller - is connected to a port multiplier, MaxDevices will be set to the number of SATA - devices that the port multiplier supports. Because today's port multipliers - support up to fifteen SATA devices, this number can be as large as fifteen. The IDE - bus driver is required to scan for the presence of port multipliers behind an SATA - controller and enumerate up to MaxDevices number of devices behind the port - multiplier. - - In this context, the devices behind a port multiplier constitute a channel. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel Zero-based channel number. - @param[out] Enabled TRUE if this channel is enabled. Disabled channels - are not scanned to see if any devices are present. - @param[out] MaxDevices The maximum number of IDE devices that the bus driver - can expect on this channel. For the ATA/ATAPI - specification, version 6, this number will either be - one or two. For Serial ATA (SATA) configurations with a - port multiplier, this number can be as large as fifteen. - - @retval EFI_SUCCESS Information was returned without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - -**/ -EFI_STATUS -EFIAPI -IdeInitGetChannelInfo ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - OUT BOOLEAN *Enabled, - OUT UINT8 *MaxDevices - ) -; - -/** - The notifications from the driver entity that it is about to enter a certain - phase of the IDE channel enumeration process. - - This function can be used to notify the IDE controller driver to perform - specific actions, including any chipset-specific initialization, so that the - chipset is ready to enter the next phase. Seven notification points are defined - at this time. - - More synchronization points may be added as required in the future. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Phase The phase during enumeration. - @param[in] Channel Zero-based channel number. - - @retval EFI_SUCCESS The notification was accepted without any errors. - @retval EFI_UNSUPPORTED Phase is not supported. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_NOT_READY This phase cannot be entered at this time; for - example, an attempt was made to enter a Phase - without having entered one or more previous - Phase. - -**/ -EFI_STATUS -EFIAPI -IdeInitNotifyPhase ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN EFI_IDE_CONTROLLER_ENUM_PHASE Phase, - IN UINT8 Channel - ) -; - -/** - Submits the device information to the IDE controller driver. - - This function is used by the driver entity to pass detailed information about - a particular device to the IDE controller driver. The driver entity obtains - this information by issuing an ATA or ATAPI IDENTIFY_DEVICE command. IdentifyData - is the pointer to the response data buffer. The IdentifyData buffer is owned - by the driver entity, and the IDE controller driver must make a local copy - of the entire buffer or parts of the buffer as needed. The original IdentifyData - buffer pointer may not be valid when - - - EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() or - - EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() is called at a later point. - - The IDE controller driver may consult various fields of EFI_IDENTIFY_DATA to - compute the optimum mode for the device. These fields are not limited to the - timing information. For example, an implementation of the IDE controller driver - may examine the vendor and type/mode field to match known bad drives. - - The driver entity may submit drive information in any order, as long as it - submits information for all the devices belonging to the enumeration group - before EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() is called for any device - in that enumeration group. If a device is absent, EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - should be called with IdentifyData set to NULL. The IDE controller driver may - not have any other mechanism to know whether a device is present or not. Therefore, - setting IdentifyData to NULL does not constitute an error condition. - EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() can be called only once for a - given (Channel, Device) pair. - - @param[in] This A pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel Zero-based channel number. - @param[in] Device Zero-based device number on the Channel. - @param[in] IdentifyData The device's response to the ATA IDENTIFY_DEVICE command. - - @retval EFI_SUCCESS The information was accepted without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - -**/ -EFI_STATUS -EFIAPI -IdeInitSubmitData ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - IN EFI_IDENTIFY_DATA *IdentifyData - ) -; - -/** - Disqualifies specific modes for an IDE device. - - This function allows the driver entity or other drivers (such as platform - drivers) to reject certain timing modes and request the IDE controller driver - to recalculate modes. This function allows the driver entity and the IDE - controller driver to negotiate the timings on a per-device basis. This function - is useful in the case of drives that lie about their capabilities. An example - is when the IDE device fails to accept the timing modes that are calculated - by the IDE controller driver based on the response to the Identify Drive command. - - If the driver entity does not want to limit the ATA timing modes and leave that - decision to the IDE controller driver, it can either not call this function for - the given device or call this function and set the Valid flag to FALSE for all - modes that are listed in EFI_ATA_COLLECTIVE_MODE. - - The driver entity may disqualify modes for a device in any order and any number - of times. - - This function can be called multiple times to invalidate multiple modes of the - same type (e.g., Programmed Input/Output [PIO] modes 3 and 4). See the ATA/ATAPI - specification for more information on PIO modes. - - For Serial ATA (SATA) controllers, this member function can be used to disqualify - a higher transfer rate mode on a given channel. For example, a platform driver - may inform the IDE controller driver to not use second-generation (Gen2) speeds - for a certain SATA drive. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel The zero-based channel number. - @param[in] Device The zero-based device number on the Channel. - @param[in] BadModes The modes that the device does not support and that - should be disqualified. - - @retval EFI_SUCCESS The modes were accepted without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - @retval EFI_INVALID_PARAMETER IdentifyData is NULL. - -**/ -EFI_STATUS -EFIAPI -IdeInitDisqualifyMode ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - IN EFI_ATA_COLLECTIVE_MODE *BadModes - ) -; - -/** - Returns the information about the optimum modes for the specified IDE device. - - This function is used by the driver entity to obtain the optimum ATA modes for - a specific device. The IDE controller driver takes into account the following - while calculating the mode: - - The IdentifyData inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - - The BadModes inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() - - The driver entity is required to call EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - for all the devices that belong to an enumeration group before calling - EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() for any device in the same group. - - The IDE controller driver will use controller- and possibly platform-specific - algorithms to arrive at SupportedModes. The IDE controller may base its - decision on user preferences and other considerations as well. This function - may be called multiple times because the driver entity may renegotiate the mode - with the IDE controller driver using EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode(). - - The driver entity may collect timing information for various devices in any - order. The driver entity is responsible for making sure that all the dependencies - are satisfied. For example, the SupportedModes information for device A that - was previously returned may become stale after a call to - EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() for device B. - - The buffer SupportedModes is allocated by the callee because the caller does - not necessarily know the size of the buffer. The type EFI_ATA_COLLECTIVE_MODE - is defined in a way that allows for future extensibility and can be of variable - length. This memory pool should be deallocated by the caller when it is no - longer necessary. - - The IDE controller driver for a Serial ATA (SATA) controller can use this - member function to force a lower speed (first-generation [Gen1] speeds on a - second-generation [Gen2]-capable hardware). The IDE controller driver can - also allow the driver entity to stay with the speed that has been negotiated - by the physical layer. - - @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel A zero-based channel number. - @param[in] Device A zero-based device number on the Channel. - @param[out] SupportedModes The optimum modes for the device. - - @retval EFI_SUCCESS SupportedModes was returned. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - @retval EFI_INVALID_PARAMETER SupportedModes is NULL. - @retval EFI_NOT_READY Modes cannot be calculated due to a lack of - data. This error may happen if - EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() - and EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyData() - were not called for at least one drive in the - same enumeration group. - -**/ -EFI_STATUS -EFIAPI -IdeInitCalculateMode ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - OUT EFI_ATA_COLLECTIVE_MODE **SupportedModes - ) -; - -/** - Commands the IDE controller driver to program the IDE controller hardware - so that the specified device can operate at the specified mode. - - This function is used by the driver entity to instruct the IDE controller - driver to program the IDE controller hardware to the specified modes. This - function can be called only once for a particular device. For a Serial ATA - (SATA) Advanced Host Controller Interface (AHCI) controller, no controller- - specific programming may be required. - - @param[in] This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance. - @param[in] Channel Zero-based channel number. - @param[in] Device Zero-based device number on the Channel. - @param[in] Modes The modes to set. - - @retval EFI_SUCCESS The command was accepted without any errors. - @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount). - @retval EFI_INVALID_PARAMETER Device is invalid. - @retval EFI_NOT_READY Modes cannot be set at this time due to lack of data. - @retval EFI_DEVICE_ERROR Modes cannot be set due to hardware failure. - The driver entity should not use this device. - -**/ -EFI_STATUS -EFIAPI -IdeInitSetTiming ( - IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This, - IN UINT8 Channel, - IN UINT8 Device, - IN EFI_ATA_COLLECTIVE_MODE *Modes - ) -; - -// -// Forward reference declaration -// -/** - Retrieves a Unicode string that is the user readable name of the UEFI Driver. - - @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param Language A pointer to a three character ISO 639-2 language identifier. - This is the language of the driver name that that the caller - is requesting, and it must match one of the languages specified - in SupportedLanguages. The number of languages supported by a - driver is up to the driver writer. - @param DriverName A pointer to the Unicode string to return. This Unicode string - is the name of the driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by This - and the language specified by Language was returned - in DriverName. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER DriverName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetDriverName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN CHAR8 *Language, - OUT CHAR16 **DriverName - ) -; - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by an UEFI Driver. - - @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance. - @param ControllerHandle The handle of a controller that the driver specified by - This is managing. This handle specifies the controller - whose name is to be returned. - @param OPTIONAL ChildHandle The handle of the child controller to retrieve the name - of. This is an optional parameter that may be NULL. It - will be NULL for device drivers. It will also be NULL - for a bus drivers that wish to retrieve the name of the - bus controller. It will not be NULL for a bus driver - that wishes to retrieve the name of a child controller. - @param Language A pointer to a three character ISO 639-2 language - identifier. This is the language of the controller name - that that the caller is requesting, and it must match one - of the languages specified in SupportedLanguages. The - number of languages supported by a driver is up to the - driver writer. - @param ControllerName A pointer to the Unicode string to return. This Unicode - string is the name of the controller specified by - ControllerHandle and ChildHandle in the language - specified by Language from the point of view of the - driver specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in the - language specified by Language for the driver - specified by This was returned in DriverName. - @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE. - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - @retval EFI_INVALID_PARAMETER Language is NULL. - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - @retval EFI_UNSUPPORTED The driver specified by This does not support the - language specified by Language. -**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetControllerName ( - IN EFI_COMPONENT_NAME_PROTOCOL *This, - IN EFI_HANDLE ControllerHandle, - IN EFI_HANDLE ChildHandle OPTIONAL, - IN CHAR8 *Language, - OUT CHAR16 **ControllerName - ) -; - -#endif diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf deleted file mode 100644 index 383ef90dc08c..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf +++ /dev/null @@ -1,85 +0,0 @@ -## @file -# -# Component description file for the Sata Controller driver. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> -# Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -## - -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = SataController - FILE_GUID = 1c6d1ed1-22ec-4b16-9179-e5cdbf7ddf8d - MODULE_TYPE = UEFI_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = InitializeSataControllerDriver - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# - -[Sources] - ComponentName.c - SataController.c - SataController.h - PciEmulation.c - PciEmulation.h - PciRootBridgeIo.c - SataRegisters.h - InitController.c - -[Packages] - ArmPkg/ArmPkg.dec - ArmPlatformPkg/ArmPlatformPkg.dec - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - IntelFrameworkPkg/IntelFrameworkPkg.dec - EmbeddedPkg/EmbeddedPkg.dec - AmdModulePkg/AmdModulePkg.dec - OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec - -[LibraryClasses] - UefiDriverEntryPoint - DebugLib - UefiLib - BaseLib - BaseMemoryLib - MemoryAllocationLib - UefiBootServicesTableLib - IoLib - AmdSataInit - -[Protocols] - gEfiPciIoProtocolGuid - gEfiIdeControllerInitProtocolGuid - -[Pcd] - gAmdModulePkgTokenSpaceGuid.PcdSataSerdesBase - gAmdModulePkgTokenSpaceGuid.PcdSataSerdesOffset - gAmdModulePkgTokenSpaceGuid.PcdSataNumChPerSerdes - - gAmdStyxTokenSpaceGuid.PcdSataCtrlAxiSlvPort - gAmdStyxTokenSpaceGuid.PcdSataPortCount - gAmdStyxTokenSpaceGuid.PcdSataPi - gAmdStyxTokenSpaceGuid.PcdSataPortMode - gAmdStyxTokenSpaceGuid.PcdSataSmpsSupport - gAmdStyxTokenSpaceGuid.PcdSataSssSupport - gAmdStyxTokenSpaceGuid.PcdSataPortCpd - gAmdStyxTokenSpaceGuid.PcdSataPortMpsp - gAmdStyxTokenSpaceGuid.PcdSata1CtrlAxiSlvPort - gAmdStyxTokenSpaceGuid.PcdSata1PortCount - -[Depex] - TRUE - diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h deleted file mode 100644 index ff78f4ac3c67..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h +++ /dev/null @@ -1,180 +0,0 @@ -/** @file - Header file for AHCI mode of ATA host controller. - - Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR> - Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> - - This program and the accompanying materials - are licensed and made available under the terms and conditions of the BSD License - which accompanies this distribution. The full text of the license may be found at - http://opensource.org/licenses/bsd-license.php - - THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, - WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ -#ifndef __SATA_REGISTERS_H__ -#define __SATA_REGISTERS_H__ - -#define EFI_AHCI_BAR_INDEX 0x05 - -#define EFI_AHCI_CAPABILITY_OFFSET 0x0000 -#define EFI_AHCI_CAP_SSS BIT27 -#define EFI_AHCI_CAP_SMPS BIT28 -#define EFI_AHCI_CAP_S64A BIT31 -#define EFI_AHCI_GHC_OFFSET 0x0004 -#define EFI_AHCI_GHC_RESET BIT0 -#define EFI_AHCI_GHC_IE BIT1 -#define EFI_AHCI_GHC_ENABLE BIT31 -#define EFI_AHCI_IS_OFFSET 0x0008 -#define EFI_AHCI_PI_OFFSET 0x000C - -#define EFI_AHCI_MAX_PORTS 32 - -// -// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms. -// -#define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 10 -// -// Refer SATA1.0a spec, the FIS enable time should be less than 500ms. -// -#define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500) -// -// Refer SATA1.0a spec, the bus reset time should be less than 1s. -// -#define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1) - -#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000 -#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000 -#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000 -#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000 - -// -// Each PRDT entry can point to a memory block up to 4M byte -// -#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000 - -#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device -#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20 -#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host -#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20 -#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host -#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4 -#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional -#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28 -#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional -#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional -#define EFI_AHCI_FIS_BIST_LENGTH 12 -#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host -#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20 -#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host -#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8 - -#define EFI_AHCI_D2H_FIS_OFFSET 0x40 -#define EFI_AHCI_DMA_FIS_OFFSET 0x00 -#define EFI_AHCI_PIO_FIS_OFFSET 0x20 -#define EFI_AHCI_SDB_FIS_OFFSET 0x58 -#define EFI_AHCI_FIS_TYPE_MASK 0xFF -#define EFI_AHCI_U_FIS_OFFSET 0x60 - -// -// Port register -// -#define EFI_AHCI_PORT_START 0x0100 -#define EFI_AHCI_PORT_REG_WIDTH 0x0080 -#define EFI_AHCI_PORT_CLB 0x0000 -#define EFI_AHCI_PORT_CLBU 0x0004 -#define EFI_AHCI_PORT_FB 0x0008 -#define EFI_AHCI_PORT_FBU 0x000C -#define EFI_AHCI_PORT_IS 0x0010 -#define EFI_AHCI_PORT_IS_DHRS BIT0 -#define EFI_AHCI_PORT_IS_PSS BIT1 -#define EFI_AHCI_PORT_IS_SSS BIT2 -#define EFI_AHCI_PORT_IS_SDBS BIT3 -#define EFI_AHCI_PORT_IS_UFS BIT4 -#define EFI_AHCI_PORT_IS_DPS BIT5 -#define EFI_AHCI_PORT_IS_PCS BIT6 -#define EFI_AHCI_PORT_IS_DIS BIT7 -#define EFI_AHCI_PORT_IS_PRCS BIT22 -#define EFI_AHCI_PORT_IS_IPMS BIT23 -#define EFI_AHCI_PORT_IS_OFS BIT24 -#define EFI_AHCI_PORT_IS_INFS BIT26 -#define EFI_AHCI_PORT_IS_IFS BIT27 -#define EFI_AHCI_PORT_IS_HBDS BIT28 -#define EFI_AHCI_PORT_IS_HBFS BIT29 -#define EFI_AHCI_PORT_IS_TFES BIT30 -#define EFI_AHCI_PORT_IS_CPDS BIT31 -#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF -#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F - -#define EFI_AHCI_PORT_OFFSET(PortNum) \ - (EFI_AHCI_PORT_START + ((PortNum) * EFI_AHCI_PORT_REG_WIDTH)) - -#define EFI_AHCI_PORT_IE 0x0014 -#define EFI_AHCI_PORT_CMD 0x0018 -#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE -#define EFI_AHCI_PORT_CMD_ST BIT0 -#define EFI_AHCI_PORT_CMD_SUD BIT1 -#define EFI_AHCI_PORT_CMD_POD BIT2 -#define EFI_AHCI_PORT_CMD_CLO BIT3 -#define EFI_AHCI_PORT_CMD_CR BIT15 -#define EFI_AHCI_PORT_CMD_FRE BIT4 -#define EFI_AHCI_PORT_CMD_FR BIT14 -#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL) -#define EFI_AHCI_PORT_CMD_PMA BIT17 -#define EFI_AHCI_PORT_CMD_HPCP BIT18 -#define EFI_AHCI_PORT_CMD_MPSP BIT19 -#define EFI_AHCI_PORT_CMD_CPD BIT20 -#define EFI_AHCI_PORT_CMD_ESP BIT21 -#define EFI_AHCI_PORT_CMD_ATAPI BIT24 -#define EFI_AHCI_PORT_CMD_DLAE BIT25 -#define EFI_AHCI_PORT_CMD_ALPE BIT26 -#define EFI_AHCI_PORT_CMD_ASP BIT27 -#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) -#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 ) -#define EFI_AHCI_PORT_TFD 0x0020 -#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) -#define EFI_AHCI_PORT_TFD_BSY BIT7 -#define EFI_AHCI_PORT_TFD_DRQ BIT3 -#define EFI_AHCI_PORT_TFD_ERR BIT0 -#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00 -#define EFI_AHCI_PORT_SIG 0x0024 -#define EFI_AHCI_PORT_SSTS 0x0028 -#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F -#define EFI_AHCI_PORT_SSTS_DET 0x0001 -#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003 -#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0 -#define EFI_AHCI_PORT_SCTL 0x002C -#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F -#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK) -#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001 -#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003 -#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0 -#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00 -#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300 -#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100 -#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200 -#define EFI_AHCI_PORT_SERR 0x0030 -#define EFI_AHCI_PORT_SERR_RDIE BIT0 -#define EFI_AHCI_PORT_SERR_RCE BIT1 -#define EFI_AHCI_PORT_SERR_TDIE BIT8 -#define EFI_AHCI_PORT_SERR_PCDIE BIT9 -#define EFI_AHCI_PORT_SERR_PE BIT10 -#define EFI_AHCI_PORT_SERR_IE BIT11 -#define EFI_AHCI_PORT_SERR_PRC BIT16 -#define EFI_AHCI_PORT_SERR_PIE BIT17 -#define EFI_AHCI_PORT_SERR_CW BIT18 -#define EFI_AHCI_PORT_SERR_BDE BIT19 -#define EFI_AHCI_PORT_SERR_DE BIT20 -#define EFI_AHCI_PORT_SERR_CRCE BIT21 -#define EFI_AHCI_PORT_SERR_HE BIT22 -#define EFI_AHCI_PORT_SERR_LSE BIT23 -#define EFI_AHCI_PORT_SERR_TSTE BIT24 -#define EFI_AHCI_PORT_SERR_UFT BIT25 -#define EFI_AHCI_PORT_SERR_EX BIT26 -#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF -#define EFI_AHCI_PORT_SACT 0x0034 -#define EFI_AHCI_PORT_CI 0x0038 -#define EFI_AHCI_PORT_SNTF 0x003C - -#endif
On Tue, Nov 01, 2016 at 05:25:15PM +0000, Ard Biesheuvel wrote:
This driver is no longer used, so remove it.
Contributed-under: TianoCore Contribution Agreement 1.0 Signed-off-by: Ard Biesheuvel ard.biesheuvel@linaro.org
Reviewed-by: Leif Lindholm leif.lindholm@linaro.org
Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c | 178 ---- Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c | 172 ---- Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c | 442 --------- Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h | 289 ------ Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c | 307 ------ Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c | 1027 -------------------- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h | 555 ----------- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf | 85 -- Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h | 180 ---- 9 files changed, 3235 deletions(-)
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c deleted file mode 100644 index 943daac37a73..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/ComponentName.c +++ /dev/null @@ -1,178 +0,0 @@ -/** @file
- UEFI Component Name(2) protocol implementation for Sata Controller driver.
- Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php.
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#include "SataController.h"
-// -/// EFI Component Name Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gSataControllerComponentName = {
- SataControllerComponentNameGetDriverName,
- SataControllerComponentNameGetControllerName,
- "eng"
-};
-// -/// EFI Component Name 2 Protocol -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gSataControllerComponentName2 = {
- (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) SataControllerComponentNameGetDriverName,
- (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) SataControllerComponentNameGetControllerName,
- "en"
-};
-// -/// Driver Name Strings -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSataControllerDriverNameTable[] = {
- {
- "eng;en",
- (CHAR16 *)L"Sata Controller Init Driver"
- },
- {
- NULL,
- NULL
- }
-};
-/// -/// Controller Name Strings -/// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mSataControllerControllerNameTable[] = {
- {
- "eng;en",
- (CHAR16 *)L"Sata Controller"
- },
- {
- NULL,
- NULL
- }
-};
-/**
- Retrieves a Unicode string that is the user readable name of the UEFI Driver.
- @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
- @param Language A pointer to a three character ISO 639-2 language identifier.
This is the language of the driver name that that the caller
is requesting, and it must match one of the languages specified
in SupportedLanguages. The number of languages supported by a
driver is up to the driver writer.
- @param DriverName A pointer to the Unicode string to return. This Unicode string
is the name of the driver specified by This in the language
specified by Language.
- @retval EFI_SUCCESS The Unicode string for the Driver specified by This
and the language specified by Language was returned
in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
-**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-{
- return LookupUnicodeString2 (
Language,
This->SupportedLanguages,
mSataControllerDriverNameTable,
DriverName,
(BOOLEAN)(This == &gSataControllerComponentName)
);
-}
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by an UEFI Driver.
- @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
- @param ControllerHandle The handle of a controller that the driver specified by
This is managing. This handle specifies the controller
whose name is to be returned.
- @param ChildHandle OPTIONAL The handle of the child controller to retrieve the name
of. This is an optional parameter that may be NULL. It
will be NULL for device drivers. It will also be NULL
for a bus drivers that wish to retrieve the name of the
bus controller. It will not be NULL for a bus driver
that wishes to retrieve the name of a child controller.
- @param Language A pointer to a three character ISO 639-2 language
identifier. This is the language of the controller name
that that the caller is requesting, and it must match one
of the languages specified in SupportedLanguages. The
number of languages supported by a driver is up to the
driver writer.
- @param ControllerName A pointer to the Unicode string to return. This Unicode
string is the name of the controller specified by
ControllerHandle and ChildHandle in the language
specified by Language from the point of view of the
driver specified by This.
- @retval EFI_SUCCESS The Unicode string for the user readable name in the
language specified by Language for the driver
specified by This was returned in DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
managing the controller specified by
ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
-**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-{
- EFI_STATUS Status;
- //
- // Make sure this driver is currently managing ControllHandle
- //
- Status = EfiTestManagedDevice (
ControllerHandle,
gSataControllerDriverBinding.DriverBindingHandle,
&gEfiPciIoProtocolGuid
);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- if (ChildHandle != NULL) {
- return EFI_UNSUPPORTED;
- }
- return LookupUnicodeString2 (
Language,
This->SupportedLanguages,
mSataControllerControllerNameTable,
ControllerName,
(BOOLEAN)(This == &gSataControllerComponentName)
);
-} diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c deleted file mode 100644 index f605bf7fd168..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/InitController.c +++ /dev/null @@ -1,172 +0,0 @@ -/** @file
- Initialize SATA Phy, Serdes, and Controller.
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials are licensed and made available
- under the terms and conditions of the BSD License which accompanies this
- distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#include "SataController.h" -#include <Library/IoLib.h> -#include "SataRegisters.h" -#include "PciEmulation.h" -#include <Library/AmdSataInitLib.h>
-VOID -ResetSataController (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- )
-{
- UINT32 RegVal;
- // Make a minimal global reset for HBA regiser
- RegVal = MmioRead32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET);
- RegVal |= EFI_AHCI_GHC_RESET;
- MmioWrite32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET, RegVal);
- // Clear all interrupts
- MmioWrite32(AhciBaseAddr + EFI_AHCI_PORT_IS, EFI_AHCI_PORT_IS_CLEAR);
- // Turn on interrupts and ensure that the HBA is working in AHCI mode
- RegVal = MmioRead32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET);
- RegVal |= EFI_AHCI_GHC_IE | EFI_AHCI_GHC_ENABLE;
- MmioWrite32(AhciBaseAddr + EFI_AHCI_GHC_OFFSET, RegVal);
-}
-VOID -SetSataCapabilities (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- )
-{
- UINT32 Capability;
- Capability = MmioRead32(AhciBaseAddr + EFI_AHCI_CAPABILITY_OFFSET);
- if (PcdGetBool(PcdSataSssSupport)) // Staggered Spin-Up Support bit
- Capability |= EFI_AHCI_CAP_SSS;
- if (PcdGetBool(PcdSataSmpsSupport)) // Mechanical Presence Support bit
- Capability |= EFI_AHCI_CAP_SMPS;
- MmioWrite32(AhciBaseAddr + EFI_AHCI_CAPABILITY_OFFSET, Capability);
-}
-VOID -InitializeSataPorts (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- )
-{
- INTN PortNum;
- UINT32 SataPi;
- BOOLEAN IsPortImplemented;
- BOOLEAN IsCpd;
- BOOLEAN IsMpsp;
- UINT32 PortRegAddr;
- UINT32 RegVal;
- // Set Ports Implemented (PI)
- SataPi = PcdGet32(PcdSataPi);
- MmioWrite32(AhciBaseAddr + EFI_AHCI_PI_OFFSET, SataPi);
- IsCpd = PcdGetBool(PcdSataPortCpd);
- IsMpsp = PcdGetBool(PcdSataPortMpsp);
- for (PortNum = 0; PortNum < EFI_AHCI_MAX_PORTS; PortNum++) {
- IsPortImplemented = (SataPi & (1 << PortNum)) ? 1 : 0;
- if (IsPortImplemented && (IsCpd || IsMpsp)) {
PortRegAddr = EFI_AHCI_PORT_OFFSET(PortNum) + EFI_AHCI_PORT_CMD;
RegVal = MmioRead32(AhciBaseAddr + PortRegAddr);
if (IsCpd)
RegVal |= EFI_AHCI_PORT_CMD_CPD;
else
RegVal &= ~EFI_AHCI_PORT_CMD_CPD;
if (IsMpsp)
RegVal |= EFI_AHCI_PORT_CMD_MPSP;
else
RegVal &= ~EFI_AHCI_PORT_CMD_MPSP;
RegVal |= EFI_AHCI_PORT_CMD_HPCP;
MmioWrite32(AhciBaseAddr + PortRegAddr, RegVal);
- }
- }
-}
-EFI_STATUS -InitializeSataController (
- VOID
- )
-{
- EFI_PHYSICAL_ADDRESS AhciBaseAddr;
- UINT8 SataPortCount;
- UINT8 SataChPerSerdes;
- UINT32 StartPort;
- UINT32 PortNum;
- UINT32 EvenPort;
- UINT32 OddPort;
- EFI_STATUS Status;
-#ifdef BUILD_FOR_SATA1
- AhciBaseAddr = PcdGet32(PcdSata1CtrlAxiSlvPort);
- SataPortCount = PcdGet8(PcdSata1PortCount);
- StartPort = PcdGet8(PcdSataPortCount);
-#else
- AhciBaseAddr = PcdGet32(PcdSataCtrlAxiSlvPort);
- SataPortCount = PcdGet8(PcdSataPortCount);
- StartPort = 0;
-#endif
- SataChPerSerdes = PcdGet8(PcdSataNumChPerSerdes);
- //
- // Perform SATA workarounds
- //
- for (PortNum = 0; PortNum < SataPortCount; PortNum++) {
-#ifdef BUILD_FOR_SATA1
SetCwMinSata1(PortNum);
-#else
SetCwMinSata0(PortNum);
-#endif
- }
- for (PortNum = 0; PortNum < SataPortCount; PortNum += SataChPerSerdes) {
EvenPort = (UINT32)(PcdGet16(PcdSataPortMode) >> (PortNum * 2)) & 3;
OddPort = (UINT32)(PcdGet16(PcdSataPortMode) >> ((PortNum+1) * 2)) & 3;
SataPhyInit((StartPort + PortNum)/SataChPerSerdes, EvenPort, OddPort);
- }
- for (PortNum = 0; PortNum < SataPortCount; PortNum++) {
-#ifdef BUILD_FOR_SATA1
SetPrdSingleSata1(PortNum);
-#else
SetPrdSingleSata0(PortNum);
-#endif
- }
- //
- // Reset SATA controller
- //
- ResetSataController(AhciBaseAddr);
- //
- // Set SATA capabilities
- //
- SetSataCapabilities(AhciBaseAddr);
- //
- // Set and intialize the Sata ports
- //
- InitializeSataPorts(AhciBaseAddr);
- //
- // Emulate a PCI configuration for this device
- //
- Status = PciEmulationEntryPoint(AhciBaseAddr);
- ASSERT_EFI_ERROR (Status);
- return EFI_SUCCESS;
-}
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c deleted file mode 100644 index 137a4862226a..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.c +++ /dev/null @@ -1,442 +0,0 @@ -/** @file
- Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#include "PciEmulation.h" -#include "SataRegisters.h"
-typedef struct {
- ACPI_HID_DEVICE_PATH AcpiDevicePath;
- PCI_DEVICE_PATH PciDevicePath;
- EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
-} EFI_PCI_IO_DEVICE_PATH;
-typedef struct {
- UINT32 Signature;
- EFI_PCI_IO_DEVICE_PATH DevicePath;
- EFI_PCI_IO_PROTOCOL PciIoProtocol;
- PCI_TYPE00 *ConfigSpace;
- PCI_ROOT_BRIDGE RootBridge;
- UINTN Segment;
-} EFI_PCI_IO_PRIVATE_DATA;
-#define EFI_PCI_IO_PRIVATE_DATA_SIGNATURE SIGNATURE_32('p', 'c', 'i', 'o') -#define EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(a) CR (a, EFI_PCI_IO_PRIVATE_DATA, PciIoProtocol, EFI_PCI_IO_PRIVATE_DATA_SIGNATURE)
-EFI_PCI_IO_DEVICE_PATH PciIoDevicePathTemplate = -{
- {
- { ACPI_DEVICE_PATH, ACPI_DP, { sizeof (ACPI_HID_DEVICE_PATH), 0 } },
- EISA_PNP_ID(0x0A03), // HID
- 0 // UID
- },
- {
- { HARDWARE_DEVICE_PATH, HW_PCI_DP, { sizeof (PCI_DEVICE_PATH), 0 } },
- 0,
- 0
- },
- { END_DEVICE_PATH_TYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE, { sizeof (EFI_DEVICE_PATH_PROTOCOL), 0} }
-};
-EFI_STATUS -PciIoPollMem (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 BarIndex,
- IN UINT64 Offset,
- IN UINT64 Mask,
- IN UINT64 Value,
- IN UINT64 Delay,
- OUT UINT64 *Result
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_STATUS -PciIoPollIo (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 BarIndex,
- IN UINT64 Offset,
- IN UINT64 Mask,
- IN UINT64 Value,
- IN UINT64 Delay,
- OUT UINT64 *Result
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_STATUS -PciIoMemRead (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 BarIndex,
- IN UINT64 Offset,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);
- return PciRootBridgeIoMemRead (&Private->RootBridge.Io,
(EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,
Private->ConfigSpace->Device.Bar[BarIndex] + Offset,
Count,
Buffer
);
-}
-EFI_STATUS -PciIoMemWrite (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 BarIndex,
- IN UINT64 Offset,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);
- return PciRootBridgeIoMemWrite (&Private->RootBridge.Io,
(EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,
Private->ConfigSpace->Device.Bar[BarIndex] + Offset,
Count,
Buffer
);
-}
-EFI_STATUS -PciIoIoRead (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 BarIndex,
- IN UINT64 Offset,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_STATUS -PciIoIoWrite (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 BarIndex,
- IN UINT64 Offset,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_STATUS -PciIoPciRead (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT32 Offset,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);
- return PciRootBridgeIoMemRW ((EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH)Width,
Count,
TRUE,
(PTR)(UINTN)Buffer,
TRUE,
(PTR)(UINTN)(((UINT8 *)Private->ConfigSpace) + Offset)
);
-}
-EFI_STATUS -PciIoPciWrite (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT32 Offset,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);
- return PciRootBridgeIoMemRW ((EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) Width,
Count,
TRUE,
(PTR)(UINTN)(((UINT8 *)Private->ConfigSpace) + Offset),
TRUE,
(PTR)(UINTN)Buffer
);
-}
-EFI_STATUS -PciIoCopyMem (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_WIDTH Width,
- IN UINT8 DestBarIndex,
- IN UINT64 DestOffset,
- IN UINT8 SrcBarIndex,
- IN UINT64 SrcOffset,
- IN UINTN Count
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_STATUS -PciIoMap (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_OPERATION Operation,
- IN VOID *HostAddress,
- IN OUT UINTN *NumberOfBytes,
- OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
- OUT VOID **Mapping
- )
-{
- *DeviceAddress = (EFI_PHYSICAL_ADDRESS) HostAddress;
- return EFI_SUCCESS;
-}
-EFI_STATUS -PciIoUnmap (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN VOID *Mapping
- )
-{
- return EFI_SUCCESS;
-}
-EFI_STATUS -PciIoAllocateBuffer (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_ALLOCATE_TYPE Type,
- IN EFI_MEMORY_TYPE MemoryType,
- IN UINTN Pages,
- OUT VOID **HostAddress,
- IN UINT64 Attributes
- )
-{
- EFI_PHYSICAL_ADDRESS Memory;
- EFI_STATUS Status;
- if (Attributes & EFI_PCI_ATTRIBUTE_INVALID_FOR_ALLOCATE_BUFFER) {
- // Check this
- return EFI_UNSUPPORTED;
- }
- Status = gBS->AllocatePages(AllocateAnyPages, MemoryType, Pages, &Memory);
- if (Status == EFI_SUCCESS)
- *HostAddress = (VOID *)Memory;
- return Status;
-}
-EFI_STATUS -PciIoFreeBuffer (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN UINTN Pages,
- IN VOID *HostAddress
- )
-{
- return gBS->FreePages((EFI_PHYSICAL_ADDRESS)HostAddress, Pages);
-}
-EFI_STATUS -PciIoFlush (
- IN EFI_PCI_IO_PROTOCOL *This
- )
-{
- return EFI_SUCCESS;
-}
-EFI_STATUS -PciIoGetLocation (
- IN EFI_PCI_IO_PROTOCOL *This,
- OUT UINTN *SegmentNumber,
- OUT UINTN *BusNumber,
- OUT UINTN *DeviceNumber,
- OUT UINTN *FunctionNumber
- )
-{
- EFI_PCI_IO_PRIVATE_DATA *Private = EFI_PCI_IO_PRIVATE_DATA_FROM_THIS(This);
- if (SegmentNumber != NULL) {
- *SegmentNumber = Private->Segment;
- }
- if (BusNumber != NULL) {
- *BusNumber = 0xff;
- }
- if (DeviceNumber != NULL) {
- *DeviceNumber = 0;
- }
- if (FunctionNumber != NULL) {
- *FunctionNumber = 0;
- }
- return EFI_SUCCESS;
-}
-EFI_STATUS -PciIoAttributes (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN EFI_PCI_IO_PROTOCOL_ATTRIBUTE_OPERATION Operation,
- IN UINT64 Attributes,
- OUT UINT64 *Result OPTIONAL
- )
-{
- switch (Operation) {
- case EfiPciIoAttributeOperationGet:
- case EfiPciIoAttributeOperationSupported:
- if (Result == NULL) {
return EFI_INVALID_PARAMETER;
- }
- // We are not a real PCI device so just say things we kind of do
- *Result = EFI_PCI_IO_ATTRIBUTE_MEMORY | EFI_PCI_IO_ATTRIBUTE_BUS_MASTER | EFI_PCI_DEVICE_ENABLE;
- break;
- case EfiPciIoAttributeOperationSet:
- case EfiPciIoAttributeOperationEnable:
- case EfiPciIoAttributeOperationDisable:
- // Since we are not a real PCI device no enable/set or disable operations exist.
- return EFI_SUCCESS;
- default:
- ASSERT (FALSE);
- return EFI_INVALID_PARAMETER;
- };
- return EFI_SUCCESS;
-}
-EFI_STATUS -PciIoGetBarAttributes (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN UINT8 BarIndex,
- OUT UINT64 *Supports, OPTIONAL
- OUT VOID **Resources OPTIONAL
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_STATUS -PciIoSetBarAttributes (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN UINT64 Attributes,
- IN UINT8 BarIndex,
- IN OUT UINT64 *Offset,
- IN OUT UINT64 *Length
- )
-{
- ASSERT (FALSE);
- return EFI_UNSUPPORTED;
-}
-EFI_PCI_IO_PROTOCOL PciIoTemplate = -{
- PciIoPollMem,
- PciIoPollIo,
- { PciIoMemRead, PciIoMemWrite },
- { PciIoIoRead, PciIoIoWrite },
- { PciIoPciRead, PciIoPciWrite },
- PciIoCopyMem,
- PciIoMap,
- PciIoUnmap,
- PciIoAllocateBuffer,
- PciIoFreeBuffer,
- PciIoFlush,
- PciIoGetLocation,
- PciIoAttributes,
- PciIoGetBarAttributes,
- PciIoSetBarAttributes,
- 0,
- 0
-};
-EFI_STATUS -PciEmulationEntryPoint (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- )
-{
- EFI_STATUS Status;
- EFI_HANDLE Handle;
- EFI_PCI_IO_PRIVATE_DATA *Private;
- // Create a private structure
- Private = AllocatePool(sizeof(EFI_PCI_IO_PRIVATE_DATA));
- if (Private == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- return Status;
- }
- Private->Signature = EFI_PCI_IO_PRIVATE_DATA_SIGNATURE; // Fill in signature
- Private->RootBridge.Signature = PCI_ROOT_BRIDGE_SIGNATURE; // Fake Root Bridge structure needs a signature too
- Private->RootBridge.MemoryStart = AhciBaseAddr; // Get the SATA capability register base
- Private->Segment = 0; // Default to segment zero
- // Total size of the SATA registers.
- Private->RootBridge.MemorySize = 1024;
- // Create fake PCI config space.
- Private->ConfigSpace = AllocateZeroPool(sizeof(PCI_TYPE00));
- if (Private->ConfigSpace == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- FreePool(Private);
- return Status;
- }
- // Configure PCI config space
- Private->ConfigSpace->Hdr.VendorId = 0x3530;
- Private->ConfigSpace->Hdr.DeviceId = 0x3530;
- Private->ConfigSpace->Hdr.ClassCode[0] = PCI_IF_APIC_CONTROLLER2;
- Private->ConfigSpace->Hdr.ClassCode[1] = PCI_CLASS_MASS_STORAGE_SATADPA;
- Private->ConfigSpace->Hdr.ClassCode[2] = PCI_CLASS_MASS_STORAGE;
- Private->ConfigSpace->Device.Bar[EFI_AHCI_BAR_INDEX] = Private->RootBridge.MemoryStart;
- Handle = NULL;
- // Unique device path.
- CopyMem(&Private->DevicePath, &PciIoDevicePathTemplate, sizeof(PciIoDevicePathTemplate));
- Private->DevicePath.AcpiDevicePath.UID = 1;
- // Copy protocol structure
- CopyMem(&Private->PciIoProtocol, &PciIoTemplate, sizeof(PciIoTemplate));
- Status = gBS->InstallMultipleProtocolInterfaces(&Handle,
&gEfiPciIoProtocolGuid, &Private->PciIoProtocol,
&gEfiDevicePathProtocolGuid, &Private->DevicePath,
NULL);
- if (EFI_ERROR(Status)) {
- DEBUG((EFI_D_ERROR, "PciEmulationEntryPoint InstallMultipleProtocolInterfaces() failed.\n"));
- }
- return Status;
-}
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h b/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h deleted file mode 100644 index 067aea21e33f..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciEmulation.h +++ /dev/null @@ -1,289 +0,0 @@ -/** @file
- Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#ifndef _PCI_ROOT_BRIDGE_H_ -#define _PCI_ROOT_BRIDGE_H_
-#include <PiDxe.h>
-#include <Library/BaseLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/DebugLib.h> -#include <Library/DxeServicesTableLib.h> -#include <Library/IoLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/PciLib.h> -#include <Library/UefiLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <Library/DmaLib.h>
-#include <Protocol/EmbeddedExternalDevice.h> -#include <Protocol/DevicePath.h> -#include <Protocol/PciIo.h> -#include <Protocol/PciRootBridgeIo.h> -#include <Protocol/PciHostBridgeResourceAllocation.h>
-#include <IndustryStandard/Pci22.h> -#include <IndustryStandard/Pci30.h> -#include <IndustryStandard/Acpi.h>
-#define EFI_RESOURCE_NONEXISTENT 0xFFFFFFFFFFFFFFFFULL -#define EFI_RESOURCE_LESS 0xFFFFFFFFFFFFFFFEULL -#define EFI_RESOURCE_SATISFIED 0x0000000000000000ULL
-typedef struct {
- ACPI_HID_DEVICE_PATH AcpiDevicePath;
- EFI_DEVICE_PATH_PROTOCOL EndDevicePath;
-} EFI_PCI_ROOT_BRIDGE_DEVICE_PATH;
-#define ACPI_CONFIG_IO 0 -#define ACPI_CONFIG_MMIO 1 -#define ACPI_CONFIG_BUS 2
-typedef struct {
- EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR Desc[3];
- EFI_ACPI_END_TAG_DESCRIPTOR EndDesc;
-} ACPI_CONFIG_INFO;
-#define PCI_ROOT_BRIDGE_SIGNATURE SIGNATURE_32 ('P', 'c', 'i', 'F')
-typedef struct {
- UINT32 Signature;
- EFI_HANDLE Handle;
- EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL Io;
- EFI_PCI_ROOT_BRIDGE_DEVICE_PATH DevicePath;
- UINT8 StartBus;
- UINT8 EndBus;
- UINT16 Type;
- UINT32 MemoryStart;
- UINT32 MemorySize;
- UINTN IoOffset;
- UINT32 IoStart;
- UINT32 IoSize;
- UINT64 PciAttributes;
- ACPI_CONFIG_INFO *Config;
-} PCI_ROOT_BRIDGE;
-#define INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS(a) CR (a, PCI_ROOT_BRIDGE, Io, PCI_ROOT_BRIDGE_SIGNATURE)
-typedef union {
- UINT8 volatile *buf;
- UINT8 volatile *ui8;
- UINT16 volatile *ui16;
- UINT32 volatile *ui32;
- UINT64 volatile *ui64;
- UINTN volatile ui;
-} PTR;
-EFI_STATUS -EFIAPI -PciRootBridgeIoPollMem (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINT64 Mask,
- IN UINT64 Value,
- IN UINT64 Delay,
- OUT UINT64 *Result
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoPollIo (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINT64 Mask,
- IN UINT64 Value,
- IN UINT64 Delay,
- OUT UINT64 *Result
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoMemRead (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoMemWrite (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoIoRead (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 UserAddress,
- IN UINTN Count,
- IN OUT VOID *UserBuffer
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoIoWrite (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 UserAddress,
- IN UINTN Count,
- IN OUT VOID *UserBuffer
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoCopyMem (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 DestAddress,
- IN UINT64 SrcAddress,
- IN UINTN Count
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoPciRead (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoPciWrite (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoMap (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_OPERATION Operation,
- IN VOID *HostAddress,
- IN OUT UINTN *NumberOfBytes,
- OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
- OUT VOID **Mapping
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoUnmap (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN VOID *Mapping
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoAllocateBuffer (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_ALLOCATE_TYPE Type,
- IN EFI_MEMORY_TYPE MemoryType,
- IN UINTN Pages,
- OUT VOID **HostAddress,
- IN UINT64 Attributes
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoFreeBuffer (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN UINTN Pages,
- OUT VOID *HostAddress
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoFlush (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoGetAttributes (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- OUT UINT64 *Supported,
- OUT UINT64 *Attributes
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoSetAttributes (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN UINT64 Attributes,
- IN OUT UINT64 *ResourceBase,
- IN OUT UINT64 *ResourceLength
- );
-EFI_STATUS -EFIAPI -PciRootBridgeIoConfiguration (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- OUT VOID **Resources
- );
-// -// Private Function Prototypes -// -EFI_STATUS -EFIAPI -PciRootBridgeIoMemRW (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINTN Count,
- IN BOOLEAN InStrideFlag,
- IN PTR In,
- IN BOOLEAN OutStrideFlag,
- OUT PTR Out
- );
-BOOLEAN -PciIoMemAddressValid (
- IN EFI_PCI_IO_PROTOCOL *This,
- IN UINT64 Address
- );
-EFI_STATUS -PciEmulationEntryPoint (
- EFI_PHYSICAL_ADDRESS AhciBaseAddr
- );
-#endif
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c deleted file mode 100644 index 9fcb402bc326..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/PciRootBridgeIo.c +++ /dev/null @@ -1,307 +0,0 @@ -/** @file
- Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#include "PciEmulation.h"
-BOOLEAN -PciRootBridgeMemAddressValid (
- IN PCI_ROOT_BRIDGE *Private,
- IN UINT64 Address
- )
-{
- if ((Address >= Private->MemoryStart) && (Address < (Private->MemoryStart + Private->MemorySize))) {
- return TRUE;
- }
- return FALSE;
-}
-EFI_STATUS -PciRootBridgeIoMemRW (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINTN Count,
- IN BOOLEAN InStrideFlag,
- IN PTR In,
- IN BOOLEAN OutStrideFlag,
- OUT PTR Out
- )
-{
- UINTN Stride;
- UINTN InStride;
- UINTN OutStride;
- Width = (EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH) (Width & 0x03);
- Stride = (UINTN)1 << Width;
- InStride = InStrideFlag ? Stride : 0;
- OutStride = OutStrideFlag ? Stride : 0;
- //
- // Loop for each iteration and move the data
- //
- switch (Width) {
- case EfiPciWidthUint8:
- for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) {
*In.ui8 = *Out.ui8;
- }
- break;
- case EfiPciWidthUint16:
- for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) {
*In.ui16 = *Out.ui16;
- }
- break;
- case EfiPciWidthUint32:
- for (;Count > 0; Count--, In.buf += InStride, Out.buf += OutStride) {
*In.ui32 = *Out.ui32;
- }
- break;
- default:
- return EFI_INVALID_PARAMETER;
- }
- return EFI_SUCCESS;
-}
-EFI_STATUS -PciRootBridgeIoPciRW (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN BOOLEAN Write,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 UserAddress,
- IN UINTN Count,
- IN OUT VOID *UserBuffer
- )
-{
- return EFI_SUCCESS;
-}
-/**
- Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.
- @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
- @param Width Signifies the width of the memory operations.
- @param Address The base address of the memory operations.
- @param Count The number of memory operations to perform.
- @param Buffer For read operations, the destination buffer to store the results. For write
operations, the source buffer to write data from.
- @retval EFI_SUCCESS The data was read from or written to the PCI root bridge.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoMemRead (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- PCI_ROOT_BRIDGE *Private;
- UINTN AlignMask;
- PTR In;
- PTR Out;
- if ( Buffer == NULL ) {
- return EFI_INVALID_PARAMETER;
- }
- Private = INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS (This);
- if (!PciRootBridgeMemAddressValid (Private, Address)) {
- return EFI_INVALID_PARAMETER;
- }
- AlignMask = (1 << (Width & 0x03)) - 1;
- if (Address & AlignMask) {
- return EFI_INVALID_PARAMETER;
- }
- In.buf = Buffer;
- Out.buf = (VOID *)(UINTN) Address;
- switch (Width) {
- case EfiPciWidthUint8:
- case EfiPciWidthUint16:
- case EfiPciWidthUint32:
- case EfiPciWidthUint64:
- return PciRootBridgeIoMemRW (Width, Count, TRUE, In, TRUE, Out);
- case EfiPciWidthFifoUint8:
- case EfiPciWidthFifoUint16:
- case EfiPciWidthFifoUint32:
- case EfiPciWidthFifoUint64:
- return PciRootBridgeIoMemRW (Width, Count, TRUE, In, FALSE, Out);
- case EfiPciWidthFillUint8:
- case EfiPciWidthFillUint16:
- case EfiPciWidthFillUint32:
- case EfiPciWidthFillUint64:
- return PciRootBridgeIoMemRW (Width, Count, FALSE, In, TRUE, Out);
- default:
- break;
- }
- return EFI_INVALID_PARAMETER;
-}
-/**
- Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.
- @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
- @param Width Signifies the width of the memory operations.
- @param Address The base address of the memory operations.
- @param Count The number of memory operations to perform.
- @param Buffer For read operations, the destination buffer to store the results. For write
operations, the source buffer to write data from.
- @retval EFI_SUCCESS The data was read from or written to the PCI root bridge.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoMemWrite (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- PCI_ROOT_BRIDGE *Private;
- UINTN AlignMask;
- PTR In;
- PTR Out;
- if ( Buffer == NULL ) {
- return EFI_INVALID_PARAMETER;
- }
- Private = INSTANCE_FROM_PCI_ROOT_BRIDGE_IO_THIS (This);
- if (!PciRootBridgeMemAddressValid (Private, Address)) {
- return EFI_INVALID_PARAMETER;
- }
- AlignMask = (1 << (Width & 0x03)) - 1;
- if (Address & AlignMask) {
- return EFI_INVALID_PARAMETER;
- }
- In.buf = (VOID *)(UINTN) Address;
- Out.buf = Buffer;
- switch (Width) {
- case EfiPciWidthUint8:
- case EfiPciWidthUint16:
- case EfiPciWidthUint32:
- case EfiPciWidthUint64:
- return PciRootBridgeIoMemRW (Width, Count, TRUE, In, TRUE, Out);
- case EfiPciWidthFifoUint8:
- case EfiPciWidthFifoUint16:
- case EfiPciWidthFifoUint32:
- case EfiPciWidthFifoUint64:
- return PciRootBridgeIoMemRW (Width, Count, FALSE, In, TRUE, Out);
- case EfiPciWidthFillUint8:
- case EfiPciWidthFillUint16:
- case EfiPciWidthFillUint32:
- case EfiPciWidthFillUint64:
- return PciRootBridgeIoMemRW (Width, Count, TRUE, In, FALSE, Out);
- default:
- break;
- }
- return EFI_INVALID_PARAMETER;
-}
-/**
- Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.
- @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
- @param Width Signifies the width of the memory operations.
- @param Address The base address of the memory operations.
- @param Count The number of memory operations to perform.
- @param Buffer For read operations, the destination buffer to store the results. For write
operations, the source buffer to write data from.
- @retval EFI_SUCCESS The data was read from or written to the PCI root bridge.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoPciRead (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- if (Buffer == NULL) {
- return EFI_INVALID_PARAMETER;
- }
- return PciRootBridgeIoPciRW (This, FALSE, Width, Address, Count, Buffer);
-}
-/**
- Enables a PCI driver to access PCI controller registers in the PCI root bridge memory space.
- @param This A pointer to the EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL.
- @param Width Signifies the width of the memory operations.
- @param Address The base address of the memory operations.
- @param Count The number of memory operations to perform.
- @param Buffer For read operations, the destination buffer to store the results. For write
operations, the source buffer to write data from.
- @retval EFI_SUCCESS The data was read from or written to the PCI root bridge.
- @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources.
- @retval EFI_INVALID_PARAMETER One or more parameters are invalid.
-**/ -EFI_STATUS -EFIAPI -PciRootBridgeIoPciWrite (
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *This,
- IN EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL_WIDTH Width,
- IN UINT64 Address,
- IN UINTN Count,
- IN OUT VOID *Buffer
- )
-{
- if (Buffer == NULL) {
- return EFI_INVALID_PARAMETER;
- }
- return PciRootBridgeIoPciRW (This, TRUE, Width, Address, Count, Buffer);
-}
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c deleted file mode 100644 index 93d940cff055..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.c +++ /dev/null @@ -1,1027 +0,0 @@ -/** @file
- This driver module produces IDE_CONTROLLER_INIT protocol for Sata Controllers.
- Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#include "SataController.h"
-/// -/// EFI_DRIVER_BINDING_PROTOCOL instance -/// -EFI_DRIVER_BINDING_PROTOCOL gSataControllerDriverBinding = {
- SataControllerSupported,
- SataControllerStart,
- SataControllerStop,
- 0xa,
- NULL,
- NULL
-};
-/**
- Read AHCI Operation register.
- @param PciIo The PCI IO protocol instance.
- @param Offset The operation register offset.
- @return The register content read.
-**/ -UINT32 -EFIAPI -AhciReadReg (
- IN EFI_PCI_IO_PROTOCOL *PciIo,
- IN UINT32 Offset
- )
-{
- UINT32 Data;
- ASSERT (PciIo != NULL);
- Data = 0;
- PciIo->Mem.Read (
PciIo,
EfiPciIoWidthUint32,
AHCI_BAR_INDEX,
(UINT64) Offset,
1,
&Data
);
- return Data;
-}
-/**
- Write AHCI Operation register.
- @param PciIo The PCI IO protocol instance.
- @param Offset The operation register offset.
- @param Data The data used to write down.
-**/ -VOID -EFIAPI -AhciWriteReg (
- IN EFI_PCI_IO_PROTOCOL *PciIo,
- IN UINT32 Offset,
- IN UINT32 Data
- )
-{
- ASSERT (PciIo != NULL);
- PciIo->Mem.Write (
PciIo,
EfiPciIoWidthUint32,
AHCI_BAR_INDEX,
(UINT64) Offset,
1,
&Data
);
- return;
-}
-/**
- This function is used to calculate the best PIO mode supported by specific IDE device
- @param IdentifyData The identify data of specific IDE device.
- @param DisPioMode Disqualified PIO modes collection.
- @param SelectedMode Available PIO modes collection.
- @retval EFI_SUCCESS Best PIO modes are returned.
- @retval EFI_UNSUPPORTED The device doesn't support PIO mode,
or all supported modes have been disqualified.
-**/ -EFI_STATUS -CalculateBestPioMode (
- IN EFI_IDENTIFY_DATA *IdentifyData,
- IN UINT16 *DisPioMode OPTIONAL,
- OUT UINT16 *SelectedMode
- )
-{
- UINT16 PioMode;
- UINT16 AdvancedPioMode;
- UINT16 Temp;
- UINT16 Index;
- UINT16 MinimumPioCycleTime;
- Temp = 0xff;
-DEBUG ((EFI_D_INFO, "CalculateBestPioMode()\n"));
- PioMode = (UINT8) (((ATA5_IDENTIFY_DATA *) (&(IdentifyData->AtaData)))->pio_cycle_timing >> 8);
- //
- // See whether Identify Data word 64 - 70 are valid
- //
- if ((IdentifyData->AtaData.field_validity & 0x02) == 0x02) {
- AdvancedPioMode = IdentifyData->AtaData.advanced_pio_modes;
- DEBUG ((EFI_D_INFO, "CalculateBestPioMode: AdvancedPioMode = %x\n", AdvancedPioMode));
- for (Index = 0; Index < 8; Index++) {
if ((AdvancedPioMode & 0x01) != 0) {
Temp = Index;
}
AdvancedPioMode >>= 1;
- }
- //
- // If Temp is modified, mean the advanced_pio_modes is not zero;
- // if Temp is not modified, mean there is no advanced PIO mode supported,
- // the best PIO Mode is the value in pio_cycle_timing.
- //
- if (Temp != 0xff) {
AdvancedPioMode = (UINT16) (Temp + 3);
- } else {
AdvancedPioMode = PioMode;
- }
- //
- // Limit the PIO mode to at most PIO4.
- //
- PioMode = (UINT16) MIN (AdvancedPioMode, 4);
- MinimumPioCycleTime = IdentifyData->AtaData.min_pio_cycle_time_with_flow_control;
- if (MinimumPioCycleTime <= 120) {
PioMode = (UINT16) MIN (4, PioMode);
- } else if (MinimumPioCycleTime <= 180) {
PioMode = (UINT16) MIN (3, PioMode);
- } else if (MinimumPioCycleTime <= 240) {
PioMode = (UINT16) MIN (2, PioMode);
- } else {
PioMode = 0;
- }
- //
- // Degrade the PIO mode if the mode has been disqualified
- //
- if (DisPioMode != NULL) {
if (*DisPioMode < 2) {
return EFI_UNSUPPORTED; // no mode below ATA_PIO_MODE_BELOW_2
}
if (PioMode >= *DisPioMode) {
PioMode = (UINT16) (*DisPioMode - 1);
}
- }
- if (PioMode < 2) {
*SelectedMode = 1; // ATA_PIO_MODE_BELOW_2;
- } else {
*SelectedMode = PioMode; // ATA_PIO_MODE_2 to ATA_PIO_MODE_4;
- }
- } else {
- //
- // Identify Data word 64 - 70 are not valid
- // Degrade the PIO mode if the mode has been disqualified
- //
- if (DisPioMode != NULL) {
if (*DisPioMode < 2) {
return EFI_UNSUPPORTED; // no mode below ATA_PIO_MODE_BELOW_2
}
if (PioMode == *DisPioMode) {
PioMode--;
}
- }
- if (PioMode < 2) {
*SelectedMode = 1; // ATA_PIO_MODE_BELOW_2;
- } else {
*SelectedMode = 2; // ATA_PIO_MODE_2;
- }
- }
- return EFI_SUCCESS;
-}
-/**
- This function is used to calculate the best UDMA mode supported by specific IDE device
- @param IdentifyData The identify data of specific IDE device.
- @param DisUDmaMode Disqualified UDMA modes collection.
- @param SelectedMode Available UDMA modes collection.
- @retval EFI_SUCCESS Best UDMA modes are returned.
- @retval EFI_UNSUPPORTED The device doesn't support UDMA mode,
or all supported modes have been disqualified.
-**/ -EFI_STATUS -CalculateBestUdmaMode (
- IN EFI_IDENTIFY_DATA *IdentifyData,
- IN UINT16 *DisUDmaMode OPTIONAL,
- OUT UINT16 *SelectedMode
- )
-{
- UINT16 TempMode;
- UINT16 DeviceUDmaMode;
- DeviceUDmaMode = 0;
-DEBUG ((EFI_D_INFO, "CalculateBestUdmaMode()\n"));
- //
- // Check whether the WORD 88 (supported UltraDMA by drive) is valid
- //
- if ((IdentifyData->AtaData.field_validity & 0x04) == 0x00) {
- return EFI_UNSUPPORTED;
- }
- DeviceUDmaMode = IdentifyData->AtaData.ultra_dma_mode;
- DEBUG ((EFI_D_INFO, "CalculateBestUdmaMode: DeviceUDmaMode = %x\n", DeviceUDmaMode));
- DeviceUDmaMode &= 0x3f;
- TempMode = 0; // initialize it to UDMA-0
- while ((DeviceUDmaMode >>= 1) != 0) {
- TempMode++;
- }
- //
- // Degrade the UDMA mode if the mode has been disqualified
- //
- if (DisUDmaMode != NULL) {
- if (*DisUDmaMode == 0) {
*SelectedMode = 0;
return EFI_UNSUPPORTED; // no mode below ATA_UDMA_MODE_0
- }
- if (TempMode >= *DisUDmaMode) {
TempMode = (UINT16) (*DisUDmaMode - 1);
- }
- }
- //
- // Possible returned mode is between ATA_UDMA_MODE_0 and ATA_UDMA_MODE_5
- //
- *SelectedMode = TempMode;
- return EFI_SUCCESS;
-}
-/**
- The Entry Point of module. It follows the standard UEFI driver model.
- @param[in] ImageHandle The firmware allocated handle for the EFI image.
- @param[in] SystemTable A pointer to the EFI System Table.
- @retval EFI_SUCCESS The entry point is executed successfully.
- @retval other Some error occurs when executing this entry point.
-**/ -EFI_STATUS -EFIAPI -InitializeSataControllerDriver (
- IN EFI_HANDLE ImageHandle,
- IN EFI_SYSTEM_TABLE *SystemTable
- )
-{
- EFI_STATUS Status;
-DEBUG ((EFI_D_INFO, "InitializeSataControllerDriver()\n"));
- //
- // Initialize the SATA controller
- //
- Status = InitializeSataController();
- ASSERT_EFI_ERROR (Status);
- //
- // Install driver model protocol(s).
- //
- Status = EfiLibInstallDriverBindingComponentName2 (
ImageHandle,
SystemTable,
&gSataControllerDriverBinding,
ImageHandle,
&gSataControllerComponentName,
&gSataControllerComponentName2
);
- ASSERT_EFI_ERROR (Status);
- return Status;
-}
-/**
- Supported function of Driver Binding protocol for this driver.
- Test to see if this driver supports ControllerHandle.
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath A pointer to the device path.
it should be ignored by device driver.
- @retval EFI_SUCCESS This driver supports this device.
- @retval EFI_ALREADY_STARTED This driver is already running on this device.
- @retval other This driver does not support this device.
-**/ -EFI_STATUS -EFIAPI -SataControllerSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_STATUS Status;
- EFI_PCI_IO_PROTOCOL *PciIo;
- PCI_TYPE00 PciData;
-//DEBUG ((EFI_D_INFO, "SataControllerSupported()\n"));
- //
- // Attempt to open PCI I/O Protocol
- //
- Status = gBS->OpenProtocol (
Controller,
&gEfiPciIoProtocolGuid,
(VOID **) &PciIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- //
- // Now further check the PCI header: Base Class (offset 0x0B) and
- // Sub Class (offset 0x0A). This controller should be an SATA controller
- //
- Status = PciIo->Pci.Read (
PciIo,
EfiPciIoWidthUint8,
PCI_CLASSCODE_OFFSET,
sizeof (PciData.Hdr.ClassCode),
PciData.Hdr.ClassCode
);
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
- if (IS_PCI_IDE (&PciData) || IS_PCI_SATADPA (&PciData)) {
- return EFI_SUCCESS;
- }
- return EFI_UNSUPPORTED;
-}
-/**
- This routine is called right after the .Supported() called and
- Start this driver on ControllerHandle.
- @param This Protocol instance pointer.
- @param Controller Handle of device to bind driver to.
- @param RemainingDevicePath A pointer to the device path.
it should be ignored by device driver.
- @retval EFI_SUCCESS This driver is added to this device.
- @retval EFI_ALREADY_STARTED This driver is already running on this device.
- @retval other Some error occurs when binding this driver to this device.
-**/ -EFI_STATUS -EFIAPI -SataControllerStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-{
- EFI_STATUS Status;
- EFI_PCI_IO_PROTOCOL *PciIo;
- PCI_TYPE00 PciData;
- EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;
- UINT32 Data32;
- UINTN ChannelDeviceCount;
- DEBUG ((EFI_D_INFO, "SataControllerStart START\n"));
- SataPrivateData = NULL;
- //
- // Now test and open PCI I/O Protocol
- //
- Status = gBS->OpenProtocol (
Controller,
&gEfiPciIoProtocolGuid,
(VOID **) &PciIo,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
- if (EFI_ERROR (Status)) {
- DEBUG ((EFI_D_ERROR, "SataControllerStart error return status = %r\n", Status));
- return Status;
- }
- //
- // Allocate Sata Private Data structure
- //
- SataPrivateData = AllocateZeroPool (sizeof (EFI_SATA_CONTROLLER_PRIVATE_DATA));
- if (SataPrivateData == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Done;
- }
- //
- // Initialize Sata Private Data
- //
- SataPrivateData->Signature = SATA_CONTROLLER_SIGNATURE;
- SataPrivateData->PciIo = PciIo;
- SataPrivateData->IdeInit.GetChannelInfo = IdeInitGetChannelInfo;
- SataPrivateData->IdeInit.NotifyPhase = IdeInitNotifyPhase;
- SataPrivateData->IdeInit.SubmitData = IdeInitSubmitData;
- SataPrivateData->IdeInit.DisqualifyMode = IdeInitDisqualifyMode;
- SataPrivateData->IdeInit.CalculateMode = IdeInitCalculateMode;
- SataPrivateData->IdeInit.SetTiming = IdeInitSetTiming;
- SataPrivateData->IdeInit.EnumAll = SATA_ENUMER_ALL;
- Status = PciIo->Pci.Read (
PciIo,
EfiPciIoWidthUint8,
PCI_CLASSCODE_OFFSET,
sizeof (PciData.Hdr.ClassCode),
PciData.Hdr.ClassCode
);
- ASSERT_EFI_ERROR (Status);
- if (IS_PCI_IDE (&PciData)) {
- SataPrivateData->IdeInit.ChannelCount = IDE_MAX_CHANNEL;
- SataPrivateData->DeviceCount = IDE_MAX_DEVICES;
- } else if (IS_PCI_SATADPA (&PciData)) {
- //
- // Read Host Capability Register(CAP) to get Number of Ports(NPS) and Supports Port Multiplier(SPM)
- // NPS is 0's based value indicating the maximum number of ports supported by the HBA silicon.
- // A maximum of 32 ports can be supported. A value of '0h', indicating one port, is the minimum requirement.
- //
- Data32 = AhciReadReg (PciIo, R_AHCI_CAP);
- SataPrivateData->IdeInit.ChannelCount = (UINT8) ((Data32 & B_AHCI_CAP_NPS) + 1);
- SataPrivateData->DeviceCount = AHCI_MAX_DEVICES;
- if ((Data32 & B_AHCI_CAP_SPM) == B_AHCI_CAP_SPM) {
SataPrivateData->DeviceCount = AHCI_MULTI_MAX_DEVICES;
- }
- }
- ChannelDeviceCount = (UINTN) (SataPrivateData->IdeInit.ChannelCount) * (UINTN) (SataPrivateData->DeviceCount);
- DEBUG ((EFI_D_INFO, "ChannelDeviceCount %d\n", ChannelDeviceCount));
- SataPrivateData->DisqulifiedModes = AllocateZeroPool ((sizeof (EFI_ATA_COLLECTIVE_MODE)) * ChannelDeviceCount);
- if (SataPrivateData->DisqulifiedModes == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Done;
- }
- SataPrivateData->IdentifyData = AllocateZeroPool ((sizeof (EFI_IDENTIFY_DATA)) * ChannelDeviceCount);
- if (SataPrivateData->IdentifyData == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Done;
- }
- SataPrivateData->IdentifyValid = AllocateZeroPool ((sizeof (BOOLEAN)) * ChannelDeviceCount);
- if (SataPrivateData->IdentifyValid == NULL) {
- Status = EFI_OUT_OF_RESOURCES;
- goto Done;
- }
- //
- // Install IDE Controller Init Protocol to this instance
- //
- Status = gBS->InstallMultipleProtocolInterfaces (
&Controller,
&gEfiIdeControllerInitProtocolGuid,
&(SataPrivateData->IdeInit),
NULL
);
-Done:
- if (EFI_ERROR (Status)) {
- gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
- if (SataPrivateData != NULL) {
if (SataPrivateData->DisqulifiedModes != NULL) {
FreePool (SataPrivateData->DisqulifiedModes);
}
if (SataPrivateData->IdentifyData != NULL) {
FreePool (SataPrivateData->IdentifyData);
}
if (SataPrivateData->IdentifyValid != NULL) {
FreePool (SataPrivateData->IdentifyValid);
}
FreePool (SataPrivateData);
- }
- }
- DEBUG ((EFI_D_INFO, "SataControllerStart END status = %r\n", Status));
- return Status;
-}
-/**
- Stop this driver on ControllerHandle.
- @param This Protocol instance pointer.
- @param Controller Handle of device to stop driver on.
- @param NumberOfChildren Not used.
- @param ChildHandleBuffer Not used.
- @retval EFI_SUCCESS This driver is removed from this device.
- @retval other Some error occurs when removing this driver from this device.
-**/ -EFI_STATUS -EFIAPI -SataControllerStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-{
- EFI_STATUS Status;
- EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeInit;
- EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;
-DEBUG ((EFI_D_INFO, "SataControllerStop()\n"));
- //
- // Open the produced protocol
- //
- Status = gBS->OpenProtocol (
Controller,
&gEfiIdeControllerInitProtocolGuid,
(VOID **) &IdeInit,
This->DriverBindingHandle,
Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
- if (EFI_ERROR (Status)) {
- return EFI_UNSUPPORTED;
- }
- SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (IdeInit);
- ASSERT (SataPrivateData != NULL);
- //
- // Uninstall the IDE Controller Init Protocol from this instance
- //
- Status = gBS->UninstallMultipleProtocolInterfaces (
Controller,
&gEfiIdeControllerInitProtocolGuid,
&(SataPrivateData->IdeInit),
NULL
);
- if (EFI_ERROR (Status)) {
- return Status;
- }
- if (SataPrivateData != NULL) {
- if (SataPrivateData->DisqulifiedModes != NULL) {
FreePool (SataPrivateData->DisqulifiedModes);
- }
- if (SataPrivateData->IdentifyData != NULL) {
FreePool (SataPrivateData->IdentifyData);
- }
- if (SataPrivateData->IdentifyValid != NULL) {
FreePool (SataPrivateData->IdentifyValid);
- }
- FreePool (SataPrivateData);
- }
- //
- // Close protocols opened by Sata Controller driver
- //
- return gBS->CloseProtocol (
Controller,
&gEfiPciIoProtocolGuid,
This->DriverBindingHandle,
Controller
);
-}
-// -// Interface functions of IDE_CONTROLLER_INIT protocol -// -/**
- Returns the information about the specified IDE channel.
- This function can be used to obtain information about a particular IDE channel.
- The driver entity uses this information during the enumeration process.
- If Enabled is set to FALSE, the driver entity will not scan the channel. Note
- that it will not prevent an operating system driver from scanning the channel.
- For most of today's controllers, MaxDevices will either be 1 or 2. For SATA
- controllers, this value will always be 1. SATA configurations can contain SATA
- port multipliers. SATA port multipliers behave like SATA bridges and can support
- up to 16 devices on the other side. If a SATA port out of the IDE controller
- is connected to a port multiplier, MaxDevices will be set to the number of SATA
- devices that the port multiplier supports. Because today's port multipliers
- support up to fifteen SATA devices, this number can be as large as fifteen. The IDE
- bus driver is required to scan for the presence of port multipliers behind an SATA
- controller and enumerate up to MaxDevices number of devices behind the port
- multiplier.
- In this context, the devices behind a port multiplier constitute a channel.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel Zero-based channel number.
- @param[out] Enabled TRUE if this channel is enabled. Disabled channels
are not scanned to see if any devices are present.
- @param[out] MaxDevices The maximum number of IDE devices that the bus driver
can expect on this channel. For the ATA/ATAPI
specification, version 6, this number will either be
one or two. For Serial ATA (SATA) configurations with a
port multiplier, this number can be as large as fifteen.
- @retval EFI_SUCCESS Information was returned without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
-**/ -EFI_STATUS -EFIAPI -IdeInitGetChannelInfo (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- OUT BOOLEAN *Enabled,
- OUT UINT8 *MaxDevices
- )
-{
- EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;
- SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);
- ASSERT (SataPrivateData != NULL);
-DEBUG ((EFI_D_INFO, "IdeInitGetChannelInfo()\n"));
- if (Channel < This->ChannelCount) {
- *Enabled = TRUE;
- *MaxDevices = SataPrivateData->DeviceCount;
- return EFI_SUCCESS;
- }
- *Enabled = FALSE;
- return EFI_INVALID_PARAMETER;
-}
-/**
- The notifications from the driver entity that it is about to enter a certain
- phase of the IDE channel enumeration process.
- This function can be used to notify the IDE controller driver to perform
- specific actions, including any chipset-specific initialization, so that the
- chipset is ready to enter the next phase. Seven notification points are defined
- at this time.
- More synchronization points may be added as required in the future.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Phase The phase during enumeration.
- @param[in] Channel Zero-based channel number.
- @retval EFI_SUCCESS The notification was accepted without any errors.
- @retval EFI_UNSUPPORTED Phase is not supported.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_NOT_READY This phase cannot be entered at this time; for
example, an attempt was made to enter a Phase
without having entered one or more previous
Phase.
-**/ -EFI_STATUS -EFIAPI -IdeInitNotifyPhase (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN EFI_IDE_CONTROLLER_ENUM_PHASE Phase,
- IN UINT8 Channel
- )
-{
- return EFI_SUCCESS;
-}
-/**
- Submits the device information to the IDE controller driver.
- This function is used by the driver entity to pass detailed information about
- a particular device to the IDE controller driver. The driver entity obtains
- this information by issuing an ATA or ATAPI IDENTIFY_DEVICE command. IdentifyData
- is the pointer to the response data buffer. The IdentifyData buffer is owned
- by the driver entity, and the IDE controller driver must make a local copy
- of the entire buffer or parts of the buffer as needed. The original IdentifyData
- buffer pointer may not be valid when
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() or
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() is called at a later point.
- The IDE controller driver may consult various fields of EFI_IDENTIFY_DATA to
- compute the optimum mode for the device. These fields are not limited to the
- timing information. For example, an implementation of the IDE controller driver
- may examine the vendor and type/mode field to match known bad drives.
- The driver entity may submit drive information in any order, as long as it
- submits information for all the devices belonging to the enumeration group
- before EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() is called for any device
- in that enumeration group. If a device is absent, EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
- should be called with IdentifyData set to NULL. The IDE controller driver may
- not have any other mechanism to know whether a device is present or not. Therefore,
- setting IdentifyData to NULL does not constitute an error condition.
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() can be called only once for a
- given (Channel, Device) pair.
- @param[in] This A pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel Zero-based channel number.
- @param[in] Device Zero-based device number on the Channel.
- @param[in] IdentifyData The device's response to the ATA IDENTIFY_DEVICE command.
- @retval EFI_SUCCESS The information was accepted without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
-**/ -EFI_STATUS -EFIAPI -IdeInitSubmitData (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- IN EFI_IDENTIFY_DATA *IdentifyData
- )
-{
- EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;
- SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);
- ASSERT (SataPrivateData != NULL);
-DEBUG ((EFI_D_INFO, "IdeInitSubmitData()\n"));
- if ((Channel >= This->ChannelCount) || (Device >= SataPrivateData->DeviceCount)) {
- return EFI_INVALID_PARAMETER;
- }
- //
- // Make a local copy of device's IdentifyData and mark the valid flag
- //
- if (IdentifyData != NULL) {
- CopyMem (
&(SataPrivateData->IdentifyData[Channel * Device]),
IdentifyData,
sizeof (EFI_IDENTIFY_DATA)
);
- SataPrivateData->IdentifyValid[Channel * Device] = TRUE;
- } else {
- SataPrivateData->IdentifyValid[Channel * Device] = FALSE;
- }
- return EFI_SUCCESS;
-}
-/**
- Disqualifies specific modes for an IDE device.
- This function allows the driver entity or other drivers (such as platform
- drivers) to reject certain timing modes and request the IDE controller driver
- to recalculate modes. This function allows the driver entity and the IDE
- controller driver to negotiate the timings on a per-device basis. This function
- is useful in the case of drives that lie about their capabilities. An example
- is when the IDE device fails to accept the timing modes that are calculated
- by the IDE controller driver based on the response to the Identify Drive command.
- If the driver entity does not want to limit the ATA timing modes and leave that
- decision to the IDE controller driver, it can either not call this function for
- the given device or call this function and set the Valid flag to FALSE for all
- modes that are listed in EFI_ATA_COLLECTIVE_MODE.
- The driver entity may disqualify modes for a device in any order and any number
- of times.
- This function can be called multiple times to invalidate multiple modes of the
- same type (e.g., Programmed Input/Output [PIO] modes 3 and 4). See the ATA/ATAPI
- specification for more information on PIO modes.
- For Serial ATA (SATA) controllers, this member function can be used to disqualify
- a higher transfer rate mode on a given channel. For example, a platform driver
- may inform the IDE controller driver to not use second-generation (Gen2) speeds
- for a certain SATA drive.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel The zero-based channel number.
- @param[in] Device The zero-based device number on the Channel.
- @param[in] BadModes The modes that the device does not support and that
should be disqualified.
- @retval EFI_SUCCESS The modes were accepted without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
- @retval EFI_INVALID_PARAMETER IdentifyData is NULL.
-**/ -EFI_STATUS -EFIAPI -IdeInitDisqualifyMode (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- IN EFI_ATA_COLLECTIVE_MODE *BadModes
- )
-{
- EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;
- SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);
- ASSERT (SataPrivateData != NULL);
-DEBUG ((EFI_D_INFO, "IdeInitDisqualifyMode()\n"));
- if ((Channel >= This->ChannelCount) || (BadModes == NULL) || (Device >= SataPrivateData->DeviceCount)) {
- return EFI_INVALID_PARAMETER;
- }
- //
- // Record the disqualified modes per channel per device. From ATA/ATAPI spec,
- // if a mode is not supported, the modes higher than it is also not supported.
- //
- CopyMem (
- &(SataPrivateData->DisqulifiedModes[Channel * Device]),
- BadModes,
- sizeof (EFI_ATA_COLLECTIVE_MODE)
- );
- return EFI_SUCCESS;
-}
-/**
- Returns the information about the optimum modes for the specified IDE device.
- This function is used by the driver entity to obtain the optimum ATA modes for
- a specific device. The IDE controller driver takes into account the following
- while calculating the mode:
- The IdentifyData inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
- The BadModes inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode()
- The driver entity is required to call EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
- for all the devices that belong to an enumeration group before calling
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() for any device in the same group.
- The IDE controller driver will use controller- and possibly platform-specific
- algorithms to arrive at SupportedModes. The IDE controller may base its
- decision on user preferences and other considerations as well. This function
- may be called multiple times because the driver entity may renegotiate the mode
- with the IDE controller driver using EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode().
- The driver entity may collect timing information for various devices in any
- order. The driver entity is responsible for making sure that all the dependencies
- are satisfied. For example, the SupportedModes information for device A that
- was previously returned may become stale after a call to
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() for device B.
- The buffer SupportedModes is allocated by the callee because the caller does
- not necessarily know the size of the buffer. The type EFI_ATA_COLLECTIVE_MODE
- is defined in a way that allows for future extensibility and can be of variable
- length. This memory pool should be deallocated by the caller when it is no
- longer necessary.
- The IDE controller driver for a Serial ATA (SATA) controller can use this
- member function to force a lower speed (first-generation [Gen1] speeds on a
- second-generation [Gen2]-capable hardware). The IDE controller driver can
- also allow the driver entity to stay with the speed that has been negotiated
- by the physical layer.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel A zero-based channel number.
- @param[in] Device A zero-based device number on the Channel.
- @param[out] SupportedModes The optimum modes for the device.
- @retval EFI_SUCCESS SupportedModes was returned.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
- @retval EFI_INVALID_PARAMETER SupportedModes is NULL.
- @retval EFI_NOT_READY Modes cannot be calculated due to a lack of
data. This error may happen if
EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
and EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyData()
were not called for at least one drive in the
same enumeration group.
-**/ -EFI_STATUS -EFIAPI -IdeInitCalculateMode (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- OUT EFI_ATA_COLLECTIVE_MODE **SupportedModes
- )
-{
- EFI_SATA_CONTROLLER_PRIVATE_DATA *SataPrivateData;
- EFI_IDENTIFY_DATA *IdentifyData;
- BOOLEAN IdentifyValid;
- EFI_ATA_COLLECTIVE_MODE *DisqulifiedModes;
- UINT16 SelectedMode;
- EFI_STATUS Status;
-DEBUG ((EFI_D_INFO, "IdeInitCalculateMode()\n"));
- SataPrivateData = SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS (This);
- ASSERT (SataPrivateData != NULL);
- if ((Channel >= This->ChannelCount) || (SupportedModes == NULL) || (Device >= SataPrivateData->DeviceCount)) {
- return EFI_INVALID_PARAMETER;
- }
- *SupportedModes = AllocateZeroPool (sizeof (EFI_ATA_COLLECTIVE_MODE));
- if (*SupportedModes == NULL) {
- ASSERT (*SupportedModes != NULL);
- return EFI_OUT_OF_RESOURCES;
- }
- IdentifyData = &(SataPrivateData->IdentifyData[Channel * Device]);
- IdentifyValid = SataPrivateData->IdentifyValid[Channel * Device];
- DisqulifiedModes = &(SataPrivateData->DisqulifiedModes[Channel * Device]);
- //
- // Make sure we've got the valid identify data of the device from SubmitData()
- //
- if (!IdentifyValid) {
- FreePool (*SupportedModes);
- return EFI_NOT_READY;
- }
- Status = CalculateBestPioMode (
IdentifyData,
(DisqulifiedModes->PioMode.Valid ? ((UINT16 *) &(DisqulifiedModes->PioMode.Mode)) : NULL),
&SelectedMode
);
- if (!EFI_ERROR (Status)) {
- (*SupportedModes)->PioMode.Valid = TRUE;
- (*SupportedModes)->PioMode.Mode = SelectedMode;
- } else {
- (*SupportedModes)->PioMode.Valid = FALSE;
- }
- DEBUG ((EFI_D_INFO, "IdeInitCalculateMode: PioMode = %x\n", (*SupportedModes)->PioMode.Mode));
- Status = CalculateBestUdmaMode (
IdentifyData,
(DisqulifiedModes->UdmaMode.Valid ? ((UINT16 *) &(DisqulifiedModes->UdmaMode.Mode)) : NULL),
&SelectedMode
);
- if (!EFI_ERROR (Status)) {
- (*SupportedModes)->UdmaMode.Valid = TRUE;
- (*SupportedModes)->UdmaMode.Mode = SelectedMode;
- } else {
- (*SupportedModes)->UdmaMode.Valid = FALSE;
- }
- DEBUG ((EFI_D_INFO, "IdeInitCalculateMode: UdmaMode = %x\n", (*SupportedModes)->UdmaMode.Mode));
- //
- // The modes other than PIO and UDMA are not supported
- //
- return EFI_SUCCESS;
-}
-/**
- Commands the IDE controller driver to program the IDE controller hardware
- so that the specified device can operate at the specified mode.
- This function is used by the driver entity to instruct the IDE controller
- driver to program the IDE controller hardware to the specified modes. This
- function can be called only once for a particular device. For a Serial ATA
- (SATA) Advanced Host Controller Interface (AHCI) controller, no controller-
- specific programming may be required.
- @param[in] This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel Zero-based channel number.
- @param[in] Device Zero-based device number on the Channel.
- @param[in] Modes The modes to set.
- @retval EFI_SUCCESS The command was accepted without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
- @retval EFI_NOT_READY Modes cannot be set at this time due to lack of data.
- @retval EFI_DEVICE_ERROR Modes cannot be set due to hardware failure.
The driver entity should not use this device.
-**/ -EFI_STATUS -EFIAPI -IdeInitSetTiming (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- IN EFI_ATA_COLLECTIVE_MODE *Modes
- )
-{
- return EFI_SUCCESS;
-} diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h deleted file mode 100644 index cb9b84be2d1b..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataController.h +++ /dev/null @@ -1,555 +0,0 @@ -/** @file
- Header file for Sata Controller driver.
- Copyright (c) 2011, Intel Corporation. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/
-#ifndef _SATA_CONTROLLER_H_ -#define _SATA_CONTROLLER_H_
-#include <Uefi.h> -#include <Protocol/ComponentName.h> -#include <Protocol/DriverBinding.h> -#include <Protocol/PciIo.h> -#include <Protocol/IdeControllerInit.h> -#include <Library/UefiDriverEntryPoint.h> -#include <Library/DebugLib.h> -#include <Library/UefiLib.h> -#include <Library/BaseLib.h> -#include <Library/BaseMemoryLib.h> -#include <Library/MemoryAllocationLib.h> -#include <Library/UefiBootServicesTableLib.h> -#include <IndustryStandard/Pci.h>
-// -// Global Variables definitions -// -extern EFI_DRIVER_BINDING_PROTOCOL gSataControllerDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gSataControllerComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gSataControllerComponentName2;
-#define AHCI_BAR_INDEX 0x05 -#define R_AHCI_CAP 0x0 -#define B_AHCI_CAP_NPS (BIT4 | BIT3 | BIT2 | BIT1 | BIT0) // Number of Ports -#define B_AHCI_CAP_SPM BIT17 // Supports Port Multiplier
-/// -/// AHCI each channel can have up to 1 device -/// -#define AHCI_MAX_DEVICES 0x01
-/// -/// AHCI each channel can have 15 devices in the presence of a multiplier -/// -#define AHCI_MULTI_MAX_DEVICES 0x0F
-/// -/// IDE supports 2 channel max -/// -#define IDE_MAX_CHANNEL 0x02
-/// -/// IDE supports 2 devices max -/// -#define IDE_MAX_DEVICES 0x02
-#define SATA_ENUMER_ALL FALSE
-// -// Sata Controller driver private data structure -//
-#define SATA_CONTROLLER_SIGNATURE SIGNATURE_32('S','A','T','A')
-typedef struct _EFI_SATA_CONTROLLER_PRIVATE_DATA {
- //
- // Standard signature used to identify Sata Controller private data
- //
- UINT32 Signature;
- //
- // Protocol instance of IDE_CONTROLLER_INIT produced by this driver
- //
- EFI_IDE_CONTROLLER_INIT_PROTOCOL IdeInit;
- //
- // Copy of protocol pointers used by this driver
- //
- EFI_PCI_IO_PROTOCOL *PciIo;
- //
- // The number of devices that are supported by this channel
- //
- UINT8 DeviceCount;
- //
- // The highest disqulified mode for each attached device,
- // From ATA/ATAPI spec, if a mode is not supported,
- // the modes higher than it is also not supported
- //
- EFI_ATA_COLLECTIVE_MODE *DisqulifiedModes;
- //
- // A copy of EFI_IDENTIFY_DATA data for each attached SATA device and its flag
- //
- EFI_IDENTIFY_DATA *IdentifyData;
- BOOLEAN *IdentifyValid;
-} EFI_SATA_CONTROLLER_PRIVATE_DATA;
-#define SATA_CONTROLLER_PRIVATE_DATA_FROM_THIS(a) CR(a, EFI_SATA_CONTROLLER_PRIVATE_DATA, IdeInit, SATA_CONTROLLER_SIGNATURE)
-/**
- Initialize the Sata controller hardware.
- @retval EFI_SUCCESS This driver is removed from this device.
- @retval other Some error occurs when removing this driver from this device.
-**/ -EFI_STATUS -InitializeSataController (
- VOID
- );
-// -// Driver binding functions declaration -// -/**
- Supported function of Driver Binding protocol for this driver.
- Test to see if this driver supports ControllerHandle.
- @param This Protocol instance pointer.
- @param Controller Handle of device to test.
- @param RemainingDevicePath A pointer to the device path. Should be ignored by
device driver.
- @retval EFI_SUCCESS This driver supports this device.
- @retval EFI_ALREADY_STARTED This driver is already running on this device.
- @retval other This driver does not support this device.
-**/ -EFI_STATUS -EFIAPI -SataControllerSupported (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-;
-/**
- This routine is called right after the .Supported() called and
- Start this driver on ControllerHandle.
- @param This Protocol instance pointer.
- @param Controller Handle of device to bind driver to.
- @param RemainingDevicePath A pointer to the device path. Should be ignored by
device driver.
- @retval EFI_SUCCESS This driver is added to this device.
- @retval EFI_ALREADY_STARTED This driver is already running on this device.
- @retval other Some error occurs when binding this driver to this device.
-**/ -EFI_STATUS -EFIAPI -SataControllerStart (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
- )
-;
-/**
- Stop this driver on ControllerHandle.
- @param This Protocol instance pointer.
- @param Controller Handle of device to stop driver on.
- @param NumberOfChildren Not used.
- @param ChildHandleBuffer Not used.
- @retval EFI_SUCCESS This driver is removed from this device.
- @retval other Some error occurs when removing this driver from this device.
-**/ -EFI_STATUS -EFIAPI -SataControllerStop (
- IN EFI_DRIVER_BINDING_PROTOCOL *This,
- IN EFI_HANDLE Controller,
- IN UINTN NumberOfChildren,
- IN EFI_HANDLE *ChildHandleBuffer
- )
-;
-// -// IDE controller init functions declaration -// -/**
- Returns the information about the specified IDE channel.
- This function can be used to obtain information about a particular IDE channel.
- The driver entity uses this information during the enumeration process.
- If Enabled is set to FALSE, the driver entity will not scan the channel. Note
- that it will not prevent an operating system driver from scanning the channel.
- For most of today's controllers, MaxDevices will either be 1 or 2. For SATA
- controllers, this value will always be 1. SATA configurations can contain SATA
- port multipliers. SATA port multipliers behave like SATA bridges and can support
- up to 16 devices on the other side. If a SATA port out of the IDE controller
- is connected to a port multiplier, MaxDevices will be set to the number of SATA
- devices that the port multiplier supports. Because today's port multipliers
- support up to fifteen SATA devices, this number can be as large as fifteen. The IDE
- bus driver is required to scan for the presence of port multipliers behind an SATA
- controller and enumerate up to MaxDevices number of devices behind the port
- multiplier.
- In this context, the devices behind a port multiplier constitute a channel.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel Zero-based channel number.
- @param[out] Enabled TRUE if this channel is enabled. Disabled channels
are not scanned to see if any devices are present.
- @param[out] MaxDevices The maximum number of IDE devices that the bus driver
can expect on this channel. For the ATA/ATAPI
specification, version 6, this number will either be
one or two. For Serial ATA (SATA) configurations with a
port multiplier, this number can be as large as fifteen.
- @retval EFI_SUCCESS Information was returned without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
-**/ -EFI_STATUS -EFIAPI -IdeInitGetChannelInfo (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- OUT BOOLEAN *Enabled,
- OUT UINT8 *MaxDevices
- )
-;
-/**
- The notifications from the driver entity that it is about to enter a certain
- phase of the IDE channel enumeration process.
- This function can be used to notify the IDE controller driver to perform
- specific actions, including any chipset-specific initialization, so that the
- chipset is ready to enter the next phase. Seven notification points are defined
- at this time.
- More synchronization points may be added as required in the future.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Phase The phase during enumeration.
- @param[in] Channel Zero-based channel number.
- @retval EFI_SUCCESS The notification was accepted without any errors.
- @retval EFI_UNSUPPORTED Phase is not supported.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_NOT_READY This phase cannot be entered at this time; for
example, an attempt was made to enter a Phase
without having entered one or more previous
Phase.
-**/ -EFI_STATUS -EFIAPI -IdeInitNotifyPhase (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN EFI_IDE_CONTROLLER_ENUM_PHASE Phase,
- IN UINT8 Channel
- )
-;
-/**
- Submits the device information to the IDE controller driver.
- This function is used by the driver entity to pass detailed information about
- a particular device to the IDE controller driver. The driver entity obtains
- this information by issuing an ATA or ATAPI IDENTIFY_DEVICE command. IdentifyData
- is the pointer to the response data buffer. The IdentifyData buffer is owned
- by the driver entity, and the IDE controller driver must make a local copy
- of the entire buffer or parts of the buffer as needed. The original IdentifyData
- buffer pointer may not be valid when
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() or
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() is called at a later point.
- The IDE controller driver may consult various fields of EFI_IDENTIFY_DATA to
- compute the optimum mode for the device. These fields are not limited to the
- timing information. For example, an implementation of the IDE controller driver
- may examine the vendor and type/mode field to match known bad drives.
- The driver entity may submit drive information in any order, as long as it
- submits information for all the devices belonging to the enumeration group
- before EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() is called for any device
- in that enumeration group. If a device is absent, EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
- should be called with IdentifyData set to NULL. The IDE controller driver may
- not have any other mechanism to know whether a device is present or not. Therefore,
- setting IdentifyData to NULL does not constitute an error condition.
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData() can be called only once for a
- given (Channel, Device) pair.
- @param[in] This A pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel Zero-based channel number.
- @param[in] Device Zero-based device number on the Channel.
- @param[in] IdentifyData The device's response to the ATA IDENTIFY_DEVICE command.
- @retval EFI_SUCCESS The information was accepted without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
-**/ -EFI_STATUS -EFIAPI -IdeInitSubmitData (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- IN EFI_IDENTIFY_DATA *IdentifyData
- )
-;
-/**
- Disqualifies specific modes for an IDE device.
- This function allows the driver entity or other drivers (such as platform
- drivers) to reject certain timing modes and request the IDE controller driver
- to recalculate modes. This function allows the driver entity and the IDE
- controller driver to negotiate the timings on a per-device basis. This function
- is useful in the case of drives that lie about their capabilities. An example
- is when the IDE device fails to accept the timing modes that are calculated
- by the IDE controller driver based on the response to the Identify Drive command.
- If the driver entity does not want to limit the ATA timing modes and leave that
- decision to the IDE controller driver, it can either not call this function for
- the given device or call this function and set the Valid flag to FALSE for all
- modes that are listed in EFI_ATA_COLLECTIVE_MODE.
- The driver entity may disqualify modes for a device in any order and any number
- of times.
- This function can be called multiple times to invalidate multiple modes of the
- same type (e.g., Programmed Input/Output [PIO] modes 3 and 4). See the ATA/ATAPI
- specification for more information on PIO modes.
- For Serial ATA (SATA) controllers, this member function can be used to disqualify
- a higher transfer rate mode on a given channel. For example, a platform driver
- may inform the IDE controller driver to not use second-generation (Gen2) speeds
- for a certain SATA drive.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel The zero-based channel number.
- @param[in] Device The zero-based device number on the Channel.
- @param[in] BadModes The modes that the device does not support and that
should be disqualified.
- @retval EFI_SUCCESS The modes were accepted without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
- @retval EFI_INVALID_PARAMETER IdentifyData is NULL.
-**/ -EFI_STATUS -EFIAPI -IdeInitDisqualifyMode (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- IN EFI_ATA_COLLECTIVE_MODE *BadModes
- )
-;
-/**
- Returns the information about the optimum modes for the specified IDE device.
- This function is used by the driver entity to obtain the optimum ATA modes for
- a specific device. The IDE controller driver takes into account the following
- while calculating the mode:
- The IdentifyData inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
- The BadModes inputs to EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode()
- The driver entity is required to call EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
- for all the devices that belong to an enumeration group before calling
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.CalculateMode() for any device in the same group.
- The IDE controller driver will use controller- and possibly platform-specific
- algorithms to arrive at SupportedModes. The IDE controller may base its
- decision on user preferences and other considerations as well. This function
- may be called multiple times because the driver entity may renegotiate the mode
- with the IDE controller driver using EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode().
- The driver entity may collect timing information for various devices in any
- order. The driver entity is responsible for making sure that all the dependencies
- are satisfied. For example, the SupportedModes information for device A that
- was previously returned may become stale after a call to
- EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyMode() for device B.
- The buffer SupportedModes is allocated by the callee because the caller does
- not necessarily know the size of the buffer. The type EFI_ATA_COLLECTIVE_MODE
- is defined in a way that allows for future extensibility and can be of variable
- length. This memory pool should be deallocated by the caller when it is no
- longer necessary.
- The IDE controller driver for a Serial ATA (SATA) controller can use this
- member function to force a lower speed (first-generation [Gen1] speeds on a
- second-generation [Gen2]-capable hardware). The IDE controller driver can
- also allow the driver entity to stay with the speed that has been negotiated
- by the physical layer.
- @param[in] This The pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel A zero-based channel number.
- @param[in] Device A zero-based device number on the Channel.
- @param[out] SupportedModes The optimum modes for the device.
- @retval EFI_SUCCESS SupportedModes was returned.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
- @retval EFI_INVALID_PARAMETER SupportedModes is NULL.
- @retval EFI_NOT_READY Modes cannot be calculated due to a lack of
data. This error may happen if
EFI_IDE_CONTROLLER_INIT_PROTOCOL.SubmitData()
and EFI_IDE_CONTROLLER_INIT_PROTOCOL.DisqualifyData()
were not called for at least one drive in the
same enumeration group.
-**/ -EFI_STATUS -EFIAPI -IdeInitCalculateMode (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- OUT EFI_ATA_COLLECTIVE_MODE **SupportedModes
- )
-;
-/**
- Commands the IDE controller driver to program the IDE controller hardware
- so that the specified device can operate at the specified mode.
- This function is used by the driver entity to instruct the IDE controller
- driver to program the IDE controller hardware to the specified modes. This
- function can be called only once for a particular device. For a Serial ATA
- (SATA) Advanced Host Controller Interface (AHCI) controller, no controller-
- specific programming may be required.
- @param[in] This Pointer to the EFI_IDE_CONTROLLER_INIT_PROTOCOL instance.
- @param[in] Channel Zero-based channel number.
- @param[in] Device Zero-based device number on the Channel.
- @param[in] Modes The modes to set.
- @retval EFI_SUCCESS The command was accepted without any errors.
- @retval EFI_INVALID_PARAMETER Channel is invalid (Channel >= ChannelCount).
- @retval EFI_INVALID_PARAMETER Device is invalid.
- @retval EFI_NOT_READY Modes cannot be set at this time due to lack of data.
- @retval EFI_DEVICE_ERROR Modes cannot be set due to hardware failure.
The driver entity should not use this device.
-**/ -EFI_STATUS -EFIAPI -IdeInitSetTiming (
- IN EFI_IDE_CONTROLLER_INIT_PROTOCOL *This,
- IN UINT8 Channel,
- IN UINT8 Device,
- IN EFI_ATA_COLLECTIVE_MODE *Modes
- )
-;
-// -// Forward reference declaration -// -/**
- Retrieves a Unicode string that is the user readable name of the UEFI Driver.
- @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
- @param Language A pointer to a three character ISO 639-2 language identifier.
This is the language of the driver name that that the caller
is requesting, and it must match one of the languages specified
in SupportedLanguages. The number of languages supported by a
driver is up to the driver writer.
- @param DriverName A pointer to the Unicode string to return. This Unicode string
is the name of the driver specified by This in the language
specified by Language.
- @retval EFI_SUCCESS The Unicode string for the Driver specified by This
and the language specified by Language was returned
in DriverName.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER DriverName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
-**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetDriverName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN CHAR8 *Language,
- OUT CHAR16 **DriverName
- )
-;
-/**
- Retrieves a Unicode string that is the user readable name of the controller
- that is being managed by an UEFI Driver.
- @param This A pointer to the EFI_COMPONENT_NAME_PROTOCOL instance.
- @param ControllerHandle The handle of a controller that the driver specified by
This is managing. This handle specifies the controller
whose name is to be returned.
- @param OPTIONAL ChildHandle The handle of the child controller to retrieve the name
of. This is an optional parameter that may be NULL. It
will be NULL for device drivers. It will also be NULL
for a bus drivers that wish to retrieve the name of the
bus controller. It will not be NULL for a bus driver
that wishes to retrieve the name of a child controller.
- @param Language A pointer to a three character ISO 639-2 language
identifier. This is the language of the controller name
that that the caller is requesting, and it must match one
of the languages specified in SupportedLanguages. The
number of languages supported by a driver is up to the
driver writer.
- @param ControllerName A pointer to the Unicode string to return. This Unicode
string is the name of the controller specified by
ControllerHandle and ChildHandle in the language
specified by Language from the point of view of the
driver specified by This.
- @retval EFI_SUCCESS The Unicode string for the user readable name in the
language specified by Language for the driver
specified by This was returned in DriverName.
- @retval EFI_INVALID_PARAMETER ControllerHandle is not a valid EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid
EFI_HANDLE.
- @retval EFI_INVALID_PARAMETER Language is NULL.
- @retval EFI_INVALID_PARAMETER ControllerName is NULL.
- @retval EFI_UNSUPPORTED The driver specified by This is not currently
managing the controller specified by
ControllerHandle and ChildHandle.
- @retval EFI_UNSUPPORTED The driver specified by This does not support the
language specified by Language.
-**/ -EFI_STATUS -EFIAPI -SataControllerComponentNameGetControllerName (
- IN EFI_COMPONENT_NAME_PROTOCOL *This,
- IN EFI_HANDLE ControllerHandle,
- IN EFI_HANDLE ChildHandle OPTIONAL,
- IN CHAR8 *Language,
- OUT CHAR16 **ControllerName
- )
-;
-#endif diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf deleted file mode 100644 index 383ef90dc08c..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataControllerDxe.inf +++ /dev/null @@ -1,85 +0,0 @@ -## @file -# -# Component description file for the Sata Controller driver. -# -# Copyright (c) 2011, Intel Corporation. All rights reserved.<BR> -# Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR> -# -# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -##
-[Defines]
- INF_VERSION = 0x00010005
- BASE_NAME = SataController
- FILE_GUID = 1c6d1ed1-22ec-4b16-9179-e5cdbf7ddf8d
- MODULE_TYPE = UEFI_DRIVER
- VERSION_STRING = 1.0
- ENTRY_POINT = InitializeSataControllerDriver
-# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -#
-[Sources]
- ComponentName.c
- SataController.c
- SataController.h
- PciEmulation.c
- PciEmulation.h
- PciRootBridgeIo.c
- SataRegisters.h
- InitController.c
-[Packages]
- ArmPkg/ArmPkg.dec
- ArmPlatformPkg/ArmPlatformPkg.dec
- MdePkg/MdePkg.dec
- MdeModulePkg/MdeModulePkg.dec
- IntelFrameworkPkg/IntelFrameworkPkg.dec
- EmbeddedPkg/EmbeddedPkg.dec
- AmdModulePkg/AmdModulePkg.dec
- OpenPlatformPkg/Platforms/AMD/Styx/AmdStyx.dec
-[LibraryClasses]
- UefiDriverEntryPoint
- DebugLib
- UefiLib
- BaseLib
- BaseMemoryLib
- MemoryAllocationLib
- UefiBootServicesTableLib
- IoLib
- AmdSataInit
-[Protocols]
- gEfiPciIoProtocolGuid
- gEfiIdeControllerInitProtocolGuid
-[Pcd]
- gAmdModulePkgTokenSpaceGuid.PcdSataSerdesBase
- gAmdModulePkgTokenSpaceGuid.PcdSataSerdesOffset
- gAmdModulePkgTokenSpaceGuid.PcdSataNumChPerSerdes
- gAmdStyxTokenSpaceGuid.PcdSataCtrlAxiSlvPort
- gAmdStyxTokenSpaceGuid.PcdSataPortCount
- gAmdStyxTokenSpaceGuid.PcdSataPi
- gAmdStyxTokenSpaceGuid.PcdSataPortMode
- gAmdStyxTokenSpaceGuid.PcdSataSmpsSupport
- gAmdStyxTokenSpaceGuid.PcdSataSssSupport
- gAmdStyxTokenSpaceGuid.PcdSataPortCpd
- gAmdStyxTokenSpaceGuid.PcdSataPortMpsp
- gAmdStyxTokenSpaceGuid.PcdSata1CtrlAxiSlvPort
- gAmdStyxTokenSpaceGuid.PcdSata1PortCount
-[Depex]
- TRUE
diff --git a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h b/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h deleted file mode 100644 index ff78f4ac3c67..000000000000 --- a/Platforms/AMD/Styx/Drivers/SataControllerDxe/SataRegisters.h +++ /dev/null @@ -1,180 +0,0 @@ -/** @file
- Header file for AHCI mode of ATA host controller.
- Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
- Copyright (c) 2014 - 2016, AMD Inc. All rights reserved.<BR>
- This program and the accompanying materials
- are licensed and made available under the terms and conditions of the BSD License
- which accompanies this distribution. The full text of the license may be found at
- http://opensource.org/licenses/bsd-license.php
- THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
- WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
-**/ -#ifndef __SATA_REGISTERS_H__ -#define __SATA_REGISTERS_H__
-#define EFI_AHCI_BAR_INDEX 0x05
-#define EFI_AHCI_CAPABILITY_OFFSET 0x0000 -#define EFI_AHCI_CAP_SSS BIT27 -#define EFI_AHCI_CAP_SMPS BIT28 -#define EFI_AHCI_CAP_S64A BIT31 -#define EFI_AHCI_GHC_OFFSET 0x0004 -#define EFI_AHCI_GHC_RESET BIT0 -#define EFI_AHCI_GHC_IE BIT1 -#define EFI_AHCI_GHC_ENABLE BIT31 -#define EFI_AHCI_IS_OFFSET 0x0008 -#define EFI_AHCI_PI_OFFSET 0x000C
-#define EFI_AHCI_MAX_PORTS 32
-// -// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms. -// -#define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 10 -// -// Refer SATA1.0a spec, the FIS enable time should be less than 500ms. -// -#define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500) -// -// Refer SATA1.0a spec, the bus reset time should be less than 1s. -// -#define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1)
-#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000 -#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000 -#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000 -#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000
-// -// Each PRDT entry can point to a memory block up to 4M byte -// -#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000
-#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device -#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20 -#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host -#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20 -#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host -#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4 -#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional -#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28 -#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional -#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional -#define EFI_AHCI_FIS_BIST_LENGTH 12 -#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host -#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20 -#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host -#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
-#define EFI_AHCI_D2H_FIS_OFFSET 0x40 -#define EFI_AHCI_DMA_FIS_OFFSET 0x00 -#define EFI_AHCI_PIO_FIS_OFFSET 0x20 -#define EFI_AHCI_SDB_FIS_OFFSET 0x58 -#define EFI_AHCI_FIS_TYPE_MASK 0xFF -#define EFI_AHCI_U_FIS_OFFSET 0x60
-// -// Port register -// -#define EFI_AHCI_PORT_START 0x0100 -#define EFI_AHCI_PORT_REG_WIDTH 0x0080 -#define EFI_AHCI_PORT_CLB 0x0000 -#define EFI_AHCI_PORT_CLBU 0x0004 -#define EFI_AHCI_PORT_FB 0x0008 -#define EFI_AHCI_PORT_FBU 0x000C -#define EFI_AHCI_PORT_IS 0x0010 -#define EFI_AHCI_PORT_IS_DHRS BIT0 -#define EFI_AHCI_PORT_IS_PSS BIT1 -#define EFI_AHCI_PORT_IS_SSS BIT2 -#define EFI_AHCI_PORT_IS_SDBS BIT3 -#define EFI_AHCI_PORT_IS_UFS BIT4 -#define EFI_AHCI_PORT_IS_DPS BIT5 -#define EFI_AHCI_PORT_IS_PCS BIT6 -#define EFI_AHCI_PORT_IS_DIS BIT7 -#define EFI_AHCI_PORT_IS_PRCS BIT22 -#define EFI_AHCI_PORT_IS_IPMS BIT23 -#define EFI_AHCI_PORT_IS_OFS BIT24 -#define EFI_AHCI_PORT_IS_INFS BIT26 -#define EFI_AHCI_PORT_IS_IFS BIT27 -#define EFI_AHCI_PORT_IS_HBDS BIT28 -#define EFI_AHCI_PORT_IS_HBFS BIT29 -#define EFI_AHCI_PORT_IS_TFES BIT30 -#define EFI_AHCI_PORT_IS_CPDS BIT31 -#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF -#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
-#define EFI_AHCI_PORT_OFFSET(PortNum) \
(EFI_AHCI_PORT_START + ((PortNum) * EFI_AHCI_PORT_REG_WIDTH))
-#define EFI_AHCI_PORT_IE 0x0014 -#define EFI_AHCI_PORT_CMD 0x0018 -#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE -#define EFI_AHCI_PORT_CMD_ST BIT0 -#define EFI_AHCI_PORT_CMD_SUD BIT1 -#define EFI_AHCI_PORT_CMD_POD BIT2 -#define EFI_AHCI_PORT_CMD_CLO BIT3 -#define EFI_AHCI_PORT_CMD_CR BIT15 -#define EFI_AHCI_PORT_CMD_FRE BIT4 -#define EFI_AHCI_PORT_CMD_FR BIT14 -#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL) -#define EFI_AHCI_PORT_CMD_PMA BIT17 -#define EFI_AHCI_PORT_CMD_HPCP BIT18 -#define EFI_AHCI_PORT_CMD_MPSP BIT19 -#define EFI_AHCI_PORT_CMD_CPD BIT20 -#define EFI_AHCI_PORT_CMD_ESP BIT21 -#define EFI_AHCI_PORT_CMD_ATAPI BIT24 -#define EFI_AHCI_PORT_CMD_DLAE BIT25 -#define EFI_AHCI_PORT_CMD_ALPE BIT26 -#define EFI_AHCI_PORT_CMD_ASP BIT27 -#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) -#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 ) -#define EFI_AHCI_PORT_TFD 0x0020 -#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) -#define EFI_AHCI_PORT_TFD_BSY BIT7 -#define EFI_AHCI_PORT_TFD_DRQ BIT3 -#define EFI_AHCI_PORT_TFD_ERR BIT0 -#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00 -#define EFI_AHCI_PORT_SIG 0x0024 -#define EFI_AHCI_PORT_SSTS 0x0028 -#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F -#define EFI_AHCI_PORT_SSTS_DET 0x0001 -#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003 -#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0 -#define EFI_AHCI_PORT_SCTL 0x002C -#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F -#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK) -#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001 -#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003 -#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0 -#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00 -#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300 -#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100 -#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200 -#define EFI_AHCI_PORT_SERR 0x0030 -#define EFI_AHCI_PORT_SERR_RDIE BIT0 -#define EFI_AHCI_PORT_SERR_RCE BIT1 -#define EFI_AHCI_PORT_SERR_TDIE BIT8 -#define EFI_AHCI_PORT_SERR_PCDIE BIT9 -#define EFI_AHCI_PORT_SERR_PE BIT10 -#define EFI_AHCI_PORT_SERR_IE BIT11 -#define EFI_AHCI_PORT_SERR_PRC BIT16 -#define EFI_AHCI_PORT_SERR_PIE BIT17 -#define EFI_AHCI_PORT_SERR_CW BIT18 -#define EFI_AHCI_PORT_SERR_BDE BIT19 -#define EFI_AHCI_PORT_SERR_DE BIT20 -#define EFI_AHCI_PORT_SERR_CRCE BIT21 -#define EFI_AHCI_PORT_SERR_HE BIT22 -#define EFI_AHCI_PORT_SERR_LSE BIT23 -#define EFI_AHCI_PORT_SERR_TSTE BIT24 -#define EFI_AHCI_PORT_SERR_UFT BIT25 -#define EFI_AHCI_PORT_SERR_EX BIT26 -#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF -#define EFI_AHCI_PORT_SACT 0x0034 -#define EFI_AHCI_PORT_CI 0x0038 -#define EFI_AHCI_PORT_SNTF 0x003C
-#endif
2.7.4