X-Git-Url: https://git.proxmox.com/?p=mirror_edk2.git;a=blobdiff_plain;f=MdeModulePkg%2FBus%2FPci%2FNvmExpressDxe%2FNvmExpress.c;h=9938bf45417e32f16d52fd0f13b12bc43a26ab04;hp=d107d96387d8665e30fada5636ae93d7fa6b386f;hb=754b489b46fa2c940f90b4048cc868991cda92a2;hpb=9c4ae34ebb6b22c83d627a4b976864a8efda8b44 diff --git a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c index d107d96387..9938bf4541 100644 --- a/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c +++ b/MdeModulePkg/Bus/Pci/NvmExpressDxe/NvmExpress.c @@ -154,6 +154,12 @@ EnumerateNvmeDevNamespace ( Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks; Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks; + // + // Create StorageSecurityProtocol Instance + // + Device->StorageSecurity.ReceiveData = NvmeStorageSecurityReceiveData; + Device->StorageSecurity.SendData = NvmeStorageSecuritySendData; + // // Create DiskInfo Protocol instance // @@ -211,6 +217,32 @@ EnumerateNvmeDevNamespace ( if(EFI_ERROR(Status)) { goto Exit; } + + // + // Check if the NVMe controller supports the Security Send and Security Receive commands + // + if ((Private->ControllerData->Oacs & SECURITY_SEND_RECEIVE_SUPPORTED) != 0) { + Status = gBS->InstallProtocolInterface ( + &Device->DeviceHandle, + &gEfiStorageSecurityCommandProtocolGuid, + EFI_NATIVE_INTERFACE, + &Device->StorageSecurity + ); + if(EFI_ERROR(Status)) { + gBS->UninstallMultipleProtocolInterfaces ( + &Device->DeviceHandle, + &gEfiDevicePathProtocolGuid, + Device->DevicePath, + &gEfiBlockIoProtocolGuid, + &Device->BlockIo, + &gEfiDiskInfoProtocolGuid, + &Device->DiskInfo, + NULL + ); + goto Exit; + } + } + gBS->OpenProtocol ( Private->ControllerHandle, &gEfiNvmExpressPassThruProtocolGuid, @@ -339,6 +371,7 @@ UnregisterNvmeNamespace ( EFI_BLOCK_IO_PROTOCOL *BlockIo; NVME_DEVICE_PRIVATE_DATA *Device; NVME_CONTROLLER_PRIVATE_DATA *Private; + EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity; BlockIo = NULL; @@ -394,6 +427,37 @@ UnregisterNvmeNamespace ( return Status; } + // + // If Storage Security Command Protocol is installed, then uninstall this protocol. + // + Status = gBS->OpenProtocol ( + Handle, + &gEfiStorageSecurityCommandProtocolGuid, + (VOID **) &StorageSecurity, + This->DriverBindingHandle, + Controller, + EFI_OPEN_PROTOCOL_GET_PROTOCOL + ); + + if (!EFI_ERROR (Status)) { + Status = gBS->UninstallProtocolInterface ( + Handle, + &gEfiStorageSecurityCommandProtocolGuid, + &Device->StorageSecurity + ); + if (EFI_ERROR (Status)) { + gBS->OpenProtocol ( + Controller, + &gEfiNvmExpressPassThruProtocolGuid, + (VOID **) &Private->Passthru, + This->DriverBindingHandle, + Handle, + EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER + ); + return Status; + } + } + if(Device->DevicePath != NULL) { FreePool (Device->DevicePath); } @@ -480,8 +544,8 @@ NvmExpressDriverBindingSupported ( if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) || (DevicePathNode.DevPath->SubType != MSG_NVME_NAMESPACE_DP) || - DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH)) { - return EFI_UNSUPPORTED; + (DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH))) { + return EFI_UNSUPPORTED; } } }