\r
#include "OpalHii.h"\r
\r
-/**\r
- Get Opal var name.\r
- The return Value must be freed by caller if not NULL\r
-\r
- @param OpalDisk The disk.\r
- @param Prefix The prefix string.\r
-\r
- @retval The var name string.\r
-\r
-**/\r
-CHAR16*\r
-OpalDriverGetOpalVarName(\r
- OPAL_DISK *OpalDisk,\r
- const CHAR16 *Prefix\r
- )\r
-{\r
- OPAL_DRIVER_DEVICE* Dev;\r
- UINTN PrefixLen;\r
- UINTN NameLen;\r
- UINTN VarNameLen;\r
- CHAR16* VarName;\r
-\r
- Dev = DRIVER_DEVICE_FROM_OPALDISK(OpalDisk);\r
- if (Dev == NULL) {\r
- return NULL;\r
- }\r
-\r
- PrefixLen = StrLen(Prefix);\r
-\r
- NameLen = 0;\r
- if (Dev->Name16 != NULL) {\r
- NameLen = StrLen(Dev->Name16);\r
- }\r
-\r
- VarNameLen = PrefixLen + NameLen;\r
-\r
- VarName = (CHAR16*)AllocateZeroPool((VarNameLen + 1) * sizeof(CHAR16));\r
- if (VarName == NULL) {\r
- return NULL;\r
- }\r
-\r
- CopyMem(VarName, Prefix, PrefixLen * sizeof(CHAR16));\r
- if (Dev->Name16 != NULL) {\r
- CopyMem(VarName + PrefixLen, Dev->Name16, NameLen * sizeof(CHAR16));\r
- }\r
- VarName[VarNameLen] = 0;\r
-\r
- return VarName;\r
-}\r
-\r
/**\r
Get the driver image handle.\r
\r
return gImageHandle;\r
}\r
\r
-/**\r
- Check whether enable feature or not.\r
-\r
- @retval Return the disk number.\r
-\r
-**/\r
-UINT8\r
-HiiGetNumConfigRequiredOpalDisksCB(\r
- VOID\r
- )\r
-{\r
- UINT8 NumDisks;\r
- UINT8 NumLockedOpalDisks;\r
- OPAL_DISK *OpalDisk;\r
- UINT8 Index;\r
-\r
- NumLockedOpalDisks = 0;\r
-\r
- NumDisks = GetDeviceCount();\r
-\r
- for (Index = 0; Index < NumDisks; Index++) {\r
- OpalDisk = HiiGetOpalDiskCB(Index);\r
-\r
- if (OpalDisk != NULL) {\r
- if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
- DEBUG ((DEBUG_INFO, "Ignoring disk %u because feature is disabled or health has already been inspected\n", Index));\r
- } else if (OpalDeviceLocked (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) {\r
- NumLockedOpalDisks++;\r
- }\r
- }\r
- }\r
-\r
- return NumLockedOpalDisks;\r
-}\r
-\r
-\r
-\r
/**\r
Returns the opaque pointer to a physical disk context.\r
\r
return PrpListPhyAddr;\r
}\r
\r
-/**\r
- Check whether there are available command slots.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Qid - Queue index\r
-\r
- @retval EFI_SUCCESS - Available command slot is found\r
- @retval EFI_NOT_READY - No available command slot is found\r
- @retval EFI_DEVICE_ERROR - Error occurred on device side.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeHasFreeCmdSlot (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT8 Qid\r
- )\r
-{\r
- return TRUE;\r
-}\r
-\r
-/**\r
- Check whether all command slots are clean.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Qid - Queue index\r
-\r
- @retval EFI_SUCCESS - All command slots are clean\r
- @retval EFI_NOT_READY - Not all command slots are clean\r
- @retval EFI_DEVICE_ERROR - Error occurred on device side.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeIsAllCmdSlotClean (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT8 Qid\r
- )\r
-{\r
- return EFI_SUCCESS;\r
-}\r
-\r
/**\r
Waits until all NVME commands completed.\r
\r
Nvme->State = NvmeStatusUnknown;\r
return Status;\r
}\r
-\r
-/**\r
- Read sector Data from the NVMe device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in,out] Buffer - The Buffer used to store the Data read from the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be read.\r
-\r
- @retval EFI_SUCCESS - Datum are read from the device.\r
- @retval Others - Fail to read all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeReadSectors (\r
- IN NVME_CONTEXT *Nvme,\r
- IN OUT UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINT32 Blocks\r
- )\r
-{\r
- UINT32 Bytes;\r
- NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- NVM_EXPRESS_COMMAND Command;\r
- NVM_EXPRESS_RESPONSE Response;\r
- EFI_STATUS Status;\r
- UINT32 BlockSize;\r
-\r
- BlockSize = Nvme->BlockSize;\r
- Bytes = Blocks * BlockSize;\r
-\r
- ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE));\r
-\r
- CommandPacket.NvmeCmd = &Command;\r
- CommandPacket.NvmeResponse = &Response;\r
-\r
- CommandPacket.NvmeCmd->Cdw0.Opcode = NVME_IO_READ_OPC;\r
- CommandPacket.NvmeCmd->Cdw0.Cid = Nvme->Cid[NVME_IO_QUEUE]++;\r
- CommandPacket.NvmeCmd->Nsid = Nvme->Nsid;\r
- CommandPacket.TransferBuffer = Buffer;\r
-\r
- CommandPacket.TransferLength = Bytes;\r
- CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;\r
- CommandPacket.QueueId = NVME_IO_QUEUE;\r
-\r
- CommandPacket.NvmeCmd->Cdw10 = (UINT32)Lba;\r
- CommandPacket.NvmeCmd->Cdw11 = (UINT32)(RShiftU64 (Lba, 32));\r
- CommandPacket.NvmeCmd->Cdw12 = (Blocks - 1) & 0xFFFF;\r
-\r
- CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID | CDW12_VALID;\r
-\r
- Status = NvmePassThru (\r
- Nvme,\r
- Nvme->Nsid,\r
- 0,\r
- &CommandPacket\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Write sector Data to the NVMe device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Buffer - The Buffer to be written into the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be written.\r
-\r
- @retval EFI_SUCCESS - Datum are written into the Buffer.\r
- @retval Others - Fail to write all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeWriteSectors (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINT32 Blocks\r
- )\r
-{\r
- NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- NVM_EXPRESS_COMMAND Command;\r
- NVM_EXPRESS_RESPONSE Response;\r
- EFI_STATUS Status;\r
- UINT32 Bytes;\r
- UINT32 BlockSize;\r
-\r
- BlockSize = Nvme->BlockSize;\r
- Bytes = Blocks * BlockSize;\r
-\r
- ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE));\r
-\r
- CommandPacket.NvmeCmd = &Command;\r
- CommandPacket.NvmeResponse = &Response;\r
-\r
- CommandPacket.NvmeCmd->Cdw0.Opcode = NVME_IO_WRITE_OPC;\r
- CommandPacket.NvmeCmd->Cdw0.Cid = Nvme->Cid[NVME_IO_QUEUE]++;\r
- CommandPacket.NvmeCmd->Nsid = Nvme->Nsid;\r
- CommandPacket.TransferBuffer = Buffer;\r
-\r
- CommandPacket.TransferLength = Bytes;\r
- CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;\r
- CommandPacket.QueueId = NVME_IO_QUEUE;\r
-\r
- CommandPacket.NvmeCmd->Cdw10 = (UINT32)Lba;\r
- CommandPacket.NvmeCmd->Cdw11 = (UINT32)(RShiftU64 (Lba, 32));\r
- CommandPacket.NvmeCmd->Cdw12 = (Blocks - 1) & 0xFFFF;\r
-\r
- CommandPacket.MetadataBuffer = (UINT64)(UINTN)NULL;\r
- CommandPacket.MetadataLength = 0;\r
-\r
- CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID | CDW12_VALID;\r
-\r
- Status = NvmePassThru (\r
- Nvme,\r
- Nvme->Nsid,\r
- 0,\r
- &CommandPacket\r
- );\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Flushes all modified Data to the device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
-\r
- @retval EFI_SUCCESS - Datum are written into the Buffer.\r
- @retval Others - Fail to write all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeFlush (\r
- IN NVME_CONTEXT *Nvme\r
- )\r
-{\r
- NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket;\r
- NVM_EXPRESS_COMMAND Command;\r
- NVM_EXPRESS_RESPONSE Response;\r
- EFI_STATUS Status;\r
-\r
- ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET));\r
- ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND));\r
- ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE));\r
-\r
- CommandPacket.NvmeCmd = &Command;\r
- CommandPacket.NvmeResponse = &Response;\r
-\r
- CommandPacket.NvmeCmd->Cdw0.Opcode = NVME_IO_FLUSH_OPC;\r
- CommandPacket.NvmeCmd->Cdw0.Cid = Nvme->Cid[NVME_IO_QUEUE]++;\r
- CommandPacket.NvmeCmd->Nsid = Nvme->Nsid;\r
- CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT;\r
- CommandPacket.QueueId = NVME_IO_QUEUE;\r
-\r
- Status = NvmePassThru (\r
- Nvme,\r
- Nvme->Nsid,\r
- 0,\r
- &CommandPacket\r
- );\r
- if (!EFI_ERROR (Status)) {\r
- Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId);\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Read some blocks from the device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[out] Buffer - The Buffer used to store the Data read from the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be read.\r
-\r
- @retval EFI_SUCCESS - Datum are read from the device.\r
- @retval Others - Fail to read all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeRead (\r
- IN NVME_CONTEXT *Nvme,\r
- OUT UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINTN Blocks\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT32 BlockSize;\r
- UINT32 MaxTransferBlocks;\r
-\r
- ASSERT (Blocks <= NVME_MAX_SECTORS);\r
- Status = EFI_SUCCESS;\r
- BlockSize = Nvme->BlockSize;\r
- if (Nvme->ControllerData->Mdts != 0) {\r
- MaxTransferBlocks = (1 << (Nvme->ControllerData->Mdts)) * (1 << (Nvme->Cap.Mpsmin + 12)) / BlockSize;\r
- } else {\r
- MaxTransferBlocks = 1024;\r
- }\r
-\r
- while (Blocks > 0) {\r
- if (Blocks > MaxTransferBlocks) {\r
- Status = NvmeReadSectors (Nvme, Buffer, Lba, MaxTransferBlocks);\r
-\r
- Blocks -= MaxTransferBlocks;\r
- Buffer += (MaxTransferBlocks * BlockSize);\r
- Lba += MaxTransferBlocks;\r
- } else {\r
- Status = NvmeReadSectors (Nvme, Buffer, Lba, (UINT32) Blocks);\r
- Blocks = 0;\r
- }\r
-\r
- if (EFI_ERROR(Status)) {\r
- DEBUG ((DEBUG_ERROR, "NvmeRead fail, Status = %r\n", Status));\r
- break;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
-\r
-/**\r
- Write some blocks to the device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Buffer - The Buffer to be written into the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be written.\r
-\r
- @retval EFI_SUCCESS - Datum are written into the Buffer.\r
- @retval Others - Fail to write all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeWrite (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINTN Blocks\r
- )\r
-{\r
- EFI_STATUS Status;\r
- UINT32 BlockSize;\r
- UINT32 MaxTransferBlocks;\r
-\r
- ASSERT (Blocks <= NVME_MAX_SECTORS);\r
- Status = EFI_SUCCESS;\r
- BlockSize = Nvme->BlockSize;\r
-\r
- if (Nvme->ControllerData->Mdts != 0) {\r
- MaxTransferBlocks = (1 << (Nvme->ControllerData->Mdts)) * (1 << (Nvme->Cap.Mpsmin + 12)) / BlockSize;\r
- } else {\r
- MaxTransferBlocks = 1024;\r
- }\r
-\r
- while (Blocks > 0) {\r
- if (Blocks > MaxTransferBlocks) {\r
- Status = NvmeWriteSectors (Nvme, Buffer, Lba, MaxTransferBlocks);\r
-\r
- Blocks -= MaxTransferBlocks;\r
- Buffer += (MaxTransferBlocks * BlockSize);\r
- Lba += MaxTransferBlocks;\r
- } else {\r
- Status = NvmeWriteSectors (Nvme, Buffer, Lba, (UINT32) Blocks);\r
- Blocks = 0;\r
- }\r
-\r
- if (EFI_ERROR(Status)) {\r
- DEBUG ((DEBUG_ERROR, "NvmeWrite fail, Status = %r\n", Status));\r
- break;\r
- }\r
- }\r
-\r
- return Status;\r
-}\r
IN NVME_CONTEXT *Nvme\r
);\r
\r
-/**\r
- Check whether there are available command slots.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Qid - Queue index\r
-\r
- @retval EFI_SUCCESS - Available command slot is found\r
- @retval EFI_NOT_READY - No available command slot is found\r
- @retval EFI_DEVICE_ERROR - Error occurred on device side.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeHasFreeCmdSlot (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT8 Qid\r
- );\r
-\r
-/**\r
- Check whether all command slots are clean.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Qid - Queue index\r
-\r
- @retval EFI_SUCCESS - All command slots are clean\r
- @retval EFI_NOT_READY - Not all command slots are clean\r
- @retval EFI_DEVICE_ERROR - Error occurred on device side.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeIsAllCmdSlotClean (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT8 Qid\r
- );\r
-\r
-/**\r
- Read sector Data from the NVMe device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in,out] Buffer - The Buffer used to store the Data read from the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be read.\r
-\r
- @retval EFI_SUCCESS - Datum are read from the device.\r
- @retval Others - Fail to read all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeReadSectors (\r
- IN NVME_CONTEXT *Nvme,\r
- IN OUT UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINT32 Blocks\r
- );\r
-\r
-/**\r
- Write sector Data to the NVMe device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Buffer - The Buffer to be written into the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be written.\r
-\r
- @retval EFI_SUCCESS - Datum are written into the Buffer.\r
- @retval Others - Fail to write all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeWriteSectors (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINT32 Blocks\r
- );\r
-\r
-/**\r
- Flushes all modified Data to the device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
-\r
- @retval EFI_SUCCESS - Datum are written into the Buffer.\r
- @retval Others - Fail to write all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeFlush (\r
- IN NVME_CONTEXT *Nvme\r
- );\r
-\r
-/**\r
- Read some blocks from the device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[out] Buffer - The Buffer used to store the Data read from the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be read.\r
-\r
- @retval EFI_SUCCESS - Datum are read from the device.\r
- @retval Others - Fail to read all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeRead (\r
- IN NVME_CONTEXT *Nvme,\r
- OUT UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINTN Blocks\r
- );\r
-\r
-/**\r
- Write some blocks to the device.\r
-\r
- @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure.\r
- @param[in] Buffer - The Buffer to be written into the device.\r
- @param[in] Lba - The start block number.\r
- @param[in] Blocks - Total block number to be written.\r
-\r
- @retval EFI_SUCCESS - Datum are written into the Buffer.\r
- @retval Others - Fail to write all the datum.\r
-\r
-**/\r
-EFI_STATUS\r
-NvmeWrite (\r
- IN NVME_CONTEXT *Nvme,\r
- IN UINT64 Buffer,\r
- IN UINT64 Lba,\r
- IN UINTN Blocks\r
- );\r
-\r
/**\r
Security send and receive commands.\r
\r