From 957024c1bcee57101fca5023624fb2fd2baeaf6b Mon Sep 17 00:00:00 2001 From: Star Zeng Date: Tue, 6 Mar 2018 21:43:20 +0800 Subject: [PATCH 1/1] SecurityPkg OpalPassword: Remove old solution Cc: Jiewen Yao Cc: Eric Dong Cc: Chao Zhang Contributed-under: TianoCore Contribution Agreement 1.1 Signed-off-by: Star Zeng Reviewed-by: Jiewen Yao --- SecurityPkg/SecurityPkg.dsc | 2 - .../Tcg/Opal/OpalPasswordDxe/ComponentName.c | 398 --- .../Tcg/Opal/OpalPasswordDxe/OpalDriver.c | 1091 --------- .../Tcg/Opal/OpalPasswordDxe/OpalDriver.h | 412 ---- .../Opal/OpalPasswordDxe/OpalDriverPrivate.h | 102 - .../Tcg/Opal/OpalPasswordDxe/OpalHii.c | 1527 ------------ .../Tcg/Opal/OpalPasswordDxe/OpalHii.h | 146 -- .../Opal/OpalPasswordDxe/OpalHiiCallbacks.c | 221 -- .../OpalPasswordDxe/OpalHiiFormStrings.uni | 103 - .../Opal/OpalPasswordDxe/OpalHiiFormValues.h | 120 - .../Tcg/Opal/OpalPasswordDxe/OpalHiiPrivate.h | 268 -- .../Opal/OpalPasswordDxe/OpalPasswordDxe.inf | 82 - .../Opal/OpalPasswordDxe/OpalPasswordForm.vfr | 350 --- .../Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c | 1267 ---------- .../Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h | 408 ---- .../Tcg/Opal/OpalPasswordSmm/OpalIdeMode.c | 767 ------ .../Tcg/Opal/OpalPasswordSmm/OpalIdeMode.h | 173 -- .../Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c | 2165 ----------------- .../Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h | 456 ---- .../Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h | 814 ------- .../Opal/OpalPasswordSmm/OpalPasswordSmm.c | 1088 --------- .../Opal/OpalPasswordSmm/OpalPasswordSmm.h | 299 --- .../Opal/OpalPasswordSmm/OpalPasswordSmm.inf | 77 - 23 files changed, 12336 deletions(-) delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/ComponentName.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriverPrivate.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiCallbacks.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormStrings.uni delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormValues.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiPrivate.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordDxe.inf delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordForm.vfr delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.h delete mode 100644 SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf diff --git a/SecurityPkg/SecurityPkg.dsc b/SecurityPkg/SecurityPkg.dsc index f82703a17b..9be484877c 100644 --- a/SecurityPkg/SecurityPkg.dsc +++ b/SecurityPkg/SecurityPkg.dsc @@ -322,8 +322,6 @@ # # Opal Password solution # - SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordDxe.inf - SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf SecurityPkg/Tcg/Opal/OpalPassword/OpalPasswordDxe.inf SecurityPkg/Tcg/Opal/OpalPassword/OpalPasswordPei.inf diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/ComponentName.c b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/ComponentName.c deleted file mode 100644 index ef963d0e0b..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/ComponentName.c +++ /dev/null @@ -1,398 +0,0 @@ -/** @file - UEFI Component Name(2) protocol implementation for Opal driver. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "OpalDriver.h" - -// -// EFI Component Name Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gOpalComponentName = { - OpalEfiDriverComponentNameGetDriverName, - OpalEfiDriverComponentNameGetControllerName, - "eng" -}; - -// -// EFI Component Name 2 Protocol -// -GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gOpalComponentName2 = { - OpalEfiDriverComponentName2GetDriverName, - OpalEfiDriverComponentName2GetControllerName, - "en" -}; - - -/// The name of the driver in all the languages we support. -GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mOpalDriverNameTable[] = { - { LANGUAGE_RFC_3066_ENGLISH, (CHAR16*)EFI_DRIVER_NAME_UNICODE }, - { LANGUAGE_ISO_639_2_ENGLISH, (CHAR16*)EFI_DRIVER_NAME_UNICODE }, - { 0, 0 } -}; - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentNameGetDriverName( - EFI_COMPONENT_NAME_PROTOCOL* This, - CHAR8* Language, - CHAR16** DriverName - ) -{ - return LookupUnicodeString2( - Language, - This->SupportedLanguages, - mOpalDriverNameTable, - DriverName, - TRUE - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentName2GetDriverName( - EFI_COMPONENT_NAME2_PROTOCOL* This, - CHAR8* Language, - CHAR16** DriverName - ) -{ - return LookupUnicodeString2( - Language, - This->SupportedLanguages, - mOpalDriverNameTable, - DriverName, - FALSE - ); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -GetControllerName( - EFI_HANDLE ControllerHandle, - EFI_HANDLE ChildHandle, - CHAR8* Language, - CHAR16** ControllerName - ) -{ - if (Language == NULL || ControllerName == NULL || ControllerHandle == NULL) { - return EFI_INVALID_PARAMETER; - } - - // don't support any controller or children names - return EFI_UNSUPPORTED; -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentNameGetControllerName( - EFI_COMPONENT_NAME_PROTOCOL* This, - EFI_HANDLE ControllerHandle, - EFI_HANDLE ChildHandle, - CHAR8* Language, - CHAR16** ControllerName - ) -{ - return (GetControllerName( ControllerHandle, ChildHandle, Language, ControllerName)); -} - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentName2GetControllerName( - EFI_COMPONENT_NAME2_PROTOCOL* This, - EFI_HANDLE ControllerHandle, - EFI_HANDLE ChildHandle, - CHAR8* Language, - CHAR16** ControllerName - ) -{ - return (GetControllerName(ControllerHandle, ChildHandle, Language, ControllerName)); -} - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.c b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.c deleted file mode 100644 index cd0c5a4096..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.c +++ /dev/null @@ -1,1091 +0,0 @@ -/** @file - Entrypoint of Opal UEFI Driver and contains all the logic to - register for new Opal device instances. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -// This UEFI driver consumes EFI_STORAGE_SECURITY_PROTOCOL instances and installs an -// HII GUI to manage Opal features if the device is Opal capable -// If the Opal device is being managed by the UEFI Driver, it shall provide a popup -// window during boot requesting a user password - -#include "OpalDriver.h" -#include "OpalDriverPrivate.h" -#include "OpalHii.h" - -OPAL_DRIVER mOpalDriver; - -#define MAX_PASSWORD_SIZE 32 -#define MAX_PASSWORD_TRY_COUNT 5 - -// -// Globals -// -EFI_DRIVER_BINDING_PROTOCOL gOpalDriverBinding = { - OpalEfiDriverBindingSupported, - OpalEfiDriverBindingStart, - OpalEfiDriverBindingStop, - 0x1b, - NULL, - NULL -}; - - -/** - Add new device to the global device list. - - @param Dev New create device. - -**/ -VOID -AddDeviceToTail( - IN OPAL_DRIVER_DEVICE *Dev - ) -{ - OPAL_DRIVER_DEVICE *TmpDev; - - if (mOpalDriver.DeviceList == NULL) { - mOpalDriver.DeviceList = Dev; - } else { - TmpDev = mOpalDriver.DeviceList; - while (TmpDev->Next != NULL) { - TmpDev = TmpDev->Next; - } - - TmpDev->Next = Dev; - } -} - -/** - Remove one device in the global device list. - - @param Dev The device need to be removed. - -**/ -VOID -RemoveDevice ( - IN OPAL_DRIVER_DEVICE *Dev - ) -{ - OPAL_DRIVER_DEVICE *TmpDev; - - if (mOpalDriver.DeviceList == NULL) { - return; - } - - if (mOpalDriver.DeviceList == Dev) { - mOpalDriver.DeviceList = NULL; - return; - } - - TmpDev = mOpalDriver.DeviceList; - while (TmpDev->Next != NULL) { - if (TmpDev->Next == Dev) { - TmpDev->Next = Dev->Next; - break; - } - } -} - -/** - Get current device count. - - @retval return the current created device count. - -**/ -UINT8 -GetDeviceCount ( - VOID - ) -{ - UINT8 Count; - OPAL_DRIVER_DEVICE *TmpDev; - - Count = 0; - TmpDev = mOpalDriver.DeviceList; - - while (TmpDev != NULL) { - Count++; - TmpDev = TmpDev->Next; - } - - return Count; -} - -/** - Get password input from the popup windows, and unlock the device. - - @param[in] Dev The device which need to be unlock. - @param[out] PressEsc Whether user escape function through Press ESC. - - @retval Password string if success. NULL if failed. - -**/ -CHAR8 * -OpalDriverPopUpHddPassword ( - IN OPAL_DRIVER_DEVICE *Dev, - OUT BOOLEAN *PressEsc - ) -{ - EFI_INPUT_KEY InputKey; - UINTN InputLength; - CHAR16 Mask[MAX_PASSWORD_SIZE + 1]; - CHAR16 Unicode[MAX_PASSWORD_SIZE + 1]; - CHAR8 *Ascii; - CHAR16 *PopUpString; - UINTN StrLength; - - ZeroMem(Unicode, sizeof(Unicode)); - ZeroMem(Mask, sizeof(Mask)); - - StrLength = StrLen(Dev->Name16); - PopUpString = (CHAR16*) AllocateZeroPool ((8 + StrLength) * 2); - *PressEsc = FALSE; - - if (Dev->Name16 == NULL) { - UnicodeSPrint(PopUpString, StrLen(L"Unlock Disk") + 1, L"Unlock Disk"); - } else { - UnicodeSPrint(PopUpString, StrLen(L"Unlock ") + StrLength + 1, L"Unlock %s", Dev->Name16); - } - - gST->ConOut->ClearScreen(gST->ConOut); - - InputLength = 0; - while (TRUE) { - Mask[InputLength] = L'_'; - CreatePopUp( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &InputKey, - PopUpString, - L"---------------------", - Mask, - NULL - ); - - // - // Check key. - // - if (InputKey.ScanCode == SCAN_NULL) { - // - // password finished - // - if (InputKey.UnicodeChar == CHAR_CARRIAGE_RETURN) { - // - // Add the null terminator. - // - Unicode[InputLength] = 0; - InputLength++; - break; - } else if ((InputKey.UnicodeChar == CHAR_NULL) || - (InputKey.UnicodeChar == CHAR_TAB) || - (InputKey.UnicodeChar == CHAR_LINEFEED) - ) { - continue; - } else { - // - // delete last key entered - // - if (InputKey.UnicodeChar == CHAR_BACKSPACE) { - if (InputLength > 0) { - Unicode[InputLength] = 0; - Mask[InputLength] = 0; - InputLength--; - } - } else { - // - // add Next key entry - // - Unicode[InputLength] = InputKey.UnicodeChar; - Mask[InputLength] = L'*'; - InputLength++; - if (InputLength == MAX_PASSWORD_SIZE) { - // - // Add the null terminator. - // - Unicode[InputLength] = 0; - Mask[InputLength] = 0; - break; - } - } - } - } - - // - // exit on ESC - // - if (InputKey.ScanCode == SCAN_ESC) { - *PressEsc = TRUE; - break; - } - } - - gST->ConOut->ClearScreen(gST->ConOut); - - if (InputLength == 0 || InputKey.ScanCode == SCAN_ESC) { - return NULL; - } - - Ascii = AllocateZeroPool (MAX_PASSWORD_SIZE + 1); - if (Ascii == NULL) { - return NULL; - } - - UnicodeStrToAsciiStrS (Unicode, Ascii, MAX_PASSWORD_SIZE + 1); - ZeroMem (Unicode, sizeof (Unicode)); - - return Ascii; -} - -/** - Check if disk is locked, show popup window and ask for password if it is - - @param[in] Dev The device which need to be unlock. - -**/ -VOID -OpalDriverRequestPassword ( - OPAL_DRIVER_DEVICE *Dev - ) -{ - UINT8 Count; - BOOLEAN IsEnabled; - CHAR8 *Password; - UINT32 PasswordLen; - TCG_RESULT Ret; - EFI_INPUT_KEY Key; - OPAL_SESSION Session; - BOOLEAN PressEsc; - BOOLEAN Locked; - - if (Dev == NULL) { - return; - } - - Count = 0; - - IsEnabled = OpalFeatureEnabled (&Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.LockingFeature); - if (IsEnabled) { - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = Dev->OpalDisk.Sscp; - Session.MediaId = Dev->OpalDisk.MediaId; - Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId; - - Locked = OpalDeviceLocked (&Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.LockingFeature); - - while (Count < MAX_PASSWORD_TRY_COUNT) { - Password = OpalDriverPopUpHddPassword (Dev, &PressEsc); - if (PressEsc) { - if (Locked) { - // - // Current device in the lock status and - // User not input password and press ESC, - // keep device in lock status and continue boot. - // - do { - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - L"Press ENTER to skip password, Press ESC to input password", - NULL - ); - } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN)); - - if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { - gST->ConOut->ClearScreen(gST->ConOut); - // - // Keep lock and continue boot. - // - return; - } else { - // - // Let user input password again. - // - continue; - } - } else { - // - // Current device in the unlock status and - // User not input password and press ESC, - // Shutdown the device. - // - do { - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - L"Press ENTER to shutdown, Press ESC to input password", - NULL - ); - } while ((Key.ScanCode != SCAN_ESC) && (Key.UnicodeChar != CHAR_CARRIAGE_RETURN)); - - if (Key.UnicodeChar == CHAR_CARRIAGE_RETURN) { - gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); - } else { - // - // Let user input password again. - // - continue; - } - } - } - - if (Password == NULL) { - Count ++; - continue; - } - PasswordLen = (UINT32) AsciiStrLen(Password); - - if (Locked) { - Ret = OpalSupportUnlock(&Session, Password, PasswordLen, Dev->OpalDevicePath); - } else { - Ret = OpalSupportLock(&Session, Password, PasswordLen, Dev->OpalDevicePath); - if (Ret == TcgResultSuccess) { - Ret = OpalSupportUnlock(&Session, Password, PasswordLen, Dev->OpalDevicePath); - } - } - - if (Password != NULL) { - ZeroMem (Password, PasswordLen); - FreePool (Password); - } - - if (Ret == TcgResultSuccess) { - break; - } - - Count++; - - do { - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - L"Invalid password.", - L"Press ENTER to retry", - NULL - ); - } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN); - } - - if (Count >= MAX_PASSWORD_TRY_COUNT) { - do { - CreatePopUp ( - EFI_LIGHTGRAY | EFI_BACKGROUND_BLUE, - &Key, - L"Opal password retry count exceeds the limit. Must shutdown!", - L"Press ENTER to shutdown", - NULL - ); - } while (Key.UnicodeChar != CHAR_CARRIAGE_RETURN); - - gRT->ResetSystem (EfiResetShutdown, EFI_SUCCESS, 0, NULL); - } - } -} - -/** - Get devcie list info. - - @retval return the device list pointer. -**/ -OPAL_DRIVER_DEVICE* -OpalDriverGetDeviceList( - VOID - ) -{ - return mOpalDriver.DeviceList; -} - -/** - ReadyToBoot callback to send BlockSid command. - - @param Event Pointer to this event - @param Context Event handler private Data - -**/ -VOID -EFIAPI -ReadyToBootCallback ( - IN EFI_EVENT Event, - IN VOID *Context - ) -{ - OPAL_DRIVER_DEVICE *Itr; - TCG_RESULT Result; - OPAL_SESSION Session; - UINT32 PpStorageFlag; - - gBS->CloseEvent (Event); - - PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags (); - if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) { - // - // Send BlockSID command to each Opal disk - // - Itr = mOpalDriver.DeviceList; - while (Itr != NULL) { - if (Itr->OpalDisk.SupportedAttributes.BlockSid) { - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = Itr->OpalDisk.Sscp; - Session.MediaId = Itr->OpalDisk.MediaId; - Session.OpalBaseComId = Itr->OpalDisk.OpalBaseComId; - - Result = OpalBlockSid (&Session, TRUE); // HardwareReset must always be TRUE - if (Result != TcgResultSuccess) { - DEBUG ((DEBUG_ERROR, "OpalBlockSid fail\n")); - break; - } - } - - Itr = Itr->Next; - } - } -} - -/** - Stop this Controller. - - @param Dev The device need to be stopped. - -**/ -VOID -OpalDriverStopDevice ( - OPAL_DRIVER_DEVICE *Dev - ) -{ - // - // free each name - // - FreePool(Dev->Name16); - - // - // remove OPAL_DRIVER_DEVICE from the list - // it updates the controllerList pointer - // - RemoveDevice(Dev); - - // - // close protocols that were opened - // - gBS->CloseProtocol( - Dev->Handle, - &gEfiStorageSecurityCommandProtocolGuid, - gOpalDriverBinding.DriverBindingHandle, - Dev->Handle - ); - - gBS->CloseProtocol( - Dev->Handle, - &gEfiBlockIoProtocolGuid, - gOpalDriverBinding.DriverBindingHandle, - Dev->Handle - ); - - FreePool(Dev); -} - -/** - Get devcie name through the component name protocol. - - @param[in] AllHandlesBuffer The handle buffer for current system. - @param[in] NumAllHandles The number of handles for the handle buffer. - @param[in] Dev The device which need to get name. - @param[in] UseComp1 Whether use component name or name2 protocol. - - @retval TRUE Find the name for this device. - @retval FALSE Not found the name for this device. -**/ -BOOLEAN -OpalDriverGetDeviceNameByProtocol( - EFI_HANDLE *AllHandlesBuffer, - UINTN NumAllHandles, - OPAL_DRIVER_DEVICE *Dev, - BOOLEAN UseComp1 - ) -{ - EFI_HANDLE* ProtocolHandlesBuffer; - UINTN NumProtocolHandles; - EFI_STATUS Status; - EFI_COMPONENT_NAME2_PROTOCOL* Cnp1_2; // efi component name and componentName2 have same layout - EFI_GUID Protocol; - UINTN StrLength; - EFI_DEVICE_PATH_PROTOCOL* TmpDevPath; - UINTN Index1; - UINTN Index2; - EFI_HANDLE TmpHandle; - CHAR16 *DevName; - - if (Dev == NULL || AllHandlesBuffer == NULL || NumAllHandles == 0) { - return FALSE; - } - - Protocol = UseComp1 ? gEfiComponentNameProtocolGuid : gEfiComponentName2ProtocolGuid; - - // - // Find all EFI_HANDLES with protocol - // - Status = gBS->LocateHandleBuffer( - ByProtocol, - &Protocol, - NULL, - &NumProtocolHandles, - &ProtocolHandlesBuffer - ); - if (EFI_ERROR(Status)) { - return FALSE; - } - - - // - // Exit early if no supported devices - // - if (NumProtocolHandles == 0) { - return FALSE; - } - - // - // Get printable name by iterating through all protocols - // using the handle as the child, and iterate through all handles for the controller - // exit loop early once found, if not found, then delete device - // storage security protocol instances already exist, add them to internal list - // - Status = EFI_DEVICE_ERROR; - for (Index1 = 0; Index1 < NumProtocolHandles; Index1++) { - DevName = NULL; - - if (Dev->Name16 != NULL) { - return TRUE; - } - - TmpHandle = ProtocolHandlesBuffer[Index1]; - - Status = gBS->OpenProtocol( - TmpHandle, - &Protocol, - (VOID**)&Cnp1_2, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (EFI_ERROR(Status) || Cnp1_2 == NULL) { - continue; - } - - // - // Use all handles array as controller handle - // - for (Index2 = 0; Index2 < NumAllHandles; Index2++) { - Status = Cnp1_2->GetControllerName( - Cnp1_2, - AllHandlesBuffer[Index2], - Dev->Handle, - LANGUAGE_ISO_639_2_ENGLISH, - &DevName - ); - if (EFI_ERROR(Status)) { - Status = Cnp1_2->GetControllerName( - Cnp1_2, - AllHandlesBuffer[Index2], - Dev->Handle, - LANGUAGE_RFC_3066_ENGLISH, - &DevName - ); - } - if (!EFI_ERROR(Status) && DevName != NULL) { - StrLength = StrLen(DevName) + 1; // Add one for NULL terminator - Dev->Name16 = AllocateZeroPool(StrLength * sizeof (CHAR16)); - ASSERT (Dev->Name16 != NULL); - StrCpyS (Dev->Name16, StrLength, DevName); - Dev->NameZ = (CHAR8*)AllocateZeroPool(StrLength); - UnicodeStrToAsciiStrS (DevName, Dev->NameZ, StrLength); - - // - // Retrieve bridge BDF info and port number or namespace depending on type - // - TmpDevPath = NULL; - Status = gBS->OpenProtocol( - Dev->Handle, - &gEfiDevicePathProtocolGuid, - (VOID**)&TmpDevPath, - gImageHandle, - NULL, - EFI_OPEN_PROTOCOL_GET_PROTOCOL - ); - if (!EFI_ERROR(Status)) { - Dev->OpalDevicePath = DuplicateDevicePath (TmpDevPath); - return TRUE; - } - - if (Dev->Name16 != NULL) { - FreePool(Dev->Name16); - Dev->Name16 = NULL; - } - if (Dev->NameZ != NULL) { - FreePool(Dev->NameZ); - Dev->NameZ = NULL; - } - } - } - } - - return FALSE; -} - -/** - Get devcie name through the component name protocol. - - @param[in] Dev The device which need to get name. - - @retval TRUE Find the name for this device. - @retval FALSE Not found the name for this device. -**/ -BOOLEAN -OpalDriverGetDriverDeviceName( - OPAL_DRIVER_DEVICE *Dev - ) -{ - EFI_HANDLE* AllHandlesBuffer; - UINTN NumAllHandles; - EFI_STATUS Status; - - if (Dev == NULL) { - DEBUG((DEBUG_ERROR | DEBUG_INIT, "OpalDriverGetDriverDeviceName Exiting, Dev=NULL\n")); - return FALSE; - } - - // - // Iterate through ComponentName2 handles to get name, if fails, try ComponentName - // - if (Dev->Name16 == NULL) { - DEBUG((DEBUG_ERROR | DEBUG_INIT, "Name is null, update it\n")); - // - // Find all EFI_HANDLES - // - Status = gBS->LocateHandleBuffer( - AllHandles, - NULL, - NULL, - &NumAllHandles, - &AllHandlesBuffer - ); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_INFO, "LocateHandleBuffer for AllHandles failed %r\n", Status )); - return FALSE; - } - - // - // Try component Name2 - // - if (!OpalDriverGetDeviceNameByProtocol(AllHandlesBuffer, NumAllHandles, Dev, FALSE)) { - DEBUG((DEBUG_ERROR | DEBUG_INIT, "ComponentName2 failed to get device name, try ComponentName\n")); - if (!OpalDriverGetDeviceNameByProtocol(AllHandlesBuffer, NumAllHandles, Dev, TRUE)) { - DEBUG((DEBUG_ERROR | DEBUG_INIT, "ComponentName failed to get device name, skip device\n")); - return FALSE; - } - } - } - - return TRUE; -} - -/** - Main entry for this driver. - - @param ImageHandle Image Handle this driver. - @param SystemTable Pointer to SystemTable. - - @retval EFI_SUCESS This function always complete successfully. -**/ -EFI_STATUS -EFIAPI -EfiDriverEntryPoint( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE* SystemTable - ) -{ - EFI_STATUS Status; - EFI_EVENT ReadyToBootEvent; - - Status = EfiLibInstallDriverBindingComponentName2 ( - ImageHandle, - SystemTable, - &gOpalDriverBinding, - ImageHandle, - &gOpalComponentName, - &gOpalComponentName2 - ); - - if (EFI_ERROR(Status)) { - DEBUG((DEBUG_ERROR, "Install protocols to Opal driver Handle failed\n")); - return Status ; - } - - // - // Initialize Driver object - // - ZeroMem(&mOpalDriver, sizeof(mOpalDriver)); - mOpalDriver.Handle = ImageHandle; - - // - // register a ReadyToBoot event callback for sending BlockSid command - // - Status = EfiCreateEventReadyToBootEx ( - TPL_CALLBACK, - ReadyToBootCallback, - (VOID *) &ImageHandle, - &ReadyToBootEvent - ); - - // - // Install Hii packages. - // - HiiInstall(); - - return Status; -} - -/** - Tests to see if this driver supports a given controller. - - This function checks to see if the controller contains an instance of the - EFI_STORAGE_SECURITY_COMMAND_PROTOCOL and the EFI_BLOCK_IO_PROTOCL - and returns EFI_SUCCESS if it does. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The Handle of the controller to test. This Handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath This parameter is ignored. - - @retval EFI_SUCCESS The device contains required protocols - @retval EFI_ALREADY_STARTED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by the driver - specified by This. - @retval EFI_ACCESS_DENIED The device specified by ControllerHandle and - RemainingDevicePath is already being managed by a different - driver or an application that requires exclusive access. - Currently not implemented. - @retval EFI_UNSUPPORTED The device does not contain requires protocols - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverBindingSupported( - IN EFI_DRIVER_BINDING_PROTOCOL* This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL* RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_STORAGE_SECURITY_COMMAND_PROTOCOL* SecurityCommand; - EFI_BLOCK_IO_PROTOCOL* BlkIo; - - // - // Test EFI_STORAGE_SECURITY_COMMAND_PROTOCOL on controller Handle. - // - Status = gBS->OpenProtocol( - Controller, - &gEfiStorageSecurityCommandProtocolGuid, - ( VOID ** )&SecurityCommand, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (Status == EFI_ALREADY_STARTED) { - return EFI_SUCCESS; - } - - if (EFI_ERROR(Status)) { - return Status; - } - - // - // Close protocol and reopen in Start call - // - gBS->CloseProtocol( - Controller, - &gEfiStorageSecurityCommandProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - // - // Test EFI_BLOCK_IO_PROTOCOL on controller Handle, required by EFI_STORAGE_SECURITY_COMMAND_PROTOCOL - // function APIs - // - Status = gBS->OpenProtocol( - Controller, - &gEfiBlockIoProtocolGuid, - (VOID **)&BlkIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - - if (EFI_ERROR(Status)) { - DEBUG((DEBUG_INFO, "No EFI_BLOCK_IO_PROTOCOL on controller\n")); - return Status; - } - - // - // Close protocol and reopen in Start call - // - gBS->CloseProtocol( - Controller, - &gEfiBlockIoProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - return EFI_SUCCESS; -} - -/** - Enables Opal Management on a supported device if available. - - The start function is designed to be called after the Opal UEFI Driver has confirmed the - "controller", which is a child Handle, contains the EF_STORAGE_SECURITY_COMMAND protocols. - This function will complete the other necessary checks, such as verifying the device supports - the correct version of Opal. Upon verification, it will add the device to the - Opal HII list in order to expose Opal managmeent options. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The Handle of the controller to start. This Handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This - parameter is ignored by device drivers, and is optional for bus - drivers. For a bus driver, if this parameter is NULL, then handles - for all the children of Controller are created by this driver. - If this parameter is not NULL and the first Device Path Node is - not the End of Device Path Node, then only the Handle for the - child device specified by the first Device Path Node of - RemainingDevicePath is created by this driver. - If the first Device Path Node of RemainingDevicePath is - the End of Device Path Node, no child Handle is created by this - driver. - - @retval EFI_SUCCESS Opal management was enabled. - @retval EFI_DEVICE_ERROR The device could not be started due to a device error.Currently not implemented. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval Others The driver failed to start the device. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverBindingStart( - IN EFI_DRIVER_BINDING_PROTOCOL* This, - IN EFI_HANDLE Controller, - IN EFI_DEVICE_PATH_PROTOCOL* RemainingDevicePath - ) -{ - EFI_STATUS Status; - EFI_BLOCK_IO_PROTOCOL *BlkIo; - OPAL_DRIVER_DEVICE *Dev; - OPAL_DRIVER_DEVICE *Itr; - BOOLEAN Result; - - Itr = mOpalDriver.DeviceList; - while (Itr != NULL) { - if (Controller == Itr->Handle) { - return EFI_SUCCESS; - } - Itr = Itr->Next; - } - - // - // Create internal device for tracking. This allows all disks to be tracked - // by same HII form - // - Dev = (OPAL_DRIVER_DEVICE*)AllocateZeroPool(sizeof(OPAL_DRIVER_DEVICE)); - if (Dev == NULL) { - return EFI_OUT_OF_RESOURCES; - } - Dev->Handle = Controller; - - // - // Open EFI_STORAGE_SECURITY_COMMAND_PROTOCOL to perform Opal supported checks - // - Status = gBS->OpenProtocol( - Controller, - &gEfiStorageSecurityCommandProtocolGuid, - (VOID **)&Dev->Sscp, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR(Status)) { - FreePool(Dev); - return Status; - } - - // - // Open EFI_BLOCK_IO_PROTOCOL on controller Handle, required by EFI_STORAGE_SECURITY_COMMAND_PROTOCOL - // function APIs - // - Status = gBS->OpenProtocol( - Controller, - &gEfiBlockIoProtocolGuid, - (VOID **)&BlkIo, - This->DriverBindingHandle, - Controller, - EFI_OPEN_PROTOCOL_BY_DRIVER - ); - if (EFI_ERROR(Status)) { - // - // Close storage security that was opened - // - gBS->CloseProtocol( - Controller, - &gEfiStorageSecurityCommandProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - FreePool(Dev); - return Status; - } - - // - // Save mediaId - // - Dev->MediaId = BlkIo->Media->MediaId; - - gBS->CloseProtocol( - Controller, - &gEfiBlockIoProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - // - // Acquire Ascii printable name of child, if not found, then ignore device - // - Result = OpalDriverGetDriverDeviceName (Dev); - if (!Result) { - goto Done; - } - - Status = OpalDiskInitialize (Dev); - if (EFI_ERROR (Status)) { - goto Done; - } - - AddDeviceToTail(Dev); - - // - // check if device is locked and prompt for password - // - OpalDriverRequestPassword (Dev); - - return EFI_SUCCESS; - -Done: - // - // free device, close protocols and exit - // - gBS->CloseProtocol( - Controller, - &gEfiStorageSecurityCommandProtocolGuid, - This->DriverBindingHandle, - Controller - ); - - FreePool(Dev); - - return EFI_DEVICE_ERROR; -} - -/** - Stop this driver on Controller. - - @param This Protocol instance pointer. - @param Controller Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed Controller. - @retval other This driver could not be removed from this device. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverBindingStop( - EFI_DRIVER_BINDING_PROTOCOL* This, - EFI_HANDLE Controller, - UINTN NumberOfChildren, - EFI_HANDLE* ChildHandleBuffer - ) -{ - OPAL_DRIVER_DEVICE* Itr; - - Itr = mOpalDriver.DeviceList; - - // - // does Controller match any of the devices we are managing for Opal - // - while (Itr != NULL) { - if (Itr->Handle == Controller) { - OpalDriverStopDevice (Itr); - return EFI_SUCCESS; - } - - Itr = Itr->Next; - } - - return EFI_NOT_FOUND; -} - - -/** - Unloads UEFI Driver. Very useful for debugging and testing. - - @param ImageHandle Image Handle this driver. - - @retval EFI_SUCCESS This function always complete successfully. - @retval EFI_INVALID_PARAMETER The input ImageHandle is not valid. -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverUnload ( - IN EFI_HANDLE ImageHandle - ) -{ - EFI_STATUS Status; - OPAL_DRIVER_DEVICE *Itr; - - Status = EFI_SUCCESS; - - if (ImageHandle != gImageHandle) { - return (EFI_INVALID_PARAMETER); - } - - // - // Uninstall any interface added to each device by us - // - while (mOpalDriver.DeviceList) { - Itr = mOpalDriver.DeviceList; - // - // Remove OPAL_DRIVER_DEVICE from the list - // it updates the controllerList pointer - // - OpalDriverStopDevice(Itr); - } - - // - // Uninstall the HII capability - // - Status = HiiUninstall(); - - return Status; -} - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.h b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.h deleted file mode 100644 index 7761d64cbb..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.h +++ /dev/null @@ -1,412 +0,0 @@ -/** @file - Values defined and used by the Opal UEFI Driver. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _OPAL_DRIVER_H_ -#define _OPAL_DRIVER_H_ - -#include - -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#define EFI_DRIVER_NAME_UNICODE L"1.0 UEFI Opal Driver" - -// UEFI 2.1 -#define LANGUAGE_RFC_3066_ENGLISH ((CHAR8*)"en") - -// UEFI/EFI < 2.1 -#define LANGUAGE_ISO_639_2_ENGLISH ((CHAR8*)"eng") - - -#define UNLOCK_VAR_NAME (const CHAR16*)L"UNLOCK" -#define OPAL_FILTER_DRIVER_VAR_NAME L"FILTER_DRIVER" - - -#define CONCAT_(x, y) x ## y -#define CONCAT(x, y) CONCAT_(x, y) - -#define UNICODE_STR(x) CONCAT( L, x ) - -extern EFI_DRIVER_BINDING_PROTOCOL gOpalDriverBinding; -extern EFI_COMPONENT_NAME_PROTOCOL gOpalComponentName; -extern EFI_COMPONENT_NAME2_PROTOCOL gOpalComponentName2; - -/** - Unloads UEFI Driver. Very useful for debugging and testing. - - @param ImageHandle Image handle this driver. - - @retval EFI_SUCCESS This function always complete successfully. - @retval EFI_INVALID_PARAMETER The input ImageHandle is not valid. -**/ -EFI_STATUS -EFIAPI -EfiDriverUnload( - EFI_HANDLE ImageHandle - ); - - -/** - Test to see if this driver supports Controller. - - @param This Protocol instance pointer. - @param ControllerHandle Handle of device to test - @param RemainingDevicePath Optional parameter use to pick a specific child - device to start. - - @retval EFI_SUCCESS This driver supports this device. - @retval EFI_ALREADY_STARTED This driver is already running on this device. - @retval other This driver does not support this device. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverBindingSupported( - EFI_DRIVER_BINDING_PROTOCOL* This, - EFI_HANDLE Controller, - EFI_DEVICE_PATH_PROTOCOL* RemainingDevicePath - ); - -/** - Enables Opal Management on a supported device if available. - - The start function is designed to be called after the Opal UEFI Driver has confirmed the - "controller", which is a child handle, contains the EF_STORAGE_SECURITY_COMMAND protocols. - This function will complete the other necessary checks, such as verifying the device supports - the correct version of Opal. Upon verification, it will add the device to the - Opal HII list in order to expose Opal managmeent options. - - @param[in] This A pointer to the EFI_DRIVER_BINDING_PROTOCOL instance. - @param[in] ControllerHandle The handle of the controller to start. This handle - must support a protocol interface that supplies - an I/O abstraction to the driver. - @param[in] RemainingDevicePath A pointer to the remaining portion of a device path. This - parameter is ignored by device drivers, and is optional for bus - drivers. For a bus driver, if this parameter is NULL, then handles - for all the children of Controller are created by this driver. - If this parameter is not NULL and the first Device Path Node is - not the End of Device Path Node, then only the handle for the - child device specified by the first Device Path Node of - RemainingDevicePath is created by this driver. - If the first Device Path Node of RemainingDevicePath is - the End of Device Path Node, no child handle is created by this - driver. - - @retval EFI_SUCCESS Opal management was enabled. - @retval EFI_DEVICE_ERROR The device could not be started due to a device error.Currently not implemented. - @retval EFI_OUT_OF_RESOURCES The request could not be completed due to a lack of resources. - @retval Others The driver failed to start the device. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverBindingStart( - EFI_DRIVER_BINDING_PROTOCOL* This, - EFI_HANDLE Controller, - EFI_DEVICE_PATH_PROTOCOL* RemainingDevicePath - ); - -/** - Stop this driver on Controller. - - @param This Protocol instance pointer. - @param Controller Handle of device to stop driver on - @param NumberOfChildren Number of Handles in ChildHandleBuffer. If number of - children is zero stop the entire bus driver. - @param ChildHandleBuffer List of Child Handles to Stop. - - @retval EFI_SUCCESS This driver is removed Controller. - @retval other This driver could not be removed from this device. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverBindingStop( - EFI_DRIVER_BINDING_PROTOCOL* This, - EFI_HANDLE Controller, - UINTN NumberOfChildren, - EFI_HANDLE* ChildHandleBuffer - ); - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentNameGetDriverName( - EFI_COMPONENT_NAME_PROTOCOL* This, - CHAR8* Language, - CHAR16** DriverName - ); - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentNameGetControllerName( - EFI_COMPONENT_NAME_PROTOCOL* This, - EFI_HANDLE ControllerHandle, - EFI_HANDLE ChildHandle, - CHAR8* Language, - CHAR16** ControllerName - ); - -/** - Retrieves a Unicode string that is the user readable name of the driver. - - This function retrieves the user readable name of a driver in the form of a - Unicode string. If the driver specified by This has a user readable name in - the language specified by Language, then a pointer to the driver name is - returned in DriverName, and EFI_SUCCESS is returned. If the driver specified - by This does not support the language specified by Language, - then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified - in RFC 4646 or ISO 639-2 language code format. - - @param DriverName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - driver specified by This in the language - specified by Language. - - @retval EFI_SUCCESS The Unicode string for the Driver specified by - This and the language specified by Language was - returned in DriverName. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER DriverName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentName2GetDriverName( - EFI_COMPONENT_NAME2_PROTOCOL* This, - CHAR8* Language, - CHAR16** DriverName - ); - -/** - Retrieves a Unicode string that is the user readable name of the controller - that is being managed by a driver. - - This function retrieves the user readable name of the controller specified by - ControllerHandle and ChildHandle in the form of a Unicode string. If the - driver specified by This has a user readable name in the language specified by - Language, then a pointer to the controller name is returned in ControllerName, - and EFI_SUCCESS is returned. If the driver specified by This is not currently - managing the controller specified by ControllerHandle and ChildHandle, - then EFI_UNSUPPORTED is returned. If the driver specified by This does not - support the language specified by Language, then EFI_UNSUPPORTED is returned. - - @param This[in] A pointer to the EFI_COMPONENT_NAME2_PROTOCOL or - EFI_COMPONENT_NAME_PROTOCOL instance. - - @param ControllerHandle[in] The handle of a controller that the driver - specified by This is managing. This handle - specifies the controller whose name is to be - returned. - - @param ChildHandle[in] The handle of the child controller to retrieve - the name of. This is an optional parameter that - may be NULL. It will be NULL for device - drivers. It will also be NULL for a bus drivers - that wish to retrieve the name of the bus - controller. It will not be NULL for a bus - driver that wishes to retrieve the name of a - child controller. - - @param Language[in] A pointer to a Null-terminated ASCII string - array indicating the language. This is the - language of the driver name that the caller is - requesting, and it must match one of the - languages specified in SupportedLanguages. The - number of languages supported by a driver is up - to the driver writer. Language is specified in - RFC 4646 or ISO 639-2 language code format. - - @param ControllerName[out] A pointer to the Unicode string to return. - This Unicode string is the name of the - controller specified by ControllerHandle and - ChildHandle in the language specified by - Language from the point of view of the driver - specified by This. - - @retval EFI_SUCCESS The Unicode string for the user readable name in - the language specified by Language for the - driver specified by This was returned in - DriverName. - - @retval EFI_INVALID_PARAMETER ControllerHandle is NULL. - - @retval EFI_INVALID_PARAMETER ChildHandle is not NULL and it is not a valid - EFI_HANDLE. - - @retval EFI_INVALID_PARAMETER Language is NULL. - - @retval EFI_INVALID_PARAMETER ControllerName is NULL. - - @retval EFI_UNSUPPORTED The driver specified by This is not currently - managing the controller specified by - ControllerHandle and ChildHandle. - - @retval EFI_UNSUPPORTED The driver specified by This does not support - the language specified by Language. - -**/ -EFI_STATUS -EFIAPI -OpalEfiDriverComponentName2GetControllerName( - EFI_COMPONENT_NAME2_PROTOCOL* This, - EFI_HANDLE ControllerHandle, - EFI_HANDLE ChildHandle, - CHAR8* Language, - CHAR16** ControllerName - ); - -#endif //_OPAL_DRIVER_H_ diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriverPrivate.h b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriverPrivate.h deleted file mode 100644 index 19ebc32623..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriverPrivate.h +++ /dev/null @@ -1,102 +0,0 @@ -/** @file - Private structures and functions used within OPAL_DRIVER - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _OPAL_DRIVER_PRIVATE_H_ -#define _OPAL_DRIVER_PRIVATE_H_ -#include "OpalDriver.h" - -#define OPAL_MSID_LENGHT 128 - -#pragma pack(1) -// -// Structure that is used to represent an OPAL_DISK. -// -typedef struct { - UINT32 MsidLength; // Byte length of MSID Pin for device - UINT8 Msid[OPAL_MSID_LENGHT]; // MSID Pin for device - EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *Sscp; - UINT32 MediaId; // MediaId is used by Ssc Protocol. - EFI_DEVICE_PATH_PROTOCOL *OpalDevicePath; - UINT16 OpalBaseComId; // Opal SSC 1 base com id. - OPAL_OWNER_SHIP Owner; - OPAL_DISK_SUPPORT_ATTRIBUTE SupportedAttributes; - TCG_LOCKING_FEATURE_DESCRIPTOR LockingFeature; // Locking Feature Descriptor retrieved from performing a Level 0 Discovery -} OPAL_DISK; - -// -// Device with block IO protocol -// -typedef struct _OPAL_DRIVER_DEVICE OPAL_DRIVER_DEVICE; - -struct _OPAL_DRIVER_DEVICE { - OPAL_DRIVER_DEVICE *Next; ///< Linked list pointer - EFI_HANDLE Handle; ///< Device handle - OPAL_DISK OpalDisk; ///< User context - CHAR16 *Name16; ///< Allocated/freed by UEFI Filter Driver at device creation/removal - CHAR8 *NameZ; ///< Allocated/freed by UEFI Filter Driver at device creation/removal - UINT32 MediaId; ///< Required parameter for EFI_STORAGE_SECURITY_COMMAND_PROTOCOL, from BLOCK_IO_MEDIA - - EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *Sscp; /// Device protocols consumed - EFI_DEVICE_PATH_PROTOCOL *OpalDevicePath; -}; - -// -// Opal Driver UEFI Driver Model -// -typedef struct { - EFI_HANDLE Handle; ///< Driver image handle - OPAL_DRIVER_DEVICE *DeviceList; ///< Linked list of controllers owned by this Driver -} OPAL_DRIVER; -#pragma pack() - -// -// Retrieves a OPAL_DRIVER_DEVICE based on the pointer to its StorageSecurity protocol. -// -#define DRIVER_DEVICE_FROM_OPALDISK(OpalDiskPointer) (OPAL_DRIVER_DEVICE*)(BASE_CR(OpalDiskPointer, OPAL_DRIVER_DEVICE, OpalDisk)) - -/** - Get devcie list info. - - @retval return the device list pointer. -**/ -OPAL_DRIVER_DEVICE* -OpalDriverGetDeviceList( - VOID - ); - -/** - Get devcie name through the component name protocol. - - @param[in] Dev The device which need to get name. - - @retval TRUE Find the name for this device. - @retval FALSE Not found the name for this device. -**/ -BOOLEAN -OpalDriverGetDriverDeviceName( - OPAL_DRIVER_DEVICE *Dev - ); - -/** - Get current device count. - - @retval return the current created device count. - -**/ -UINT8 -GetDeviceCount ( - VOID - ); - -#endif // _OPAL_DRIVER_P_H_ diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c deleted file mode 100644 index e3bde4275d..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c +++ /dev/null @@ -1,1527 +0,0 @@ -/** @file - Implementation of the HII for the Opal UEFI Driver. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "OpalHii.h" -#include "OpalDriver.h" -#include "OpalHiiPrivate.h" - -// -// This is the generated IFR binary Data for each formset defined in VFR. -// This Data array is ready to be used as input of HiiAddPackages() to -// create a packagelist (which contains Form packages, String packages, etc). -// -extern UINT8 OpalPasswordFormBin[]; - -// -// This is the generated String package Data for all .UNI files. -// This Data array is ready to be used as input of HiiAddPackages() to -// create a packagelist (which contains Form packages, String packages, etc). -// -extern UINT8 OpalPasswordDxeStrings[]; - -CHAR16 OpalPasswordStorageName[] = L"OpalHiiConfig"; - -EFI_HII_CONFIG_ACCESS_PROTOCOL gHiiConfigAccessProtocol; - -// -// Handle to the list of HII packages (forms and strings) for this driver -// -EFI_HII_HANDLE gHiiPackageListHandle = NULL; - -// -// Package List GUID containing all form and string packages -// -const EFI_GUID gHiiPackageListGuid = PACKAGE_LIST_GUID; -const EFI_GUID gHiiSetupVariableGuid = SETUP_VARIABLE_GUID; - -// -// Structure that contains state of the HII -// This structure is updated by Hii.cpp and its contents -// is rendered in the HII. -// -OPAL_HII_CONFIGURATION gHiiConfiguration; - -CHAR8 gHiiOldPassword[MAX_PASSWORD_CHARACTER_LENGTH] = {0}; -UINT32 gHiiOldPasswordLength = 0; - -// -// The device path containing the VENDOR_DEVICE_PATH and EFI_DEVICE_PATH_PROTOCOL -// -HII_VENDOR_DEVICE_PATH gHiiVendorDevicePath = { - { - { - HARDWARE_DEVICE_PATH, - HW_VENDOR_DP, - { - (UINT8)(sizeof(VENDOR_DEVICE_PATH)), - (UINT8)((sizeof(VENDOR_DEVICE_PATH)) >> 8) - } - }, - OPAL_PASSWORD_CONFIG_GUID - }, - { - END_DEVICE_PATH_TYPE, - END_ENTIRE_DEVICE_PATH_SUBTYPE, - { - (UINT8)(END_DEVICE_PATH_LENGTH), - (UINT8)((END_DEVICE_PATH_LENGTH) >> 8) - } - } -}; - - -/** - Sets the current system state of global config variables. - -**/ -VOID -HiiSetCurrentConfiguration( - VOID - ) -{ - UINT32 PpStorageFlag; - EFI_STRING NewString; - - gHiiConfiguration.NumDisks = GetDeviceCount(); - - // - // Update the BlockSID status string. - // - PpStorageFlag = Tcg2PhysicalPresenceLibGetManagementFlags (); - - if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_ENABLE_BLOCK_SID) != 0) { - NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_ENABLED), NULL); - if (NewString == NULL) { - DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n")); - return; - } - } else { - NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISABLED), NULL); - if (NewString == NULL) { - DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n")); - return; - } - } - HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS1), NewString, NULL); - FreePool (NewString); - - if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_ENABLE_BLOCK_SID) != 0) { - NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), NULL); - if (NewString == NULL) { - DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n")); - return; - } - } else { - NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), NULL); - if (NewString == NULL) { - DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n")); - return; - } - } - HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS2), NewString, NULL); - FreePool (NewString); - - if ((PpStorageFlag & TCG2_BIOS_STORAGE_MANAGEMENT_FLAG_PP_REQUIRED_FOR_DISABLE_BLOCK_SID) != 0) { - NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), NULL); - if (NewString == NULL) { - DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n")); - return; - } - } else { - NewString = HiiGetString (gHiiPackageListHandle, STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), NULL); - if (NewString == NULL) { - DEBUG ((DEBUG_INFO, "HiiSetCurrentConfiguration: HiiGetString( ) failed\n")); - return; - } - } - HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_BLOCKSID_STATUS3), NewString, NULL); - FreePool (NewString); -} - -/** - Install the HII related resources. - - @retval EFI_SUCCESS Install all the resources success. - @retval other Error occur when install the resources. -**/ -EFI_STATUS -HiiInstall( - VOID - ) -{ - EFI_STATUS Status; - EFI_HANDLE DriverHandle; - - // - // Clear the global configuration. - // - ZeroMem(&gHiiConfiguration, sizeof(gHiiConfiguration)); - - // - // Obtain the driver handle that the BIOS assigned us - // - DriverHandle = HiiGetDriverImageHandleCB(); - - // - // Populate the config access protocol with the three functions we are publishing - // - gHiiConfigAccessProtocol.ExtractConfig = ExtractConfig; - gHiiConfigAccessProtocol.RouteConfig = RouteConfig; - gHiiConfigAccessProtocol.Callback = DriverCallback; - - // - // Associate the required protocols with our driver handle - // - Status = gBS->InstallMultipleProtocolInterfaces( - &DriverHandle, - &gEfiHiiConfigAccessProtocolGuid, - &gHiiConfigAccessProtocol, // HII callback - &gEfiDevicePathProtocolGuid, - &gHiiVendorDevicePath, // required for HII callback allow all disks to be shown in same hii - NULL - ); - - if (EFI_ERROR(Status)) { - return Status; - } - - return OpalHiiAddPackages(); -} - -/** - Install the HII form and string packages. - - @retval EFI_SUCCESS Install all the resources success. - @retval EFI_OUT_OF_RESOURCES Out of resource error. -**/ -EFI_STATUS -OpalHiiAddPackages( - VOID - ) -{ - EFI_HANDLE DriverHandle; - CHAR16 *NewString; - - DriverHandle = HiiGetDriverImageHandleCB(); - - // - // Publish the HII form and HII string packages - // - gHiiPackageListHandle = HiiAddPackages( - &gHiiPackageListGuid, - DriverHandle, - OpalPasswordDxeStrings, - OpalPasswordFormBin, - (VOID*)NULL - ); - - // - // Make sure the packages installed successfully - // - if (gHiiPackageListHandle == NULL) { - DEBUG ((DEBUG_INFO, "OpalHiiAddPackages failed\n")); - return EFI_OUT_OF_RESOURCES; - } - - // - // Update Version String in main window - // - NewString = HiiGetDriverNameCB (); - if (HiiSetString(gHiiPackageListHandle, STRING_TOKEN(STR_MAIN_OPAL_VERSION), NewString, NULL) == 0) { - DEBUG ((DEBUG_INFO, "OpalHiiAddPackages: HiiSetString( ) failed\n")); - return EFI_OUT_OF_RESOURCES; - } - - return EFI_SUCCESS; -} - -/** - Uninstall the HII capability. - - @retval EFI_SUCCESS Uninstall all the resources success. - @retval others Other errors occur when unistall the hii resource. -**/ -EFI_STATUS -HiiUninstall( - VOID - ) -{ - EFI_STATUS Status; - - // - // Remove the packages we've provided to the BIOS - // - HiiRemovePackages(gHiiPackageListHandle); - - // - // Remove the protocols from our driver handle - // - Status = gBS->UninstallMultipleProtocolInterfaces( - HiiGetDriverImageHandleCB(), - &gEfiHiiConfigAccessProtocolGuid, - &gHiiConfigAccessProtocol, // HII callback - &gEfiDevicePathProtocolGuid, - &gHiiVendorDevicePath, // required for HII callback - NULL - ); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_INFO, "Cannot uninstall Hii Protocols: %r\n", Status)); - } - - return Status; -} - -/** - Updates the main menu form. - - @retval EFI_SUCCESS update the main form success. -**/ -EFI_STATUS -HiiPopulateMainMenuForm ( - VOID - ) -{ - UINT8 Index; - CHAR8 *DiskName; - EFI_STRING_ID DiskNameId; - OPAL_DISK *OpalDisk; - - HiiSetCurrentConfiguration(); - - gHiiConfiguration.SupportedDisks = 0; - - for (Index = 0; Index < gHiiConfiguration.NumDisks; Index++) { - OpalDisk = HiiGetOpalDiskCB (Index); - if ((OpalDisk != NULL) && OpalFeatureSupported (&OpalDisk->SupportedAttributes)) { - gHiiConfiguration.SupportedDisks |= (1 << Index); - DiskNameId = GetDiskNameStringId (Index); - DiskName = HiiDiskGetNameCB (Index); - if ((DiskName == NULL) || (DiskNameId == 0)) { - return EFI_UNSUPPORTED; - } - HiiSetFormString(DiskNameId, DiskName); - } - } - - OpalHiiSetBrowserData (); - return EFI_SUCCESS; -} - -/** - Update the disk action info. - - @param ActionString - @param SelectedAction - - @retval EFI_SUCCESS Uninstall all the resources success. -**/ -EFI_STATUS -HiiSelectDiskAction ( - CHAR8 *ActionString, - UINT8 SelectedAction - ) -{ - OPAL_DISK *OpalDisk; - OPAL_DISK_ACTIONS AvailActions; - - OpalHiiGetBrowserData (); - - HiiSetFormString(STRING_TOKEN(STR_DISK_ACTION_LBL), ActionString); - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), " "); - - gHiiConfiguration.SelectedAction = SelectedAction; - gHiiConfiguration.AvailableFields = 0; - - OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex); - if (OpalDisk == NULL) { - return EFI_INVALID_PARAMETER; - } - - if (OpalSupportGetAvailableActions (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions) != TcgResultSuccess) { - return EFI_DEVICE_ERROR; - } - - switch (SelectedAction) { - case HII_KEY_ID_GOTO_LOCK: - case HII_KEY_ID_GOTO_UNLOCK: - case HII_KEY_ID_GOTO_SET_ADMIN_PWD: - case HII_KEY_ID_GOTO_SET_USER_PWD: - case HII_KEY_ID_GOTO_SECURE_ERASE: - case HII_KEY_ID_GOTO_DISABLE_USER: - case HII_KEY_ID_GOTO_ENABLE_FEATURE: // User is required to enter Password to enable Feature - gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD; - break; - - case HII_KEY_ID_GOTO_PSID_REVERT: - gHiiConfiguration.AvailableFields |= HII_FIELD_PSID; - break; - - case HII_KEY_ID_GOTO_REVERT: - gHiiConfiguration.AvailableFields |= HII_FIELD_PASSWORD; - gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA; - if (AvailActions.RevertKeepDataForced) { - gHiiConfiguration.AvailableFields |= HII_FIELD_KEEP_USER_DATA_FORCED; - } - break; - } - - OpalHiiSetBrowserData (); - - return EFI_SUCCESS; -} - -/** - Get disk name string id. - - @param DiskIndex The input disk index info. - - @retval The disk name string id. - -**/ -EFI_STRING_ID -GetDiskNameStringId( - UINT8 DiskIndex - ) -{ - switch (DiskIndex) { - case 0: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0); - case 1: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1); - case 2: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2); - case 3: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3); - case 4: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4); - case 5: return STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5); - } - return 0; -} - -/** - This function processes the results of changes in configuration. - - @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param Action Specifies the type of action taken by the browser. - @param QuestionId A unique value which is sent to the original - exporting driver so that it can identify the type - of data to expect. - @param Type The type of value for the question. - @param Value A pointer to the data being sent to the original - exporting driver. - @param ActionRequest On return, points to the action requested by the - callback function. - - @retval EFI_SUCCESS The callback successfully handled the action. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the - variable and its data. - @retval EFI_DEVICE_ERROR The variable could not be saved. - @retval EFI_UNSUPPORTED The specified Action is not supported by the - callback. - -**/ -EFI_STATUS -EFIAPI -DriverCallback( - CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - EFI_BROWSER_ACTION Action, - EFI_QUESTION_ID QuestionId, - UINT8 Type, - EFI_IFR_TYPE_VALUE *Value, - EFI_BROWSER_ACTION_REQUEST *ActionRequest - ) -{ - HII_KEY HiiKey; - UINT8 HiiKeyId; - UINT32 PpRequest; - - if (ActionRequest != NULL) { - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE; - } else { - return EFI_INVALID_PARAMETER; - } - - // - // If QuestionId is an auto-generated key (label, empty line, etc.), ignore it. - // - if ((QuestionId & HII_KEY_FLAG) == 0) { - return EFI_SUCCESS; - } - - HiiKey.Raw = QuestionId; - HiiKeyId = (UINT8) HiiKey.KeyBits.Id; - - if (Action == EFI_BROWSER_ACTION_FORM_OPEN) { - switch (HiiKeyId) { - case HII_KEY_ID_VAR_SUPPORTED_DISKS: - DEBUG ((DEBUG_INFO, "HII_KEY_ID_VAR_SUPPORTED_DISKS\n")); - return HiiPopulateMainMenuForm (); - - case HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS: - return HiiPopulateDiskInfoForm(); - } - } else if (Action == EFI_BROWSER_ACTION_CHANGING) { - switch (HiiKeyId) { - case HII_KEY_ID_GOTO_DISK_INFO: - return HiiSelectDisk((UINT8)HiiKey.KeyBits.Index); - - case HII_KEY_ID_GOTO_LOCK: - return HiiSelectDiskAction("Action: Lock", HiiKeyId); - - case HII_KEY_ID_GOTO_UNLOCK: - return HiiSelectDiskAction("Action: Unlock", HiiKeyId); - - case HII_KEY_ID_GOTO_SET_ADMIN_PWD: - return HiiSelectDiskAction("Action: Set Administrator Password", HiiKeyId); - - case HII_KEY_ID_GOTO_SET_USER_PWD: - return HiiSelectDiskAction("Action: Set User Password", HiiKeyId); - - case HII_KEY_ID_GOTO_SECURE_ERASE: - return HiiSelectDiskAction("Action: Secure Erase", HiiKeyId); - - case HII_KEY_ID_GOTO_PSID_REVERT: - return HiiSelectDiskAction("Action: Revert to Factory Defaults with PSID", HiiKeyId); - - case HII_KEY_ID_GOTO_REVERT: - return HiiSelectDiskAction("Action: Revert to Factory Defaults", HiiKeyId); - - case HII_KEY_ID_GOTO_DISABLE_USER: - return HiiSelectDiskAction("Action: Disable User", HiiKeyId); - - case HII_KEY_ID_GOTO_ENABLE_FEATURE: - return HiiSelectDiskAction("Action: Enable Feature", HiiKeyId); - - case HII_KEY_ID_ENTER_PASSWORD: - return HiiPasswordEntered(Value->string); - - case HII_KEY_ID_ENTER_PSID: - return HiiPsidRevert(Value->string); - - } - } else if (Action == EFI_BROWSER_ACTION_CHANGED) { - switch (HiiKeyId) { - case HII_KEY_ID_BLOCKSID: - switch (Value->u8) { - case 0: - PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION; - break; - - case 1: - PpRequest = TCG2_PHYSICAL_PRESENCE_ENABLE_BLOCK_SID; - break; - - case 2: - PpRequest = TCG2_PHYSICAL_PRESENCE_DISABLE_BLOCK_SID; - break; - - case 3: - PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_TRUE; - break; - - case 4: - PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_ENABLE_BLOCK_SID_FUNC_FALSE; - break; - - case 5: - PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_TRUE; - break; - - case 6: - PpRequest = TCG2_PHYSICAL_PRESENCE_SET_PP_REQUIRED_FOR_DISABLE_BLOCK_SID_FUNC_FALSE; - break; - - default: - PpRequest = TCG2_PHYSICAL_PRESENCE_NO_ACTION; - DEBUG ((DEBUG_ERROR, "Invalid value input!\n")); - break; - } - HiiSetBlockSidAction(PpRequest); - - *ActionRequest = EFI_BROWSER_ACTION_REQUEST_FORM_APPLY; - return EFI_SUCCESS; - - default: - break; - } - } - - return EFI_UNSUPPORTED; -} - -/** - Update the global Disk index info. - - @param Index The input disk index info. - - @retval EFI_SUCCESS Update the disk index info success. - -**/ -EFI_STATUS -HiiSelectDisk( - UINT8 Index - ) -{ - OpalHiiGetBrowserData(); - gHiiConfiguration.SelectedDiskIndex = Index; - OpalHiiSetBrowserData (); - - return EFI_SUCCESS; -} - -/** - Draws the disk info form. - - @retval EFI_SUCCESS Draw the disk info success. - -**/ -EFI_STATUS -HiiPopulateDiskInfoForm( - VOID - ) -{ - OPAL_DISK* OpalDisk; - OPAL_DISK_ACTIONS AvailActions; - TCG_RESULT Ret; - CHAR8 *DiskName; - - OpalHiiGetBrowserData(); - - DiskName = HiiDiskGetNameCB (gHiiConfiguration.SelectedDiskIndex); - if (DiskName == NULL) { - return EFI_UNSUPPORTED; - } - HiiSetFormString(STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME), DiskName); - - ZeroMem(gHiiConfiguration.Psid, sizeof(gHiiConfiguration.Psid)); - - gHiiConfiguration.SelectedDiskAvailableActions = HII_ACTION_NONE; - - OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex); - - if (OpalDisk != NULL) { - OpalDiskUpdateStatus (OpalDisk); - Ret = OpalSupportGetAvailableActions(&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature, OpalDisk->Owner, &AvailActions); - if (Ret == TcgResultSuccess) { - // - // Update actions, always allow PSID Revert - // - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.PsidRevert == 1) ? HII_ACTION_PSID_REVERT : HII_ACTION_NONE; - - // - // Always allow unlock to handle device migration - // - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Unlock == 1) ? HII_ACTION_UNLOCK : HII_ACTION_NONE; - - if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) { - if (OpalDisk->Owner == OpalOwnershipNobody) { - gHiiConfiguration.SelectedDiskAvailableActions |= HII_ACTION_ENABLE_FEATURE; - - // - // Update strings - // - HiiSetFormString( STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default"); - } else { - DEBUG ((DEBUG_INFO, "Feature disabled but ownership != nobody\n")); - } - } else { - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.Revert == 1) ? HII_ACTION_REVERT : HII_ACTION_NONE; - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.AdminPass == 1) ? HII_ACTION_SET_ADMIN_PWD : HII_ACTION_NONE; - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.UserPass == 1) ? HII_ACTION_SET_USER_PWD : HII_ACTION_NONE; - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.SecureErase == 1) ? HII_ACTION_SECURE_ERASE : HII_ACTION_NONE; - gHiiConfiguration.SelectedDiskAvailableActions |= (AvailActions.DisableUser == 1) ? HII_ACTION_DISABLE_USER : HII_ACTION_NONE; - - HiiSetFormString (STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), "PSID Revert to factory default and Disable"); - - // - // Determine revert options for disk - // Default initialize keep user Data to be true - // - gHiiConfiguration.KeepUserData = 1; - } - } - } - - // - // Pass the current configuration to the BIOS - // - OpalHiiSetBrowserData (); - - return EFI_SUCCESS; -} - -/** - Reverts the Opal disk to factory default. - - @param PsidStringId The string id for the PSID info. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiPsidRevert( - EFI_STRING_ID PsidStringId - ) -{ - CHAR8 Response[DEFAULT_RESPONSE_SIZE]; - TCG_PSID Psid; - OPAL_DISK *OpalDisk; - TCG_RESULT Ret; - OPAL_SESSION Session; - CHAR16 *UnicodeStr; - UINT8 TmpBuf[PSID_CHARACTER_STRING_END_LENGTH]; - - Ret = TcgResultFailure; - - UnicodeStr = HiiGetString (gHiiPackageListHandle, PsidStringId, NULL); - ZeroMem (TmpBuf, sizeof (TmpBuf)); - UnicodeStrToAsciiStrS (UnicodeStr, (CHAR8*)TmpBuf, PSID_CHARACTER_STRING_END_LENGTH); - CopyMem (Psid.Psid, TmpBuf, PSID_CHARACTER_LENGTH); - HiiSetString (gHiiPackageListHandle, PsidStringId, L"", NULL); - ZeroMem (TmpBuf, sizeof (TmpBuf)); - ZeroMem (UnicodeStr, StrSize (UnicodeStr)); - FreePool (UnicodeStr); - - OpalDisk = HiiGetOpalDiskCB (gHiiConfiguration.SelectedDiskIndex); - if (OpalDisk != NULL) { - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = OpalDisk->Sscp; - Session.MediaId = OpalDisk->MediaId; - Session.OpalBaseComId = OpalDisk->OpalBaseComId; - - Ret = OpalSupportPsidRevert(&Session, Psid.Psid, (UINT32)sizeof(Psid.Psid), OpalDisk->OpalDevicePath); - } - - ZeroMem (Psid.Psid, PSID_CHARACTER_LENGTH); - - if (Ret == TcgResultSuccess) { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Success" ); - } else { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "PSID Revert: Failure" ); - } - - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response); - - return EFI_SUCCESS; -} - -/** - Set password for the disk. - - @param OpalDisk The disk need to set the password. - @param Password The input password. - @param PassLength The input password length. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiSetPassword( - OPAL_DISK *OpalDisk, - VOID *Password, - UINT32 PassLength - ) -{ - CHAR8 Response[DEFAULT_RESPONSE_SIZE]; - TCG_RESULT Ret; - BOOLEAN ExistingPassword; - OPAL_SESSION Session; - - ExistingPassword = FALSE; - - // - // PassLength = 0 means check whether exist old password. - // - if (PassLength == 0) { - ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword)); - gHiiOldPasswordLength = 0; - - if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_ENABLE_FEATURE) { - ExistingPassword = FALSE; - } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_ADMIN_PWD) { - ExistingPassword = OpalUtilAdminPasswordExists(OpalDisk->Owner, &OpalDisk->LockingFeature); - } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) { - // - // Set user Password option shall only be shown if an Admin Password exists - // so a Password is always required (Admin or Existing User Password) - // - ExistingPassword = TRUE; - } - - // - // Return error if there is a previous Password - // see UEFI 2.4 errata B, Figure 121. Password Flowchart - // - return ExistingPassword ? EFI_DEVICE_ERROR : EFI_SUCCESS; - } - - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = OpalDisk->Sscp; - Session.MediaId = OpalDisk->MediaId; - Session.OpalBaseComId = OpalDisk->OpalBaseComId; - - AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Failure"); - // - // Password entered. - // No current Owner, so set new Password, must be admin Password - // - if (OpalDisk->Owner == OpalOwnershipNobody) { - Ret = OpalSupportEnableOpalFeature (&Session, OpalDisk->Msid, OpalDisk->MsidLength,Password, PassLength, OpalDisk->OpalDevicePath); - if (Ret == TcgResultSuccess) { - AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success"); - } - - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response); - return EFI_SUCCESS; - } - - // - // 1st Password entered - // - if (OpalDisk->Owner == OpalOwnershipUnknown && gHiiOldPasswordLength == 0) { - - // - // Unknown ownership - prompt for old Password, then new - // old Password is not set yet - first time through - // assume authority provided is admin1, overwritten if user1 authority works below - // - if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) { - // - // First try to login as USER1 to Locking SP to see if we're simply updating its Password - // - Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_USER1_AUTHORITY); - if (Ret == TcgResultSuccess) { - // - // User1 worked so authority 1 means user 1 - // - CopyMem(gHiiOldPassword, Password, PassLength); - gHiiOldPasswordLength = PassLength; - - return EFI_SUCCESS; - } - } - - // - // Else try admin1 below - // - Ret = OpalUtilVerifyPassword (&Session, Password, PassLength, OPAL_LOCKING_SP_ADMIN1_AUTHORITY); - if (Ret == TcgResultSuccess) { - CopyMem(gHiiOldPassword, Password, PassLength); - gHiiOldPasswordLength = PassLength; - - return EFI_SUCCESS; - } else { - DEBUG ((DEBUG_INFO, "start session with old PW failed - return EFI_NOT_READY - mistyped old PW\n")); - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Authentication Failure"); - - ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword)); - gHiiOldPasswordLength = 0; - - return EFI_NOT_READY; - } - } - - // - // New Password entered - // - if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SET_USER_PWD) { - Ret = OpalSupportSetPassword( - &Session, - gHiiOldPassword, - gHiiOldPasswordLength, - Password, - PassLength, - OpalDisk->OpalDevicePath, - FALSE - ); - } else { - Ret = OpalSupportSetPassword( - &Session, - gHiiOldPassword, - gHiiOldPasswordLength, - Password, - PassLength, - OpalDisk->OpalDevicePath, - TRUE - ); - } - - if (Ret == TcgResultSuccess) { - AsciiSPrint(Response, DEFAULT_RESPONSE_SIZE, "%a", "Set Password: Success"); - } - - // - // Reset old Password storage - // - ZeroMem(gHiiOldPassword, sizeof(gHiiOldPassword)); - gHiiOldPasswordLength = 0; - - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response); - return Ret == TcgResultSuccess ? EFI_SUCCESS : EFI_NOT_READY; -} - -/** - Secure Erases Opal Disk. - - @param OpalDisk The disk need to erase data. - @param Password The input password. - @param PassLength The input password length. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiSecureErase( - OPAL_DISK *OpalDisk, - const VOID *Password, - UINT32 PassLength - ) -{ - CHAR8 Response[DEFAULT_RESPONSE_SIZE]; - BOOLEAN PasswordFailed; - TCG_RESULT Ret; - OPAL_SESSION AdminSpSession; - - if (PassLength == 0) { - return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password - } - - ZeroMem(&AdminSpSession, sizeof(AdminSpSession)); - AdminSpSession.Sscp = OpalDisk->Sscp; - AdminSpSession.MediaId = OpalDisk->MediaId; - AdminSpSession.OpalBaseComId = OpalDisk->OpalBaseComId; - - Ret = OpalUtilSecureErase(&AdminSpSession, Password, PassLength, &PasswordFailed); - if (Ret == TcgResultSuccess) { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Success" ); - } else { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Secure Erase: Failure" ); - } - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response); - - // - // If Password failed, return invalid passowrd - // - if (PasswordFailed) { - DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n")); - return EFI_NOT_READY; - } - - // - // Indicates Password was valid and is not changing to UEFI - // Response string will indicate action error - // - return EFI_DEVICE_ERROR; -} - - -/** - Disables User for Opal Disk. - - @param OpalDisk The disk need to the action. - @param Password The input password. - @param PassLength The input password length. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiDisableUser( - OPAL_DISK *OpalDisk, - VOID *Password, - UINT32 PassLength - ) -{ - CHAR8 Response[ DEFAULT_RESPONSE_SIZE ]; - BOOLEAN PasswordFailed; - TCG_RESULT Ret; - OPAL_SESSION Session; - - if (PassLength == 0) { - return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password - } - - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = OpalDisk->Sscp; - Session.MediaId = OpalDisk->MediaId; - Session.OpalBaseComId = OpalDisk->OpalBaseComId; - - Ret = OpalSupportDisableUser(&Session, Password, PassLength, &PasswordFailed, OpalDisk->OpalDevicePath); - if (Ret == TcgResultSuccess) { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Success" ); - } else { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Disable User: Failure" ); - } - HiiSetFormString (STRING_TOKEN(STR_ACTION_STATUS), Response); - - // - // If Password failed, return invalid passowrd - // - if (PasswordFailed) { - DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n")); - return EFI_NOT_READY; - } - - // - // Indicates Password was valid and is not changing to UEFI - // Response string will indicate action error - // - return EFI_DEVICE_ERROR; -} - -/** - Revert Opal Disk as Admin1. - - @param OpalDisk The disk need to the action. - @param Password The input password. - @param PassLength The input password length. - @param KeepUserData Whether need to keey user data. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiRevert( - OPAL_DISK *OpalDisk, - VOID *Password, - UINT32 PassLength, - BOOLEAN KeepUserData - ) -{ - CHAR8 Response[ DEFAULT_RESPONSE_SIZE ]; - BOOLEAN PasswordFailed; - TCG_RESULT Ret; - OPAL_SESSION Session; - - if (PassLength == 0) { - DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n")); - // return error to indicate there is an existing Password - return EFI_DEVICE_ERROR; - } - - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = OpalDisk->Sscp; - Session.MediaId = OpalDisk->MediaId; - Session.OpalBaseComId = OpalDisk->OpalBaseComId; - - Ret = OpalSupportRevert( - &Session, - KeepUserData, - Password, - PassLength, - OpalDisk->Msid, - OpalDisk->MsidLength, - &PasswordFailed, - OpalDisk->OpalDevicePath - ); - if (Ret == TcgResultSuccess) { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Success" ); - } else { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Revert: Failure" ); - } - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response); - - // - // If Password failed, return invalid passowrd - // - if (PasswordFailed) { - DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n")); - return EFI_NOT_READY; - } - - // - // Indicates Password was valid and is not changing to UEFI - // Response string will indicate action error - // - return EFI_DEVICE_ERROR; -} - -/** - Unlocks Opal Disk. - - @param OpalDisk The disk need to the action. - @param Password The input password. - @param PassLength The input password length. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiUnlock( - OPAL_DISK *OpalDisk, - VOID *Password, - UINT32 PassLength - ) -{ - CHAR8 Response[DEFAULT_RESPONSE_SIZE]; - TCG_RESULT Ret; - OPAL_SESSION Session; - - if (PassLength == 0) { - DEBUG ((DEBUG_INFO, "Returning error to indicate there is an existing Password\n")); - return EFI_DEVICE_ERROR; // return error to indicate there is an existing Password - } - - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = OpalDisk->Sscp; - Session.MediaId = OpalDisk->MediaId; - Session.OpalBaseComId = OpalDisk->OpalBaseComId; - - Ret = OpalSupportUnlock(&Session, Password, PassLength, OpalDisk->OpalDevicePath); - if (Ret == TcgResultSuccess) { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Success" ); - } else { - AsciiSPrint( Response, DEFAULT_RESPONSE_SIZE, "%a", "Unlock: Failure" ); - } - - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), Response); - - if (Ret == TcgResultSuccess) { - DEBUG ((DEBUG_INFO, "returning error to indicate Password was correct but is not changing\n")); - return EFI_DEVICE_ERROR; - } else { - DEBUG ((DEBUG_INFO, "returning EFI_NOT_READY to indicate Password was not correct\n")); - return EFI_NOT_READY; - } -} - -/** - Use the input password to do the specified action. - - @param Str The input password saved in. - - @retval EFI_SUCCESS Do the required action success. - @retval Others Other error occur. - -**/ -EFI_STATUS -HiiPasswordEntered( - EFI_STRING_ID Str - ) -{ - OPAL_DISK* OpalDisk; - CHAR8 Password[MAX_PASSWORD_CHARACTER_LENGTH + 1]; - CHAR16* UniStr; - UINT32 PassLength; - EFI_STATUS Status; - - OpalHiiGetBrowserData(); - - OpalDisk = HiiGetOpalDiskCB(gHiiConfiguration.SelectedDiskIndex); - if (OpalDisk == NULL) { - DEBUG ((DEBUG_INFO, "ERROR: disk %u not found\n", gHiiConfiguration.SelectedDiskIndex)); - return EFI_NOT_FOUND; - } - - if (Str == 0) { - DEBUG ((DEBUG_INFO, "ERROR: str=NULL\n")); - return EFI_INVALID_PARAMETER; - } - - ZeroMem(Password, sizeof(Password)); - - UniStr = HiiGetString(gHiiPackageListHandle, Str, NULL); - if (UniStr == NULL) { - return EFI_NOT_FOUND; - } - - HiiSetString(gHiiPackageListHandle, Str, L"", NULL); - - PassLength = (UINT32) StrLen (UniStr); - if (PassLength >= sizeof(Password)) { - HiiSetFormString(STRING_TOKEN(STR_ACTION_STATUS), "Password too long"); - ZeroMem (UniStr, StrSize (UniStr)); - FreePool(UniStr); - return EFI_BUFFER_TOO_SMALL; - } - - UnicodeStrToAsciiStrS (UniStr, Password, sizeof (Password)); - ZeroMem (UniStr, StrSize (UniStr)); - FreePool(UniStr); - - if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_UNLOCK) { - Status = HiiUnlock (OpalDisk, Password, PassLength); - } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_SECURE_ERASE) { - Status = HiiSecureErase (OpalDisk, Password, PassLength); - } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_DISABLE_USER) { - Status = HiiDisableUser (OpalDisk, Password, PassLength); - } else if (gHiiConfiguration.SelectedAction == HII_KEY_ID_GOTO_REVERT) { - if (OpalDisk->SupportedAttributes.PyriteSsc == 1 && OpalDisk->LockingFeature.MediaEncryption == 0) { - // - // For pyrite type device which also not supports media encryption, it not accept "Keep User Data" parameter. - // So here hardcode a FALSE for this case. - // - Status = HiiRevert(OpalDisk, Password, PassLength, FALSE); - } else { - Status = HiiRevert(OpalDisk, Password, PassLength, gHiiConfiguration.KeepUserData); - } - } else { - Status = HiiSetPassword(OpalDisk, Password, PassLength); - } - - ZeroMem (Password, sizeof (Password)); - - OpalHiiSetBrowserData (); - - return Status; -} - -/** - Send BlockSid request through TPM physical presence module. - - @param PpRequest TPM physical presence operation request. - - @retval EFI_SUCCESS Do the required action success. - @retval Others Other error occur. - -**/ -EFI_STATUS -HiiSetBlockSidAction ( - IN UINT32 PpRequest - ) -{ - UINT32 ReturnCode; - EFI_STATUS Status; - - ReturnCode = Tcg2PhysicalPresenceLibSubmitRequestToPreOSFunction (PpRequest, 0); - if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_SUCCESS) { - Status = EFI_SUCCESS; - } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_GENERAL_FAILURE) { - Status = EFI_OUT_OF_RESOURCES; - } else if (ReturnCode == TCG_PP_SUBMIT_REQUEST_TO_PREOS_NOT_IMPLEMENTED) { - Status = EFI_UNSUPPORTED; - } else { - Status = EFI_DEVICE_ERROR; - } - - return Status; -} - -/** - This function processes the results of changes in configuration. - - @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param Configuration A null-terminated Unicode string in - format. - @param Progress A pointer to a string filled in with the offset of - the most recent '&' before the first failing - name/value pair (or the beginning of the string if - the failure is in the first name/value pair) or - the terminating NULL if all was successful. - - @retval EFI_SUCCESS The Results is processed successfully. - @retval EFI_INVALID_PARAMETER Configuration is NULL. - @retval EFI_NOT_FOUND Routing data doesn't match any storage in this - driver. - -**/ -EFI_STATUS -EFIAPI -RouteConfig( - CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - CONST EFI_STRING Configuration, - EFI_STRING *Progress - ) -{ - if (Configuration == NULL || Progress == NULL) { - return (EFI_INVALID_PARAMETER); - } - - *Progress = Configuration; - if (!HiiIsConfigHdrMatch (Configuration, &gHiiSetupVariableGuid, OpalPasswordStorageName)) { - return EFI_NOT_FOUND; - } - - *Progress = Configuration + StrLen (Configuration); - - return EFI_SUCCESS; -} - -/** - This function allows a caller to extract the current configuration for one - or more named elements from the target driver. - - @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param Request A null-terminated Unicode string in - format. - @param Progress On return, points to a character in the Request - string. Points to the string's null terminator if - request was successful. Points to the most recent - '&' before the first failing name/value pair (or - the beginning of the string if the failure is in - the first name/value pair) if the request was not - successful. - @param Results A null-terminated Unicode string in - format which has all values filled - in for the names in the Request string. String to - be allocated by the called function. - - @retval EFI_SUCCESS The Results is filled with the requested values. - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results. - @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name. - @retval EFI_NOT_FOUND Routing data doesn't match any storage in this - driver. - -**/ -EFI_STATUS -EFIAPI -ExtractConfig( - CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - CONST EFI_STRING Request, - EFI_STRING *Progress, - EFI_STRING *Results - ) -{ - EFI_STATUS Status; - EFI_STRING ConfigRequest; - EFI_STRING ConfigRequestHdr; - UINTN BufferSize; - UINTN Size; - BOOLEAN AllocatedRequest; - EFI_HANDLE DriverHandle; - - // - // Check for valid parameters - // - if (Progress == NULL || Results == NULL) { - return (EFI_INVALID_PARAMETER); - } - - *Progress = Request; - if ((Request != NULL) && - !HiiIsConfigHdrMatch (Request, &gHiiSetupVariableGuid, OpalPasswordStorageName)) { - return EFI_NOT_FOUND; - } - - AllocatedRequest = FALSE; - BufferSize = sizeof (OPAL_HII_CONFIGURATION); - ConfigRequest = Request; - if ((Request == NULL) || (StrStr (Request, L"OFFSET") == NULL)) { - // - // Request has no request element, construct full request string. - // Allocate and fill a buffer large enough to hold the template - // followed by "&OFFSET=0&WIDTH=WWWWWWWWWWWWWWWW" followed by a Null-terminator - // - DriverHandle = HiiGetDriverImageHandleCB(); - ConfigRequestHdr = HiiConstructConfigHdr (&gHiiSetupVariableGuid, OpalPasswordStorageName, DriverHandle); - Size = (StrLen (ConfigRequestHdr) + 32 + 1) * sizeof (CHAR16); - ConfigRequest = AllocateZeroPool (Size); - if (ConfigRequest == NULL) { - return EFI_OUT_OF_RESOURCES; - } - AllocatedRequest = TRUE; - UnicodeSPrint (ConfigRequest, Size, L"%s&OFFSET=0&WIDTH=%016LX", ConfigRequestHdr, (UINT64)BufferSize); - FreePool (ConfigRequestHdr); - } - - // - // Convert Buffer Data to by helper function BlockToConfig( ) - // - Status = gHiiConfigRouting->BlockToConfig( - gHiiConfigRouting, - ConfigRequest, - (UINT8*)&gHiiConfiguration, - sizeof(OPAL_HII_CONFIGURATION), - Results, - Progress - ); - - // - // Free the allocated config request string. - // - if (AllocatedRequest) { - FreePool (ConfigRequest); - ConfigRequest = NULL; - } - - // - // Set Progress string to the original request string. - // - if (Request == NULL) { - *Progress = NULL; - } else if (StrStr (Request, L"OFFSET") == NULL) { - *Progress = Request + StrLen (Request); - } - - return (Status); -} - - -/** - - Pass the current system state to the bios via the hii_G_Configuration. - -**/ -VOID -OpalHiiSetBrowserData ( - VOID - ) -{ - HiiSetBrowserData( - &gHiiSetupVariableGuid, - (CHAR16*)L"OpalHiiConfig", - sizeof(gHiiConfiguration), - (UINT8*)&gHiiConfiguration, - NULL - ); -} - - -/** - - Populate the hii_g_Configuraton with the browser Data. - -**/ -VOID -OpalHiiGetBrowserData ( - VOID - ) -{ - HiiGetBrowserData( - &gHiiSetupVariableGuid, - (CHAR16*)L"OpalHiiConfig", - sizeof(gHiiConfiguration), - (UINT8*)&gHiiConfiguration - ); -} - -/** - Set a string Value in a form. - - @param DestStringId The stringid which need to update. - @param SrcAsciiStr The string nned to update. - - @retval EFI_SUCCESS Do the required action success. - @retval Others Other error occur. - -**/ -EFI_STATUS -HiiSetFormString( - EFI_STRING_ID DestStringId, - CHAR8 *SrcAsciiStr - ) -{ - UINT32 Len; - UINT32 UniSize; - CHAR16* UniStr; - - // - // Determine the Length of the sting - // - Len = ( UINT32 )AsciiStrLen( SrcAsciiStr ); - - // - // Allocate space for the unicode string, including terminator - // - UniSize = (Len + 1) * sizeof(CHAR16); - UniStr = (CHAR16*)AllocateZeroPool(UniSize); - - // - // Copy into unicode string, then copy into string id - // - AsciiStrToUnicodeStrS ( SrcAsciiStr, UniStr, Len + 1); - - // - // Update the string in the form - // - if (HiiSetString(gHiiPackageListHandle, DestStringId, UniStr, NULL) == 0) { - DEBUG ((DEBUG_INFO, "HiiSetFormString( ) failed\n")); - FreePool(UniStr); - return (EFI_OUT_OF_RESOURCES); - } - - // - // Free the memory - // - FreePool(UniStr); - - return (EFI_SUCCESS); -} - -/** - Initialize the Opal disk base on the hardware info get from device. - - @param Dev The Opal device. - - @retval EFI_SUCESS Initialize the device success. - @retval EFI_DEVICE_ERROR Get info from device failed. - -**/ -EFI_STATUS -OpalDiskInitialize ( - IN OPAL_DRIVER_DEVICE *Dev - ) -{ - TCG_RESULT TcgResult; - OPAL_SESSION Session; - - ZeroMem(&Dev->OpalDisk, sizeof(OPAL_DISK)); - Dev->OpalDisk.Sscp = Dev->Sscp; - Dev->OpalDisk.MediaId = Dev->MediaId; - Dev->OpalDisk.OpalDevicePath = Dev->OpalDevicePath; - - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = Dev->Sscp; - Session.MediaId = Dev->MediaId; - - TcgResult = OpalGetSupportedAttributesInfo (&Session, &Dev->OpalDisk.SupportedAttributes, &Dev->OpalDisk.OpalBaseComId); - if (TcgResult != TcgResultSuccess) { - return EFI_DEVICE_ERROR; - } - Session.OpalBaseComId = Dev->OpalDisk.OpalBaseComId; - - TcgResult = OpalUtilGetMsid (&Session, Dev->OpalDisk.Msid, OPAL_MSID_LENGHT, &Dev->OpalDisk.MsidLength); - if (TcgResult != TcgResultSuccess) { - return EFI_DEVICE_ERROR; - } - - return OpalDiskUpdateStatus (&Dev->OpalDisk); -} - -/** - Update the device info. - - @param OpalDisk The Opal device. - - @retval EFI_SUCESS Initialize the device success. - @retval EFI_DEVICE_ERROR Get info from device failed. - @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info. - -**/ -EFI_STATUS -OpalDiskUpdateStatus ( - OPAL_DISK *OpalDisk - ) -{ - TCG_RESULT TcgResult; - OPAL_SESSION Session; - - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = OpalDisk->Sscp; - Session.MediaId = OpalDisk->MediaId; - Session.OpalBaseComId = OpalDisk->OpalBaseComId; - - TcgResult = OpalGetLockingInfo(&Session, &OpalDisk->LockingFeature); - if (TcgResult != TcgResultSuccess) { - return EFI_DEVICE_ERROR; - } - - if (OpalDisk->MsidLength == 0) { - return EFI_INVALID_PARAMETER; - } else { - // - // Base on the Msid info to get the ownership, so Msid info must get first. - // - OpalDisk->Owner = OpalUtilDetermineOwnership(&Session, OpalDisk->Msid, OpalDisk->MsidLength); - } - - return EFI_SUCCESS; -} - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.h b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.h deleted file mode 100644 index c03f082780..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.h +++ /dev/null @@ -1,146 +0,0 @@ -/** @file - Public Header file of HII library used by Opal UEFI Driver. - Defines required callbacks of Opal HII library. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _OPAL_HII_H_ -#define _OPAL_HII_H_ - -#include -#include - -#define DEFAULT_RESPONSE_SIZE 200 - -/** - Get the driver image handle. - - @retval the driver image handle. - -**/ -EFI_HANDLE -HiiGetDriverImageHandleCB( - VOID - ); - -/** - Install the HII form and string packages. - - @retval EFI_SUCCESS Install all the resources success. - @retval EFI_OUT_OF_RESOURCES Out of resource error. -**/ -EFI_STATUS -OpalHiiAddPackages( - VOID - ); - -/** - Check whether enable feature or not. - - @retval Return the disk number. - -**/ -UINT8 -HiiGetNumConfigRequiredOpalDisksCB( - VOID - ); - -/** - Returns the driver name. - - @retval Returns the driver name. - -**/ -CHAR16* -HiiGetDriverNameCB( - VOID - ); - -/** - Returns the opaque pointer to a physical disk context. - - @param DiskIndex Input the disk index. - - @retval The device pointer. - -**/ -OPAL_DISK* -HiiGetOpalDiskCB( - UINT8 DiskIndex - ); - -/** - Returns the disk name. - - @param DiskIndex Input the disk index. - - @retval Returns the disk name. - -**/ -CHAR8* -HiiDiskGetNameCB( - UINT8 DiskIndex - ); - -/** - Set a string Value in a form. - - @param DestStringId The stringid which need to update. - @param SrcAsciiStr The string nned to update. - - @retval EFI_SUCCESS Do the required action success. - @retval Others Other error occur. - -**/ -EFI_STATUS -HiiSetFormString( - EFI_STRING_ID DestStringId, - CHAR8 *SrcAsciiStr - ); - -/** - Install the HII related resources. - - @retval EFI_SUCCESS Install all the resources success. - @retval other Error occur when install the resources. -**/ -EFI_STATUS -HiiInstall( - VOID - ); - -/** - Uninstall the HII capability. - - @retval EFI_SUCCESS Uninstall all the resources success. - @retval others Other errors occur when unistall the hii resource. -**/ -EFI_STATUS -HiiUninstall( - VOID - ); - -/** - Initialize the Opal disk base on the hardware info get from device. - - @param Dev The Opal device. - - @retval EFI_SUCESS Initialize the device success. - @retval EFI_DEVICE_ERROR Get info from device failed. - -**/ -EFI_STATUS -OpalDiskInitialize ( - IN OPAL_DRIVER_DEVICE *Dev - ); - -#endif // _HII_H_ diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiCallbacks.c b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiCallbacks.c deleted file mode 100644 index 6f2eaeb4c3..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiCallbacks.c +++ /dev/null @@ -1,221 +0,0 @@ -/** @file - Callbacks required by the HII of the Opal UEFI Driver to help display - Opal device information and to send password to SMM handler. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "OpalHii.h" -#include "OpalDriver.h" -#include "OpalDriverPrivate.h" - -/** - Get Opal var name. - The return Value must be freed by caller if not NULL - - @param OpalDisk The disk. - @param Prefix The prefix string. - - @retval The var name string. - -**/ -CHAR16* -OpalDriverGetOpalVarName( - OPAL_DISK *OpalDisk, - const CHAR16 *Prefix - ) -{ - OPAL_DRIVER_DEVICE* Dev; - UINTN PrefixLen; - UINTN NameLen; - UINTN VarNameLen; - CHAR16* VarName; - - Dev = DRIVER_DEVICE_FROM_OPALDISK(OpalDisk); - if (Dev == NULL) { - return NULL; - } - - PrefixLen = StrLen(Prefix); - - NameLen = 0; - if (Dev->Name16 != NULL) { - NameLen = StrLen(Dev->Name16); - } - - VarNameLen = PrefixLen + NameLen; - - VarName = (CHAR16*)AllocateZeroPool((VarNameLen + 1) * sizeof(CHAR16)); - if (VarName == NULL) { - return NULL; - } - - CopyMem(VarName, Prefix, PrefixLen * sizeof(CHAR16)); - if (Dev->Name16 != NULL) { - CopyMem(VarName + PrefixLen, Dev->Name16, NameLen * sizeof(CHAR16)); - } - VarName[VarNameLen] = 0; - - return VarName; -} - -/** - Get the driver image handle. - - @retval the driver image handle. - -**/ -EFI_HANDLE -HiiGetDriverImageHandleCB( - VOID - ) -{ - return gImageHandle; -} - -/** - Check whether enable feature or not. - - @retval Return the disk number. - -**/ -UINT8 -HiiGetNumConfigRequiredOpalDisksCB( - VOID - ) -{ - UINT8 NumDisks; - UINT8 NumLockedOpalDisks; - OPAL_DISK *OpalDisk; - UINT8 Index; - - NumLockedOpalDisks = 0; - - NumDisks = GetDeviceCount(); - - for (Index = 0; Index < NumDisks; Index++) { - OpalDisk = HiiGetOpalDiskCB(Index); - - if (OpalDisk != NULL) { - if (!OpalFeatureEnabled (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) { - DEBUG ((DEBUG_INFO, "Ignoring disk %u because feature is disabled or health has already been inspected\n", Index)); - } else if (OpalDeviceLocked (&OpalDisk->SupportedAttributes, &OpalDisk->LockingFeature)) { - NumLockedOpalDisks++; - } - } - } - - return NumLockedOpalDisks; -} - - - -/** - Returns the opaque pointer to a physical disk context. - - @param DiskIndex Input the disk index. - - @retval The device pointer. - -**/ -VOID * -HiiGetDiskContextCB( - UINT8 DiskIndex - ) -{ - OPAL_DRIVER_DEVICE* Dev; - UINT8 CurrentDisk; - - Dev = OpalDriverGetDeviceList(); - CurrentDisk = 0; - - if (DiskIndex >= GetDeviceCount()) { - return NULL; - } - - while (Dev != NULL) { - if (CurrentDisk == DiskIndex) { - return Dev; - } else { - Dev = Dev->Next; - CurrentDisk++; - } - } - - return NULL; -} - -/** - Returns the opaque pointer to a physical disk context. - - @param DiskIndex Input the disk index. - - @retval The device pointer. - -**/ -OPAL_DISK* -HiiGetOpalDiskCB( - UINT8 DiskIndex - ) -{ - VOID *Ctx; - OPAL_DRIVER_DEVICE *Tmp; - - Ctx = HiiGetDiskContextCB (DiskIndex); - - if (Ctx == NULL) { - return NULL; - } - - Tmp = (OPAL_DRIVER_DEVICE*) Ctx; - - return &Tmp->OpalDisk; -} - -/** - Returns the disk name. - - @param DiskIndex Input the disk index. - - @retval Returns the disk name. - -**/ -CHAR8* -HiiDiskGetNameCB( - UINT8 DiskIndex - ) -{ - OPAL_DRIVER_DEVICE* Ctx; - - Ctx = (OPAL_DRIVER_DEVICE*) HiiGetDiskContextCB (DiskIndex); - - if (Ctx != NULL) { - if (Ctx->NameZ == NULL) { - OpalDriverGetDriverDeviceName (Ctx); - } - return Ctx->NameZ; - } - return NULL; -} - -/** - Returns the driver name. - - @retval Returns the driver name. - -**/ -CHAR16* -HiiGetDriverNameCB( - VOID - ) -{ - return (CHAR16*)EFI_DRIVER_NAME_UNICODE; -} diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormStrings.uni b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormStrings.uni deleted file mode 100644 index 4cfbde3f84..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormStrings.uni +++ /dev/null @@ -1,103 +0,0 @@ -// /** @file -// -// String definitions for Setup formset. -// -// Copyright (c) 2016, Intel Corporation. All rights reserved.
-// -// This program and the accompanying materials -// are licensed and made available under the terms and conditions of the BSD License -// which accompanies this distribution. The full text of the license may be found at -// http://opensource.org/licenses/bsd-license.php -// -// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -// -// **/ - -/=# -///////////////////////////////// GENERIC DEFINITIONS ///////////////////////////////// -#langdef en-US "English" -#string STR_NULL #language en-US " " - -///////////////////////////////// FORM SET ///////////////////////////////// -#string STR_FORM_SET_HELP #language en-US "Manage Opal disks" - -///////////////////////////////// MULTIPLE FORMS ///////////////////////////////// -#string STR_OPAL #language en-US "Opal" -#string STR_MAIN_OPAL_VERSION #language en-US "Version 00.0.0.0000" - -///////////////////////////////// MAIN MENU FORM ///////////////////////////////// -#string STR_MAIN_PHY_DISKS_LBL #language en-US "Physical Disks:" -#string STR_MAIN_LOCKED_DISKS_LBL #language en-US "Locked Disks:" - -#string STR_MAIN_GOTO_DISK_INFO_0 #language en-US " " -#string STR_MAIN_GOTO_DISK_INFO_1 #language en-US " " -#string STR_MAIN_GOTO_DISK_INFO_2 #language en-US " " -#string STR_MAIN_GOTO_DISK_INFO_3 #language en-US " " -#string STR_MAIN_GOTO_DISK_INFO_4 #language en-US " " -#string STR_MAIN_GOTO_DISK_INFO_5 #language en-US " " - -#string STR_MAIN_GOTO_DISK_INFO_HELP #language en-US "Select to see Opal disk actions" -#string STR_MAIN_GOTO_DISK_HEALTH_HELP #language en-US "Select disk to unlock" - -#string STR_MAIN_NO_DISKS_PRESENT_LBL #language en-US "No disks connected to system" - -///////////////////////////////// DISK INFO MENU FORM ///////////////////////////////// -#string STR_DISK_INFO_SELECTED_DISK_NAME #language en-US " " - -#string STR_DISK_INFO_LOCK #language en-US "Lock" -#string STR_DISK_INFO_UNLOCK #language en-US "Unlock" -#string STR_DISK_INFO_SET_ADMIN_PSWD #language en-US "Update Drive Admin Password" -#string STR_DISK_INFO_SET_USER_PSWD #language en-US "Set Drive User Password" -#string STR_DISK_INFO_SECURE_ERASE #language en-US "Secure Erase User Data" -#string STR_DISK_INFO_PSID_REVERT #language en-US "PSID Revert to factory default" -#string STR_DISK_INFO_REVERT #language en-US "Admin Revert to factory default and Disable" -#string STR_DISK_INFO_DISABLE_USER #language en-US "Disable User" -#string STR_DISK_INFO_ENABLE_FEATURE #language en-US "Enable Feature" -#string STR_DISK_INFO_ENABLE_BLOCKSID #language en-US "TCG Storage Action" -#string STR_ENABLED #language en-US "Enable BlockSID" -#string STR_DISABLED #language en-US "Disable BlockSID" - -#string STR_NONE #language en-US "None" -#string STR_DISK_INFO_ENABLE_BLOCKSID_TRUE #language en-US "Require physical presence when remote enable BlockSID" -#string STR_DISK_INFO_ENABLE_BLOCKSID_FALSE #language en-US "Not require physical presence when remote enable BlockSID" -#string STR_DISK_INFO_DISABLE_BLOCKSID_TRUE #language en-US "Require physical presence when remote disable BlockSID" -#string STR_DISK_INFO_DISABLE_BLOCKSID_FALSE #language en-US "Not require physical presence when remote disable BlockSID" - -#string STR_BLOCKSID_STATUS_HELP #language en-US "BlockSID action change status" -#string STR_BLOCKSID_STATUS #language en-US "Current BlockSID Status:" -#string STR_BLOCKSID_STATUS1 #language en-US "" -#string STR_BLOCKSID_STATUS2 #language en-US "" -#string STR_BLOCKSID_STATUS3 #language en-US "" - -#string STR_DISK_INFO_GOTO_LOCK_HELP #language en-US "Lock the disk" -#string STR_DISK_INFO_GOTO_UNLOCK_HELP #language en-US "Unlock the disk" -#string STR_DISK_INFO_GOTO_SET_ADMIN_PSWD_HELP #language en-US "Set password for the administrator" -#string STR_DISK_INFO_GOTO_SET_USER_PSWD_HELP #language en-US "Set password for User 1" -#string STR_DISK_INFO_GOTO_SECURE_ERASE_HELP #language en-US "Securely erase the disk" -#string STR_DISK_INFO_GOTO_PSID_REVERT_HELP #language en-US "Revert the disk to factory defaults" -#string STR_DISK_INFO_GOTO_DISABLE_USER_HELP #language en-US "Disable User" -#string STR_DISK_INFO_GOTO_ENABLE_FEATURE_HELP #language en-US "Enable Feature" -#string STR_DISK_INFO_GOTO_ENABLE_BLOCKSID_HELP #language en-US "Change BlockSID actions, includes enable or disable BlockSID, Require or not require physical presence when remote enable or disable BlockSID" - -///////////////////////////////// DISK ACTION MENU FORM ///////////////////////////////// -#string STR_DISK_ACTION_LBL #language en-US " " - -#string STR_PASSWORD_PROMPT #language en-US "Enter Password" -#string STR_PASSWORD_HELP #language en-US "Password must be between 6 and 20 characters" - -#string STR_REVERT_PROMPT #language en-US "Enter PSID" -#string STR_REVERT_HELP #language en-US "PSID is a 32 character case sensitive value" -#string STR_ACTION_STATUS #language en-US " " - -#string STR_PASSWORD_SUBMIT #language en-US "Submit Password Changes" -#string STR_PASSWORD_SUBMIT_HELP #language en-US "Submits Password Changes (new and update) after passwords have been entered" - -#string STR_GOTO_HOME #language en-US "Main Menu" -#string STR_GOTO_HOME_HELP #language en-US "Return to the main menu" - -#string STR_KEEP_USER_DATA_PROMPT #language en-US "Keep User Data" -#string STR_KEEP_USER_DATA_HELP #language en-US "Checkmark to keep user data, otherwise data will be lost" - -#string STR_OK #language en-US "OK" - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormValues.h b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormValues.h deleted file mode 100644 index 88cf9f5b59..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormValues.h +++ /dev/null @@ -1,120 +0,0 @@ -/** @file - Defines Opal HII form ids, structures and values. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#ifndef _OPAL_HII_FORM_VALUES_H_ -#define _OPAL_HII_FORM_VALUES_H_ - -// Maximum Opal password Length -#define MAX_PASSWORD_CHARACTER_LENGTH 0x14 - -// PSID Length -#define PSID_CHARACTER_LENGTH 0x20 -#define PSID_CHARACTER_STRING_END_LENGTH 0x21 - -// ID's for various forms that will be used by HII -#define FORMID_VALUE_MAIN_MENU 0x01 -#define FORMID_VALUE_DISK_INFO_FORM_MAIN 0x02 -#define FORMID_VALUE_DISK_ACTION_FORM 0x03 - -// Structure defining the OPAL_HII_CONFIGURATION -#pragma pack(1) -typedef struct { - UINT8 NumDisks; - UINT8 SelectedDiskIndex; - UINT8 SelectedAction; - UINT16 SelectedDiskAvailableActions; - UINT16 SupportedDisks; - UINT8 KeepUserData; - UINT16 AvailableFields; - UINT16 Password[MAX_PASSWORD_CHARACTER_LENGTH]; - UINT16 Psid[PSID_CHARACTER_STRING_END_LENGTH]; - UINT8 EnableBlockSid; -} OPAL_HII_CONFIGURATION; -#pragma pack() - -/* Action Flags */ -#define HII_ACTION_NONE 0x0000 -#define HII_ACTION_LOCK 0x0001 -#define HII_ACTION_UNLOCK 0x0002 -#define HII_ACTION_SET_ADMIN_PWD 0x0004 -#define HII_ACTION_SET_USER_PWD 0x0008 -#define HII_ACTION_SECURE_ERASE 0x0010 -#define HII_ACTION_PSID_REVERT 0x0020 -#define HII_ACTION_DISABLE_USER 0x0040 -#define HII_ACTION_REVERT 0x0080 -#define HII_ACTION_DISABLE_FEATURE 0x0100 -#define HII_ACTION_ENABLE_FEATURE 0x0200 - -/* Flags for diskActionAvailableFields */ -#define HII_FIELD_PASSWORD 0x0001 -#define HII_FIELD_PSID 0x0002 -#define HII_FIELD_KEEP_USER_DATA 0x0004 -#define HII_FIELD_KEEP_USER_DATA_FORCED 0x0008 - -/* Number of bits allocated for each part of a unique key for an HII_ITEM - * all bits together must be <= 16 (EFI_QUESTION_ID is UINT16) - * 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 - * | |-----------------------| |---------------------------| - * FLG INDEX ID - */ -#define HII_KEY_ID_BITS 8 -#define HII_KEY_INDEX_BITS 7 -#define HII_KEY_FLAG_BITS 1 - -#define HII_KEY_FLAG 0x8000 // bit 15 (zero based) - -/***********/ -/* Key IDs */ -/***********/ - -#define HII_KEY_ID_GOTO_MAIN_MENU 0 -#define HII_KEY_ID_GOTO_DISK_INFO 1 -#define HII_KEY_ID_GOTO_LOCK 2 -#define HII_KEY_ID_GOTO_UNLOCK 3 -#define HII_KEY_ID_GOTO_SET_ADMIN_PWD 4 -#define HII_KEY_ID_GOTO_SET_USER_PWD 5 -#define HII_KEY_ID_GOTO_SECURE_ERASE 6 -#define HII_KEY_ID_GOTO_PSID_REVERT 7 -#define HII_KEY_ID_GOTO_REVERT 8 -#define HII_KEY_ID_GOTO_DISABLE_USER 9 -#define HII_KEY_ID_GOTO_ENABLE_FEATURE 0xA //10 -#define HII_KEY_ID_GOTO_CONFIRM_TO_MAIN_MENU 0xB //11 -#define HII_KEY_ID_ENTER_PASSWORD 0xC //12 -#define HII_KEY_ID_ENTER_PSID 0xD //13 -#define HII_KEY_ID_VAR_SUPPORTED_DISKS 0xE //14 -#define HII_KEY_ID_VAR_SELECTED_DISK_AVAILABLE_ACTIONS 0xF //15 - -#define HII_KEY_ID_BLOCKSID 0x17 //23 -#define HII_KEY_ID_MAX 0x17 //23 // !!Update each time a new ID is added!! - -#define HII_KEY_WITH_INDEX(id, index) \ - ( \ - HII_KEY_FLAG | \ - (id) | \ - ((index) << HII_KEY_ID_BITS) \ - ) - -#define HII_KEY(id) HII_KEY_WITH_INDEX(id, 0) - -#define PACKAGE_LIST_GUID { 0xf0308176, 0x9058, 0x4153, { 0x93, 0x3d, 0xda, 0x2f, 0xdc, 0xc8, 0x3e, 0x44 } } - -/* {410483CF-F4F9-4ece-848A-1958FD31CEB7} */ -#define SETUP_FORMSET_GUID { 0x410483cf, 0xf4f9, 0x4ece, { 0x84, 0x8a, 0x19, 0x58, 0xfd, 0x31, 0xce, 0xb7 } } - -// {BBF1ACD2-28D8-44ea-A291-58A237FEDF1A} -#define SETUP_VARIABLE_GUID { 0xbbf1acd2, 0x28d8, 0x44ea, { 0xa2, 0x91, 0x58, 0xa2, 0x37, 0xfe, 0xdf, 0x1a } } - -#endif //_HII_FORM_VALUES_H_ - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiPrivate.h b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiPrivate.h deleted file mode 100644 index ec5a93cf3f..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiPrivate.h +++ /dev/null @@ -1,268 +0,0 @@ -/** @file - Private functions and sturctures used by the Opal UEFI Driver. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _OPAL_HII_PRIVATE_H_ -#define _OPAL_HII_PRIVATE_H_ - - - -#include -#include - -#include "OpalHii.h" -#include "OpalHiiFormValues.h" - - -#define OPAL_PASSWORD_CONFIG_GUID \ - { \ - 0x0d510a4f, 0xa81b, 0x473f, { 0x87, 0x07, 0xb7, 0xfd, 0xfb, 0xc0, 0x45, 0xba } \ - } - -#pragma pack(1) - -typedef struct { - UINT16 Id: HII_KEY_ID_BITS; - UINT16 Index: HII_KEY_INDEX_BITS; - UINT16 Flag: HII_KEY_FLAG_BITS; -} KEY_BITS; - -typedef union { - UINT16 Raw; - KEY_BITS KeyBits; -} HII_KEY; - -typedef struct { - VENDOR_DEVICE_PATH VendorDevicePath; - EFI_DEVICE_PATH_PROTOCOL End; -} HII_VENDOR_DEVICE_PATH; - -/** -* Opal PSID Authority utilized for PSID revert -* -* The type indicates the structure of the PSID authority -*/ -typedef struct { - UINT8 Psid[PSID_CHARACTER_LENGTH]; -} TCG_PSID; - -/** - This function processes the results of changes in configuration. - - @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param Configuration A null-terminated Unicode string in - format. - @param Progress A pointer to a string filled in with the offset of - the most recent '&' before the first failing - name/value pair (or the beginning of the string if - the failure is in the first name/value pair) or - the terminating NULL if all was successful. - - @retval EFI_SUCCESS The Results is processed successfully. - @retval EFI_INVALID_PARAMETER Configuration is NULL. - @retval EFI_NOT_FOUND Routing data doesn't match any storage in this - driver. - -**/ -EFI_STATUS -EFIAPI -RouteConfig( - CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - CONST EFI_STRING Configuration, - EFI_STRING *Progress - ); - -/** - This function allows a caller to extract the current configuration for one - or more named elements from the target driver. - - @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param Request A null-terminated Unicode string in - format. - @param Progress On return, points to a character in the Request - string. Points to the string's null terminator if - request was successful. Points to the most recent - '&' before the first failing name/value pair (or - the beginning of the string if the failure is in - the first name/value pair) if the request was not - successful. - @param Results A null-terminated Unicode string in - format which has all values filled - in for the names in the Request string. String to - be allocated by the called function. - - @retval EFI_SUCCESS The Results is filled with the requested values. - @retval EFI_OUT_OF_RESOURCES Not enough memory to store the results. - @retval EFI_INVALID_PARAMETER Request is illegal syntax, or unknown name. - @retval EFI_NOT_FOUND Routing data doesn't match any storage in this - driver. - -**/ -EFI_STATUS -EFIAPI -ExtractConfig( - CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, - CONST EFI_STRING Request, - EFI_STRING *Progress, - EFI_STRING *Results - ); - -/** - This function processes the results of changes in configuration. - - @param This Points to the EFI_HII_CONFIG_ACCESS_PROTOCOL. - @param Action Specifies the type of action taken by the browser. - @param QuestionId A unique value which is sent to the original - exporting driver so that it can identify the type - of data to expect. - @param Type The type of value for the question. - @param Value A pointer to the data being sent to the original - exporting driver. - @param ActionRequest On return, points to the action requested by the - callback function. - - @retval EFI_SUCCESS The callback successfully handled the action. - @retval EFI_OUT_OF_RESOURCES Not enough storage is available to hold the - variable and its data. - @retval EFI_DEVICE_ERROR The variable could not be saved. - @retval EFI_UNSUPPORTED The specified Action is not supported by the - callback. - -**/ -EFI_STATUS -EFIAPI -DriverCallback( - CONST EFI_HII_CONFIG_ACCESS_PROTOCOL* This, - EFI_BROWSER_ACTION Action, - EFI_QUESTION_ID QuestionId, - UINT8 Type, - EFI_IFR_TYPE_VALUE* Value, - EFI_BROWSER_ACTION_REQUEST* ActionRequest - ); - -/** - - Pass the current system state to the bios via the hii_G_Configuration. - -**/ -VOID -OpalHiiSetBrowserData ( - VOID - ); - -/** - - Populate the hii_g_Configuraton with the browser Data. - -**/ -VOID -OpalHiiGetBrowserData ( - VOID - ); - -/** - Draws the disk info form. - - @retval EFI_SUCCESS Draw the disk info success. - -**/ -EFI_STATUS -HiiPopulateDiskInfoForm( - VOID - ); - -/** - Update the global Disk index info. - - @param Index The input disk index info. - - @retval EFI_SUCCESS Update the disk index info success. - -**/ -EFI_STATUS -HiiSelectDisk( - UINT8 Index - ); - -/** - Use the input password to do the specified action. - - @param Str The input password saved in. - - @retval EFI_SUCCESS Do the required action success. - @retval Others Other error occur. - -**/ -EFI_STATUS -HiiPasswordEntered( - EFI_STRING_ID Str - ); - -/** - Update block sid info. - - @param PpRequest Input the Pp Request. - - @retval EFI_SUCCESS Do the required action success. - @retval Others Other error occur. - -**/ -EFI_STATUS -HiiSetBlockSidAction ( - UINT32 PpRequest - ); - -/** - Reverts the Opal disk to factory default. - - @param PsidStringId The string id for the PSID info. - - @retval EFI_SUCCESS Do the required action success. - -**/ -EFI_STATUS -HiiPsidRevert( - EFI_STRING_ID PsidStringId - ); - -/** - Get disk name string id. - - @param DiskIndex The input disk index info. - - @retval The disk name string id. - -**/ -EFI_STRING_ID -GetDiskNameStringId( - UINT8 DiskIndex - ); - -/** - Update the device info. - - @param OpalDisk The Opal device. - - @retval EFI_SUCESS Initialize the device success. - @retval EFI_DEVICE_ERROR Get info from device failed. - @retval EFI_INVALID_PARAMETER Not get Msid info before get ownership info. - -**/ -EFI_STATUS -OpalDiskUpdateStatus ( - OPAL_DISK *OpalDisk - ); - -#pragma pack() - -#endif // _HII_P_H_ diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordDxe.inf b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordDxe.inf deleted file mode 100644 index f2afc37810..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordDxe.inf +++ /dev/null @@ -1,82 +0,0 @@ -## @file -# This is a OpalPasswordDxe driver. -# -# This module is used to Management the Opal feature -# for Opal supported devices. -# -# -# Copyright (c) 2016, Intel Corporation. All rights reserved.
-# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -## -[Defines] - INF_VERSION = 0x00010007 - BASE_NAME = OpalPasswordDxe - FILE_GUID = E3E4048D-6C0C-43E4-AE1C-FFB579D8EF41 - MODULE_TYPE = DXE_DRIVER - VERSION_STRING = 1.0 - ENTRY_POINT = EfiDriverEntryPoint - UNLOAD_IMAGE = OpalEfiDriverUnload - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# - -[Sources] - OpalDriver.h - OpalHii.c - OpalHiiCallbacks.c - OpalDriver.c - OpalDriverPrivate.h - OpalHii.h - OpalHiiPrivate.h - OpalHiiFormValues.h - OpalPasswordForm.vfr - OpalHiiFormStrings.uni - ComponentName.c - -[Packages] - MdePkg/MdePkg.dec - MdeModulePkg/MdeModulePkg.dec - SecurityPkg/SecurityPkg.dec - -[LibraryClasses] - BaseLib - MemoryAllocationLib - UefiBootServicesTableLib - UefiDriverEntryPoint - UefiHiiServicesLib - UefiRuntimeServicesTableLib - BaseMemoryLib - DebugLib - HiiLib - PrintLib - DevicePathLib - OpalPasswordSupportLib - UefiLib - TcgStorageOpalLib - Tcg2PhysicalPresenceLib - -[Protocols] - gEfiHiiConfigAccessProtocolGuid ## PRODUCES - gEfiStorageSecurityCommandProtocolGuid ## CONSUMES - gEfiComponentNameProtocolGuid ## PRODUCES - gEfiComponentName2ProtocolGuid ## PRODUCES - gEfiBlockIoProtocolGuid ## CONSUMES - gEfiSmmCommunicationProtocolGuid ## PRODUCES - gEfiPciIoProtocolGuid ## CONSUMES - gEfiDevicePathToTextProtocolGuid ## CONSUMES - -[Guids] - gEfiEventExitBootServicesGuid ## CONSUMES ## Event - gOpalExtraInfoVariableGuid ## PRODUCES ## GUID - -[Depex] - gEfiSmmCommunicationProtocolGuid AND gEfiHiiStringProtocolGuid AND gEfiHiiDatabaseProtocolGuid diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordForm.vfr b/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordForm.vfr deleted file mode 100644 index 218e0f442c..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordForm.vfr +++ /dev/null @@ -1,350 +0,0 @@ -/** @file - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ -#include "OpalHiiFormValues.h" - - -#define EFI_HII_PLATFORM_SETUP_FORMSET_GUID \ - { 0x93039971, 0x8545, 0x4b04, { 0xb4, 0x5e, 0x32, 0xeb, 0x83, 0x26, 0x4, 0xe } } - -formset - guid = SETUP_FORMSET_GUID, - title = STRING_TOKEN(STR_OPAL), - help = STRING_TOKEN(STR_FORM_SET_HELP), - classguid = EFI_HII_PLATFORM_SETUP_FORMSET_GUID, - - // Define a Buffer Storage (EFI_IFR_VARSTORE) that will be filled - // out initially through extractConfig call - varstore OPAL_HII_CONFIGURATION, // This is the Data structure type - name = OpalHiiConfig, // Define referenced name in vfr - guid = SETUP_VARIABLE_GUID; // GUID of this Buffer storage - -form formid = FORMID_VALUE_MAIN_MENU, - title = STRING_TOKEN(STR_OPAL); - - //CONFIG_VARIABLE(HII_KEY(HII_KEY_ID_VAR_SUPPORTED_DISKS), SupportedDisks, 0x0, 0xFFFF); - suppressif TRUE; - numeric - name = SupportedDisks, - varid = OpalHiiConfig.SupportedDisks, - prompt = STRING_TOKEN(STR_NULL), - help = STRING_TOKEN(STR_NULL), - flags = INTERACTIVE, - key = 0x800E, //32782, - minimum = 0x0, - maximum = 0xFFFF, - endnumeric; - endif; - - subtitle text = STRING_TOKEN(STR_MAIN_OPAL_VERSION); - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_MAIN_PHY_DISKS_LBL); - - subtitle text = STRING_TOKEN(STR_NULL); - - //DISK( 0 ); - suppressif ( questionref(SupportedDisks) & ( 0x1 ) ) == 0; - goto FORMID_VALUE_DISK_INFO_FORM_MAIN, - prompt = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_0 ), - help = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_HELP), - flags = INTERACTIVE, \ - key = 0x8001; //32769 - endif; - - //DISK( 1 ); - suppressif ( questionref(SupportedDisks) & ( 0x2 ) ) == 0; - goto FORMID_VALUE_DISK_INFO_FORM_MAIN, - prompt = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_1 ), - help = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_HELP), - flags = INTERACTIVE, \ - key = 0x8101; //33025 - endif; - - //DISK( 2 ); - suppressif ( questionref(SupportedDisks) & ( 0x4 ) ) == 0; - goto FORMID_VALUE_DISK_INFO_FORM_MAIN, - prompt = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_2 ), - help = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_HELP), - flags = INTERACTIVE, \ - key = 0x8201; //33281 - endif; - - //DISK( 3 ); - suppressif ( questionref(SupportedDisks) & ( 0x8 ) ) == 0; - goto FORMID_VALUE_DISK_INFO_FORM_MAIN, - prompt = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_3 ), - help = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_HELP), - flags = INTERACTIVE, \ - key = 0x8301; // 33537 - endif; - - //DISK( 4 ); - suppressif ( questionref(SupportedDisks) & ( 0x10 ) ) == 0; - goto FORMID_VALUE_DISK_INFO_FORM_MAIN, - prompt = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_4 ), - help = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_HELP), - flags = INTERACTIVE, \ - key = 0x8401; // 33793 - endif; - - //DISK( 5 ); - suppressif ( questionref(SupportedDisks) & ( 0x20 ) ) == 0; - goto FORMID_VALUE_DISK_INFO_FORM_MAIN, - prompt = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_5 ), - help = STRING_TOKEN(STR_MAIN_GOTO_DISK_INFO_HELP), - flags = INTERACTIVE, \ - key = 0x8501; // 34049 - endif; - - //No disks on system - suppressif ideqval OpalHiiConfig.NumDisks > 0; - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_MAIN_NO_DISKS_PRESENT_LBL); - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - grayoutif TRUE; - text - help = STRING_TOKEN(STR_BLOCKSID_STATUS_HELP), - text = STRING_TOKEN(STR_BLOCKSID_STATUS); - text - help = STRING_TOKEN(STR_BLOCKSID_STATUS_HELP), - text = STRING_TOKEN(STR_BLOCKSID_STATUS1); - text - help = STRING_TOKEN(STR_BLOCKSID_STATUS_HELP), - text = STRING_TOKEN(STR_BLOCKSID_STATUS2); - text - help = STRING_TOKEN(STR_BLOCKSID_STATUS_HELP), - text = STRING_TOKEN(STR_BLOCKSID_STATUS3); - subtitle text = STRING_TOKEN(STR_NULL); - endif; - - oneof varid = OpalHiiConfig.EnableBlockSid, - questionid = 0x8017, // 32791, - prompt = STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_ENABLE_BLOCKSID_HELP), - flags = INTERACTIVE, - option text = STRING_TOKEN(STR_NONE), value = 0, flags = DEFAULT | MANUFACTURING | RESET_REQUIRED; - option text = STRING_TOKEN(STR_ENABLED), value = 1, flags = RESET_REQUIRED; - option text = STRING_TOKEN(STR_DISABLED), value = 2, flags = RESET_REQUIRED; - option text = STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_TRUE), value = 3, flags = RESET_REQUIRED; - option text = STRING_TOKEN(STR_DISK_INFO_ENABLE_BLOCKSID_FALSE), value = 4, flags = RESET_REQUIRED; - option text = STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_TRUE), value = 5, flags = RESET_REQUIRED; - option text = STRING_TOKEN(STR_DISK_INFO_DISABLE_BLOCKSID_FALSE), value = 6, flags = RESET_REQUIRED; - endoneof; - - - -endform; // MAIN MENU FORM - -// -///////////////// DISK INFO FORM ///////////////// -// -form formid = FORMID_VALUE_DISK_INFO_FORM_MAIN, - title = STRING_TOKEN(STR_OPAL); - - suppressif TRUE; - numeric - name = SelectedDiskAvailableActions, - varid = OpalHiiConfig.SelectedDiskAvailableActions, - prompt = STRING_TOKEN(STR_NULL), - help = STRING_TOKEN(STR_NULL), - flags = INTERACTIVE, - key = 0x800F, // 32783 - minimum = 0x0, - maximum = 0xFFFF, - endnumeric; - endif; - - subtitle text = STRING_TOKEN(STR_MAIN_OPAL_VERSION); - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME); - - subtitle text = STRING_TOKEN(STR_NULL); - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_LOCK ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_LOCK), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_LOCK_HELP), - flags = INTERACTIVE, - key = 0x8002; // 32770 - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_UNLOCK ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_UNLOCK), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_UNLOCK_HELP), - flags = INTERACTIVE, - key = 0x8003; //32771; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_SET_ADMIN_PWD ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_SET_ADMIN_PSWD), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_SET_ADMIN_PSWD_HELP), - flags = INTERACTIVE, - key = 0x8004; //32772; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_SET_USER_PWD ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_SET_USER_PSWD), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_SET_USER_PSWD_HELP), - flags = INTERACTIVE, - key = 0x8005; //32773; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_SECURE_ERASE ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_SECURE_ERASE), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_SECURE_ERASE_HELP), - flags = INTERACTIVE, - key = 0x8006; //32774; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_REVERT ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_REVERT), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_PSID_REVERT_HELP), - flags = INTERACTIVE, - key = 0x8008; //32776; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_PSID_REVERT ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_PSID_REVERT), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_PSID_REVERT_HELP), - flags = INTERACTIVE, - key = 0x8007; //32775; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_DISABLE_USER ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_DISABLE_USER), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_DISABLE_USER_HELP), - flags = INTERACTIVE, - key = 0x8009; //32777; - endif; - - suppressif ( questionref(SelectedDiskAvailableActions) & HII_ACTION_ENABLE_FEATURE ) == 0; - goto FORMID_VALUE_DISK_ACTION_FORM, - prompt = STRING_TOKEN(STR_DISK_INFO_ENABLE_FEATURE), - help = STRING_TOKEN(STR_DISK_INFO_GOTO_ENABLE_FEATURE_HELP), - flags = INTERACTIVE, - key = 0x800A; //32778; - endif; - -endform; // DISK INFO FORM - -// -///////////////// DISK ACTION FORM ///////////////// -// -form formid = FORMID_VALUE_DISK_ACTION_FORM, - title = STRING_TOKEN(STR_OPAL); - - suppressif TRUE; - numeric - name = AvailableFields, - varid = OpalHiiConfig.AvailableFields, - prompt = STRING_TOKEN(STR_NULL), - help = STRING_TOKEN(STR_NULL), - flags = INTERACTIVE, - key = 0x8012, //32786, - minimum = 0x0, - maximum = 0xFFFF, - endnumeric; - endif; - - subtitle text = STRING_TOKEN(STR_MAIN_OPAL_VERSION); - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_DISK_INFO_SELECTED_DISK_NAME); - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_DISK_ACTION_LBL); - - subtitle text = STRING_TOKEN(STR_NULL); - - suppressif (questionref(AvailableFields) & HII_FIELD_KEEP_USER_DATA) == 0; - grayoutif (questionref(AvailableFields) & HII_FIELD_KEEP_USER_DATA_FORCED) != 0; - checkbox - name = MyCheckbox, - varid = OpalHiiConfig.KeepUserData, - prompt = STRING_TOKEN(STR_KEEP_USER_DATA_PROMPT), - help = STRING_TOKEN(STR_KEEP_USER_DATA_HELP), - key = 0x8011, //32785, - endcheckbox; - - //EMPTY_LINE; - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_NULL); - endif; - endif; - - suppressif (questionref(AvailableFields) & HII_FIELD_PASSWORD) == 0; - password - varid = OpalHiiConfig.Password, - prompt = STRING_TOKEN(STR_PASSWORD_PROMPT), - help = STRING_TOKEN(STR_PASSWORD_HELP), - flags = INTERACTIVE, - key = 0x800C, //32780, - minsize = 6, - maxsize = 20, - endpassword; - endif; - - suppressif (questionref(AvailableFields) & HII_FIELD_PSID) == 0; - string - varid = OpalHiiConfig.Psid, - prompt = STRING_TOKEN(STR_REVERT_PROMPT), - help = STRING_TOKEN(STR_REVERT_HELP), - flags = INTERACTIVE, - key = 0x800D, //32781, - minsize = PSID_CHARACTER_LENGTH, - maxsize = PSID_CHARACTER_LENGTH, - endstring; - endif; - - subtitle text = STRING_TOKEN(STR_NULL); - - text - help = STRING_TOKEN(STR_NULL), - text = STRING_TOKEN(STR_ACTION_STATUS); - - subtitle text = STRING_TOKEN(STR_NULL); - - goto FORMID_VALUE_MAIN_MENU, - prompt = STRING_TOKEN(STR_GOTO_HOME), - help = STRING_TOKEN(STR_GOTO_HOME_HELP), - flags = INTERACTIVE, - key = 0x8000; //32768; - -endform; // DISK ACTION FORM - -endformset; diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c deleted file mode 100644 index e38acfd052..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c +++ /dev/null @@ -1,1267 +0,0 @@ -/** @file - This driver is used for Opal Password Feature support at AHCI mode. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#include "OpalPasswordSmm.h" - -/** - Start command for give slot on specific port. - - @param Port The number of port. - @param CommandSlot The number of CommandSlot. - @param Timeout The timeout Value of start. - - @retval EFI_DEVICE_ERROR The command start unsuccessfully. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_SUCCESS The command start successfully. - -**/ -EFI_STATUS -EFIAPI -AhciStartCommand ( - IN UINT8 Port, - IN UINT8 CommandSlot, - IN UINT64 Timeout - ); - -/** - Stop command running for giving port - - @param Port The number of port. - @param Timeout The timeout Value of stop. - - @retval EFI_DEVICE_ERROR The command stop unsuccessfully. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_SUCCESS The command stop successfully. - -**/ -EFI_STATUS -EFIAPI -AhciStopCommand ( - IN UINT8 Port, - IN UINT64 Timeout - ); - -/** - Read AHCI Operation register. - - @param Offset The operation register offset. - - @return The register content read. - -**/ -UINT32 -EFIAPI -AhciReadReg ( - IN UINT32 Offset - ) -{ - UINT32 Data; - - Data = 0; - - Data = MmioRead32 (mAhciBar + Offset); - - return Data; -} - -/** - Write AHCI Operation register. - - @param Offset The operation register offset. - @param Data The Data used to write down. - -**/ -VOID -EFIAPI -AhciWriteReg ( - IN UINT32 Offset, - IN UINT32 Data - ) -{ - MmioWrite32 (mAhciBar + Offset, Data); - - return ; -} - -/** - Do AND operation with the Value of AHCI Operation register. - - @param Offset The operation register offset. - @param AndData The Data used to do AND operation. - -**/ -VOID -EFIAPI -AhciAndReg ( - IN UINT32 Offset, - IN UINT32 AndData - ) -{ - UINT32 Data; - - Data = AhciReadReg (Offset); - - Data &= AndData; - - AhciWriteReg (Offset, Data); -} - -/** - Do OR operation with the Value of AHCI Operation register. - - @param Offset The operation register offset. - @param OrData The Data used to do OR operation. - -**/ -VOID -EFIAPI -AhciOrReg ( - IN UINT32 Offset, - IN UINT32 OrData - ) -{ - UINT32 Data; - - Data = AhciReadReg (Offset); - - Data |= OrData; - - AhciWriteReg (Offset, Data); -} - -/** - Wait for memory set to the test Value. - - @param Offset The memory address to test. - @param MaskValue The mask Value of memory. - @param TestValue The test Value of memory. - @param Timeout The time out Value for wait memory set. - - @retval EFI_DEVICE_ERROR The memory is not set. - @retval EFI_TIMEOUT The memory setting is time out. - @retval EFI_SUCCESS The memory is correct set. - -**/ -EFI_STATUS -EFIAPI -AhciWaitMmioSet ( - IN UINT32 Offset, - IN UINT32 MaskValue, - IN UINT32 TestValue, - IN UINT64 Timeout - ) -{ - UINT32 Value; - UINT32 Delay; - - Delay = (UINT32) (DivU64x32(Timeout, 1000) + 1); - - do { - Value = AhciReadReg (Offset) & MaskValue; - - if (Value == TestValue) { - return EFI_SUCCESS; - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay (100); - - Delay--; - - } while (Delay > 0); - - return EFI_TIMEOUT; -} -/** - Wait for the Value of the specified system memory set to the test Value. - - @param Address The system memory address to test. - @param MaskValue The mask Value of memory. - @param TestValue The test Value of memory. - @param Timeout The time out Value for wait memory set, uses 100ns as a unit. - - @retval EFI_TIMEOUT The system memory setting is time out. - @retval EFI_SUCCESS The system memory is correct set. - -**/ -EFI_STATUS -EFIAPI -AhciWaitMemSet ( - IN EFI_PHYSICAL_ADDRESS Address, - IN UINT32 MaskValue, - IN UINT32 TestValue, - IN UINT64 Timeout - ) -{ - UINT32 Value; - UINT32 Delay; - - Delay = (UINT32) (DivU64x32 (Timeout, 1000) + 1); - - do { - // - // Access sytem memory to see if the Value is the tested one. - // - // The system memory pointed by Address will be updated by the - // SATA Host Controller, "volatile" is introduced to prevent - // compiler from optimizing the access to the memory address - // to only read once. - // - Value = *(volatile UINT32 *) (UINTN) Address; - Value &= MaskValue; - - if (Value == TestValue) { - return EFI_SUCCESS; - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay (100); - - Delay--; - - } while (Delay > 0); - - return EFI_TIMEOUT; -} - -/** - Check the memory status to the test Value. - - @param[in] Address The memory address to test. - @param[in] MaskValue The mask Value of memory. - @param[in] TestValue The test Value of memory. - @param[in, out] RetryTimes The retry times Value for waitting memory set. If 0, then just try once. - - @retval EFI_NOTREADY The memory is not set. - @retval EFI_TIMEOUT The memory setting retry times out. - @retval EFI_SUCCESS The memory is correct set. - -**/ -EFI_STATUS -EFIAPI -AhciCheckMemSet ( - IN UINTN Address, - IN UINT32 MaskValue, - IN UINT32 TestValue, - IN OUT UINTN *RetryTimes OPTIONAL - ) -{ - UINT32 Value; - - if (RetryTimes != NULL) { - (*RetryTimes)--; - } - - Value = *(volatile UINT32 *) Address; - Value &= MaskValue; - - if (Value == TestValue) { - return EFI_SUCCESS; - } - - if ((RetryTimes != NULL) && (*RetryTimes == 0)) { - return EFI_TIMEOUT; - } else { - return EFI_NOT_READY; - } -} - -/** - Clear the port interrupt and error status. It will also clear - HBA interrupt status. - - @param Port The number of port. - -**/ -VOID -EFIAPI -AhciClearPortStatus ( - IN UINT8 Port - ) -{ - UINT32 Offset; - - // - // Clear any error status - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_SERR; - AhciWriteReg (Offset, AhciReadReg (Offset)); - - // - // Clear any port interrupt status - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_IS; - AhciWriteReg (Offset, AhciReadReg (Offset)); - - // - // Clear any HBA interrupt status - // - AhciWriteReg (EFI_AHCI_IS_OFFSET, AhciReadReg (EFI_AHCI_IS_OFFSET)); -} - -/** - Enable the FIS running for giving port. - - @param Port The number of port. - @param Timeout The timeout Value of enabling FIS. - - @retval EFI_DEVICE_ERROR The FIS enable setting fails. - @retval EFI_TIMEOUT The FIS enable setting is time out. - @retval EFI_SUCCESS The FIS enable successfully. - -**/ -EFI_STATUS -EFIAPI -AhciEnableFisReceive ( - IN UINT8 Port, - IN UINT64 Timeout - ) -{ - UINT32 Offset; - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - AhciOrReg (Offset, EFI_AHCI_PORT_CMD_FRE); - - return AhciWaitMmioSet ( - Offset, - EFI_AHCI_PORT_CMD_FR, - EFI_AHCI_PORT_CMD_FR, - Timeout - ); -} - -/** - Disable the FIS running for giving port. - - @param Port The number of port. - @param Timeout The timeout Value of disabling FIS. - - @retval EFI_DEVICE_ERROR The FIS disable setting fails. - @retval EFI_TIMEOUT The FIS disable setting is time out. - @retval EFI_UNSUPPORTED The port is in running state. - @retval EFI_SUCCESS The FIS disable successfully. - -**/ -EFI_STATUS -EFIAPI -AhciDisableFisReceive ( - IN UINT8 Port, - IN UINT64 Timeout - ) -{ - UINT32 Offset; - UINT32 Data; - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - Data = AhciReadReg (Offset); - - // - // Before disabling Fis receive, the DMA engine of the port should NOT be in running status. - // - if ((Data & (EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_CR)) != 0) { - return EFI_UNSUPPORTED; - } - - // - // Check if the Fis receive DMA engine for the port is running. - // - if ((Data & EFI_AHCI_PORT_CMD_FR) != EFI_AHCI_PORT_CMD_FR) { - return EFI_SUCCESS; - } - - AhciAndReg (Offset, (UINT32)~(EFI_AHCI_PORT_CMD_FRE)); - - return AhciWaitMmioSet ( - Offset, - EFI_AHCI_PORT_CMD_FR, - 0, - Timeout - ); -} - -/** - Build the command list, command table and prepare the fis receiver. - - @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS. - @param Port The number of port. - @param PortMultiplier The timeout Value of stop. - @param CommandFis The control fis will be used for the transfer. - @param CommandList The command list will be used for the transfer. - @param AtapiCommand The atapi command will be used for the transfer. - @param AtapiCommandLength The Length of the atapi command. - @param CommandSlotNumber The command slot will be used for the transfer. - @param DataPhysicalAddr The pointer to the Data Buffer pci bus master address. - @param DataLength The Data count to be transferred. - -**/ -VOID -EFIAPI -AhciBuildCommand ( - IN EFI_AHCI_REGISTERS *AhciRegisters, - IN UINT8 Port, - IN UINT8 PortMultiplier, - IN EFI_AHCI_COMMAND_FIS *CommandFis, - IN EFI_AHCI_COMMAND_LIST *CommandList, - IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL, - IN UINT8 AtapiCommandLength, - IN UINT8 CommandSlotNumber, - IN OUT VOID *DataPhysicalAddr, - IN UINT64 DataLength - ) -{ - UINT64 BaseAddr; - UINT64 PrdtNumber; - UINTN RemainedData; - UINTN MemAddr; - DATA_64 Data64; - UINT32 Offset; - - // - // Filling the PRDT - // - PrdtNumber = DivU64x32 (DataLength + EFI_AHCI_MAX_DATA_PER_PRDT - 1, EFI_AHCI_MAX_DATA_PER_PRDT); - - // - // According to AHCI 1.3 spec, a PRDT entry can point to a maximum 4MB Data block. - // It also limits that the maximum amount of the PRDT entry in the command table - // is 65535. - // - ASSERT (PrdtNumber <= 1); - - Data64.Uint64 = (UINTN) (AhciRegisters->AhciRFis); - - BaseAddr = Data64.Uint64; - - ZeroMem ((VOID *)((UINTN) BaseAddr), sizeof (EFI_AHCI_RECEIVED_FIS)); - - ZeroMem (AhciRegisters->AhciCommandTable, sizeof (EFI_AHCI_COMMAND_TABLE)); - - CommandFis->AhciCFisPmNum = PortMultiplier; - - CopyMem (&AhciRegisters->AhciCommandTable->CommandFis, CommandFis, sizeof (EFI_AHCI_COMMAND_FIS)); - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - if (AtapiCommand != NULL) { - CopyMem ( - &AhciRegisters->AhciCommandTable->AtapiCmd, - AtapiCommand, - AtapiCommandLength - ); - - CommandList->AhciCmdA = 1; - CommandList->AhciCmdP = 1; - - AhciOrReg (Offset, (EFI_AHCI_PORT_CMD_DLAE | EFI_AHCI_PORT_CMD_ATAPI)); - } else { - AhciAndReg (Offset, (UINT32)~(EFI_AHCI_PORT_CMD_DLAE | EFI_AHCI_PORT_CMD_ATAPI)); - } - - RemainedData = (UINTN) DataLength; - MemAddr = (UINTN) DataPhysicalAddr; - CommandList->AhciCmdPrdtl = (UINT32)PrdtNumber; - - AhciRegisters->AhciCommandTable->PrdtTable.AhciPrdtDbc = (UINT32)RemainedData - 1; - - Data64.Uint64 = (UINT64)MemAddr; - AhciRegisters->AhciCommandTable->PrdtTable.AhciPrdtDba = Data64.Uint32.Lower32; - AhciRegisters->AhciCommandTable->PrdtTable.AhciPrdtDbau = Data64.Uint32.Upper32; - - // - // Set the last PRDT to Interrupt On Complete - // - AhciRegisters->AhciCommandTable->PrdtTable.AhciPrdtIoc = 1; - - CopyMem ( - (VOID *) ((UINTN) AhciRegisters->AhciCmdList + (UINTN) CommandSlotNumber * sizeof (EFI_AHCI_COMMAND_LIST)), - CommandList, - sizeof (EFI_AHCI_COMMAND_LIST) - ); - - Data64.Uint64 = (UINT64)(UINTN) AhciRegisters->AhciCommandTable; - AhciRegisters->AhciCmdList[CommandSlotNumber].AhciCmdCtba = Data64.Uint32.Lower32; - AhciRegisters->AhciCmdList[CommandSlotNumber].AhciCmdCtbau = Data64.Uint32.Upper32; - AhciRegisters->AhciCmdList[CommandSlotNumber].AhciCmdPmp = PortMultiplier; - -} - -/** - Buid a command FIS. - - @param CmdFis A pointer to the EFI_AHCI_COMMAND_FIS Data structure. - @param AtaCommandBlock A pointer to the AhciBuildCommandFis Data structure. - -**/ -VOID -EFIAPI -AhciBuildCommandFis ( - IN OUT EFI_AHCI_COMMAND_FIS *CmdFis, - IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock - ) -{ - ZeroMem (CmdFis, sizeof (EFI_AHCI_COMMAND_FIS)); - - CmdFis->AhciCFisType = EFI_AHCI_FIS_REGISTER_H2D; - // - // Indicator it's a command - // - CmdFis->AhciCFisCmdInd = 0x1; - CmdFis->AhciCFisCmd = AtaCommandBlock->AtaCommand; - - CmdFis->AhciCFisFeature = AtaCommandBlock->AtaFeatures; - CmdFis->AhciCFisFeatureExp = AtaCommandBlock->AtaFeaturesExp; - - CmdFis->AhciCFisSecNum = AtaCommandBlock->AtaSectorNumber; - CmdFis->AhciCFisSecNumExp = AtaCommandBlock->AtaSectorNumberExp; - - CmdFis->AhciCFisClyLow = AtaCommandBlock->AtaCylinderLow; - CmdFis->AhciCFisClyLowExp = AtaCommandBlock->AtaCylinderLowExp; - - CmdFis->AhciCFisClyHigh = AtaCommandBlock->AtaCylinderHigh; - CmdFis->AhciCFisClyHighExp = AtaCommandBlock->AtaCylinderHighExp; - - CmdFis->AhciCFisSecCount = AtaCommandBlock->AtaSectorCount; - CmdFis->AhciCFisSecCountExp = AtaCommandBlock->AtaSectorCountExp; - - CmdFis->AhciCFisDevHead = (UINT8) (AtaCommandBlock->AtaDeviceHead | 0xE0); -} - -/** - Start a PIO Data transfer on specific port. - - @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS. - @param Port The number of port. - @param PortMultiplier The timeout Value of stop. - @param AtapiCommand The atapi command will be used for the transfer. - @param AtapiCommandLength The Length of the atapi command. - @param Read The transfer direction. - @param AtaCommandBlock The EFI_ATA_COMMAND_BLOCK Data. - @param AtaStatusBlock The EFI_ATA_STATUS_BLOCK Data. - @param MemoryAddr The pointer to the Data Buffer. - @param DataCount The Data count to be transferred. - @param Timeout The timeout Value of non Data transfer. - - @retval EFI_DEVICE_ERROR The PIO Data transfer abort with error occurs. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_UNSUPPORTED The device is not ready for transfer. - @retval EFI_SUCCESS The PIO Data transfer executes successfully. - -**/ -EFI_STATUS -EFIAPI -AhciPioTransfer ( - IN EFI_AHCI_REGISTERS *AhciRegisters, - IN UINT8 Port, - IN UINT8 PortMultiplier, - IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL, - IN UINT8 AtapiCommandLength, - IN BOOLEAN Read, - IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, - IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, - IN OUT VOID *MemoryAddr, - IN UINT32 DataCount, - IN UINT64 Timeout - ) -{ - EFI_STATUS Status; - UINT32 FisBaseAddr; - UINT32 Offset; - UINT32 Delay; - EFI_AHCI_COMMAND_FIS CFis; - EFI_AHCI_COMMAND_LIST CmdList; - UINT32 PortTfd; - UINT32 PrdCount; - UINT32 OldRfisLo; - UINT32 OldRfisHi; - UINT32 OldCmdListLo; - UINT32 OldCmdListHi; - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FB; - OldRfisLo = AhciReadReg (Offset); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FBU; - OldRfisHi = AhciReadReg (Offset); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FB; - AhciWriteReg (Offset, (UINT32)(UINTN)AhciRegisters->AhciRFis); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FBU; - AhciWriteReg (Offset, 0); - - // - // Single task envrionment, we only use one command table for all port - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLB; - OldCmdListLo = AhciReadReg (Offset); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLBU; - OldCmdListHi = AhciReadReg (Offset); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLB; - AhciWriteReg (Offset, (UINT32)(UINTN)AhciRegisters->AhciCmdList); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLBU; - AhciWriteReg (Offset, 0); - - // - // Package read needed - // - AhciBuildCommandFis (&CFis, AtaCommandBlock); - - ZeroMem (&CmdList, sizeof (EFI_AHCI_COMMAND_LIST)); - - CmdList.AhciCmdCfl = EFI_AHCI_FIS_REGISTER_H2D_LENGTH / 4; - CmdList.AhciCmdW = Read ? 0 : 1; - - AhciBuildCommand ( - AhciRegisters, - Port, - PortMultiplier, - &CFis, - &CmdList, - AtapiCommand, - AtapiCommandLength, - 0, - (VOID *)(UINTN)MemoryAddr, - DataCount - ); - - Status = AhciStartCommand ( - Port, - 0, - Timeout - ); - if (EFI_ERROR (Status)) { - goto Exit; - } - - // - // Checking the status and wait the driver sending Data - // - FisBaseAddr = (UINT32)(UINTN)AhciRegisters->AhciRFis; - if (Read && (AtapiCommand == 0)) { - // - // Wait device sends the PIO setup fis before Data transfer - // - Status = EFI_TIMEOUT; - Delay = (UINT32) (DivU64x32 (Timeout, 1000) + 1); - do { - Offset = FisBaseAddr + EFI_AHCI_PIO_FIS_OFFSET; - - Status = AhciCheckMemSet (Offset, EFI_AHCI_FIS_TYPE_MASK, EFI_AHCI_FIS_PIO_SETUP, 0); - if (!EFI_ERROR (Status)) { - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_TFD; - PortTfd = AhciReadReg ((UINT32) Offset); - // - // PxTFD will be updated if there is a D2H or SetupFIS received. - // For PIO IN transfer, D2H means a device error. Therefore we only need to check the TFD after receiving a SetupFIS. - // - if ((PortTfd & EFI_AHCI_PORT_TFD_ERR) != 0) { - Status = EFI_DEVICE_ERROR; - break; - } - - PrdCount = *(volatile UINT32 *) (&(AhciRegisters->AhciCmdList[0].AhciCmdPrdbc)); - if (PrdCount == DataCount) { - break; - } - } - - Offset = FisBaseAddr + EFI_AHCI_D2H_FIS_OFFSET; - Status = AhciCheckMemSet (Offset, EFI_AHCI_FIS_TYPE_MASK, EFI_AHCI_FIS_REGISTER_D2H, 0); - if (!EFI_ERROR (Status)) { - Status = EFI_DEVICE_ERROR; - break; - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay(100); - - Delay--; - } while (Delay > 0); - } else { - // - // Wait for D2H Fis is received - // - Offset = FisBaseAddr + EFI_AHCI_D2H_FIS_OFFSET; - Status = AhciWaitMemSet ( - Offset, - EFI_AHCI_FIS_TYPE_MASK, - EFI_AHCI_FIS_REGISTER_D2H, - Timeout - ); - - if (EFI_ERROR (Status)) { - goto Exit; - } - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_TFD; - PortTfd = AhciReadReg ((UINT32) Offset); - if ((PortTfd & EFI_AHCI_PORT_TFD_ERR) != 0) { - Status = EFI_DEVICE_ERROR; - } - } - -Exit: - AhciStopCommand ( - Port, - Timeout - ); - - AhciDisableFisReceive ( - Port, - Timeout - ); - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FB; - AhciWriteReg (Offset, OldRfisLo); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FBU; - AhciWriteReg (Offset, OldRfisHi); - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLB; - AhciWriteReg (Offset, OldCmdListLo); - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLBU; - AhciWriteReg (Offset, OldCmdListHi); - - return Status; -} - -/** - Stop command running for giving port - - @param Port The number of port. - @param Timeout The timeout Value of stop. - - @retval EFI_DEVICE_ERROR The command stop unsuccessfully. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_SUCCESS The command stop successfully. - -**/ -EFI_STATUS -EFIAPI -AhciStopCommand ( - IN UINT8 Port, - IN UINT64 Timeout - ) -{ - UINT32 Offset; - UINT32 Data; - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - Data = AhciReadReg (Offset); - - if ((Data & (EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_CR)) == 0) { - return EFI_SUCCESS; - } - - if ((Data & EFI_AHCI_PORT_CMD_ST) != 0) { - AhciAndReg (Offset, (UINT32)~(EFI_AHCI_PORT_CMD_ST)); - } - - return AhciWaitMmioSet ( - Offset, - EFI_AHCI_PORT_CMD_CR, - 0, - Timeout - ); -} - -/** - Start command for give slot on specific port. - - @param Port The number of port. - @param CommandSlot The number of CommandSlot. - @param Timeout The timeout Value of start. - - @retval EFI_DEVICE_ERROR The command start unsuccessfully. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_SUCCESS The command start successfully. - -**/ -EFI_STATUS -EFIAPI -AhciStartCommand ( - IN UINT8 Port, - IN UINT8 CommandSlot, - IN UINT64 Timeout - ) -{ - UINT32 CmdSlotBit; - EFI_STATUS Status; - UINT32 PortStatus; - UINT32 StartCmd; - UINT32 PortTfd; - UINT32 Offset; - UINT32 Capability; - - // - // Collect AHCI controller information - // - Capability = AhciReadReg(EFI_AHCI_CAPABILITY_OFFSET); - - CmdSlotBit = (UINT32) (1 << CommandSlot); - - AhciClearPortStatus ( - Port - ); - - Status = AhciEnableFisReceive ( - Port, - Timeout - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - PortStatus = AhciReadReg (Offset); - - StartCmd = 0; - if ((PortStatus & EFI_AHCI_PORT_CMD_ALPE) != 0) { - StartCmd = AhciReadReg (Offset); - StartCmd &= ~EFI_AHCI_PORT_CMD_ICC_MASK; - StartCmd |= EFI_AHCI_PORT_CMD_ACTIVE; - } - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_TFD; - PortTfd = AhciReadReg (Offset); - - if ((PortTfd & (EFI_AHCI_PORT_TFD_BSY | EFI_AHCI_PORT_TFD_DRQ)) != 0) { - if ((Capability & BIT24) != 0) { - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - AhciOrReg (Offset, EFI_AHCI_PORT_CMD_COL); - - AhciWaitMmioSet ( - Offset, - EFI_AHCI_PORT_CMD_COL, - 0, - Timeout - ); - } - } - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - AhciOrReg (Offset, EFI_AHCI_PORT_CMD_ST | StartCmd); - - // - // Setting the command - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_SACT; - AhciAndReg (Offset, 0); - AhciOrReg (Offset, CmdSlotBit); - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CI; - AhciAndReg (Offset, 0); - AhciOrReg (Offset, CmdSlotBit); - return EFI_SUCCESS; -} - - -/** - Do AHCI HBA reset. - - @param[in] Timeout The timeout Value of reset. - - @retval EFI_DEVICE_ERROR AHCI controller is failed to complete hardware reset. - @retval EFI_TIMEOUT The reset operation is time out. - @retval EFI_SUCCESS AHCI controller is reset successfully. - -**/ -EFI_STATUS -EFIAPI -AhciReset ( - IN UINT64 Timeout - ) -{ - UINT32 Delay; - UINT32 Value; - UINT32 Capability; - - // - // Collect AHCI controller information - // - Capability = AhciReadReg (EFI_AHCI_CAPABILITY_OFFSET); - - // - // Enable AE before accessing any AHCI registers if Supports AHCI Mode Only is not set - // - if ((Capability & EFI_AHCI_CAP_SAM) == 0) { - AhciOrReg (EFI_AHCI_GHC_OFFSET, EFI_AHCI_GHC_ENABLE); - } - - AhciOrReg (EFI_AHCI_GHC_OFFSET, EFI_AHCI_GHC_RESET); - - Delay = (UINT32) (DivU64x32(Timeout, 1000) + 1); - - do { - Value = AhciReadReg(EFI_AHCI_GHC_OFFSET); - if ((Value & EFI_AHCI_GHC_RESET) == 0) { - return EFI_SUCCESS; - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay(100); - - Delay--; - } while (Delay > 0); - - return EFI_TIMEOUT; - - -} - -/** - Send Buffer cmd to specific device. - - @param[in] AhciRegisters The pointer to the EFI_AHCI_REGISTERS. - @param[in] Port The port number of attached ATA device. - @param[in] PortMultiplier The port number of port multiplier of attached ATA device. - @param[in, out] Buffer The Data Buffer to store IDENTIFY PACKET Data. - - @retval EFI_DEVICE_ERROR The cmd abort with error occurs. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_UNSUPPORTED The device is not ready for executing. - @retval EFI_SUCCESS The cmd executes successfully. - -**/ -EFI_STATUS -EFIAPI -AhciIdentify ( - IN EFI_AHCI_REGISTERS *AhciRegisters, - IN UINT8 Port, - IN UINT8 PortMultiplier, - IN OUT ATA_IDENTIFY_DATA *Buffer - ) -{ - EFI_STATUS Status; - EFI_ATA_COMMAND_BLOCK AtaCommandBlock; - - if (AhciRegisters == NULL || Buffer == NULL) { - return EFI_INVALID_PARAMETER; - } - - ZeroMem (&AtaCommandBlock, sizeof (EFI_ATA_COMMAND_BLOCK)); - - AtaCommandBlock.AtaCommand = ATA_CMD_IDENTIFY_DRIVE; - AtaCommandBlock.AtaSectorCount = 1; - - Status = AhciPioTransfer ( - AhciRegisters, - Port, - PortMultiplier, - NULL, - 0, - TRUE, - &AtaCommandBlock, - NULL, - Buffer, - sizeof (ATA_IDENTIFY_DATA), - ATA_TIMEOUT - ); - - return Status; -} - -/** - Get AHCI mode MMIO Bar Size. - - @param[in] Bus The bus number of ata host controller. - @param[in] Device The device number of ata host controller. - @param[in] Function The function number of ata host controller. - - @retval The Size of AHCI MMIO BAR. - -**/ -UINT32 -EFIAPI -GetAhciBarSize ( - IN UINTN Bus, - IN UINTN Device, - IN UINTN Function - ) -{ - UINT32 Size; - UINT32 OldBar; - - OldBar = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x24)); - // - // Disable PCI CMD.MSE bit before calculating MMIO Bar Size as it needs write all 1 to BAR register. - // - PciAnd32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x04), (UINT32)~BIT1); - - // - // Get AHCI MMIO Bar Size. - // - PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x24), 0xFFFFFFFF); - Size = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x24)); - Size = (~(Size & 0xFFFFFFF0)) + 1; - - // - // Restore old MMIO Bar. - // - PciWrite32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x24), OldBar); - // - // Enable PCI CMD.MSE bit after restoring MMIO Bar. - // - PciOr32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x04), BIT1); - - return Size; -} - -/** - Get AHCI mode base address registers' Value. - - @param[in] Bus The bus number of ata host controller. - @param[in] Device The device number of ata host controller. - @param[in] Function The function number of ata host controller. - - @retval EFI_UNSUPPORTED Return this Value when the BARs is not IO type - @retval EFI_SUCCESS Get the Base address successfully - @retval Other Read the pci configureation Data error - -**/ -EFI_STATUS -EFIAPI -GetAhciBaseAddress ( - IN UINTN Bus, - IN UINTN Device, - IN UINTN Function - ) -{ - UINT32 Size; - - // - // Get AHCI MMIO Bar - // - mAhciBar = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x24)); - // - // Get AHCI MMIO Bar Size - // - Size = GetAhciBarSize (Bus, Device, Function); - // - // Check if the AHCI Bar region is in SMRAM to avoid malicious attack by modifying MMIO Bar to point to SMRAM. - // - if (!SmmIsMmioValid ((EFI_PHYSICAL_ADDRESS)mAhciBar, Size, NULL)) { - return EFI_UNSUPPORTED; - } - - return EFI_SUCCESS; -} - -/** - Allocate transfer-related Data struct which is used at AHCI mode. - - @retval EFI_OUT_OF_RESOURCE The allocation is failure. - @retval EFI_SUCCESS Successful to allocate memory. - -**/ -EFI_STATUS -EFIAPI -AhciAllocateResource ( - VOID - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS Base; - - // - // Allocate resources required by AHCI host controller. - // - Base = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_RECEIVED_FIS)), - &Base - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - - ZeroMem ((VOID *)(UINTN)Base, EFI_PAGE_SIZE * EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_RECEIVED_FIS))); - mAhciRegisters.AhciRFis = (VOID *)(UINTN)Base; - - Base = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_LIST)), - &Base - ); - if (EFI_ERROR (Status)) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)mAhciRegisters.AhciRFis, EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_RECEIVED_FIS))); - return EFI_OUT_OF_RESOURCES; - } - ZeroMem ((VOID *)(UINTN)Base, EFI_PAGE_SIZE * EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_LIST))); - mAhciRegisters.AhciCmdList = (VOID *)(UINTN)Base; - - Base = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_TABLE)), - &Base - ); - if (EFI_ERROR (Status)) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)mAhciRegisters.AhciRFis, EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_RECEIVED_FIS))); - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)mAhciRegisters.AhciCmdList, EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_LIST))); - return EFI_OUT_OF_RESOURCES; - } - ZeroMem ((VOID *)(UINTN)Base, EFI_PAGE_SIZE * EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_TABLE))); - mAhciRegisters.AhciCommandTable = (VOID *)(UINTN)Base; - return EFI_SUCCESS; -} - -/** - Free allocated transfer-related Data struct which is used at AHCI mode. - -**/ -VOID -EFIAPI -AhciFreeResource ( - VOID - ) -{ - if (mAhciRegisters.AhciRFis != NULL) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)mAhciRegisters.AhciRFis, EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_RECEIVED_FIS))); - } - - if (mAhciRegisters.AhciCmdList != NULL) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)mAhciRegisters.AhciCmdList, EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_LIST))); - } - - if (mAhciRegisters.AhciCommandTable != NULL) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN)mAhciRegisters.AhciCommandTable, EFI_SIZE_TO_PAGES (sizeof (EFI_AHCI_COMMAND_TABLE))); - } -} - -/** - Initialize ATA host controller at AHCI mode. - - The function is designed to initialize ATA host controller. - - @param[in] Port The port number to do initialization. - -**/ -EFI_STATUS -EFIAPI -AhciModeInitialize ( - UINT8 Port - ) -{ - EFI_STATUS Status; - UINT32 Capability; - UINT32 Offset; - UINT32 Data; - UINT32 PhyDetectDelay; - - Status = AhciReset (ATA_TIMEOUT); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // Collect AHCI controller information - // - Capability = AhciReadReg (EFI_AHCI_CAPABILITY_OFFSET); - - // - // Enable AE before accessing any AHCI registers if Supports AHCI Mode Only is not set - // - if ((Capability & EFI_AHCI_CAP_SAM) == 0) { - AhciOrReg (EFI_AHCI_GHC_OFFSET, EFI_AHCI_GHC_ENABLE); - } - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_FB; - AhciWriteReg (Offset, (UINT32)(UINTN)mAhciRegisters.AhciRFis); - - // - // Single task envrionment, we only use one command table for all port - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CLB; - AhciWriteReg (Offset, (UINT32)(UINTN)mAhciRegisters.AhciCmdList); - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_CMD; - Data = AhciReadReg (Offset); - if ((Data & EFI_AHCI_PORT_CMD_CPD) != 0) { - AhciOrReg (Offset, EFI_AHCI_PORT_CMD_POD); - } - - if ((Capability & BIT27) != 0) { - AhciOrReg (Offset, EFI_AHCI_PORT_CMD_SUD); - } - - // - // Disable aggressive power management. - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_SCTL; - AhciOrReg (Offset, EFI_AHCI_PORT_SCTL_IPM_INIT); - // - // Disable the reporting of the corresponding interrupt to system software. - // - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_IE; - AhciAndReg (Offset, 0); - - Status = AhciEnableFisReceive ( - Port, - EFI_TIMER_PERIOD_MILLISECONDS(500) - ); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - return Status; - } - - // - // According to SATA1.0a spec section 5.2, we need to wait for PxTFD.BSY and PxTFD.DRQ - // and PxTFD.ERR to be zero. The maximum wait time is 16s which is defined at ATA spec. - // - PhyDetectDelay = 16 * 1000; - do { - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_SERR; - if (AhciReadReg(Offset) != 0) { - AhciWriteReg (Offset, AhciReadReg(Offset)); - } - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_TFD; - - Data = AhciReadReg (Offset) & EFI_AHCI_PORT_TFD_MASK; - if (Data == 0) { - break; - } - - MicroSecondDelay (1000); - PhyDetectDelay--; - } while (PhyDetectDelay > 0); - - if (PhyDetectDelay == 0) { - return EFI_NOT_FOUND; - } - - Offset = EFI_AHCI_PORT_START + Port * EFI_AHCI_PORT_REG_WIDTH + EFI_AHCI_PORT_SIG; - Status = AhciWaitMmioSet ( - Offset, - 0x0000FFFF, - 0x00000101, - EFI_TIMER_PERIOD_SECONDS(16) - ); - - if (EFI_ERROR (Status)) { - return Status; - } - - return Status; -} - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h deleted file mode 100644 index 3a7f6331ca..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h +++ /dev/null @@ -1,408 +0,0 @@ -/** @file - Header file for AHCI mode of ATA host controller. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - -#ifndef __OPAL_PASSWORD_AHCI_MODE_H__ -#define __OPAL_PASSWORD_AHCI_MODE_H__ - -// -// OPAL LIBRARY CALLBACKS -// -#define ATA_COMMAND_TRUSTED_RECEIVE 0x5C -#define ATA_COMMAND_TRUSTED_SEND 0x5E - -// -// ATA TRUSTED commands express transfer Length in 512 byte multiple -// -#define ATA_TRUSTED_TRANSFER_LENGTH_MULTIPLE 512 -#define ATA_DEVICE_LBA 0x40 ///< Set for commands with LBA (rather than CHS) addresses - - -#define EFI_AHCI_BAR_INDEX 0x05 - -#define EFI_AHCI_CAPABILITY_OFFSET 0x0000 -#define EFI_AHCI_CAP_SAM BIT18 -#define EFI_AHCI_GHC_OFFSET 0x0004 -#define EFI_AHCI_GHC_RESET BIT0 -#define EFI_AHCI_GHC_IE BIT1 -#define EFI_AHCI_GHC_ENABLE BIT31 -#define EFI_AHCI_IS_OFFSET 0x0008 -#define EFI_AHCI_PI_OFFSET 0x000C - -typedef struct { - UINT32 Lower32; - UINT32 Upper32; -} DATA_32; - -typedef union { - DATA_32 Uint32; - UINT64 Uint64; -} DATA_64; - -// -// Each PRDT entry can point to a memory block up to 4M byte -// -#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000 - -#define EFI_AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device -#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20 -#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host -#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20 -#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host -#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4 -#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional -#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28 -#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional -#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional -#define EFI_AHCI_FIS_BIST_LENGTH 12 -#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host -#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20 -#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host -#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8 - -#define EFI_AHCI_D2H_FIS_OFFSET 0x40 -#define EFI_AHCI_DMA_FIS_OFFSET 0x00 -#define EFI_AHCI_PIO_FIS_OFFSET 0x20 -#define EFI_AHCI_SDB_FIS_OFFSET 0x58 -#define EFI_AHCI_FIS_TYPE_MASK 0xFF -#define EFI_AHCI_U_FIS_OFFSET 0x60 - -// -// Port register -// -#define EFI_AHCI_PORT_START 0x0100 -#define EFI_AHCI_PORT_REG_WIDTH 0x0080 -#define EFI_AHCI_PORT_CLB 0x0000 -#define EFI_AHCI_PORT_CLBU 0x0004 -#define EFI_AHCI_PORT_FB 0x0008 -#define EFI_AHCI_PORT_FBU 0x000C -#define EFI_AHCI_PORT_IS 0x0010 -#define EFI_AHCI_PORT_IS_DHRS BIT0 -#define EFI_AHCI_PORT_IS_PSS BIT1 -#define EFI_AHCI_PORT_IS_SSS BIT2 -#define EFI_AHCI_PORT_IS_SDBS BIT3 -#define EFI_AHCI_PORT_IS_UFS BIT4 -#define EFI_AHCI_PORT_IS_DPS BIT5 -#define EFI_AHCI_PORT_IS_PCS BIT6 -#define EFI_AHCI_PORT_IS_DIS BIT7 -#define EFI_AHCI_PORT_IS_PRCS BIT22 -#define EFI_AHCI_PORT_IS_IPMS BIT23 -#define EFI_AHCI_PORT_IS_OFS BIT24 -#define EFI_AHCI_PORT_IS_INFS BIT26 -#define EFI_AHCI_PORT_IS_IFS BIT27 -#define EFI_AHCI_PORT_IS_HBDS BIT28 -#define EFI_AHCI_PORT_IS_HBFS BIT29 -#define EFI_AHCI_PORT_IS_TFES BIT30 -#define EFI_AHCI_PORT_IS_CPDS BIT31 -#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF -#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F - -#define EFI_AHCI_PORT_IE 0x0014 -#define EFI_AHCI_PORT_CMD 0x0018 -#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE -#define EFI_AHCI_PORT_CMD_ST BIT0 -#define EFI_AHCI_PORT_CMD_SUD BIT1 -#define EFI_AHCI_PORT_CMD_POD BIT2 -#define EFI_AHCI_PORT_CMD_COL BIT3 -#define EFI_AHCI_PORT_CMD_CR BIT15 -#define EFI_AHCI_PORT_CMD_FRE BIT4 -#define EFI_AHCI_PORT_CMD_FR BIT14 -#define EFI_AHCI_PORT_CMD_MASK ~(EFI_AHCI_PORT_CMD_ST | EFI_AHCI_PORT_CMD_FRE | EFI_AHCI_PORT_CMD_COL) -#define EFI_AHCI_PORT_CMD_PMA BIT17 -#define EFI_AHCI_PORT_CMD_HPCP BIT18 -#define EFI_AHCI_PORT_CMD_MPSP BIT19 -#define EFI_AHCI_PORT_CMD_CPD BIT20 -#define EFI_AHCI_PORT_CMD_ESP BIT21 -#define EFI_AHCI_PORT_CMD_ATAPI BIT24 -#define EFI_AHCI_PORT_CMD_DLAE BIT25 -#define EFI_AHCI_PORT_CMD_ALPE BIT26 -#define EFI_AHCI_PORT_CMD_ASP BIT27 -#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) -#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 ) -#define EFI_AHCI_PORT_TFD 0x0020 -#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) -#define EFI_AHCI_PORT_TFD_BSY BIT7 -#define EFI_AHCI_PORT_TFD_DRQ BIT3 -#define EFI_AHCI_PORT_TFD_ERR BIT0 -#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00 -#define EFI_AHCI_PORT_SIG 0x0024 -#define EFI_AHCI_PORT_SSTS 0x0028 -#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F -#define EFI_AHCI_PORT_SSTS_DET 0x0001 -#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003 -#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0 -#define EFI_AHCI_PORT_SCTL 0x002C -#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F -#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK) -#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001 -#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003 -#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0 -#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00 -#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300 -#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100 -#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200 -#define EFI_AHCI_PORT_SERR 0x0030 -#define EFI_AHCI_PORT_SERR_RDIE BIT0 -#define EFI_AHCI_PORT_SERR_RCE BIT1 -#define EFI_AHCI_PORT_SERR_TDIE BIT8 -#define EFI_AHCI_PORT_SERR_PCDIE BIT9 -#define EFI_AHCI_PORT_SERR_PE BIT10 -#define EFI_AHCI_PORT_SERR_IE BIT11 -#define EFI_AHCI_PORT_SERR_PRC BIT16 -#define EFI_AHCI_PORT_SERR_PIE BIT17 -#define EFI_AHCI_PORT_SERR_CW BIT18 -#define EFI_AHCI_PORT_SERR_BDE BIT19 -#define EFI_AHCI_PORT_SERR_DE BIT20 -#define EFI_AHCI_PORT_SERR_CRCE BIT21 -#define EFI_AHCI_PORT_SERR_HE BIT22 -#define EFI_AHCI_PORT_SERR_LSE BIT23 -#define EFI_AHCI_PORT_SERR_TSTE BIT24 -#define EFI_AHCI_PORT_SERR_UFT BIT25 -#define EFI_AHCI_PORT_SERR_EX BIT26 -#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF -#define EFI_AHCI_PORT_SACT 0x0034 -#define EFI_AHCI_PORT_CI 0x0038 -#define EFI_AHCI_PORT_SNTF 0x003C - - -#pragma pack(1) -// -// Command List structure includes total 32 entries. -// The entry Data structure is listed at the following. -// -typedef struct { - UINT32 AhciCmdCfl:5; //Command FIS Length - UINT32 AhciCmdA:1; //ATAPI - UINT32 AhciCmdW:1; //Write - UINT32 AhciCmdP:1; //Prefetchable - UINT32 AhciCmdR:1; //Reset - UINT32 AhciCmdB:1; //BIST - UINT32 AhciCmdC:1; //Clear Busy upon R_OK - UINT32 AhciCmdRsvd:1; - UINT32 AhciCmdPmp:4; //Port Multiplier Port - UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length - UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count - UINT32 AhciCmdCtba; //Command Table Descriptor Base Address - UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs - UINT32 AhciCmdRsvd1[4]; -} EFI_AHCI_COMMAND_LIST; - -// -// This is a software constructed FIS. -// For Data transfer operations, this is the H2D Register FIS format as -// specified in the Serial ATA Revision 2.6 specification. -// -typedef struct { - UINT8 AhciCFisType; - UINT8 AhciCFisPmNum:4; - UINT8 AhciCFisRsvd:1; - UINT8 AhciCFisRsvd1:1; - UINT8 AhciCFisRsvd2:1; - UINT8 AhciCFisCmdInd:1; - UINT8 AhciCFisCmd; - UINT8 AhciCFisFeature; - UINT8 AhciCFisSecNum; - UINT8 AhciCFisClyLow; - UINT8 AhciCFisClyHigh; - UINT8 AhciCFisDevHead; - UINT8 AhciCFisSecNumExp; - UINT8 AhciCFisClyLowExp; - UINT8 AhciCFisClyHighExp; - UINT8 AhciCFisFeatureExp; - UINT8 AhciCFisSecCount; - UINT8 AhciCFisSecCountExp; - UINT8 AhciCFisRsvd3; - UINT8 AhciCFisControl; - UINT8 AhciCFisRsvd4[4]; - UINT8 AhciCFisRsvd5[44]; -} EFI_AHCI_COMMAND_FIS; - -// -// ACMD: ATAPI command (12 or 16 bytes) -// -typedef struct { - UINT8 AtapiCmd[0x10]; -} EFI_AHCI_ATAPI_COMMAND; - -// -// Physical Region Descriptor Table includes up to 65535 entries -// The entry Data structure is listed at the following. -// the actual entry number comes from the PRDTL field in the command -// list entry for this command slot. -// -typedef struct { - UINT32 AhciPrdtDba; //Data Base Address - UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs - UINT32 AhciPrdtRsvd; - UINT32 AhciPrdtDbc:22; //Data Byte Count - UINT32 AhciPrdtRsvd1:9; - UINT32 AhciPrdtIoc:1; //Interrupt on Completion -} EFI_AHCI_COMMAND_PRDT; - -// -// Command table Data strucute which is pointed to by the entry in the command list -// -typedef struct { - EFI_AHCI_COMMAND_FIS CommandFis; // A software constructed FIS. - EFI_AHCI_ATAPI_COMMAND AtapiCmd; // 12 or 16 bytes ATAPI cmd. - UINT8 Reserved[0x30]; - EFI_AHCI_COMMAND_PRDT PrdtTable; // The scatter/gather list for Data transfer -} EFI_AHCI_COMMAND_TABLE; - -// -// Received FIS structure -// -typedef struct { - UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00 - UINT8 AhciDmaSetupFisRsvd[0x04]; - UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20 - UINT8 AhciPioSetupFisRsvd[0x0C]; - UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40 - UINT8 AhciD2HRegisterFisRsvd[0x04]; - UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58 - UINT8 AhciUnknownFis[0x40]; // Unkonwn Fis: offset 0x60 - UINT8 AhciUnknownFisRsvd[0x60]; -} EFI_AHCI_RECEIVED_FIS; - -#pragma pack() - -typedef struct { - EFI_AHCI_RECEIVED_FIS *AhciRFis; - EFI_AHCI_COMMAND_LIST *AhciCmdList; - EFI_AHCI_COMMAND_TABLE *AhciCommandTable; -} EFI_AHCI_REGISTERS; - -extern EFI_AHCI_REGISTERS mAhciRegisters; -extern UINT32 mAhciBar; - -/** - Send Buffer cmd to specific device. - - @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS. - @param Port The number of port. - @param PortMultiplier The timeout Value of stop. - @param Buffer The Data Buffer to store IDENTIFY PACKET Data. - - @retval EFI_DEVICE_ERROR The cmd abort with error occurs. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_UNSUPPORTED The device is not ready for executing. - @retval EFI_SUCCESS The cmd executes successfully. - -**/ -EFI_STATUS -EFIAPI -AhciIdentify ( - IN EFI_AHCI_REGISTERS *AhciRegisters, - IN UINT8 Port, - IN UINT8 PortMultiplier, - IN OUT ATA_IDENTIFY_DATA *Buffer - ); - -/** - Get AHCI mode base address registers' Value. - - @param[in] Bus The bus number of ata host controller. - @param[in] Device The device number of ata host controller. - @param[in] Function The function number of ata host controller. - - @retval EFI_UNSUPPORTED Return this Value when the BARs is not IO type - @retval EFI_SUCCESS Get the Base address successfully - @retval Other Read the pci configureation Data error - -**/ -EFI_STATUS -EFIAPI -GetAhciBaseAddress ( - IN UINTN Bus, - IN UINTN Device, - IN UINTN Function - ); - -/** - Allocate transfer-related Data struct which is used at AHCI mode. - - @retval EFI_OUT_OF_RESOURCE The allocation is failure. - @retval EFI_SUCCESS Successful to allocate memory. - -**/ -EFI_STATUS -EFIAPI -AhciAllocateResource ( - VOID - ); - -/** - Free allocated transfer-related Data struct which is used at AHCI mode. - -**/ -VOID -EFIAPI -AhciFreeResource ( - VOID - ); - -/** - Initialize ATA host controller at AHCI mode. - - The function is designed to initialize ATA host controller. - - @param[in] Port The port number to do initialization. - -**/ -EFI_STATUS -EFIAPI -AhciModeInitialize ( - UINT8 Port - ); - -/** - Start a PIO Data transfer on specific port. - - @param AhciRegisters The pointer to the EFI_AHCI_REGISTERS. - @param Port The number of port. - @param PortMultiplier The timeout Value of stop. - @param AtapiCommand The atapi command will be used for the transfer. - @param AtapiCommandLength The Length of the atapi command. - @param Read The transfer direction. - @param AtaCommandBlock The EFI_ATA_COMMAND_BLOCK Data. - @param AtaStatusBlock The EFI_ATA_STATUS_BLOCK Data. - @param MemoryAddr The pointer to the Data Buffer. - @param DataCount The Data count to be transferred. - @param Timeout The timeout Value of non Data transfer. - - @retval EFI_DEVICE_ERROR The PIO Data transfer abort with error occurs. - @retval EFI_TIMEOUT The operation is time out. - @retval EFI_UNSUPPORTED The device is not ready for transfer. - @retval EFI_SUCCESS The PIO Data transfer executes successfully. - -**/ -EFI_STATUS -EFIAPI -AhciPioTransfer ( - IN EFI_AHCI_REGISTERS *AhciRegisters, - IN UINT8 Port, - IN UINT8 PortMultiplier, - IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL, - IN UINT8 AtapiCommandLength, - IN BOOLEAN Read, - IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, - IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, - IN OUT VOID *MemoryAddr, - IN UINT32 DataCount, - IN UINT64 Timeout - ); - - -#endif - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.c b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.c deleted file mode 100644 index 76204625dd..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.c +++ /dev/null @@ -1,767 +0,0 @@ -/** @file - This driver is used for Opal Password Feature support at IDE mode. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "OpalPasswordSmm.h" - -/** - Write multiple words of Data to the IDE Data port. - Call the IO abstraction once to do the complete read, - not one word at a time - - @param Port IO port to read - @param Count No. of UINT16's to read - @param Buffer Pointer to the Data Buffer for read - -**/ -VOID -EFIAPI -IdeWritePortWMultiple ( - IN UINT16 Port, - IN UINTN Count, - IN UINT16 *Buffer - ) -{ - UINTN Index; - - for (Index = 0; Index < Count; Index++) { - IoWrite16 (Port, Buffer[Index]); - } -} - -/** - Reads multiple words of Data from the IDE Data port. - Call the IO abstraction once to do the complete read, - not one word at a time - - @param Port IO port to read - @param Count Number of UINT16's to read - @param Buffer Pointer to the Data Buffer for read - -**/ -VOID -EFIAPI -IdeReadPortWMultiple ( - IN UINT16 Port, - IN UINTN Count, - IN UINT16 *Buffer - ) -{ - UINTN Index; - - for (Index = 0; Index < Count; Index++) { - Buffer[Count] = IoRead16 (Port); - } -} - -/** - This function is used to analyze the Status Register and print out - some debug information and if there is ERR bit set in the Status - Register, the Error Register's Value is also be parsed and print out. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - -**/ -VOID -EFIAPI -DumpAllIdeRegisters ( - IN EFI_IDE_REGISTERS *IdeRegisters - ) -{ - ASSERT (IdeRegisters != NULL); - - DEBUG_CODE_BEGIN (); - if ((IoRead8 (IdeRegisters->CmdOrStatus) & ATA_STSREG_DWF) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Write Fault\n", IoRead8 (IdeRegisters->CmdOrStatus))); - } - - if ((IoRead8 (IdeRegisters->CmdOrStatus) & ATA_STSREG_CORR) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Corrected Data\n", IoRead8 (IdeRegisters->CmdOrStatus))); - } - - if ((IoRead8 (IdeRegisters->CmdOrStatus) & ATA_STSREG_ERR) != 0) { - if ((IoRead8 (IdeRegisters->ErrOrFeature) & ATA_ERRREG_BBK) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Bad Block Detected\n", IoRead8 (IdeRegisters->ErrOrFeature))); - } - - if ((IoRead8 (IdeRegisters->ErrOrFeature) & ATA_ERRREG_UNC) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Uncorrectable Data\n", IoRead8 (IdeRegisters->ErrOrFeature))); - } - - if ((IoRead8 (IdeRegisters->ErrOrFeature) & ATA_ERRREG_MC) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Media Change\n", IoRead8 (IdeRegisters->ErrOrFeature))); - } - - if ((IoRead8 (IdeRegisters->ErrOrFeature) & ATA_ERRREG_ABRT) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Abort\n", IoRead8 (IdeRegisters->ErrOrFeature))); - } - - if ((IoRead8 (IdeRegisters->ErrOrFeature) & ATA_ERRREG_TK0NF) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Track 0 Not Found\n", IoRead8 (IdeRegisters->ErrOrFeature))); - } - - if ((IoRead8 (IdeRegisters->ErrOrFeature) & ATA_ERRREG_AMNF) != 0) { - DEBUG ((EFI_D_ERROR, "CheckRegisterStatus()-- %02x : Error : Address Mark Not Found\n", IoRead8 (IdeRegisters->ErrOrFeature))); - } - } - DEBUG_CODE_END (); -} - -/** - This function is used to analyze the Status Register and print out - some debug information and if there is ERR bit set in the Status - Register, the Error Register's Value is also be parsed and print out. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - - @retval EFI_SUCCESS No err information in the Status Register. - @retval EFI_DEVICE_ERROR Any err information in the Status Register. - -**/ -EFI_STATUS -EFIAPI -CheckStatusRegister ( - IN EFI_IDE_REGISTERS *IdeRegisters - ) -{ - EFI_STATUS Status; - UINT8 StatusRegister; - - ASSERT (IdeRegisters != NULL); - - StatusRegister = IoRead8 (IdeRegisters->CmdOrStatus); - - if ((StatusRegister & (ATA_STSREG_ERR | ATA_STSREG_DWF | ATA_STSREG_CORR)) == 0) { - Status = EFI_SUCCESS; - } else { - Status = EFI_DEVICE_ERROR; - } - - return Status; -} - -/** - This function is used to poll for the DRQ bit clear in the Status - Register. DRQ is cleared when the device is finished transferring Data. - So this function is called after Data transfer is finished. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS DRQ bit clear within the time out. - @retval EFI_TIMEOUT DRQ bit not clear within the time out. - - @note - Read Status Register will clear interrupt status. - -**/ -EFI_STATUS -EFIAPI -DRQClear ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN UINT64 Timeout - ) -{ - UINT32 Delay; - UINT8 StatusRegister; - - ASSERT (IdeRegisters != NULL); - - Delay = (UINT32) (DivU64x32(Timeout, 1000) + 1); - do { - StatusRegister = IoRead8 (IdeRegisters->CmdOrStatus); - - // - // wait for BSY == 0 and DRQ == 0 - // - if ((StatusRegister & ATA_STSREG_BSY) == 0) { - - if ((StatusRegister & ATA_STSREG_DRQ) == ATA_STSREG_DRQ) { - return EFI_DEVICE_ERROR; - } else { - return EFI_SUCCESS; - } - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay (100); - - Delay--; - - } while (Delay > 0); - - return EFI_TIMEOUT; -} -/** - This function is used to poll for the DRQ bit clear in the Alternate - Status Register. DRQ is cleared when the device is finished - transferring Data. So this function is called after Data transfer - is finished. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS DRQ bit clear within the time out. - - @retval EFI_TIMEOUT DRQ bit not clear within the time out. - @note Read Alternate Status Register will not clear interrupt status. - -**/ -EFI_STATUS -EFIAPI -DRQClear2 ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN UINT64 Timeout - ) -{ - UINT32 Delay; - UINT8 AltRegister; - - ASSERT (IdeRegisters != NULL); - - Delay = (UINT32) (DivU64x32(Timeout, 1000) + 1); - do { - AltRegister = IoRead8 (IdeRegisters->AltOrDev); - - // - // wait for BSY == 0 and DRQ == 0 - // - if ((AltRegister & ATA_STSREG_BSY) == 0) { - if ((AltRegister & ATA_STSREG_DRQ) == ATA_STSREG_DRQ) { - return EFI_DEVICE_ERROR; - } else { - return EFI_SUCCESS; - } - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay (100); - - Delay--; - - } while (Delay > 0); - - return EFI_TIMEOUT; -} - - -/** - This function is used to poll for the DRQ bit set in the Alternate Status Register. - DRQ is set when the device is ready to transfer Data. So this function is called after - the command is sent to the device and before required Data is transferred. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS DRQ bit set within the time out. - @retval EFI_TIMEOUT DRQ bit not set within the time out. - @retval EFI_ABORTED DRQ bit not set caused by the command abort. - @note Read Alternate Status Register will not clear interrupt status. - -**/ -EFI_STATUS -EFIAPI -DRQReady2 ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN UINT64 Timeout - ) -{ - UINT32 Delay; - UINT8 AltRegister; - UINT8 ErrorRegister; - - ASSERT (IdeRegisters != NULL); - - Delay = (UINT32) (DivU64x32(Timeout, 1000) + 1); - - do { - // - // Read Alternate Status Register will not clear interrupt status - // - AltRegister = IoRead8 (IdeRegisters->AltOrDev); - // - // BSY == 0 , DRQ == 1 - // - if ((AltRegister & ATA_STSREG_BSY) == 0) { - if ((AltRegister & ATA_STSREG_ERR) == ATA_STSREG_ERR) { - ErrorRegister = IoRead8 (IdeRegisters->ErrOrFeature); - - if ((ErrorRegister & ATA_ERRREG_ABRT) == ATA_ERRREG_ABRT) { - return EFI_ABORTED; - } - return EFI_DEVICE_ERROR; - } - - if ((AltRegister & ATA_STSREG_DRQ) == ATA_STSREG_DRQ) { - return EFI_SUCCESS; - } else { - return EFI_NOT_READY; - } - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay (100); - - Delay--; - } while (Delay > 0); - - return EFI_TIMEOUT; -} - -/** - This function is used to poll for the BSY bit clear in the Status Register. BSY - is clear when the device is not busy. Every command must be sent after device is not busy. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS BSY bit clear within the time out. - @retval EFI_TIMEOUT BSY bit not clear within the time out. - - @note Read Status Register will clear interrupt status. -**/ -EFI_STATUS -EFIAPI -WaitForBSYClear ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN UINT64 Timeout - ) -{ - UINT32 Delay; - UINT8 StatusRegister; - - ASSERT (IdeRegisters != NULL); - - Delay = (UINT32) (DivU64x32(Timeout, 1000) + 1); - do { - StatusRegister = IoRead8 (IdeRegisters->CmdOrStatus); - - if ((StatusRegister & ATA_STSREG_BSY) == 0x00) { - return EFI_SUCCESS; - } - - // - // Stall for 100 microseconds. - // - MicroSecondDelay (100); - - Delay--; - - } while (Delay > 0); - - return EFI_TIMEOUT; -} - -/** - Get IDE i/o port registers' base addresses by mode. - - In 'Compatibility' mode, use fixed addresses. - In Native-PCI mode, get base addresses from BARs in the PCI IDE controller's - Configuration Space. - - The steps to get IDE i/o port registers' base addresses for each channel - as follows: - - 1. Examine the Programming Interface byte of the Class Code fields in PCI IDE - controller's Configuration Space to determine the operating mode. - - 2. a) In 'Compatibility' mode, use fixed addresses shown in the Table 1 below. - ___________________________________________ - | | Command Block | Control Block | - | Channel | Registers | Registers | - |___________|_______________|_______________| - | Primary | 1F0h - 1F7h | 3F6h - 3F7h | - |___________|_______________|_______________| - | Secondary | 170h - 177h | 376h - 377h | - |___________|_______________|_______________| - - Table 1. Compatibility resource mappings - - b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs - in IDE controller's PCI Configuration Space, shown in the Table 2 below. - ___________________________________________________ - | | Command Block | Control Block | - | Channel | Registers | Registers | - |___________|___________________|___________________| - | Primary | BAR at offset 0x10| BAR at offset 0x14| - |___________|___________________|___________________| - | Secondary | BAR at offset 0x18| BAR at offset 0x1C| - |___________|___________________|___________________| - - Table 2. BARs for Register Mapping - - @param[in] Bus The bus number of ata host controller. - @param[in] Device The device number of ata host controller. - @param[in] Function The function number of ata host controller. - @param[in, out] IdeRegisters Pointer to EFI_IDE_REGISTERS which is used to - store the IDE i/o port registers' base addresses - - @retval EFI_UNSUPPORTED Return this Value when the BARs is not IO type - @retval EFI_SUCCESS Get the Base address successfully - @retval Other Read the pci configureation Data error - -**/ -EFI_STATUS -EFIAPI -GetIdeRegisterIoAddr ( - IN UINTN Bus, - IN UINTN Device, - IN UINTN Function, - IN OUT EFI_IDE_REGISTERS *IdeRegisters - ) -{ - UINT16 CommandBlockBaseAddr; - UINT16 ControlBlockBaseAddr; - UINT8 ClassCode; - UINT32 BaseAddress[4]; - - if (IdeRegisters == NULL) { - return EFI_INVALID_PARAMETER; - } - - ClassCode = PciRead8 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x9)); - BaseAddress[0] = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x10)); - BaseAddress[1] = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x14)); - BaseAddress[2] = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x18)); - BaseAddress[3] = PciRead32 (PCI_LIB_ADDRESS (Bus, Device, Function, 0x1C)); - - if ((ClassCode & IDE_PRIMARY_OPERATING_MODE) == 0) { - CommandBlockBaseAddr = 0x1f0; - ControlBlockBaseAddr = 0x3f6; - } else { - // - // The BARs should be of IO type - // - if ((BaseAddress[0] & BIT0) == 0 || - (BaseAddress[1] & BIT0) == 0) { - return EFI_UNSUPPORTED; - } - - CommandBlockBaseAddr = (UINT16) (BaseAddress[0] & 0x0000fff8); - ControlBlockBaseAddr = (UINT16) ((BaseAddress[1] & 0x0000fffc) + 2); - } - - // - // Calculate IDE primary channel I/O register base address. - // - IdeRegisters[EfiIdePrimary].Data = CommandBlockBaseAddr; - IdeRegisters[EfiIdePrimary].ErrOrFeature = (UINT16) (CommandBlockBaseAddr + 0x01); - IdeRegisters[EfiIdePrimary].SectorCount = (UINT16) (CommandBlockBaseAddr + 0x02); - IdeRegisters[EfiIdePrimary].SectorNumber = (UINT16) (CommandBlockBaseAddr + 0x03); - IdeRegisters[EfiIdePrimary].CylinderLsb = (UINT16) (CommandBlockBaseAddr + 0x04); - IdeRegisters[EfiIdePrimary].CylinderMsb = (UINT16) (CommandBlockBaseAddr + 0x05); - IdeRegisters[EfiIdePrimary].Head = (UINT16) (CommandBlockBaseAddr + 0x06); - IdeRegisters[EfiIdePrimary].CmdOrStatus = (UINT16) (CommandBlockBaseAddr + 0x07); - IdeRegisters[EfiIdePrimary].AltOrDev = ControlBlockBaseAddr; - - if ((ClassCode & IDE_SECONDARY_OPERATING_MODE) == 0) { - CommandBlockBaseAddr = 0x170; - ControlBlockBaseAddr = 0x376; - } else { - // - // The BARs should be of IO type - // - if ((BaseAddress[2] & BIT0) == 0 || - (BaseAddress[3] & BIT0) == 0) { - return EFI_UNSUPPORTED; - } - - CommandBlockBaseAddr = (UINT16) (BaseAddress[2] & 0x0000fff8); - ControlBlockBaseAddr = (UINT16) ((BaseAddress[3] & 0x0000fffc) + 2); - } - - // - // Calculate IDE secondary channel I/O register base address. - // - IdeRegisters[EfiIdeSecondary].Data = CommandBlockBaseAddr; - IdeRegisters[EfiIdeSecondary].ErrOrFeature = (UINT16) (CommandBlockBaseAddr + 0x01); - IdeRegisters[EfiIdeSecondary].SectorCount = (UINT16) (CommandBlockBaseAddr + 0x02); - IdeRegisters[EfiIdeSecondary].SectorNumber = (UINT16) (CommandBlockBaseAddr + 0x03); - IdeRegisters[EfiIdeSecondary].CylinderLsb = (UINT16) (CommandBlockBaseAddr + 0x04); - IdeRegisters[EfiIdeSecondary].CylinderMsb = (UINT16) (CommandBlockBaseAddr + 0x05); - IdeRegisters[EfiIdeSecondary].Head = (UINT16) (CommandBlockBaseAddr + 0x06); - IdeRegisters[EfiIdeSecondary].CmdOrStatus = (UINT16) (CommandBlockBaseAddr + 0x07); - IdeRegisters[EfiIdeSecondary].AltOrDev = ControlBlockBaseAddr; - - return EFI_SUCCESS; -} - -/** - Send ATA Ext command into device with NON_DATA protocol. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param AtaCommandBlock A pointer to EFI_ATA_COMMAND_BLOCK Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS Reading succeed - @retval EFI_DEVICE_ERROR Error executing commands on this device. - -**/ -EFI_STATUS -EFIAPI -AtaIssueCommand ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, - IN UINT64 Timeout - ) -{ - EFI_STATUS Status; - UINT8 DeviceHead; - UINT8 AtaCommand; - - ASSERT (IdeRegisters != NULL); - ASSERT (AtaCommandBlock != NULL); - - DeviceHead = AtaCommandBlock->AtaDeviceHead; - AtaCommand = AtaCommandBlock->AtaCommand; - - Status = WaitForBSYClear (IdeRegisters, Timeout); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - // - // Select device (bit4), set LBA mode(bit6) (use 0xe0 for compatibility) - // - IoWrite8 (IdeRegisters->Head, (UINT8) (0xe0 | DeviceHead)); - - // - // set all the command parameters - // Before write to all the following registers, BSY and DRQ must be 0. - // - Status = DRQClear2 (IdeRegisters, Timeout); - if (EFI_ERROR (Status)) { - return EFI_DEVICE_ERROR; - } - - // - // Fill the feature register, which is a two-byte FIFO. Need write twice. - // - IoWrite8 (IdeRegisters->ErrOrFeature, AtaCommandBlock->AtaFeaturesExp); - IoWrite8 (IdeRegisters->ErrOrFeature, AtaCommandBlock->AtaFeatures); - - // - // Fill the sector count register, which is a two-byte FIFO. Need write twice. - // - IoWrite8 (IdeRegisters->SectorCount, AtaCommandBlock->AtaSectorCountExp); - IoWrite8 (IdeRegisters->SectorCount, AtaCommandBlock->AtaSectorCount); - - // - // Fill the start LBA registers, which are also two-byte FIFO - // - IoWrite8 (IdeRegisters->SectorNumber, AtaCommandBlock->AtaSectorNumberExp); - IoWrite8 (IdeRegisters->SectorNumber, AtaCommandBlock->AtaSectorNumber); - - IoWrite8 (IdeRegisters->CylinderLsb, AtaCommandBlock->AtaCylinderLowExp); - IoWrite8 (IdeRegisters->CylinderLsb, AtaCommandBlock->AtaCylinderLow); - - IoWrite8 (IdeRegisters->CylinderMsb, AtaCommandBlock->AtaCylinderHighExp); - IoWrite8 (IdeRegisters->CylinderMsb, AtaCommandBlock->AtaCylinderHigh); - - // - // Send command via Command Register - // - IoWrite8 (IdeRegisters->CmdOrStatus, AtaCommand); - - // - // Stall at least 400 microseconds. - // - MicroSecondDelay (400); - - return EFI_SUCCESS; -} - -/** - This function is used to send out ATA commands conforms to the PIO Data In Protocol. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Buffer A pointer to the source Buffer for the Data. - @param ByteCount The Length of the Data. - @param Read Flag used to determine the Data transfer direction. - Read equals 1, means Data transferred from device to host; - Read equals 0, means Data transferred from host to device. - @param AtaCommandBlock A pointer to EFI_ATA_COMMAND_BLOCK Data structure. - @param AtaStatusBlock A pointer to EFI_ATA_STATUS_BLOCK Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS send out the ATA command and device send required Data successfully. - @retval EFI_DEVICE_ERROR command sent failed. - -**/ -EFI_STATUS -EFIAPI -AtaPioDataInOut ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN OUT VOID *Buffer, - IN UINT64 ByteCount, - IN BOOLEAN Read, - IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, - IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, - IN UINT64 Timeout - ) -{ - UINTN WordCount; - UINTN Increment; - UINT16 *Buffer16; - EFI_STATUS Status; - - if ((IdeRegisters == NULL) || (Buffer == NULL) || (AtaCommandBlock == NULL)) { - return EFI_INVALID_PARAMETER; - } - - // - // Issue ATA command - // - Status = AtaIssueCommand (IdeRegisters, AtaCommandBlock, Timeout); - if (EFI_ERROR (Status)) { - Status = EFI_DEVICE_ERROR; - goto Exit; - } - - Buffer16 = (UINT16 *) Buffer; - - // - // According to PIO Data in protocol, host can perform a series of reads to - // the Data register after each time device set DRQ ready; - // The Data Size of "a series of read" is command specific. - // For most ATA command, Data Size received from device will not exceed - // 1 sector, hence the Data Size for "a series of read" can be the whole Data - // Size of one command request. - // For ATA command such as Read Sector command, the Data Size of one ATA - // command request is often larger than 1 sector, according to the - // Read Sector command, the Data Size of "a series of read" is exactly 1 - // sector. - // Here for simplification reason, we specify the Data Size for - // "a series of read" to 1 sector (256 words) if Data Size of one ATA command - // request is larger than 256 words. - // - Increment = 256; - - // - // used to record bytes of currently transfered Data - // - WordCount = 0; - - while (WordCount < RShiftU64(ByteCount, 1)) { - // - // Poll DRQ bit set, Data transfer can be performed only when DRQ is ready - // - Status = DRQReady2 (IdeRegisters, Timeout); - if (EFI_ERROR (Status)) { - Status = EFI_DEVICE_ERROR; - goto Exit; - } - - // - // Get the byte count for one series of read - // - if ((WordCount + Increment) > RShiftU64(ByteCount, 1)) { - Increment = (UINTN)(RShiftU64(ByteCount, 1) - WordCount); - } - - if (Read) { - IdeReadPortWMultiple ( - IdeRegisters->Data, - Increment, - Buffer16 - ); - } else { - IdeWritePortWMultiple ( - IdeRegisters->Data, - Increment, - Buffer16 - ); - } - - Status = CheckStatusRegister (IdeRegisters); - if (EFI_ERROR (Status)) { - Status = EFI_DEVICE_ERROR; - goto Exit; - } - - WordCount += Increment; - Buffer16 += Increment; - } - - Status = DRQClear (IdeRegisters, Timeout); - if (EFI_ERROR (Status)) { - Status = EFI_DEVICE_ERROR; - goto Exit; - } - -Exit: - // - // Dump All Ide registers to ATA_STATUS_BLOCK - // - DumpAllIdeRegisters (IdeRegisters); - - return Status; -} - -/** - Sends out an ATA Identify Command to the specified device. - - This function sends out the ATA Identify Command to the - specified device. Only ATA device responses to this command. If - the command succeeds, it returns the Identify Data structure which - contains information about the device. This function extracts the - information it needs to fill the IDE_BLK_IO_DEV Data structure, - including device type, media block Size, media capacity, and etc. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Channel The channel number of device. - @param Device The device number of device. - @param Buffer A pointer to Data Buffer which is used to contain IDENTIFY Data. - - @retval EFI_SUCCESS Identify ATA device successfully. - @retval EFI_DEVICE_ERROR ATA Identify Device Command failed or device is not ATA device. - @retval EFI_OUT_OF_RESOURCES Allocate memory failed. -**/ -EFI_STATUS -EFIAPI -AtaIdentify ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN UINT8 Channel, - IN UINT8 Device, - IN OUT ATA_IDENTIFY_DATA *Buffer - ) -{ - EFI_STATUS Status; - EFI_ATA_COMMAND_BLOCK AtaCommandBlock; - - ZeroMem (&AtaCommandBlock, sizeof (EFI_ATA_COMMAND_BLOCK)); - - AtaCommandBlock.AtaCommand = ATA_CMD_IDENTIFY_DRIVE; - AtaCommandBlock.AtaDeviceHead = (UINT8)(Device << 0x4); - - Status = AtaPioDataInOut ( - IdeRegisters, - Buffer, - sizeof (ATA_IDENTIFY_DATA), - TRUE, - &AtaCommandBlock, - NULL, - ATA_TIMEOUT - ); - - return Status; -} - - - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.h b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.h deleted file mode 100644 index ba94a97505..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.h +++ /dev/null @@ -1,173 +0,0 @@ -/** @file - Header file for IDE mode of ATA host controller. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - - - -#ifndef __OPAL_PASSWORD_IDE_MODE_H__ -#define __OPAL_PASSWORD_IDE_MODE_H__ - -typedef enum { - EfiIdePrimary = 0, - EfiIdeSecondary = 1, - EfiIdeMaxChannel = 2 -} EFI_IDE_CHANNEL; - -typedef enum { - EfiIdeMaster = 0, - EfiIdeSlave = 1, - EfiIdeMaxDevice = 2 -} EFI_IDE_DEVICE; - -// -// IDE registers set -// -typedef struct { - UINT16 Data; - UINT16 ErrOrFeature; - UINT16 SectorCount; - UINT16 SectorNumber; - UINT16 CylinderLsb; - UINT16 CylinderMsb; - UINT16 Head; - UINT16 CmdOrStatus; - UINT16 AltOrDev; -} EFI_IDE_REGISTERS; - -// -// Bit definitions in Programming Interface byte of the Class Code field -// in PCI IDE controller's Configuration Space -// -#define IDE_PRIMARY_OPERATING_MODE BIT0 -#define IDE_PRIMARY_PROGRAMMABLE_INDICATOR BIT1 -#define IDE_SECONDARY_OPERATING_MODE BIT2 -#define IDE_SECONDARY_PROGRAMMABLE_INDICATOR BIT3 - -/** - Get IDE i/o port registers' base addresses by mode. - - In 'Compatibility' mode, use fixed addresses. - In Native-PCI mode, get base addresses from BARs in the PCI IDE controller's - Configuration Space. - - The steps to get IDE i/o port registers' base addresses for each channel - as follows: - - 1. Examine the Programming Interface byte of the Class Code fields in PCI IDE - controller's Configuration Space to determine the operating mode. - - 2. a) In 'Compatibility' mode, use fixed addresses shown in the Table 1 below. - ___________________________________________ - | | Command Block | Control Block | - | Channel | Registers | Registers | - |___________|_______________|_______________| - | Primary | 1F0h - 1F7h | 3F6h - 3F7h | - |___________|_______________|_______________| - | Secondary | 170h - 177h | 376h - 377h | - |___________|_______________|_______________| - - Table 1. Compatibility resource mappings - - b) In Native-PCI mode, IDE registers are mapped into IO space using the BARs - in IDE controller's PCI Configuration Space, shown in the Table 2 below. - ___________________________________________________ - | | Command Block | Control Block | - | Channel | Registers | Registers | - |___________|___________________|___________________| - | Primary | BAR at offset 0x10| BAR at offset 0x14| - |___________|___________________|___________________| - | Secondary | BAR at offset 0x18| BAR at offset 0x1C| - |___________|___________________|___________________| - - Table 2. BARs for Register Mapping - - @param[in] Bus The bus number of ata host controller. - @param[in] Device The device number of ata host controller. - @param[in] Function The function number of ata host controller. - @param[in, out] IdeRegisters Pointer to EFI_IDE_REGISTERS which is used to - store the IDE i/o port registers' base addresses - - @retval EFI_UNSUPPORTED Return this Value when the BARs is not IO type - @retval EFI_SUCCESS Get the Base address successfully - @retval Other Read the pci configureation Data error - -**/ -EFI_STATUS -EFIAPI -GetIdeRegisterIoAddr ( - IN UINTN Bus, - IN UINTN Device, - IN UINTN Function, - IN OUT EFI_IDE_REGISTERS *IdeRegisters - ); - -/** - Sends out an ATA Identify Command to the specified device. - - This function sends out the ATA Identify Command to the - specified device. Only ATA device responses to this command. If - the command succeeds, it returns the Identify Data structure which - contains information about the device. This function extracts the - information it needs to fill the IDE_BLK_IO_DEV Data structure, - including device type, media block Size, media capacity, and etc. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Channel The channel number of device. - @param Device The device number of device. - @param Buffer A pointer to Data Buffer which is used to contain IDENTIFY Data. - - @retval EFI_SUCCESS Identify ATA device successfully. - @retval EFI_DEVICE_ERROR ATA Identify Device Command failed or device is not ATA device. - @retval EFI_OUT_OF_RESOURCES Allocate memory failed. -**/ -EFI_STATUS -EFIAPI -AtaIdentify ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN UINT8 Channel, - IN UINT8 Device, - IN OUT ATA_IDENTIFY_DATA *Buffer - ); - -/** - This function is used to send out ATA commands conforms to the PIO Data In Protocol. - - @param IdeRegisters A pointer to EFI_IDE_REGISTERS Data structure. - @param Buffer A pointer to the source Buffer for the Data. - @param ByteCount The Length of the Data. - @param Read Flag used to determine the Data transfer direction. - Read equals 1, means Data transferred from device to host; - Read equals 0, means Data transferred from host to device. - @param AtaCommandBlock A pointer to EFI_ATA_COMMAND_BLOCK Data structure. - @param AtaStatusBlock A pointer to EFI_ATA_STATUS_BLOCK Data structure. - @param Timeout The time to complete the command. - - @retval EFI_SUCCESS send out the ATA command and device send required Data successfully. - @retval EFI_DEVICE_ERROR command sent failed. - -**/ -EFI_STATUS -EFIAPI -AtaPioDataInOut ( - IN EFI_IDE_REGISTERS *IdeRegisters, - IN OUT VOID *Buffer, - IN UINT64 ByteCount, - IN BOOLEAN Read, - IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, - IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, - IN UINT64 Timeout - ); - - -#endif - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c deleted file mode 100644 index a47d2764c3..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c +++ /dev/null @@ -1,2165 +0,0 @@ -/** @file - Provide functions to initialize NVME controller and perform NVME commands - -Copyright (c) 2016 - 2017, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "OpalPasswordSmm.h" - - -#define ALIGN(v, a) (UINTN)((((v) - 1) | ((a) - 1)) + 1) - -/// -/// NVME Host controller registers operation -/// -#define NVME_GET_CAP(Nvme, Cap) NvmeMmioRead (Cap, Nvme->Nbar + NVME_CAP_OFFSET, sizeof (NVME_CAP)) -#define NVME_GET_CC(Nvme, Cc) NvmeMmioRead (Cc, Nvme->Nbar + NVME_CC_OFFSET, sizeof (NVME_CC)) -#define NVME_SET_CC(Nvme, Cc) NvmeMmioWrite (Nvme->Nbar + NVME_CC_OFFSET, Cc, sizeof (NVME_CC)) -#define NVME_GET_CSTS(Nvme, Csts) NvmeMmioRead (Csts, Nvme->Nbar + NVME_CSTS_OFFSET, sizeof (NVME_CSTS)) -#define NVME_GET_AQA(Nvme, Aqa) NvmeMmioRead (Aqa, Nvme->Nbar + NVME_AQA_OFFSET, sizeof (NVME_AQA)) -#define NVME_SET_AQA(Nvme, Aqa) NvmeMmioWrite (Nvme->Nbar + NVME_AQA_OFFSET, Aqa, sizeof (NVME_AQA)) -#define NVME_GET_ASQ(Nvme, Asq) NvmeMmioRead (Asq, Nvme->Nbar + NVME_ASQ_OFFSET, sizeof (NVME_ASQ)) -#define NVME_SET_ASQ(Nvme, Asq) NvmeMmioWrite (Nvme->Nbar + NVME_ASQ_OFFSET, Asq, sizeof (NVME_ASQ)) -#define NVME_GET_ACQ(Nvme, Acq) NvmeMmioRead (Acq, Nvme->Nbar + NVME_ACQ_OFFSET, sizeof (NVME_ACQ)) -#define NVME_SET_ACQ(Nvme, Acq) NvmeMmioWrite (Nvme->Nbar + NVME_ACQ_OFFSET, Acq, sizeof (NVME_ACQ)) -#define NVME_GET_VER(Nvme, Ver) NvmeMmioRead (Ver, Nvme->Nbar + NVME_VER_OFFSET, sizeof (NVME_VER)) -#define NVME_SET_SQTDBL(Nvme, Qid, Sqtdbl) NvmeMmioWrite (Nvme->Nbar + NVME_SQTDBL_OFFSET(Qid, Nvme->Cap.Dstrd), Sqtdbl, sizeof (NVME_SQTDBL)) -#define NVME_SET_CQHDBL(Nvme, Qid, Cqhdbl) NvmeMmioWrite (Nvme->Nbar + NVME_CQHDBL_OFFSET(Qid, Nvme->Cap.Dstrd), Cqhdbl, sizeof (NVME_CQHDBL)) - -/// -/// Base memory address -/// -enum { - BASEMEM_CONTROLLER_DATA, - BASEMEM_IDENTIFY_DATA, - BASEMEM_ASQ, - BASEMEM_ACQ, - BASEMEM_SQ, - BASEMEM_CQ, - BASEMEM_PRP, - BASEMEM_SECURITY, - MAX_BASEMEM_COUNT -}; - -/// -/// All of base memories are 4K(0x1000) alignment -/// -#define NVME_MEM_BASE(Nvme) ((UINTN)(Nvme->BaseMem)) -#define NVME_CONTROL_DATA_BASE(Nvme) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_CONTROLLER_DATA)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_NAMESPACE_DATA_BASE(Nvme) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_IDENTIFY_DATA)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_ASQ_BASE(Nvme) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_ASQ)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_ACQ_BASE(Nvme) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_ACQ)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_SQ_BASE(Nvme, index) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_SQ) + ((index)*(NVME_MAX_IO_QUEUES-1))) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_CQ_BASE(Nvme, index) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_CQ) + ((index)*(NVME_MAX_IO_QUEUES-1))) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_PRP_BASE(Nvme, index) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_PRP) + ((index)*NVME_PRP_SIZE)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) -#define NVME_SEC_BASE(Nvme) (ALIGN (NVME_MEM_BASE(Nvme) + ((NvmeGetBaseMemPages (BASEMEM_SECURITY)) * EFI_PAGE_SIZE), EFI_PAGE_SIZE)) - -/** - Transfer MMIO Data to memory. - - @param[in,out] MemBuffer - Destination: Memory address - @param[in] MmioAddr - Source: MMIO address - @param[in] Size - Size for read - - @retval EFI_SUCCESS - MMIO read sucessfully -**/ -EFI_STATUS -NvmeMmioRead ( - IN OUT VOID *MemBuffer, - IN UINTN MmioAddr, - IN UINTN Size - ) -{ - UINTN Offset; - UINT8 Data; - UINT8 *Ptr; - - // priority has adjusted - switch (Size) { - case 4: - *((UINT32 *)MemBuffer) = MmioRead32 (MmioAddr); - break; - - case 8: - *((UINT64 *)MemBuffer) = MmioRead64 (MmioAddr); - break; - - case 2: - *((UINT16 *)MemBuffer) = MmioRead16 (MmioAddr); - break; - - case 1: - *((UINT8 *)MemBuffer) = MmioRead8 (MmioAddr); - break; - - default: - Ptr = (UINT8 *)MemBuffer; - for (Offset = 0; Offset < Size; Offset += 1) { - Data = MmioRead8 (MmioAddr + Offset); - Ptr[Offset] = Data; - } - break; - } - - return EFI_SUCCESS; -} - -/** - Transfer memory data to MMIO. - - @param[in,out] MmioAddr - Destination: MMIO address - @param[in] MemBuffer - Source: Memory address - @param[in] Size - Size for write - - @retval EFI_SUCCESS - MMIO write sucessfully -**/ -EFI_STATUS -NvmeMmioWrite ( - IN OUT UINTN MmioAddr, - IN VOID *MemBuffer, - IN UINTN Size - ) -{ - UINTN Offset; - UINT8 Data; - UINT8 *Ptr; - - // priority has adjusted - switch (Size) { - case 4: - MmioWrite32 (MmioAddr, *((UINT32 *)MemBuffer)); - break; - - case 8: - MmioWrite64 (MmioAddr, *((UINT64 *)MemBuffer)); - break; - - case 2: - MmioWrite16 (MmioAddr, *((UINT16 *)MemBuffer)); - break; - - case 1: - MmioWrite8 (MmioAddr, *((UINT8 *)MemBuffer)); - break; - - default: - Ptr = (UINT8 *)MemBuffer; - for (Offset = 0; Offset < Size; Offset += 1) { - Data = Ptr[Offset]; - MmioWrite8 (MmioAddr + Offset, Data); - } - break; - } - - return EFI_SUCCESS; -} - -/** - Transfer MMIO data to memory. - - @param[in,out] MemBuffer - Destination: Memory address - @param[in] MmioAddr - Source: MMIO address - @param[in] Size - Size for read - - @retval EFI_SUCCESS - MMIO read sucessfully -**/ -EFI_STATUS -OpalPciRead ( - IN OUT VOID *MemBuffer, - IN UINTN MmioAddr, - IN UINTN Size - ) -{ - UINTN Offset; - UINT8 Data; - UINT8 *Ptr; - - // priority has adjusted - switch (Size) { - case 4: - *((UINT32 *)MemBuffer) = PciRead32 (MmioAddr); - break; - - case 2: - *((UINT16 *)MemBuffer) = PciRead16 (MmioAddr); - break; - - case 1: - *((UINT8 *)MemBuffer) = PciRead8 (MmioAddr); - break; - - default: - Ptr = (UINT8 *)MemBuffer; - for (Offset = 0; Offset < Size; Offset += 1) { - Data = PciRead8 (MmioAddr + Offset); - Ptr[Offset] = Data; - } - break; - } - - return EFI_SUCCESS; -} - -/** - Transfer memory data to MMIO. - - @param[in,out] MmioAddr - Destination: MMIO address - @param[in] MemBuffer - Source: Memory address - @param[in] Size - Size for write - - @retval EFI_SUCCESS - MMIO write sucessfully -**/ -EFI_STATUS -OpalPciWrite ( - IN OUT UINTN MmioAddr, - IN VOID *MemBuffer, - IN UINTN Size - ) -{ - UINTN Offset; - UINT8 Data; - UINT8 *Ptr; - - // priority has adjusted - switch (Size) { - case 4: - PciWrite32 (MmioAddr, *((UINT32 *)MemBuffer)); - break; - - case 2: - PciWrite16 (MmioAddr, *((UINT16 *)MemBuffer)); - break; - - case 1: - PciWrite8 (MmioAddr, *((UINT8 *)MemBuffer)); - break; - - default: - Ptr = (UINT8 *)MemBuffer; - for (Offset = 0; Offset < Size; Offset += 1) { - Data = Ptr[Offset]; - PciWrite8 (MmioAddr + Offset, Data); - } - break; - } - - return EFI_SUCCESS; -} - -/** - Get total pages for specific NVME based memory. - - @param[in] BaseMemIndex - The Index of BaseMem (0-based). - - @retval - The page count for specific BaseMem Index - -**/ -UINT32 -NvmeGetBaseMemPages ( - IN UINTN BaseMemIndex - ) -{ - UINT32 Pages; - UINTN Index; - UINT32 PageSizeList[8]; - - PageSizeList[0] = 1; /* Controller Data */ - PageSizeList[1] = 1; /* Identify Data */ - PageSizeList[2] = 1; /* ASQ */ - PageSizeList[3] = 1; /* ACQ */ - PageSizeList[4] = 1; /* SQs */ - PageSizeList[5] = 1; /* CQs */ - PageSizeList[6] = NVME_PRP_SIZE * NVME_CSQ_DEPTH; /* PRPs */ - PageSizeList[7] = 1; /* Security Commands */ - - if (BaseMemIndex > MAX_BASEMEM_COUNT) { - ASSERT (FALSE); - return 0; - } - - Pages = 0; - for (Index = 0; Index < BaseMemIndex; Index++) { - Pages += PageSizeList[Index]; - } - - return Pages; -} - -/** - Wait for NVME controller status to be ready or not. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] WaitReady - Flag for waitting status ready or not - - @return EFI_SUCCESS - Successfully to wait specific status. - @return others - Fail to wait for specific controller status. - -**/ -STATIC -EFI_STATUS -NvmeWaitController ( - IN NVME_CONTEXT *Nvme, - IN BOOLEAN WaitReady - ) -{ - NVME_CSTS Csts; - EFI_STATUS Status; - UINT32 Index; - UINT8 Timeout; - - // - // Cap.To specifies max delay time in 500ms increments for Csts.Rdy to set after - // Cc.Enable. Loop produces a 1 millisecond delay per itteration, up to 500 * Cap.To. - // - if (Nvme->Cap.To == 0) { - Timeout = 1; - } else { - Timeout = Nvme->Cap.To; - } - - Status = EFI_SUCCESS; - for(Index = (Timeout * 500); Index != 0; --Index) { - MicroSecondDelay (1000); - - // - // Check if the controller is initialized - // - Status = NVME_GET_CSTS (Nvme, &Csts); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_GET_CSTS fail, Status = %r\n", Status)); - return Status; - } - - if ((BOOLEAN) Csts.Rdy == WaitReady) { - break; - } - } - - if (Index == 0) { - Status = EFI_TIMEOUT; - } - - return Status; -} - -/** - Disable the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully disable the controller. - @return others - Fail to disable the controller. - -**/ -STATIC -EFI_STATUS -NvmeDisableController ( - IN NVME_CONTEXT *Nvme - ) -{ - NVME_CC Cc; - NVME_CSTS Csts; - EFI_STATUS Status; - - Status = NVME_GET_CSTS (Nvme, &Csts); - - /// - /// Read Controller Configuration Register. - /// - Status = NVME_GET_CC (Nvme, &Cc); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_GET_CC fail, Status = %r\n", Status)); - goto Done; - } - - if (Cc.En == 1) { - Cc.En = 0; - /// - /// Disable the controller. - /// - Status = NVME_SET_CC (Nvme, &Cc); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_SET_CC fail, Status = %r\n", Status)); - goto Done; - } - } - - Status = NvmeWaitController (Nvme, FALSE); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeWaitController fail, Status = %r\n", Status)); - goto Done; - } - - return EFI_SUCCESS; - -Done: - DEBUG ((DEBUG_INFO, "NvmeDisableController fail, Status: %r\n", Status)); - return Status; -} - -/** - Enable the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully enable the controller. - @return EFI_DEVICE_ERROR - Fail to enable the controller. - @return EFI_TIMEOUT - Fail to enable the controller in given time slot. - -**/ -STATIC -EFI_STATUS -NvmeEnableController ( - IN NVME_CONTEXT *Nvme - ) -{ - NVME_CC Cc; - EFI_STATUS Status; - - // - // Enable the controller - // - ZeroMem (&Cc, sizeof (NVME_CC)); - Cc.En = 1; - Cc.Iosqes = 6; - Cc.Iocqes = 4; - Status = NVME_SET_CC (Nvme, &Cc); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_SET_CC fail, Status = %r\n", Status)); - goto Done; - } - - Status = NvmeWaitController (Nvme, TRUE); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeWaitController fail, Status = %r\n", Status)); - goto Done; - } - - return EFI_SUCCESS; - -Done: - DEBUG ((DEBUG_INFO, "NvmeEnableController fail, Status: %r\n", Status)); - return Status; -} - -/** - Shutdown the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully shutdown the controller. - @return EFI_DEVICE_ERROR - Fail to shutdown the controller. - @return EFI_TIMEOUT - Fail to shutdown the controller in given time slot. - -**/ -STATIC -EFI_STATUS -NvmeShutdownController ( - IN NVME_CONTEXT *Nvme - ) -{ - NVME_CC Cc; - NVME_CSTS Csts; - EFI_STATUS Status; - UINT32 Index; - UINTN Timeout; - - Status = NVME_GET_CC (Nvme, &Cc); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_GET_CC fail, Status = %r\n", Status)); - return Status; - } - - Cc.Shn = 1; // Normal shutdown - - Status = NVME_SET_CC (Nvme, &Cc); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_SET_CC fail, Status = %r\n", Status)); - return Status; - } - - Timeout = NVME_GENERIC_TIMEOUT/1000; // ms - for(Index = (UINT32)(Timeout); Index != 0; --Index) { - MicroSecondDelay (1000); - - Status = NVME_GET_CSTS (Nvme, &Csts); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_GET_CSTS fail, Status = %r\n", Status)); - return Status; - } - - if (Csts.Shst == 2) { // Shutdown processing complete - break; - } - } - - if (Index == 0) { - Status = EFI_TIMEOUT; - } - - return Status; -} - -/** - Check the execution status from a given completion queue entry. - - @param[in] Cq - A pointer to the NVME_CQ item. - -**/ -EFI_STATUS -NvmeCheckCqStatus ( - IN NVME_CQ *Cq - ) -{ - if (Cq->Sct == 0x0 && Cq->Sc == 0x0) { - return EFI_SUCCESS; - } - - DEBUG ((DEBUG_INFO, "Dump NVMe Completion Entry Status from [0x%x]:\n", (UINTN)Cq)); - DEBUG ((DEBUG_INFO, " SQ Identifier : [0x%x], Phase Tag : [%d], Cmd Identifier : [0x%x]\n", Cq->Sqid, Cq->Pt, Cq->Cid)); - DEBUG ((DEBUG_INFO, " NVMe Cmd Execution Result - ")); - - switch (Cq->Sct) { - case 0x0: - switch (Cq->Sc) { - case 0x0: - DEBUG ((DEBUG_INFO, "Successful Completion\n")); - return EFI_SUCCESS; - case 0x1: - DEBUG ((DEBUG_INFO, "Invalid Command Opcode\n")); - break; - case 0x2: - DEBUG ((DEBUG_INFO, "Invalid Field in Command\n")); - break; - case 0x3: - DEBUG ((DEBUG_INFO, "Command ID Conflict\n")); - break; - case 0x4: - DEBUG ((DEBUG_INFO, "Data Transfer Error\n")); - break; - case 0x5: - DEBUG ((DEBUG_INFO, "Commands Aborted due to Power Loss Notification\n")); - break; - case 0x6: - DEBUG ((DEBUG_INFO, "Internal Device Error\n")); - break; - case 0x7: - DEBUG ((DEBUG_INFO, "Command Abort Requested\n")); - break; - case 0x8: - DEBUG ((DEBUG_INFO, "Command Aborted due to SQ Deletion\n")); - break; - case 0x9: - DEBUG ((DEBUG_INFO, "Command Aborted due to Failed Fused Command\n")); - break; - case 0xA: - DEBUG ((DEBUG_INFO, "Command Aborted due to Missing Fused Command\n")); - break; - case 0xB: - DEBUG ((DEBUG_INFO, "Invalid Namespace or Format\n")); - break; - case 0xC: - DEBUG ((DEBUG_INFO, "Command Sequence Error\n")); - break; - case 0xD: - DEBUG ((DEBUG_INFO, "Invalid SGL Last Segment Descriptor\n")); - break; - case 0xE: - DEBUG ((DEBUG_INFO, "Invalid Number of SGL Descriptors\n")); - break; - case 0xF: - DEBUG ((DEBUG_INFO, "Data SGL Length Invalid\n")); - break; - case 0x10: - DEBUG ((DEBUG_INFO, "Metadata SGL Length Invalid\n")); - break; - case 0x11: - DEBUG ((DEBUG_INFO, "SGL Descriptor Type Invalid\n")); - break; - case 0x80: - DEBUG ((DEBUG_INFO, "LBA Out of Range\n")); - break; - case 0x81: - DEBUG ((DEBUG_INFO, "Capacity Exceeded\n")); - break; - case 0x82: - DEBUG ((DEBUG_INFO, "Namespace Not Ready\n")); - break; - case 0x83: - DEBUG ((DEBUG_INFO, "Reservation Conflict\n")); - break; - } - break; - - case 0x1: - switch (Cq->Sc) { - case 0x0: - DEBUG ((DEBUG_INFO, "Completion Queue Invalid\n")); - break; - case 0x1: - DEBUG ((DEBUG_INFO, "Invalid Queue Identifier\n")); - break; - case 0x2: - DEBUG ((DEBUG_INFO, "Maximum Queue Size Exceeded\n")); - break; - case 0x3: - DEBUG ((DEBUG_INFO, "Abort Command Limit Exceeded\n")); - break; - case 0x5: - DEBUG ((DEBUG_INFO, "Asynchronous Event Request Limit Exceeded\n")); - break; - case 0x6: - DEBUG ((DEBUG_INFO, "Invalid Firmware Slot\n")); - break; - case 0x7: - DEBUG ((DEBUG_INFO, "Invalid Firmware Image\n")); - break; - case 0x8: - DEBUG ((DEBUG_INFO, "Invalid Interrupt Vector\n")); - break; - case 0x9: - DEBUG ((DEBUG_INFO, "Invalid Log Page\n")); - break; - case 0xA: - DEBUG ((DEBUG_INFO, "Invalid Format\n")); - break; - case 0xB: - DEBUG ((DEBUG_INFO, "Firmware Application Requires Conventional Reset\n")); - break; - case 0xC: - DEBUG ((DEBUG_INFO, "Invalid Queue Deletion\n")); - break; - case 0xD: - DEBUG ((DEBUG_INFO, "Feature Identifier Not Saveable\n")); - break; - case 0xE: - DEBUG ((DEBUG_INFO, "Feature Not Changeable\n")); - break; - case 0xF: - DEBUG ((DEBUG_INFO, "Feature Not Namespace Specific\n")); - break; - case 0x10: - DEBUG ((DEBUG_INFO, "Firmware Application Requires NVM Subsystem Reset\n")); - break; - case 0x80: - DEBUG ((DEBUG_INFO, "Conflicting Attributes\n")); - break; - case 0x81: - DEBUG ((DEBUG_INFO, "Invalid Protection Information\n")); - break; - case 0x82: - DEBUG ((DEBUG_INFO, "Attempted Write to Read Only Range\n")); - break; - } - break; - - case 0x2: - switch (Cq->Sc) { - case 0x80: - DEBUG ((DEBUG_INFO, "Write Fault\n")); - break; - case 0x81: - DEBUG ((DEBUG_INFO, "Unrecovered Read Error\n")); - break; - case 0x82: - DEBUG ((DEBUG_INFO, "End-to-end Guard Check Error\n")); - break; - case 0x83: - DEBUG ((DEBUG_INFO, "End-to-end Application Tag Check Error\n")); - break; - case 0x84: - DEBUG ((DEBUG_INFO, "End-to-end Reference Tag Check Error\n")); - break; - case 0x85: - DEBUG ((DEBUG_INFO, "Compare Failure\n")); - break; - case 0x86: - DEBUG ((DEBUG_INFO, "Access Denied\n")); - break; - } - break; - - default: - DEBUG ((DEBUG_INFO, "Unknown error\n")); - break; - } - - return EFI_DEVICE_ERROR; -} - -/** - Create PRP lists for Data transfer which is larger than 2 memory pages. - Note here we calcuate the number of required PRP lists and allocate them at one time. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] SqId - The SQ index for this PRP - @param[in] PhysicalAddr - The physical base address of Data Buffer. - @param[in] Pages - The number of pages to be transfered. - @param[out] PrpListHost - The host base address of PRP lists. - @param[in,out] PrpListNo - The number of PRP List. - - @retval The pointer Value to the first PRP List of the PRP lists. - -**/ -STATIC -UINT64 -NvmeCreatePrpList ( - IN NVME_CONTEXT *Nvme, - IN UINT16 SqId, - IN EFI_PHYSICAL_ADDRESS PhysicalAddr, - IN UINTN Pages, - OUT VOID **PrpListHost, - IN OUT UINTN *PrpListNo - ) -{ - UINTN PrpEntryNo; - UINT64 PrpListBase; - UINTN PrpListIndex; - UINTN PrpEntryIndex; - UINT64 Remainder; - EFI_PHYSICAL_ADDRESS PrpListPhyAddr; - UINTN Bytes; - UINT8 *PrpEntry; - EFI_PHYSICAL_ADDRESS NewPhyAddr; - - /// - /// The number of Prp Entry in a memory page. - /// - PrpEntryNo = EFI_PAGE_SIZE / sizeof (UINT64); - - /// - /// Calculate total PrpList number. - /// - *PrpListNo = (UINTN) DivU64x64Remainder ((UINT64)Pages, (UINT64)PrpEntryNo, &Remainder); - if (Remainder != 0) { - *PrpListNo += 1; - } - - if (*PrpListNo > NVME_PRP_SIZE) { - DEBUG ((DEBUG_INFO, "NvmeCreatePrpList (PhysicalAddr: %lx, Pages: %x) PrpEntryNo: %x\n", - PhysicalAddr, Pages, PrpEntryNo)); - DEBUG ((DEBUG_INFO, "*PrpListNo: %x, Remainder: %lx", *PrpListNo, Remainder)); - ASSERT (FALSE); - } - *PrpListHost = (VOID *)(UINTN) NVME_PRP_BASE (Nvme, SqId); - - Bytes = EFI_PAGES_TO_SIZE (*PrpListNo); - PrpListPhyAddr = (UINT64)(UINTN)(*PrpListHost); - - /// - /// Fill all PRP lists except of last one. - /// - ZeroMem (*PrpListHost, Bytes); - for (PrpListIndex = 0; PrpListIndex < *PrpListNo - 1; ++PrpListIndex) { - PrpListBase = *(UINT64*)PrpListHost + PrpListIndex * EFI_PAGE_SIZE; - - for (PrpEntryIndex = 0; PrpEntryIndex < PrpEntryNo; ++PrpEntryIndex) { - PrpEntry = (UINT8 *)(UINTN) (PrpListBase + PrpEntryIndex * sizeof(UINT64)); - if (PrpEntryIndex != PrpEntryNo - 1) { - /// - /// Fill all PRP entries except of last one. - /// - CopyMem (PrpEntry, (VOID *)(UINTN) (&PhysicalAddr), sizeof (UINT64)); - PhysicalAddr += EFI_PAGE_SIZE; - } else { - /// - /// Fill last PRP entries with next PRP List pointer. - /// - NewPhyAddr = (PrpListPhyAddr + (PrpListIndex + 1) * EFI_PAGE_SIZE); - CopyMem (PrpEntry, (VOID *)(UINTN) (&NewPhyAddr), sizeof (UINT64)); - } - } - } - - /// - /// Fill last PRP list. - /// - PrpListBase = *(UINT64*)PrpListHost + PrpListIndex * EFI_PAGE_SIZE; - for (PrpEntryIndex = 0; PrpEntryIndex < ((Remainder != 0) ? Remainder : PrpEntryNo); ++PrpEntryIndex) { - PrpEntry = (UINT8 *)(UINTN) (PrpListBase + PrpEntryIndex * sizeof(UINT64)); - CopyMem (PrpEntry, (VOID *)(UINTN) (&PhysicalAddr), sizeof (UINT64)); - - PhysicalAddr += EFI_PAGE_SIZE; - } - - return PrpListPhyAddr; -} - -/** - Check whether there are available command slots. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Qid - Queue index - - @retval EFI_SUCCESS - Available command slot is found - @retval EFI_NOT_READY - No available command slot is found - @retval EFI_DEVICE_ERROR - Error occurred on device side. - -**/ -EFI_STATUS -NvmeHasFreeCmdSlot ( - IN NVME_CONTEXT *Nvme, - IN UINT8 Qid - ) -{ - return TRUE; -} - -/** - Check whether all command slots are clean. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Qid - Queue index - - @retval EFI_SUCCESS - All command slots are clean - @retval EFI_NOT_READY - Not all command slots are clean - @retval EFI_DEVICE_ERROR - Error occurred on device side. - -**/ -EFI_STATUS -NvmeIsAllCmdSlotClean ( - IN NVME_CONTEXT *Nvme, - IN UINT8 Qid - ) -{ - return EFI_SUCCESS; -} - -/** - Waits until all NVME commands completed. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Qid - Queue index - - @retval EFI_SUCCESS - All NVME commands have completed - @retval EFI_TIMEOUT - Timeout occured - @retval EFI_NOT_READY - Not all NVME commands have completed - @retval others - Error occurred on device side. -**/ -EFI_STATUS -NvmeWaitAllComplete ( - IN NVME_CONTEXT *Nvme, - IN UINT8 Qid - ) -{ - return EFI_SUCCESS; -} - -/** - Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports - both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the nonblocking - I/O functionality is optional. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] NamespaceId - Is a 32 bit Namespace ID to which the Express HCI command packet will be sent. - A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace - ID specifies that the command packet should be sent to all valid namespaces. - @param[in] NamespaceUuid - Is a 64 bit Namespace UUID to which the Express HCI command packet will be sent. - A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace - UUID specifies that the command packet should be sent to all valid namespaces. - @param[in,out] Packet - A pointer to the NVM Express HCI Command Packet to send to the NVMe namespace specified - by NamespaceId. - - @retval EFI_SUCCESS - The NVM Express Command Packet was sent by the host. TransferLength bytes were transferred - to, or from DataBuffer. - @retval EFI_NOT_READY - The NVM Express Command Packet could not be sent because the controller is not ready. The caller - may retry again later. - @retval EFI_DEVICE_ERROR - A device error occurred while attempting to send the NVM Express Command Packet. - @retval EFI_INVALID_PARAMETER - Namespace, or the contents of NVM_EXPRESS_PASS_THRU_COMMAND_PACKET are invalid. The NVM - Express Command Packet was not sent, so no additional status information is available. - @retval EFI_UNSUPPORTED - The command described by the NVM Express Command Packet is not supported by the host adapter. - The NVM Express Command Packet was not sent, so no additional status information is available. - @retval EFI_TIMEOUT - A timeout occurred while waiting for the NVM Express Command Packet to execute. - -**/ -EFI_STATUS -NvmePassThru ( - IN NVME_CONTEXT *Nvme, - IN UINT32 NamespaceId, - IN UINT64 NamespaceUuid, - IN OUT NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet - ) -{ - EFI_STATUS Status; - NVME_SQ *Sq; - NVME_CQ *Cq; - UINT8 Qid; - UINT32 Bytes; - UINT32 Offset; - EFI_PHYSICAL_ADDRESS PhyAddr; - VOID *PrpListHost; - UINTN PrpListNo; - UINT32 Timer; - UINTN SqSize; - UINTN CqSize; - - /// - /// check the Data fields in Packet parameter. - /// - if ((Nvme == NULL) || (Packet == NULL)) { - DEBUG ((DEBUG_ERROR, "NvmePassThru, invalid parameter: Nvme(%x)/Packet(%x)\n", - (UINTN)Nvme, (UINTN)Packet)); - return EFI_INVALID_PARAMETER; - } - - if ((Packet->NvmeCmd == NULL) || (Packet->NvmeResponse == NULL)) { - DEBUG ((DEBUG_ERROR, "NvmePassThru, invalid parameter: NvmeCmd(%x)/NvmeResponse(%x)\n", - (UINTN)Packet->NvmeCmd, (UINTN)Packet->NvmeResponse)); - return EFI_INVALID_PARAMETER; - } - - if (Packet->QueueId != NVME_ADMIN_QUEUE && Packet->QueueId != NVME_IO_QUEUE) { - DEBUG ((DEBUG_ERROR, "NvmePassThru, invalid parameter: QueueId(%x)\n", - Packet->QueueId)); - return EFI_INVALID_PARAMETER; - } - - PrpListHost = NULL; - PrpListNo = 0; - Status = EFI_SUCCESS; - - Qid = Packet->QueueId; - Sq = Nvme->SqBuffer[Qid] + Nvme->SqTdbl[Qid].Sqt; - Cq = Nvme->CqBuffer[Qid] + Nvme->CqHdbl[Qid].Cqh; - if (Qid == NVME_ADMIN_QUEUE) { - SqSize = NVME_ASQ_SIZE + 1; - CqSize = NVME_ACQ_SIZE + 1; - } else { - SqSize = NVME_CSQ_DEPTH; - CqSize = NVME_CCQ_DEPTH; - } - - if (Packet->NvmeCmd->Nsid != NamespaceId) { - DEBUG ((DEBUG_ERROR, "NvmePassThru: Nsid mismatch (%x, %x)\n", - Packet->NvmeCmd->Nsid, NamespaceId)); - return EFI_INVALID_PARAMETER; - } - - ZeroMem (Sq, sizeof (NVME_SQ)); - Sq->Opc = Packet->NvmeCmd->Cdw0.Opcode; - Sq->Fuse = Packet->NvmeCmd->Cdw0.FusedOperation; - Sq->Cid = Packet->NvmeCmd->Cdw0.Cid; - Sq->Nsid = Packet->NvmeCmd->Nsid; - - /// - /// Currently we only support PRP for Data transfer, SGL is NOT supported. - /// - ASSERT (Sq->Psdt == 0); - if (Sq->Psdt != 0) { - DEBUG ((DEBUG_ERROR, "NvmePassThru: doesn't support SGL mechanism\n")); - return EFI_UNSUPPORTED; - } - - Sq->Prp[0] = Packet->TransferBuffer; - Sq->Prp[1] = 0; - - if(Packet->MetadataBuffer != (UINT64)(UINTN)NULL) { - Sq->Mptr = Packet->MetadataBuffer; - } - - /// - /// If the Buffer Size spans more than two memory pages (page Size as defined in CC.Mps), - /// then build a PRP list in the second PRP submission queue entry. - /// - Offset = ((UINT32)Sq->Prp[0]) & (EFI_PAGE_SIZE - 1); - Bytes = Packet->TransferLength; - - if ((Offset + Bytes) > (EFI_PAGE_SIZE * 2)) { - /// - /// Create PrpList for remaining Data Buffer. - /// - PhyAddr = (Sq->Prp[0] + EFI_PAGE_SIZE) & ~(EFI_PAGE_SIZE - 1); - Sq->Prp[1] = NvmeCreatePrpList (Nvme, Nvme->SqTdbl[Qid].Sqt, PhyAddr, EFI_SIZE_TO_PAGES(Offset + Bytes) - 1, &PrpListHost, &PrpListNo); - if (Sq->Prp[1] == 0) { - Status = EFI_OUT_OF_RESOURCES; - DEBUG ((DEBUG_ERROR, "NvmeCreatePrpList fail, Status: %r\n", Status)); - goto EXIT; - } - - } else if ((Offset + Bytes) > EFI_PAGE_SIZE) { - Sq->Prp[1] = (Sq->Prp[0] + EFI_PAGE_SIZE) & ~(EFI_PAGE_SIZE - 1); - } - - if(Packet->NvmeCmd->Flags & CDW10_VALID) { - Sq->Payload.Raw.Cdw10 = Packet->NvmeCmd->Cdw10; - } - if(Packet->NvmeCmd->Flags & CDW11_VALID) { - Sq->Payload.Raw.Cdw11 = Packet->NvmeCmd->Cdw11; - } - if(Packet->NvmeCmd->Flags & CDW12_VALID) { - Sq->Payload.Raw.Cdw12 = Packet->NvmeCmd->Cdw12; - } - if(Packet->NvmeCmd->Flags & CDW13_VALID) { - Sq->Payload.Raw.Cdw13 = Packet->NvmeCmd->Cdw13; - } - if(Packet->NvmeCmd->Flags & CDW14_VALID) { - Sq->Payload.Raw.Cdw14 = Packet->NvmeCmd->Cdw14; - } - if(Packet->NvmeCmd->Flags & CDW15_VALID) { - Sq->Payload.Raw.Cdw15 = Packet->NvmeCmd->Cdw15; - } - - /// - /// Ring the submission queue doorbell. - /// - Nvme->SqTdbl[Qid].Sqt++; - if(Nvme->SqTdbl[Qid].Sqt == SqSize) { - Nvme->SqTdbl[Qid].Sqt = 0; - } - Status = NVME_SET_SQTDBL (Nvme, Qid, &Nvme->SqTdbl[Qid]); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NVME_SET_SQTDBL fail, Status: %r\n", Status)); - goto EXIT; - } - - /// - /// Wait for completion queue to get filled in. - /// - Status = EFI_TIMEOUT; - Timer = 0; - while (Timer < NVME_CMD_TIMEOUT) { - //DEBUG ((DEBUG_VERBOSE, "Timer: %x, Cq:\n", Timer)); - //DumpMem (Cq, sizeof (NVME_CQ)); - if (Cq->Pt != Nvme->Pt[Qid]) { - Status = EFI_SUCCESS; - break; - } - - MicroSecondDelay (NVME_CMD_WAIT); - Timer += NVME_CMD_WAIT; - } - - Nvme->CqHdbl[Qid].Cqh++; - if (Nvme->CqHdbl[Qid].Cqh == CqSize) { - Nvme->CqHdbl[Qid].Cqh = 0; - Nvme->Pt[Qid] ^= 1; - } - - /// - /// Copy the Respose Queue entry for this command to the callers response Buffer - /// - CopyMem (Packet->NvmeResponse, Cq, sizeof(NVM_EXPRESS_RESPONSE)); - - if (!EFI_ERROR(Status)) { // We still need to check CQ status if no timeout error occured - Status = NvmeCheckCqStatus (Cq); - } - NVME_SET_CQHDBL (Nvme, Qid, &Nvme->CqHdbl[Qid]); - -EXIT: - return Status; -} - -/** - Get identify controller Data. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Buffer - The Buffer used to store the identify controller Data. - - @return EFI_SUCCESS - Successfully get the identify controller Data. - @return others - Fail to get the identify controller Data. - -**/ -STATIC -EFI_STATUS -NvmeIdentifyController ( - IN NVME_CONTEXT *Nvme, - IN VOID *Buffer - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - - Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_OPC; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - // - // According to Nvm Express 1.1 spec Figure 38, When not used, the field shall be cleared to 0h. - // For the Identify command, the Namespace Identifier is only used for the Namespace Data structure. - // - Command.Nsid = 0; - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - CommandPacket.TransferBuffer = (UINT64)(UINTN)Buffer; - CommandPacket.TransferLength = sizeof (NVME_ADMIN_CONTROLLER_DATA); - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - // - // Set bit 0 (Cns bit) to 1 to identify a controller - // - Command.Cdw10 = 1; - Command.Flags = CDW10_VALID; - - Status = NvmePassThru ( - Nvme, - NVME_CONTROLLER_ID, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Get specified identify namespace Data. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] NamespaceId - The specified namespace identifier. - @param[in] Buffer - The Buffer used to store the identify namespace Data. - - @return EFI_SUCCESS - Successfully get the identify namespace Data. - @return others - Fail to get the identify namespace Data. - -**/ -STATIC -EFI_STATUS -NvmeIdentifyNamespace ( - IN NVME_CONTEXT *Nvme, - IN UINT32 NamespaceId, - IN VOID *Buffer - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - Command.Cdw0.Opcode = NVME_ADMIN_IDENTIFY_OPC; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - Command.Nsid = NamespaceId; - CommandPacket.TransferBuffer = (UINT64)(UINTN)Buffer; - CommandPacket.TransferLength = sizeof (NVME_ADMIN_NAMESPACE_DATA); - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - // - // Set bit 0 (Cns bit) to 1 to identify a namespace - // - CommandPacket.NvmeCmd->Cdw10 = 0; - CommandPacket.NvmeCmd->Flags = CDW10_VALID; - - Status = NvmePassThru ( - Nvme, - NamespaceId, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Get Block Size for specific namespace of NVME. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return - Block Size in bytes - -**/ -STATIC -UINT32 -NvmeGetBlockSize ( - IN NVME_CONTEXT *Nvme - ) -{ - UINT32 BlockSize; - UINT32 Lbads; - UINT32 Flbas; - UINT32 LbaFmtIdx; - - Flbas = Nvme->NamespaceData->Flbas; - LbaFmtIdx = Flbas & 3; - Lbads = Nvme->NamespaceData->LbaFormat[LbaFmtIdx].Lbads; - - BlockSize = (UINT32)1 << Lbads; - return BlockSize; -} - -/** - Get last LBA for specific namespace of NVME. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return - Last LBA address - -**/ -STATIC -EFI_LBA -NvmeGetLastLba ( - IN NVME_CONTEXT *Nvme - ) -{ - EFI_LBA LastBlock; - LastBlock = Nvme->NamespaceData->Nsze - 1; - return LastBlock; -} - -/** - Create io completion queue. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully create io completion queue. - @return others - Fail to create io completion queue. - -**/ -STATIC -EFI_STATUS -NvmeCreateIoCompletionQueue ( - IN NVME_CONTEXT *Nvme - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - NVME_ADMIN_CRIOCQ CrIoCq; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - ZeroMem (&CrIoCq, sizeof(NVME_ADMIN_CRIOCQ)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - Command.Cdw0.Opcode = NVME_ADMIN_CRIOCQ_OPC; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - CommandPacket.TransferBuffer = (UINT64)(UINTN)Nvme->CqBuffer[NVME_IO_QUEUE]; - CommandPacket.TransferLength = EFI_PAGE_SIZE; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - - CrIoCq.Qid = NVME_IO_QUEUE; - CrIoCq.Qsize = NVME_CCQ_SIZE; - CrIoCq.Pc = 1; - CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoCq, sizeof (NVME_ADMIN_CRIOCQ)); - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID; - - Status = NvmePassThru ( - Nvme, - NVME_CONTROLLER_ID, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Create io submission queue. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully create io submission queue. - @return others - Fail to create io submission queue. - -**/ -STATIC -EFI_STATUS -NvmeCreateIoSubmissionQueue ( - IN NVME_CONTEXT *Nvme - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - NVME_ADMIN_CRIOSQ CrIoSq; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - ZeroMem (&CrIoSq, sizeof(NVME_ADMIN_CRIOSQ)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - Command.Cdw0.Opcode = NVME_ADMIN_CRIOSQ_OPC; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - CommandPacket.TransferBuffer = (UINT64)(UINTN)Nvme->SqBuffer[NVME_IO_QUEUE]; - CommandPacket.TransferLength = EFI_PAGE_SIZE; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - - CrIoSq.Qid = NVME_IO_QUEUE; - CrIoSq.Qsize = NVME_CSQ_SIZE; - CrIoSq.Pc = 1; - CrIoSq.Cqid = NVME_IO_QUEUE; - CrIoSq.Qprio = 0; - CopyMem (&CommandPacket.NvmeCmd->Cdw10, &CrIoSq, sizeof (NVME_ADMIN_CRIOSQ)); - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID; - - Status = NvmePassThru ( - Nvme, - NVME_CONTROLLER_ID, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Security send and receive commands. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] SendCommand - The flag to indicate the command type, TRUE for Send command and FALSE for receive command - @param[in] SecurityProtocol - Security Protocol - @param[in] SpSpecific - Security Protocol Specific - @param[in] TransferLength - Transfer Length of Buffer (in bytes) - always a multiple of 512 - @param[in,out] TransferBuffer - Address of Data to transfer - - @return EFI_SUCCESS - Successfully create io submission queue. - @return others - Fail to send/receive commands. - -**/ -EFI_STATUS -NvmeSecuritySendReceive ( - IN NVME_CONTEXT *Nvme, - IN BOOLEAN SendCommand, - IN UINT8 SecurityProtocol, - IN UINT16 SpSpecific, - IN UINTN TransferLength, - IN OUT VOID *TransferBuffer - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - NVME_ADMIN_SECSEND SecSend; - OACS *Oacs; - UINT8 Opcode; - VOID* *SecBuff; - - Oacs = (OACS *)&Nvme->ControllerData->Oacs; - - // - // Verify security bit for Security Send/Receive commands - // - if (Oacs->Security == 0) { - DEBUG ((DEBUG_ERROR, "Security command doesn't support.\n")); - return EFI_NOT_READY; - } - - SecBuff = (VOID *)(UINTN) NVME_SEC_BASE (Nvme); - - // - // Actions for sending security command - // - if (SendCommand) { - CopyMem (SecBuff, TransferBuffer, TransferLength); - } - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - ZeroMem (&SecSend, sizeof(NVME_ADMIN_SECSEND)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - Opcode = (UINT8)(SendCommand ? NVME_ADMIN_SECURITY_SEND_OPC : NVME_ADMIN_SECURITY_RECV_OPC); - Command.Cdw0.Opcode = Opcode; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - CommandPacket.TransferBuffer = (UINT64)(UINTN)SecBuff; - CommandPacket.TransferLength = (UINT32)TransferLength; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - - SecSend.Spsp = SpSpecific; - SecSend.Secp = SecurityProtocol; - SecSend.Tl = (UINT32)TransferLength; - - CopyMem (&CommandPacket.NvmeCmd->Cdw10, &SecSend, sizeof (NVME_ADMIN_SECSEND)); - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID; - - Status = NvmePassThru ( - Nvme, - NVME_CONTROLLER_ID, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - // - // Actions for receiving security command - // - if (!SendCommand) { - CopyMem (TransferBuffer, SecBuff, TransferLength); - } - - return Status; -} - -/** - Destroy io completion queue. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully destroy io completion queue. - @return others - Fail to destroy io completion queue. - -**/ -STATIC -EFI_STATUS -NvmeDestroyIoCompletionQueue ( - IN NVME_CONTEXT *Nvme - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - NVME_ADMIN_DEIOCQ DelIoCq; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - ZeroMem (&DelIoCq, sizeof(NVME_ADMIN_DEIOCQ)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - Command.Cdw0.Opcode = NVME_ADMIN_DELIOCQ_OPC; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - CommandPacket.TransferBuffer = (UINT64)(UINTN)Nvme->CqBuffer[NVME_IO_QUEUE]; - CommandPacket.TransferLength = EFI_PAGE_SIZE; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - - DelIoCq.Qid = NVME_IO_QUEUE; - CopyMem (&CommandPacket.NvmeCmd->Cdw10, &DelIoCq, sizeof (NVME_ADMIN_DEIOCQ)); - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID; - - Status = NvmePassThru ( - Nvme, - NVME_CONTROLLER_ID, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Destroy io submission queue. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @return EFI_SUCCESS - Successfully destroy io submission queue. - @return others - Fail to destroy io submission queue. - -**/ -STATIC -EFI_STATUS -NvmeDestroyIoSubmissionQueue ( - IN NVME_CONTEXT *Nvme - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - NVME_ADMIN_DEIOSQ DelIoSq; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - ZeroMem (&DelIoSq, sizeof(NVME_ADMIN_DEIOSQ)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - Command.Cdw0.Opcode = NVME_ADMIN_DELIOSQ_OPC; - Command.Cdw0.Cid = Nvme->Cid[NVME_ADMIN_QUEUE]++; - CommandPacket.TransferBuffer = (UINT64)(UINTN)Nvme->SqBuffer[NVME_IO_QUEUE]; - CommandPacket.TransferLength = EFI_PAGE_SIZE; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_ADMIN_QUEUE; - - DelIoSq.Qid = NVME_IO_QUEUE; - CopyMem (&CommandPacket.NvmeCmd->Cdw10, &DelIoSq, sizeof (NVME_ADMIN_DEIOSQ)); - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID; - - Status = NvmePassThru ( - Nvme, - NVME_CONTROLLER_ID, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Allocate transfer-related Data struct which is used at Nvme. - - @param[in] ImageHandle Image handle for this driver image - @param[in] Nvme The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_OUT_OF_RESOURCE The allocation is failure. - @retval EFI_SUCCESS Successful to allocate memory. - -**/ -EFI_STATUS -EFIAPI -NvmeAllocateResource ( - IN EFI_HANDLE ImageHandle, - IN NVME_CONTEXT *Nvme - ) -{ - EFI_STATUS Status; - EFI_PHYSICAL_ADDRESS Addr; - UINT32 Size; - - // - // Allocate resources required by NVMe host controller. - // - // NBAR - Size = 0x10000; - Addr = 0xFFFFFFFF; - Status = gDS->AllocateMemorySpace ( - EfiGcdAllocateMaxAddressSearchBottomUp, - EfiGcdMemoryTypeMemoryMappedIo, - 15, // 2^15: 32K Alignment - Size, - &Addr, - ImageHandle, - NULL - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - Nvme->Nbar = (UINT32) Addr; - - // DMA Buffer - Size = NVME_MEM_MAX_SIZE; - Addr = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES (Size), - (EFI_PHYSICAL_ADDRESS *)&Addr - ); - if (EFI_ERROR (Status)) { - return EFI_OUT_OF_RESOURCES; - } - Nvme->BaseMem = (UINT32) Addr; - - // Clean up DMA Buffer before using - ZeroMem ((VOID *)(UINTN)Addr, NVME_MEM_MAX_SIZE); - - return EFI_SUCCESS; -} - -/** - Free allocated transfer-related Data struct which is used at NVMe. - - @param[in] Nvme The pointer to the NVME_CONTEXT Data structure. - -**/ -VOID -EFIAPI -NvmeFreeResource ( - IN NVME_CONTEXT *Nvme - ) -{ - UINT32 Size; - - // NBAR - if (Nvme->BaseMem != 0) { - Size = 0x10000; - gDS->FreeMemorySpace (Nvme->Nbar, Size); - } - - // DMA Buffer - if (Nvme->Nbar != 0) { - Size = NVME_MEM_MAX_SIZE; - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN) Nvme->Nbar, EFI_SIZE_TO_PAGES (Size)); - } -} - - -/** - Initialize the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_SUCCESS - The NVM Express Controller is initialized successfully. - @retval Others - A device error occurred while initializing the controller. - -**/ -EFI_STATUS -NvmeControllerInit ( - IN NVME_CONTEXT *Nvme - ) -{ - EFI_STATUS Status; - NVME_AQA Aqa; - NVME_ASQ Asq; - NVME_ACQ Acq; - NVME_VER Ver; - - UINT32 MlBAR; - UINT32 MuBAR; - - /// - /// Update PCIE BAR0/1 for NVME device - /// - MlBAR = Nvme->Nbar; - MuBAR = 0; - PciWrite32 (Nvme->PciBase + 0x10, MlBAR); // MLBAR (BAR0) - PciWrite32 (Nvme->PciBase + 0x14, MuBAR); // MUBAR (BAR1) - - /// - /// Enable PCIE decode - /// - PciWrite8 (Nvme->PciBase + NVME_PCIE_PCICMD, 0x6); - - // Version - NVME_GET_VER (Nvme, &Ver); - if (!(Ver.Mjr == 0x0001) && (Ver.Mnr == 0x0000)) { - DEBUG ((DEBUG_INFO, "\n!!!\n!!! NVME Version mismatch for the implementation !!!\n!!!\n")); - } - - /// - /// Read the Controller Capabilities register and verify that the NVM command set is supported - /// - Status = NVME_GET_CAP (Nvme, &Nvme->Cap); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "NVME_GET_CAP fail, Status: %r\n", Status)); - goto Done; - } - - if (Nvme->Cap.Css != 0x01) { - DEBUG ((DEBUG_ERROR, "NvmeControllerInit fail: the controller doesn't support NVMe command set\n")); - Status = EFI_UNSUPPORTED; - goto Done; - } - - /// - /// Currently the driver only supports 4k page Size. - /// - if ((Nvme->Cap.Mpsmin + 12) > EFI_PAGE_SHIFT) { - DEBUG ((DEBUG_ERROR, "NvmeControllerInit fail: only supports 4k page Size\n")); - ASSERT (FALSE); - Status = EFI_UNSUPPORTED; - goto Done; - } - - Nvme->Cid[0] = 0; - Nvme->Cid[1] = 0; - - Nvme->Pt[0] = 0; - Nvme->Pt[1] = 0; - - ZeroMem ((VOID *)(UINTN)(&(Nvme->SqTdbl[0])), sizeof (NVME_SQTDBL) * NVME_MAX_IO_QUEUES); - ZeroMem ((VOID *)(UINTN)(&(Nvme->CqHdbl[0])), sizeof (NVME_CQHDBL) * NVME_MAX_IO_QUEUES); - - ZeroMem ((VOID *)(UINTN)Nvme->BaseMem, NVME_MEM_MAX_SIZE); - - Status = NvmeDisableController (Nvme); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeDisableController fail, Status: %r\n", Status)); - goto Done; - } - - /// - /// set number of entries admin submission & completion queues. - /// - Aqa.Asqs = NVME_ASQ_SIZE; - Aqa.Rsvd1 = 0; - Aqa.Acqs = NVME_ACQ_SIZE; - Aqa.Rsvd2 = 0; - - /// - /// Address of admin submission queue. - /// - Asq = (UINT64)(UINTN)(NVME_ASQ_BASE (Nvme) & ~0xFFF); - - /// - /// Address of admin completion queue. - /// - Acq = (UINT64)(UINTN)(NVME_ACQ_BASE (Nvme) & ~0xFFF); - - /// - /// Address of I/O submission & completion queue. - /// - Nvme->SqBuffer[0] = (NVME_SQ *)(UINTN)NVME_ASQ_BASE (Nvme); // NVME_ADMIN_QUEUE - Nvme->CqBuffer[0] = (NVME_CQ *)(UINTN)NVME_ACQ_BASE (Nvme); // NVME_ADMIN_QUEUE - Nvme->SqBuffer[1] = (NVME_SQ *)(UINTN)NVME_SQ_BASE (Nvme, 0); // NVME_IO_QUEUE - Nvme->CqBuffer[1] = (NVME_CQ *)(UINTN)NVME_CQ_BASE (Nvme, 0); // NVME_IO_QUEUE - - DEBUG ((DEBUG_INFO, "BaseMem = [%08X]\n", Nvme->BaseMem)); - DEBUG ((DEBUG_INFO, "Admin Submission Queue Size (Aqa.Asqs) = [%08X]\n", Aqa.Asqs)); - DEBUG ((DEBUG_INFO, "Admin Completion Queue Size (Aqa.Acqs) = [%08X]\n", Aqa.Acqs)); - DEBUG ((DEBUG_INFO, "Admin Submission Queue (SqBuffer[0]) = [%08X]\n", Nvme->SqBuffer[0])); - DEBUG ((DEBUG_INFO, "Admin Completion Queue (CqBuffer[0]) = [%08X]\n", Nvme->CqBuffer[0])); - DEBUG ((DEBUG_INFO, "I/O Submission Queue (SqBuffer[1]) = [%08X]\n", Nvme->SqBuffer[1])); - DEBUG ((DEBUG_INFO, "I/O Completion Queue (CqBuffer[1]) = [%08X]\n", Nvme->CqBuffer[1])); - - /// - /// Program admin queue attributes. - /// - Status = NVME_SET_AQA (Nvme, &Aqa); - if (EFI_ERROR(Status)) { - goto Done; - } - - /// - /// Program admin submission queue address. - /// - Status = NVME_SET_ASQ (Nvme, &Asq); - if (EFI_ERROR(Status)) { - goto Done; - } - - /// - /// Program admin completion queue address. - /// - Status = NVME_SET_ACQ (Nvme, &Acq); - if (EFI_ERROR(Status)) { - goto Done; - } - - Status = NvmeEnableController (Nvme); - if (EFI_ERROR(Status)) { - goto Done; - } - - /// - /// Create one I/O completion queue. - /// - Status = NvmeCreateIoCompletionQueue (Nvme); - if (EFI_ERROR(Status)) { - goto Done; - } - - /// - /// Create one I/O Submission queue. - /// - Status = NvmeCreateIoSubmissionQueue (Nvme); - if (EFI_ERROR(Status)) { - goto Done; - } - - /// - /// Get current Identify Controller Data - /// - Nvme->ControllerData = (NVME_ADMIN_CONTROLLER_DATA *)(UINTN) NVME_CONTROL_DATA_BASE (Nvme); - Status = NvmeIdentifyController (Nvme, Nvme->ControllerData); - if (EFI_ERROR(Status)) { - goto Done; - } - - /// - /// Dump NvmExpress Identify Controller Data - /// - Nvme->ControllerData->Sn[19] = 0; - Nvme->ControllerData->Mn[39] = 0; - //NvmeDumpIdentifyController (Nvme->ControllerData); - - /// - /// Get current Identify Namespace Data - /// - Nvme->NamespaceData = (NVME_ADMIN_NAMESPACE_DATA *)NVME_NAMESPACE_DATA_BASE (Nvme); - Status = NvmeIdentifyNamespace (Nvme, Nvme->Nsid, Nvme->NamespaceData); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeIdentifyNamespace fail, Status = %r\n", Status)); - goto Done; - } - - /// - /// Dump NvmExpress Identify Namespace Data - /// - if (Nvme->NamespaceData->Ncap == 0) { - DEBUG ((DEBUG_ERROR, "Invalid Namespace, Ncap: %lx\n", Nvme->NamespaceData->Ncap)); - Status = EFI_DEVICE_ERROR; - goto Done; - } - - Nvme->BlockSize = NvmeGetBlockSize (Nvme); - Nvme->LastBlock = NvmeGetLastLba (Nvme); - - Nvme->State = NvmeStatusInit; - - return EFI_SUCCESS; - -Done: - return Status; -} - -/** - Un-initialize the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_SUCCESS - The NVM Express Controller is un-initialized successfully. - @retval Others - A device error occurred while un-initializing the controller. - -**/ -EFI_STATUS -NvmeControllerExit ( - IN NVME_CONTEXT *Nvme - ) -{ - EFI_STATUS Status; - - Status = EFI_SUCCESS; - if (Nvme->State == NvmeStatusInit || Nvme->State == NvmeStatusMax) { - /// - /// Destroy I/O Submission queue. - /// - Status = NvmeDestroyIoSubmissionQueue (Nvme); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeDestroyIoSubmissionQueue fail, Status = %r\n", Status)); - return Status; - } - - /// - /// Destroy I/O completion queue. - /// - Status = NvmeDestroyIoCompletionQueue (Nvme); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeDestroyIoCompletionQueue fail, Status = %r\n", Status)); - return Status; - } - - Status = NvmeShutdownController (Nvme); - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeShutdownController fail, Status: %r\n", Status)); - } - } - - /// - /// Disable PCIE decode - /// - PciWrite8 (Nvme->PciBase + NVME_PCIE_PCICMD, 0x0); - PciWrite32 (Nvme->PciBase + 0x10, 0); // MLBAR (BAR0) - PciWrite32 (Nvme->PciBase + 0x14, 0); // MUBAR (BAR1) - - Nvme->State = NvmeStatusUnknown; - return Status; -} - -/** - Read sector Data from the NVMe device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in,out] Buffer - The Buffer used to store the Data read from the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be read. - - @retval EFI_SUCCESS - Datum are read from the device. - @retval Others - Fail to read all the datum. - -**/ -EFI_STATUS -NvmeReadSectors ( - IN NVME_CONTEXT *Nvme, - IN OUT UINT64 Buffer, - IN UINT64 Lba, - IN UINT32 Blocks - ) -{ - UINT32 Bytes; - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - UINT32 BlockSize; - - BlockSize = Nvme->BlockSize; - Bytes = Blocks * BlockSize; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - CommandPacket.NvmeCmd->Cdw0.Opcode = NVME_IO_READ_OPC; - CommandPacket.NvmeCmd->Cdw0.Cid = Nvme->Cid[NVME_IO_QUEUE]++; - CommandPacket.NvmeCmd->Nsid = Nvme->Nsid; - CommandPacket.TransferBuffer = Buffer; - - CommandPacket.TransferLength = Bytes; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_IO_QUEUE; - - CommandPacket.NvmeCmd->Cdw10 = (UINT32)Lba; - CommandPacket.NvmeCmd->Cdw11 = (UINT32)(RShiftU64 (Lba, 32)); - CommandPacket.NvmeCmd->Cdw12 = (Blocks - 1) & 0xFFFF; - - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID | CDW12_VALID; - - Status = NvmePassThru ( - Nvme, - Nvme->Nsid, - 0, - &CommandPacket - ); - - return Status; -} - -/** - Write sector Data to the NVMe device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Buffer - The Buffer to be written into the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be written. - - @retval EFI_SUCCESS - Datum are written into the Buffer. - @retval Others - Fail to write all the datum. - -**/ -EFI_STATUS -NvmeWriteSectors ( - IN NVME_CONTEXT *Nvme, - IN UINT64 Buffer, - IN UINT64 Lba, - IN UINT32 Blocks - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - UINT32 Bytes; - UINT32 BlockSize; - - BlockSize = Nvme->BlockSize; - Bytes = Blocks * BlockSize; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - CommandPacket.NvmeCmd->Cdw0.Opcode = NVME_IO_WRITE_OPC; - CommandPacket.NvmeCmd->Cdw0.Cid = Nvme->Cid[NVME_IO_QUEUE]++; - CommandPacket.NvmeCmd->Nsid = Nvme->Nsid; - CommandPacket.TransferBuffer = Buffer; - - CommandPacket.TransferLength = Bytes; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_IO_QUEUE; - - CommandPacket.NvmeCmd->Cdw10 = (UINT32)Lba; - CommandPacket.NvmeCmd->Cdw11 = (UINT32)(RShiftU64 (Lba, 32)); - CommandPacket.NvmeCmd->Cdw12 = (Blocks - 1) & 0xFFFF; - - CommandPacket.MetadataBuffer = (UINT64)(UINTN)NULL; - CommandPacket.MetadataLength = 0; - - CommandPacket.NvmeCmd->Flags = CDW10_VALID | CDW11_VALID | CDW12_VALID; - - Status = NvmePassThru ( - Nvme, - Nvme->Nsid, - 0, - &CommandPacket - ); - - return Status; -} - -/** - Flushes all modified Data to the device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_SUCCESS - Datum are written into the Buffer. - @retval Others - Fail to write all the datum. - -**/ -EFI_STATUS -NvmeFlush ( - IN NVME_CONTEXT *Nvme - ) -{ - NVM_EXPRESS_PASS_THRU_COMMAND_PACKET CommandPacket; - NVM_EXPRESS_COMMAND Command; - NVM_EXPRESS_RESPONSE Response; - EFI_STATUS Status; - - ZeroMem (&CommandPacket, sizeof(NVM_EXPRESS_PASS_THRU_COMMAND_PACKET)); - ZeroMem (&Command, sizeof(NVM_EXPRESS_COMMAND)); - ZeroMem (&Response, sizeof(NVM_EXPRESS_RESPONSE)); - - CommandPacket.NvmeCmd = &Command; - CommandPacket.NvmeResponse = &Response; - - CommandPacket.NvmeCmd->Cdw0.Opcode = NVME_IO_FLUSH_OPC; - CommandPacket.NvmeCmd->Cdw0.Cid = Nvme->Cid[NVME_IO_QUEUE]++; - CommandPacket.NvmeCmd->Nsid = Nvme->Nsid; - CommandPacket.CommandTimeout = NVME_GENERIC_TIMEOUT; - CommandPacket.QueueId = NVME_IO_QUEUE; - - Status = NvmePassThru ( - Nvme, - Nvme->Nsid, - 0, - &CommandPacket - ); - if (!EFI_ERROR (Status)) { - Status = NvmeWaitAllComplete (Nvme, CommandPacket.QueueId); - } - - return Status; -} - -/** - Read some blocks from the device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[out] Buffer - The Buffer used to store the Data read from the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be read. - - @retval EFI_SUCCESS - Datum are read from the device. - @retval Others - Fail to read all the datum. - -**/ -EFI_STATUS -NvmeRead ( - IN NVME_CONTEXT *Nvme, - OUT UINT64 Buffer, - IN UINT64 Lba, - IN UINTN Blocks - ) -{ - EFI_STATUS Status; - UINT32 BlockSize; - UINT32 MaxTransferBlocks; - - ASSERT (Blocks <= NVME_MAX_SECTORS); - Status = EFI_SUCCESS; - BlockSize = Nvme->BlockSize; - if (Nvme->ControllerData->Mdts != 0) { - MaxTransferBlocks = (1 << (Nvme->ControllerData->Mdts)) * (1 << (Nvme->Cap.Mpsmin + 12)) / BlockSize; - } else { - MaxTransferBlocks = 1024; - } - - while (Blocks > 0) { - if (Blocks > MaxTransferBlocks) { - Status = NvmeReadSectors (Nvme, Buffer, Lba, MaxTransferBlocks); - - Blocks -= MaxTransferBlocks; - Buffer += (MaxTransferBlocks * BlockSize); - Lba += MaxTransferBlocks; - } else { - Status = NvmeReadSectors (Nvme, Buffer, Lba, (UINT32) Blocks); - Blocks = 0; - } - - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeRead fail, Status = %r\n", Status)); - break; - } - } - - return Status; -} - -/** - Write some blocks to the device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Buffer - The Buffer to be written into the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be written. - - @retval EFI_SUCCESS - Datum are written into the Buffer. - @retval Others - Fail to write all the datum. - -**/ -EFI_STATUS -NvmeWrite ( - IN NVME_CONTEXT *Nvme, - IN UINT64 Buffer, - IN UINT64 Lba, - IN UINTN Blocks - ) -{ - EFI_STATUS Status; - UINT32 BlockSize; - UINT32 MaxTransferBlocks; - - ASSERT (Blocks <= NVME_MAX_SECTORS); - Status = EFI_SUCCESS; - BlockSize = Nvme->BlockSize; - - if (Nvme->ControllerData->Mdts != 0) { - MaxTransferBlocks = (1 << (Nvme->ControllerData->Mdts)) * (1 << (Nvme->Cap.Mpsmin + 12)) / BlockSize; - } else { - MaxTransferBlocks = 1024; - } - - while (Blocks > 0) { - if (Blocks > MaxTransferBlocks) { - Status = NvmeWriteSectors (Nvme, Buffer, Lba, MaxTransferBlocks); - - Blocks -= MaxTransferBlocks; - Buffer += (MaxTransferBlocks * BlockSize); - Lba += MaxTransferBlocks; - } else { - Status = NvmeWriteSectors (Nvme, Buffer, Lba, (UINT32) Blocks); - Blocks = 0; - } - - if (EFI_ERROR(Status)) { - DEBUG ((DEBUG_ERROR, "NvmeWrite fail, Status = %r\n", Status)); - break; - } - } - - return Status; -} diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h deleted file mode 100644 index bfa4f10413..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h +++ /dev/null @@ -1,456 +0,0 @@ -/** @file - Header file for NVMe function definitions - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef __OPAL_PASSWORD_NVME_MODE_H__ -#define __OPAL_PASSWORD_NVME_MODE_H__ - - -#include "OpalNvmeReg.h" - -#define NVME_MAX_SECTORS 0x10000 -// -// QueueId -// -#define NVME_ADMIN_QUEUE 0x00 -#define NVME_IO_QUEUE 0x01 - -typedef struct { - UINT8 Opcode; - UINT8 FusedOperation; - #define NORMAL_CMD 0x00 - #define FUSED_FIRST_CMD 0x01 - #define FUSED_SECOND_CMD 0x02 - UINT16 Cid; -} NVME_CDW0; - -typedef struct { - NVME_CDW0 Cdw0; - UINT8 Flags; - #define CDW10_VALID 0x01 - #define CDW11_VALID 0x02 - #define CDW12_VALID 0x04 - #define CDW13_VALID 0x08 - #define CDW14_VALID 0x10 - #define CDW15_VALID 0x20 - UINT32 Nsid; - UINT32 Cdw10; - UINT32 Cdw11; - UINT32 Cdw12; - UINT32 Cdw13; - UINT32 Cdw14; - UINT32 Cdw15; -} NVM_EXPRESS_COMMAND; - -typedef struct { - UINT32 Cdw0; - UINT32 Cdw1; - UINT32 Cdw2; - UINT32 Cdw3; -} NVM_EXPRESS_RESPONSE; - -typedef struct { - UINT64 CommandTimeout; - UINT64 TransferBuffer; - UINT32 TransferLength; - UINT64 MetadataBuffer; - UINT32 MetadataLength; - UINT8 QueueId; - NVM_EXPRESS_COMMAND *NvmeCmd; - NVM_EXPRESS_RESPONSE *NvmeResponse; -} NVM_EXPRESS_PASS_THRU_COMMAND_PACKET; - - -#pragma pack(1) - -// Internal fields -typedef enum { - NvmeStatusUnknown, - NvmeStatusInit, - NvmeStatusInuse, - NvmeStatusMax, -} NVME_STATUS; - -typedef struct { - UINT32 Nbar; - UINT32 BaseMem; - BOOLEAN PollCancellation; - UINT16 NvmeInitWaitTime; - - NVME_STATUS State; - UINT8 BusID; - UINT8 DeviceID; - UINT8 FuncID; - UINTN PciBase; - - UINT32 Nsid; - UINT64 Nsuuid; - UINT32 BlockSize; - EFI_LBA LastBlock; - - // - // Pointers to 4kB aligned submission & completion queues. - // - NVME_SQ *SqBuffer[NVME_MAX_IO_QUEUES]; - NVME_CQ *CqBuffer[NVME_MAX_IO_QUEUES]; - UINT16 Cid[NVME_MAX_IO_QUEUES]; - - // - // Submission and completion queue indices. - // - NVME_SQTDBL SqTdbl[NVME_MAX_IO_QUEUES]; - NVME_CQHDBL CqHdbl[NVME_MAX_IO_QUEUES]; - UINT8 Pt[NVME_MAX_IO_QUEUES]; - - UINTN SqeCount[NVME_MAX_IO_QUEUES]; - - // - // Nvme controller capabilities - // - NVME_CAP Cap; - - // - // pointer to identify controller Data - // - NVME_ADMIN_CONTROLLER_DATA *ControllerData; - NVME_ADMIN_NAMESPACE_DATA *NamespaceData; -} NVME_CONTEXT; - -#pragma pack() - -/** - Transfer MMIO Data to memory. - - @param[in,out] MemBuffer - Destination: Memory address - @param[in] MmioAddr - Source: MMIO address - @param[in] Size - Size for read - - @retval EFI_SUCCESS - MMIO read sucessfully -**/ -EFI_STATUS -NvmeMmioRead ( - IN OUT VOID *MemBuffer, - IN UINTN MmioAddr, - IN UINTN Size - ); - -/** - Transfer memory Data to MMIO. - - @param[in,out] MmioAddr - Destination: MMIO address - @param[in] MemBuffer - Source: Memory address - @param[in] Size - Size for write - - @retval EFI_SUCCESS - MMIO write sucessfully -**/ -EFI_STATUS -NvmeMmioWrite ( - IN OUT UINTN MmioAddr, - IN VOID *MemBuffer, - IN UINTN Size - ); - -/** - Transfer memory data to MMIO. - - @param[in,out] MmioAddr - Destination: MMIO address - @param[in] MemBuffer - Source: Memory address - @param[in] Size - Size for write - - @retval EFI_SUCCESS - MMIO write sucessfully -**/ -EFI_STATUS -OpalPciWrite ( - IN OUT UINTN MmioAddr, - IN VOID *MemBuffer, - IN UINTN Size - ); - -/** - Transfer MMIO data to memory. - - @param[in,out] MemBuffer - Destination: Memory address - @param[in] MmioAddr - Source: MMIO address - @param[in] Size - Size for read - - @retval EFI_SUCCESS - MMIO read sucessfully -**/ -EFI_STATUS -OpalPciRead ( - IN OUT VOID *MemBuffer, - IN UINTN MmioAddr, - IN UINTN Size - ); - -/** - Allocate transfer-related Data struct which is used at Nvme. - - @param[in] ImageHandle Image handle for this driver image - @param[in] Nvme The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_OUT_OF_RESOURCE The allocation is failure. - @retval EFI_SUCCESS Successful to allocate memory. - -**/ -EFI_STATUS -EFIAPI -NvmeAllocateResource ( - IN EFI_HANDLE ImageHandle, - IN NVME_CONTEXT *Nvme - ); - -/** - Free allocated transfer-related Data struct which is used at NVMe. - - @param[in] Nvme The pointer to the NVME_CONTEXT Data structure. - -**/ -VOID -EFIAPI -NvmeFreeResource ( - IN NVME_CONTEXT *Nvme - ); - -/** - Sends an NVM Express Command Packet to an NVM Express controller or namespace. This function supports - both blocking I/O and nonblocking I/O. The blocking I/O functionality is required, and the nonblocking - I/O functionality is optional. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] NamespaceId - Is a 32 bit Namespace ID to which the Express HCI command packet will be sent. - A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace - ID specifies that the command packet should be sent to all valid namespaces. - @param[in] NamespaceUuid - Is a 64 bit Namespace UUID to which the Express HCI command packet will be sent. - A Value of 0 denotes the NVM Express controller, a Value of all 0FFh in the namespace - UUID specifies that the command packet should be sent to all valid namespaces. - @param[in,out] Packet - A pointer to the NVM Express HCI Command Packet to send to the NVMe namespace specified - by NamespaceId. - - @retval EFI_SUCCESS - The NVM Express Command Packet was sent by the host. TransferLength bytes were transferred - to, or from DataBuffer. - @retval EFI_NOT_READY - The NVM Express Command Packet could not be sent because the controller is not ready. The caller - may retry again later. - @retval EFI_DEVICE_ERROR - A device error occurred while attempting to send the NVM Express Command Packet. - @retval EFI_INVALID_PARAMETER - Namespace, or the contents of NVM_EXPRESS_PASS_THRU_COMMAND_PACKET are invalid. The NVM - Express Command Packet was not sent, so no additional status information is available. - @retval EFI_UNSUPPORTED - The command described by the NVM Express Command Packet is not supported by the host adapter. - The NVM Express Command Packet was not sent, so no additional status information is available. - @retval EFI_TIMEOUT - A timeout occurred while waiting for the NVM Express Command Packet to execute. - -**/ -EFI_STATUS -NvmePassThru ( - IN NVME_CONTEXT *Nvme, - IN UINT32 NamespaceId, - IN UINT64 NamespaceUuid, - IN OUT NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet - ); - -/** - Waits until all NVME commands completed. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Qid - Queue index - - @retval EFI_SUCCESS - All NVME commands have completed - @retval EFI_TIMEOUT - Timeout occured - @retval EFI_NOT_READY - Not all NVME commands have completed - @retval others - Error occurred on device side. -**/ -EFI_STATUS -NvmeWaitAllComplete ( - IN NVME_CONTEXT *Nvme, - IN UINT8 Qid - ); - -/** - Initialize the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_SUCCESS - The NVM Express Controller is initialized successfully. - @retval Others - A device error occurred while initializing the controller. - -**/ -EFI_STATUS -NvmeControllerInit ( - IN NVME_CONTEXT *Nvme - ); - -/** - Un-initialize the Nvm Express controller. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_SUCCESS - The NVM Express Controller is un-initialized successfully. - @retval Others - A device error occurred while un-initializing the controller. - -**/ -EFI_STATUS -NvmeControllerExit ( - IN NVME_CONTEXT *Nvme - ); - -/** - Check whether there are available command slots. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Qid - Queue index - - @retval EFI_SUCCESS - Available command slot is found - @retval EFI_NOT_READY - No available command slot is found - @retval EFI_DEVICE_ERROR - Error occurred on device side. - -**/ -EFI_STATUS -NvmeHasFreeCmdSlot ( - IN NVME_CONTEXT *Nvme, - IN UINT8 Qid - ); - -/** - Check whether all command slots are clean. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Qid - Queue index - - @retval EFI_SUCCESS - All command slots are clean - @retval EFI_NOT_READY - Not all command slots are clean - @retval EFI_DEVICE_ERROR - Error occurred on device side. - -**/ -EFI_STATUS -NvmeIsAllCmdSlotClean ( - IN NVME_CONTEXT *Nvme, - IN UINT8 Qid - ); - -/** - Read sector Data from the NVMe device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in,out] Buffer - The Buffer used to store the Data read from the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be read. - - @retval EFI_SUCCESS - Datum are read from the device. - @retval Others - Fail to read all the datum. - -**/ -EFI_STATUS -NvmeReadSectors ( - IN NVME_CONTEXT *Nvme, - IN OUT UINT64 Buffer, - IN UINT64 Lba, - IN UINT32 Blocks - ); - -/** - Write sector Data to the NVMe device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Buffer - The Buffer to be written into the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be written. - - @retval EFI_SUCCESS - Datum are written into the Buffer. - @retval Others - Fail to write all the datum. - -**/ -EFI_STATUS -NvmeWriteSectors ( - IN NVME_CONTEXT *Nvme, - IN UINT64 Buffer, - IN UINT64 Lba, - IN UINT32 Blocks - ); - -/** - Flushes all modified Data to the device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - - @retval EFI_SUCCESS - Datum are written into the Buffer. - @retval Others - Fail to write all the datum. - -**/ -EFI_STATUS -NvmeFlush ( - IN NVME_CONTEXT *Nvme - ); - -/** - Read some blocks from the device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[out] Buffer - The Buffer used to store the Data read from the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be read. - - @retval EFI_SUCCESS - Datum are read from the device. - @retval Others - Fail to read all the datum. - -**/ -EFI_STATUS -NvmeRead ( - IN NVME_CONTEXT *Nvme, - OUT UINT64 Buffer, - IN UINT64 Lba, - IN UINTN Blocks - ); - -/** - Write some blocks to the device. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] Buffer - The Buffer to be written into the device. - @param[in] Lba - The start block number. - @param[in] Blocks - Total block number to be written. - - @retval EFI_SUCCESS - Datum are written into the Buffer. - @retval Others - Fail to write all the datum. - -**/ -EFI_STATUS -NvmeWrite ( - IN NVME_CONTEXT *Nvme, - IN UINT64 Buffer, - IN UINT64 Lba, - IN UINTN Blocks - ); - -/** - Security send and receive commands. - - @param[in] Nvme - The pointer to the NVME_CONTEXT Data structure. - @param[in] SendCommand - The flag to indicate the command type, TRUE for Send command and FALSE for receive command - @param[in] SecurityProtocol - Security Protocol - @param[in] SpSpecific - Security Protocol Specific - @param[in] TransferLength - Transfer Length of Buffer (in bytes) - always a multiple of 512 - @param[in,out] TransferBuffer - Address of Data to transfer - - @return EFI_SUCCESS - Successfully create io submission queue. - @return others - Fail to send/receive commands. - -**/ -EFI_STATUS -NvmeSecuritySendReceive ( - IN NVME_CONTEXT *Nvme, - IN BOOLEAN SendCommand, - IN UINT8 SecurityProtocol, - IN UINT16 SpSpecific, - IN UINTN TransferLength, - IN OUT VOID *TransferBuffer - ); - -#endif diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h deleted file mode 100644 index b5460cd42e..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h +++ /dev/null @@ -1,814 +0,0 @@ -/** @file - Header file for Registers and Structure definitions - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ -#ifndef __OPAL_PASSWORD_NVME_REG_H__ -#define __OPAL_PASSWORD_NVME_REG_H__ - -// -// PCI Header for PCIe root port configuration -// -#define NVME_PCIE_PCICMD 0x04 -#define NVME_PCIE_BNUM 0x18 -#define NVME_PCIE_SEC_BNUM 0x19 -#define NVME_PCIE_IOBL 0x1C -#define NVME_PCIE_MBL 0x20 -#define NVME_PCIE_PMBL 0x24 -#define NVME_PCIE_PMBU32 0x28 -#define NVME_PCIE_PMLU32 0x2C -#define NVME_PCIE_INTR 0x3C - -// -// NVMe related definitions -// -#define PCI_CLASS_MASS_STORAGE_NVM 0x08 // mass storage sub-class non-volatile memory. -#define PCI_IF_NVMHCI 0x02 // mass storage programming interface NVMHCI. - -#define NVME_ASQ_SIZE 1 // Number of admin submission queue entries, which is 0-based -#define NVME_ACQ_SIZE 1 // Number of admin completion queue entries, which is 0-based - -#define NVME_CSQ_SIZE 63 // Number of I/O submission queue entries, which is 0-based -#define NVME_CCQ_SIZE 63 // Number of I/O completion queue entries, which is 0-based - -#define NVME_MAX_IO_QUEUES 2 // Number of I/O queues supported by the driver, 1 for AQ, 1 for CQ - -#define NVME_CSQ_DEPTH (NVME_CSQ_SIZE+1) -#define NVME_CCQ_DEPTH (NVME_CCQ_SIZE+1) -#define NVME_PRP_SIZE (4) // Pages of PRP list - -#define NVME_CONTROLLER_ID 0 - -// -// Time out Value for Nvme transaction execution -// -#define NVME_GENERIC_TIMEOUT 5000000 ///< us -#define NVME_CMD_WAIT 100 ///< us -#define NVME_CMD_TIMEOUT 20000000 ///< us - - - -#define NVME_MEM_MAX_SIZE \ - (( \ - 1 /* Controller Data */ + \ - 1 /* Identify Data */ + \ - 1 /* ASQ */ + \ - 1 /* ACQ */ + \ - 1 /* SQs */ + \ - 1 /* CQs */ + \ - NVME_PRP_SIZE * NVME_CSQ_DEPTH /* PRPs */ \ - ) * EFI_PAGE_SIZE) - - -// -// controller register offsets -// -#define NVME_CAP_OFFSET 0x0000 // Controller Capabilities -#define NVME_VER_OFFSET 0x0008 // Version -#define NVME_INTMS_OFFSET 0x000c // Interrupt Mask Set -#define NVME_INTMC_OFFSET 0x0010 // Interrupt Mask Clear -#define NVME_CC_OFFSET 0x0014 // Controller Configuration -#define NVME_CSTS_OFFSET 0x001c // Controller Status -#define NVME_AQA_OFFSET 0x0024 // Admin Queue Attributes -#define NVME_ASQ_OFFSET 0x0028 // Admin Submission Queue Base Address -#define NVME_ACQ_OFFSET 0x0030 // Admin Completion Queue Base Address -#define NVME_SQ0_OFFSET 0x1000 // Submission Queue 0 (admin) Tail Doorbell -#define NVME_CQ0_OFFSET 0x1004 // Completion Queue 0 (admin) Head Doorbell - -// -// These register offsets are defined as 0x1000 + (N * (4 << CAP.DSTRD)) -// Get the doorbell stride bit shift Value from the controller capabilities. -// -#define NVME_SQTDBL_OFFSET(QID, DSTRD) 0x1000 + ((2 * (QID)) * (4 << (DSTRD))) // Submission Queue y (NVM) Tail Doorbell -#define NVME_CQHDBL_OFFSET(QID, DSTRD) 0x1000 + (((2 * (QID)) + 1) * (4 << (DSTRD))) // Completion Queue y (NVM) Head Doorbell - - -#pragma pack(1) - -// -// 3.1.1 Offset 00h: CAP - Controller Capabilities -// -typedef struct { - UINT16 Mqes; // Maximum Queue Entries Supported - UINT8 Cqr:1; // Contiguous Queues Required - UINT8 Ams:2; // Arbitration Mechanism Supported - UINT8 Rsvd1:5; - UINT8 To; // Timeout - UINT16 Dstrd:4; - UINT16 Rsvd2:1; - UINT16 Css:4; // Command Sets Supported - UINT16 Rsvd3:7; - UINT8 Mpsmin:4; - UINT8 Mpsmax:4; - UINT8 Rsvd4; -} NVME_CAP; - -// -// 3.1.2 Offset 08h: VS - Version -// -typedef struct { - UINT16 Mnr; // Minor version number - UINT16 Mjr; // Major version number -} NVME_VER; - -// -// 3.1.5 Offset 14h: CC - Controller Configuration -// -typedef struct { - UINT16 En:1; // Enable - UINT16 Rsvd1:3; - UINT16 Css:3; // Command Set Selected - UINT16 Mps:4; // Memory Page Size - UINT16 Ams:3; // Arbitration Mechanism Selected - UINT16 Shn:2; // Shutdown Notification - UINT8 Iosqes:4; // I/O Submission Queue Entry Size - UINT8 Iocqes:4; // I/O Completion Queue Entry Size - UINT8 Rsvd2; -} NVME_CC; - -// -// 3.1.6 Offset 1Ch: CSTS - Controller Status -// -typedef struct { - UINT32 Rdy:1; // Ready - UINT32 Cfs:1; // Controller Fatal Status - UINT32 Shst:2; // Shutdown Status - UINT32 Nssro:1; // NVM Subsystem Reset Occurred - UINT32 Rsvd1:27; -} NVME_CSTS; - -// -// 3.1.8 Offset 24h: AQA - Admin Queue Attributes -// -typedef struct { - UINT16 Asqs:12; // Submission Queue Size - UINT16 Rsvd1:4; - UINT16 Acqs:12; // Completion Queue Size - UINT16 Rsvd2:4; -} NVME_AQA; - -// -// 3.1.9 Offset 28h: ASQ - Admin Submission Queue Base Address -// -#define NVME_ASQ UINT64 - -// -// 3.1.10 Offset 30h: ACQ - Admin Completion Queue Base Address -// -#define NVME_ACQ UINT64 - -// -// 3.1.11 Offset (1000h + ((2y) * (4 << CAP.DSTRD))): SQyTDBL - Submission Queue y Tail Doorbell -// -typedef struct { - UINT16 Sqt; - UINT16 Rsvd1; -} NVME_SQTDBL; - -// -// 3.1.12 Offset (1000h + ((2y + 1) * (4 << CAP.DSTRD))): CQyHDBL - Completion Queue y Head Doorbell -// -typedef struct { - UINT16 Cqh; - UINT16 Rsvd1; -} NVME_CQHDBL; - -// -// NVM command set structures -// -// Read Command -// -typedef struct { - // - // CDW 10, 11 - // - UINT64 Slba; /* Starting Sector Address */ - // - // CDW 12 - // - UINT16 Nlb; /* Number of Sectors */ - UINT16 Rsvd1:10; - UINT16 Prinfo:4; /* Protection Info Check */ - UINT16 Fua:1; /* Force Unit Access */ - UINT16 Lr:1; /* Limited Retry */ - // - // CDW 13 - // - UINT32 Af:4; /* Access Frequency */ - UINT32 Al:2; /* Access Latency */ - UINT32 Sr:1; /* Sequential Request */ - UINT32 In:1; /* Incompressible */ - UINT32 Rsvd2:24; - // - // CDW 14 - // - UINT32 Eilbrt; /* Expected Initial Logical Block Reference Tag */ - // - // CDW 15 - // - UINT16 Elbat; /* Expected Logical Block Application Tag */ - UINT16 Elbatm; /* Expected Logical Block Application Tag Mask */ -} NVME_READ; - -// -// Write Command -// -typedef struct { - // - // CDW 10, 11 - // - UINT64 Slba; /* Starting Sector Address */ - // - // CDW 12 - // - UINT16 Nlb; /* Number of Sectors */ - UINT16 Rsvd1:10; - UINT16 Prinfo:4; /* Protection Info Check */ - UINT16 Fua:1; /* Force Unit Access */ - UINT16 Lr:1; /* Limited Retry */ - // - // CDW 13 - // - UINT32 Af:4; /* Access Frequency */ - UINT32 Al:2; /* Access Latency */ - UINT32 Sr:1; /* Sequential Request */ - UINT32 In:1; /* Incompressible */ - UINT32 Rsvd2:24; - // - // CDW 14 - // - UINT32 Ilbrt; /* Initial Logical Block Reference Tag */ - // - // CDW 15 - // - UINT16 Lbat; /* Logical Block Application Tag */ - UINT16 Lbatm; /* Logical Block Application Tag Mask */ -} NVME_WRITE; - -// -// Flush -// -typedef struct { - // - // CDW 10 - // - UINT32 Flush; /* Flush */ -} NVME_FLUSH; - -// -// Write Uncorrectable command -// -typedef struct { - // - // CDW 10, 11 - // - UINT64 Slba; /* Starting LBA */ - // - // CDW 12 - // - UINT32 Nlb:16; /* Number of Logical Blocks */ - UINT32 Rsvd1:16; -} NVME_WRITE_UNCORRECTABLE; - -// -// Write Zeroes command -// -typedef struct { - // - // CDW 10, 11 - // - UINT64 Slba; /* Starting LBA */ - // - // CDW 12 - // - UINT16 Nlb; /* Number of Logical Blocks */ - UINT16 Rsvd1:10; - UINT16 Prinfo:4; /* Protection Info Check */ - UINT16 Fua:1; /* Force Unit Access */ - UINT16 Lr:1; /* Limited Retry */ - // - // CDW 13 - // - UINT32 Rsvd2; - // - // CDW 14 - // - UINT32 Ilbrt; /* Initial Logical Block Reference Tag */ - // - // CDW 15 - // - UINT16 Lbat; /* Logical Block Application Tag */ - UINT16 Lbatm; /* Logical Block Application Tag Mask */ -} NVME_WRITE_ZEROES; - -// -// Compare command -// -typedef struct { - // - // CDW 10, 11 - // - UINT64 Slba; /* Starting LBA */ - // - // CDW 12 - // - UINT16 Nlb; /* Number of Logical Blocks */ - UINT16 Rsvd1:10; - UINT16 Prinfo:4; /* Protection Info Check */ - UINT16 Fua:1; /* Force Unit Access */ - UINT16 Lr:1; /* Limited Retry */ - // - // CDW 13 - // - UINT32 Rsvd2; - // - // CDW 14 - // - UINT32 Eilbrt; /* Expected Initial Logical Block Reference Tag */ - // - // CDW 15 - // - UINT16 Elbat; /* Expected Logical Block Application Tag */ - UINT16 Elbatm; /* Expected Logical Block Application Tag Mask */ -} NVME_COMPARE; - -typedef union { - NVME_READ Read; - NVME_WRITE Write; - NVME_FLUSH Flush; - NVME_WRITE_UNCORRECTABLE WriteUncorrectable; - NVME_WRITE_ZEROES WriteZeros; - NVME_COMPARE Compare; -} NVME_CMD; - -typedef struct { - UINT16 Mp; /* Maximum Power */ - UINT8 Rsvd1; /* Reserved as of Nvm Express 1.1 Spec */ - UINT8 Mps:1; /* Max Power Scale */ - UINT8 Nops:1; /* Non-Operational State */ - UINT8 Rsvd2:6; /* Reserved as of Nvm Express 1.1 Spec */ - UINT32 Enlat; /* Entry Latency */ - UINT32 Exlat; /* Exit Latency */ - UINT8 Rrt:5; /* Relative Read Throughput */ - UINT8 Rsvd3:3; /* Reserved as of Nvm Express 1.1 Spec */ - UINT8 Rrl:5; /* Relative Read Leatency */ - UINT8 Rsvd4:3; /* Reserved as of Nvm Express 1.1 Spec */ - UINT8 Rwt:5; /* Relative Write Throughput */ - UINT8 Rsvd5:3; /* Reserved as of Nvm Express 1.1 Spec */ - UINT8 Rwl:5; /* Relative Write Leatency */ - UINT8 Rsvd6:3; /* Reserved as of Nvm Express 1.1 Spec */ - UINT8 Rsvd7[16]; /* Reserved as of Nvm Express 1.1 Spec */ -} NVME_PSDESCRIPTOR; - -// -// Identify Controller Data -// -typedef struct { - // - // Controller Capabilities and Features 0-255 - // - UINT16 Vid; /* PCI Vendor ID */ - UINT16 Ssvid; /* PCI sub-system vendor ID */ - UINT8 Sn[20]; /* Produce serial number */ - - UINT8 Mn[40]; /* Proeduct model number */ - UINT8 Fr[8]; /* Firmware Revision */ - UINT8 Rab; /* Recommended Arbitration Burst */ - UINT8 Ieee_oiu[3]; /* Organization Unique Identifier */ - UINT8 Cmic; /* Multi-interface Capabilities */ - UINT8 Mdts; /* Maximum Data Transfer Size */ - UINT8 Cntlid[2]; /* Controller ID */ - UINT8 Rsvd1[176]; /* Reserved as of Nvm Express 1.1 Spec */ - // - // Admin Command Set Attributes - // - UINT16 Oacs; /* Optional Admin Command Support */ - UINT8 Acl; /* Abort Command Limit */ - UINT8 Aerl; /* Async Event Request Limit */ - UINT8 Frmw; /* Firmware updates */ - UINT8 Lpa; /* Log Page Attributes */ - UINT8 Elpe; /* Error Log Page Entries */ - UINT8 Npss; /* Number of Power States Support */ - UINT8 Avscc; /* Admin Vendor Specific Command Configuration */ - UINT8 Apsta; /* Autonomous Power State Transition Attributes */ - UINT8 Rsvd2[246]; /* Reserved as of Nvm Express 1.1 Spec */ - // - // NVM Command Set Attributes - // - UINT8 Sqes; /* Submission Queue Entry Size */ - UINT8 Cqes; /* Completion Queue Entry Size */ - UINT16 Rsvd3; /* Reserved as of Nvm Express 1.1 Spec */ - UINT32 Nn; /* Number of Namespaces */ - UINT16 Oncs; /* Optional NVM Command Support */ - UINT16 Fuses; /* Fused Operation Support */ - UINT8 Fna; /* Format NVM Attributes */ - UINT8 Vwc; /* Volatile Write Cache */ - UINT16 Awun; /* Atomic Write Unit Normal */ - UINT16 Awupf; /* Atomic Write Unit Power Fail */ - UINT8 Nvscc; /* NVM Vendor Specific Command Configuration */ - UINT8 Rsvd4; /* Reserved as of Nvm Express 1.1 Spec */ - UINT16 Acwu; /* Atomic Compare & Write Unit */ - UINT16 Rsvd5; /* Reserved as of Nvm Express 1.1 Spec */ - UINT32 Sgls; /* SGL Support */ - UINT8 Rsvd6[164]; /* Reserved as of Nvm Express 1.1 Spec */ - // - // I/O Command set Attributes - // - UINT8 Rsvd7[1344]; /* Reserved as of Nvm Express 1.1 Spec */ - // - // Power State Descriptors - // - NVME_PSDESCRIPTOR PsDescriptor[32]; - - UINT8 VendorData[1024]; /* Vendor specific Data */ -} NVME_ADMIN_CONTROLLER_DATA; - -typedef struct { - UINT16 Security : 1; /* supports security send/receive commands */ - UINT16 Format : 1; /* supports format nvm command */ - UINT16 Firmware : 1; /* supports firmware activate/download commands */ - UINT16 Oacs_rsvd : 13; - } OACS; // optional admin command support: NVME_ADMIN_CONTROLLER_DATA.Oacs - -typedef struct { - UINT16 Ms; /* Metadata Size */ - UINT8 Lbads; /* LBA Data Size */ - UINT8 Rp:2; /* Relative Performance */ - #define LBAF_RP_BEST 00b - #define LBAF_RP_BETTER 01b - #define LBAF_RP_GOOD 10b - #define LBAF_RP_DEGRADED 11b - UINT8 Rsvd1:6; /* Reserved as of Nvm Express 1.1 Spec */ -} NVME_LBAFORMAT; - -// -// Identify Namespace Data -// -typedef struct { - // - // NVM Command Set Specific - // - UINT64 Nsze; /* Namespace Size (total number of blocks in formatted namespace) */ - UINT64 Ncap; /* Namespace Capacity (max number of logical blocks) */ - UINT64 Nuse; /* Namespace Utilization */ - UINT8 Nsfeat; /* Namespace Features */ - UINT8 Nlbaf; /* Number of LBA Formats */ - UINT8 Flbas; /* Formatted LBA Size */ - UINT8 Mc; /* Metadata Capabilities */ - UINT8 Dpc; /* End-to-end Data Protection capabilities */ - UINT8 Dps; /* End-to-end Data Protection Type Settings */ - UINT8 Nmic; /* Namespace Multi-path I/O and Namespace Sharing Capabilities */ - UINT8 Rescap; /* Reservation Capabilities */ - UINT8 Rsvd1[88]; /* Reserved as of Nvm Express 1.1 Spec */ - UINT64 Eui64; /* IEEE Extended Unique Identifier */ - // - // LBA Format - // - NVME_LBAFORMAT LbaFormat[16]; - - UINT8 Rsvd2[192]; /* Reserved as of Nvm Express 1.1 Spec */ - UINT8 VendorData[3712]; /* Vendor specific Data */ -} NVME_ADMIN_NAMESPACE_DATA; - -// -// NvmExpress Admin Identify Cmd -// -typedef struct { - // - // CDW 10 - // - UINT32 Cns:2; - UINT32 Rsvd1:30; -} NVME_ADMIN_IDENTIFY; - -// -// NvmExpress Admin Create I/O Completion Queue -// -typedef struct { - // - // CDW 10 - // - UINT32 Qid:16; /* Queue Identifier */ - UINT32 Qsize:16; /* Queue Size */ - - // - // CDW 11 - // - UINT32 Pc:1; /* Physically Contiguous */ - UINT32 Ien:1; /* Interrupts Enabled */ - UINT32 Rsvd1:14; /* reserved as of Nvm Express 1.1 Spec */ - UINT32 Iv:16; /* Interrupt Vector */ -} NVME_ADMIN_CRIOCQ; - -// -// NvmExpress Admin Create I/O Submission Queue -// -typedef struct { - // - // CDW 10 - // - UINT32 Qid:16; /* Queue Identifier */ - UINT32 Qsize:16; /* Queue Size */ - - // - // CDW 11 - // - UINT32 Pc:1; /* Physically Contiguous */ - UINT32 Qprio:2; /* Queue Priority */ - UINT32 Rsvd1:13; /* Reserved as of Nvm Express 1.1 Spec */ - UINT32 Cqid:16; /* Completion Queue ID */ -} NVME_ADMIN_CRIOSQ; - -// -// NvmExpress Admin Delete I/O Completion Queue -// -typedef struct { - // - // CDW 10 - // - UINT16 Qid; - UINT16 Rsvd1; -} NVME_ADMIN_DEIOCQ; - -// -// NvmExpress Admin Delete I/O Submission Queue -// -typedef struct { - // - // CDW 10 - // - UINT16 Qid; - UINT16 Rsvd1; -} NVME_ADMIN_DEIOSQ; - -// -// NvmExpress Admin Security Send -// -typedef struct { - // - // CDW 10 - // - UINT32 Resv:8; /* Reserve */ - UINT32 Spsp:16; /* SP Specific */ - UINT32 Secp:8; /* Security Protocol */ - - // - // CDW 11 - // - UINT32 Tl; /* Transfer Length */ -} NVME_ADMIN_SECSEND; - -// -// NvmExpress Admin Abort Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Sqid:16; /* Submission Queue identifier */ - UINT32 Cid:16; /* Command Identifier */ -} NVME_ADMIN_ABORT; - -// -// NvmExpress Admin Firmware Activate Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Fs:3; /* Submission Queue identifier */ - UINT32 Aa:2; /* Command Identifier */ - UINT32 Rsvd1:27; -} NVME_ADMIN_FIRMWARE_ACTIVATE; - -// -// NvmExpress Admin Firmware Image Download Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Numd; /* Number of Dwords */ - // - // CDW 11 - // - UINT32 Ofst; /* Offset */ -} NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD; - -// -// NvmExpress Admin Get Features Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Fid:8; /* Feature Identifier */ - UINT32 Sel:3; /* Select */ - UINT32 Rsvd1:21; -} NVME_ADMIN_GET_FEATURES; - -// -// NvmExpress Admin Get Log Page Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Lid:8; /* Log Page Identifier */ - #define LID_ERROR_INFO - #define LID_SMART_INFO - #define LID_FW_SLOT_INFO - UINT32 Rsvd1:8; - UINT32 Numd:12; /* Number of Dwords */ - UINT32 Rsvd2:4; /* Reserved as of Nvm Express 1.1 Spec */ -} NVME_ADMIN_GET_LOG_PAGE; - -// -// NvmExpress Admin Set Features Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Fid:8; /* Feature Identifier */ - UINT32 Rsvd1:23; - UINT32 Sv:1; /* Save */ -} NVME_ADMIN_SET_FEATURES; - -// -// NvmExpress Admin Format NVM Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Lbaf:4; /* LBA Format */ - UINT32 Ms:1; /* Metadata Settings */ - UINT32 Pi:3; /* Protection Information */ - UINT32 Pil:1; /* Protection Information Location */ - UINT32 Ses:3; /* Secure Erase Settings */ - UINT32 Rsvd1:20; -} NVME_ADMIN_FORMAT_NVM; - -// -// NvmExpress Admin Security Receive Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Rsvd1:8; - UINT32 Spsp:16; /* SP Specific */ - UINT32 Secp:8; /* Security Protocol */ - // - // CDW 11 - // - UINT32 Al; /* Allocation Length */ -} NVME_ADMIN_SECURITY_RECEIVE; - -// -// NvmExpress Admin Security Send Command -// -typedef struct { - // - // CDW 10 - // - UINT32 Rsvd1:8; - UINT32 Spsp:16; /* SP Specific */ - UINT32 Secp:8; /* Security Protocol */ - // - // CDW 11 - // - UINT32 Tl; /* Transfer Length */ -} NVME_ADMIN_SECURITY_SEND; - -typedef union { - NVME_ADMIN_IDENTIFY Identify; - NVME_ADMIN_CRIOCQ CrIoCq; - NVME_ADMIN_CRIOSQ CrIoSq; - NVME_ADMIN_DEIOCQ DeIoCq; - NVME_ADMIN_DEIOSQ DeIoSq; - NVME_ADMIN_ABORT Abort; - NVME_ADMIN_FIRMWARE_ACTIVATE Activate; - NVME_ADMIN_FIRMWARE_IMAGE_DOWNLOAD FirmwareImageDownload; - NVME_ADMIN_GET_FEATURES GetFeatures; - NVME_ADMIN_GET_LOG_PAGE GetLogPage; - NVME_ADMIN_SET_FEATURES SetFeatures; - NVME_ADMIN_FORMAT_NVM FormatNvm; - NVME_ADMIN_SECURITY_RECEIVE SecurityReceive; - NVME_ADMIN_SECURITY_SEND SecuritySend; -} NVME_ADMIN_CMD; - -typedef struct { - UINT32 Cdw10; - UINT32 Cdw11; - UINT32 Cdw12; - UINT32 Cdw13; - UINT32 Cdw14; - UINT32 Cdw15; -} NVME_RAW; - -typedef union { - NVME_ADMIN_CMD Admin; // Union of Admin commands - NVME_CMD Nvm; // Union of Nvm commands - NVME_RAW Raw; -} NVME_PAYLOAD; - -// -// Submission Queue -// -typedef struct { - // - // CDW 0, Common to all comnmands - // - UINT8 Opc; // Opcode - UINT8 Fuse:2; // Fused Operation - UINT8 Rsvd1:5; - UINT8 Psdt:1; // PRP or SGL for Data Transfer - UINT16 Cid; // Command Identifier - - // - // CDW 1 - // - UINT32 Nsid; // Namespace Identifier - - // - // CDW 2,3 - // - UINT64 Rsvd2; - - // - // CDW 4,5 - // - UINT64 Mptr; // Metadata Pointer - - // - // CDW 6-9 - // - UINT64 Prp[2]; // First and second PRP entries - - NVME_PAYLOAD Payload; - -} NVME_SQ; - -// -// Completion Queue -// -typedef struct { - // - // CDW 0 - // - UINT32 Dword0; - // - // CDW 1 - // - UINT32 Rsvd1; - // - // CDW 2 - // - UINT16 Sqhd; // Submission Queue Head Pointer - UINT16 Sqid; // Submission Queue Identifier - // - // CDW 3 - // - UINT16 Cid; // Command Identifier - UINT16 Pt:1; // Phase Tag - UINT16 Sc:8; // Status Code - UINT16 Sct:3; // Status Code Type - UINT16 Rsvd2:2; - UINT16 Mo:1; // More - UINT16 Dnr:1; // Retry -} NVME_CQ; - -// -// Nvm Express Admin cmd opcodes -// -#define NVME_ADMIN_DELIOSQ_OPC 0 -#define NVME_ADMIN_CRIOSQ_OPC 1 -#define NVME_ADMIN_DELIOCQ_OPC 4 -#define NVME_ADMIN_CRIOCQ_OPC 5 -#define NVME_ADMIN_IDENTIFY_OPC 6 -#define NVME_ADMIN_SECURITY_SEND_OPC 0x81 -#define NVME_ADMIN_SECURITY_RECV_OPC 0x82 - -#define NVME_IO_FLUSH_OPC 0 -#define NVME_IO_WRITE_OPC 1 -#define NVME_IO_READ_OPC 2 - -// -// Offset from the beginning of private Data queue Buffer -// -#define NVME_ASQ_BUF_OFFSET EFI_PAGE_SIZE - -#pragma pack() - -#endif - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c deleted file mode 100644 index 0ea92b15c0..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c +++ /dev/null @@ -1,1088 +0,0 @@ -/** @file - Opal password smm driver which is used to support Opal security feature at s3 path. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#include "OpalPasswordSmm.h" - -#define SMM_SIZE_ALLOC_BYTES (512) -#define RESPONSE_SIZE (200) - -#define PCI_CLASS_MASS_STORAGE_AHCI (0x06) - -#define OPAL_PCIE_ROOTPORT_SAVESIZE (0x40) -#define STORE_INVALID_ROOTPORT_INDEX ((UINT8) -1) -#define OPAL_DEVICE_TYPE_SATA 0x1 -#define OPAL_DEVICE_TYPE_NVME 0x2 -#define OPAL_DEVICE_TYPE_UNKNOWN 0xFF - -// -// To unlock the Intel SATA controller at S3 Resume, restored the following registers. -// -const OPAL_HC_PCI_REGISTER_SAVE mSataHcRegisterSaveTemplate[] = { - {0x9, S3BootScriptWidthUint8}, - {0x10, S3BootScriptWidthUint32}, - {0x14, S3BootScriptWidthUint32}, - {0x18, S3BootScriptWidthUint32}, - {0x1C, S3BootScriptWidthUint32}, - {0x20, S3BootScriptWidthUint32}, - {0x24, S3BootScriptWidthUint32}, - {0x3c, S3BootScriptWidthUint8}, - {0x3d, S3BootScriptWidthUint8}, - {0x40, S3BootScriptWidthUint16}, - {0x42, S3BootScriptWidthUint16}, - {0x92, S3BootScriptWidthUint16}, - {0x94, S3BootScriptWidthUint32}, - {0x9C, S3BootScriptWidthUint32}, - {0x4, S3BootScriptWidthUint16}, -}; - - -UINT8 mSwSmiValue; -LIST_ENTRY *mOpalDeviceList; -LIST_ENTRY mSmmDeviceList = INITIALIZE_LIST_HEAD_VARIABLE (mSmmDeviceList); - -BOOLEAN mSendBlockSID = FALSE; - -// AHCI -UINT32 mAhciBar = 0; -EFI_AHCI_REGISTERS mAhciRegisters; -VOID *mBuffer = NULL; // DMA can not read/write Data to smram, so we pre-allocates Buffer from AcpiNVS. -// -// NVME -NVME_CONTEXT mNvmeContext; - -/** - Add new bridge node or nvme device info to the device list. - - @param[in] BusNum The bus number. - @param[in] DevNum The device number. - @param[in] FuncNum The function number. - @param[in] Dev The device which need to add device node info. - -**/ -VOID -AddPciDeviceNode ( - UINT32 BusNum, - UINT32 DevNum, - UINT32 FuncNum, - OPAL_SMM_DEVICE *Dev - ) -{ - UINT8 *DevList; - PCI_DEVICE *DeviceNode; - - DevList = AllocateZeroPool (sizeof (PCI_DEVICE) + Dev->Length); - ASSERT (DevList != NULL); - - if (Dev->Length != 0) { - CopyMem (DevList, Dev->PciBridgeNode, Dev->Length); - FreePool (Dev->PciBridgeNode); - } - - DeviceNode = (PCI_DEVICE *) (DevList + Dev->Length); - - DeviceNode->BusNum = BusNum; - DeviceNode->DevNum = DevNum; - DeviceNode->FuncNum = FuncNum; - - Dev->Length += sizeof (PCI_DEVICE); - Dev->PciBridgeNode = (PCI_DEVICE *)DevList; -} - -/** - Extract device info from the input device path. - - @param[in] DevicePath Device path info for the device. - @param[in,out] Dev The device which new inputed. - -**/ -VOID -ExtractDeviceInfoFromDevicePath ( - IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, - IN OUT OPAL_SMM_DEVICE *Dev - ) -{ - EFI_DEVICE_PATH_PROTOCOL *TmpDevPath; - EFI_DEVICE_PATH_PROTOCOL *TmpDevPath2; - PCI_DEVICE_PATH *PciDevPath; - SATA_DEVICE_PATH *SataDevPath; - NVME_NAMESPACE_DEVICE_PATH *NvmeDevPath; - UINTN BusNum; - - TmpDevPath = DevicePath; - Dev->DeviceType = OPAL_DEVICE_TYPE_UNKNOWN; - - while (!IsDevicePathEnd(TmpDevPath)) { - if (TmpDevPath->Type == MESSAGING_DEVICE_PATH && TmpDevPath->SubType == MSG_SATA_DP) { - // - // SATA - // - SataDevPath = ( SATA_DEVICE_PATH* )TmpDevPath; - Dev->SataPort = SataDevPath->HBAPortNumber; - Dev->SataPortMultiplierPort = SataDevPath->PortMultiplierPortNumber; - Dev->DeviceType = OPAL_DEVICE_TYPE_SATA; - break; - } else if (TmpDevPath->Type == MESSAGING_DEVICE_PATH && TmpDevPath->SubType == MSG_NVME_NAMESPACE_DP) { - // - // NVMe - // - NvmeDevPath = ( NVME_NAMESPACE_DEVICE_PATH* )TmpDevPath; - Dev->NvmeNamespaceId = NvmeDevPath->NamespaceId; - Dev->DeviceType = OPAL_DEVICE_TYPE_NVME; - break; - } - TmpDevPath = NextDevicePathNode (TmpDevPath); - } - - // - // Get bridge node info for the nvme device. - // - BusNum = 0; - TmpDevPath = DevicePath; - TmpDevPath2 = NextDevicePathNode (DevicePath); - while (!IsDevicePathEnd(TmpDevPath2)) { - if (TmpDevPath->Type == HARDWARE_DEVICE_PATH && TmpDevPath->SubType == HW_PCI_DP) { - PciDevPath = (PCI_DEVICE_PATH *) TmpDevPath; - if ((TmpDevPath2->Type == MESSAGING_DEVICE_PATH && TmpDevPath2->SubType == MSG_NVME_NAMESPACE_DP)|| - (TmpDevPath2->Type == MESSAGING_DEVICE_PATH && TmpDevPath2->SubType == MSG_SATA_DP)) { - Dev->BusNum = (UINT32)BusNum; - Dev->DevNum = PciDevPath->Device; - Dev->FuncNum = PciDevPath->Function; - } else { - AddPciDeviceNode((UINT32)BusNum, PciDevPath->Device, PciDevPath->Function, Dev); - if (TmpDevPath2->Type == HARDWARE_DEVICE_PATH && TmpDevPath2->SubType == HW_PCI_DP) { - BusNum = PciRead8 (PCI_LIB_ADDRESS (BusNum, PciDevPath->Device, PciDevPath->Function, NVME_PCIE_SEC_BNUM)); - } - } - } - - TmpDevPath = NextDevicePathNode (TmpDevPath); - TmpDevPath2 = NextDevicePathNode (TmpDevPath2); - } -} - -/** - - The function returns whether or not the device is Opal Locked. - TRUE means that the device is partially or fully locked. - This will perform a Level 0 Discovery and parse the locking feature descriptor - - @param[in] OpalDev Opal object to determine if locked - @param[out] BlockSidSupported Whether device support BlockSid feature. - -**/ -BOOLEAN -IsOpalDeviceLocked( - OPAL_SMM_DEVICE *OpalDev, - BOOLEAN *BlockSidSupported - ) -{ - OPAL_SESSION Session; - OPAL_DISK_SUPPORT_ATTRIBUTE SupportedAttributes; - TCG_LOCKING_FEATURE_DESCRIPTOR LockingFeature; - UINT16 OpalBaseComId; - TCG_RESULT Ret; - - Session.Sscp = &OpalDev->Sscp; - Session.MediaId = 0; - - Ret = OpalGetSupportedAttributesInfo (&Session, &SupportedAttributes, &OpalBaseComId); - if (Ret != TcgResultSuccess) { - return FALSE; - } - - OpalDev->OpalBaseComId = OpalBaseComId; - Session.OpalBaseComId = OpalBaseComId; - *BlockSidSupported = SupportedAttributes.BlockSid == 1 ? TRUE : FALSE; - - Ret = OpalGetLockingInfo(&Session, &LockingFeature); - if (Ret != TcgResultSuccess) { - return FALSE; - } - - return OpalDeviceLocked (&SupportedAttributes, &LockingFeature); -} - -/** - Save/Restore RootPort configuration space. - - @param[in] DeviceNode - The device node. - @param[in] SaveAction - TRUE: Save, FALSE: Restore - @param[in,out] PcieConfBufferList - Configuration space data buffer for save/restore - - @retval - PCIE base address of this RootPort -**/ -UINTN -SaveRestoreRootportConfSpace ( - IN OPAL_SMM_DEVICE *DeviceNode, - IN BOOLEAN SaveAction, - IN OUT UINT8 **PcieConfBufferList - ) -{ - UINTN RpBase; - UINTN Length; - PCI_DEVICE *DevNode; - UINT8 *StorePcieConfData; - UINTN Index; - - Length = 0; - Index = 0; - RpBase = 0; - - while (Length < DeviceNode->Length) { - DevNode = (PCI_DEVICE *)((UINT8*)DeviceNode->PciBridgeNode + Length); - RpBase = PCI_LIB_ADDRESS (DevNode->BusNum, DevNode->DevNum, DevNode->FuncNum, 0x0); - - if (PcieConfBufferList != NULL) { - if (SaveAction) { - StorePcieConfData = (UINT8 *) AllocateZeroPool (OPAL_PCIE_ROOTPORT_SAVESIZE); - ASSERT (StorePcieConfData != NULL); - OpalPciRead (StorePcieConfData, RpBase, OPAL_PCIE_ROOTPORT_SAVESIZE); - PcieConfBufferList[Index] = StorePcieConfData; - } else { - // Skip PCIe Command & Status registers - StorePcieConfData = PcieConfBufferList[Index]; - OpalPciWrite (RpBase, StorePcieConfData, 4); - OpalPciWrite (RpBase + 8, StorePcieConfData + 8, OPAL_PCIE_ROOTPORT_SAVESIZE - 8); - - FreePool (StorePcieConfData); - } - } - - Length += sizeof (PCI_DEVICE); - Index ++; - } - - return RpBase; -} - -/** - Configure RootPort for downstream PCIe NAND devices. - - @param[in] RpBase - PCIe configuration space address of this RootPort - @param[in] BusNumber - Bus number - @param[in] MemoryBase - Memory base address - @param[in] MemoryLength - Memory size - -**/ -VOID -ConfigureRootPortForPcieNand ( - IN UINTN RpBase, - IN UINTN BusNumber, - IN UINT32 MemoryBase, - IN UINT32 MemoryLength - ) -{ - UINT32 MemoryLimit; - - DEBUG ((DEBUG_INFO, "ConfigureRootPortForPcieNand, BusNumber: %x, MemoryBase: %x, MemoryLength: %x\n", - BusNumber, MemoryBase, MemoryLength)); - - if (MemoryLength == 0) { - MemoryLimit = MemoryBase; - } else { - MemoryLimit = MemoryBase + MemoryLength + 0xFFFFF; // 1M - } - - /// - /// Configue PCIE configuration space for RootPort - /// - PciWrite8 (RpBase + NVME_PCIE_BNUM + 1, (UINT8) BusNumber); // Secondary Bus Number registers - PciWrite8 (RpBase + NVME_PCIE_BNUM + 2, (UINT8) BusNumber); // Subordinate Bus Number registers - PciWrite8 (RpBase + NVME_PCIE_IOBL, 0xFF); // I/O Base registers - PciWrite8 (RpBase + NVME_PCIE_IOBL + 1, 0x00); // I/O Limit registers - PciWrite16 (RpBase + NVME_PCIE_MBL, (UINT16) RShiftU64 ((UINTN)MemoryBase, 16)); // Memory Base register - PciWrite16 (RpBase + NVME_PCIE_MBL + 2, (UINT16) RShiftU64 ((UINTN)MemoryLimit, 16)); // Memory Limit register - PciWrite16 (RpBase + NVME_PCIE_PMBL, 0xFFFF); // Prefetchable Memory Base registers - PciWrite16 (RpBase + NVME_PCIE_PMBL + 2, 0x0000); // Prefetchable Memory Limit registers - PciWrite32 (RpBase + NVME_PCIE_PMBU32, 0xFFFFFFFF); // Prefetchable Memory Upper Base registers - PciWrite32 (RpBase + NVME_PCIE_PMLU32, 0x00000000); // Prefetchable Memory Upper Limit registers -} - - -/** - Dispatch function for a Software SMI handler. - - @param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). - @param[in] RegisterContext Points to an optional handler context which was specified when the - handler was registered. - @param[in, out] CommBuffer A pointer to a collection of Data in memory that will - be conveyed from a non-SMM environment into an SMM environment. - @param[in, out] CommBufferSize The Size of the CommBuffer. - - @retval EFI_SUCCESS The interrupt was handled and quiesced. No other handlers - should still be called. - @retval Others Other execution results. -**/ -EFI_STATUS -EFIAPI -SmmUnlockOpalPassword ( - IN EFI_HANDLE DispatchHandle, - IN CONST VOID *RegisterContext, - IN OUT VOID *CommBuffer, - IN OUT UINTN *CommBufferSize - ) -{ - EFI_STATUS Status; - OPAL_SMM_DEVICE *OpalDev; - LIST_ENTRY *Entry; - UINT8 BaseClassCode; - UINT8 SubClassCode; - UINT8 ProgInt; - TCG_RESULT Result; - UINT8 SataCmdSt; - UINT8 *StorePcieConfDataList[16]; - UINTN RpBase; - UINTN MemoryBase; - UINTN MemoryLength; - OPAL_SESSION Session; - BOOLEAN BlockSidSupport; - - ZeroMem (StorePcieConfDataList, sizeof (StorePcieConfDataList)); - Status = EFI_DEVICE_ERROR; - - // - // try to unlock all locked hdd disks. - // - for (Entry = mSmmDeviceList.ForwardLink; Entry != &mSmmDeviceList; Entry = Entry->ForwardLink) { - OpalDev = BASE_CR(Entry, OPAL_SMM_DEVICE, Link); - - RpBase = 0; - SataCmdSt = 0; - - /// - /// Configure RootPort for PCIe AHCI/NVME devices. - /// - if (OpalDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { - /// - /// Save original RootPort configuration space to heap - /// - RpBase = SaveRestoreRootportConfSpace ( - OpalDev, - TRUE, - StorePcieConfDataList - ); - MemoryBase = mNvmeContext.Nbar; - MemoryLength = 0; - ConfigureRootPortForPcieNand (RpBase, OpalDev->BusNum, (UINT32) MemoryBase, (UINT32) MemoryLength); - - /// - /// Enable PCIE decode for RootPort - /// - SataCmdSt = PciRead8 (RpBase + NVME_PCIE_PCICMD); - PciWrite8 (RpBase + NVME_PCIE_PCICMD, 0x6); - } else { - SataCmdSt = PciRead8 (PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, NVME_PCIE_PCICMD)); - PciWrite8 (PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, NVME_PCIE_PCICMD), 0x6); - } - - BaseClassCode = PciRead8 (PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, 0x0B)); - SubClassCode = PciRead8 (PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, 0x0A)); - ProgInt = PciRead8 (PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, 0x09)); - if (BaseClassCode != PCI_CLASS_MASS_STORAGE) { - Status = EFI_INVALID_PARAMETER; - break; - } - - Status = EFI_DEVICE_ERROR; - if (OpalDev->DeviceType == OPAL_DEVICE_TYPE_SATA) { - if ((SubClassCode == PCI_CLASS_MASS_STORAGE_AHCI) || (SubClassCode == PCI_CLASS_MASS_STORAGE_RAID)) { - Status = GetAhciBaseAddress (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "GetAhciBaseAddress error, Status: %r\n", Status)); - goto done; - } - Status = AhciModeInitialize ((UINT8)OpalDev->SataPort); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - DEBUG ((DEBUG_ERROR, "AhciModeInitialize error, Status: %r\n", Status)); - goto done; - } - } else { - DEBUG ((DEBUG_ERROR, "SubClassCode not support for SATA device\n")); - } - } else if (OpalDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { - if (SubClassCode == PCI_CLASS_MASS_STORAGE_NVM) { - if (ProgInt != PCI_IF_NVMHCI) { - DEBUG ((DEBUG_ERROR, "PI not support, skipped\n")); - Status = EFI_NOT_FOUND; - goto done; - } - - mNvmeContext.PciBase = PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, 0x0); - mNvmeContext.NvmeInitWaitTime = 0; - mNvmeContext.Nsid = OpalDev->NvmeNamespaceId; - Status = NvmeControllerInit (&mNvmeContext); - } else { - DEBUG ((DEBUG_ERROR, "SubClassCode not support for NVME device\n")); - } - } else { - DEBUG ((DEBUG_ERROR, "Invalid Devicetype\n")); - goto done; - } - - Status = EFI_DEVICE_ERROR; - BlockSidSupport = FALSE; - if (IsOpalDeviceLocked (OpalDev, &BlockSidSupport)) { - ZeroMem(&Session, sizeof(Session)); - Session.Sscp = &OpalDev->Sscp; - Session.MediaId = 0; - Session.OpalBaseComId = OpalDev->OpalBaseComId; - - Result = OpalSupportUnlock (&Session, OpalDev->Password, OpalDev->PasswordLength, NULL); - if (Result == TcgResultSuccess) { - Status = EFI_SUCCESS; - } - } - - if (mSendBlockSID && BlockSidSupport) { - Result = OpalBlockSid (&Session, TRUE); - if (Result != TcgResultSuccess) { - break; - } - } - - if (OpalDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { - if (SubClassCode == PCI_CLASS_MASS_STORAGE_NVM) { - Status = NvmeControllerExit (&mNvmeContext); - } - } - -done: - if (OpalDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { - ASSERT (RpBase != 0); - PciWrite8 (RpBase + NVME_PCIE_PCICMD, 0); - RpBase = SaveRestoreRootportConfSpace ( - OpalDev, - FALSE, // restore - StorePcieConfDataList - ); - PciWrite8 (RpBase + NVME_PCIE_PCICMD, SataCmdSt); - } else { - PciWrite8 (PCI_LIB_ADDRESS (OpalDev->BusNum, OpalDev->DevNum, OpalDev->FuncNum, NVME_PCIE_PCICMD), SataCmdSt); - } - - if (EFI_ERROR (Status)) { - break; - } - } - - return Status; -} - -/** - The function extracts device information from OpalDeviceList and creat SmmDeviceList used for S3. - - @param[in] OpalDeviceList Opal device list created at POST which contains the information of OPAL_DISK_AND_PASSWORD_INFO - @param[in,out] SmmDeviceList Opal Smm device list to be created and used for unlocking devices at S3 resume. - - @retval EFI_SUCCESS Create SmmDeviceList successfully. - @retval Others Other execution results. -**/ -EFI_STATUS -CreateSmmDeviceList ( - IN LIST_ENTRY *OpalDeviceList, - IN OUT LIST_ENTRY *SmmDeviceList - ) -{ - LIST_ENTRY *Entry; - OPAL_DISK_AND_PASSWORD_INFO *PciDev; - OPAL_SMM_DEVICE *SmmDev; - - for (Entry = OpalDeviceList->ForwardLink; Entry != OpalDeviceList; Entry = Entry->ForwardLink) { - PciDev = BASE_CR (Entry, OPAL_DISK_AND_PASSWORD_INFO, Link); - - SmmDev = AllocateZeroPool (sizeof (OPAL_SMM_DEVICE)); - if (SmmDev == NULL) { - return EFI_OUT_OF_RESOURCES; - } - SmmDev->Signature = OPAL_SMM_DEVICE_SIGNATURE; - - ExtractDeviceInfoFromDevicePath(&PciDev->OpalDevicePath, SmmDev); - - SmmDev->PasswordLength = PciDev->PasswordLength; - CopyMem(&(SmmDev->Password), PciDev->Password, OPAL_PASSWORD_MAX_LENGTH); - - SmmDev->Sscp.ReceiveData = SecurityReceiveData; - SmmDev->Sscp.SendData = SecuritySendData; - - DEBUG ((DEBUG_INFO, "Opal SMM: Insert device node to SmmDeviceList:\n")); - DEBUG ((DEBUG_INFO, "DeviceType:%x, Bus:%d, Dev:%d, Fun:%d\n", \ - SmmDev->DeviceType, SmmDev->BusNum, SmmDev->DevNum, SmmDev->FuncNum)); - DEBUG ((DEBUG_INFO, "SataPort:%x, MultiplierPort:%x, NvmeNamespaceId:%x\n", \ - SmmDev->SataPort, SmmDev->SataPortMultiplierPort, SmmDev->NvmeNamespaceId)); - - InsertHeadList (SmmDeviceList, &SmmDev->Link); - } - - return EFI_SUCCESS; -} - -/** - Main entry point for an SMM handler dispatch or communicate-based callback. - - @param[in] DispatchHandle The unique handle assigned to this handler by SmiHandlerRegister(). - @param[in] Context Points to an optional handler context which was specified when the - handler was registered. - @param[in,out] CommBuffer A pointer to a collection of Data in memory that will - be conveyed from a non-SMM environment into an SMM environment. - @param[in,out] CommBufferSize The Size of the CommBuffer. - - @retval EFI_SUCCESS The interrupt was handled and quiesced. No other handlers - should still be called. - @retval EFI_WARN_INTERRUPT_SOURCE_QUIESCED The interrupt has been quiesced but other handlers should - still be called. - @retval EFI_WARN_INTERRUPT_SOURCE_PENDING The interrupt is still pending and other handlers should still - be called. - @retval EFI_INTERRUPT_PENDING The interrupt could not be quiesced. -**/ -EFI_STATUS -EFIAPI -S3SleepEntryCallBack ( - IN EFI_HANDLE DispatchHandle, - IN CONST VOID *Context OPTIONAL, - IN OUT VOID *CommBuffer OPTIONAL, - IN OUT UINTN *CommBufferSize OPTIONAL - ) -{ - UINTN Bus; - UINTN Device; - UINTN Function; - UINTN Index; - EFI_STATUS Status; - LIST_ENTRY *Entry; - UINTN Offset; - UINT64 Address; - S3_BOOT_SCRIPT_LIB_WIDTH Width; - UINT32 Data; - OPAL_HC_PCI_REGISTER_SAVE *HcRegisterSaveListPtr; - UINTN Count; - OPAL_SMM_DEVICE *SmmDev; - - Data = 0; - Status = EFI_SUCCESS; - - mOpalDeviceList = OpalSupportGetOpalDeviceList(); - if (IsListEmpty (mOpalDeviceList)) { - // - // No Opal enabled device. Do nothing. - // - return EFI_SUCCESS; - } - - if (IsListEmpty (&mSmmDeviceList)) { - // - // mSmmDeviceList for S3 is empty, creat it by mOpalDeviceList. - // - Status = CreateSmmDeviceList (mOpalDeviceList, &mSmmDeviceList); - if (EFI_ERROR (Status)) { - return Status; - } - } - - // - // Go through SmmDeviceList to save register data for S3 - // - for (Entry = mSmmDeviceList.ForwardLink; Entry != &mSmmDeviceList; Entry = Entry->ForwardLink) { - SmmDev = BASE_CR (Entry, OPAL_SMM_DEVICE, Link); - - if (SmmDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { - continue; - } - - // - // Save register Data for S3. Sata controller only. - // - Bus = SmmDev->BusNum; - Device = SmmDev->DevNum; - Function = SmmDev->FuncNum; - - ASSERT (SmmDev->DeviceType == OPAL_DEVICE_TYPE_SATA); - HcRegisterSaveListPtr = (OPAL_HC_PCI_REGISTER_SAVE *) mSataHcRegisterSaveTemplate; - Count = sizeof (mSataHcRegisterSaveTemplate) / sizeof (OPAL_HC_PCI_REGISTER_SAVE); - - for (Index = 0; Index < Count; Index += 1) { - Offset = HcRegisterSaveListPtr[Index].Address; - Width = HcRegisterSaveListPtr[Index].Width; - - switch (Width) { - case S3BootScriptWidthUint8: - Data = (UINT32)PciRead8 (PCI_LIB_ADDRESS(Bus,Device,Function,Offset)); - break; - case S3BootScriptWidthUint16: - Data = (UINT32)PciRead16 (PCI_LIB_ADDRESS(Bus,Device,Function,Offset)); - break; - case S3BootScriptWidthUint32: - Data = PciRead32 (PCI_LIB_ADDRESS(Bus,Device,Function,Offset)); - break; - default: - ASSERT (FALSE); - break; - } - - Address = S3_BOOT_SCRIPT_LIB_PCI_ADDRESS (Bus, Device, Function, Offset); - Status = S3BootScriptSavePciCfgWrite (Width, Address, 1, &Data); - if (EFI_ERROR (Status)) { - return Status; - } - } - } - - Status = S3BootScriptSaveIoWrite (S3BootScriptWidthUint8, 0xB2, 1, &mSwSmiValue); - ASSERT_EFI_ERROR (Status); - - return Status; -} - -/** - Main entry for this driver. - - @param ImageHandle Image handle this driver. - @param SystemTable Pointer to SystemTable. - - @retval EFI_SUCESS This function always complete successfully. - -**/ -EFI_STATUS -EFIAPI -OpalPasswordSmmInit ( - IN EFI_HANDLE ImageHandle, - IN EFI_SYSTEM_TABLE *SystemTable - ) -{ - EFI_STATUS Status; - EFI_SMM_SW_DISPATCH2_PROTOCOL *SwDispatch; - EFI_SMM_SX_DISPATCH2_PROTOCOL *SxDispatch; - EFI_HANDLE SwHandle; - EFI_SMM_SW_REGISTER_CONTEXT Context; - EFI_HANDLE S3SleepEntryHandle; - EFI_SMM_SX_REGISTER_CONTEXT EntryRegisterContext; - EFI_SMM_VARIABLE_PROTOCOL *SmmVariable; - OPAL_EXTRA_INFO_VAR OpalExtraInfo; - UINTN DataSize; - EFI_PHYSICAL_ADDRESS Address; - - mBuffer = NULL; - SwHandle = NULL; - S3SleepEntryHandle = NULL; - ZeroMem (&mNvmeContext, sizeof (NVME_CONTEXT)); - - Status = gSmst->SmmLocateProtocol ( - &gEfiSmmSwDispatch2ProtocolGuid, - NULL, - (VOID **)&SwDispatch - ); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - DEBUG((DEBUG_ERROR, " SmmLocateProtocol gEfiSmmSwDispatch2ProtocolGuid fail, Status: %r\n", Status)); - return Status; - } - - Status = gSmst->SmmLocateProtocol ( - &gEfiSmmSxDispatch2ProtocolGuid, - NULL, - (VOID **)&SxDispatch - ); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - DEBUG((DEBUG_ERROR, " SmmLocateProtocol gEfiSmmSxDispatch2ProtocolGuid fail, Status: %r\n", Status)); - return Status; - } - - // - // Preallocate a 512 bytes Buffer to perform trusted I/O. - // Assume this is big enough for unlock commands - // It's because DMA can not access smmram stack at the cmd execution. - // - Address = 0xFFFFFFFF; - Status = gBS->AllocatePages ( - AllocateMaxAddress, - EfiACPIMemoryNVS, - EFI_SIZE_TO_PAGES (SMM_SIZE_ALLOC_BYTES), - &Address - ); - if (EFI_ERROR (Status)) { - DEBUG((DEBUG_ERROR, " AllocatePages for SATA DAM fail, Status: %r\n", Status)); - return EFI_OUT_OF_RESOURCES; - } - - mBuffer = (VOID *)(UINTN)Address; - ZeroMem ((VOID *)(UINTN)mBuffer, SMM_SIZE_ALLOC_BYTES); - - // - // Preallocate resource for AHCI transfer descriptor. - // - Status = AhciAllocateResource (); - if (EFI_ERROR (Status)) { - DEBUG((DEBUG_ERROR, " AhciAllocateResource fail, Status: %r\n", Status)); - Status = EFI_OUT_OF_RESOURCES; - goto EXIT; - } - - // - // Preallocate resource for NVMe configuration space. - // - Status = NvmeAllocateResource (ImageHandle, &mNvmeContext); - if (EFI_ERROR (Status)) { - DEBUG((DEBUG_ERROR, " NvmeAllocateResource fail, Status: %r\n", Status)); - Status = EFI_OUT_OF_RESOURCES; - goto EXIT; - } - - // - // Register a S3 entry callback function to store ATA host controller context to boot script. - // These boot scripts would be invoked at S3 path to recovery ATA host controller h/w context - // for executing HDD unlock cmd. - // - EntryRegisterContext.Type = SxS3; - EntryRegisterContext.Phase = SxEntry; - Status = SxDispatch->Register ( - SxDispatch, - S3SleepEntryCallBack, - &EntryRegisterContext, - &S3SleepEntryHandle - ); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - goto EXIT; - } - - // - // Register Opal password smm unlock handler - // - Context.SwSmiInputValue = (UINTN) -1; - Status = SwDispatch->Register ( - SwDispatch, - SmmUnlockOpalPassword, - &Context, - &SwHandle - ); - ASSERT_EFI_ERROR (Status); - if (EFI_ERROR (Status)) { - DEBUG((DEBUG_ERROR, " SwDispatch->Register fail, Status: %r\n", Status)); - goto EXIT; - } - - // - // trigger smi to unlock hdd if it's locked. - // - mSwSmiValue = (UINT8) Context.SwSmiInputValue; - - Status = gSmst->SmmLocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID**)&SmmVariable); - if (!EFI_ERROR (Status)) { - DataSize = sizeof (OPAL_EXTRA_INFO_VAR); - Status = SmmVariable->SmmGetVariable ( - OPAL_EXTRA_INFO_VAR_NAME, - &gOpalExtraInfoVariableGuid, - NULL, - &DataSize, - &OpalExtraInfo - ); - if (!EFI_ERROR (Status)) { - mSendBlockSID = OpalExtraInfo.EnableBlockSid; - } - } - - return EFI_SUCCESS; - -EXIT: - if (S3SleepEntryHandle != NULL) { - SxDispatch->UnRegister (SxDispatch, S3SleepEntryHandle); - } - - AhciFreeResource (); - - NvmeFreeResource (&mNvmeContext); - - if (mBuffer != NULL) { - gBS->FreePages ((EFI_PHYSICAL_ADDRESS)(UINTN) mBuffer, EFI_SIZE_TO_PAGES (SMM_SIZE_ALLOC_BYTES)); - } - - return Status; -} - -/** - Provide Io action support. - - @param[in] SmmDev the opal device need to perform trust io. - @param[in] IoType OPAL_IO_TYPE indicating whether to perform a Trusted Send or Trusted Receive. - @param[in] SecurityProtocol Security Protocol - @param[in] SpSpecific Security Protocol Specific - @param[in] TransferLength Transfer Length of Buffer (in bytes) - always a multiple of 512 - @param[in] Buffer Address of Data to transfer - - @retval TcgResultSuccess Perform the io action success. - @retval TcgResultFailure Perform the io action failed. - -**/ -EFI_STATUS -PerformTrustedIo ( - OPAL_SMM_DEVICE *SmmDev, - OPAL_IO_TYPE IoType, - UINT8 SecurityProtocol, - UINT16 SpSpecific, - UINTN TransferLength, - VOID *Buffer - ) -{ - EFI_STATUS Status; - UINTN BufferSizeBlocks; - EFI_ATA_COMMAND_BLOCK AtaCommandBlock; - - Status = EFI_DEVICE_ERROR; - if (SmmDev->DeviceType == OPAL_DEVICE_TYPE_SATA) { - BufferSizeBlocks = TransferLength / 512; - - ZeroMem( &AtaCommandBlock, sizeof( EFI_ATA_COMMAND_BLOCK ) ); - AtaCommandBlock.AtaCommand = ( IoType == OpalSend ) ? ATA_COMMAND_TRUSTED_SEND : ATA_COMMAND_TRUSTED_RECEIVE; - AtaCommandBlock.AtaSectorCount = ( UINT8 )BufferSizeBlocks; - AtaCommandBlock.AtaSectorNumber = ( UINT8 )( BufferSizeBlocks >> 8 ); - AtaCommandBlock.AtaFeatures = SecurityProtocol; - AtaCommandBlock.AtaCylinderLow = ( UINT8 )( SpSpecific >> 8 ); - AtaCommandBlock.AtaCylinderHigh = ( UINT8 )( SpSpecific ); - AtaCommandBlock.AtaDeviceHead = ATA_DEVICE_LBA; - - - ZeroMem( mBuffer, HDD_PAYLOAD ); - ASSERT( TransferLength <= HDD_PAYLOAD ); - - if (IoType == OpalSend) { - CopyMem( mBuffer, Buffer, TransferLength ); - } - - Status = AhciPioTransfer( - &mAhciRegisters, - (UINT8) SmmDev->SataPort, - (UINT8) SmmDev->SataPortMultiplierPort, - NULL, - 0, - ( IoType == OpalSend ) ? FALSE : TRUE, // i/o direction - &AtaCommandBlock, - NULL, - mBuffer, - (UINT32)TransferLength, - ATA_TIMEOUT - ); - - if (IoType == OpalRecv) { - CopyMem( Buffer, mBuffer, TransferLength ); - } - } else if (SmmDev->DeviceType == OPAL_DEVICE_TYPE_NVME) { - Status = NvmeSecuritySendReceive ( - &mNvmeContext, - IoType == OpalSend, - SecurityProtocol, - SwapBytes16(SpSpecific), - TransferLength, - Buffer - ); - } else { - DEBUG((DEBUG_ERROR, "DeviceType(%x) not support.\n", SmmDev->DeviceType)); - } - - return Status; -} - -/** - Send a security protocol command to a device that receives data and/or the result - of one or more commands sent by SendData. - - The ReceiveData function sends a security protocol command to the given MediaId. - The security protocol command sent is defined by SecurityProtocolId and contains - the security protocol specific data SecurityProtocolSpecificData. The function - returns the data from the security protocol command in PayloadBuffer. - - For devices supporting the SCSI command set, the security protocol command is sent - using the SECURITY PROTOCOL IN command defined in SPC-4. - - For devices supporting the ATA command set, the security protocol command is sent - using one of the TRUSTED RECEIVE commands defined in ATA8-ACS if PayloadBufferSize - is non-zero. - - If the PayloadBufferSize is zero, the security protocol command is sent using the - Trusted Non-Data command defined in ATA8-ACS. - - If PayloadBufferSize is too small to store the available data from the security - protocol command, the function shall copy PayloadBufferSize bytes into the - PayloadBuffer and return EFI_WARN_BUFFER_TOO_SMALL. - - If PayloadBuffer or PayloadTransferSize is NULL and PayloadBufferSize is non-zero, - the function shall return EFI_INVALID_PARAMETER. - - If the given MediaId does not support security protocol commands, the function shall - return EFI_UNSUPPORTED. If there is no media in the device, the function returns - EFI_NO_MEDIA. If the MediaId is not the ID for the current media in the device, - the function returns EFI_MEDIA_CHANGED. - - If the security protocol fails to complete within the Timeout period, the function - shall return EFI_TIMEOUT. - - If the security protocol command completes without an error, the function shall - return EFI_SUCCESS. If the security protocol command completes with an error, the - function shall return EFI_DEVICE_ERROR. - - @param This Indicates a pointer to the calling context. - @param MediaId ID of the medium to receive data from. - @param Timeout The timeout, in 100ns units, to use for the execution - of the security protocol command. A Timeout value of 0 - means that this function will wait indefinitely for the - security protocol command to execute. If Timeout is greater - than zero, then this function will return EFI_TIMEOUT - if the time required to execute the receive data command - is greater than Timeout. - @param SecurityProtocolId The value of the "Security Protocol" parameter of - the security protocol command to be sent. - @param SecurityProtocolSpecificData The value of the "Security Protocol Specific" parameter - of the security protocol command to be sent. - @param PayloadBufferSize Size in bytes of the payload data buffer. - @param PayloadBuffer A pointer to a destination buffer to store the security - protocol command specific payload data for the security - protocol command. The caller is responsible for having - either implicit or explicit ownership of the buffer. - @param PayloadTransferSize A pointer to a buffer to store the size in bytes of the - data written to the payload data buffer. - - @retval EFI_SUCCESS The security protocol command completed successfully. - @retval EFI_WARN_BUFFER_TOO_SMALL The PayloadBufferSize was too small to store the available - data from the device. The PayloadBuffer contains the truncated data. - @retval EFI_UNSUPPORTED The given MediaId does not support security protocol commands. - @retval EFI_DEVICE_ERROR The security protocol command completed with an error. - @retval EFI_NO_MEDIA There is no media in the device. - @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. - @retval EFI_INVALID_PARAMETER The PayloadBuffer or PayloadTransferSize is NULL and - PayloadBufferSize is non-zero. - @retval EFI_TIMEOUT A timeout occurred while waiting for the security - protocol command to execute. - -**/ -EFI_STATUS -EFIAPI -SecurityReceiveData ( - IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, - IN UINT32 MediaId, - IN UINT64 Timeout, - IN UINT8 SecurityProtocolId, - IN UINT16 SecurityProtocolSpecificData, - IN UINTN PayloadBufferSize, - OUT VOID *PayloadBuffer, - OUT UINTN *PayloadTransferSize - ) -{ - OPAL_SMM_DEVICE *SmmDev; - - SmmDev = OPAL_SMM_DEVICE_FROM_THIS (This); - if (SmmDev == NULL) { - return EFI_DEVICE_ERROR; - } - - return PerformTrustedIo ( - SmmDev, - OpalRecv, - SecurityProtocolId, - SecurityProtocolSpecificData, - PayloadBufferSize, - PayloadBuffer - ); -} - -/** - Send a security protocol command to a device. - - The SendData function sends a security protocol command containing the payload - PayloadBuffer to the given MediaId. The security protocol command sent is - defined by SecurityProtocolId and contains the security protocol specific data - SecurityProtocolSpecificData. If the underlying protocol command requires a - specific padding for the command payload, the SendData function shall add padding - bytes to the command payload to satisfy the padding requirements. - - For devices supporting the SCSI command set, the security protocol command is sent - using the SECURITY PROTOCOL OUT command defined in SPC-4. - - For devices supporting the ATA command set, the security protocol command is sent - using one of the TRUSTED SEND commands defined in ATA8-ACS if PayloadBufferSize - is non-zero. If the PayloadBufferSize is zero, the security protocol command is - sent using the Trusted Non-Data command defined in ATA8-ACS. - - If PayloadBuffer is NULL and PayloadBufferSize is non-zero, the function shall - return EFI_INVALID_PARAMETER. - - If the given MediaId does not support security protocol commands, the function - shall return EFI_UNSUPPORTED. If there is no media in the device, the function - returns EFI_NO_MEDIA. If the MediaId is not the ID for the current media in the - device, the function returns EFI_MEDIA_CHANGED. - - If the security protocol fails to complete within the Timeout period, the function - shall return EFI_TIMEOUT. - - If the security protocol command completes without an error, the function shall return - EFI_SUCCESS. If the security protocol command completes with an error, the function - shall return EFI_DEVICE_ERROR. - - @param This Indicates a pointer to the calling context. - @param MediaId ID of the medium to receive data from. - @param Timeout The timeout, in 100ns units, to use for the execution - of the security protocol command. A Timeout value of 0 - means that this function will wait indefinitely for the - security protocol command to execute. If Timeout is greater - than zero, then this function will return EFI_TIMEOUT - if the time required to execute the send data command - is greater than Timeout. - @param SecurityProtocolId The value of the "Security Protocol" parameter of - the security protocol command to be sent. - @param SecurityProtocolSpecificData The value of the "Security Protocol Specific" parameter - of the security protocol command to be sent. - @param PayloadBufferSize Size in bytes of the payload data buffer. - @param PayloadBuffer A pointer to a destination buffer to store the security - protocol command specific payload data for the security - protocol command. - - @retval EFI_SUCCESS The security protocol command completed successfully. - @retval EFI_UNSUPPORTED The given MediaId does not support security protocol commands. - @retval EFI_DEVICE_ERROR The security protocol command completed with an error. - @retval EFI_NO_MEDIA There is no media in the device. - @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. - @retval EFI_INVALID_PARAMETER The PayloadBuffer is NULL and PayloadBufferSize is non-zero. - @retval EFI_TIMEOUT A timeout occurred while waiting for the security - protocol command to execute. - -**/ -EFI_STATUS -EFIAPI -SecuritySendData ( - IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, - IN UINT32 MediaId, - IN UINT64 Timeout, - IN UINT8 SecurityProtocolId, - IN UINT16 SecurityProtocolSpecificData, - IN UINTN PayloadBufferSize, - IN VOID *PayloadBuffer - ) -{ - OPAL_SMM_DEVICE *SmmDev; - - SmmDev = OPAL_SMM_DEVICE_FROM_THIS (This); - if (SmmDev == NULL) { - return EFI_DEVICE_ERROR; - } - - return PerformTrustedIo ( - SmmDev, - OpalSend, - SecurityProtocolId, - SecurityProtocolSpecificData, - PayloadBufferSize, - PayloadBuffer - ); - -} - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.h b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.h deleted file mode 100644 index ce88786fab..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.h +++ /dev/null @@ -1,299 +0,0 @@ -/** @file - Opal password smm driver which is used to support Opal security feature at s3 path. - -Copyright (c) 2016, Intel Corporation. All rights reserved.
-This program and the accompanying materials -are licensed and made available under the terms and conditions of the BSD License -which accompanies this distribution. The full text of the license may be found at -http://opensource.org/licenses/bsd-license.php - -THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. - -**/ - -#ifndef _OPAL_PASSWORD_SMM_H_ -#define _OPAL_PASSWORD_SMM_H_ - -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -#include - -#include - -#include "OpalAhciMode.h" -#include "OpalIdeMode.h" -#include "OpalNvmeMode.h" - -// -// Time out Value for ATA pass through protocol -// -#define ATA_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3) - -// -// The payload Length of HDD related ATA commands -// -#define HDD_PAYLOAD 512 -// -// According to ATA spec, the max Length of hdd password is 32 bytes -// -#define OPAL_PASSWORD_MAX_LENGTH 32 - -extern VOID *mBuffer; - -#pragma pack(1) - -typedef struct { - UINT32 Address; - S3_BOOT_SCRIPT_LIB_WIDTH Width; -} OPAL_HC_PCI_REGISTER_SAVE; - - -typedef struct { - UINT32 SegNum; - UINT32 BusNum; - UINT32 DevNum; - UINT32 FuncNum; -} PCI_DEVICE; - -/** -* Opal I/O Type utilized by the Trusted IO callback -* -* The type indicates if the I/O is a send or receive -*/ -typedef enum { - // - // I/O is a TCG Trusted Send command - // - OpalSend, - - // - // I/O is a TCG Trusted Receive command - // - OpalRecv -} OPAL_IO_TYPE; - - -#define OPAL_SMM_DEVICE_SIGNATURE SIGNATURE_32 ('o', 's', 'd', 's') - -typedef struct { - UINTN Signature; - LIST_ENTRY Link; - - EFI_STORAGE_SECURITY_COMMAND_PROTOCOL Sscp; - - UINT32 SegNum; - UINT32 BusNum; - UINT32 DevNum; - UINT32 FuncNum; - - UINT8 DeviceType; - - UINT32 SataPort; - UINT32 SataPortMultiplierPort; - - UINT32 NvmeNamespaceId; - - UINT8 Password[32]; - UINT8 PasswordLength; - - UINT32 Length; - PCI_DEVICE *PciBridgeNode; - - UINT16 OpalBaseComId; -} OPAL_SMM_DEVICE; - -#define OPAL_SMM_DEVICE_FROM_THIS(a) CR (a, OPAL_SMM_DEVICE, Sscp, OPAL_SMM_DEVICE_SIGNATURE) - -#pragma pack() - -/** - Send a security protocol command to a device that receives data and/or the result - of one or more commands sent by SendData. - - The ReceiveData function sends a security protocol command to the given MediaId. - The security protocol command sent is defined by SecurityProtocolId and contains - the security protocol specific data SecurityProtocolSpecificData. The function - returns the data from the security protocol command in PayloadBuffer. - - For devices supporting the SCSI command set, the security protocol command is sent - using the SECURITY PROTOCOL IN command defined in SPC-4. - - For devices supporting the ATA command set, the security protocol command is sent - using one of the TRUSTED RECEIVE commands defined in ATA8-ACS if PayloadBufferSize - is non-zero. - - If the PayloadBufferSize is zero, the security protocol command is sent using the - Trusted Non-Data command defined in ATA8-ACS. - - If PayloadBufferSize is too small to store the available data from the security - protocol command, the function shall copy PayloadBufferSize bytes into the - PayloadBuffer and return EFI_WARN_BUFFER_TOO_SMALL. - - If PayloadBuffer or PayloadTransferSize is NULL and PayloadBufferSize is non-zero, - the function shall return EFI_INVALID_PARAMETER. - - If the given MediaId does not support security protocol commands, the function shall - return EFI_UNSUPPORTED. If there is no media in the device, the function returns - EFI_NO_MEDIA. If the MediaId is not the ID for the current media in the device, - the function returns EFI_MEDIA_CHANGED. - - If the security protocol fails to complete within the Timeout period, the function - shall return EFI_TIMEOUT. - - If the security protocol command completes without an error, the function shall - return EFI_SUCCESS. If the security protocol command completes with an error, the - function shall return EFI_DEVICE_ERROR. - - @param This Indicates a pointer to the calling context. - @param MediaId ID of the medium to receive data from. - @param Timeout The timeout, in 100ns units, to use for the execution - of the security protocol command. A Timeout value of 0 - means that this function will wait indefinitely for the - security protocol command to execute. If Timeout is greater - than zero, then this function will return EFI_TIMEOUT - if the time required to execute the receive data command - is greater than Timeout. - @param SecurityProtocolId The value of the "Security Protocol" parameter of - the security protocol command to be sent. - @param SecurityProtocolSpecificData The value of the "Security Protocol Specific" parameter - of the security protocol command to be sent. - @param PayloadBufferSize Size in bytes of the payload data buffer. - @param PayloadBuffer A pointer to a destination buffer to store the security - protocol command specific payload data for the security - protocol command. The caller is responsible for having - either implicit or explicit ownership of the buffer. - @param PayloadTransferSize A pointer to a buffer to store the size in bytes of the - data written to the payload data buffer. - - @retval EFI_SUCCESS The security protocol command completed successfully. - @retval EFI_WARN_BUFFER_TOO_SMALL The PayloadBufferSize was too small to store the available - data from the device. The PayloadBuffer contains the truncated data. - @retval EFI_UNSUPPORTED The given MediaId does not support security protocol commands. - @retval EFI_DEVICE_ERROR The security protocol command completed with an error. - @retval EFI_NO_MEDIA There is no media in the device. - @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. - @retval EFI_INVALID_PARAMETER The PayloadBuffer or PayloadTransferSize is NULL and - PayloadBufferSize is non-zero. - @retval EFI_TIMEOUT A timeout occurred while waiting for the security - protocol command to execute. - -**/ -EFI_STATUS -EFIAPI -SecurityReceiveData ( - IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, - IN UINT32 MediaId, - IN UINT64 Timeout, - IN UINT8 SecurityProtocolId, - IN UINT16 SecurityProtocolSpecificData, - IN UINTN PayloadBufferSize, - OUT VOID *PayloadBuffer, - OUT UINTN *PayloadTransferSize - ); - -/** - Send a security protocol command to a device. - - The SendData function sends a security protocol command containing the payload - PayloadBuffer to the given MediaId. The security protocol command sent is - defined by SecurityProtocolId and contains the security protocol specific data - SecurityProtocolSpecificData. If the underlying protocol command requires a - specific padding for the command payload, the SendData function shall add padding - bytes to the command payload to satisfy the padding requirements. - - For devices supporting the SCSI command set, the security protocol command is sent - using the SECURITY PROTOCOL OUT command defined in SPC-4. - - For devices supporting the ATA command set, the security protocol command is sent - using one of the TRUSTED SEND commands defined in ATA8-ACS if PayloadBufferSize - is non-zero. If the PayloadBufferSize is zero, the security protocol command is - sent using the Trusted Non-Data command defined in ATA8-ACS. - - If PayloadBuffer is NULL and PayloadBufferSize is non-zero, the function shall - return EFI_INVALID_PARAMETER. - - If the given MediaId does not support security protocol commands, the function - shall return EFI_UNSUPPORTED. If there is no media in the device, the function - returns EFI_NO_MEDIA. If the MediaId is not the ID for the current media in the - device, the function returns EFI_MEDIA_CHANGED. - - If the security protocol fails to complete within the Timeout period, the function - shall return EFI_TIMEOUT. - - If the security protocol command completes without an error, the function shall return - EFI_SUCCESS. If the security protocol command completes with an error, the function - shall return EFI_DEVICE_ERROR. - - @param This Indicates a pointer to the calling context. - @param MediaId ID of the medium to receive data from. - @param Timeout The timeout, in 100ns units, to use for the execution - of the security protocol command. A Timeout value of 0 - means that this function will wait indefinitely for the - security protocol command to execute. If Timeout is greater - than zero, then this function will return EFI_TIMEOUT - if the time required to execute the receive data command - is greater than Timeout. - @param SecurityProtocolId The value of the "Security Protocol" parameter of - the security protocol command to be sent. - @param SecurityProtocolSpecificData The value of the "Security Protocol Specific" parameter - of the security protocol command to be sent. - @param PayloadBufferSize Size in bytes of the payload data buffer. - @param PayloadBuffer A pointer to a destination buffer to store the security - protocol command specific payload data for the security - protocol command. - - @retval EFI_SUCCESS The security protocol command completed successfully. - @retval EFI_UNSUPPORTED The given MediaId does not support security protocol commands. - @retval EFI_DEVICE_ERROR The security protocol command completed with an error. - @retval EFI_NO_MEDIA There is no media in the device. - @retval EFI_MEDIA_CHANGED The MediaId is not for the current media. - @retval EFI_INVALID_PARAMETER The PayloadBuffer is NULL and PayloadBufferSize is non-zero. - @retval EFI_TIMEOUT A timeout occurred while waiting for the security - protocol command to execute. - -**/ -EFI_STATUS -EFIAPI -SecuritySendData ( - IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, - IN UINT32 MediaId, - IN UINT64 Timeout, - IN UINT8 SecurityProtocolId, - IN UINT16 SecurityProtocolSpecificData, - IN UINTN PayloadBufferSize, - IN VOID *PayloadBuffer - ); - -#endif // _OPAL_PASSWORD_SMM_H_ - diff --git a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf b/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf deleted file mode 100644 index c62fa13271..0000000000 --- a/SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf +++ /dev/null @@ -1,77 +0,0 @@ -## @file -# This is a Opal Password Smm driver. -# -# Copyright (c) 2016, Intel Corporation. All rights reserved.
-# This program and the accompanying materials -# are licensed and made available under the terms and conditions of the BSD License -# which accompanies this distribution. The full text of the license may be found at -# http://opensource.org/licenses/bsd-license.php -# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, -# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. -# -## -[Defines] - INF_VERSION = 0x00010005 - BASE_NAME = OpalPasswordSmm - FILE_GUID = 7D24A234-A8C2-4718-BF60-A2EF070F414E - MODULE_TYPE = DXE_SMM_DRIVER - VERSION_STRING = 1.0 - PI_SPECIFICATION_VERSION = 0x0001000A - ENTRY_POINT = OpalPasswordSmmInit - -# -# The following information is for reference only and not required by the build tools. -# -# VALID_ARCHITECTURES = IA32 X64 IPF EBC -# - -[Sources] - OpalPasswordSmm.c - OpalPasswordSmm.h - OpalAhciMode.c - OpalAhciMode.h - OpalIdeMode.c - OpalIdeMode.h - OpalNvmeMode.c - OpalNvmeMode.h - OpalNvmeReg.h - -[Packages] - MdePkg/MdePkg.dec - SecurityPkg/SecurityPkg.dec - MdeModulePkg/MdeModulePkg.dec - -[LibraryClasses] - UefiBootServicesTableLib - UefiDriverEntryPoint - UefiRuntimeServicesTableLib - DebugLib - IoLib - PciLib - BaseLib - BaseMemoryLib - SmmServicesTableLib - MemoryAllocationLib - UefiLib - TimerLib - S3BootScriptLib - DxeServicesTableLib - DevicePathLib - OpalPasswordSupportLib - SmmIoLib - -[Guids] - gOpalExtraInfoVariableGuid ## CONSUMES ## GUID - -[Protocols] - gEfiSmmSwDispatch2ProtocolGuid ## CONSUMES - gEfiAtaPassThruProtocolGuid ## CONSUMES - gEfiPciIoProtocolGuid ## CONSUMES - gEfiSmmSxDispatch2ProtocolGuid ## CONSUMES - gEfiSmmVariableProtocolGuid ## CONSUMES - gEfiStorageSecurityCommandProtocolGuid ## CONSUMES - -[Depex] - gEfiSmmSwDispatch2ProtocolGuid AND - gEfiSmmSxDispatch2ProtocolGuid AND - gEfiSmmVariableProtocolGuid -- 2.39.2