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 /ReferenceCode/RapidStart/Include/RapidStartAhciReg.h | |
download | zprj-b7c51c9cf4864df6aabb99a1ae843becd577237c.tar.xz |
Diffstat (limited to 'ReferenceCode/RapidStart/Include/RapidStartAhciReg.h')
-rw-r--r-- | ReferenceCode/RapidStart/Include/RapidStartAhciReg.h | 163 |
1 files changed, 163 insertions, 0 deletions
diff --git a/ReferenceCode/RapidStart/Include/RapidStartAhciReg.h b/ReferenceCode/RapidStart/Include/RapidStartAhciReg.h new file mode 100644 index 0000000..8e85370 --- /dev/null +++ b/ReferenceCode/RapidStart/Include/RapidStartAhciReg.h @@ -0,0 +1,163 @@ +/** @file + Header file for Registers and Structure definitions + +@copyright + Copyright (c) 1999 - 2012 Intel Corporation. All rights reserved + This software and associated documentation (if any) is furnished + under a license and may only be used or copied in accordance + with the terms of the license. Except as permitted by such + license, no part of this software or documentation may be + reproduced, stored in a retrieval system, or transmitted in any + form or by any means without the express written consent of + Intel Corporation. + + This file contains an 'Intel Peripheral Driver' and uniquely + identified as "Intel Reference Module" and is + licensed for Intel CPUs and chipsets under the terms of your + license agreement with Intel or your vendor. This file may + be modified by the user, subject to additional terms of the + license agreement +**/ +#ifndef RAPID_START_AHCIREG_H_ +#define RAPID_START_AHCIREG_H_ + +#define SECTOR_SIZE 0x200 +#define SECTOR_SHIFT 9 + +#define MEM_TO_SECT(mem) ((UINT32) RShiftU64 ((mem), SECTOR_SHIFT)) + +// +// Known issues with 3rd party SSDs : some 3rd party SSD was not compliant with the ATA spec (transfer size of 0 sector issue) +// We have seen it on more than one vendor's drive so far, +// The w/a does not cause performance issue to our code or any special checks +// #define AHCI_MAX_SECTORS 0x10000 +// +#define AHCI_MAX_SECTORS 0xFF80 +#define AHCI_MAX_TRANSFER (SECTOR_SIZE * AHCI_MAX_SECTORS) + +#define AHCI_NO_DATA 0 +#define AHCI_DIR_HOST2DEV 1 +#define AHCI_DIR_DEV2HOST 0 + +#define ATA_CMD_IDENTIFY_DEVICE 0xEC +#define ATA_CMD_READ_DMA_EXT 0x25 +#define ATA_CMD_WRITE_DMA_EXT 0x35 +#define ATA_CMD_WRITE_DMA_FUA_EXT 0x3D +#define ATA_CMD_STANDBY_IMMEDIATE 0xE0 +#define ATA_CMD_DATA_SET_MANAGEMENT 0x06 +#define V_ATA_TRIM_FEATURE 0x01 + +#define ATA_CMD_SECURITY_UNLOCK 0xF2 +#define ATA_CMD_SECURITY_FREEZE_LOCK 0xF5 +#define ATA_CMD_SECURITY_SET_PASSWORD 0xF1 +#define ATA_CMD_FLUSH_CACHE 0xE7 + +#define ATA_CMD_SET_FEATURES 0xEF +#define V_ATA_FEATURE_ENABLE 0x10 +#define V_ATA_FEATURE_DISABLE 0x90 +#define ATA_CMD_READ_LOG_EXT 0x2F + +#define ATA_ID_DEV_HYBRID_FEATURE_SUPPORT 78 +#define B_ATA_ID_DEV_HYBRID_FEATURE_SUPPORT BIT9 +#define ATA_ID_DEV_HYBRID_FEATURE_ENABLE 79 +#define B_ATA_ID_DEV_HYBRID_FEATURE_ENABLE BIT9 + +#define ATA_ID_DEV_DATA_SET_MGMNT_BLOCKS 105 +#define ATA_ID_DEV_DATA_SET_MGMNT_SUPPORT 169 +#define B_ATA_ID_DEV_DATA_SET_TRIM 0x01 + +#define ATA_ID_DEV_SECURITY_STATUS 128 +#define B_ATA_ID_DEV_SEC_SUPPORTED 0x01 +#define B_ATA_ID_DEV_SEC_ENABLED 0x02 +#define B_ATA_ID_DEV_SEC_LOCKED 0x04 +#define B_ATA_ID_DEV_SEC_FROZEN 0x08 +#define B_ATA_ID_DEV_SEC_COUNT_EXP 0x10 + +#define ALIGN(v, a) ((((v) - 1) | ((a) - 1)) + 1) + +#define AHCI_HBA_SIZE 0x100 +#define AHCI_PORT_SIZE 0x80 +#define AHCI_PORT_BASE_X(Ahci, port) (Ahci->Abar + AHCI_HBA_SIZE + AHCI_PORT_SIZE * port) +#define AHCI_PORT_BASE(Ahci) AHCI_PORT_BASE_X (Ahci, Ahci->Port) +#define AHCI_MAX_CMD 16 +#define AHCI_CMD_HEADER_SIZE 0x20 +#define AHCI_CMD_LIST_BASE(Ahci) (Ahci->PortBase) +#define AHCI_CMD_LIST_SIZE (AHCI_MAX_CMD * AHCI_CMD_HEADER_SIZE) + +#define AHCI_RXFIS_BASE(Ahci) ALIGN ((AHCI_CMD_LIST_BASE (Ahci) + AHCI_CMD_LIST_SIZE), 0x100) ///< align 256 +#define AHCI_RXFIS_SIZE 0x100 +#define AHCI_CMD_TABLE_BASE(Ahci) ALIGN ((AHCI_RXFIS_BASE (Ahci) + AHCI_RXFIS_SIZE), 0x80) ///< align 128 +#define AHCI_CMD_TABLE_HEADER_SIZE 0x80 +#define AHCI_MAX_PRDT 8192 ///< We need 8192 PRT entries of 4KB transfer size for single 32MB command +#define AHCI_PRD_SIZE 0x10 +#define AHCI_CMD_TABLE_SIZE (AHCI_CMD_TABLE_HEADER_SIZE + AHCI_PRD_SIZE * AHCI_MAX_PRDT) + +#define AHCI_CMD_HEADER(Ahci, cmd) (AHCI_CMD_LIST_BASE (Ahci) + (cmd) * AHCI_CMD_HEADER_SIZE) +#define AHCI_CMD_TABLE(Ahci, cmd) (AHCI_CMD_TABLE_BASE (Ahci) + (cmd) * AHCI_CMD_TABLE_SIZE) ///< align 128 + +#define AHCI_ID_BLOCK_SIZE SECTOR_SIZE +#define AHCI_ID_BLOCK(Ahci) (AHCI_CMD_TABLE (Ahci, AHCI_MAX_CMD)) + +#define AHCI_TMP_BLOCK_SIZE SECTOR_SIZE +#define AHCI_TMP_BLOCK(Ahci) (AHCI_ID_BLOCK (Ahci) + AHCI_ID_BLOCK_SIZE) + +#define AHCI_MEM_MAX(Ahci) (AHCI_TMP_BLOCK (Ahci) + AHCI_TMP_BLOCK_SIZE) +#define AHCI_MEM_MAX_SIZE (AHCI_TMP_BLOCK_SIZE + \ + AHCI_ID_BLOCK_SIZE + \ + AHCI_MAX_CMD * \ + AHCI_CMD_TABLE_SIZE + \ + AHCI_RXFIS_SIZE + \ + AHCI_CMD_LIST_SIZE \ + ) + +#define AHCI_INIT_WAIT 10000 ///< us +#define AHCI_INIT_TIMEOUT 10000000 ///< us +#define AHCI_INIT_RETRY_COUNT 3 +#define AHCI_CMD_WAIT 100 ///< us +#define AHCI_CMD_TIMEOUT 20000000 ///< us + +#define AHCI_CMD_PRDTL(prdtl) ((prdtl) << 16) +#define AHCI_CMD_CFL(cfl) ((cfl) & 0x0F) +#define AHCI_CMD_WRITE BIT6 +#define AHCI_CMD_PREFETCHABLE BIT7 + +#define AHCI_REGION_MAX 0x400000 ///< 4MB +#define R_PCH_SATA_AHCI_PXCLB 0x000 +#define R_PCH_SATA_AHCI_PXCLBU 0x004 +#define R_PCH_SATA_AHCI_PXFB 0x008 +#define R_PCH_SATA_AHCI_PXFBU 0x00C +#define R_PCH_SATA_AHCI_PXIS 0x010 +#define R_PCH_SATA_AHCI_PXIE 0x014 +#define R_PCH_SATA_AHCI_PXCMD 0x018 +#define R_PCH_SATA_AHCI_PXTFD 0x020 +#define B_PCH_SATA_AHCI_PXTFD_STS_ERR BIT0 +#define B_PCH_SATA_AHCI_PXTFD_STS_DRQ BIT3 +#define B_PCH_SATA_AHCI_PXTFD_STS_BSY BIT7 +#define R_PCH_SATA_AHCI_PXSIG 0x024 +#define R_PCH_SATA_AHCI_PXSSTS 0x028 +#define B_PCH_SATA_AHCI_PXSSTS_DET 0x0000000F +#define R_PCH_SATA_AHCI_PXSCTL 0x02C +#define R_PCH_SATA_AHCI_PXSERR 0x030 +#define R_PCH_SATA_AHCI_PXSACT 0x034 +#define R_PCH_SATA_AHCI_PXCI 0x038 + +#define B_PCH_SATA_AHCI_PXIS_FATAL (B_PCH_SATA_AHCI_PXIS_HBFS | \ + B_PCH_SATA_AHCI_PXIS_HBDS | \ + B_PCH_SATA_AHCI_PXIS_IFS | \ + B_PCH_SATA_AHCI_PXIS_TFES | \ + B_PCH_SATA_AHCI_PXIS_PCS \ + ) + +#define AHCI_ERROR(PxBase) ((MmioRead32 ((PxBase) + R_PCH_SATA_AHCI_PXIS) & B_PCH_SATA_AHCI_PXIS_FATAL) != 0) + +#define SATA_FIS_HOST2DEVICE 0x27 +#define SATA_FIS_C 0x8000 +#define SATA_FIS_CMD(cmd) (((cmd) & 0xFF) << 16) +#define SATA_FIS_DEV_LBA 0x40000000 +#define SATA_FIS_LBA(lba) ((UINT32) ((lba) & 0x00FFFFFF)) +#define SATA_FIS_LBA_EXP(lba) ((UINT32) RShiftU64 ((lba), 24) & 0x00FFFFFF) +#define SATA_FIS_SECT_COUNT(count) ((UINT16) (count)) +#define SATA_FIS_FEAT(feat) ((((UINT16) (feat)) & 0xFF) << 24) +#define SATA_FIS_FEAT_EXP(feat) ((((UINT16) (feat)) & 0xFF00) << 16) + +#endif |