summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--SecurityPkg/SecurityPkg.dsc2
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/ComponentName.c398
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.c1091
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriver.h412
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalDriverPrivate.h102
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.c1527
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHii.h146
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiCallbacks.c221
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormStrings.uni103
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiFormValues.h120
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalHiiPrivate.h268
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordDxe.inf82
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordDxe/OpalPasswordForm.vfr350
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.c1267
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalAhciMode.h408
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.c767
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalIdeMode.h173
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.c2165
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeMode.h456
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalNvmeReg.h814
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.c1088
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.h299
-rw-r--r--SecurityPkg/Tcg/Opal/OpalPasswordSmm/OpalPasswordSmm.inf77
23 files changed, 0 insertions, 12336 deletions
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.<BR>
-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.<BR>
-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.<BR>
-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 <PiDxe.h>
-
-#include <Protocol/PciIo.h>
-#include <Protocol/SmmCommunication.h>
-#include <Protocol/BlockIo.h>
-#include <Protocol/LoadedImage.h>
-#include <Protocol/DevicePath.h>
-#include <Protocol/DevicePathToText.h>
-#include <Protocol/StorageSecurityCommand.h>
-
-#include <Library/UefiLib.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/BaseLib.h>
-#include <Library/PrintLib.h>
-#include <Library/DebugLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/HiiLib.h>
-#include <Library/UefiHiiServicesLib.h>
-#include <Library/TcgStorageOpalLib.h>
-#include <Library/OpalPasswordSupportLib.h>
-#include <Library/Tcg2PhysicalPresenceLib.h>
-
-#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.<BR>
-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.<BR>
-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 <ConfigResp>
- 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
- <ConfigRequest> 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
- <ConfigAltResp> 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 <ConfigHdr> 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 <ConfigResp> 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.<BR>
-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 <Library/OpalPasswordSupportLib.h>
-#include <OpalDriverPrivate.h>
-
-#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.<BR>
-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.<BR>
-//
-// 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.<BR>
-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.<BR>
-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 <Library/OpalPasswordSupportLib.h>
-#include <Protocol/HiiConfigAccess.h>
-
-#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 <ConfigResp>
- 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
- <ConfigRequest> 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
- <ConfigAltResp> 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.<BR>
-# 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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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.<BR>
-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 <PiSmm.h>
-#include <IndustryStandard/Atapi.h>
-
-#include <Protocol/SmmSwDispatch2.h>
-#include <Protocol/SmmSxDispatch2.h>
-#include <Protocol/AtaPassThru.h>
-#include <Protocol/PciIo.h>
-#include <Protocol/SmmReadyToLock.h>
-#include <Protocol/SmmVariable.h>
-#include <Protocol/VariableLock.h>
-#include <Protocol/SmmEndOfDxe.h>
-#include <Protocol/StorageSecurityCommand.h>
-
-#include <Library/OpalPasswordSupportLib.h>
-#include <Library/DebugLib.h>
-#include <Library/PcdLib.h>
-#include <Library/IoLib.h>
-#include <Library/TimerLib.h>
-#include <Library/PciLib.h>
-#include <Library/BaseLib.h>
-#include <Library/BaseMemoryLib.h>
-#include <Library/SmmServicesTableLib.h>
-#include <Library/MemoryAllocationLib.h>
-#include <Library/UefiDriverEntryPoint.h>
-#include <Library/UefiBootServicesTableLib.h>
-#include <Library/UefiRuntimeServicesTableLib.h>
-#include <Library/UefiLib.h>
-#include <Library/S3BootScriptLib.h>
-#include <Library/DevicePathLib.h>
-#include <Library/DxeServicesTableLib.h>
-#include <Library/SmmIoLib.h>
-
-#include <IndustryStandard/Pci22.h>
-
-#include <Guid/OpalPasswordExtraInfoVariable.h>
-
-#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.<BR>
-# 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