/** @file | |
* Header containing the structure specific to the Silicon Image I3132 Sata PCI card | |
* | |
* Copyright (c) 2011-2015, ARM Limited. All rights reserved. | |
* | |
* 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 __SATASII3132_H | |
#define __SATASII3132_H | |
#include <PiDxe.h> | |
#include <Protocol/AtaPassThru.h> | |
#include <Protocol/PciIo.h> | |
#include <Library/UefiLib.h> | |
#include <Library/DebugLib.h> | |
#include <Library/PcdLib.h> | |
#include <Library/BaseMemoryLib.h> | |
#include <Library/UefiBootServicesTableLib.h> | |
#include <IndustryStandard/Pci.h> | |
#define SATA_SII3132_DEVICE_ID 0x3132 | |
#define SATA_SII3132_VENDOR_ID 0x1095 | |
#define SII3132_PORT_SIGNATURE_PMP 0x96690101 | |
#define SII3132_PORT_SIGNATURE_ATAPI 0xEB140101 | |
#define SII3132_PORT_SIGNATURE_ATA 0x00000101 | |
/* | |
* Silicon Image SiI3132 Registers | |
*/ | |
#define SII3132_GLOBAL_CONTROL_REG 0x40 | |
#define SII3132_GLOBAL_FLASHADDR_REG 0x70 | |
#define SII3132_PORT_STATUS_REG 0x1000 | |
#define SII3132_PORT_CONTROLSET_REG 0x1000 | |
#define SII3132_PORT_CONTROLCLEAR_REG 0x1004 | |
#define SII3132_PORT_INTSTATUS_REG 0x1008 | |
#define SII3132_PORT_ENABLEINT_REG 0x1010 | |
#define SII3132_PORT_INTCLEAR_REG 0x1014 | |
#define SII3132_PORT_32BITACTIVADDR_REG 0x101C | |
#define SII3132_PORT_CMDEXECFIFO_REG 0x1020 | |
#define SII3132_PORT_CMDERROR_REG 0x1024 | |
#define SII3132_PORT_ERRCOUNTDECODE 0x1040 | |
#define SII3132_PORT_ERRCOUNTCRC 0x1044 | |
#define SII3132_PORT_ERRCOUNTHANDSHAKE 0x1048 | |
#define SII3132_PORT_SLOTSTATUS_REG 0x1800 | |
#define SII3132_PORT_CMDACTIV_REG 0x1C00 | |
#define SII3132_PORT_SSTATUS_REG 0x1F04 | |
#define SII3132_PORT_CONTROL_RESET (1 << 0) | |
#define SII3132_PORT_DEVICE_RESET (1 << 1) | |
#define SII3132_PORT_CONTROL_INT (1 << 2) | |
#define SII3132_PORT_CONTROL_32BITACTIVATION (1 << 10) | |
#define SII3132_PORT_STATUS_PORTREADY 0x80000000 | |
#define SII3132_PORT_INT_CMDCOMPL (1 << 0) | |
#define SII3132_PORT_INT_CMDERR (1 << 1) | |
#define SII3132_PORT_INT_PORTRDY (1 << 2) | |
#define SATA_SII3132_MAXPORT 2 | |
#define PRB_CTRL_ATA 0x0 | |
#define PRB_CTRL_PROT_OVERRIDE 0x1 | |
#define PRB_CTRL_RESTRANSMIT 0x2 | |
#define PRB_CTRL_EXT_CMD 0x4 | |
#define PRB_CTRL_RCV 0x8 | |
#define PRB_CTRL_PKT_READ 0x10 | |
#define PRB_CTRL_PKT_WRITE 0x20 | |
#define PRB_CTRL_INT_MASK 0x40 | |
#define PRB_CTRL_SRST 0x80 | |
#define PRB_PROT_PACKET 0x01 | |
#define PRB_PROT_LEGACY_QUEUE 0x02 | |
#define PRB_PROT_NATIVE_QUEUE 0x04 | |
#define PRB_PROT_READ 0x08 | |
#define PRB_PROT_WRITE 0x10 | |
#define PRB_PROT_TRANSPARENT 0x20 | |
#define SGE_XCF (1 << 28) | |
#define SGE_DRD (1 << 29) | |
#define SGE_LNK (1 << 30) | |
#define SGE_TRM 0x80000000 | |
typedef struct _SATA_SI3132_SGE { | |
UINT32 DataAddressLow; | |
UINT32 DataAddressHigh; | |
UINT32 DataCount; | |
UINT32 Attributes; | |
} SATA_SI3132_SGE; | |
typedef struct _SATA_SI3132_FIS { | |
UINT8 FisType; | |
UINT8 Control; | |
UINT8 Command; | |
UINT8 Features; | |
UINT8 Fis[5 * 4]; | |
} SATA_SI3132_FIS; | |
typedef struct _SATA_SI3132_PRB { | |
UINT16 Control; | |
UINT16 ProtocolOverride; | |
UINT32 RecTransCount; | |
SATA_SI3132_FIS Fis; | |
SATA_SI3132_SGE Sge[2]; | |
} SATA_SI3132_PRB; | |
typedef struct _SATA_SI3132_DEVICE { | |
LIST_ENTRY Link; // This attribute must be the first entry of this structure (to avoid pointer computation) | |
UINTN Index; | |
struct _SATA_SI3132_PORT *Port; //Parent Port | |
UINT32 BlockSize; | |
} SATA_SI3132_DEVICE; | |
typedef struct _SATA_SI3132_PORT { | |
UINTN Index; | |
UINTN RegBase; | |
struct _SATA_SI3132_INSTANCE *Instance; | |
//TODO: Support Port multiplier | |
LIST_ENTRY Devices; | |
SATA_SI3132_PRB* HostPRB; | |
EFI_PHYSICAL_ADDRESS PhysAddrHostPRB; | |
VOID* PciAllocMappingPRB; | |
} SATA_SI3132_PORT; | |
typedef struct _SATA_SI3132_INSTANCE { | |
UINTN Signature; | |
SATA_SI3132_PORT Ports[SATA_SII3132_MAXPORT]; | |
EFI_ATA_PASS_THRU_PROTOCOL AtaPassThruProtocol; | |
EFI_PCI_IO_PROTOCOL *PciIo; | |
} SATA_SI3132_INSTANCE; | |
#define SATA_SII3132_SIGNATURE SIGNATURE_32('s', 'i', '3', '2') | |
#define INSTANCE_FROM_ATAPASSTHRU_THIS(a) CR(a, SATA_SI3132_INSTANCE, AtaPassThruProtocol, SATA_SII3132_SIGNATURE) | |
#define SATA_GLOBAL_READ32(Offset, Value) PciIo->Mem.Read (PciIo, EfiPciIoWidthUint32, 0, Offset, 1, Value) | |
#define SATA_GLOBAL_WRITE32(Offset, Value) { UINT32 Value32 = Value; PciIo->Mem.Write (PciIo, EfiPciIoWidthUint32, 0, Offset, 1, &Value32); } | |
#define SATA_PORT_READ32(Offset, Value) PciIo->Mem.Read (PciIo, EfiPciIoWidthUint32, 1, Offset, 1, Value) | |
#define SATA_PORT_WRITE32(Offset, Value) { UINT32 Value32 = Value; PciIo->Mem.Write (PciIo, EfiPciIoWidthUint32, 1, Offset, 1, &Value32); } | |
#define SATA_TRACE(txt) DEBUG((EFI_D_VERBOSE, "ARM_SATA: " txt "\n")) | |
extern EFI_COMPONENT_NAME_PROTOCOL gSataSiI3132ComponentName; | |
extern EFI_COMPONENT_NAME2_PROTOCOL gSataSiI3132ComponentName2; | |
/* | |
* Component Name Protocol Functions | |
*/ | |
EFI_STATUS | |
EFIAPI | |
SataSiI3132ComponentNameGetDriverName ( | |
IN EFI_COMPONENT_NAME_PROTOCOL *This, | |
IN CHAR8 *Language, | |
OUT CHAR16 **DriverName | |
); | |
EFI_STATUS | |
EFIAPI | |
SataSiI3132ComponentNameGetControllerName ( | |
IN EFI_COMPONENT_NAME_PROTOCOL *This, | |
IN EFI_HANDLE ControllerHandle, | |
IN EFI_HANDLE ChildHandle OPTIONAL, | |
IN CHAR8 *Language, | |
OUT CHAR16 **ControllerName | |
); | |
EFI_STATUS SiI3132HwResetPort (SATA_SI3132_PORT *Port); | |
/* | |
* Driver Binding Protocol Functions | |
*/ | |
EFI_STATUS | |
EFIAPI | |
SataSiI3132DriverBindingSupported ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath | |
); | |
EFI_STATUS | |
EFIAPI | |
SataSiI3132DriverBindingStart ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath | |
); | |
EFI_STATUS | |
EFIAPI | |
SataSiI3132DriverBindingStop ( | |
IN EFI_DRIVER_BINDING_PROTOCOL *This, | |
IN EFI_HANDLE Controller, | |
IN UINTN NumberOfChildren, | |
IN EFI_HANDLE *ChildHandleBuffer | |
); | |
EFI_STATUS SiI3132AtaPassThruCommand ( | |
IN SATA_SI3132_INSTANCE *pSataSiI3132Instance, | |
IN SATA_SI3132_PORT *pSataPort, | |
IN UINT16 PortMultiplierPort, | |
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet, | |
IN EFI_EVENT Event OPTIONAL | |
); | |
/** | |
* EFI ATA Pass Thru Protocol | |
*/ | |
EFI_STATUS SiI3132AtaPassThru ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN UINT16 Port, | |
IN UINT16 PortMultiplierPort, | |
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet, | |
IN EFI_EVENT Event OPTIONAL | |
); | |
EFI_STATUS SiI3132GetNextPort ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN OUT UINT16 *Port | |
); | |
EFI_STATUS SiI3132GetNextDevice ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN UINT16 Port, | |
IN OUT UINT16 *PortMultiplierPort | |
); | |
EFI_STATUS SiI3132BuildDevicePath ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN UINT16 Port, | |
IN UINT16 PortMultiplierPort, | |
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath | |
); | |
EFI_STATUS SiI3132GetDevice ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, | |
OUT UINT16 *Port, | |
OUT UINT16 *PortMultiplierPort | |
); | |
EFI_STATUS SiI3132ResetPort ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN UINT16 Port | |
); | |
EFI_STATUS SiI3132ResetDevice ( | |
IN EFI_ATA_PASS_THRU_PROTOCOL *This, | |
IN UINT16 Port, | |
IN UINT16 PortMultiplierPort | |
); | |
#endif |