summaryrefslogtreecommitdiff
path: root/ReferenceCode/RapidStart/Include/RapidStartAhciReg.h
blob: 8e8537056a782b24f4bac83fbff0709217d18577 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
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