]> git.proxmox.com Git - mirror_edk2.git/blob - SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h
SecurityPkg OpalPassword: Add solution without SMM device code
[mirror_edk2.git] / SecurityPkg / Tcg / Opal / OpalPasswordSmm / OpalNvmeMode.h
1 /** @file
2 Header file for NVMe function definitions
3
4 Copyright (c) 2016, Intel Corporation. All rights reserved.<BR>
5 This program and the accompanying materials
6 are licensed and made available under the terms and conditions of the BSD License
7 which accompanies this distribution. The full text of the license may be found at
8 http://opensource.org/licenses/bsd-license.php
9
10 THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
11 WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
12
13 **/
14
15 #ifndef __OPAL_PASSWORD_NVME_MODE_H__
16 #define __OPAL_PASSWORD_NVME_MODE_H__
17
18
19 #include "OpalNvmeReg.h"
20
21 #define NVME_MAX_SECTORS 0x10000
22 //
23 // QueueId
24 //
25 #define NVME_ADMIN_QUEUE 0x00
26 #define NVME_IO_QUEUE 0x01
27
28 typedef struct {
29 UINT8 Opcode;
30 UINT8 FusedOperation;
31 #define NORMAL_CMD 0x00
32 #define FUSED_FIRST_CMD 0x01
33 #define FUSED_SECOND_CMD 0x02
34 UINT16 Cid;
35 } NVME_CDW0;
36
37 typedef struct {
38 NVME_CDW0 Cdw0;
39 UINT8 Flags;
40 #define CDW10_VALID 0x01
41 #define CDW11_VALID 0x02
42 #define CDW12_VALID 0x04
43 #define CDW13_VALID 0x08
44 #define CDW14_VALID 0x10
45 #define CDW15_VALID 0x20
46 UINT32 Nsid;
47 UINT32 Cdw10;
48 UINT32 Cdw11;
49 UINT32 Cdw12;
50 UINT32 Cdw13;
51 UINT32 Cdw14;
52 UINT32 Cdw15;
53 } NVM_EXPRESS_COMMAND;
54
55 typedef struct {
56 UINT32 Cdw0;
57 UINT32 Cdw1;
58 UINT32 Cdw2;
59 UINT32 Cdw3;
60 } NVM_EXPRESS_RESPONSE;
61
62 typedef struct {
63 UINT64 CommandTimeout;
64 UINT64 TransferBuffer;
65 UINT32 TransferLength;
66 UINT64 MetadataBuffer;
67 UINT32 MetadataLength;
68 UINT8 QueueId;
69 NVM_EXPRESS_COMMAND *NvmeCmd;
70 NVM_EXPRESS_RESPONSE *NvmeResponse;
71 } NVM_EXPRESS_PASS_THRU_COMMAND_PACKET;
72
73
74 #pragma pack(1)
75
76 // Internal fields
77 typedef enum {
78 NvmeStatusUnknown,
79 NvmeStatusInit,
80 NvmeStatusInuse,
81 NvmeStatusMax,
82 } NVME_STATUS;
83
84 typedef struct {
85 UINT32 Nbar;
86 UINT32 BaseMem;
87 BOOLEAN PollCancellation;
88 UINT16 NvmeInitWaitTime;
89
90 NVME_STATUS State;
91 UINT8 BusID;
92 UINT8 DeviceID;
93 UINT8 FuncID;
94 UINTN PciBase;
95
96 UINT32 Nsid;
97 UINT64 Nsuuid;
98 UINT32 BlockSize;
99 EFI_LBA LastBlock;
100
101 //
102 // Pointers to 4kB aligned submission & completion queues.
103 //
104 NVME_SQ *SqBuffer[NVME_MAX_IO_QUEUES];
105 NVME_CQ *CqBuffer[NVME_MAX_IO_QUEUES];
106 UINT16 Cid[NVME_MAX_IO_QUEUES];
107
108 //
109 // Submission and completion queue indices.
110 //
111 NVME_SQTDBL SqTdbl[NVME_MAX_IO_QUEUES];
112 NVME_CQHDBL CqHdbl[NVME_MAX_IO_QUEUES];
113 UINT8 Pt[NVME_MAX_IO_QUEUES];
114
115 UINTN SqeCount[NVME_MAX_IO_QUEUES];
116
117 //
118 // Nvme controller capabilities
119 //
120 NVME_CAP Cap;
121
122 //
123 // pointer to identify controller Data
124 //
125 NVME_ADMIN_CONTROLLER_DATA *ControllerData;
126 NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
127 } NVME_CONTEXT;
128
129 #pragma pack()
130
131 /**
132 Transfer MMIO Data to memory.
133
134 @param[in,out] MemBuffer - Destination: Memory address
135 @param[in] MmioAddr - Source: MMIO address
136 @param[in] Size - Size for read
137
138 @retval EFI_SUCCESS - MMIO read sucessfully
139 **/
140 EFI_STATUS
141 NvmeMmioRead (
142 IN OUT VOID *MemBuffer,
143 IN UINTN MmioAddr,
144 IN UINTN Size
145 );
146
147 /**
148 Transfer memory Data to MMIO.
149
150 @param[in,out] MmioAddr - Destination: MMIO address
151 @param[in] MemBuffer - Source: Memory address
152 @param[in] Size - Size for write
153
154 @retval EFI_SUCCESS - MMIO write sucessfully
155 **/
156 EFI_STATUS
157 NvmeMmioWrite (
158 IN OUT UINTN MmioAddr,
159 IN VOID *MemBuffer,
160 IN UINTN Size
161 );
162
163 /**
164 Transfer memory data to MMIO.
165
166 @param[in,out] MmioAddr - Destination: MMIO address
167 @param[in] MemBuffer - Source: Memory address
168 @param[in] Size - Size for write
169
170 @retval EFI_SUCCESS - MMIO write sucessfully
171 **/
172 EFI_STATUS
173 OpalPciWrite (
174 IN OUT UINTN MmioAddr,
175 IN VOID *MemBuffer,
176 IN UINTN Size
177 );
178
179 /**
180 Transfer MMIO data to memory.
181
182 @param[in,out] MemBuffer - Destination: Memory address
183 @param[in] MmioAddr - Source: MMIO address
184 @param[in] Size - Size for read
185
186 @retval EFI_SUCCESS - MMIO read sucessfully
187 **/
188 EFI_STATUS
189 OpalPciRead (
190 IN OUT VOID *MemBuffer,
191 IN UINTN MmioAddr,
192 IN UINTN Size
193 );
194
195 /**
196 Allocate transfer-related Data struct which is used at Nvme.
197
198 @param[in] ImageHandle Image handle for this driver image
199 @param[in] Nvme The pointer to the NVME_CONTEXT Data structure.
200
201 @retval EFI_OUT_OF_RESOURCE The allocation is failure.
202 @retval EFI_SUCCESS Successful to allocate memory.
203
204 **/
205 EFI_STATUS
206 EFIAPI
207 NvmeAllocateResource (
208 IN EFI_HANDLE ImageHandle,
209 IN NVME_CONTEXT *Nvme
210 );
211
212 /**
213 Free allocated transfer-related Data struct which is used at NVMe.
214
215 @param[in] Nvme The pointer to the NVME_CONTEXT Data structure.
216
217 **/
218 VOID
219 EFIAPI
220 NvmeFreeResource (
221 IN NVME_CONTEXT *Nvme
222 );
223
224 /**
225 Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports
226 both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the nonblocking
227 I/O functionality is optional.
228
229 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
230 @param[in] NamespaceId - Is a 32 bit Namespace ID to which the Express HCI command packet will be sent.
231 A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace
232 ID specifies that the command packet should be sent to all valid namespaces.
233 @param[in] NamespaceUuid - Is a 64 bit Namespace UUID to which the Express HCI command packet will be sent.
234 A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace
235 UUID specifies that the command packet should be sent to all valid namespaces.
236 @param[in,out] Packet - A pointer to the NVM Express HCI Command Packet to send to the NVMe namespace specified
237 by NamespaceId.
238
239 @retval EFI_SUCCESS - The NVM Express Command Packet was sent by the host. TransferLength bytes were transferred
240 to, or from DataBuffer.
241 @retval EFI_NOT_READY - The NVM Express Command Packet could not be sent because the controller is not ready. The caller
242 may retry again later.
243 @retval EFI_DEVICE_ERROR - A device error occurred while attempting to send the NVM Express Command Packet.
244 @retval EFI_INVALID_PARAMETER - Namespace, or the contents of NVM_EXPRESS_PASS_THRU_COMMAND_PACKET are invalid. The NVM
245 Express Command Packet was not sent, so no additional status information is available.
246 @retval EFI_UNSUPPORTED - The command described by the NVM Express Command Packet is not supported by the host adapter.
247 The NVM Express Command Packet was not sent, so no additional status information is available.
248 @retval EFI_TIMEOUT - A timeout occurred while waiting for the NVM Express Command Packet to execute.
249
250 **/
251 EFI_STATUS
252 NvmePassThru (
253 IN NVME_CONTEXT *Nvme,
254 IN UINT32 NamespaceId,
255 IN UINT64 NamespaceUuid,
256 IN OUT NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet
257 );
258
259 /**
260 Waits until all NVME commands completed.
261
262 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
263 @param[in] Qid - Queue index
264
265 @retval EFI_SUCCESS - All NVME commands have completed
266 @retval EFI_TIMEOUT - Timeout occured
267 @retval EFI_NOT_READY - Not all NVME commands have completed
268 @retval others - Error occurred on device side.
269 **/
270 EFI_STATUS
271 NvmeWaitAllComplete (
272 IN NVME_CONTEXT *Nvme,
273 IN UINT8 Qid
274 );
275
276 /**
277 Initialize the Nvm Express controller.
278
279 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
280
281 @retval EFI_SUCCESS - The NVM Express Controller is initialized successfully.
282 @retval Others - A device error occurred while initializing the controller.
283
284 **/
285 EFI_STATUS
286 NvmeControllerInit (
287 IN NVME_CONTEXT *Nvme
288 );
289
290 /**
291 Un-initialize the Nvm Express controller.
292
293 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
294
295 @retval EFI_SUCCESS - The NVM Express Controller is un-initialized successfully.
296 @retval Others - A device error occurred while un-initializing the controller.
297
298 **/
299 EFI_STATUS
300 NvmeControllerExit (
301 IN NVME_CONTEXT *Nvme
302 );
303
304 /**
305 Check whether there are available command slots.
306
307 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
308 @param[in] Qid - Queue index
309
310 @retval EFI_SUCCESS - Available command slot is found
311 @retval EFI_NOT_READY - No available command slot is found
312 @retval EFI_DEVICE_ERROR - Error occurred on device side.
313
314 **/
315 EFI_STATUS
316 NvmeHasFreeCmdSlot (
317 IN NVME_CONTEXT *Nvme,
318 IN UINT8 Qid
319 );
320
321 /**
322 Check whether all command slots are clean.
323
324 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
325 @param[in] Qid - Queue index
326
327 @retval EFI_SUCCESS - All command slots are clean
328 @retval EFI_NOT_READY - Not all command slots are clean
329 @retval EFI_DEVICE_ERROR - Error occurred on device side.
330
331 **/
332 EFI_STATUS
333 NvmeIsAllCmdSlotClean (
334 IN NVME_CONTEXT *Nvme,
335 IN UINT8 Qid
336 );
337
338 /**
339 Read sector Data from the NVMe device.
340
341 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
342 @param[in,out] Buffer - The Buffer used to store the Data read from the device.
343 @param[in] Lba - The start block number.
344 @param[in] Blocks - Total block number to be read.
345
346 @retval EFI_SUCCESS - Datum are read from the device.
347 @retval Others - Fail to read all the datum.
348
349 **/
350 EFI_STATUS
351 NvmeReadSectors (
352 IN NVME_CONTEXT *Nvme,
353 IN OUT UINT64 Buffer,
354 IN UINT64 Lba,
355 IN UINT32 Blocks
356 );
357
358 /**
359 Write sector Data to the NVMe device.
360
361 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
362 @param[in] Buffer - The Buffer to be written into the device.
363 @param[in] Lba - The start block number.
364 @param[in] Blocks - Total block number to be written.
365
366 @retval EFI_SUCCESS - Datum are written into the Buffer.
367 @retval Others - Fail to write all the datum.
368
369 **/
370 EFI_STATUS
371 NvmeWriteSectors (
372 IN NVME_CONTEXT *Nvme,
373 IN UINT64 Buffer,
374 IN UINT64 Lba,
375 IN UINT32 Blocks
376 );
377
378 /**
379 Flushes all modified Data to the device.
380
381 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
382
383 @retval EFI_SUCCESS - Datum are written into the Buffer.
384 @retval Others - Fail to write all the datum.
385
386 **/
387 EFI_STATUS
388 NvmeFlush (
389 IN NVME_CONTEXT *Nvme
390 );
391
392 /**
393 Read some blocks from the device.
394
395 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
396 @param[out] Buffer - The Buffer used to store the Data read from the device.
397 @param[in] Lba - The start block number.
398 @param[in] Blocks - Total block number to be read.
399
400 @retval EFI_SUCCESS - Datum are read from the device.
401 @retval Others - Fail to read all the datum.
402
403 **/
404 EFI_STATUS
405 NvmeRead (
406 IN NVME_CONTEXT *Nvme,
407 OUT UINT64 Buffer,
408 IN UINT64 Lba,
409 IN UINTN Blocks
410 );
411
412 /**
413 Write some blocks to the device.
414
415 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
416 @param[in] Buffer - The Buffer to be written into the device.
417 @param[in] Lba - The start block number.
418 @param[in] Blocks - Total block number to be written.
419
420 @retval EFI_SUCCESS - Datum are written into the Buffer.
421 @retval Others - Fail to write all the datum.
422
423 **/
424 EFI_STATUS
425 NvmeWrite (
426 IN NVME_CONTEXT *Nvme,
427 IN UINT64 Buffer,
428 IN UINT64 Lba,
429 IN UINTN Blocks
430 );
431
432 /**
433 Security send and receive commands.
434
435 @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.
436 @param[in] SendCommand - The flag to indicate the command type, TRUE for Send command and FALSE for receive command
437 @param[in] SecurityProtocol - Security Protocol
438 @param[in] SpSpecific - Security Protocol Specific
439 @param[in] TransferLength - Transfer Length of Buffer (in bytes) - always a multiple of 512
440 @param[in,out] TransferBuffer - Address of Data to transfer
441
442 @return EFI_SUCCESS - Successfully create io submission queue.
443 @return others - Fail to send/receive commands.
444
445 **/
446 EFI_STATUS
447 NvmeSecuritySendReceive (
448 IN NVME_CONTEXT *Nvme,
449 IN BOOLEAN SendCommand,
450 IN UINT8 SecurityProtocol,
451 IN UINT16 SpSpecific,
452 IN UINTN TransferLength,
453 IN OUT VOID *TransferBuffer
454 );
455
456 #endif