diff options
author | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
---|---|---|
committer | raywu <raywu0301@gmail.com> | 2018-06-15 00:00:50 +0800 |
commit | b7c51c9cf4864df6aabb99a1ae843becd577237c (patch) | |
tree | eebe9b0d0ca03062955223097e57da84dd618b9a /Core/EM/Ahci/AhciController.h | |
download | zprj-master.tar.xz |
Diffstat (limited to 'Core/EM/Ahci/AhciController.h')
-rw-r--r-- | Core/EM/Ahci/AhciController.h | 633 |
1 files changed, 633 insertions, 0 deletions
diff --git a/Core/EM/Ahci/AhciController.h b/Core/EM/Ahci/AhciController.h new file mode 100644 index 0000000..9ec5e75 --- /dev/null +++ b/Core/EM/Ahci/AhciController.h @@ -0,0 +1,633 @@ +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//********************************************************************** + +//********************************************************************** +// $Header: /Alaska/SOURCE/Modules/AHCI/AhciController.h 9 11/13/13 1:52a Divyac $ +// +// $Revision: 9 $ +// +// $Date: 11/13/13 1:52a $ +//********************************************************************** +// Revision History +// ---------------- +// $Log: /Alaska/SOURCE/Modules/AHCI/AhciController.h $ +// +// 9 11/13/13 1:52a Divyac +// [TAG] EIP143018 +// [Category] Improvement +// [Description] Removed the EIP 128912 changes and checked-in again. +// EIP 128912 changes creates lot more side effect, so we planed to remove +// the changes. +// [Files] AhciController.h +// +// 8 7/23/13 11:56p Srikantakumarp +// [TAG] EIP129989 +// [Category] Improvement +// [Description] Added DIPM support in Aptio 4.x AHCIBUS driver. +// [Files] AhciBus.c, AhciBus.h, AhciController.h, AhciSrc.sdl, +// PAhciBus.h +// +// 7 7/18/13 7:35a Rameshr +// [TAG] EIP128912 +// [Category] Improvement +// [Description] 10b to 8b decode error is mentioned as Diagnostic error +// for use by Diagnostic software, So removed this error status checking +// [Files] AhciController.h +// +// 6 7/17/13 10:40a Rameshr +// [TAG] EIP128912 +// [Category] Improvement +// [Description] 10b to 8b decode error is mentioned as Diagnostic error +// for use by Diagnostic software, So removed this error status checking. +// [Files] AhciController.h +// +// 5 2/10/11 10:35a Rameshr +// [TAG] EIP53704 +// [Category] Improvement +// [Description] AMI headers update for Alaska Ahci Driver +// [Files] AhciSrc.mak +// AhciBus.c +// AhciController.c +// AhciComponentName.c +// AhciBus.h +// AhciController.h +// +// 4 5/07/10 11:45a Krishnakumarg +// Coding standard update +// +// 3 7/09/09 4:50p Fasihm +// Fixed the Read/Write failure when ALPE is Enabled. +// +// 2 5/28/08 9:39a Rameshraju +// Based on the SDL token index/data or MMIO method used to access the +// AHCI configuration space. +// +// 1 28/02/08 6:03p Anandakrishnanl +// AHCI Bus Driver initial check-in. +// +//********************************************************************** +//<AMI_FHDR_START> +// +// Name: AhciController.h +// +// Description: +// +//<AMI_FHDR_END> +//********************************************************************** + +// Forward reference for pure ANSI compatability +typedef struct _AHCI_COMMAND_FIS AHCI_COMMAND_FIS; +typedef struct _AHCI_ATAPI_COMMAND AHCI_ATAPI_COMMAND; +typedef struct _AHCI_COMMAND_PRDT AHCI_COMMAND_PRDT; + +#pragma pack(1) + +// Command List Structure +typedef struct { + UINT32 Ahci_Cmd_CFL:5; + UINT32 Ahci_Cmd_A:1; + UINT32 Ahci_Cmd_W:1; + UINT32 Ahci_Cmd_P:1; + UINT32 Ahci_Cmd_R:1; + UINT32 Ahci_Cmd_B:1; + UINT32 Ahci_Cmd_C:1; + UINT32 Ahci_Cmd_Rsvd1:1; + UINT32 Ahci_Cmd_PMP:4; + UINT32 Ahci_Cmd_PRDTL:16; + UINT32 Ahci_Cmd_PRDBC; + UINT32 Ahci_Cmd_CTBA; + UINT32 Ahci_Cmd_CTBAU; + UINT32 Ahci_Cmd_Rsvd2[4]; +} AHCI_COMMAND_LIST; + +typedef struct { + UINT8 Ahci_Dsfis[0x1C]; // DMA Setup Fis + UINT8 Ahci_Dsfis_Rsvd[0x04]; + UINT8 Ahci_Psfis[0x14]; // PIO Setip Fis + UINT8 Ahci_Psfis_Rsvd[0x0C]; + UINT8 Ahci_Rfis[0x14]; // D2H Register Fis + UINT8 Ahci_Rfis_Rsvd[0x04]; + UINT64 Ahci_Sdbfis; // Set Device Bits Fis + UINT8 Ahci_Ufis[0x40]; // Unkonw FIS + UINT8 Ahci_Ufis_Rsvd[0x60]; +} AHCI_RECEIVED_FIS; + +// Register - Host to Device FIS Layout +typedef struct _AHCI_COMMAND_FIS{ + UINT8 Ahci_CFis_Type; + UINT8 AHci_CFis_PmPort:4; + UINT8 Ahci_CFis_Rsvd1:1; + UINT8 Ahci_CFis_Rsvd2:1; + UINT8 Ahci_CFis_Rsvd3:1; + UINT8 Ahci_CFis_C:1; + UINT8 Ahci_CFis_Cmd; + UINT8 Ahci_CFis_Features; + UINT8 Ahci_CFis_SecNum; + UINT8 Ahci_CFis_ClyLow; + UINT8 Ahci_CFis_ClyHigh; + UINT8 Ahci_CFis_DevHead; + UINT8 Ahci_CFis_SecNumExp; + UINT8 Ahci_CFis_ClyLowExp; + UINT8 Ahci_CFis_ClyHighExp; + UINT8 Ahci_CFis_FeaturesExp; + UINT8 Ahci_CFis_SecCount; + UINT8 Ahci_CFis_SecCountExp; + UINT8 Ahci_CFis_Rsvd4; + UINT8 Ahci_CFis_Control; + UINT8 Ahci_CFis_Rsvd5[4]; + UINT8 Ahci_CFis_Rsvd6[44]; +} AHCI_COMMAND_FIS; + +// Physical Region Descriptor Table +typedef struct _AHCI_COMMAND_PRDT{ + UINT32 Ahci_Prdt_DBA; + UINT32 Ahci_Prdt_DBAU; + UINT32 Ahci_Prdt_Rsvd; + UINT32 Ahci_Prdt_DBC:22; + UINT32 Ahci_Prdt_Rsvd1:9; + UINT32 Ahci_Prdt_I:1; +} AHCI_COMMAND_PRDT; + +// Command table + +typedef struct _AHCI_COMMAND_TABLE{ + AHCI_COMMAND_FIS CFis; + AHCI_ATAPI_COMMAND AtapiCmd; + UINT8 Rsvd[0x30]; + AHCI_COMMAND_PRDT PrdtTable; +} AHCI_COMMAND_TABLE; + +typedef struct _AHCI_COMMAND_TABLE_NO_PRDT{ + AHCI_COMMAND_FIS CFis; + AHCI_ATAPI_COMMAND AtapiCmd; + UINT8 Rsvd[0x30]; +} AHCI_COMMAND_TABLE_NO_PRDT; + +#pragma pack() + +#define ATA_SIGNATURE_32 0x00000101 +#define ATAPI_SIGNATURE_32 0xEB140101 +#define PMPORT_SIGNATURE 0x96690101 +#define PRD_MAX_DATA_COUNT 0x400000 + + + +#define PCI_ABAR 0x24 +#define RECEIVED_FIS_SIZE 0x100 + +#define CONTROL_PORT 0x0F + +//Generic Host Control Registers +#define HBA_CAP 0x0000 +#define HBA_CAP_NP_MASK 0x1F +#define HBA_CAP_EMS BIT06 +#define HBA_CAP_PSC BIT13 +#define HBA_CAP_SSC BIT14 +#define HBA_CAP_PMD BIT15 +#define HBA_CAP_FBSS BIT16 +#define HBA_CAP_SPM BIT17 +#define HBA_CAP_SAM BIT18 +#define HBA_CAP_SNZO BIT19 +#define HBA_CAP_ISS_MASK (BIT20 | BIT21 | BIT22 | BIT23) +#define HBA_CAP_SCLO BIT24 +#define HBA_CAP_SAL BIT25 +#define HBA_CAP_SALP BIT26 +#define HBA_CAP_SSS BIT27 +#define HBA_CAP_SMPS bit28 +#define HBA_CAP_SSNTF BIT29 +#define HBA_CAP_SCQA BIT30 +#define HBA_CAP_S64A BIT31 + +#define HBA_GHC 0x0004 +#define HBA_GHC_RESET 0x0001 +#define HBA_GHC_IE 0x0002 +#define HBA_GHC_AE 0x80000000 +#define HBA_GHC_AE_RESET 0x80000001 +#define HBA_IS 0x0008 +#define HBA_PI 0x000C +#define HBA_VS 0x0010 +#define HBA_CCC_CTL 0x0014 +#define HBA_CCC_PORTS 0x0018 +#define HBA_EM_LOC 0x001C +#define HBA_EM_CTL 0x0020 +#define HBA_CAP2 0x0024 +#define HBA_CAP2_APST 0x0004 +#define HBA_CAP2_SDS 0x0008 +#define HBA_CAP2_SADM 0x0010 +#define HBA_CAP2_DESO 0x0020 + +//Port Registers +#define HBA_PORTS_START 0x0100 +#define HBA_PORTS_REG_WIDTH 0x0080 +#define HBA_PORTS_CLB 0x0000 +#define HBA_PORTS_CLBU 0x0004 +#define HBA_PORTS_FB 0x0008 +#define HBA_PORTS_FBU 0x000C +#define HBA_PORTS_IS 0x0010 +#define HBA_PORTS_IS_DHRS BIT00 +#define HBA_PORTS_IS_PSS BIT01 +#define HBA_PORTS_IS_SSS BIT02 +#define HBA_PORTS_IS_SDBS BIT03 +#define HBA_PORTS_IS_UFS BIT04 +#define HBA_PORTS_IS_DPS BIT05 +#define HBA_PORTS_IS_PCS BIT06 +#define HBA_PORTS_IS_DIS BIT07 +#define HBA_PORTS_IS_PRCS BIT22 +#define HBA_PORTS_IS_IPMS BIT23 +#define HBA_PORTS_IS_OFS BIT24 +#define HBA_PORTS_IS_INFS BIT26 +#define HBA_PORTS_IS_IFS BIT27 +#define HBA_PORTS_IS_HBDS BIT28 +#define HBA_PORTS_IS_HBFS BIT29 +#define HBA_PORTS_IS_TFES BIT30 +#define HBA_PORTS_IS_CPDS BIT31 +#define HBA_PORTS_IS_CLEAR 0xFFC000FF +#define HBA_PORTS_IS_FIS_CLEAR 0x0000001F +#define HBA_PORTS_IS_ERR_CHK BIT04 + BIT06 + BIT23 + BIT24 + BIT27 + \ + BIT28 + BIT29 + BIT30 + BIT31 + +#define HBA_PORTS_IE 0x0014 +#define HBA_PORTS_CMD 0x0018 +#define HBA_PORTS_CMD_ST_MASK 0xFFFFFFFE +#define HBA_PORTS_CMD_ST BIT00 +#define HBA_PORTS_CMD_SUD BIT01 +#define HBA_PORTS_CMD_POD BIT02 +#define HBA_PORTS_CMD_CLO BIT03 +#define HBA_PORTS_CMD_CR BIT15 +#define HBA_PORTS_CMD_FRE BIT04 +#define HBA_PORTS_CMD_FR BIT14 +#define HBA_PORTS_CMD_MASK ~(HBA_PORTS_CMD_ST | HBA_PORTS_CMD_FRE | HBA_PORTS_CMD_CLO) +#define HBA_PORTS_CMD_PMA BIT17 +#define HBA_PORTS_CMD_HPCP BIT18 +#define HBA_PORTS_CMD_MPSP BIT19 +#define HBA_PORTS_CMD_CPD BIT20 +#define HBA_PORTS_CMD_ESP BIT21 +#define HBA_PORTS_CMD_ATAPI BIT24 +#define HBA_PORTS_CMD_DLAE BIT25 +#define HBA_PORTS_CMD_ALPE BIT26 +#define HBA_PORTS_CMD_ASP BIT27 +#define HBA_PORTS_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) +#define HBA_PORTS_CMD_ACTIVE (1 << 28 ) +#define HBA_PORTS_TFD 0x0020 +#define HBA_PORTS_TFD_MASK (BIT07 | BIT03 | BIT00) +#define HBA_PORTS_TFD_BSY BIT07 +#define HBA_PORTS_TFD_DRQ BIT03 +#define HBA_PORTS_TFD_ERR BIT00 +#define HBA_PORTS_TFD_ERR_MASK 0x00FF00 // BIT8 - BIT15 +#define HBA_PORTS_SIG 0x0024 +#define HBA_PORTS_SSTS 0x0028 +#define HBA_PORTS_SSTS_DET_MASK 0x000F +#define HBA_PORTS_SSTS_DET 0x0001 +#define HBA_PORTS_SSTS_DET_PCE 0x0003 +#define HBA_PORTS_SSTS_SPD_MASK 0x00F0 +#define HBA_PORTS_SCTL 0x002C +#define HBA_PORTS_SCTL_DET_MASK 0x000F +#define HBA_PORTS_SCTL_MASK (~HBA_PORTS_SCTL_DET_MASK) +#define HBA_PORTS_SCTL_DET_INIT 0x0001 +#define HBA_PORTS_SCTL_DET_PHYCOMM 0x0003 +#define HBA_PORTS_SCTL_SPD_MASK 0x00F0 +#define HBA_PORTS_SCTL_SPD_NSNR 0x0 +#define HBA_PORTS_SCTL_SPD_GEN1 0x1 +#define HBA_PORTS_SCTL_SPD_GEN2 0x2 +#define HBA_PORTS_SCTL_SPD_GEN3 0x3 +#define HBA_PORTS_SCTL_IPM_MASK 0x0F00 +#define HBA_PORTS_SCTL_IPM_DIS 0x00 +#define HBA_PORTS_SCTL_IPM_PSD 0x01 +#define HBA_PORTS_SCTL_IPM_SSD 0x02 +#define HBA_PORTS_SCTL_IPM_PSSD 0x03 +#define HBA_PORTS_SCTL_IPM_PSD_SSD 0x0300 +#define HBA_PORTS_SERR 0x0030 +#define HBA_PORTS_SERR_RDIE BIT00 +#define HBA_PORTS_SERR_RCE BIT01 +#define HBA_PORTS_SERR_TDIE BIT08 +#define HBA_PORTS_SERR_PCDIE BIT09 +#define HBA_PORTS_SERR_PE BIT10 +#define HBA_PORTS_SERR_IE BIT11 +#define HBA_PORTS_SERR_PRC BIT16 +#define HBA_PORTS_SERR_PIE BIT17 +#define HBA_PORTS_SERR_CW BIT18 +#define HBA_PORTS_SERR_BDE BIT19 +#define HBA_PORTS_SERR_DE BIT20 // Not used +#define HBA_PORTS_SERR_CRCE BIT21 +#define HBA_PORTS_SERR_HE BIT22 +#define HBA_PORTS_SERR_LSE BIT23 +#define HBA_PORTS_SERR_TSTE BIT24 +#define HBA_PORTS_SERR_UFT BIT25 +#define HBA_PORTS_SERR_EX BIT26 +#define HBA_PORTS_PxSACT 0x0034 +#define HBA_PORTS_PxCI 0x0038 +#define HBA_PORTS_PxDEVSLP 0x0044 +#define HBA_PORTS_PxDEVSLP_ADSE BIT00 +#define HBA_PORTS_PxDEVSLP_DSP BIT01 +#define HBA_PORTS_PxDEVSLP_DETO_MASK (0x000003FC) +#define HBA_PORTS_PxDEVSLP_DMDAT_MASK (0x00007C00) +#define HBA_PORTS_PxDEVSLP_DITO_MASK (0x01FF8000) +#define HBA_PORTS_PxDEVSLP_DM_MASK (0x1E000000) + +#define HBA_PORTS_ERR_CHK (HBA_PORTS_SERR_TDIE + HBA_PORTS_SERR_PCDIE +\ + HBA_PORTS_SERR_PE + HBA_PORTS_SERR_IE + \ + HBA_PORTS_SERR_PIE + \ + HBA_PORTS_SERR_BDE + \ + HBA_PORTS_SERR_DE + HBA_PORTS_SERR_CRCE + \ + HBA_PORTS_SERR_HE + HBA_PORTS_SERR_LSE + \ + HBA_PORTS_SERR_TSTE + HBA_PORTS_SERR_UFT + \ + HBA_PORTS_SERR_EX) + +#define HBA_PORTS_ERR_CLEAR (HBA_PORTS_SERR_RDIE + HBA_PORTS_SERR_RCE +\ + HBA_PORTS_SERR_TDIE + HBA_PORTS_SERR_PCDIE +\ + HBA_PORTS_SERR_PE + HBA_PORTS_SERR_IE + \ + HBA_PORTS_SERR_PRC + HBA_PORTS_SERR_PIE + \ + HBA_PORTS_SERR_CW + HBA_PORTS_SERR_BDE + \ + HBA_PORTS_SERR_DE + HBA_PORTS_SERR_CRCE + \ + HBA_PORTS_SERR_HE + HBA_PORTS_SERR_LSE + \ + HBA_PORTS_SERR_TSTE + HBA_PORTS_SERR_UFT + \ + HBA_PORTS_SERR_EX) +#define HBA_PORTS_SACT 0x0034 +#define HBA_PORTS_CI 0x0038 +#define HBA_PORTS_SNTF 0x003C + +//FIS Types +#define D2H_FIS_OFFSET 0x40 +#define DMA_FIS_OFFSET 0x00 +#define PIO_FIS_OFFSET 0x20 +#define SDB_FIS_OFFSET 0x58 +#define FIS_TYPE_MASK 0xFF +#define U_FIS_OFFSET 0x60 + +#define FIS_REGISTER_H2D 0x27 // Host To Device +#define FIS_REGISTER_H2D_LENGTH 20 +#define FIS_REGISTER_D2H 0x34 // Device To Host +#define FIS_REGISTER_D2H_LENGTH 20 // Device To Host +#define FIS_DMA_ACTIVATE 0x39 // Device To Host +#define FIS_DMA_ACTIVATE_LENGTH 4 +#define FIS_DMA_SETUP 0x41 // Bi-directional +#define FIS_DMA_SETUP_LENGTH 28 +#define FIS_DATA 0x46 // Bi-directional +#define FIS_BIST 0x58 // Bi-directional +#define FIS_BIST_LENGTH 12 +#define FIS_PIO_SETUP 0x5F // Device To Host +#define FIS_PIO_SETUP_LENGTH 20 +#define FIS_SET_DEVICE 0xA1 // Device To Host +#define FIS_SET_DEVICE_LENGTH 8 + + +#define READ_PORT_MULTIPLIER 0xE4 +#define WRITE_PORT_MULTIPLIER 0xE8 + +#define GSCR_0 0x00 +#define GSCR_1 0x01 +#define GSCR_2 0x02 +#define GSCR_32 32 +#define GSCR_64 64 +#define GSCR_96 96 + +#define PSCR_0_SSTATUS 0x00 +#define PSCR_1_SERROR 0x01 +#define PSCR_2_SCONTROL 0x02 + + +#define HBA_CR_CLEAR_TIMEOUT 500 // AHCI 1.2 spec 10.1.2 +#define HBA_FR_CLEAR_TIMEOUT 500 // AHCI 1.2 spec 10.1.2 +#define HBA_PRESENCE_DETECT_TIMEOUT 10 // 10msec Serial ATA 1.0 Sec 5.2 + +#if INDEX_DATA_PORT_ACCESS + + // + //Index , Data port access + // + +#define HBA_PORT_REG_BASE(Port) \ + (UINTN) (Port * HBA_PORTS_REG_WIDTH + HBA_PORTS_START) + +#define HBA_REG32( BaseAddr, Register ) \ + (ReadDataDword ((BaseAddr), (Register))) + +#define HBA_WRITE_REG32( BaseAddr, Register, Data ) \ + (WriteDataDword( BaseAddr, Register, Data )) + +#define HBA_REG16( BaseAddr, Register ) \ + (ReadDataWord( BaseAddr, Register )) + +#define HBA_WRITE_REG16( BaseAddr, Register, Data ) \ + (WriteDataWord( BaseAddr, Register, Data )) + +#define HBA_REG8( BaseAddr, Register ) \ + (ReadDataByte ((BaseAddr), (Register))) + +#define HBA_WRITE_REG8( BaseAddr, Register, Data ) \ + (WriteDataByte( BaseAddr, Register, Data )) + +#define HBA_REG8_OR( BaseAddr, Register, OrData) \ + HBA_WRITE_REG8(BaseAddr, Register, ((HBA_REG8 ((BaseAddr), (Register))) | ((UINT8) (OrData)))) + +#define HBA_REG16_OR( BaseAddr, Register, OrData) \ + HBA_WRITE_REG16(BaseAddr, Register, ((HBA_REG16 ((BaseAddr), (Register))) | ((UINT16) (OrData)))) + +#define HBA_REG32_OR( BaseAddr, Register, OrData) \ + HBA_WRITE_REG32(BaseAddr, Register, ((HBA_REG32 ((BaseAddr), (Register))) | ((UINT32) (OrData)))) + +#define HBA_REG8_AND( BaseAddr, Register, AndData) \ + HBA_WRITE_REG8(BaseAddr, Register, ((HBA_REG8 ((BaseAddr), (Register))) & ((UINT8) (AndData)))) + +#define HBA_REG16_AND( BaseAddr, Register, AndData) \ + HBA_WRITE_REG16(BaseAddr, Register, ((HBA_REG16 ((BaseAddr), (Register))) & ((UINT16) (AndData)))) + +#define HBA_REG32_AND( BaseAddr, Register, AndData) \ + HBA_WRITE_REG32(BaseAddr, Register, ((HBA_REG32 ((BaseAddr), (Register))) & ((UINT32) (AndData)))) + +#define HBA_REG8_AND_OR( BaseAddr, Register, AndData, OrData) \ + HBA_WRITE_REG8(BaseAddr, Register, ((HBA_REG8 ((BaseAddr), (Register))) & ((UINT8) (AndData)) | ((UINT8) (OrData)))) + +#define HBA_REG16_AND_OR( BaseAddr, Register, AndData, OrData) \ + HBA_WRITE_REG16(BaseAddr, Register, ((HBA_REG16 ((BaseAddr), (Register))) & ((UINT16) (AndData)) | ((UINT16) (OrData)))) + +#define HBA_REG32_AND_OR( BaseAddr, Register,AndData, OrData) \ + HBA_WRITE_REG32(BaseAddr, Register, ((HBA_REG32 ((BaseAddr), (Register))) & ((UINT32) (AndData)) | ((UINT32) (OrData)))) + +//Ports +#define HBA_PORT_REG8(BaseAddr, Port, Register) \ + (HBA_REG8 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)))) + +#define HBA_PORT_REG16(BaseAddr, Port, Register) \ + (HBA_REG16 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)))) + +#define HBA_PORT_REG32(BaseAddr, Port, Register) \ + (HBA_REG32 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)))) + +#define HBA_PORT_WRITE_REG8(BaseAddr, Port, Register, Data) \ + (HBA_WRITE_REG8 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), Data)) + +#define HBA_PORT_WRITE_REG16(BaseAddr, Port, Register, Data) \ + (HBA_WRITE_REG16 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)),Data)) + +#define HBA_PORT_WRITE_REG32(BaseAddr, Port, Register,Data) \ + (HBA_WRITE_REG32 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)),Data)) + +#define HBA_PORT_REG8_OR(BaseAddr, Port, Register, OrData) \ + (HBA_REG8_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (OrData))) + +#define HBA_PORT_REG16_OR(BaseAddr, Port, Register, OrData) \ + (HBA_REG16_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (OrData))) + +#define HBA_PORT_REG32_OR(BaseAddr, Port, Register, OrData) \ + (HBA_REG32_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (OrData))) + +#define HBA_PORT_REG8_AND(BaseAddr, Port, Register, AndData) \ + (HBA_REG8_AND ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData))) + +#define HBA_PORT_REG16_AND(BaseAddr, Port, Register, AndData) \ + (HBA_REG16_AND ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData))) + +#define HBA_PORT_REG32_AND(BaseAddr, Port, Register, AndData) \ + (HBA_REG32_AND ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData))) + +#define HBA_PORT_REG8_AND_OR(BaseAddr, Port, Register, AndData, OrData) \ + (HBA_REG8_AND_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData), (OrData))) + +#define HBA_PORT_REG16_AND_OR(BaseAddr, Port, Register, AndData, OrData) \ + (HBA_REG16_AND_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData), (OrData))) + +#define HBA_PORT_REG32_AND_OR(BaseAddr, Port, Register, AndData, OrData) \ + (HBA_REG32_AND_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData), (OrData))) + +#else + // + //MMIO Access + // +#define MmAddress( BaseAddr, Register ) \ + ((UINTN)(BaseAddr) + \ + (UINTN)(Register) \ + ) +#define Mm32Ptr( BaseAddr, Register ) \ + ((volatile UINT32 *)MmAddress (BaseAddr, Register )) + +#define Mm16Ptr( BaseAddr, Register ) \ + ((volatile UINT16 *)MmAddress (BaseAddr, Register )) + +#define Mm8Ptr( BaseAddr, Register ) \ + ((volatile UINT8 *)MmAddress (BaseAddr, Register )) + +//HBA Generic +#define HBA_PORT_REG_BASE(Port) \ + (UINTN) (Port * HBA_PORTS_REG_WIDTH + HBA_PORTS_START) + +#define HBA_REG32( BaseAddr, Register ) \ + (*Mm32Ptr ((BaseAddr), (Register))) + +#define HBA_REG16( BaseAddr, Register ) \ + (*Mm16Ptr ((BaseAddr), (Register))) + +#define HBA_REG8( BaseAddr, Register ) \ + (*Mm8Ptr ((BaseAddr), (Register))) + +#define HBA_WRITE_REG32( BaseAddr, Register, Data ) \ + (HBA_REG32 ((BaseAddr), (Register))) = ((UINT32) (Data)) + +#define HBA_WRITE_REG16( BaseAddr, Register, Data ) \ + (HBA_REG16 ((BaseAddr), (Register))) = ((UINT16) (Data)) + +#define HBA_WRITE_REG8( BaseAddr, Register, Data ) \ + (HBA_REG8 ((BaseAddr), (Register))) = ((UINT8) (Data)) + +#define HBA_REG8_OR( BaseAddr, Register, OrData) \ + (HBA_REG8 ((BaseAddr), (Register))) |= ((UINT8) (OrData)) + +#define HBA_REG16_OR( BaseAddr, Register, OrData) \ + (HBA_REG16 ((BaseAddr), (Register))) |= ((UINT16) (OrData)) + +#define HBA_REG32_OR( BaseAddr, Register, OrData) \ + (HBA_REG32 ((BaseAddr), (Register))) = (HBA_REG32 ((BaseAddr), (Register))) | ((UINT32) (OrData)) + +#define HBA_REG8_AND( BaseAddr, Register, AndData) \ + (HBA_REG8 ((BaseAddr), (Register))) = (HBA_REG8 ((BaseAddr), (Register))) & ((UINT8) (AndData)) + +#define HBA_REG16_AND( BaseAddr, Register, AndData) \ + (HBA_REG16 ((BaseAddr), (Register))) &= ((UINT16) (AndData)) + +#define HBA_REG32_AND( BaseAddr, Register, AndData) \ + (HBA_REG32 ((BaseAddr), (Register))) = (HBA_REG32 ((BaseAddr), (Register))) & ((UINT32) (AndData)) + +#define HBA_REG8_AND_OR( BaseAddr, Register, AndData, OrData) \ + (HBA_REG8 ((BaseAddr), (Register)) = \ + (((HBA_REG8 ((BaseAddr), (Register))) & ((UINT8) (AndData))) | ((UINT8) (OrData)))) + +#define HBA_REG16_AND_OR( BaseAddr, Register, AndData, OrData) \ + (HBA_REG16 ((BaseAddr), (Register)) = \ + (((HBA_REG16 ((BaseAddr), (Register))) & ((UINT16) AndData)) | ((UINT16) (OrData)))) + +#define HBA_REG32_AND_OR( BaseAddr, Register,AndData, OrData) \ + (HBA_REG32 ((BaseAddr), (Register)) = \ + (((HBA_REG32 ((BaseAddr), (Register))) & ((UINT32) (AndData))) | ((UINT32) (OrData)))) + +//Ports +#define HBA_PORT_REG8(BaseAddr, Port, Register) \ + (HBA_REG8 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)))) + +#define HBA_PORT_REG16(BaseAddr, Port, Register) \ + (HBA_REG16 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)))) + +#define HBA_PORT_REG32(BaseAddr, Port, Register) \ + (HBA_REG32 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)))) + +#define HBA_PORT_WRITE_REG8(BaseAddr, Port, Register, Data) \ + (HBA_WRITE_REG8 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), Data)) + +#define HBA_PORT_WRITE_REG16(BaseAddr, Port, Register, Data) \ + (HBA_WRITE_REG16 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)),Data)) + +#define HBA_PORT_WRITE_REG32(BaseAddr, Port, Register,Data) \ + (HBA_WRITE_REG32 ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)),Data)) + +#define HBA_PORT_REG8_OR(BaseAddr, Port, Register, OrData) \ + (HBA_REG8_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (OrData))) + +#define HBA_PORT_REG16_OR(BaseAddr, Port, Register, OrData) \ + (HBA_REG16_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (OrData))) + +#define HBA_PORT_REG32_OR(BaseAddr, Port, Register, OrData) \ + (HBA_REG32_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (OrData))) + +#define HBA_PORT_REG8_AND(BaseAddr, Port, Register, AndData) \ + (HBA_REG8_AND ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData))) + +#define HBA_PORT_REG16_AND(BaseAddr, Port, Register, AndData) \ + (HBA_REG16_AND ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData))) + +#define HBA_PORT_REG32_AND(BaseAddr, Port, Register, AndData) \ + (HBA_REG32_AND ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData))) + +#define HBA_PORT_REG8_AND_OR(BaseAddr, Port, Register, AndData, OrData) \ + (HBA_REG8_AND_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData), (OrData))) + +#define HBA_PORT_REG16_AND_OR(BaseAddr, Port, Register, AndData, OrData) \ + (HBA_REG16_AND_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData), (OrData))) + +#define HBA_PORT_REG32_AND_OR(BaseAddr, Port, Register, AndData, OrData) \ + (HBA_REG32_AND_OR ((BaseAddr), ((Register) + HBA_PORT_REG_BASE (Port)), (AndData), (OrData))) + +#endif + +//********************************************************************** +//********************************************************************** +//** ** +//** (C)Copyright 1985-2013, American Megatrends, Inc. ** +//** ** +//** All Rights Reserved. ** +//** ** +//** 5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093 ** +//** ** +//** Phone: (770)-246-8600 ** +//** ** +//********************************************************************** +//**********************************************************************
\ No newline at end of file |