summaryrefslogtreecommitdiff
path: root/Core/EM/Nvme/NvmeController.h
blob: 00ebff7f8502d1fe37d1c5f44bec567f53b412d0 (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
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2014, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**         5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093        **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************
//**********************************************************************
// $Header: /Alaska/SOURCE/Modules/NVMe/NvmeController.h 3     5/19/15 7:59a Deepthins $
//
// $Revision: 3 $
//
// $Date: 5/19/15 7:59a $
//**********************************************************************
// Revision History
// ----------------
// $Log: /Alaska/SOURCE/Modules/NVMe/NvmeController.h $
// 
// 3     5/19/15 7:59a Deepthins
// [TAG]  		EIP218059
// [Category]  	Improvement
// [Description]  	Update Aptio4 NVME module to spec v1.2
// [Files]  		AmiNvmeController.h, NvmeController.h
// 
// 2     9/04/14 7:48a Anandakrishnanl
// [TAG]  		EIP180861
// [Category]  	Improvement
// [Description]  	Legacy Boot support in Aptio 4.x Nvme driver
// [Files]  		Nvme.cif	
// Nvme.mak	
// Nvme.uni
// Nvme.chm	
// NvmeSetup.c
// NvmeBus.c
// NvmeComponentName.c
// NvmeIncludes.h
// NvmeBus.h
// [NvmeControllerLib]
// [NvmeSmm]
// [NVMEINT13]
// [NvmeProtocol]
// 
// 1     6/20/14 6:27a Anandakrishnanl
// [TAG]  		EIP172958
// [Category]  	New Feature
// [Description]  	Nvme Driver Intial Checkin
// [Files]  		Nvme.cif
// Nvme.sdl
// Nvme.mak
// Nvme.sd
// Nvme.uni
// Nvme.chm
// NvmeSetup.c
// NvmeBus.c
// NvmeController.c
// NvmeComponentName.c
// NvmeIncludes.h
// NvmeBus.h
// NvmeController.h
// 
//**********************************************************************
//**********************************************************************
//<AMI_FHDR_START>
//
// Name:        NvmeController.h
//
// Description: Nvme Controller related defination
//
//<AMI_FHDR_END>
//**********************************************************************

#ifndef _NVME_CONTROLLER_H_
#define _NVME_CONTROLLER_H_

#ifdef __cplusplus
extern "C" {
#endif

#pragma pack(1)

// Refer to NVM Spec second 3.1 NVMe 1.1 which describes the register map for the controller
#define Offset_Cap      0x0
#define Offset_Version  0x8
#define Offset_Intms    0xC
#define Offset_Intmc    0x10
#define Offset_CC       0x14
#define Offset_CSTS     0x1C
#define CSTS_RDY        0x1
#define CSTS_CFS        0x2
#define Offset_Nssrs    0x20
#define Offset_Aqa      0x24
#define Offset_Asq      0x28
#define Offset_Acq      0x30
#define Offset_CMBLOC   0x38
#define Offset_CMBSZ    0x3C
#define Offset_Admin_Submission_Queue_Tail_DoorBell 0x1000

// Admin Cmd Set Figure 38 NVM Express 1.1
#define DELETE_IO_SUBMISSION_QUEUE  0x00
#define CREATE_IO_SUBMISSION_QUEUE  0x01
#define GET_LOG_PAGE                0x02
#define DELETE_IO_COMPLETION_QUEUE  0x04
#define CREATE_IO_COMPLETION_QUEUE  0x05
#define IDENTIFY                    0x06
#define ABORT                       0x08
#define SET_FEATURES                0x09
#define GET_FEATURES                0x0A
#define ASYNC_EVENT_REQUEST         0x0C
#define NAMESPACE_MANAGEMENT        0x0D
#define FIRMWARE_ACTIVATE           0x10
#define FIRMWARE_IMAGE_DOWNLOAD     0x11
#define NAMESPACE_ATTACHMENT        0x15
#define FORMAT_NVM                  0x80
#define SECURITY_SEND               0x81
#define SECURITY_RECEIVE            0x82

//Figure 149: Opcodes for NVM Commands NVM Express 1.2
#define NVME_FLUSH                  0x00
#define NVME_WRITE                  0x01
#define NVME_READ                   0x02
#define NVME_WRITE_UNCORRECTABLE    0x04
#define NVME_COMPARE                0x05
#define NVME_WRITE_ZEROES           0x08
#define NVME_DATASET_MANAGEMENT     0x09
#define NVME_RESERVATION_REGISTER   0x0D
#define NVME_RESERVATION_REPORT     0x0E
#define NVME_RESERVATION_ACQUIRE    0x11
#define NVME_RESERVATION_RELEASE    0x15


#define QUEUE_DOORBELL_OFFSET(QUEUE_NUM, TAIL_HEAD, DoorBellStride) \
        (0x1000 + (((QUEUE_NUM * 2)  + TAIL_HEAD) *  (4 << DoorBellStride)))

//MMIO Access

#define MmAddress( BaseAddr, Register ) \
        ((UINT64)(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 ))

//Controller Generic Registers

#define CONTROLLER_REG32( BaseAddr, Register ) \
        (*Mm32Ptr ((BaseAddr), (Register)))

#define CONTROLLER_REG16( BaseAddr, Register ) \
        (*Mm16Ptr ((BaseAddr), (Register)))

#define CONTROLLER_REG8( BaseAddr, Register ) \
        (*Mm8Ptr ((BaseAddr), (Register)))

#define CONTROLLER_WRITE_REG32( BaseAddr, Register, Data ) \
        (CONTROLLER_REG32 ((BaseAddr), (Register))) = ((UINT32) (Data))

#define CONTROLLER_WRITE_REG16( BaseAddr, Register, Data ) \
        (CONTROLLER_REG16 ((BaseAddr), (Register))) = ((UINT16) (Data))

#define CONTROLLER_WRITE_REG8( BaseAddr, Register, Data ) \
        (CONTROLLER_REG8 ((BaseAddr), (Register))) = ((UINT8) (Data))

#define CONTROLLER_REG8_OR( BaseAddr, Register, OrData) \
        (CONTROLLER_REG8 ((BaseAddr), (Register))) |= ((UINT8) (OrData))

#define CONTROLLER_REG16_OR( BaseAddr, Register, OrData) \
        (CONTROLLER_REG16 ((BaseAddr), (Register))) |= ((UINT16) (OrData))

#define CONTROLLER_REG32_OR( BaseAddr, Register, OrData) \
        (CONTROLLER_REG32 ((BaseAddr), (Register))) = (CONTROLLER_REG32 ((BaseAddr), (Register))) | ((UINT32) (OrData))

#define CONTROLLER_REG8_AND( BaseAddr, Register, AndData) \
        (CONTROLLER_REG8 ((BaseAddr), (Register))) = (CONTROLLER_REG8 ((BaseAddr), (Register))) & ((UINT8) (AndData))

#define CONTROLLER_REG16_AND( BaseAddr, Register, AndData) \
        (CONTROLLER_REG16 ((BaseAddr), (Register))) &= ((UINT16) (AndData))

#define CONTROLLER_REG32_AND( BaseAddr, Register, AndData) \
        (CONTROLLER_REG32 ((BaseAddr), (Register))) = (CONTROLLER_REG32 ((BaseAddr), (Register))) & ((UINT32) (AndData))

#define CONTROLLER_REG8_AND_OR( BaseAddr, Register, AndData, OrData) \
        (CONTROLLER_REG8 ((BaseAddr), (Register)) = \
        (((CONTROLLER_REG8 ((BaseAddr), (Register))) & ((UINT8) (AndData))) | ((UINT8) (OrData))))

#define CONTROLLER_REG16_AND_OR( BaseAddr, Register, AndData, OrData) \
        (CONTROLLER_REG16 ((BaseAddr), (Register)) = \
        (((CONTROLLER_REG16 ((BaseAddr), (Register))) & ((UINT16) AndData)) | ((UINT16) (OrData))))

#define CONTROLLER_REG32_AND_OR( BaseAddr, Register,AndData,  OrData) \
        (CONTROLLER_REG32 ((BaseAddr), (Register)) = \
        (((CONTROLLER_REG32 ((BaseAddr), (Register))) & ((UINT32) (AndData))) | ((UINT32) (OrData))))

#define AMI_NVME_CONTROLLER_PROTOCOL_GUID   { 0xAFA4CF3F, 0xAF71, 0x4C30,  0xA4, 0xFB, 0x29, 0x10, 0xE7, 0x71, 0xF9, 0xB0 }
#define AMI_NVME_PASS_THRU_PROTOCOL_GUID    { 0x4B215191, 0x9A25, 0x43FD,  0x86, 0xB5, 0x74, 0xE7, 0xAF, 0x72, 0x33, 0x15 }
#define AMI_NVME_LEGACY_PROTOCOL_GUID       { 0xD4E79DAE, 0xAAFC, 0x4382,  0x95, 0x40, 0x3E, 0x3F, 0xA4, 0x2D, 0x42, 0x55 }
#define AMI_SMM_NVME_COMMUNICATION_GUID     { 0xEC2BD1FD, 0xE3B0, 0x429B,  0xAD, 0xDF, 0x96, 0x57, 0x93, 0x5A, 0x36, 0x84 }

CHAR8* 
UnicodeStrToAsciiStr (
  IN      CONST CHAR16              *Source,
  OUT     CHAR8                     *Destination
);
#pragma pack()

/****** DO NOT WRITE BELOW THIS LINE *******/
#ifdef __cplusplus
}
#endif

#endif
//**********************************************************************
//**********************************************************************
//**                                                                  **
//**        (C)Copyright 1985-2014, American Megatrends, Inc.         **
//**                                                                  **
//**                       All Rights Reserved.                       **
//**                                                                  **
//**         5555 Oakbrook Pkwy, Suite 200, Norcross, GA 30093        **
//**                                                                  **
//**                       Phone: (770)-246-8600                      **
//**                                                                  **
//**********************************************************************
//**********************************************************************