MdeModulePkg: Apply uncrustify changes

REF: https://bugzilla.tianocore.org/show_bug.cgi?id=3737

Apply uncrustify changes to .c/.h files in the MdeModulePkg package

Cc: Andrew Fish <afish@apple.com>
Cc: Leif Lindholm <leif@nuviainc.com>
Cc: Michael D Kinney <michael.d.kinney@intel.com>
Signed-off-by: Michael Kubacki <michael.kubacki@microsoft.com>
Reviewed-by: Liming Gao <gaoliming@byosoft.com.cn>
This commit is contained in:
Michael Kubacki
2021-12-05 14:54:02 -08:00
committed by mergify[bot]
parent 7c7184e201
commit 1436aea4d5
994 changed files with 107608 additions and 101311 deletions

View File

@ -8,24 +8,24 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "BootManagerMenu.h" #include "BootManagerMenu.h"
EFI_HII_HANDLE gStringPackHandle; EFI_HII_HANDLE gStringPackHandle;
BOOLEAN mModeInitialized = FALSE; BOOLEAN mModeInitialized = FALSE;
// //
// Boot video resolution and text mode. // Boot video resolution and text mode.
// //
UINT32 mBootHorizontalResolution = 0; UINT32 mBootHorizontalResolution = 0;
UINT32 mBootVerticalResolution = 0; UINT32 mBootVerticalResolution = 0;
UINT32 mBootTextModeColumn = 0; UINT32 mBootTextModeColumn = 0;
UINT32 mBootTextModeRow = 0; UINT32 mBootTextModeRow = 0;
// //
// BIOS setup video resolution and text mode. // BIOS setup video resolution and text mode.
// //
UINT32 mSetupTextModeColumn = 0; UINT32 mSetupTextModeColumn = 0;
UINT32 mSetupTextModeRow = 0; UINT32 mSetupTextModeRow = 0;
UINT32 mSetupHorizontalResolution = 0; UINT32 mSetupHorizontalResolution = 0;
UINT32 mSetupVerticalResolution = 0; UINT32 mSetupVerticalResolution = 0;
/** /**
Prints a unicode string to the default console, at Prints a unicode string to the default console, at
@ -40,16 +40,16 @@ UINT32 mSetupVerticalResolution = 0;
**/ **/
UINTN UINTN
PrintStringAt ( PrintStringAt (
IN UINTN Column, IN UINTN Column,
IN UINTN Row, IN UINTN Row,
IN CHAR16 *String IN CHAR16 *String
) )
{ {
UINTN ScreenWidth; UINTN ScreenWidth;
UINTN ScreenRows; UINTN ScreenRows;
CHAR16 *TurncateString; CHAR16 *TurncateString;
EFI_STATUS Status; EFI_STATUS Status;
UINTN ShowingLength; UINTN ShowingLength;
gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row); gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
@ -60,7 +60,7 @@ PrintStringAt (
&ScreenRows &ScreenRows
); );
if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) { if ((Column > (ScreenWidth - 1)) || (Row > (ScreenRows - 1))) {
return 0; return 0;
} }
@ -71,7 +71,7 @@ PrintStringAt (
// TurncateString length should leave one character for draw box and // TurncateString length should leave one character for draw box and
// require one character for string end. // require one character for string end.
// //
ShowingLength = ScreenWidth - Column - 1; ShowingLength = ScreenWidth - Column - 1;
TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16)); TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));
if (TurncateString == NULL) { if (TurncateString == NULL) {
@ -89,7 +89,7 @@ PrintStringAt (
*(TurncateString + ShowingLength - 2) = L'.'; *(TurncateString + ShowingLength - 2) = L'.';
*(TurncateString + ShowingLength - 1) = L'.'; *(TurncateString + ShowingLength - 1) = L'.';
*(TurncateString + ShowingLength) = L'\0'; *(TurncateString + ShowingLength) = L'\0';
ShowingLength = Print (L"%s", TurncateString); ShowingLength = Print (L"%s", TurncateString);
FreePool (TurncateString); FreePool (TurncateString);
return ShowingLength; return ShowingLength;
} else { } else {
@ -110,13 +110,13 @@ PrintStringAt (
**/ **/
UINTN UINTN
PrintCharAt ( PrintCharAt (
IN UINTN Column, IN UINTN Column,
IN UINTN Row, IN UINTN Row,
CHAR16 Character CHAR16 Character
) )
{ {
UINTN ScreenWidth; UINTN ScreenWidth;
UINTN ScreenRows; UINTN ScreenRows;
gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row); gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
@ -127,7 +127,7 @@ PrintCharAt (
&ScreenRows &ScreenRows
); );
if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) { if ((Column > (ScreenWidth - 1)) || (Row > (ScreenRows - 1))) {
return 0; return 0;
} }
@ -145,30 +145,31 @@ PrintCharAt (
**/ **/
UINTN UINTN
GetLineWidth ( GetLineWidth (
IN EFI_STRING_ID StringId IN EFI_STRING_ID StringId
) )
{ {
UINTN Index; UINTN Index;
UINTN IncrementValue; UINTN IncrementValue;
EFI_STRING String; EFI_STRING String;
UINTN LineWidth; UINTN LineWidth;
LineWidth = 0; LineWidth = 0;
String = HiiGetString (gStringPackHandle, StringId, NULL); String = HiiGetString (gStringPackHandle, StringId, NULL);
if (String != NULL) { if (String != NULL) {
Index = 0; Index = 0;
IncrementValue = 1; IncrementValue = 1;
do { do {
// //
// Advance to the null-terminator or to the first width directive // Advance to the null-terminator or to the first width directive
// //
for (; for ( ;
(String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0); (String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);
Index++, LineWidth = LineWidth + IncrementValue Index++, LineWidth = LineWidth + IncrementValue
) )
; {
}
// //
// We hit the null-terminator, we now have a count // We hit the null-terminator, we now have a count
@ -176,6 +177,7 @@ GetLineWidth (
if (String[Index] == 0) { if (String[Index] == 0) {
break; break;
} }
// //
// We encountered a narrow directive - strip it from the size calculation since it doesn't get printed // We encountered a narrow directive - strip it from the size calculation since it doesn't get printed
// and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2) // and also set the flag that determines what we increment by.(if narrow, increment by 1, if wide increment by 2)
@ -194,6 +196,7 @@ GetLineWidth (
IncrementValue = 2; IncrementValue = 2;
} }
} while (String[Index] != 0); } while (String[Index] != 0);
FreePool (String); FreePool (String);
} }
@ -214,35 +217,37 @@ InitializeBootMenuScreen (
IN OUT BOOT_MENU_POPUP_DATA *BootMenuData IN OUT BOOT_MENU_POPUP_DATA *BootMenuData
) )
{ {
UINTN MaxStrWidth; UINTN MaxStrWidth;
UINTN StrWidth; UINTN StrWidth;
UINTN Index; UINTN Index;
UINTN Column; UINTN Column;
UINTN Row; UINTN Row;
UINTN MaxPrintRows; UINTN MaxPrintRows;
UINTN UnSelectableItmes; UINTN UnSelectableItmes;
if (BootMenuData == NULL) { if (BootMenuData == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
// //
// Get maximum string width // Get maximum string width
// //
MaxStrWidth = 0; MaxStrWidth = 0;
for (Index = 0; Index < TITLE_TOKEN_COUNT; Index++) { for (Index = 0; Index < TITLE_TOKEN_COUNT; Index++) {
StrWidth = GetLineWidth (BootMenuData->TitleToken[Index]); StrWidth = GetLineWidth (BootMenuData->TitleToken[Index]);
MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth; MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth;
} }
for (Index = 0; Index < BootMenuData->ItemCount; Index++) { for (Index = 0; Index < BootMenuData->ItemCount; Index++) {
StrWidth = GetLineWidth (BootMenuData->PtrTokens[Index]); StrWidth = GetLineWidth (BootMenuData->PtrTokens[Index]);
MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth; MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth;
} }
for (Index = 0; Index < HELP_TOKEN_COUNT; Index++) { for (Index = 0; Index < HELP_TOKEN_COUNT; Index++) {
StrWidth = GetLineWidth (BootMenuData->HelpToken[Index]); StrWidth = GetLineWidth (BootMenuData->HelpToken[Index]);
MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth; MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth;
} }
// //
// query current row and column to calculate boot menu location // query current row and column to calculate boot menu location
// //
@ -253,31 +258,34 @@ InitializeBootMenuScreen (
&Row &Row
); );
MaxPrintRows = Row - 6; MaxPrintRows = Row - 6;
UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2; UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2;
if (MaxStrWidth + 8 > Column) { if (MaxStrWidth + 8 > Column) {
BootMenuData->MenuScreen.Width = Column; BootMenuData->MenuScreen.Width = Column;
} else { } else {
BootMenuData->MenuScreen.Width = MaxStrWidth + 8; BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
} }
if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) { if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
BootMenuData->MenuScreen.Height = MaxPrintRows; BootMenuData->MenuScreen.Height = MaxPrintRows;
BootMenuData->ScrollBarControl.HasScrollBar = TRUE; BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
BootMenuData->ScrollBarControl.ItemCountPerScreen = MaxPrintRows - UnSelectableItmes; BootMenuData->ScrollBarControl.ItemCountPerScreen = MaxPrintRows - UnSelectableItmes;
BootMenuData->ScrollBarControl.FirstItem = 0; BootMenuData->ScrollBarControl.FirstItem = 0;
BootMenuData->ScrollBarControl.LastItem = MaxPrintRows - UnSelectableItmes - 1; BootMenuData->ScrollBarControl.LastItem = MaxPrintRows - UnSelectableItmes - 1;
} else { } else {
BootMenuData->MenuScreen.Height = BootMenuData->ItemCount + UnSelectableItmes; BootMenuData->MenuScreen.Height = BootMenuData->ItemCount + UnSelectableItmes;
BootMenuData->ScrollBarControl.HasScrollBar = FALSE; BootMenuData->ScrollBarControl.HasScrollBar = FALSE;
BootMenuData->ScrollBarControl.ItemCountPerScreen = BootMenuData->ItemCount; BootMenuData->ScrollBarControl.ItemCountPerScreen = BootMenuData->ItemCount;
BootMenuData->ScrollBarControl.FirstItem = 0; BootMenuData->ScrollBarControl.FirstItem = 0;
BootMenuData->ScrollBarControl.LastItem = BootMenuData->ItemCount - 1; BootMenuData->ScrollBarControl.LastItem = BootMenuData->ItemCount - 1;
} }
BootMenuData->MenuScreen.StartCol = (Column - BootMenuData->MenuScreen.Width) / 2; BootMenuData->MenuScreen.StartCol = (Column - BootMenuData->MenuScreen.Width) / 2;
BootMenuData->MenuScreen.StartRow = (Row - BootMenuData->MenuScreen.Height) / 2; BootMenuData->MenuScreen.StartRow = (Row - BootMenuData->MenuScreen.Height) / 2;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
This function uses check boot option is wheher setup application or no This function uses check boot option is wheher setup application or no
@ -289,18 +297,18 @@ InitializeBootMenuScreen (
**/ **/
BOOLEAN BOOLEAN
IsBootManagerMenu ( IsBootManagerMenu (
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu; EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu;
Status = EfiBootManagerGetBootManagerMenu (&BootManagerMenu); Status = EfiBootManagerGetBootManagerMenu (&BootManagerMenu);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
EfiBootManagerFreeLoadOption (&BootManagerMenu); EfiBootManagerFreeLoadOption (&BootManagerMenu);
} }
return (BOOLEAN) (!EFI_ERROR (Status) && (BootOption->OptionNumber == BootManagerMenu.OptionNumber)); return (BOOLEAN)(!EFI_ERROR (Status) && (BootOption->OptionNumber == BootManagerMenu.OptionNumber));
} }
/** /**
@ -316,13 +324,13 @@ IgnoreBootOption (
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath; EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;
// //
// Ignore myself. // Ignore myself.
// //
Status = gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageDevicePathProtocolGuid, (VOID **) &ImageDevicePath); Status = gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageDevicePathProtocolGuid, (VOID **)&ImageDevicePath);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if (CompareMem (BootOption->FilePath, ImageDevicePath, GetDevicePathSize (ImageDevicePath)) == 0) { if (CompareMem (BootOption->FilePath, ImageDevicePath, GetDevicePathSize (ImageDevicePath)) == 0) {
return TRUE; return TRUE;
@ -363,10 +371,10 @@ InitializeBootMenuData (
OUT BOOT_MENU_POPUP_DATA *BootMenuData OUT BOOT_MENU_POPUP_DATA *BootMenuData
) )
{ {
UINTN Index; UINTN Index;
UINTN StrIndex; UINTN StrIndex;
if (BootOption == NULL || BootMenuData == NULL) { if ((BootOption == NULL) || (BootMenuData == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -391,7 +399,7 @@ InitializeBootMenuData (
); );
} }
BootMenuData->ItemCount = StrIndex; BootMenuData->ItemCount = StrIndex;
BootMenuData->HelpToken[0] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP1_STRING); BootMenuData->HelpToken[0] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP1_STRING);
BootMenuData->HelpToken[1] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP2_STRING); BootMenuData->HelpToken[1] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP2_STRING);
BootMenuData->HelpToken[2] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP3_STRING); BootMenuData->HelpToken[2] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP3_STRING);
@ -417,93 +425,101 @@ BootMenuSelectItem (
IN OUT BOOT_MENU_POPUP_DATA *BootMenuData IN OUT BOOT_MENU_POPUP_DATA *BootMenuData
) )
{ {
INT32 SavedAttribute; INT32 SavedAttribute;
EFI_STRING String; EFI_STRING String;
UINTN StartCol; UINTN StartCol;
UINTN StartRow; UINTN StartRow;
UINTN PrintCol; UINTN PrintCol;
UINTN PrintRow; UINTN PrintRow;
UINTN TopShadeNum; UINTN TopShadeNum;
UINTN LowShadeNum; UINTN LowShadeNum;
UINTN FirstItem; UINTN FirstItem;
UINTN LastItem; UINTN LastItem;
UINTN ItemCountPerScreen; UINTN ItemCountPerScreen;
UINTN Index; UINTN Index;
BOOLEAN RePaintItems; BOOLEAN RePaintItems;
if (BootMenuData == NULL || WantSelectItem >= BootMenuData->ItemCount) { if ((BootMenuData == NULL) || (WantSelectItem >= BootMenuData->ItemCount)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
ASSERT (BootMenuData->ItemCount != 0); ASSERT (BootMenuData->ItemCount != 0);
SavedAttribute = gST->ConOut->Mode->Attribute; SavedAttribute = gST->ConOut->Mode->Attribute;
RePaintItems = FALSE; RePaintItems = FALSE;
StartCol = BootMenuData->MenuScreen.StartCol; StartCol = BootMenuData->MenuScreen.StartCol;
StartRow = BootMenuData->MenuScreen.StartRow; StartRow = BootMenuData->MenuScreen.StartRow;
// //
// print selectable items again and adjust scroll bar if need // print selectable items again and adjust scroll bar if need
// //
if (BootMenuData->ScrollBarControl.HasScrollBar && if (BootMenuData->ScrollBarControl.HasScrollBar &&
(WantSelectItem < BootMenuData->ScrollBarControl.FirstItem || ((WantSelectItem < BootMenuData->ScrollBarControl.FirstItem) ||
WantSelectItem > BootMenuData->ScrollBarControl.LastItem || (WantSelectItem > BootMenuData->ScrollBarControl.LastItem) ||
WantSelectItem == BootMenuData->SelectItem)) { (WantSelectItem == BootMenuData->SelectItem)))
ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen; {
ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen;
// //
// Set first item and last item // Set first item and last item
// //
if (WantSelectItem < BootMenuData->ScrollBarControl.FirstItem) { if (WantSelectItem < BootMenuData->ScrollBarControl.FirstItem) {
BootMenuData->ScrollBarControl.FirstItem = WantSelectItem; BootMenuData->ScrollBarControl.FirstItem = WantSelectItem;
BootMenuData->ScrollBarControl.LastItem = WantSelectItem + ItemCountPerScreen - 1; BootMenuData->ScrollBarControl.LastItem = WantSelectItem + ItemCountPerScreen - 1;
} else if (WantSelectItem > BootMenuData->ScrollBarControl.LastItem) { } else if (WantSelectItem > BootMenuData->ScrollBarControl.LastItem) {
BootMenuData->ScrollBarControl.FirstItem = WantSelectItem - ItemCountPerScreen + 1; BootMenuData->ScrollBarControl.FirstItem = WantSelectItem - ItemCountPerScreen + 1;
BootMenuData->ScrollBarControl.LastItem = WantSelectItem; BootMenuData->ScrollBarControl.LastItem = WantSelectItem;
} }
gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE); gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE);
FirstItem = BootMenuData->ScrollBarControl.FirstItem; FirstItem = BootMenuData->ScrollBarControl.FirstItem;
LastItem = BootMenuData->ScrollBarControl.LastItem; LastItem = BootMenuData->ScrollBarControl.LastItem;
TopShadeNum = 0; TopShadeNum = 0;
if (FirstItem != 0) { if (FirstItem != 0) {
TopShadeNum = (FirstItem * ItemCountPerScreen) / BootMenuData->ItemCount; TopShadeNum = (FirstItem * ItemCountPerScreen) / BootMenuData->ItemCount;
if ((FirstItem * ItemCountPerScreen) % BootMenuData->ItemCount != 0) { if ((FirstItem * ItemCountPerScreen) % BootMenuData->ItemCount != 0) {
TopShadeNum++; TopShadeNum++;
} }
PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2; PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2;
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2; PrintRow = StartRow + TITLE_TOKEN_COUNT + 2;
for (Index = 0; Index < TopShadeNum; Index++, PrintRow++) { for (Index = 0; Index < TopShadeNum; Index++, PrintRow++) {
PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_LIGHT_SHADE); PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_LIGHT_SHADE);
} }
} }
LowShadeNum = 0; LowShadeNum = 0;
if (LastItem != BootMenuData->ItemCount - 1) { if (LastItem != BootMenuData->ItemCount - 1) {
LowShadeNum = ((BootMenuData->ItemCount - 1 - LastItem) * ItemCountPerScreen) / BootMenuData->ItemCount; LowShadeNum = ((BootMenuData->ItemCount - 1 - LastItem) * ItemCountPerScreen) / BootMenuData->ItemCount;
if (((BootMenuData->ItemCount - 1 - LastItem) * ItemCountPerScreen) % BootMenuData->ItemCount != 0) { if (((BootMenuData->ItemCount - 1 - LastItem) * ItemCountPerScreen) % BootMenuData->ItemCount != 0) {
LowShadeNum++; LowShadeNum++;
} }
PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2; PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2;
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + ItemCountPerScreen - LowShadeNum; PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + ItemCountPerScreen - LowShadeNum;
for (Index = 0; Index < LowShadeNum; Index++, PrintRow++) { for (Index = 0; Index < LowShadeNum; Index++, PrintRow++) {
PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_LIGHT_SHADE); PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_LIGHT_SHADE);
} }
} }
PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2; PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2;
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + TopShadeNum; PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + TopShadeNum;
for (Index = TopShadeNum; Index < ItemCountPerScreen - LowShadeNum; Index++, PrintRow++) { for (Index = TopShadeNum; Index < ItemCountPerScreen - LowShadeNum; Index++, PrintRow++) {
PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_FULL_BLOCK); PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_FULL_BLOCK);
} }
// //
// Clear selectable items first // Clear selectable items first
// //
PrintCol = StartCol + 1; PrintCol = StartCol + 1;
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2; PrintRow = StartRow + TITLE_TOKEN_COUNT + 2;
String = AllocateZeroPool ((BootMenuData->MenuScreen.Width - 2) * sizeof (CHAR16)); String = AllocateZeroPool ((BootMenuData->MenuScreen.Width - 2) * sizeof (CHAR16));
ASSERT (String != NULL); ASSERT (String != NULL);
for (Index = 0; Index < BootMenuData->MenuScreen.Width - 3; Index++) { for (Index = 0; Index < BootMenuData->MenuScreen.Width - 3; Index++) {
String[Index] = 0x20; String[Index] = 0x20;
} }
for (Index = 0; Index < ItemCountPerScreen; Index++) { for (Index = 0; Index < ItemCountPerScreen; Index++) {
PrintStringAt (PrintCol, PrintRow + Index, String); PrintStringAt (PrintCol, PrintRow + Index, String);
} }
FreePool (String); FreePool (String);
// //
// print selectable items // print selectable items
@ -513,6 +529,7 @@ BootMenuSelectItem (
PrintStringAt (PrintCol, PrintRow, String); PrintStringAt (PrintCol, PrintRow, String);
FreePool (String); FreePool (String);
} }
RePaintItems = TRUE; RePaintItems = TRUE;
} }
@ -521,9 +538,9 @@ BootMenuSelectItem (
// items, clear select item // items, clear select item
// //
FirstItem = BootMenuData->ScrollBarControl.FirstItem; FirstItem = BootMenuData->ScrollBarControl.FirstItem;
if (WantSelectItem != BootMenuData->SelectItem && !RePaintItems) { if ((WantSelectItem != BootMenuData->SelectItem) && !RePaintItems) {
gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE); gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE);
String = HiiGetString (gStringPackHandle, BootMenuData->PtrTokens[BootMenuData->SelectItem], NULL); String = HiiGetString (gStringPackHandle, BootMenuData->PtrTokens[BootMenuData->SelectItem], NULL);
PrintCol = StartCol + 1; PrintCol = StartCol + 1;
PrintRow = StartRow + 3 + BootMenuData->SelectItem - FirstItem; PrintRow = StartRow + 3 + BootMenuData->SelectItem - FirstItem;
PrintStringAt (PrintCol, PrintRow, String); PrintStringAt (PrintCol, PrintRow, String);
@ -534,7 +551,7 @@ BootMenuSelectItem (
// Print want to select item // Print want to select item
// //
gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLACK); gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLACK);
String = HiiGetString (gStringPackHandle, BootMenuData->PtrTokens[WantSelectItem], NULL); String = HiiGetString (gStringPackHandle, BootMenuData->PtrTokens[WantSelectItem], NULL);
PrintCol = StartCol + 1; PrintCol = StartCol + 1;
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + WantSelectItem - FirstItem; PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + WantSelectItem - FirstItem;
PrintStringAt (PrintCol, PrintRow, String); PrintStringAt (PrintCol, PrintRow, String);
@ -558,26 +575,26 @@ DrawBootPopupMenu (
IN BOOT_MENU_POPUP_DATA *BootMenuData IN BOOT_MENU_POPUP_DATA *BootMenuData
) )
{ {
EFI_STRING String; EFI_STRING String;
UINTN Index; UINTN Index;
UINTN Width; UINTN Width;
UINTN StartCol; UINTN StartCol;
UINTN StartRow; UINTN StartRow;
UINTN PrintRow; UINTN PrintRow;
UINTN PrintCol; UINTN PrintCol;
UINTN LineWidth; UINTN LineWidth;
INT32 SavedAttribute; INT32 SavedAttribute;
UINTN ItemCountPerScreen; UINTN ItemCountPerScreen;
gST->ConOut->ClearScreen (gST->ConOut); gST->ConOut->ClearScreen (gST->ConOut);
SavedAttribute = gST->ConOut->Mode->Attribute; SavedAttribute = gST->ConOut->Mode->Attribute;
gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE); gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE);
Width = BootMenuData->MenuScreen.Width; Width = BootMenuData->MenuScreen.Width;
StartCol = BootMenuData->MenuScreen.StartCol; StartCol = BootMenuData->MenuScreen.StartCol;
StartRow = BootMenuData->MenuScreen.StartRow; StartRow = BootMenuData->MenuScreen.StartRow;
ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen; ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen;
PrintRow = StartRow; PrintRow = StartRow;
gST->ConOut->EnableCursor (gST->ConOut, FALSE); gST->ConOut->EnableCursor (gST->ConOut, FALSE);
// //
@ -587,6 +604,7 @@ DrawBootPopupMenu (
for (Index = 1; Index < Width - 1; Index++) { for (Index = 1; Index < Width - 1; Index++) {
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL); PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
} }
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_DOWN_LEFT); PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_DOWN_LEFT);
// //
@ -610,6 +628,7 @@ DrawBootPopupMenu (
for (Index = 1; Index < Width - 1; Index++) { for (Index = 1; Index < Width - 1; Index++) {
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL); PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
} }
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL_LEFT); PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL_LEFT);
// //
@ -627,6 +646,7 @@ DrawBootPopupMenu (
for (Index = 1; Index < Width - 1; Index++) { for (Index = 1; Index < Width - 1; Index++) {
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL); PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
} }
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL_LEFT); PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL_LEFT);
// //
@ -638,6 +658,7 @@ DrawBootPopupMenu (
PrintStringAt (StartCol + 1, PrintRow, String); PrintStringAt (StartCol + 1, PrintRow, String);
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL); PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL);
} }
FreePool (String); FreePool (String);
PrintRow++; PrintRow++;
@ -645,17 +666,17 @@ DrawBootPopupMenu (
for (Index = 1; Index < Width - 1; Index++) { for (Index = 1; Index < Width - 1; Index++) {
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL); PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
} }
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_UP_LEFT);
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_UP_LEFT);
// //
// print title strings // print title strings
// //
PrintRow = StartRow + 1; PrintRow = StartRow + 1;
for (Index = 0; Index < TITLE_TOKEN_COUNT; Index++, PrintRow++) { for (Index = 0; Index < TITLE_TOKEN_COUNT; Index++, PrintRow++) {
String = HiiGetString (gStringPackHandle, BootMenuData->TitleToken[Index], NULL); String = HiiGetString (gStringPackHandle, BootMenuData->TitleToken[Index], NULL);
LineWidth = GetLineWidth (BootMenuData->TitleToken[Index]); LineWidth = GetLineWidth (BootMenuData->TitleToken[Index]);
PrintCol = StartCol + (Width - LineWidth) / 2; PrintCol = StartCol + (Width - LineWidth) / 2;
PrintStringAt (PrintCol, PrintRow, String); PrintStringAt (PrintCol, PrintRow, String);
FreePool (String); FreePool (String);
} }
@ -676,9 +697,9 @@ DrawBootPopupMenu (
// //
PrintRow++; PrintRow++;
for (Index = 0; Index < HELP_TOKEN_COUNT; Index++, PrintRow++) { for (Index = 0; Index < HELP_TOKEN_COUNT; Index++, PrintRow++) {
String = HiiGetString (gStringPackHandle, BootMenuData->HelpToken[Index], NULL); String = HiiGetString (gStringPackHandle, BootMenuData->HelpToken[Index], NULL);
LineWidth = GetLineWidth (BootMenuData->HelpToken[Index]); LineWidth = GetLineWidth (BootMenuData->HelpToken[Index]);
PrintCol = StartCol + (Width - LineWidth) / 2; PrintCol = StartCol + (Width - LineWidth) / 2;
PrintStringAt (PrintCol, PrintRow, String); PrintStringAt (PrintCol, PrintRow, String);
FreePool (String); FreePool (String);
} }
@ -718,8 +739,8 @@ BootFromSelectOption (
IN UINTN SelectItem IN UINTN SelectItem
) )
{ {
UINTN ItemNum; UINTN ItemNum;
UINTN Index; UINTN Index;
ASSERT (BootOptions != NULL); ASSERT (BootOptions != NULL);
@ -778,7 +799,7 @@ BdsSetConsoleMode (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiGraphicsOutputProtocolGuid, &gEfiGraphicsOutputProtocolGuid,
(VOID**)&GraphicsOutput (VOID **)&GraphicsOutput
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
GraphicsOutput = NULL; GraphicsOutput = NULL;
@ -787,7 +808,7 @@ BdsSetConsoleMode (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiSimpleTextOutProtocolGuid, &gEfiSimpleTextOutProtocolGuid,
(VOID**)&SimpleTextOut (VOID **)&SimpleTextOut
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
SimpleTextOut = NULL; SimpleTextOut = NULL;
@ -816,7 +837,7 @@ BdsSetConsoleMode (
} }
if (GraphicsOutput != NULL) { if (GraphicsOutput != NULL) {
MaxGopMode = GraphicsOutput->Mode->MaxMode; MaxGopMode = GraphicsOutput->Mode->MaxMode;
} }
if (SimpleTextOut != NULL) { if (SimpleTextOut != NULL) {
@ -832,22 +853,24 @@ BdsSetConsoleMode (
// //
for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) { for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {
Status = GraphicsOutput->QueryMode ( Status = GraphicsOutput->QueryMode (
GraphicsOutput, GraphicsOutput,
ModeNumber, ModeNumber,
&SizeOfInfo, &SizeOfInfo,
&Info &Info
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
if ((Info->HorizontalResolution == NewHorizontalResolution) && if ((Info->HorizontalResolution == NewHorizontalResolution) &&
(Info->VerticalResolution == NewVerticalResolution)) { (Info->VerticalResolution == NewVerticalResolution))
{
if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) && if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&
(GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) { (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution))
{
// //
// Current resolution is same with required resolution, check if text mode need be set // Current resolution is same with required resolution, check if text mode need be set
// //
Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow); Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if (CurrentColumn == NewColumns && CurrentRow == NewRows) { if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {
// //
// If current text mode is same with required text mode. Do nothing // If current text mode is same with required text mode. Do nothing
// //
@ -859,7 +882,7 @@ BdsSetConsoleMode (
// //
for (Index = 0; Index < MaxTextMode; Index++) { for (Index = 0; Index < MaxTextMode; Index++) {
Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow); Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);
if (!EFI_ERROR(Status)) { if (!EFI_ERROR (Status)) {
if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) { if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {
// //
// Required text mode is supported, set it. // Required text mode is supported, set it.
@ -878,6 +901,7 @@ BdsSetConsoleMode (
} }
} }
} }
if (Index == MaxTextMode) { if (Index == MaxTextMode) {
// //
// If required text mode is not supported, return error. // If required text mode is not supported, return error.
@ -898,6 +922,7 @@ BdsSetConsoleMode (
} }
} }
} }
FreePool (Info); FreePool (Info);
} }
} }
@ -928,19 +953,21 @@ BdsSetConsoleMode (
// Locate all the handles with GOP protocol and reconnect it. // Locate all the handles with GOP protocol and reconnect it.
// //
Status = gBS->LocateHandleBuffer ( Status = gBS->LocateHandleBuffer (
ByProtocol, ByProtocol,
&gEfiSimpleTextOutProtocolGuid, &gEfiSimpleTextOutProtocolGuid,
NULL, NULL,
&HandleCount, &HandleCount,
&HandleBuffer &HandleBuffer
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
gBS->DisconnectController (HandleBuffer[Index], NULL, NULL); gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
} }
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE); gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
} }
if (HandleBuffer != NULL) { if (HandleBuffer != NULL) {
FreePool (HandleBuffer); FreePool (HandleBuffer);
} }
@ -962,29 +989,29 @@ BdsSetConsoleMode (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
BootManagerMenuEntry ( BootManagerMenuEntry (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_BOOT_MANAGER_LOAD_OPTION *BootOption; EFI_BOOT_MANAGER_LOAD_OPTION *BootOption;
UINTN BootOptionCount; UINTN BootOptionCount;
EFI_STATUS Status; EFI_STATUS Status;
BOOT_MENU_POPUP_DATA BootMenuData; BOOT_MENU_POPUP_DATA BootMenuData;
UINTN Index; UINTN Index;
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
BOOLEAN ExitApplication; BOOLEAN ExitApplication;
UINTN SelectItem; UINTN SelectItem;
EFI_BOOT_LOGO_PROTOCOL *BootLogo; EFI_BOOT_LOGO_PROTOCOL *BootLogo;
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
UINTN BootTextColumn; UINTN BootTextColumn;
UINTN BootTextRow; UINTN BootTextRow;
// //
// Set Logo status invalid when boot manager menu is launched // Set Logo status invalid when boot manager menu is launched
// //
BootLogo = NULL; BootLogo = NULL;
Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo); Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **)&BootLogo);
if (!EFI_ERROR (Status) && (BootLogo != NULL)) { if (!EFI_ERROR (Status) && (BootLogo != NULL)) {
Status = BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0); Status = BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -993,11 +1020,11 @@ BootManagerMenuEntry (
gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL); gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
gStringPackHandle = HiiAddPackages ( gStringPackHandle = HiiAddPackages (
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
gImageHandle, gImageHandle,
BootManagerMenuAppStrings, BootManagerMenuAppStrings,
NULL NULL
); );
ASSERT (gStringPackHandle != NULL); ASSERT (gStringPackHandle != NULL);
// //
@ -1016,7 +1043,7 @@ BootManagerMenuEntry (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiGraphicsOutputProtocolGuid, &gEfiGraphicsOutputProtocolGuid,
(VOID**)&GraphicsOutput (VOID **)&GraphicsOutput
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
GraphicsOutput = NULL; GraphicsOutput = NULL;
@ -1025,7 +1052,7 @@ BootManagerMenuEntry (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiSimpleTextOutProtocolGuid, &gEfiSimpleTextOutProtocolGuid,
(VOID**)&SimpleTextOut (VOID **)&SimpleTextOut
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
SimpleTextOut = NULL; SimpleTextOut = NULL;
@ -1083,58 +1110,57 @@ BootManagerMenuEntry (
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key); Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
switch (Key.UnicodeChar) { switch (Key.UnicodeChar) {
case CHAR_NULL:
switch (Key.ScanCode) {
case SCAN_UP:
SelectItem = BootMenuData.SelectItem == 0 ? BootMenuData.ItemCount - 1 : BootMenuData.SelectItem - 1;
BootMenuSelectItem (SelectItem, &BootMenuData);
break;
case CHAR_NULL: case SCAN_DOWN:
switch (Key.ScanCode) { SelectItem = BootMenuData.SelectItem == BootMenuData.ItemCount - 1 ? 0 : BootMenuData.SelectItem + 1;
BootMenuSelectItem (SelectItem, &BootMenuData);
break;
case SCAN_ESC:
gST->ConOut->ClearScreen (gST->ConOut);
ExitApplication = TRUE;
//
// Set boot resolution for normal boot
//
BdsSetConsoleMode (FALSE);
break;
default:
break;
}
case SCAN_UP:
SelectItem = BootMenuData.SelectItem == 0 ? BootMenuData.ItemCount - 1 : BootMenuData.SelectItem - 1;
BootMenuSelectItem (SelectItem, &BootMenuData);
break; break;
case SCAN_DOWN: case CHAR_CARRIAGE_RETURN:
SelectItem = BootMenuData.SelectItem == BootMenuData.ItemCount - 1 ? 0 : BootMenuData.SelectItem + 1;
BootMenuSelectItem (SelectItem, &BootMenuData);
break;
case SCAN_ESC:
gST->ConOut->ClearScreen (gST->ConOut); gST->ConOut->ClearScreen (gST->ConOut);
ExitApplication = TRUE;
// //
// Set boot resolution for normal boot // Set boot resolution for normal boot
// //
BdsSetConsoleMode (FALSE); BdsSetConsoleMode (FALSE);
BootFromSelectOption (BootOption, BootOptionCount, BootMenuData.SelectItem);
//
// Back to boot manager menu again, set back to setup resolution
//
BdsSetConsoleMode (TRUE);
DrawBootPopupMenu (&BootMenuData);
break; break;
default: default:
break; break;
}
break;
case CHAR_CARRIAGE_RETURN:
gST->ConOut->ClearScreen (gST->ConOut);
//
// Set boot resolution for normal boot
//
BdsSetConsoleMode (FALSE);
BootFromSelectOption (BootOption, BootOptionCount, BootMenuData.SelectItem);
//
// Back to boot manager menu again, set back to setup resolution
//
BdsSetConsoleMode (TRUE);
DrawBootPopupMenu (&BootMenuData);
break;
default:
break;
} }
} }
} }
EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount); EfiBootManagerFreeLoadOptions (BootOption, BootOptionCount);
FreePool (BootMenuData.PtrTokens); FreePool (BootMenuData.PtrTokens);
HiiRemovePackages (gStringPackHandle); HiiRemovePackages (gStringPackHandle);
return Status; return Status;
} }

View File

@ -6,7 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef _BOOT_MANAGER_MENU_H_ #ifndef _BOOT_MANAGER_MENU_H_
#define _BOOT_MANAGER_MENU_H_ #define _BOOT_MANAGER_MENU_H_
@ -23,21 +22,21 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Protocol/LoadedImage.h> #include <Protocol/LoadedImage.h>
#include <Protocol/BootLogo.h> #include <Protocol/BootLogo.h>
#define TITLE_TOKEN_COUNT 1 #define TITLE_TOKEN_COUNT 1
#define HELP_TOKEN_COUNT 3 #define HELP_TOKEN_COUNT 3
typedef struct _BOOT_MENU_SCREEN { typedef struct _BOOT_MENU_SCREEN {
UINTN StartCol; UINTN StartCol;
UINTN StartRow; UINTN StartRow;
UINTN Width; UINTN Width;
UINTN Height; UINTN Height;
} BOOT_MENU_SCREEN; } BOOT_MENU_SCREEN;
typedef struct _BOOT_MENU_SCROLL_BAR_CONTROL { typedef struct _BOOT_MENU_SCROLL_BAR_CONTROL {
BOOLEAN HasScrollBar; BOOLEAN HasScrollBar;
UINTN ItemCountPerScreen; UINTN ItemCountPerScreen;
UINTN FirstItem; UINTN FirstItem;
UINTN LastItem; UINTN LastItem;
} BOOT_MENU_SCROLL_BAR_CONTROL; } BOOT_MENU_SCROLL_BAR_CONTROL;
typedef struct _BOOT_MENU_POPUP_DATA { typedef struct _BOOT_MENU_POPUP_DATA {
@ -51,4 +50,3 @@ typedef struct _BOOT_MENU_POPUP_DATA {
} BOOT_MENU_POPUP_DATA; } BOOT_MENU_POPUP_DATA;
#endif #endif

View File

@ -8,9 +8,9 @@
#include "CapsuleApp.h" #include "CapsuleApp.h"
UINTN Argc; UINTN Argc;
CHAR16 **Argv; CHAR16 **Argv;
EFI_SHELL_PROTOCOL *mShellProtocol = NULL; EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
/** /**
@ -23,15 +23,15 @@ GetArg (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters; EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gImageHandle, gImageHandle,
&gEfiShellParametersProtocolGuid, &gEfiShellParametersProtocolGuid,
(VOID**)&ShellParameters (VOID **)&ShellParameters
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -50,13 +50,13 @@ GetShellProtocol (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
if (mShellProtocol == NULL) { if (mShellProtocol == NULL) {
Status = gBS->LocateProtocol ( Status = gBS->LocateProtocol (
&gEfiShellProtocolGuid, &gEfiShellProtocolGuid,
NULL, NULL,
(VOID **) &mShellProtocol (VOID **)&mShellProtocol
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
mShellProtocol = NULL; mShellProtocol = NULL;
@ -79,19 +79,19 @@ GetShellProtocol (
**/ **/
EFI_STATUS EFI_STATUS
ReadFileToBuffer ( ReadFileToBuffer (
IN CHAR16 *FileName, IN CHAR16 *FileName,
OUT UINTN *BufferSize, OUT UINTN *BufferSize,
OUT VOID **Buffer OUT VOID **Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SHELL_PROTOCOL *ShellProtocol; EFI_SHELL_PROTOCOL *ShellProtocol;
SHELL_FILE_HANDLE Handle; SHELL_FILE_HANDLE Handle;
UINT64 FileSize; UINT64 FileSize;
UINTN TempBufferSize; UINTN TempBufferSize;
VOID *TempBuffer; VOID *TempBuffer;
ShellProtocol = GetShellProtocol(); ShellProtocol = GetShellProtocol ();
if (ShellProtocol == NULL) { if (ShellProtocol == NULL) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -117,8 +117,8 @@ ReadFileToBuffer (
return Status; return Status;
} }
TempBufferSize = (UINTN) FileSize; TempBufferSize = (UINTN)FileSize;
TempBuffer = AllocateZeroPool (TempBufferSize); TempBuffer = AllocateZeroPool (TempBufferSize);
if (TempBuffer == NULL) { if (TempBuffer == NULL) {
ShellProtocol->CloseFile (Handle); ShellProtocol->CloseFile (Handle);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -157,18 +157,18 @@ ReadFileToBuffer (
**/ **/
EFI_STATUS EFI_STATUS
WriteFileFromBuffer ( WriteFileFromBuffer (
IN CHAR16 *FileName, IN CHAR16 *FileName,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SHELL_PROTOCOL *ShellProtocol; EFI_SHELL_PROTOCOL *ShellProtocol;
SHELL_FILE_HANDLE Handle; SHELL_FILE_HANDLE Handle;
EFI_FILE_INFO *FileInfo; EFI_FILE_INFO *FileInfo;
UINTN TempBufferSize; UINTN TempBufferSize;
ShellProtocol = GetShellProtocol(); ShellProtocol = GetShellProtocol ();
if (ShellProtocol == NULL) { if (ShellProtocol == NULL) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -202,24 +202,25 @@ WriteFileFromBuffer (
// Set the file size to 0. // Set the file size to 0.
// //
FileInfo->FileSize = 0; FileInfo->FileSize = 0;
Status = ShellProtocol->SetFileInfo (Handle, FileInfo); Status = ShellProtocol->SetFileInfo (Handle, FileInfo);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
FreePool (FileInfo); FreePool (FileInfo);
ShellProtocol->CloseFile (Handle); ShellProtocol->CloseFile (Handle);
return Status; return Status;
} }
} }
FreePool (FileInfo); FreePool (FileInfo);
// //
// Write the file data from the buffer // Write the file data from the buffer
// //
TempBufferSize = BufferSize; TempBufferSize = BufferSize;
Status = ShellProtocol->WriteFile ( Status = ShellProtocol->WriteFile (
Handle, Handle,
&TempBufferSize, &TempBufferSize,
Buffer Buffer
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
ShellProtocol->CloseFile (Handle); ShellProtocol->CloseFile (Handle);
return Status; return Status;
@ -229,4 +230,3 @@ WriteFileFromBuffer (
return EFI_SUCCESS; return EFI_SUCCESS;
} }

View File

@ -27,52 +27,54 @@ CreateBmpFmp (
VOID VOID
) )
{ {
CHAR16 *OutputCapsuleName; CHAR16 *OutputCapsuleName;
VOID *BmpBuffer; VOID *BmpBuffer;
UINTN FileSize; UINTN FileSize;
CHAR16 *BmpName; CHAR16 *BmpName;
UINT8 *FullCapsuleBuffer; UINT8 *FullCapsuleBuffer;
UINTN FullCapsuleBufferSize; UINTN FullCapsuleBufferSize;
EFI_DISPLAY_CAPSULE *DisplayCapsule; EFI_DISPLAY_CAPSULE *DisplayCapsule;
EFI_STATUS Status; EFI_STATUS Status;
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop; EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info; EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt; EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
UINTN GopBltSize; UINTN GopBltSize;
UINTN Height; UINTN Height;
UINTN Width; UINTN Width;
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop); Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"CapsuleApp: NO GOP is found.\n"); Print (L"CapsuleApp: NO GOP is found.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
Info = Gop->Mode->Info; Info = Gop->Mode->Info;
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode); Print (L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution); Print (L"HorizontalResolution - %d, ", Info->HorizontalResolution);
Print(L"VerticalResolution - %d\n", Info->VerticalResolution); Print (L"VerticalResolution - %d\n", Info->VerticalResolution);
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth // HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight // VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
if (Argc != 5) { if (Argc != 5) {
Print(L"CapsuleApp: Incorrect parameter count.\n"); Print (L"CapsuleApp: Incorrect parameter count.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
if (StrCmp(Argv[3], L"-O") != 0) { if (StrCmp (Argv[3], L"-O") != 0) {
Print(L"CapsuleApp: NO output capsule name.\n"); Print (L"CapsuleApp: NO output capsule name.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
OutputCapsuleName = Argv[4]; OutputCapsuleName = Argv[4];
BmpBuffer = NULL; BmpBuffer = NULL;
FileSize = 0; FileSize = 0;
FullCapsuleBuffer = NULL; FullCapsuleBuffer = NULL;
BmpName = Argv[2]; BmpName = Argv[2];
Status = ReadFileToBuffer(BmpName, &FileSize, &BmpBuffer); Status = ReadFileToBuffer (BmpName, &FileSize, &BmpBuffer);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"CapsuleApp: BMP image (%s) is not found.\n", BmpName); Print (L"CapsuleApp: BMP image (%s) is not found.\n", BmpName);
goto Done; goto Done;
} }
@ -85,45 +87,48 @@ CreateBmpFmp (
&Height, &Height,
&Width &Width
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName); Print (L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
goto Done; goto Done;
} }
if (GopBlt != NULL) { if (GopBlt != NULL) {
FreePool (GopBlt); FreePool (GopBlt);
} }
Print(L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
Print (L"BMP image (%s), Width - %d, Height - %d\n", BmpName, Width, Height);
if (Height > Info->VerticalResolution) { if (Height > Info->VerticalResolution) {
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
Print(L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName); Print (L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
goto Done;
}
if (Width > Info->HorizontalResolution) {
Status = EFI_INVALID_PARAMETER;
Print(L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
goto Done; goto Done;
} }
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize; if (Width > Info->HorizontalResolution) {
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize); Status = EFI_INVALID_PARAMETER;
Print (L"CapsuleApp: BMP image (%s) width is larger than current resolution.\n", BmpName);
goto Done;
}
FullCapsuleBufferSize = sizeof (EFI_DISPLAY_CAPSULE) + FileSize;
FullCapsuleBuffer = AllocatePool (FullCapsuleBufferSize);
if (FullCapsuleBuffer == NULL) { if (FullCapsuleBuffer == NULL) {
Print(L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize); Print (L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Done; goto Done;
} }
DisplayCapsule = (EFI_DISPLAY_CAPSULE *)FullCapsuleBuffer; DisplayCapsule = (EFI_DISPLAY_CAPSULE *)FullCapsuleBuffer;
CopyGuid(&DisplayCapsule->CapsuleHeader.CapsuleGuid, &gWindowsUxCapsuleGuid); CopyGuid (&DisplayCapsule->CapsuleHeader.CapsuleGuid, &gWindowsUxCapsuleGuid);
DisplayCapsule->CapsuleHeader.HeaderSize = sizeof(DisplayCapsule->CapsuleHeader); DisplayCapsule->CapsuleHeader.HeaderSize = sizeof (DisplayCapsule->CapsuleHeader);
DisplayCapsule->CapsuleHeader.Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET; DisplayCapsule->CapsuleHeader.Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
DisplayCapsule->CapsuleHeader.CapsuleImageSize = (UINT32)FullCapsuleBufferSize; DisplayCapsule->CapsuleHeader.CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
DisplayCapsule->ImagePayload.Version = 1; DisplayCapsule->ImagePayload.Version = 1;
DisplayCapsule->ImagePayload.Checksum = 0; DisplayCapsule->ImagePayload.Checksum = 0;
DisplayCapsule->ImagePayload.ImageType = 0; // BMP DisplayCapsule->ImagePayload.ImageType = 0; // BMP
DisplayCapsule->ImagePayload.Reserved = 0; DisplayCapsule->ImagePayload.Reserved = 0;
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode; DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
// //
// Center the bitmap horizontally // Center the bitmap horizontally
@ -140,26 +145,27 @@ CreateBmpFmp (
(UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4) (UINT32)(((3 * Info->VerticalResolution) - (2 * Height)) / 4)
); );
Print(L"BMP image (%s), OffsetX - %d, OffsetY - %d\n", Print (
L"BMP image (%s), OffsetX - %d, OffsetY - %d\n",
BmpName, BmpName,
DisplayCapsule->ImagePayload.OffsetX, DisplayCapsule->ImagePayload.OffsetX,
DisplayCapsule->ImagePayload.OffsetY DisplayCapsule->ImagePayload.OffsetY
); );
CopyMem((DisplayCapsule + 1), BmpBuffer, FileSize); CopyMem ((DisplayCapsule + 1), BmpBuffer, FileSize);
DisplayCapsule->ImagePayload.Checksum = CalculateCheckSum8(FullCapsuleBuffer, FullCapsuleBufferSize); DisplayCapsule->ImagePayload.Checksum = CalculateCheckSum8 (FullCapsuleBuffer, FullCapsuleBufferSize);
Status = WriteFileFromBuffer(OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer); Status = WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
Print(L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status); Print (L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
Done: Done:
if (BmpBuffer != NULL) { if (BmpBuffer != NULL) {
FreePool(BmpBuffer); FreePool (BmpBuffer);
} }
if (FullCapsuleBuffer != NULL) { if (FullCapsuleBuffer != NULL) {
FreePool(FullCapsuleBuffer); FreePool (FullCapsuleBuffer);
} }
return Status; return Status;
@ -174,18 +180,19 @@ Done:
**/ **/
EFI_GUID * EFI_GUID *
GetCapsuleImageTypeId ( GetCapsuleImageTypeId (
IN EFI_CAPSULE_HEADER *CapsuleHeader IN EFI_CAPSULE_HEADER *CapsuleHeader
) )
{ {
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader; EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;
UINT64 *ItemOffsetList; UINT64 *ItemOffsetList;
EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader; EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;
FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize); FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1); ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);
if (FmpCapsuleHeader->PayloadItemCount == 0) { if (FmpCapsuleHeader->PayloadItemCount == 0) {
return NULL; return NULL;
} }
ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[FmpCapsuleHeader->EmbeddedDriverCount]); ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[FmpCapsuleHeader->EmbeddedDriverCount]);
return &ImageHeader->UpdateImageTypeId; return &ImageHeader->UpdateImageTypeId;
} }
@ -199,7 +206,7 @@ GetCapsuleImageTypeId (
**/ **/
UINT32 UINT32
GetEsrtFwType ( GetEsrtFwType (
IN EFI_GUID *ImageTypeId IN EFI_GUID *ImageTypeId
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -210,12 +217,12 @@ GetEsrtFwType (
// //
// Check ESRT // Check ESRT
// //
Status = EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid, (VOID **)&Esrt); Status = EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
if (!EFI_ERROR(Status)) { if (!EFI_ERROR (Status)) {
ASSERT(Esrt != NULL); ASSERT (Esrt != NULL);
EsrtEntry = (VOID *)(Esrt + 1); EsrtEntry = (VOID *)(Esrt + 1);
for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) { for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) {
if (CompareGuid(&EsrtEntry->FwClass, ImageTypeId)) { if (CompareGuid (&EsrtEntry->FwClass, ImageTypeId)) {
return EsrtEntry->FwType; return EsrtEntry->FwType;
} }
} }
@ -238,19 +245,22 @@ GetEsrtFwType (
**/ **/
BOOLEAN BOOLEAN
IsValidCapsuleHeader ( IsValidCapsuleHeader (
IN EFI_CAPSULE_HEADER *CapsuleHeader, IN EFI_CAPSULE_HEADER *CapsuleHeader,
IN UINT64 CapsuleSize IN UINT64 CapsuleSize
) )
{ {
if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) { if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {
return FALSE; return FALSE;
} }
if (CapsuleHeader->CapsuleImageSize != CapsuleSize) { if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {
return FALSE; return FALSE;
} }
if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) { if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {
return FALSE; return FALSE;
} }
if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) { if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {
return FALSE; return FALSE;
} }
@ -271,7 +281,7 @@ IsFmpCapsuleGuid (
IN EFI_GUID *CapsuleGuid IN EFI_GUID *CapsuleGuid
) )
{ {
if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) { if (CompareGuid (&gEfiFmpCapsuleGuid, CapsuleGuid)) {
return TRUE; return TRUE;
} }
@ -291,96 +301,98 @@ CreateNestedFmp (
VOID VOID
) )
{ {
CHAR16 *OutputCapsuleName; CHAR16 *OutputCapsuleName;
VOID *CapsuleBuffer; VOID *CapsuleBuffer;
UINTN FileSize; UINTN FileSize;
CHAR16 *CapsuleName; CHAR16 *CapsuleName;
UINT8 *FullCapsuleBuffer; UINT8 *FullCapsuleBuffer;
UINTN FullCapsuleBufferSize; UINTN FullCapsuleBufferSize;
EFI_CAPSULE_HEADER *NestedCapsuleHeader; EFI_CAPSULE_HEADER *NestedCapsuleHeader;
EFI_GUID *ImageTypeId; EFI_GUID *ImageTypeId;
UINT32 FwType; UINT32 FwType;
EFI_STATUS Status; EFI_STATUS Status;
if (Argc != 5) { if (Argc != 5) {
Print(L"CapsuleApp: Incorrect parameter count.\n"); Print (L"CapsuleApp: Incorrect parameter count.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
if (StrCmp(Argv[3], L"-O") != 0) { if (StrCmp (Argv[3], L"-O") != 0) {
Print(L"CapsuleApp: NO output capsule name.\n"); Print (L"CapsuleApp: NO output capsule name.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
OutputCapsuleName = Argv[4]; OutputCapsuleName = Argv[4];
CapsuleBuffer = NULL; CapsuleBuffer = NULL;
FileSize = 0; FileSize = 0;
FullCapsuleBuffer = NULL; FullCapsuleBuffer = NULL;
CapsuleName = Argv[2]; CapsuleName = Argv[2];
Status = ReadFileToBuffer(CapsuleName, &FileSize, &CapsuleBuffer); Status = ReadFileToBuffer (CapsuleName, &FileSize, &CapsuleBuffer);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName); Print (L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);
goto Done; goto Done;
} }
if (!IsValidCapsuleHeader (CapsuleBuffer, FileSize)) { if (!IsValidCapsuleHeader (CapsuleBuffer, FileSize)) {
Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName); Print (L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
goto Done; goto Done;
} }
if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *) CapsuleBuffer)->CapsuleGuid)) { if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *)CapsuleBuffer)->CapsuleGuid)) {
Print(L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName); Print (L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
goto Done; goto Done;
} }
ImageTypeId = GetCapsuleImageTypeId(CapsuleBuffer); ImageTypeId = GetCapsuleImageTypeId (CapsuleBuffer);
if (ImageTypeId == NULL) { if (ImageTypeId == NULL) {
Print(L"CapsuleApp: Capsule ImageTypeId is not found.\n"); Print (L"CapsuleApp: Capsule ImageTypeId is not found.\n");
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
goto Done; goto Done;
} }
FwType = GetEsrtFwType(ImageTypeId);
FwType = GetEsrtFwType (ImageTypeId);
if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) { if ((FwType != ESRT_FW_TYPE_SYSTEMFIRMWARE) && (FwType != ESRT_FW_TYPE_DEVICEFIRMWARE)) {
Print(L"CapsuleApp: Capsule FwType is invalid.\n"); Print (L"CapsuleApp: Capsule FwType is invalid.\n");
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
goto Done; goto Done;
} }
FullCapsuleBufferSize = NESTED_CAPSULE_HEADER_SIZE + FileSize; FullCapsuleBufferSize = NESTED_CAPSULE_HEADER_SIZE + FileSize;
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize); FullCapsuleBuffer = AllocatePool (FullCapsuleBufferSize);
if (FullCapsuleBuffer == NULL) { if (FullCapsuleBuffer == NULL) {
Print(L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize); Print (L"CapsuleApp: Capsule Buffer size (0x%x) too big.\n", FullCapsuleBufferSize);
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Done; goto Done;
} }
NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)FullCapsuleBuffer; NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)FullCapsuleBuffer;
ZeroMem(NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE); ZeroMem (NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);
CopyGuid(&NestedCapsuleHeader->CapsuleGuid, ImageTypeId); CopyGuid (&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);
NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE; NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;
NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG; NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;
NestedCapsuleHeader->CapsuleImageSize = (UINT32)FullCapsuleBufferSize; NestedCapsuleHeader->CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
CopyMem((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize); CopyMem ((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);
Status = WriteFileFromBuffer(OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer); Status = WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
Print(L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status); Print (L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
Done: Done:
if (CapsuleBuffer != NULL) { if (CapsuleBuffer != NULL) {
FreePool(CapsuleBuffer); FreePool (CapsuleBuffer);
} }
if (FullCapsuleBuffer != NULL) { if (FullCapsuleBuffer != NULL) {
FreePool(FullCapsuleBuffer); FreePool (FullCapsuleBuffer);
} }
return Status; return Status;
} }
/** /**
Clear capsule status variable. Clear capsule status variable.
@ -391,19 +403,19 @@ ClearCapsuleStatusVariable (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 Index; UINT32 Index;
CHAR16 CapsuleVarName[20]; CHAR16 CapsuleVarName[20];
CHAR16 *TempVarName; CHAR16 *TempVarName;
BOOLEAN Found; BOOLEAN Found;
StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule"); StrCpyS (CapsuleVarName, sizeof (CapsuleVarName)/sizeof (CapsuleVarName[0]), L"Capsule");
TempVarName = CapsuleVarName + StrLen (CapsuleVarName); TempVarName = CapsuleVarName + StrLen (CapsuleVarName);
Index = 0; Index = 0;
Found = FALSE; Found = FALSE;
while (TRUE) { while (TRUE) {
UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index); UnicodeSPrint (TempVarName, 5 * sizeof (CHAR16), L"%04x", Index);
Status = gRT->SetVariable ( Status = gRT->SetVariable (
CapsuleVarName, CapsuleVarName,
@ -418,6 +430,7 @@ ClearCapsuleStatusVariable (
// //
break; break;
} }
Found = TRUE; Found = TRUE;
Print (L"Clear %s %r\n", CapsuleVarName, Status); Print (L"Clear %s %r\n", CapsuleVarName, Status);
@ -447,10 +460,10 @@ ClearCapsuleStatusVariable (
**/ **/
EFI_STATUS EFI_STATUS
BuildGatherList ( BuildGatherList (
IN VOID **CapsuleBuffer, IN VOID **CapsuleBuffer,
IN UINTN *FileSize, IN UINTN *FileSize,
IN UINTN CapsuleNum, IN UINTN CapsuleNum,
OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -482,15 +495,15 @@ BuildGatherList (
Count = (INT32)(NumberOfDescriptors + 2) / 2; Count = (INT32)(NumberOfDescriptors + 2) / 2;
} }
Size = Count * sizeof (EFI_CAPSULE_BLOCK_DESCRIPTOR); Size = Count * sizeof (EFI_CAPSULE_BLOCK_DESCRIPTOR);
BlockDescriptors1 = AllocateRuntimeZeroPool (Size); BlockDescriptors1 = AllocateRuntimeZeroPool (Size);
if (BlockDescriptors1 == NULL) { if (BlockDescriptors1 == NULL) {
Print (L"CapsuleApp: failed to allocate memory for descriptors\n"); Print (L"CapsuleApp: failed to allocate memory for descriptors\n");
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto ERREXIT; goto ERREXIT;
} else { } else {
Print (L"CapsuleApp: creating capsule descriptors at 0x%X\n", (UINTN) BlockDescriptors1); Print (L"CapsuleApp: creating capsule descriptors at 0x%X\n", (UINTN)BlockDescriptors1);
Print (L"CapsuleApp: capsule data starts at 0x%X with size 0x%X\n", (UINTN) CapsuleBuffer[Index], FileSize[Index]); Print (L"CapsuleApp: capsule data starts at 0x%X with size 0x%X\n", (UINTN)CapsuleBuffer[Index], FileSize[Index]);
} }
// //
@ -501,16 +514,16 @@ BuildGatherList (
} }
if (BlockDescriptorPre != NULL) { if (BlockDescriptorPre != NULL) {
BlockDescriptorPre->Union.ContinuationPointer = (UINTN) BlockDescriptors1; BlockDescriptorPre->Union.ContinuationPointer = (UINTN)BlockDescriptors1;
BlockDescriptorPre->Length = 0; BlockDescriptorPre->Length = 0;
} }
// //
// Fill them in // Fill them in
// //
TempBlockPtr = BlockDescriptors1; TempBlockPtr = BlockDescriptors1;
TempDataPtr = CapsuleBuffer[Index]; TempDataPtr = CapsuleBuffer[Index];
SizeLeft = FileSize[Index]; SizeLeft = FileSize[Index];
for (Number = 0; (Number < Count - 1) && (SizeLeft != 0); Number++) { for (Number = 0; (Number < Count - 1) && (SizeLeft != 0); Number++) {
// //
// Divide remaining data in half // Divide remaining data in half
@ -524,10 +537,11 @@ BuildGatherList (
} else { } else {
Size = SizeLeft; Size = SizeLeft;
} }
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
TempBlockPtr->Length = Size; TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN) TempDataPtr, Size); TempBlockPtr->Length = Size;
SizeLeft -= Size; Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN)TempDataPtr, Size);
SizeLeft -= Size;
TempDataPtr += Size; TempDataPtr += Size;
TempBlockPtr++; TempBlockPtr++;
} }
@ -555,10 +569,10 @@ BuildGatherList (
// //
// Point the first list's last element to point to this second list. // Point the first list's last element to point to this second list.
// //
TempBlockPtr->Union.ContinuationPointer = (UINTN) BlockDescriptors2; TempBlockPtr->Union.ContinuationPointer = (UINTN)BlockDescriptors2;
TempBlockPtr->Length = 0; TempBlockPtr->Length = 0;
TempBlockPtr = BlockDescriptors2; TempBlockPtr = BlockDescriptors2;
for (Number = 0; Number < Count - 1; Number++) { for (Number = 0; Number < Count - 1; Number++) {
// //
// If second-to-last one, then dump rest to this element // If second-to-last one, then dump rest to this element
@ -576,10 +590,10 @@ BuildGatherList (
} }
} }
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr; TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
TempBlockPtr->Length = Size; TempBlockPtr->Length = Size;
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN) TempDataPtr, Size); Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN)TempDataPtr, Size);
SizeLeft -= Size; SizeLeft -= Size;
TempDataPtr += Size; TempDataPtr += Size;
TempBlockPtr++; TempBlockPtr++;
if (SizeLeft == 0) { if (SizeLeft == 0) {
@ -596,20 +610,20 @@ BuildGatherList (
// Null-terminate. // Null-terminate.
// //
if (TempBlockPtr != NULL) { if (TempBlockPtr != NULL) {
TempBlockPtr->Union.ContinuationPointer = (UINTN)NULL; TempBlockPtr->Union.ContinuationPointer = (UINTN)NULL;
TempBlockPtr->Length = 0; TempBlockPtr->Length = 0;
*BlockDescriptors = BlockDescriptorsHeader; *BlockDescriptors = BlockDescriptorsHeader;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
ERREXIT: ERREXIT:
if (BlockDescriptors1 != NULL) { if (BlockDescriptors1 != NULL) {
FreePool(BlockDescriptors1); FreePool (BlockDescriptors1);
} }
if (BlockDescriptors2 != NULL) { if (BlockDescriptors2 != NULL) {
FreePool(BlockDescriptors2); FreePool (BlockDescriptors2);
} }
return Status; return Status;
@ -623,18 +637,18 @@ ERREXIT:
**/ **/
VOID VOID
CleanGatherList ( CleanGatherList (
IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors, IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors,
IN UINTN CapsuleNum IN UINTN CapsuleNum
) )
{ {
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr; EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr;
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr1; EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr1;
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr2; EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr2;
UINTN Index; UINTN Index;
if (BlockDescriptors != NULL) { if (BlockDescriptors != NULL) {
TempBlockPtr1 = BlockDescriptors; TempBlockPtr1 = BlockDescriptors;
while (1){ while (1) {
TempBlockPtr = TempBlockPtr1; TempBlockPtr = TempBlockPtr1;
for (Index = 0; Index < CapsuleNum; Index++) { for (Index = 0; Index < CapsuleNum; Index++) {
if (TempBlockPtr[Index].Length == 0) { if (TempBlockPtr[Index].Length == 0) {
@ -646,8 +660,8 @@ CleanGatherList (
break; break;
} }
TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr[Index].Union.ContinuationPointer); TempBlockPtr2 = (VOID *)((UINTN)TempBlockPtr[Index].Union.ContinuationPointer);
FreePool(TempBlockPtr1); FreePool (TempBlockPtr1);
TempBlockPtr1 = TempBlockPtr2; TempBlockPtr1 = TempBlockPtr2;
} }
} }
@ -661,42 +675,42 @@ PrintUsage (
VOID VOID
) )
{ {
Print(L"CapsuleApp: usage\n"); Print (L"CapsuleApp: usage\n");
Print(L" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n"); Print (L" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n");
Print(L" CapsuleApp -S\n"); Print (L" CapsuleApp -S\n");
Print(L" CapsuleApp -C\n"); Print (L" CapsuleApp -C\n");
Print(L" CapsuleApp -P\n"); Print (L" CapsuleApp -P\n");
Print(L" CapsuleApp -E\n"); Print (L" CapsuleApp -E\n");
Print(L" CapsuleApp -L\n"); Print (L" CapsuleApp -L\n");
Print(L" CapsuleApp -L INFO\n"); Print (L" CapsuleApp -L INFO\n");
Print(L" CapsuleApp -F\n"); Print (L" CapsuleApp -F\n");
Print(L" CapsuleApp -G <BMP> -O <Capsule>\n"); Print (L" CapsuleApp -G <BMP> -O <Capsule>\n");
Print(L" CapsuleApp -N <Capsule> -O <NestedCapsule>\n"); Print (L" CapsuleApp -N <Capsule> -O <NestedCapsule>\n");
Print(L" CapsuleApp -D <Capsule>\n"); Print (L" CapsuleApp -D <Capsule>\n");
Print(L" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n"); Print (L" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");
Print(L"Parameter:\n"); Print (L"Parameter:\n");
Print(L" -NR: No reset will be triggered for the capsule\n"); Print (L" -NR: No reset will be triggered for the capsule\n");
Print(L" with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET.\n"); Print (L" with CAPSULE_FLAGS_PERSIST_ACROSS_RESET and without CAPSULE_FLAGS_INITIATE_RESET.\n");
Print(L" -OD: Delivery of Capsules via file on Mass Storage device.\n"); Print (L" -OD: Delivery of Capsules via file on Mass Storage device.\n");
Print(L" -S: Dump capsule report variable (EFI_CAPSULE_REPORT_GUID),\n"); Print (L" -S: Dump capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");
Print(L" which is defined in UEFI specification.\n"); Print (L" which is defined in UEFI specification.\n");
Print(L" -C: Clear capsule report variable (EFI_CAPSULE_REPORT_GUID),\n"); Print (L" -C: Clear capsule report variable (EFI_CAPSULE_REPORT_GUID),\n");
Print(L" which is defined in UEFI specification.\n"); Print (L" which is defined in UEFI specification.\n");
Print(L" -P: Dump UEFI FMP protocol info, or get image with specified\n"); Print (L" -P: Dump UEFI FMP protocol info, or get image with specified\n");
Print(L" ImageTypeId and Index (decimal format) to a file if 'GET'\n"); Print (L" ImageTypeId and Index (decimal format) to a file if 'GET'\n");
Print(L" option is used.\n"); Print (L" option is used.\n");
Print(L" -E: Dump UEFI ESRT table info.\n"); Print (L" -E: Dump UEFI ESRT table info.\n");
Print(L" -L: Dump provisioned capsule image information.\n"); Print (L" -L: Dump provisioned capsule image information.\n");
Print(L" -F: Dump all EFI System Partition.\n"); Print (L" -F: Dump all EFI System Partition.\n");
Print(L" -G: Convert a BMP file to be an UX capsule,\n"); Print (L" -G: Convert a BMP file to be an UX capsule,\n");
Print(L" according to Windows Firmware Update document\n"); Print (L" according to Windows Firmware Update document\n");
Print(L" -N: Append a Capsule Header to an existing FMP capsule image\n"); Print (L" -N: Append a Capsule Header to an existing FMP capsule image\n");
Print(L" with its ImageTypeId supported by the system,\n"); Print (L" with its ImageTypeId supported by the system,\n");
Print(L" according to Windows Firmware Update document\n"); Print (L" according to Windows Firmware Update document\n");
Print(L" -O: Output new Capsule file name\n"); Print (L" -O: Output new Capsule file name\n");
Print(L" -D: Dump Capsule image header information, image payload\n"); Print (L" -D: Dump Capsule image header information, image payload\n");
Print(L" information if it is an UX capsule and FMP header\n"); Print (L" information if it is an UX capsule and FMP header\n");
Print(L" information if it is a FMP capsule.\n"); Print (L" information if it is a FMP capsule.\n");
} }
/** /**
@ -738,54 +752,63 @@ UefiMain (
EFI_GUID ImageTypeId; EFI_GUID ImageTypeId;
UINTN ImageIndex; UINTN ImageIndex;
BlockDescriptors = NULL; BlockDescriptors = NULL;
MapFsStr = NULL; MapFsStr = NULL;
CapsuleNum = 0; CapsuleNum = 0;
Status = GetArg(); Status = GetArg ();
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"Please use UEFI SHELL to run this application!\n", Status); Print (L"Please use UEFI SHELL to run this application!\n", Status);
return Status; return Status;
} }
if (Argc < 2) { if (Argc < 2) {
PrintUsage(); PrintUsage ();
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
if (StrCmp(Argv[1], L"-D") == 0) {
if (StrCmp (Argv[1], L"-D") == 0) {
if (Argc != 3) { if (Argc != 3) {
Print(L"CapsuleApp: Incorrect parameter count.\n"); Print (L"CapsuleApp: Incorrect parameter count.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
Status = DumpCapsule(Argv[2]);
Status = DumpCapsule (Argv[2]);
return Status; return Status;
} }
if (StrCmp(Argv[1], L"-G") == 0) {
Status = CreateBmpFmp(); if (StrCmp (Argv[1], L"-G") == 0) {
Status = CreateBmpFmp ();
return Status; return Status;
} }
if (StrCmp(Argv[1], L"-N") == 0) {
Status = CreateNestedFmp(); if (StrCmp (Argv[1], L"-N") == 0) {
Status = CreateNestedFmp ();
return Status; return Status;
} }
if (StrCmp(Argv[1], L"-S") == 0) {
Status = DumpCapsuleStatusVariable(); if (StrCmp (Argv[1], L"-S") == 0) {
Status = DumpCapsuleStatusVariable ();
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if (StrCmp(Argv[1], L"-C") == 0) {
Status = ClearCapsuleStatusVariable(); if (StrCmp (Argv[1], L"-C") == 0) {
Status = ClearCapsuleStatusVariable ();
return Status; return Status;
} }
if (StrCmp(Argv[1], L"-P") == 0) {
if (StrCmp (Argv[1], L"-P") == 0) {
if (Argc == 2) { if (Argc == 2) {
DumpFmpData(); DumpFmpData ();
} }
if (Argc >= 3) { if (Argc >= 3) {
if (StrCmp(Argv[2], L"GET") != 0) { if (StrCmp (Argv[2], L"GET") != 0) {
Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]); Print (L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} else { } else {
if (Argc != 7) { if (Argc != 7) {
Print(L"CapsuleApp: Incorrect parameter count.\n"); Print (L"CapsuleApp: Incorrect parameter count.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -797,54 +820,58 @@ UefiMain (
Print (L"Invalid ImageTypeId - %s\n", Argv[3]); Print (L"Invalid ImageTypeId - %s\n", Argv[3]);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
ImageIndex = StrDecimalToUintn(Argv[4]);
if (StrCmp(Argv[5], L"-O") != 0) { ImageIndex = StrDecimalToUintn (Argv[4]);
Print(L"CapsuleApp: NO output file name.\n"); if (StrCmp (Argv[5], L"-O") != 0) {
Print (L"CapsuleApp: NO output file name.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
DumpFmpImage(&ImageTypeId, ImageIndex, Argv[6]);
DumpFmpImage (&ImageTypeId, ImageIndex, Argv[6]);
} }
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if (StrCmp(Argv[1], L"-E") == 0) { if (StrCmp (Argv[1], L"-E") == 0) {
DumpEsrtData(); DumpEsrtData ();
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if (StrCmp(Argv[1], L"-L") == 0) { if (StrCmp (Argv[1], L"-L") == 0) {
if (Argc >= 3 && StrCmp(Argv[2], L"INFO") == 0) { if ((Argc >= 3) && (StrCmp (Argv[2], L"INFO") == 0)) {
DumpProvisionedCapsule(TRUE); DumpProvisionedCapsule (TRUE);
} else { } else {
DumpProvisionedCapsule(FALSE); DumpProvisionedCapsule (FALSE);
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if (StrCmp(Argv[1], L"-F") == 0) { if (StrCmp (Argv[1], L"-F") == 0) {
DumpAllEfiSysPartition(); DumpAllEfiSysPartition ();
return EFI_SUCCESS; return EFI_SUCCESS;
} }
if (Argv[1][0] == L'-') { if (Argv[1][0] == L'-') {
Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[1]); Print (L"CapsuleApp: Unrecognized option(%s).\n", Argv[1]);
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
CapsuleFirstIndex = 1; CapsuleFirstIndex = 1;
NoReset = FALSE; NoReset = FALSE;
CapsuleOnDisk = FALSE; CapsuleOnDisk = FALSE;
ParaOdIndex = 0; ParaOdIndex = 0;
ParaNrIndex = 0; ParaNrIndex = 0;
for (Index = 1; Index < Argc; Index++) { for (Index = 1; Index < Argc; Index++) {
if (StrCmp(Argv[Index], L"-OD") == 0) { if (StrCmp (Argv[Index], L"-OD") == 0) {
ParaOdIndex = Index; ParaOdIndex = Index;
CapsuleOnDisk = TRUE; CapsuleOnDisk = TRUE;
} else if (StrCmp(Argv[Index], L"-NR") == 0) { } else if (StrCmp (Argv[Index], L"-NR") == 0) {
ParaNrIndex = Index; ParaNrIndex = Index;
NoReset = TRUE; NoReset = TRUE;
} }
} }
@ -886,37 +913,40 @@ UefiMain (
CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1; CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1;
if (CapsuleFirstIndex > CapsuleLastIndex) { if (CapsuleFirstIndex > CapsuleLastIndex) {
Print(L"CapsuleApp: NO capsule image.\n"); Print (L"CapsuleApp: NO capsule image.\n");
return EFI_UNSUPPORTED;
}
if (CapsuleNum > MAX_CAPSULE_NUM) {
Print(L"CapsuleApp: Too many capsule images.\n");
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
ZeroMem(&CapsuleBuffer, sizeof(CapsuleBuffer)); if (CapsuleNum > MAX_CAPSULE_NUM) {
ZeroMem(&CapsuleBufferSize, sizeof(CapsuleBufferSize)); Print (L"CapsuleApp: Too many capsule images.\n");
return EFI_UNSUPPORTED;
}
ZeroMem (&CapsuleBuffer, sizeof (CapsuleBuffer));
ZeroMem (&CapsuleBufferSize, sizeof (CapsuleBufferSize));
BlockDescriptors = NULL; BlockDescriptors = NULL;
for (Index = 0; Index < CapsuleNum; Index++) { for (Index = 0; Index < CapsuleNum; Index++) {
CapsuleName = Argv[CapsuleFirstIndex + Index]; CapsuleName = Argv[CapsuleFirstIndex + Index];
Status = ReadFileToBuffer(CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]); Status = ReadFileToBuffer (CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName); Print (L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);
goto Done; goto Done;
} }
if (!IsValidCapsuleHeader (CapsuleBuffer[Index], CapsuleBufferSize[Index])) { if (!IsValidCapsuleHeader (CapsuleBuffer[Index], CapsuleBufferSize[Index])) {
Print(L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName); Print (L"CapsuleApp: Capsule image (%s) is not a valid capsule.\n", CapsuleName);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
CapsuleNames[Index] = CapsuleName; CapsuleNames[Index] = CapsuleName;
} }
// //
// Every capsule use 2 descriptor 1 for data 1 for end // Every capsule use 2 descriptor 1 for data 1 for end
// //
Status = BuildGatherList(CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors); Status = BuildGatherList (CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto Done; goto Done;
} }
@ -925,18 +955,19 @@ UefiMain (
// //
NeedReset = FALSE; NeedReset = FALSE;
for (Index = 0; Index < CapsuleNum; Index++) { for (Index = 0; Index < CapsuleNum; Index++) {
CapsuleHeaderArray[Index] = (EFI_CAPSULE_HEADER *) CapsuleBuffer[Index]; CapsuleHeaderArray[Index] = (EFI_CAPSULE_HEADER *)CapsuleBuffer[Index];
if ((CapsuleHeaderArray[Index]->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) { if ((CapsuleHeaderArray[Index]->Flags & CAPSULE_FLAGS_PERSIST_ACROSS_RESET) != 0) {
NeedReset = TRUE; NeedReset = TRUE;
} }
} }
CapsuleHeaderArray[CapsuleNum] = NULL; CapsuleHeaderArray[CapsuleNum] = NULL;
// //
// Inquire platform capability of UpdateCapsule. // Inquire platform capability of UpdateCapsule.
// //
Status = gRT->QueryCapsuleCapabilities (CapsuleHeaderArray, CapsuleNum, &MaxCapsuleSize, &ResetType); Status = gRT->QueryCapsuleCapabilities (CapsuleHeaderArray, CapsuleNum, &MaxCapsuleSize, &ResetType);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print (L"CapsuleApp: failed to query capsule capability - %r\n", Status); Print (L"CapsuleApp: failed to query capsule capability - %r\n", Status);
goto Done; goto Done;
} }
@ -970,11 +1001,12 @@ UefiMain (
// Check whether the input capsule image has the flag of persist across system reset. // Check whether the input capsule image has the flag of persist across system reset.
// //
if (NeedReset) { if (NeedReset) {
Status = gRT->UpdateCapsule(CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors); Status = gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (UINTN)BlockDescriptors);
if (Status != EFI_SUCCESS) { if (Status != EFI_SUCCESS) {
Print (L"CapsuleApp: failed to update capsule - %r\n", Status); Print (L"CapsuleApp: failed to update capsule - %r\n", Status);
goto Done; goto Done;
} }
// //
// For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET + CAPSULE_FLAGS_INITIATE_RESET, // For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET + CAPSULE_FLAGS_INITIATE_RESET,
// a system reset should have been triggered by gRT->UpdateCapsule() calling above. // a system reset should have been triggered by gRT->UpdateCapsule() calling above.
@ -994,7 +1026,7 @@ UefiMain (
// For capsule who has no reset flag, only call UpdateCapsule Service without a // For capsule who has no reset flag, only call UpdateCapsule Service without a
// system reset. The service will process the capsule immediately. // system reset. The service will process the capsule immediately.
// //
Status = gRT->UpdateCapsule (CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors); Status = gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (UINTN)BlockDescriptors);
if (Status != EFI_SUCCESS) { if (Status != EFI_SUCCESS) {
Print (L"CapsuleApp: failed to update capsule - %r\n", Status); Print (L"CapsuleApp: failed to update capsule - %r\n", Status);
} }
@ -1009,7 +1041,7 @@ Done:
} }
} }
CleanGatherList(BlockDescriptors, CapsuleNum); CleanGatherList (BlockDescriptors, CapsuleNum);
return Status; return Status;
} }

View File

@ -6,7 +6,6 @@
**/ **/
#ifndef _CAPSULE_APP_H_ #ifndef _CAPSULE_APP_H_
#define _CAPSULE_APP_H_ #define _CAPSULE_APP_H_
@ -42,22 +41,22 @@
#define CAPSULE_HEADER_SIZE 0x20 #define CAPSULE_HEADER_SIZE 0x20
#define NESTED_CAPSULE_HEADER_SIZE SIZE_4KB #define NESTED_CAPSULE_HEADER_SIZE SIZE_4KB
#define SYSTEM_FIRMWARE_FLAG 0x50000 #define SYSTEM_FIRMWARE_FLAG 0x50000
#define DEVICE_FIRMWARE_FLAG 0x78010 #define DEVICE_FIRMWARE_FLAG 0x78010
#define MAJOR_VERSION 1 #define MAJOR_VERSION 1
#define MINOR_VERSION 0 #define MINOR_VERSION 0
#define MAX_CAPSULE_NUM 10 #define MAX_CAPSULE_NUM 10
// //
// (20 * (6+5+2))+1) unicode characters from EFI FAT spec (doubled for bytes) // (20 * (6+5+2))+1) unicode characters from EFI FAT spec (doubled for bytes)
// //
#define MAX_FILE_NAME_SIZE 522 #define MAX_FILE_NAME_SIZE 522
#define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16)) #define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16))
extern UINTN Argc; extern UINTN Argc;
extern CHAR16 **Argv; extern CHAR16 **Argv;
/** /**
@ -81,7 +80,6 @@ GetShellProtocol (
VOID VOID
); );
/** /**
Read a file. Read a file.
@ -95,9 +93,9 @@ GetShellProtocol (
**/ **/
EFI_STATUS EFI_STATUS
ReadFileToBuffer ( ReadFileToBuffer (
IN CHAR16 *FileName, IN CHAR16 *FileName,
OUT UINTN *BufferSize, OUT UINTN *BufferSize,
OUT VOID **Buffer OUT VOID **Buffer
); );
/** /**
@ -113,12 +111,11 @@ ReadFileToBuffer (
**/ **/
EFI_STATUS EFI_STATUS
WriteFileFromBuffer ( WriteFileFromBuffer (
IN CHAR16 *FileName, IN CHAR16 *FileName,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
); );
/** /**
Dump capsule information Dump capsule information
@ -129,7 +126,7 @@ WriteFileFromBuffer (
**/ **/
EFI_STATUS EFI_STATUS
DumpCapsule ( DumpCapsule (
IN CHAR16 *CapsuleName IN CHAR16 *CapsuleName
); );
/** /**
@ -182,7 +179,7 @@ DumpEsrtData (
**/ **/
VOID VOID
DumpProvisionedCapsule ( DumpProvisionedCapsule (
IN BOOLEAN DumpCapsuleInfo IN BOOLEAN DumpCapsuleInfo
); );
/** /**
@ -193,7 +190,6 @@ DumpAllEfiSysPartition (
VOID VOID
); );
/** /**
Get SimpleFileSystem from boot option file path. Get SimpleFileSystem from boot option file path.
@ -213,7 +209,6 @@ GetEfiSysPartitionFromBootOptionFilePath (
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
); );
/** /**
Process Capsule On Disk. Process Capsule On Disk.
@ -229,12 +224,11 @@ GetEfiSysPartitionFromBootOptionFilePath (
**/ **/
EFI_STATUS EFI_STATUS
ProcessCapsuleOnDisk ( ProcessCapsuleOnDisk (
IN VOID **CapsuleBuffer, IN VOID **CapsuleBuffer,
IN UINTN *CapsuleBufferSize, IN UINTN *CapsuleBufferSize,
IN CHAR16 **FilePath, IN CHAR16 **FilePath,
IN CHAR16 *Map, IN CHAR16 *Map,
IN UINTN CapsuleNum IN UINTN CapsuleNum
); );
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -8,7 +8,9 @@
#include "CapsuleApp.h" #include "CapsuleApp.h"
EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 } }; EFI_GUID mCapsuleOnDiskBootOptionGuid = {
0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x6D, 0x25, 0x3E, 0x37, 0x10, 0xF5, 0x32 }
};
/** /**
Get file name from file path. Get file name from file path.
@ -20,13 +22,13 @@ EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x
**/ **/
CHAR16 * CHAR16 *
GetFileNameFromPath ( GetFileNameFromPath (
CHAR16 *FilePath CHAR16 *FilePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SHELL_PROTOCOL *ShellProtocol; EFI_SHELL_PROTOCOL *ShellProtocol;
SHELL_FILE_HANDLE Handle; SHELL_FILE_HANDLE Handle;
EFI_FILE_INFO *FileInfo; EFI_FILE_INFO *FileInfo;
ShellProtocol = GetShellProtocol (); ShellProtocol = GetShellProtocol ();
if (ShellProtocol == NULL) { if (ShellProtocol == NULL) {
@ -68,13 +70,13 @@ GetFileNameFromPath (
**/ **/
BOOLEAN BOOLEAN
IsEfiSysPartitionDevicePath ( IsEfiSysPartitionDevicePath (
EFI_DEVICE_PATH_PROTOCOL *DevicePath EFI_DEVICE_PATH_PROTOCOL *DevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
HARDDRIVE_DEVICE_PATH *Hd; HARDDRIVE_DEVICE_PATH *Hd;
EFI_HANDLE Handle; EFI_HANDLE Handle;
// //
// Check if the device path contains GPT node // Check if the device path contains GPT node
@ -83,12 +85,14 @@ IsEfiSysPartitionDevicePath (
while (!IsDevicePathEnd (TempDevicePath)) { while (!IsDevicePathEnd (TempDevicePath)) {
if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) && if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) { (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))
{
Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath; Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) { if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
break; break;
} }
} }
TempDevicePath = NextDevicePathNode (TempDevicePath); TempDevicePath = NextDevicePathNode (TempDevicePath);
} }
@ -112,19 +116,19 @@ DumpAllEfiSysPartition (
VOID VOID
) )
{ {
EFI_HANDLE *SimpleFileSystemHandles; EFI_HANDLE *SimpleFileSystemHandles;
UINTN NumberSimpleFileSystemHandles; UINTN NumberSimpleFileSystemHandles;
UINTN Index; UINTN Index;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINTN NumberEfiSystemPartitions; UINTN NumberEfiSystemPartitions;
EFI_SHELL_PROTOCOL *ShellProtocol; EFI_SHELL_PROTOCOL *ShellProtocol;
NumberEfiSystemPartitions = 0; NumberEfiSystemPartitions = 0;
ShellProtocol = GetShellProtocol (); ShellProtocol = GetShellProtocol ();
if (ShellProtocol == NULL) { if (ShellProtocol == NULL) {
Print (L"Get Shell Protocol Fail\n");; Print (L"Get Shell Protocol Fail\n");
return ; return;
} }
Print (L"EFI System Partition list:\n"); Print (L"EFI System Partition list:\n");
@ -141,12 +145,12 @@ DumpAllEfiSysPartition (
DevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]); DevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]);
if (IsEfiSysPartitionDevicePath (DevicePath)) { if (IsEfiSysPartitionDevicePath (DevicePath)) {
NumberEfiSystemPartitions++; NumberEfiSystemPartitions++;
Print(L" %s\n %s\n", ShellProtocol->GetMapFromDevicePath (&DevicePath), ConvertDevicePathToText (DevicePath, TRUE, TRUE)); Print (L" %s\n %s\n", ShellProtocol->GetMapFromDevicePath (&DevicePath), ConvertDevicePathToText (DevicePath, TRUE, TRUE));
} }
} }
if (NumberEfiSystemPartitions == 0) { if (NumberEfiSystemPartitions == 0) {
Print(L" No ESP found.\n"); Print (L" No ESP found.\n");
} }
} }
@ -162,21 +166,22 @@ IsCapsuleProvisioned (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT64 OsIndication; UINT64 OsIndication;
UINTN DataSize; UINTN DataSize;
OsIndication = 0; OsIndication = 0;
DataSize = sizeof(UINT64); DataSize = sizeof (UINT64);
Status = gRT->GetVariable ( Status = gRT->GetVariable (
L"OsIndications", L"OsIndications",
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
NULL, NULL,
&DataSize, &DataSize,
&OsIndication &OsIndication
); );
if (!EFI_ERROR (Status) && if (!EFI_ERROR (Status) &&
(OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0) { ((OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0))
{
return TRUE; return TRUE;
} }
@ -199,11 +204,11 @@ GetEfiSysPartition (
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
) )
{ {
EFI_HANDLE *SimpleFileSystemHandles; EFI_HANDLE *SimpleFileSystemHandles;
UINTN NumberSimpleFileSystemHandles; UINTN NumberSimpleFileSystemHandles;
UINTN Index; UINTN Index;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->LocateHandleBuffer ( Status = gBS->LocateHandleBuffer (
ByProtocol, ByProtocol,
@ -245,15 +250,15 @@ GetEfiSysPartition (
**/ **/
EFI_STATUS EFI_STATUS
GetEfiSysPartitionFromDevPath ( GetEfiSysPartitionFromDevPath (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT EFI_DEVICE_PATH_PROTOCOL **FsDevicePath, OUT EFI_DEVICE_PATH_PROTOCOL **FsDevicePath,
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath; EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
HARDDRIVE_DEVICE_PATH *Hd; HARDDRIVE_DEVICE_PATH *Hd;
EFI_HANDLE Handle; EFI_HANDLE Handle;
// //
// Check if the device path contains GPT node // Check if the device path contains GPT node
@ -261,12 +266,14 @@ GetEfiSysPartitionFromDevPath (
TempDevicePath = DevicePath; TempDevicePath = DevicePath;
while (!IsDevicePathEnd (TempDevicePath)) { while (!IsDevicePathEnd (TempDevicePath)) {
if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) && if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) { (DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))
{
Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath; Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) { if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
break; break;
} }
} }
TempDevicePath = NextDevicePathNode (TempDevicePath); TempDevicePath = NextDevicePathNode (TempDevicePath);
} }
@ -310,13 +317,13 @@ GetEfiSysPartitionFromBootOptionFilePath (
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *CurFullPath; EFI_DEVICE_PATH_PROTOCOL *CurFullPath;
EFI_DEVICE_PATH_PROTOCOL *PreFullPath; EFI_DEVICE_PATH_PROTOCOL *PreFullPath;
EFI_DEVICE_PATH_PROTOCOL *FsFullPath; EFI_DEVICE_PATH_PROTOCOL *FsFullPath;
CurFullPath = NULL; CurFullPath = NULL;
FsFullPath = NULL; FsFullPath = NULL;
// //
// Try every full device Path generated from bootoption // Try every full device Path generated from bootoption
// //
@ -337,13 +344,14 @@ GetEfiSysPartitionFromBootOptionFilePath (
} }
DEBUG_CODE_BEGIN (); DEBUG_CODE_BEGIN ();
CHAR16 *DevicePathStr; CHAR16 *DevicePathStr;
DevicePathStr = ConvertDevicePathToText (CurFullPath, TRUE, TRUE);
if (DevicePathStr != NULL) {
DEBUG ((DEBUG_INFO, "Full device path %s\n", DevicePathStr));
FreePool (DevicePathStr);
}
DevicePathStr = ConvertDevicePathToText (CurFullPath, TRUE, TRUE);
if (DevicePathStr != NULL){
DEBUG ((DEBUG_INFO, "Full device path %s\n", DevicePathStr));
FreePool (DevicePathStr);
}
DEBUG_CODE_END (); DEBUG_CODE_END ();
Status = GetEfiSysPartitionFromDevPath (CurFullPath, &FsFullPath, Fs); Status = GetEfiSysPartitionFromDevPath (CurFullPath, &FsFullPath, Fs);
@ -376,7 +384,7 @@ GetUpdateFileSystem (
OUT UINT16 *BootNext, OUT UINT16 *BootNext,
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs, OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs,
OUT BOOLEAN *UpdateBootNext OUT BOOLEAN *UpdateBootNext
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
CHAR16 BootOptionName[20]; CHAR16 BootOptionName[20];
@ -396,7 +404,7 @@ GetUpdateFileSystem (
ShellProtocol = GetShellProtocol (); ShellProtocol = GetShellProtocol ();
if (ShellProtocol == NULL) { if (ShellProtocol == NULL) {
Print (L"Get Shell Protocol Fail\n");; Print (L"Get Shell Protocol Fail\n");
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -404,14 +412,14 @@ GetUpdateFileSystem (
// 1. If Fs is not assigned and there are capsule provisioned before, // 1. If Fs is not assigned and there are capsule provisioned before,
// Get EFI system partition from BootNext. // Get EFI system partition from BootNext.
// //
if (IsCapsuleProvisioned () && Map == NULL) { if (IsCapsuleProvisioned () && (Map == NULL)) {
Status = GetVariable2 ( Status = GetVariable2 (
L"BootNext", L"BootNext",
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
(VOID **)&BootNextData, (VOID **)&BootNextData,
NULL NULL
); );
if (EFI_ERROR (Status) || BootNextData == NULL) { if (EFI_ERROR (Status) || (BootNextData == NULL)) {
Print (L"Get Boot Next Data Fail. Status = %r\n", Status); Print (L"Get Boot Next Data Fail. Status = %r\n", Status);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} else { } else {
@ -419,11 +427,11 @@ GetUpdateFileSystem (
Status = EfiBootManagerVariableToLoadOption (BootOptionName, &BootNextOption); Status = EfiBootManagerVariableToLoadOption (BootOptionName, &BootNextOption);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
DevicePath = BootNextOption.FilePath; DevicePath = BootNextOption.FilePath;
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs); Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
*UpdateBootNext = FALSE; *UpdateBootNext = FALSE;
Print(L"Get EFI system partition from BootNext : %s\n", BootNextOption.Description); Print (L"Get EFI system partition from BootNext : %s\n", BootNextOption.Description);
Print(L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE)); Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
@ -436,10 +444,10 @@ GetUpdateFileSystem (
if (Map != NULL) { if (Map != NULL) {
MappedDevicePath = ShellProtocol->GetDevicePathFromMap (Map); MappedDevicePath = ShellProtocol->GetDevicePathFromMap (Map);
if (MappedDevicePath == NULL) { if (MappedDevicePath == NULL) {
Print(L"'%s' is not a valid mapping.\n", Map); Print (L"'%s' is not a valid mapping.\n", Map);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} else if (!IsEfiSysPartitionDevicePath (DuplicateDevicePath (MappedDevicePath))) { } else if (!IsEfiSysPartitionDevicePath (DuplicateDevicePath (MappedDevicePath))) {
Print(L"'%s' is not a EFI System Partition.\n", Map); Print (L"'%s' is not a EFI System Partition.\n", Map);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
} }
@ -448,9 +456,10 @@ GetUpdateFileSystem (
// 2. Get EFI system partition form boot options. // 2. Get EFI system partition form boot options.
// //
BootOptionBuffer = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot); BootOptionBuffer = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
if ( (BootOptionBuffer == NULL) || if ((BootOptionBuffer == NULL) ||
(BootOptionCount == 0 && Map == NULL) ((BootOptionCount == 0) && (Map == NULL))
) { )
{
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -458,32 +467,34 @@ GetUpdateFileSystem (
// //
// Get the boot option from the link list // Get the boot option from the link list
// //
DevicePath = BootOptionBuffer[Index].FilePath; DevicePath = BootOptionBuffer[Index].FilePath;
// //
// Skip inactive or legacy boot options // Skip inactive or legacy boot options
// //
if ((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0 || if (((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0) ||
DevicePathType (DevicePath) == BBS_DEVICE_PATH) { (DevicePathType (DevicePath) == BBS_DEVICE_PATH))
{
continue; continue;
} }
DEBUG_CODE_BEGIN (); DEBUG_CODE_BEGIN ();
CHAR16 *DevicePathStr; CHAR16 *DevicePathStr;
DevicePathStr = ConvertDevicePathToText (DevicePath, TRUE, TRUE);
if (DevicePathStr != NULL) {
DEBUG ((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));
FreePool (DevicePathStr);
} else {
DEBUG ((DEBUG_INFO, "DevicePathToStr failed\n"));
}
DevicePathStr = ConvertDevicePathToText (DevicePath, TRUE, TRUE);
if (DevicePathStr != NULL){
DEBUG ((DEBUG_INFO, "Try BootOption %s\n", DevicePathStr));
FreePool (DevicePathStr);
} else {
DEBUG ((DEBUG_INFO, "DevicePathToStr failed\n"));
}
DEBUG_CODE_END (); DEBUG_CODE_END ();
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs); Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
if (Map == NULL) { if (Map == NULL) {
*BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber; *BootNext = (UINT16)BootOptionBuffer[Index].OptionNumber;
*UpdateBootNext = TRUE; *UpdateBootNext = TRUE;
Print (L"Found EFI system partition on Boot%04x: %s\n", *BootNext, BootOptionBuffer[Index].Description); Print (L"Found EFI system partition on Boot%04x: %s\n", *BootNext, BootOptionBuffer[Index].Description);
Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE)); Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));
@ -491,7 +502,7 @@ GetUpdateFileSystem (
} }
if (StrnCmp (Map, ShellProtocol->GetMapFromDevicePath (&FullPath), StrLen (Map)) == 0) { if (StrnCmp (Map, ShellProtocol->GetMapFromDevicePath (&FullPath), StrLen (Map)) == 0) {
*BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber; *BootNext = (UINT16)BootOptionBuffer[Index].OptionNumber;
*UpdateBootNext = TRUE; *UpdateBootNext = TRUE;
Print (L"Found Boot Option on %s : %s\n", Map, BootOptionBuffer[Index].Description); Print (L"Found Boot Option on %s : %s\n", Map, BootOptionBuffer[Index].Description);
return EFI_SUCCESS; return EFI_SUCCESS;
@ -507,11 +518,12 @@ GetUpdateFileSystem (
// If map is assigned, try to get ESP from mapped Fs. // If map is assigned, try to get ESP from mapped Fs.
// //
DevicePath = DuplicateDevicePath (MappedDevicePath); DevicePath = DuplicateDevicePath (MappedDevicePath);
Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs); Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"Error: Cannot get EFI system partition from '%s' - %r\n", Map, Status); Print (L"Error: Cannot get EFI system partition from '%s' - %r\n", Map, Status);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
Print (L"Warning: Cannot find Boot Option on '%s'!\n", Map); Print (L"Warning: Cannot find Boot Option on '%s'!\n", Map);
} else { } else {
Status = GetEfiSysPartition (&DevicePath, Fs); Status = GetEfiSysPartition (&DevicePath, Fs);
@ -529,15 +541,16 @@ GetUpdateFileSystem (
LOAD_OPTION_ACTIVE, LOAD_OPTION_ACTIVE,
L"UEFI Capsule On Disk", L"UEFI Capsule On Disk",
DevicePath, DevicePath,
(UINT8 *) &mCapsuleOnDiskBootOptionGuid, (UINT8 *)&mCapsuleOnDiskBootOptionGuid,
sizeof(EFI_GUID) sizeof (EFI_GUID)
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1); { Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN)-1);
{
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
*UpdateBootNext = TRUE; *UpdateBootNext = TRUE;
*BootNext = (UINT16) NewOption.OptionNumber; *BootNext = (UINT16)NewOption.OptionNumber;
Print (L" Boot%04x: %s\n", *BootNext, ConvertDevicePathToText(DevicePath, TRUE, TRUE)); Print (L" Boot%04x: %s\n", *BootNext, ConvertDevicePathToText (DevicePath, TRUE, TRUE));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
} }
@ -564,25 +577,25 @@ GetUpdateFileSystem (
**/ **/
EFI_STATUS EFI_STATUS
WriteUpdateFile ( WriteUpdateFile (
IN VOID **Buffer, IN VOID **Buffer,
IN UINTN *BufferSize, IN UINTN *BufferSize,
IN CHAR16 **FileName, IN CHAR16 **FileName,
IN UINTN BufferNum, IN UINTN BufferNum,
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_FILE *Root; EFI_FILE *Root;
EFI_FILE *FileHandle; EFI_FILE *FileHandle;
EFI_FILE_PROTOCOL *DirHandle; EFI_FILE_PROTOCOL *DirHandle;
UINT64 FileInfo; UINT64 FileInfo;
VOID *Filebuffer; VOID *Filebuffer;
UINTN FileSize; UINTN FileSize;
UINTN Index; UINTN Index;
DirHandle = NULL; DirHandle = NULL;
FileHandle = NULL; FileHandle = NULL;
Index = 0; Index = 0;
// //
// Open Root from SFS // Open Root from SFS
@ -600,15 +613,16 @@ WriteUpdateFile (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = Root->Open (Root, &DirHandle, L"\\EFI", EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY); Status = Root->Open (Root, &DirHandle, L"\\EFI", EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print(L"Unable to create %s directory\n", L"\\EFI"); Print (L"Unable to create %s directory\n", L"\\EFI");
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
} }
Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE , 0);
Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE, 0);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY); Status = Root->Open (Root, &DirHandle, EFI_CAPSULE_FILE_DIRECTORY, EFI_FILE_MODE_READ | EFI_FILE_MODE_WRITE | EFI_FILE_MODE_CREATE, EFI_FILE_DIRECTORY);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print(L"Unable to create %s directory\n", EFI_CAPSULE_FILE_DIRECTORY); Print (L"Unable to create %s directory\n", EFI_CAPSULE_FILE_DIRECTORY);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
} }
@ -643,7 +657,7 @@ WriteUpdateFile (
// Set the file size to 0. // Set the file size to 0.
// //
FileInfo = 0; FileInfo = 0;
Status = FileHandleSetSize (FileHandle, FileInfo); Status = FileHandleSetSize (FileHandle, FileInfo);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"Error Deleting %s\n", FileName[Index]); Print (L"Error Deleting %s\n", FileName[Index]);
FileHandleClose (FileHandle); FileHandleClose (FileHandle);
@ -655,8 +669,8 @@ WriteUpdateFile (
// Write Filebuffer to file // Write Filebuffer to file
// //
Filebuffer = Buffer[Index]; Filebuffer = Buffer[Index];
FileSize = BufferSize[Index]; FileSize = BufferSize[Index];
Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer); Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"Unable to write Capsule Update to %s, Status = %r\n", FileName[Index], Status); Print (L"Unable to write Capsule Update to %s, Status = %r\n", FileName[Index], Status);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
@ -680,36 +694,37 @@ WriteUpdateFile (
**/ **/
EFI_STATUS EFI_STATUS
SetCapsuleStatusVariable ( SetCapsuleStatusVariable (
BOOLEAN SetCap BOOLEAN SetCap
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT64 OsIndication; UINT64 OsIndication;
UINTN DataSize; UINTN DataSize;
OsIndication = 0; OsIndication = 0;
DataSize = sizeof(UINT64); DataSize = sizeof (UINT64);
Status = gRT->GetVariable ( Status = gRT->GetVariable (
L"OsIndications", L"OsIndications",
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
NULL, NULL,
&DataSize, &DataSize,
&OsIndication &OsIndication
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
OsIndication = 0; OsIndication = 0;
} }
if (SetCap) { if (SetCap) {
OsIndication |= ((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED); OsIndication |= ((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
} } else {
else {
OsIndication &= ~((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED); OsIndication &= ~((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
} }
Status = gRT->SetVariable ( Status = gRT->SetVariable (
L"OsIndications", L"OsIndications",
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
sizeof(UINT64), sizeof (UINT64),
&OsIndication &OsIndication
); );
@ -728,18 +743,18 @@ IsCapsuleOnDiskSupported (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT64 OsIndicationsSupported; UINT64 OsIndicationsSupported;
UINTN DataSize; UINTN DataSize;
DataSize = sizeof(UINT64); DataSize = sizeof (UINT64);
Status = gRT->GetVariable ( Status = gRT->GetVariable (
L"OsIndicationsSupported", L"OsIndicationsSupported",
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
NULL, NULL,
&DataSize, &DataSize,
&OsIndicationsSupported &OsIndicationsSupported
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return FALSE; return FALSE;
} }
@ -766,19 +781,19 @@ IsCapsuleOnDiskSupported (
**/ **/
EFI_STATUS EFI_STATUS
ProcessCapsuleOnDisk ( ProcessCapsuleOnDisk (
IN VOID **CapsuleBuffer, IN VOID **CapsuleBuffer,
IN UINTN *CapsuleBufferSize, IN UINTN *CapsuleBufferSize,
IN CHAR16 **FilePath, IN CHAR16 **FilePath,
IN CHAR16 *Map, IN CHAR16 *Map,
IN UINTN CapsuleNum IN UINTN CapsuleNum
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT16 BootNext; UINT16 BootNext;
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs; EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
BOOLEAN UpdateBootNext; BOOLEAN UpdateBootNext;
CHAR16 *FileName[MAX_CAPSULE_NUM]; CHAR16 *FileName[MAX_CAPSULE_NUM];
UINTN Index; UINTN Index;
// //
// Check if Capsule On Disk is supported // Check if Capsule On Disk is supported
@ -802,7 +817,7 @@ ProcessCapsuleOnDisk (
// //
// Get file name from file path // Get file name from file path
// //
for (Index = 0; Index < CapsuleNum; Index ++) { for (Index = 0; Index < CapsuleNum; Index++) {
FileName[Index] = GetFileNameFromPath (FilePath[Index]); FileName[Index] = GetFileNameFromPath (FilePath[Index]);
} }
@ -826,13 +841,13 @@ ProcessCapsuleOnDisk (
if (UpdateBootNext) { if (UpdateBootNext) {
Status = gRT->SetVariable ( Status = gRT->SetVariable (
L"BootNext", L"BootNext",
&gEfiGlobalVariableGuid, &gEfiGlobalVariableGuid,
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE, EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
sizeof(UINT16), sizeof (UINT16),
&BootNext &BootNext
); );
if (EFI_ERROR (Status)){ if (EFI_ERROR (Status)) {
Print (L"CapsuleApp: unable to set BootNext variable.\n"); Print (L"CapsuleApp: unable to set BootNext variable.\n");
return Status; return Status;
} }

View File

@ -14,7 +14,6 @@
#include <Library/UefiBootServicesTableLib.h> #include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h> #include <Library/UefiLib.h>
#include <Protocol/UnicodeCollation.h> #include <Protocol/UnicodeCollation.h>
#include <Protocol/PiPcd.h> #include <Protocol/PiPcd.h>
#include <Protocol/Pcd.h> #include <Protocol/Pcd.h>
@ -23,7 +22,6 @@
#include <Protocol/ShellParameters.h> #include <Protocol/ShellParameters.h>
#include <Protocol/Shell.h> #include <Protocol/Shell.h>
// //
// String token ID of help message text. // String token ID of help message text.
// Shell supports to find help message in the resource section of an application image if // Shell supports to find help message in the resource section of an application image if
@ -32,24 +30,23 @@
// the resource section. Thus the application can use '-?' option to show help message in // the resource section. Thus the application can use '-?' option to show help message in
// Shell. // Shell.
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStrDumpDynPcdHelpTokenId = STRING_TOKEN (STR_DUMP_DYN_PCD_HELP_INFORMATION); GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStrDumpDynPcdHelpTokenId = STRING_TOKEN (STR_DUMP_DYN_PCD_HELP_INFORMATION);
#define MAJOR_VERSION 1 #define MAJOR_VERSION 1
#define MINOR_VERSION 0 #define MINOR_VERSION 0
static EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL; static EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL;
static EFI_PCD_PROTOCOL *mPiPcd = NULL; static EFI_PCD_PROTOCOL *mPiPcd = NULL;
static PCD_PROTOCOL *mPcd = NULL; static PCD_PROTOCOL *mPcd = NULL;
static EFI_GET_PCD_INFO_PROTOCOL *mPiPcdInfo = NULL; static EFI_GET_PCD_INFO_PROTOCOL *mPiPcdInfo = NULL;
static GET_PCD_INFO_PROTOCOL *mPcdInfo = NULL; static GET_PCD_INFO_PROTOCOL *mPcdInfo = NULL;
static CHAR16 *mTempPcdNameBuffer = NULL; static CHAR16 *mTempPcdNameBuffer = NULL;
static UINTN mTempPcdNameBufferSize = 0; static UINTN mTempPcdNameBufferSize = 0;
static CONST CHAR8 mHex[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F'}; static CONST CHAR8 mHex[] = { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9', 'A', 'B', 'C', 'D', 'E', 'F' };
static UINTN Argc;
static CHAR16 **Argv;
static UINTN Argc;
static CHAR16 **Argv;
/** /**
@ -63,15 +60,15 @@ GetArg (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters; EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gImageHandle, gImageHandle,
&gEfiShellParametersProtocolGuid, &gEfiShellParametersProtocolGuid,
(VOID**)&ShellParameters (VOID **)&ShellParameters
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -121,21 +118,21 @@ ShowHelp (
static static
VOID VOID
DumpHex ( DumpHex (
IN UINTN Indent, IN UINTN Indent,
IN UINTN Offset, IN UINTN Offset,
IN UINTN DataSize, IN UINTN DataSize,
IN VOID *UserData IN VOID *UserData
) )
{ {
UINT8 *Data; UINT8 *Data;
CHAR8 Val[50]; CHAR8 Val[50];
CHAR8 Str[20]; CHAR8 Str[20];
UINT8 TempByte; UINT8 TempByte;
UINTN Size; UINTN Size;
UINTN Index; UINTN Index;
Data = UserData; Data = UserData;
while (DataSize != 0) { while (DataSize != 0) {
@ -145,24 +142,23 @@ DumpHex (
} }
for (Index = 0; Index < Size; Index += 1) { for (Index = 0; Index < Size; Index += 1) {
TempByte = Data[Index]; TempByte = Data[Index];
Val[Index * 3 + 0] = mHex[TempByte >> 4]; Val[Index * 3 + 0] = mHex[TempByte >> 4];
Val[Index * 3 + 1] = mHex[TempByte & 0xF]; Val[Index * 3 + 1] = mHex[TempByte & 0xF];
Val[Index * 3 + 2] = (CHAR8) ((Index == 7) ? '-' : ' '); Val[Index * 3 + 2] = (CHAR8)((Index == 7) ? '-' : ' ');
Str[Index] = (CHAR8) ((TempByte < ' ' || TempByte > 'z') ? '.' : TempByte); Str[Index] = (CHAR8)((TempByte < ' ' || TempByte > 'z') ? '.' : TempByte);
} }
Val[Index * 3] = 0; Val[Index * 3] = 0;
Str[Index] = 0; Str[Index] = 0;
Print (L"%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str); Print (L"%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str);
Data += Size; Data += Size;
Offset += Size; Offset += Size;
DataSize -= Size; DataSize -= Size;
} }
} }
/** /**
Safely append with automatic string resizing given length of Destination and Safely append with automatic string resizing given length of Destination and
desired length of copy from Source. desired length of copy from Source.
@ -194,23 +190,23 @@ DumpHex (
@return Destination return the resultant string. @return Destination return the resultant string.
**/ **/
static static
CHAR16* CHAR16 *
InternalStrnCatGrow ( InternalStrnCatGrow (
IN OUT CHAR16 **Destination, IN OUT CHAR16 **Destination,
IN OUT UINTN *CurrentSize, IN OUT UINTN *CurrentSize,
IN CONST CHAR16 *Source IN CONST CHAR16 *Source
) )
{ {
UINTN DestinationStartSize; UINTN DestinationStartSize;
UINTN NewSize; UINTN NewSize;
UINTN SourceLen; UINTN SourceLen;
SourceLen = StrLen(Source); SourceLen = StrLen (Source);
// //
// ASSERTs // ASSERTs
// //
ASSERT(Destination != NULL); ASSERT (Destination != NULL);
// //
// If there's nothing to do then just return Destination // If there's nothing to do then just return Destination
@ -222,7 +218,7 @@ InternalStrnCatGrow (
// //
// allow for un-initialized pointers, based on size being 0 // allow for un-initialized pointers, based on size being 0
// //
if (CurrentSize != NULL && *CurrentSize == 0) { if ((CurrentSize != NULL) && (*CurrentSize == 0)) {
*Destination = NULL; *Destination = NULL;
} }
@ -230,9 +226,9 @@ InternalStrnCatGrow (
// allow for NULL pointers address as Destination // allow for NULL pointers address as Destination
// //
if (*Destination != NULL) { if (*Destination != NULL) {
ASSERT(CurrentSize != 0); ASSERT (CurrentSize != 0);
DestinationStartSize = StrSize(*Destination); DestinationStartSize = StrSize (*Destination);
ASSERT(DestinationStartSize <= *CurrentSize); ASSERT (DestinationStartSize <= *CurrentSize);
} else { } else {
DestinationStartSize = 0; DestinationStartSize = 0;
} }
@ -242,16 +238,17 @@ InternalStrnCatGrow (
// //
if (CurrentSize != NULL) { if (CurrentSize != NULL) {
NewSize = *CurrentSize; NewSize = *CurrentSize;
if (NewSize < DestinationStartSize + (SourceLen * sizeof(CHAR16))) { if (NewSize < DestinationStartSize + (SourceLen * sizeof (CHAR16))) {
while (NewSize < (DestinationStartSize + (SourceLen*sizeof(CHAR16)))) { while (NewSize < (DestinationStartSize + (SourceLen*sizeof (CHAR16)))) {
NewSize += 2 * SourceLen * sizeof(CHAR16); NewSize += 2 * SourceLen * sizeof (CHAR16);
} }
*Destination = ReallocatePool(*CurrentSize, NewSize, *Destination);
*Destination = ReallocatePool (*CurrentSize, NewSize, *Destination);
*CurrentSize = NewSize; *CurrentSize = NewSize;
} }
} else { } else {
NewSize = (SourceLen + 1)*sizeof(CHAR16); NewSize = (SourceLen + 1)*sizeof (CHAR16);
*Destination = AllocateZeroPool(NewSize); *Destination = AllocateZeroPool (NewSize);
} }
// //
@ -261,7 +258,7 @@ InternalStrnCatGrow (
return (NULL); return (NULL);
} }
StrnCatS(*Destination, NewSize/sizeof(CHAR16), Source, SourceLen); StrnCatS (*Destination, NewSize/sizeof (CHAR16), Source, SourceLen);
return *Destination; return *Destination;
} }
@ -276,15 +273,15 @@ InternalStrnCatGrow (
static static
CHAR16 * CHAR16 *
GetPcdTypeString ( GetPcdTypeString (
IN CONST EFI_GUID *TokenSpace, IN CONST EFI_GUID *TokenSpace,
IN EFI_PCD_TYPE PcdType IN EFI_PCD_TYPE PcdType
) )
{ {
UINTN BufLen; UINTN BufLen;
CHAR16 *RetString; CHAR16 *RetString;
BufLen = 0; BufLen = 0;
RetString = NULL; RetString = NULL;
switch (PcdType) { switch (PcdType) {
case EFI_PCD_TYPE_8: case EFI_PCD_TYPE_8:
@ -329,18 +326,18 @@ GetPcdTypeString (
static static
VOID VOID
DumpPcdInfo ( DumpPcdInfo (
IN CONST EFI_GUID *TokenSpace, IN CONST EFI_GUID *TokenSpace,
IN UINTN TokenNumber, IN UINTN TokenNumber,
IN EFI_PCD_INFO *PcdInfo IN EFI_PCD_INFO *PcdInfo
) )
{ {
CHAR16 *RetString; CHAR16 *RetString;
UINT8 Uint8; UINT8 Uint8;
UINT16 Uint16; UINT16 Uint16;
UINT32 Uint32; UINT32 Uint32;
UINT64 Uint64; UINT64 Uint64;
BOOLEAN Boolean; BOOLEAN Boolean;
VOID *PcdData; VOID *PcdData;
RetString = NULL; RetString = NULL;
@ -363,6 +360,7 @@ DumpPcdInfo (
} else { } else {
Uint8 = mPiPcd->Get8 (TokenSpace, TokenNumber); Uint8 = mPiPcd->Get8 (TokenSpace, TokenNumber);
} }
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint8); Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint8);
break; break;
case EFI_PCD_TYPE_16: case EFI_PCD_TYPE_16:
@ -371,6 +369,7 @@ DumpPcdInfo (
} else { } else {
Uint16 = mPiPcd->Get16 (TokenSpace, TokenNumber); Uint16 = mPiPcd->Get16 (TokenSpace, TokenNumber);
} }
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint16); Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint16);
break; break;
case EFI_PCD_TYPE_32: case EFI_PCD_TYPE_32:
@ -379,6 +378,7 @@ DumpPcdInfo (
} else { } else {
Uint32 = mPiPcd->Get32 (TokenSpace, TokenNumber); Uint32 = mPiPcd->Get32 (TokenSpace, TokenNumber);
} }
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint32); Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint32);
break; break;
case EFI_PCD_TYPE_64: case EFI_PCD_TYPE_64:
@ -387,6 +387,7 @@ DumpPcdInfo (
} else { } else {
Uint64 = mPiPcd->Get64 (TokenSpace, TokenNumber); Uint64 = mPiPcd->Get64 (TokenSpace, TokenNumber);
} }
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%lx\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint64); Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = 0x%lx\n", TokenNumber, RetString, PcdInfo->PcdSize, Uint64);
break; break;
case EFI_PCD_TYPE_BOOL: case EFI_PCD_TYPE_BOOL:
@ -395,6 +396,7 @@ DumpPcdInfo (
} else { } else {
Boolean = mPiPcd->GetBool (TokenSpace, TokenNumber); Boolean = mPiPcd->GetBool (TokenSpace, TokenNumber);
} }
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = %a\n", TokenNumber, RetString, PcdInfo->PcdSize, Boolean ? "TRUE" : "FALSE"); Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x - Value = %a\n", TokenNumber, RetString, PcdInfo->PcdSize, Boolean ? "TRUE" : "FALSE");
break; break;
case EFI_PCD_TYPE_PTR: case EFI_PCD_TYPE_PTR:
@ -403,6 +405,7 @@ DumpPcdInfo (
} else { } else {
PcdData = mPiPcd->GetPtr (TokenSpace, TokenNumber); PcdData = mPiPcd->GetPtr (TokenSpace, TokenNumber);
} }
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize); Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize);
DumpHex (2, 0, PcdInfo->PcdSize, PcdData); DumpHex (2, 0, PcdInfo->PcdSize, PcdData);
break; break;
@ -413,6 +416,7 @@ DumpPcdInfo (
if (RetString != NULL) { if (RetString != NULL) {
FreePool (RetString); FreePool (RetString);
} }
Print (L"\n"); Print (L"\n");
} }
@ -429,20 +433,20 @@ DumpPcdInfo (
static static
EFI_STATUS EFI_STATUS
ProcessPcd ( ProcessPcd (
IN CHAR16 *InputPcdName IN CHAR16 *InputPcdName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_GUID *TokenSpace; EFI_GUID *TokenSpace;
UINTN TokenNumber; UINTN TokenNumber;
EFI_PCD_INFO PcdInfo; EFI_PCD_INFO PcdInfo;
BOOLEAN Found; BOOLEAN Found;
UINTN PcdNameSize; UINTN PcdNameSize;
PcdInfo.PcdName = NULL; PcdInfo.PcdName = NULL;
PcdInfo.PcdSize = 0; PcdInfo.PcdSize = 0;
PcdInfo.PcdType = 0xFF; PcdInfo.PcdType = 0xFF;
Found = FALSE; Found = FALSE;
Print (L"Current system SKU ID: 0x%x\n\n", mPiPcdInfo->GetSku ()); Print (L"Current system SKU ID: 0x%x\n\n", mPiPcdInfo->GetSku ());
@ -451,7 +455,7 @@ ProcessPcd (
TokenNumber = 0; TokenNumber = 0;
do { do {
Status = mPiPcd->GetNextToken (TokenSpace, &TokenNumber); Status = mPiPcd->GetNextToken (TokenSpace, &TokenNumber);
if (!EFI_ERROR (Status) && TokenNumber != 0) { if (!EFI_ERROR (Status) && (TokenNumber != 0)) {
if (TokenSpace == NULL) { if (TokenSpace == NULL) {
// //
// PCD in default Token Space. // PCD in default Token Space.
@ -460,27 +464,32 @@ ProcessPcd (
} else { } else {
mPiPcdInfo->GetInfo (TokenSpace, TokenNumber, &PcdInfo); mPiPcdInfo->GetInfo (TokenSpace, TokenNumber, &PcdInfo);
} }
if (InputPcdName != NULL) { if (InputPcdName != NULL) {
if (PcdInfo.PcdName == NULL) { if (PcdInfo.PcdName == NULL) {
continue; continue;
} }
PcdNameSize = AsciiStrSize (PcdInfo.PcdName) * sizeof (CHAR16); PcdNameSize = AsciiStrSize (PcdInfo.PcdName) * sizeof (CHAR16);
if (mTempPcdNameBuffer == NULL) { if (mTempPcdNameBuffer == NULL) {
mTempPcdNameBufferSize = PcdNameSize; mTempPcdNameBufferSize = PcdNameSize;
mTempPcdNameBuffer = AllocatePool (mTempPcdNameBufferSize); mTempPcdNameBuffer = AllocatePool (mTempPcdNameBufferSize);
} else if (mTempPcdNameBufferSize < PcdNameSize) { } else if (mTempPcdNameBufferSize < PcdNameSize) {
mTempPcdNameBuffer = ReallocatePool (mTempPcdNameBufferSize, PcdNameSize, mTempPcdNameBuffer); mTempPcdNameBuffer = ReallocatePool (mTempPcdNameBufferSize, PcdNameSize, mTempPcdNameBuffer);
mTempPcdNameBufferSize = PcdNameSize; mTempPcdNameBufferSize = PcdNameSize;
} }
if (mTempPcdNameBuffer == NULL) { if (mTempPcdNameBuffer == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
AsciiStrToUnicodeStrS (PcdInfo.PcdName, mTempPcdNameBuffer, mTempPcdNameBufferSize / sizeof (CHAR16)); AsciiStrToUnicodeStrS (PcdInfo.PcdName, mTempPcdNameBuffer, mTempPcdNameBufferSize / sizeof (CHAR16));
// //
// Compare the input PCD name with the PCD name in PCD database. // Compare the input PCD name with the PCD name in PCD database.
// //
if ((StrStr (mTempPcdNameBuffer, InputPcdName) != NULL) || if ((StrStr (mTempPcdNameBuffer, InputPcdName) != NULL) ||
(mUnicodeCollation != NULL && mUnicodeCollation->MetaiMatch (mUnicodeCollation, mTempPcdNameBuffer, InputPcdName))) { ((mUnicodeCollation != NULL) && mUnicodeCollation->MetaiMatch (mUnicodeCollation, mTempPcdNameBuffer, InputPcdName)))
{
// //
// Found matched PCD. // Found matched PCD.
// //
@ -493,7 +502,7 @@ ProcessPcd (
} }
} while (!EFI_ERROR (Status) && TokenNumber != 0); } while (!EFI_ERROR (Status) && TokenNumber != 0);
Status = mPiPcd->GetNextTokenSpace ((CONST EFI_GUID **) &TokenSpace); Status = mPiPcd->GetNextTokenSpace ((CONST EFI_GUID **)&TokenSpace);
} while (!EFI_ERROR (Status) && TokenSpace != NULL); } while (!EFI_ERROR (Status) && TokenSpace != NULL);
if ((InputPcdName != NULL) && !Found) { if ((InputPcdName != NULL) && !Found) {
@ -503,6 +512,7 @@ ProcessPcd (
Print (L"%EError. %NNo matching PCD found: %s.\n", InputPcdName); Print (L"%EError. %NNo matching PCD found: %s.\n", InputPcdName);
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -526,35 +536,35 @@ DumpDynPcdMain (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
CHAR16 *InputPcdName; CHAR16 *InputPcdName;
InputPcdName = NULL; InputPcdName = NULL;
Status = gBS->LocateProtocol(&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID **) &mUnicodeCollation); Status = gBS->LocateProtocol (&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID **)&mUnicodeCollation);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
mUnicodeCollation = NULL; mUnicodeCollation = NULL;
} }
Status = gBS->LocateProtocol (&gEfiPcdProtocolGuid, NULL, (VOID **) &mPiPcd); Status = gBS->LocateProtocol (&gEfiPcdProtocolGuid, NULL, (VOID **)&mPiPcd);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"DumpDynPcd: %EError. %NPI PCD protocol is not present.\n"); Print (L"DumpDynPcd: %EError. %NPI PCD protocol is not present.\n");
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gEfiGetPcdInfoProtocolGuid, NULL, (VOID **) &mPiPcdInfo); Status = gBS->LocateProtocol (&gEfiGetPcdInfoProtocolGuid, NULL, (VOID **)&mPiPcdInfo);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"DumpDynPcd: %EError. %NPI PCD info protocol is not present.\n"); Print (L"DumpDynPcd: %EError. %NPI PCD info protocol is not present.\n");
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **) &mPcd); Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **)&mPcd);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"DumpDynPcd: %EError. %NPCD protocol is not present.\n"); Print (L"DumpDynPcd: %EError. %NPCD protocol is not present.\n");
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gGetPcdInfoProtocolGuid, NULL, (VOID **) &mPcdInfo); Status = gBS->LocateProtocol (&gGetPcdInfoProtocolGuid, NULL, (VOID **)&mPcdInfo);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Print (L"DumpDynPcd: %EError. %NPCD info protocol is not present.\n"); Print (L"DumpDynPcd: %EError. %NPCD info protocol is not present.\n");
return Status; return Status;
@ -563,33 +573,33 @@ DumpDynPcdMain (
// //
// get the command line arguments // get the command line arguments
// //
Status = GetArg(); Status = GetArg ();
if (EFI_ERROR(Status)){ if (EFI_ERROR (Status)) {
Print (L"DumpDynPcd: %EError. %NThe input parameters are not recognized.\n"); Print (L"DumpDynPcd: %EError. %NThe input parameters are not recognized.\n");
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
return Status; return Status;
} }
if (Argc > 2){ if (Argc > 2) {
Print (L"DumpDynPcd: %EError. %NToo many arguments specified.\n"); Print (L"DumpDynPcd: %EError. %NToo many arguments specified.\n");
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
return Status; return Status;
} }
if (Argc == 1){ if (Argc == 1) {
Status = ProcessPcd (InputPcdName); Status = ProcessPcd (InputPcdName);
goto Done; goto Done;
} }
if ((StrCmp(Argv[1], L"-?") == 0)||(StrCmp(Argv[1], L"-h") == 0)||(StrCmp(Argv[1], L"-H") == 0)){ if ((StrCmp (Argv[1], L"-?") == 0) || (StrCmp (Argv[1], L"-h") == 0) || (StrCmp (Argv[1], L"-H") == 0)) {
ShowHelp (); ShowHelp ();
goto Done; goto Done;
} else { } else {
if ((StrCmp(Argv[1], L"-v") == 0)||(StrCmp(Argv[1], L"-V") == 0)){ if ((StrCmp (Argv[1], L"-v") == 0) || (StrCmp (Argv[1], L"-V") == 0)) {
ShowVersion (); ShowVersion ();
goto Done; goto Done;
} else { } else {
if (StrStr(Argv[1], L"-") != NULL){ if (StrStr (Argv[1], L"-") != NULL) {
Print (L"DumpDynPcd: %EError. %NThe argument '%B%s%N' is invalid.\n", Argv[1]); Print (L"DumpDynPcd: %EError. %NThe argument '%B%s%N' is invalid.\n", Argv[1]);
goto Done; goto Done;
} }
@ -597,9 +607,9 @@ DumpDynPcdMain (
} }
InputPcdName = Argv[1]; InputPcdName = Argv[1];
Status = ProcessPcd (InputPcdName); Status = ProcessPcd (InputPcdName);
Done: Done:
if (mTempPcdNameBuffer != NULL) { if (mTempPcdNameBuffer != NULL) {
FreePool (mTempPcdNameBuffer); FreePool (mTempPcdNameBuffer);
@ -607,4 +617,3 @@ DumpDynPcdMain (
return Status; return Status;
} }

View File

@ -20,7 +20,7 @@
// the resource section. Thus the application can use '-?' option to show help message in // the resource section. Thus the application can use '-?' option to show help message in
// Shell. // Shell.
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStringHelpTokenId = STRING_TOKEN (STR_HELLO_WORLD_HELP_INFORMATION); GLOBAL_REMOVE_IF_UNREFERENCED EFI_STRING_ID mStringHelpTokenId = STRING_TOKEN (STR_HELLO_WORLD_HELP_INFORMATION);
/** /**
The user Entry Point for Application. The user code starts with this function The user Entry Point for Application. The user code starts with this function
@ -40,7 +40,7 @@ UefiMain (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
UINT32 Index; UINT32 Index;
Index = 0; Index = 0;
@ -48,11 +48,11 @@ UefiMain (
// Three PCD type (FeatureFlag, UINT32 and String) are used as the sample. // Three PCD type (FeatureFlag, UINT32 and String) are used as the sample.
// //
if (FeaturePcdGet (PcdHelloWorldPrintEnable)) { if (FeaturePcdGet (PcdHelloWorldPrintEnable)) {
for (Index = 0; Index < PcdGet32 (PcdHelloWorldPrintTimes); Index ++) { for (Index = 0; Index < PcdGet32 (PcdHelloWorldPrintTimes); Index++) {
// //
// Use UefiLib Print API to print string to UEFI console // Use UefiLib Print API to print string to UEFI console
// //
Print ((CHAR16*)PcdGetPtr (PcdHelloWorldPrintString)); Print ((CHAR16 *)PcdGetPtr (PcdHelloWorldPrintString));
} }
} }

View File

@ -23,7 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Guid/SmiHandlerProfile.h> #include <Guid/SmiHandlerProfile.h>
#define PROFILE_NAME_STRING_LENGTH 64 #define PROFILE_NAME_STRING_LENGTH 64
CHAR8 mNameString[PROFILE_NAME_STRING_LENGTH + 1]; CHAR8 mNameString[PROFILE_NAME_STRING_LENGTH + 1];
VOID *mSmiHandlerProfileDatabase; VOID *mSmiHandlerProfileDatabase;
UINTN mSmiHandlerProfileDatabaseSize; UINTN mSmiHandlerProfileDatabaseSize;
@ -41,6 +41,7 @@ InternalDumpData (
) )
{ {
UINTN Index; UINTN Index;
for (Index = 0; Index < Size; Index++) { for (Index = 0; Index < Size; Index++) {
Print (L"%02x", (UINTN)Data[Index]); Print (L"%02x", (UINTN)Data[Index]);
if ((Index + 1) != Size) { if ((Index + 1) != Size) {
@ -53,79 +54,82 @@ InternalDumpData (
Get SMI handler profile database. Get SMI handler profile database.
**/ **/
VOID VOID
GetSmiHandlerProfileDatabase( GetSmiHandlerProfileDatabase (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN CommSize; UINTN CommSize;
UINT8 *CommBuffer; UINT8 *CommBuffer;
EFI_SMM_COMMUNICATE_HEADER *CommHeader; EFI_SMM_COMMUNICATE_HEADER *CommHeader;
SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *CommGetInfo; SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *CommGetInfo;
SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *CommGetData; SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *CommGetData;
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication; EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;
UINTN MinimalSizeNeeded; UINTN MinimalSizeNeeded;
EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable; EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
UINT32 Index; UINT32 Index;
EFI_MEMORY_DESCRIPTOR *Entry; EFI_MEMORY_DESCRIPTOR *Entry;
VOID *Buffer; VOID *Buffer;
UINTN Size; UINTN Size;
UINTN Offset; UINTN Offset;
Status = gBS->LocateProtocol(&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&SmmCommunication); Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&SmmCommunication);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"SmiHandlerProfile: Locate SmmCommunication protocol - %r\n", Status); Print (L"SmiHandlerProfile: Locate SmmCommunication protocol - %r\n", Status);
return ; return;
} }
MinimalSizeNeeded = EFI_PAGE_SIZE; MinimalSizeNeeded = EFI_PAGE_SIZE;
Status = EfiGetSystemConfigurationTable( Status = EfiGetSystemConfigurationTable (
&gEdkiiPiSmmCommunicationRegionTableGuid, &gEdkiiPiSmmCommunicationRegionTableGuid,
(VOID **)&PiSmmCommunicationRegionTable (VOID **)&PiSmmCommunicationRegionTable
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"SmiHandlerProfile: Get PiSmmCommunicationRegionTable - %r\n", Status); Print (L"SmiHandlerProfile: Get PiSmmCommunicationRegionTable - %r\n", Status);
return ; return;
} }
ASSERT(PiSmmCommunicationRegionTable != NULL);
ASSERT (PiSmmCommunicationRegionTable != NULL);
Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1); Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1);
Size = 0; Size = 0;
for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) { for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {
if (Entry->Type == EfiConventionalMemory) { if (Entry->Type == EfiConventionalMemory) {
Size = EFI_PAGES_TO_SIZE((UINTN)Entry->NumberOfPages); Size = EFI_PAGES_TO_SIZE ((UINTN)Entry->NumberOfPages);
if (Size >= MinimalSizeNeeded) { if (Size >= MinimalSizeNeeded) {
break; break;
} }
} }
Entry = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Entry + PiSmmCommunicationRegionTable->DescriptorSize); Entry = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Entry + PiSmmCommunicationRegionTable->DescriptorSize);
} }
ASSERT(Index < PiSmmCommunicationRegionTable->NumberOfEntries);
ASSERT (Index < PiSmmCommunicationRegionTable->NumberOfEntries);
CommBuffer = (UINT8 *)(UINTN)Entry->PhysicalStart; CommBuffer = (UINT8 *)(UINTN)Entry->PhysicalStart;
// //
// Get Size // Get Size
// //
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0]; CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
CopyMem(&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof(gSmiHandlerProfileGuid)); CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
CommHeader->MessageLength = sizeof(SMI_HANDLER_PROFILE_PARAMETER_GET_INFO); CommHeader->MessageLength = sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO);
CommGetInfo = (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *)&CommBuffer[OFFSET_OF(EFI_SMM_COMMUNICATE_HEADER, Data)]; CommGetInfo = (SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
CommGetInfo->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_INFO; CommGetInfo->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_INFO;
CommGetInfo->Header.DataLength = sizeof(*CommGetInfo); CommGetInfo->Header.DataLength = sizeof (*CommGetInfo);
CommGetInfo->Header.ReturnStatus = (UINT64)-1; CommGetInfo->Header.ReturnStatus = (UINT64)-1;
CommGetInfo->DataSize = 0; CommGetInfo->DataSize = 0;
CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + CommHeader->MessageLength; CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
Status = SmmCommunication->Communicate(SmmCommunication, CommBuffer, &CommSize); Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
Print(L"SmiHandlerProfile: SmmCommunication - %r\n", Status); Print (L"SmiHandlerProfile: SmmCommunication - %r\n", Status);
return ; return;
} }
if (CommGetInfo->Header.ReturnStatus != 0) { if (CommGetInfo->Header.ReturnStatus != 0) {
Print(L"SmiHandlerProfile: GetInfo - 0x%0x\n", CommGetInfo->Header.ReturnStatus); Print (L"SmiHandlerProfile: GetInfo - 0x%0x\n", CommGetInfo->Header.ReturnStatus);
return ; return;
} }
mSmiHandlerProfileDatabaseSize = (UINTN)CommGetInfo->DataSize; mSmiHandlerProfileDatabaseSize = (UINTN)CommGetInfo->DataSize;
@ -133,25 +137,25 @@ GetSmiHandlerProfileDatabase(
// //
// Get Data // Get Data
// //
mSmiHandlerProfileDatabase = AllocateZeroPool(mSmiHandlerProfileDatabaseSize); mSmiHandlerProfileDatabase = AllocateZeroPool (mSmiHandlerProfileDatabaseSize);
if (mSmiHandlerProfileDatabase == NULL) { if (mSmiHandlerProfileDatabase == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
Print(L"SmiHandlerProfile: AllocateZeroPool (0x%x) for dump buffer - %r\n", mSmiHandlerProfileDatabaseSize, Status); Print (L"SmiHandlerProfile: AllocateZeroPool (0x%x) for dump buffer - %r\n", mSmiHandlerProfileDatabaseSize, Status);
return ; return;
} }
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0]; CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
CopyMem(&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof(gSmiHandlerProfileGuid)); CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
CommHeader->MessageLength = sizeof(SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET); CommHeader->MessageLength = sizeof (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET);
CommGetData = (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *)&CommBuffer[OFFSET_OF(EFI_SMM_COMMUNICATE_HEADER, Data)]; CommGetData = (SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *)&CommBuffer[OFFSET_OF (EFI_SMM_COMMUNICATE_HEADER, Data)];
CommGetData->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET; CommGetData->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET;
CommGetData->Header.DataLength = sizeof(*CommGetData); CommGetData->Header.DataLength = sizeof (*CommGetData);
CommGetData->Header.ReturnStatus = (UINT64)-1; CommGetData->Header.ReturnStatus = (UINT64)-1;
CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + CommHeader->MessageLength; CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
Buffer = (UINT8 *)CommHeader + CommSize; Buffer = (UINT8 *)CommHeader + CommSize;
Size -= CommSize; Size -= CommSize;
CommGetData->DataBuffer = (PHYSICAL_ADDRESS)(UINTN)Buffer; CommGetData->DataBuffer = (PHYSICAL_ADDRESS)(UINTN)Buffer;
CommGetData->DataOffset = 0; CommGetData->DataOffset = 0;
@ -162,21 +166,23 @@ GetSmiHandlerProfileDatabase(
} else { } else {
CommGetData->DataSize = (UINT64)(mSmiHandlerProfileDatabaseSize - CommGetData->DataOffset); CommGetData->DataSize = (UINT64)(mSmiHandlerProfileDatabaseSize - CommGetData->DataOffset);
} }
Status = SmmCommunication->Communicate(SmmCommunication, CommBuffer, &CommSize);
ASSERT_EFI_ERROR(Status); Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
ASSERT_EFI_ERROR (Status);
if (CommGetData->Header.ReturnStatus != 0) { if (CommGetData->Header.ReturnStatus != 0) {
FreePool(mSmiHandlerProfileDatabase); FreePool (mSmiHandlerProfileDatabase);
mSmiHandlerProfileDatabase = NULL; mSmiHandlerProfileDatabase = NULL;
Print(L"SmiHandlerProfile: GetData - 0x%x\n", CommGetData->Header.ReturnStatus); Print (L"SmiHandlerProfile: GetData - 0x%x\n", CommGetData->Header.ReturnStatus);
return ; return;
} }
CopyMem((UINT8 *)mSmiHandlerProfileDatabase + Offset, (VOID *)(UINTN)CommGetData->DataBuffer, (UINTN)CommGetData->DataSize);
CopyMem ((UINT8 *)mSmiHandlerProfileDatabase + Offset, (VOID *)(UINTN)CommGetData->DataBuffer, (UINTN)CommGetData->DataSize);
} }
DEBUG ((DEBUG_INFO, "SmiHandlerProfileSize - 0x%x\n", mSmiHandlerProfileDatabaseSize)); DEBUG ((DEBUG_INFO, "SmiHandlerProfileSize - 0x%x\n", mSmiHandlerProfileDatabaseSize));
return ; return;
} }
/** /**
@ -193,14 +199,14 @@ GetSmiHandlerProfileDatabase(
**/ **/
VOID VOID
GetShortPdbFileName ( GetShortPdbFileName (
IN CHAR8 *PdbFileName, IN CHAR8 *PdbFileName,
OUT CHAR8 *AsciiBuffer OUT CHAR8 *AsciiBuffer
) )
{ {
UINTN IndexPdb; // Current work location within a Pdb string. UINTN IndexPdb; // Current work location within a Pdb string.
UINTN IndexBuffer; // Current work location within a Buffer string. UINTN IndexBuffer; // Current work location within a Buffer string.
UINTN StartIndex; UINTN StartIndex;
UINTN EndIndex; UINTN EndIndex;
ZeroMem (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1); ZeroMem (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1);
@ -208,7 +214,9 @@ GetShortPdbFileName (
AsciiStrnCpyS (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1, " ", 1); AsciiStrnCpyS (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1, " ", 1);
} else { } else {
StartIndex = 0; StartIndex = 0;
for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++); for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++) {
}
for (IndexPdb = 0; PdbFileName[IndexPdb] != 0; IndexPdb++) { for (IndexPdb = 0; PdbFileName[IndexPdb] != 0; IndexPdb++) {
if ((PdbFileName[IndexPdb] == '\\') || (PdbFileName[IndexPdb] == '/')) { if ((PdbFileName[IndexPdb] == '\\') || (PdbFileName[IndexPdb] == '/')) {
StartIndex = IndexPdb + 1; StartIndex = IndexPdb + 1;
@ -248,9 +256,9 @@ GetDriverNameString (
IN SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct IN SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
CHAR16 *NameString; CHAR16 *NameString;
UINTN StringSize; UINTN StringSize;
if (ImageStruct == NULL) { if (ImageStruct == NULL) {
return "???"; return "???";
@ -260,7 +268,7 @@ GetDriverNameString (
// Method 1: Get the name string from image PDB // Method 1: Get the name string from image PDB
// //
if (ImageStruct->PdbStringOffset != 0) { if (ImageStruct->PdbStringOffset != 0) {
GetShortPdbFileName ((CHAR8 *) ((UINTN) ImageStruct + ImageStruct->PdbStringOffset), mNameString); GetShortPdbFileName ((CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mNameString);
return mNameString; return mNameString;
} }
@ -270,13 +278,13 @@ GetDriverNameString (
// //
NameString = NULL; NameString = NULL;
StringSize = 0; StringSize = 0;
Status = GetSectionFromAnyFv ( Status = GetSectionFromAnyFv (
&ImageStruct->FileGuid, &ImageStruct->FileGuid,
EFI_SECTION_USER_INTERFACE, EFI_SECTION_USER_INTERFACE,
0, 0,
(VOID **) &NameString, (VOID **)&NameString,
&StringSize &StringSize
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
// //
// Method 2: Get the name string from FFS UI section // Method 2: Get the name string from FFS UI section
@ -284,6 +292,7 @@ GetDriverNameString (
if (StrLen (NameString) > PROFILE_NAME_STRING_LENGTH) { if (StrLen (NameString) > PROFILE_NAME_STRING_LENGTH) {
NameString[PROFILE_NAME_STRING_LENGTH] = 0; NameString[PROFILE_NAME_STRING_LENGTH] = 0;
} }
UnicodeStrToAsciiStrS (NameString, mNameString, sizeof (mNameString)); UnicodeStrToAsciiStrS (NameString, mNameString, sizeof (mNameString));
FreePool (NameString); FreePool (NameString);
return mNameString; return mNameString;
@ -306,7 +315,7 @@ GetDriverNameString (
**/ **/
SMM_CORE_IMAGE_DATABASE_STRUCTURE * SMM_CORE_IMAGE_DATABASE_STRUCTURE *
GetImageFromRef ( GetImageFromRef (
IN UINTN ImageRef IN UINTN ImageRef
) )
{ {
SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct; SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct;
@ -318,6 +327,7 @@ GetImageFromRef (
return ImageStruct; return ImageStruct;
} }
} }
ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length); ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length);
} }
@ -328,7 +338,7 @@ GetImageFromRef (
Dump SMM loaded image information. Dump SMM loaded image information.
**/ **/
VOID VOID
DumpSmmLoadedImage( DumpSmmLoadedImage (
VOID VOID
) )
{ {
@ -340,19 +350,21 @@ DumpSmmLoadedImage(
while ((UINTN)ImageStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) { while ((UINTN)ImageStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) {
if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) { if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) {
NameString = GetDriverNameString (ImageStruct); NameString = GetDriverNameString (ImageStruct);
Print(L" <Image Name=\"%a\"", NameString); Print (L" <Image Name=\"%a\"", NameString);
Print(L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase, ImageStruct->ImageSize); Print (L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase, ImageStruct->ImageSize);
if (ImageStruct->EntryPoint != 0) { if (ImageStruct->EntryPoint != 0) {
Print(L" EntryPoint=\"0x%lx\"", ImageStruct->EntryPoint); Print (L" EntryPoint=\"0x%lx\"", ImageStruct->EntryPoint);
} }
Print(L" FvFile=\"%g\"", &ImageStruct->FileGuid);
Print(L" RefId=\"0x%x\"", ImageStruct->ImageRef); Print (L" FvFile=\"%g\"", &ImageStruct->FileGuid);
Print(L">\n"); Print (L" RefId=\"0x%x\"", ImageStruct->ImageRef);
Print (L">\n");
if (ImageStruct->PdbStringOffset != 0) { if (ImageStruct->PdbStringOffset != 0) {
PdbString = (CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset); PdbString = (CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset);
Print(L" <Pdb>%a</Pdb>\n", PdbString); Print (L" <Pdb>%a</Pdb>\n", PdbString);
} }
Print(L" </Image>\n");
Print (L" </Image>\n");
} }
ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length); ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length);
@ -361,7 +373,7 @@ DumpSmmLoadedImage(
return; return;
} }
CHAR8 *mSxTypeString[] = { CHAR8 *mSxTypeString[] = {
"SxS0", "SxS0",
"SxS1", "SxS1",
"SxS2", "SxS2",
@ -382,15 +394,15 @@ SxTypeToString (
IN EFI_SLEEP_TYPE Type IN EFI_SLEEP_TYPE Type
) )
{ {
if (Type >= 0 && Type < ARRAY_SIZE(mSxTypeString)) { if ((Type >= 0) && (Type < ARRAY_SIZE (mSxTypeString))) {
return mSxTypeString[Type]; return mSxTypeString[Type];
} else { } else {
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Type); AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
return mNameString; return mNameString;
} }
} }
CHAR8 *mSxPhaseString[] = { CHAR8 *mSxPhaseString[] = {
"SxEntry", "SxEntry",
"SxExit", "SxExit",
}; };
@ -404,18 +416,18 @@ CHAR8 *mSxPhaseString[] = {
**/ **/
CHAR8 * CHAR8 *
SxPhaseToString ( SxPhaseToString (
IN EFI_SLEEP_PHASE Phase IN EFI_SLEEP_PHASE Phase
) )
{ {
if (Phase >= 0 && Phase < ARRAY_SIZE(mSxPhaseString)) { if ((Phase >= 0) && (Phase < ARRAY_SIZE (mSxPhaseString))) {
return mSxPhaseString[Phase]; return mSxPhaseString[Phase];
} else { } else {
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Phase); AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
return mNameString; return mNameString;
} }
} }
CHAR8 *mPowerButtonPhaseString[] = { CHAR8 *mPowerButtonPhaseString[] = {
"PowerButtonEntry", "PowerButtonEntry",
"PowerButtonExit", "PowerButtonExit",
}; };
@ -432,15 +444,15 @@ PowerButtonPhaseToString (
IN EFI_POWER_BUTTON_PHASE Phase IN EFI_POWER_BUTTON_PHASE Phase
) )
{ {
if (Phase >= 0 && Phase < ARRAY_SIZE(mPowerButtonPhaseString)) { if ((Phase >= 0) && (Phase < ARRAY_SIZE (mPowerButtonPhaseString))) {
return mPowerButtonPhaseString[Phase]; return mPowerButtonPhaseString[Phase];
} else { } else {
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Phase); AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
return mNameString; return mNameString;
} }
} }
CHAR8 *mStandbyButtonPhaseString[] = { CHAR8 *mStandbyButtonPhaseString[] = {
"StandbyButtonEntry", "StandbyButtonEntry",
"StandbyButtonExit", "StandbyButtonExit",
}; };
@ -457,15 +469,15 @@ StandbyButtonPhaseToString (
IN EFI_STANDBY_BUTTON_PHASE Phase IN EFI_STANDBY_BUTTON_PHASE Phase
) )
{ {
if (Phase >= 0 && Phase < ARRAY_SIZE(mStandbyButtonPhaseString)) { if ((Phase >= 0) && (Phase < ARRAY_SIZE (mStandbyButtonPhaseString))) {
return mStandbyButtonPhaseString[Phase]; return mStandbyButtonPhaseString[Phase];
} else { } else {
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Phase); AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
return mNameString; return mNameString;
} }
} }
CHAR8 *mIoTrapTypeString[] = { CHAR8 *mIoTrapTypeString[] = {
"WriteTrap", "WriteTrap",
"ReadTrap", "ReadTrap",
"ReadWriteTrap", "ReadWriteTrap",
@ -483,15 +495,15 @@ IoTrapTypeToString (
IN EFI_SMM_IO_TRAP_DISPATCH_TYPE Type IN EFI_SMM_IO_TRAP_DISPATCH_TYPE Type
) )
{ {
if (Type >= 0 && Type < ARRAY_SIZE(mIoTrapTypeString)) { if ((Type >= 0) && (Type < ARRAY_SIZE (mIoTrapTypeString))) {
return mIoTrapTypeString[Type]; return mIoTrapTypeString[Type];
} else { } else {
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Type); AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
return mNameString; return mNameString;
} }
} }
CHAR8 *mUsbTypeString[] = { CHAR8 *mUsbTypeString[] = {
"UsbLegacy", "UsbLegacy",
"UsbWake", "UsbWake",
}; };
@ -505,13 +517,13 @@ CHAR8 *mUsbTypeString[] = {
**/ **/
CHAR8 * CHAR8 *
UsbTypeToString ( UsbTypeToString (
IN EFI_USB_SMI_TYPE Type IN EFI_USB_SMI_TYPE Type
) )
{ {
if (Type >= 0 && Type < ARRAY_SIZE(mUsbTypeString)) { if ((Type >= 0) && (Type < ARRAY_SIZE (mUsbTypeString))) {
return mUsbTypeString[Type]; return mUsbTypeString[Type];
} else { } else {
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Type); AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
return mNameString; return mNameString;
} }
} }
@ -525,42 +537,42 @@ UsbTypeToString (
**/ **/
VOID VOID
DumpSmiChildContext ( DumpSmiChildContext (
IN EFI_GUID *HandlerType, IN EFI_GUID *HandlerType,
IN VOID *Context, IN VOID *Context,
IN UINTN ContextSize IN UINTN ContextSize
) )
{ {
CHAR16 *Str; CHAR16 *Str;
if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) { if (CompareGuid (HandlerType, &gEfiSmmSwDispatch2ProtocolGuid)) {
Print(L" SwSmi=\"0x%lx\"", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue); Print (L" SwSmi=\"0x%lx\"", ((SMI_HANDLER_PROFILE_SW_REGISTER_CONTEXT *)Context)->SwSmiInputValue);
} else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmSxDispatch2ProtocolGuid)) {
Print(L" SxType=\"%a\"", SxTypeToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type)); Print (L" SxType=\"%a\"", SxTypeToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
Print(L" SxPhase=\"%a\"", SxPhaseToString(((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase)); Print (L" SxPhase=\"%a\"", SxPhaseToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));
} else if (CompareGuid (HandlerType, &gEfiSmmPowerButtonDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmPowerButtonDispatch2ProtocolGuid)) {
Print(L" PowerButtonPhase=\"%a\"", PowerButtonPhaseToString(((EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT *)Context)->Phase)); Print (L" PowerButtonPhase=\"%a\"", PowerButtonPhaseToString (((EFI_SMM_POWER_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
} else if (CompareGuid (HandlerType, &gEfiSmmStandbyButtonDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmStandbyButtonDispatch2ProtocolGuid)) {
Print(L" StandbyButtonPhase=\"%a\"", StandbyButtonPhaseToString(((EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT *)Context)->Phase)); Print (L" StandbyButtonPhase=\"%a\"", StandbyButtonPhaseToString (((EFI_SMM_STANDBY_BUTTON_REGISTER_CONTEXT *)Context)->Phase));
} else if (CompareGuid (HandlerType, &gEfiSmmPeriodicTimerDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmPeriodicTimerDispatch2ProtocolGuid)) {
Print(L" PeriodicTimerPeriod=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->Period); Print (L" PeriodicTimerPeriod=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->Period);
Print(L" PeriodicTimerSmiTickInterval=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->SmiTickInterval); Print (L" PeriodicTimerSmiTickInterval=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->SmiTickInterval);
} else if (CompareGuid (HandlerType, &gEfiSmmGpiDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmGpiDispatch2ProtocolGuid)) {
Print(L" GpiNum=\"0x%lx\"", ((EFI_SMM_GPI_REGISTER_CONTEXT *)Context)->GpiNum); Print (L" GpiNum=\"0x%lx\"", ((EFI_SMM_GPI_REGISTER_CONTEXT *)Context)->GpiNum);
} else if (CompareGuid (HandlerType, &gEfiSmmIoTrapDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmIoTrapDispatch2ProtocolGuid)) {
Print(L" IoTrapAddress=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Address); Print (L" IoTrapAddress=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Address);
Print(L" IoTrapLength=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Length); Print (L" IoTrapLength=\"0x%x\"", ((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Length);
Print(L" IoTrapType=\"%a\"", IoTrapTypeToString(((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type)); Print (L" IoTrapType=\"%a\"", IoTrapTypeToString (((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));
} else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) { } else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) {
Print(L" UsbType=\"0x%x\"", UsbTypeToString(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context)->Type)); Print (L" UsbType=\"0x%x\"", UsbTypeToString (((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context)->Type));
Str = ConvertDevicePathToText((EFI_DEVICE_PATH_PROTOCOL *)(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context) + 1), TRUE, TRUE); Str = ConvertDevicePathToText ((EFI_DEVICE_PATH_PROTOCOL *)(((SMI_HANDLER_PROFILE_USB_REGISTER_CONTEXT *)Context) + 1), TRUE, TRUE);
Print(L" UsbDevicePath=\"%s\"", Str); Print (L" UsbDevicePath=\"%s\"", Str);
if (Str != NULL) { if (Str != NULL) {
FreePool (Str); FreePool (Str);
} }
} else { } else {
Print(L" Context=\""); Print (L" Context=\"");
InternalDumpData (Context, ContextSize); InternalDumpData (Context, ContextSize);
Print(L"\""); Print (L"\"");
} }
} }
@ -570,8 +582,8 @@ DumpSmiChildContext (
@param HandlerCategory SMI handler category @param HandlerCategory SMI handler category
**/ **/
VOID VOID
DumpSmiHandler( DumpSmiHandler (
IN UINT32 HandlerCategory IN UINT32 HandlerCategory
) )
{ {
SMM_CORE_SMI_DATABASE_STRUCTURE *SmiStruct; SMM_CORE_SMI_DATABASE_STRUCTURE *SmiStruct;
@ -584,39 +596,46 @@ DumpSmiHandler(
while ((UINTN)SmiStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) { while ((UINTN)SmiStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) {
if ((SmiStruct->Header.Signature == SMM_CORE_SMI_DATABASE_SIGNATURE) && (SmiStruct->HandlerCategory == HandlerCategory)) { if ((SmiStruct->Header.Signature == SMM_CORE_SMI_DATABASE_SIGNATURE) && (SmiStruct->HandlerCategory == HandlerCategory)) {
SmiHandlerStruct = (VOID *)(SmiStruct + 1); SmiHandlerStruct = (VOID *)(SmiStruct + 1);
Print(L" <SmiEntry"); Print (L" <SmiEntry");
if (!IsZeroGuid (&SmiStruct->HandlerType)) { if (!IsZeroGuid (&SmiStruct->HandlerType)) {
Print(L" HandlerType=\"%g\"", &SmiStruct->HandlerType); Print (L" HandlerType=\"%g\"", &SmiStruct->HandlerType);
} }
Print(L">\n");
Print (L">\n");
for (Index = 0; Index < SmiStruct->HandlerCount; Index++) { for (Index = 0; Index < SmiStruct->HandlerCount; Index++) {
Print(L" <SmiHandler"); Print (L" <SmiHandler");
if (SmiHandlerStruct->ContextBufferSize != 0) { if (SmiHandlerStruct->ContextBufferSize != 0) {
DumpSmiChildContext (&SmiStruct->HandlerType, (UINT8 *)SmiHandlerStruct + SmiHandlerStruct->ContextBufferOffset, SmiHandlerStruct->ContextBufferSize); DumpSmiChildContext (&SmiStruct->HandlerType, (UINT8 *)SmiHandlerStruct + SmiHandlerStruct->ContextBufferOffset, SmiHandlerStruct->ContextBufferSize);
} }
Print(L">\n");
ImageStruct = GetImageFromRef((UINTN)SmiHandlerStruct->ImageRef); Print (L">\n");
NameString = GetDriverNameString (ImageStruct); ImageStruct = GetImageFromRef ((UINTN)SmiHandlerStruct->ImageRef);
Print(L" <Module RefId=\"0x%x\" Name=\"%a\">\n", SmiHandlerStruct->ImageRef, NameString); NameString = GetDriverNameString (ImageStruct);
Print (L" <Module RefId=\"0x%x\" Name=\"%a\">\n", SmiHandlerStruct->ImageRef, NameString);
if ((ImageStruct != NULL) && (ImageStruct->PdbStringOffset != 0)) { if ((ImageStruct != NULL) && (ImageStruct->PdbStringOffset != 0)) {
Print(L" <Pdb>%a</Pdb>\n", (UINT8 *)ImageStruct + ImageStruct->PdbStringOffset); Print (L" <Pdb>%a</Pdb>\n", (UINT8 *)ImageStruct + ImageStruct->PdbStringOffset);
} }
Print(L" </Module>\n");
Print(L" <Handler Address=\"0x%lx\">\n", SmiHandlerStruct->Handler); Print (L" </Module>\n");
Print (L" <Handler Address=\"0x%lx\">\n", SmiHandlerStruct->Handler);
if (ImageStruct != NULL) { if (ImageStruct != NULL) {
Print(L" <RVA>0x%x</RVA>\n", (UINTN) (SmiHandlerStruct->Handler - ImageStruct->ImageBase)); Print (L" <RVA>0x%x</RVA>\n", (UINTN)(SmiHandlerStruct->Handler - ImageStruct->ImageBase));
} }
Print(L" </Handler>\n", SmiHandlerStruct->Handler);
Print(L" <Caller Address=\"0x%lx\">\n", SmiHandlerStruct->CallerAddr); Print (L" </Handler>\n", SmiHandlerStruct->Handler);
Print (L" <Caller Address=\"0x%lx\">\n", SmiHandlerStruct->CallerAddr);
if (ImageStruct != NULL) { if (ImageStruct != NULL) {
Print(L" <RVA>0x%x</RVA>\n", (UINTN) (SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase)); Print (L" <RVA>0x%x</RVA>\n", (UINTN)(SmiHandlerStruct->CallerAddr - ImageStruct->ImageBase));
} }
Print(L" </Caller>\n", SmiHandlerStruct->Handler);
Print (L" </Caller>\n", SmiHandlerStruct->Handler);
SmiHandlerStruct = (VOID *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length); SmiHandlerStruct = (VOID *)((UINTN)SmiHandlerStruct + SmiHandlerStruct->Length);
Print(L" </SmiHandler>\n"); Print (L" </SmiHandler>\n");
} }
Print(L" </SmiEntry>\n");
Print (L" </SmiEntry>\n");
} }
SmiStruct = (VOID *)((UINTN)SmiStruct + SmiStruct->Header.Length); SmiStruct = (VOID *)((UINTN)SmiStruct + SmiStruct->Header.Length);
} }
@ -635,11 +654,11 @@ DumpSmiHandler(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
SmiHandlerProfileInfoEntrypoint ( SmiHandlerProfileInfoEntrypoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
GetSmiHandlerProfileDatabase(); GetSmiHandlerProfileDatabase ();
if (mSmiHandlerProfileDatabase == NULL) { if (mSmiHandlerProfileDatabase == NULL) {
return EFI_SUCCESS; return EFI_SUCCESS;
@ -648,38 +667,38 @@ SmiHandlerProfileInfoEntrypoint (
// //
// Dump all image // Dump all image
// //
Print(L"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n"); Print (L"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
Print(L"<SmiHandlerProfile>\n"); Print (L"<SmiHandlerProfile>\n");
Print(L"<ImageDatabase>\n"); Print (L"<ImageDatabase>\n");
Print(L" <!-- SMM image loaded -->\n"); Print (L" <!-- SMM image loaded -->\n");
DumpSmmLoadedImage(); DumpSmmLoadedImage ();
Print(L"</ImageDatabase>\n\n"); Print (L"</ImageDatabase>\n\n");
// //
// Dump SMI Handler // Dump SMI Handler
// //
Print(L"<SmiHandlerDatabase>\n"); Print (L"<SmiHandlerDatabase>\n");
Print(L" <!-- SMI Handler registered -->\n\n"); Print (L" <!-- SMI Handler registered -->\n\n");
Print(L" <SmiHandlerCategory Name=\"RootSmi\">\n"); Print (L" <SmiHandlerCategory Name=\"RootSmi\">\n");
Print(L" <!-- The root SMI Handler registered by SmmCore -->\n"); Print (L" <!-- The root SMI Handler registered by SmmCore -->\n");
DumpSmiHandler(SmmCoreSmiHandlerCategoryRootHandler); DumpSmiHandler (SmmCoreSmiHandlerCategoryRootHandler);
Print(L" </SmiHandlerCategory>\n\n"); Print (L" </SmiHandlerCategory>\n\n");
Print(L" <SmiHandlerCategory Name=\"GuidSmi\">\n"); Print (L" <SmiHandlerCategory Name=\"GuidSmi\">\n");
Print(L" <!-- The GUID SMI Handler registered by SmmCore -->\n"); Print (L" <!-- The GUID SMI Handler registered by SmmCore -->\n");
DumpSmiHandler(SmmCoreSmiHandlerCategoryGuidHandler); DumpSmiHandler (SmmCoreSmiHandlerCategoryGuidHandler);
Print(L" </SmiHandlerCategory>\n\n"); Print (L" </SmiHandlerCategory>\n\n");
Print(L" <SmiHandlerCategory Name=\"HardwareSmi\">\n"); Print (L" <SmiHandlerCategory Name=\"HardwareSmi\">\n");
Print(L" <!-- The hardware SMI Handler registered by SmmChildDispatcher -->\n"); Print (L" <!-- The hardware SMI Handler registered by SmmChildDispatcher -->\n");
DumpSmiHandler(SmmCoreSmiHandlerCategoryHardwareHandler); DumpSmiHandler (SmmCoreSmiHandlerCategoryHardwareHandler);
Print(L" </SmiHandlerCategory>\n\n"); Print (L" </SmiHandlerCategory>\n\n");
Print(L"</SmiHandlerDatabase>\n"); Print (L"</SmiHandlerDatabase>\n");
Print(L"</SmiHandlerProfile>\n"); Print (L"</SmiHandlerProfile>\n");
if (mSmiHandlerProfileDatabase != NULL) { if (mSmiHandlerProfileDatabase != NULL) {
FreePool(mSmiHandlerProfileDatabase); FreePool (mSmiHandlerProfileDatabase);
} }
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -10,29 +10,29 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "FrontPage.h" #include "FrontPage.h"
#include "FrontPageCustomizedUi.h" #include "FrontPageCustomizedUi.h"
#define MAX_STRING_LEN 200 #define MAX_STRING_LEN 200
EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID; EFI_GUID mFrontPageGuid = FRONT_PAGE_FORMSET_GUID;
BOOLEAN mResetRequired = FALSE; BOOLEAN mResetRequired = FALSE;
EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2; EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;
CHAR8 *mLanguageString; CHAR8 *mLanguageString;
BOOLEAN mModeInitialized = FALSE; BOOLEAN mModeInitialized = FALSE;
// //
// Boot video resolution and text mode. // Boot video resolution and text mode.
// //
UINT32 mBootHorizontalResolution = 0; UINT32 mBootHorizontalResolution = 0;
UINT32 mBootVerticalResolution = 0; UINT32 mBootVerticalResolution = 0;
UINT32 mBootTextModeColumn = 0; UINT32 mBootTextModeColumn = 0;
UINT32 mBootTextModeRow = 0; UINT32 mBootTextModeRow = 0;
// //
// BIOS setup video resolution and text mode. // BIOS setup video resolution and text mode.
// //
UINT32 mSetupTextModeColumn = 0; UINT32 mSetupTextModeColumn = 0;
UINT32 mSetupTextModeRow = 0; UINT32 mSetupTextModeRow = 0;
UINT32 mSetupHorizontalResolution = 0; UINT32 mSetupHorizontalResolution = 0;
UINT32 mSetupVerticalResolution = 0; UINT32 mSetupVerticalResolution = 0;
FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = { FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = {
FRONT_PAGE_CALLBACK_DATA_SIGNATURE, FRONT_PAGE_CALLBACK_DATA_SIGNATURE,
@ -52,21 +52,22 @@ HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
{ {
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
} }
}, },
// //
// {8E6D99EE-7531-48f8-8745-7F6144468FF2} // {8E6D99EE-7531-48f8-8745-7F6144468FF2}
// //
{ 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 } } { 0x8e6d99ee, 0x7531, 0x48f8, { 0x87, 0x45, 0x7f, 0x61, 0x44, 0x46, 0x8f, 0xf2 }
}
}, },
{ {
END_DEVICE_PATH_TYPE, END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ {
(UINT8) (END_DEVICE_PATH_LENGTH), (UINT8)(END_DEVICE_PATH_LENGTH),
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8) (UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
} }
} }
}; };
@ -105,15 +106,16 @@ UpdateFrontPageBannerStrings (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FakeExtractConfig ( FakeExtractConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Request, IN CONST EFI_STRING Request,
OUT EFI_STRING *Progress, OUT EFI_STRING *Progress,
OUT EFI_STRING *Results OUT EFI_STRING *Results
) )
{ {
if (Progress == NULL || Results == NULL) { if ((Progress == NULL) || (Results == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
*Progress = Request; *Progress = Request;
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
@ -137,12 +139,12 @@ FakeExtractConfig (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FakeRouteConfig ( FakeRouteConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Configuration, IN CONST EFI_STRING Configuration,
OUT EFI_STRING *Progress OUT EFI_STRING *Progress
) )
{ {
if (Configuration == NULL || Progress == NULL) { if ((Configuration == NULL) || (Progress == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -172,12 +174,12 @@ FakeRouteConfig (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FrontPageCallback ( FrontPageCallback (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId, IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type, IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value, IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
) )
{ {
return UiFrontPageCallbackHandler (gFrontPagePrivate.HiiHandle, Action, QuestionId, Type, Value, ActionRequest); return UiFrontPageCallbackHandler (gFrontPagePrivate.HiiHandle, Action, QuestionId, Type, Value, ActionRequest);
@ -193,10 +195,10 @@ UpdateFrontPageForm (
VOID VOID
) )
{ {
VOID *StartOpCodeHandle; VOID *StartOpCodeHandle;
VOID *EndOpCodeHandle; VOID *EndOpCodeHandle;
EFI_IFR_GUID_LABEL *StartGuidLabel; EFI_IFR_GUID_LABEL *StartGuidLabel;
EFI_IFR_GUID_LABEL *EndGuidLabel; EFI_IFR_GUID_LABEL *EndGuidLabel;
// //
// Allocate space for creation of UpdateData Buffer // Allocate space for creation of UpdateData Buffer
@ -209,18 +211,18 @@ UpdateFrontPageForm (
// //
// Create Hii Extend Label OpCode as the start opcode // Create Hii Extend Label OpCode as the start opcode
// //
StartGuidLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); StartGuidLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (StartOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
StartGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; StartGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
StartGuidLabel->Number = LABEL_FRANTPAGE_INFORMATION; StartGuidLabel->Number = LABEL_FRANTPAGE_INFORMATION;
// //
// Create Hii Extend Label OpCode as the end opcode // Create Hii Extend Label OpCode as the end opcode
// //
EndGuidLabel = (EFI_IFR_GUID_LABEL *) HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL)); EndGuidLabel = (EFI_IFR_GUID_LABEL *)HiiCreateGuidOpCode (EndOpCodeHandle, &gEfiIfrTianoGuid, NULL, sizeof (EFI_IFR_GUID_LABEL));
EndGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL; EndGuidLabel->ExtendOpCode = EFI_IFR_EXTEND_OP_LABEL;
EndGuidLabel->Number = LABEL_END; EndGuidLabel->Number = LABEL_END;
// //
//Updata Front Page form // Updata Front Page form
// //
UiCustomizeFrontPage ( UiCustomizeFrontPage (
gFrontPagePrivate.HiiHandle, gFrontPagePrivate.HiiHandle,
@ -252,11 +254,12 @@ InitializeFrontPage (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Locate Hii relative protocols // Locate Hii relative protocols
// //
Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &gFormBrowser2); Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **)&gFormBrowser2);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -265,14 +268,14 @@ InitializeFrontPage (
// Install Device Path Protocol and Config Access protocol to driver handle // Install Device Path Protocol and Config Access protocol to driver handle
// //
gFrontPagePrivate.DriverHandle = NULL; gFrontPagePrivate.DriverHandle = NULL;
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&gFrontPagePrivate.DriverHandle, &gFrontPagePrivate.DriverHandle,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
&mFrontPageHiiVendorDevicePath, &mFrontPageHiiVendorDevicePath,
&gEfiHiiConfigAccessProtocolGuid, &gEfiHiiConfigAccessProtocolGuid,
&gFrontPagePrivate.ConfigAccess, &gFrontPagePrivate.ConfigAccess,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
// //
@ -288,14 +291,14 @@ InitializeFrontPage (
ASSERT (gFrontPagePrivate.HiiHandle != NULL); ASSERT (gFrontPagePrivate.HiiHandle != NULL);
// //
//Updata Front Page banner strings // Updata Front Page banner strings
// //
UpdateFrontPageBannerStrings (); UpdateFrontPageBannerStrings ();
// //
// Update front page menus. // Update front page menus.
// //
UpdateFrontPageForm(); UpdateFrontPageForm ();
return Status; return Status;
} }
@ -324,15 +327,15 @@ CallFrontPage (
); );
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE; ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
Status = gFormBrowser2->SendForm ( Status = gFormBrowser2->SendForm (
gFormBrowser2, gFormBrowser2,
&gFrontPagePrivate.HiiHandle, &gFrontPagePrivate.HiiHandle,
1, 1,
&mFrontPageGuid, &mFrontPageGuid,
0, 0,
NULL, NULL,
&ActionRequest &ActionRequest
); );
// //
// Check whether user change any option setting which needs a reset to be effective // Check whether user change any option setting which needs a reset to be effective
// //
@ -348,11 +351,12 @@ CallFrontPage (
**/ **/
VOID VOID
FreeFrontPage( FreeFrontPage (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->UninstallMultipleProtocolInterfaces ( Status = gBS->UninstallMultipleProtocolInterfaces (
gFrontPagePrivate.DriverHandle, gFrontPagePrivate.DriverHandle,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
@ -383,9 +387,9 @@ FreeFrontPage(
**/ **/
VOID VOID
ConvertProcessorToString ( ConvertProcessorToString (
IN UINT16 ProcessorFrequency, IN UINT16 ProcessorFrequency,
IN UINT16 Base10Exponent, IN UINT16 Base10Exponent,
OUT CHAR16 **String OUT CHAR16 **String
) )
{ {
CHAR16 *StringBuffer; CHAR16 *StringBuffer;
@ -395,13 +399,14 @@ ConvertProcessorToString (
if (Base10Exponent >= 6) { if (Base10Exponent >= 6) {
FreqMhz = ProcessorFrequency; FreqMhz = ProcessorFrequency;
for (Index = 0; Index < (UINT32) Base10Exponent - 6; Index++) { for (Index = 0; Index < (UINT32)Base10Exponent - 6; Index++) {
FreqMhz *= 10; FreqMhz *= 10;
} }
} else { } else {
FreqMhz = 0; FreqMhz = 0;
} }
DestMax = 0x20 / sizeof (CHAR16);
DestMax = 0x20 / sizeof (CHAR16);
StringBuffer = AllocateZeroPool (0x20); StringBuffer = AllocateZeroPool (0x20);
ASSERT (StringBuffer != NULL); ASSERT (StringBuffer != NULL);
UnicodeValueToStringS (StringBuffer, sizeof (CHAR16) * DestMax, LEFT_JUSTIFY, FreqMhz / 1000, 3); UnicodeValueToStringS (StringBuffer, sizeof (CHAR16) * DestMax, LEFT_JUSTIFY, FreqMhz / 1000, 3);
@ -415,11 +420,10 @@ ConvertProcessorToString (
2 2
); );
StrCatS (StringBuffer, DestMax, L" GHz"); StrCatS (StringBuffer, DestMax, L" GHz");
*String = (CHAR16 *) StringBuffer; *String = (CHAR16 *)StringBuffer;
return ; return;
} }
/** /**
Convert Memory Size to a string. Convert Memory Size to a string.
@ -429,8 +433,8 @@ ConvertProcessorToString (
**/ **/
VOID VOID
ConvertMemorySizeToString ( ConvertMemorySizeToString (
IN UINT32 MemorySize, IN UINT32 MemorySize,
OUT CHAR16 **String OUT CHAR16 **String
) )
{ {
CHAR16 *StringBuffer; CHAR16 *StringBuffer;
@ -440,9 +444,9 @@ ConvertMemorySizeToString (
UnicodeValueToStringS (StringBuffer, 0x24, LEFT_JUSTIFY, MemorySize, 10); UnicodeValueToStringS (StringBuffer, 0x24, LEFT_JUSTIFY, MemorySize, 10);
StrCatS (StringBuffer, 0x24 / sizeof (CHAR16), L" MB RAM"); StrCatS (StringBuffer, 0x24 / sizeof (CHAR16), L" MB RAM");
*String = (CHAR16 *) StringBuffer; *String = (CHAR16 *)StringBuffer;
return ; return;
} }
/** /**
@ -459,12 +463,12 @@ ConvertMemorySizeToString (
**/ **/
EFI_STATUS EFI_STATUS
GetOptionalStringByIndex ( GetOptionalStringByIndex (
IN CHAR8 *OptionalStrStart, IN CHAR8 *OptionalStrStart,
IN UINT8 Index, IN UINT8 Index,
OUT CHAR16 **String OUT CHAR16 **String
) )
{ {
UINTN StrSize; UINTN StrSize;
if (Index == 0) { if (Index == 0) {
*String = AllocateZeroPool (sizeof (CHAR16)); *String = AllocateZeroPool (sizeof (CHAR16));
@ -492,7 +496,6 @@ GetOptionalStringByIndex (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Update the banner information for the Front Page based on Smbios information. Update the banner information for the Front Page based on Smbios information.
@ -503,22 +506,22 @@ UpdateFrontPageBannerStrings (
VOID VOID
) )
{ {
UINT8 StrIndex; UINT8 StrIndex;
CHAR16 *NewString; CHAR16 *NewString;
CHAR16 *FirmwareVersionString; CHAR16 *FirmwareVersionString;
EFI_STATUS Status; EFI_STATUS Status;
EFI_SMBIOS_HANDLE SmbiosHandle; EFI_SMBIOS_HANDLE SmbiosHandle;
EFI_SMBIOS_PROTOCOL *Smbios; EFI_SMBIOS_PROTOCOL *Smbios;
SMBIOS_TABLE_TYPE0 *Type0Record; SMBIOS_TABLE_TYPE0 *Type0Record;
SMBIOS_TABLE_TYPE1 *Type1Record; SMBIOS_TABLE_TYPE1 *Type1Record;
SMBIOS_TABLE_TYPE4 *Type4Record; SMBIOS_TABLE_TYPE4 *Type4Record;
SMBIOS_TABLE_TYPE19 *Type19Record; SMBIOS_TABLE_TYPE19 *Type19Record;
EFI_SMBIOS_TABLE_HEADER *Record; EFI_SMBIOS_TABLE_HEADER *Record;
UINT64 InstalledMemory; UINT64 InstalledMemory;
BOOLEAN FoundCpu; BOOLEAN FoundCpu;
InstalledMemory = 0; InstalledMemory = 0;
FoundCpu = 0; FoundCpu = 0;
// //
// Update default banner string. // Update default banner string.
@ -546,7 +549,7 @@ UpdateFrontPageBannerStrings (
// //
// Update Front Page banner strings base on SmBios Table. // Update Front Page banner strings base on SmBios Table.
// //
Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **) &Smbios); Status = gBS->LocateProtocol (&gEfiSmbiosProtocolGuid, NULL, (VOID **)&Smbios);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// Smbios protocol not found, get the default value. // Smbios protocol not found, get the default value.
@ -580,17 +583,17 @@ UpdateFrontPageBannerStrings (
} }
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED; SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL); Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
while (!EFI_ERROR(Status)) { while (!EFI_ERROR (Status)) {
if (Record->Type == SMBIOS_TYPE_BIOS_INFORMATION) { if (Record->Type == SMBIOS_TYPE_BIOS_INFORMATION) {
Type0Record = (SMBIOS_TABLE_TYPE0 *) Record; Type0Record = (SMBIOS_TABLE_TYPE0 *)Record;
StrIndex = Type0Record->BiosVersion; StrIndex = Type0Record->BiosVersion;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString); GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);
FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString); FirmwareVersionString = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);
if (*FirmwareVersionString != 0x0000 ) { if (*FirmwareVersionString != 0x0000 ) {
FreePool (NewString); FreePool (NewString);
NewString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString); NewString = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);
UiCustomizeFrontPageBanner (3, TRUE, &NewString); UiCustomizeFrontPageBanner (3, TRUE, &NewString);
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL); HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
} else { } else {
@ -601,27 +604,27 @@ UpdateFrontPageBannerStrings (
} }
if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) { if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) {
Type1Record = (SMBIOS_TABLE_TYPE1 *) Record; Type1Record = (SMBIOS_TABLE_TYPE1 *)Record;
StrIndex = Type1Record->ProductName; StrIndex = Type1Record->ProductName;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString); GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
UiCustomizeFrontPageBanner (1, TRUE, &NewString); UiCustomizeFrontPageBanner (1, TRUE, &NewString);
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL); HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
FreePool (NewString); FreePool (NewString);
} }
if ((Record->Type == SMBIOS_TYPE_PROCESSOR_INFORMATION) && !FoundCpu) { if ((Record->Type == SMBIOS_TYPE_PROCESSOR_INFORMATION) && !FoundCpu) {
Type4Record = (SMBIOS_TABLE_TYPE4 *) Record; Type4Record = (SMBIOS_TABLE_TYPE4 *)Record;
// //
// The information in the record should be only valid when the CPU Socket is populated. // The information in the record should be only valid when the CPU Socket is populated.
// //
if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) { if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {
StrIndex = Type4Record->ProcessorVersion; StrIndex = Type4Record->ProcessorVersion;
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString); GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type4Record + Type4Record->Hdr.Length), StrIndex, &NewString);
UiCustomizeFrontPageBanner (2, TRUE, &NewString); UiCustomizeFrontPageBanner (2, TRUE, &NewString);
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL); HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL);
FreePool (NewString); FreePool (NewString);
ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString); ConvertProcessorToString (Type4Record->CurrentSpeed, 6, &NewString);
UiCustomizeFrontPageBanner (2, FALSE, &NewString); UiCustomizeFrontPageBanner (2, FALSE, &NewString);
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL); HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL);
FreePool (NewString); FreePool (NewString);
@ -631,13 +634,19 @@ UpdateFrontPageBannerStrings (
} }
if ( Record->Type == SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) { if ( Record->Type == SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {
Type19Record = (SMBIOS_TABLE_TYPE19 *) Record; Type19Record = (SMBIOS_TABLE_TYPE19 *)Record;
if (Type19Record->StartingAddress != 0xFFFFFFFF ) { if (Type19Record->StartingAddress != 0xFFFFFFFF ) {
InstalledMemory += RShiftU64(Type19Record->EndingAddress - InstalledMemory += RShiftU64 (
Type19Record->StartingAddress + 1, 10); Type19Record->EndingAddress -
Type19Record->StartingAddress + 1,
10
);
} else { } else {
InstalledMemory += RShiftU64(Type19Record->ExtendedEndingAddress - InstalledMemory += RShiftU64 (
Type19Record->ExtendedStartingAddress + 1, 20); Type19Record->ExtendedEndingAddress -
Type19Record->ExtendedStartingAddress + 1,
20
);
} }
} }
@ -647,7 +656,7 @@ UpdateFrontPageBannerStrings (
// //
// Now update the total installed RAM size // Now update the total installed RAM size
// //
ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString ); ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString);
UiCustomizeFrontPageBanner (3, FALSE, &NewString); UiCustomizeFrontPageBanner (3, FALSE, &NewString);
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL); HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL);
FreePool (NewString); FreePool (NewString);
@ -695,7 +704,7 @@ UiSetConsoleMode (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiGraphicsOutputProtocolGuid, &gEfiGraphicsOutputProtocolGuid,
(VOID**)&GraphicsOutput (VOID **)&GraphicsOutput
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
GraphicsOutput = NULL; GraphicsOutput = NULL;
@ -704,7 +713,7 @@ UiSetConsoleMode (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiSimpleTextOutProtocolGuid, &gEfiSimpleTextOutProtocolGuid,
(VOID**)&SimpleTextOut (VOID **)&SimpleTextOut
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
SimpleTextOut = NULL; SimpleTextOut = NULL;
@ -733,7 +742,7 @@ UiSetConsoleMode (
} }
if (GraphicsOutput != NULL) { if (GraphicsOutput != NULL) {
MaxGopMode = GraphicsOutput->Mode->MaxMode; MaxGopMode = GraphicsOutput->Mode->MaxMode;
} }
if (SimpleTextOut != NULL) { if (SimpleTextOut != NULL) {
@ -749,22 +758,24 @@ UiSetConsoleMode (
// //
for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) { for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {
Status = GraphicsOutput->QueryMode ( Status = GraphicsOutput->QueryMode (
GraphicsOutput, GraphicsOutput,
ModeNumber, ModeNumber,
&SizeOfInfo, &SizeOfInfo,
&Info &Info
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
if ((Info->HorizontalResolution == NewHorizontalResolution) && if ((Info->HorizontalResolution == NewHorizontalResolution) &&
(Info->VerticalResolution == NewVerticalResolution)) { (Info->VerticalResolution == NewVerticalResolution))
{
if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) && if ((GraphicsOutput->Mode->Info->HorizontalResolution == NewHorizontalResolution) &&
(GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution)) { (GraphicsOutput->Mode->Info->VerticalResolution == NewVerticalResolution))
{
// //
// Current resolution is same with required resolution, check if text mode need be set // Current resolution is same with required resolution, check if text mode need be set
// //
Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow); Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if (CurrentColumn == NewColumns && CurrentRow == NewRows) { if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {
// //
// If current text mode is same with required text mode. Do nothing // If current text mode is same with required text mode. Do nothing
// //
@ -776,7 +787,7 @@ UiSetConsoleMode (
// //
for (Index = 0; Index < MaxTextMode; Index++) { for (Index = 0; Index < MaxTextMode; Index++) {
Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow); Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);
if (!EFI_ERROR(Status)) { if (!EFI_ERROR (Status)) {
if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) { if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {
// //
// Required text mode is supported, set it. // Required text mode is supported, set it.
@ -795,6 +806,7 @@ UiSetConsoleMode (
} }
} }
} }
if (Index == MaxTextMode) { if (Index == MaxTextMode) {
// //
// If required text mode is not supported, return error. // If required text mode is not supported, return error.
@ -815,6 +827,7 @@ UiSetConsoleMode (
} }
} }
} }
FreePool (Info); FreePool (Info);
} }
} }
@ -845,19 +858,21 @@ UiSetConsoleMode (
// Locate all the handles with GOP protocol and reconnect it. // Locate all the handles with GOP protocol and reconnect it.
// //
Status = gBS->LocateHandleBuffer ( Status = gBS->LocateHandleBuffer (
ByProtocol, ByProtocol,
&gEfiSimpleTextOutProtocolGuid, &gEfiSimpleTextOutProtocolGuid,
NULL, NULL,
&HandleCount, &HandleCount,
&HandleBuffer &HandleBuffer
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
gBS->DisconnectController (HandleBuffer[Index], NULL, NULL); gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
} }
for (Index = 0; Index < HandleCount; Index++) { for (Index = 0; Index < HandleCount; Index++) {
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE); gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
} }
if (HandleBuffer != NULL) { if (HandleBuffer != NULL) {
FreePool (HandleBuffer); FreePool (HandleBuffer);
} }
@ -885,12 +900,12 @@ InitializeUserInterface (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_HII_HANDLE HiiHandle; EFI_HII_HANDLE HiiHandle;
EFI_STATUS Status; EFI_STATUS Status;
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput; EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut; EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
UINTN BootTextColumn; UINTN BootTextColumn;
UINTN BootTextRow; UINTN BootTextRow;
if (!mModeInitialized) { if (!mModeInitialized) {
// //
@ -900,7 +915,7 @@ InitializeUserInterface (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiGraphicsOutputProtocolGuid, &gEfiGraphicsOutputProtocolGuid,
(VOID**)&GraphicsOutput (VOID **)&GraphicsOutput
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
GraphicsOutput = NULL; GraphicsOutput = NULL;
@ -909,7 +924,7 @@ InitializeUserInterface (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gST->ConsoleOutHandle, gST->ConsoleOutHandle,
&gEfiSimpleTextOutProtocolGuid, &gEfiSimpleTextOutProtocolGuid,
(VOID**)&SimpleTextOut (VOID **)&SimpleTextOut
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
SimpleTextOut = NULL; SimpleTextOut = NULL;
@ -942,7 +957,7 @@ InitializeUserInterface (
mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn); mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn);
mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow); mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow);
mModeInitialized = TRUE; mModeInitialized = TRUE;
} }
gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL); gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
@ -976,11 +991,11 @@ InitializeUserInterface (
VOID VOID
EFIAPI EFIAPI
UiEntry ( UiEntry (
IN BOOLEAN ConnectAllHappened IN BOOLEAN ConnectAllHappened
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_BOOT_LOGO_PROTOCOL *BootLogo; EFI_BOOT_LOGO_PROTOCOL *BootLogo;
// //
// Enter Setup page. // Enter Setup page.
@ -1006,7 +1021,7 @@ UiEntry (
// //
// Boot Logo is corrupted, report it using Boot Logo protocol. // Boot Logo is corrupted, report it using Boot Logo protocol.
// //
Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo); Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **)&BootLogo);
if (!EFI_ERROR (Status) && (BootLogo != NULL)) { if (!EFI_ERROR (Status) && (BootLogo != NULL)) {
BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0); BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
} }
@ -1023,7 +1038,7 @@ UiEntry (
} }
// //
//Will leave browser, check any reset required change is applied? if yes, reset system // Will leave browser, check any reset required change is applied? if yes, reset system
// //
SetupResetReminder (); SetupResetReminder ();
} }
@ -1034,10 +1049,6 @@ UiEntry (
// user change any option setting which needs a reset to be effective, and the reset will be applied according to the user selection. // user change any option setting which needs a reset to be effective, and the reset will be applied according to the user selection.
// //
/** /**
Record the info that a reset is required. Record the info that a reset is required.
A module boolean variable is used to record whether a reset is required. A module boolean variable is used to record whether a reset is required.
@ -1052,10 +1063,6 @@ EnableResetRequired (
mResetRequired = TRUE; mResetRequired = TRUE;
} }
/** /**
Check if user changed any option setting which needs a system reset to be effective. Check if user changed any option setting which needs a system reset to be effective.
@ -1069,7 +1076,6 @@ IsResetRequired (
return mResetRequired; return mResetRequired;
} }
/** /**
Check whether a reset is needed, and finish the reset reminder feature. Check whether a reset is needed, and finish the reset reminder feature.
If a reset is needed, Popup a menu to notice user, and finish the feature If a reset is needed, Popup a menu to notice user, and finish the feature
@ -1082,15 +1088,14 @@ SetupResetReminder (
VOID VOID
) )
{ {
EFI_INPUT_KEY Key; EFI_INPUT_KEY Key;
CHAR16 *StringBuffer1; CHAR16 *StringBuffer1;
CHAR16 *StringBuffer2; CHAR16 *StringBuffer2;
// //
//check any reset required change is applied? if yes, reset system // check any reset required change is applied? if yes, reset system
// //
if (IsResetRequired ()) { if (IsResetRequired ()) {
StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16)); StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
ASSERT (StringBuffer1 != NULL); ASSERT (StringBuffer1 != NULL);
StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16)); StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
@ -1110,4 +1115,3 @@ SetupResetReminder (
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
} }
} }

View File

@ -18,24 +18,23 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
extern UINT8 FrontPageVfrBin[]; extern UINT8 FrontPageVfrBin[];
extern EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2; extern EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;
#define SMBIOS_TYPE4_CPU_SOCKET_POPULATED BIT6
#define SMBIOS_TYPE4_CPU_SOCKET_POPULATED BIT6
// //
// This is the VFR compiler generated header file which defines the // This is the VFR compiler generated header file which defines the
// string identifiers. // string identifiers.
// //
#define PRINTABLE_LANGUAGE_NAME_STRING_ID 0x0001 #define PRINTABLE_LANGUAGE_NAME_STRING_ID 0x0001
// //
// These are defined as the same with vfr file // These are defined as the same with vfr file
// //
#define FRONT_PAGE_FORM_ID 0x1000 #define FRONT_PAGE_FORM_ID 0x1000
#define LABEL_FRANTPAGE_INFORMATION 0x1000 #define LABEL_FRANTPAGE_INFORMATION 0x1000
#define LABEL_END 0xffff #define LABEL_END 0xffff
#define FRONT_PAGE_FORMSET_GUID \ #define FRONT_PAGE_FORMSET_GUID \
{ \ { \
@ -45,22 +44,21 @@ extern EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;
#define FRONT_PAGE_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('F', 'P', 'C', 'B') #define FRONT_PAGE_CALLBACK_DATA_SIGNATURE SIGNATURE_32 ('F', 'P', 'C', 'B')
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
// //
// HII relative handles // HII relative handles
// //
EFI_HII_HANDLE HiiHandle; EFI_HII_HANDLE HiiHandle;
EFI_HANDLE DriverHandle; EFI_HANDLE DriverHandle;
EFI_STRING_ID *LanguageToken; EFI_STRING_ID *LanguageToken;
// //
// Produced protocols // Produced protocols
// //
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess; EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
} FRONT_PAGE_CALLBACK_DATA; } FRONT_PAGE_CALLBACK_DATA;
#define EFI_FP_CALLBACK_DATA_FROM_THIS(a) \ #define EFI_FP_CALLBACK_DATA_FROM_THIS(a) \
CR (a, \ CR (a, \
FRONT_PAGE_CALLBACK_DATA, \ FRONT_PAGE_CALLBACK_DATA, \
@ -93,10 +91,10 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FakeExtractConfig ( FakeExtractConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Request, IN CONST EFI_STRING Request,
OUT EFI_STRING *Progress, OUT EFI_STRING *Progress,
OUT EFI_STRING *Results OUT EFI_STRING *Results
); );
/** /**
@ -118,9 +116,9 @@ FakeExtractConfig (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FakeRouteConfig ( FakeRouteConfig (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN CONST EFI_STRING Configuration, IN CONST EFI_STRING Configuration,
OUT EFI_STRING *Progress OUT EFI_STRING *Progress
); );
/** /**
@ -144,12 +142,12 @@ FakeRouteConfig (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
FrontPageCallback ( FrontPageCallback (
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This, IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId, IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type, IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value, IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
); );
/** /**
@ -177,9 +175,9 @@ InitializeFrontPage (
**/ **/
EFI_STATUS EFI_STATUS
GetProducerString ( GetProducerString (
IN EFI_GUID *ProducerGuid, IN EFI_GUID *ProducerGuid,
IN EFI_STRING_ID Token, IN EFI_STRING_ID Token,
OUT CHAR16 **String OUT CHAR16 **String
); );
/** /**
@ -192,7 +190,7 @@ GetProducerString (
VOID VOID
EFIAPI EFIAPI
UiEntry ( UiEntry (
IN BOOLEAN ConnectAllHappened IN BOOLEAN ConnectAllHappened
); );
/** /**
@ -206,8 +204,7 @@ UiEntry (
**/ **/
CHAR16 * CHAR16 *
ExtractDevicePathFromHiiHandle ( ExtractDevicePathFromHiiHandle (
IN EFI_HII_HANDLE Handle IN EFI_HII_HANDLE Handle
); );
#endif // _FRONT_PAGE_H_ #endif // _FRONT_PAGE_H_

View File

@ -37,7 +37,7 @@ UiCustomizeFrontPage (
// //
// Create empty line. // Create empty line.
// //
UiCreateEmptyLine(HiiHandle, StartOpCodeHandle); UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
// //
// Find third party drivers which need to be shown in the front page. // Find third party drivers which need to be shown in the front page.
@ -47,17 +47,17 @@ UiCustomizeFrontPage (
// //
// Create empty line. // Create empty line.
// //
UiCreateEmptyLine(HiiHandle, StartOpCodeHandle); UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
// //
// Create "Continue" menu. // Create "Continue" menu.
// //
UiCreateContinueMenu(HiiHandle, StartOpCodeHandle); UiCreateContinueMenu (HiiHandle, StartOpCodeHandle);
// //
// Create reset menu. // Create reset menu.
// //
UiCreateResetMenu(HiiHandle, StartOpCodeHandle); UiCreateResetMenu (HiiHandle, StartOpCodeHandle);
} }
/** /**
@ -80,15 +80,15 @@ UiCustomizeFrontPage (
**/ **/
EFI_STATUS EFI_STATUS
UiFrontPageCallbackHandler ( UiFrontPageCallbackHandler (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId, IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type, IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value, IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
if (UiSupportLibCallbackHandler (HiiHandle, Action, QuestionId, Type, Value, ActionRequest, &Status)) { if (UiSupportLibCallbackHandler (HiiHandle, Action, QuestionId, Type, Value, ActionRequest, &Status)) {
return Status; return Status;
@ -121,19 +121,21 @@ UiFrontPageCallbackHandler (
**/ **/
VOID VOID
UiCustomizeFrontPageBanner ( UiCustomizeFrontPageBanner (
IN UINTN LineIndex, IN UINTN LineIndex,
IN BOOLEAN LeftOrRight, IN BOOLEAN LeftOrRight,
IN OUT EFI_STRING *BannerStr IN OUT EFI_STRING *BannerStr
) )
{ {
if ((LineIndex == 5) && LeftOrRight) { if ((LineIndex == 5) && LeftOrRight) {
// Update STR_CUSTOMIZE_BANNER_LINE5_LEFT // Update STR_CUSTOMIZE_BANNER_LINE5_LEFT
if (PcdGetBool(PcdTestKeyUsed)) { if (PcdGetBool (PcdTestKeyUsed)) {
if (BannerStr != NULL) { if (BannerStr != NULL) {
FreePool(*BannerStr); FreePool (*BannerStr);
} }
*BannerStr = HiiGetString(gFrontPagePrivate.HiiHandle, STRING_TOKEN(STR_TEST_KEY_USED), NULL);
*BannerStr = HiiGetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_TEST_KEY_USED), NULL);
} }
} }
return; return;
} }

View File

@ -33,9 +33,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
VOID VOID
UiCustomizeFrontPageBanner ( UiCustomizeFrontPageBanner (
IN UINTN LineIndex, IN UINTN LineIndex,
IN BOOLEAN LeftOrRight, IN BOOLEAN LeftOrRight,
IN OUT EFI_STRING *BannerStr IN OUT EFI_STRING *BannerStr
); );
/** /**
@ -71,12 +71,12 @@ UiCustomizeFrontPage (
**/ **/
EFI_STATUS EFI_STATUS
UiFrontPageCallbackHandler ( UiFrontPageCallbackHandler (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId, IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type, IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value, IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
); );
#endif #endif

View File

@ -30,29 +30,28 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// This is the VFR compiler generated header file which defines the // This is the VFR compiler generated header file which defines the
// string identifiers. // string identifiers.
// //
#define PRINTABLE_LANGUAGE_NAME_STRING_ID 0x0001 #define PRINTABLE_LANGUAGE_NAME_STRING_ID 0x0001
#define UI_HII_DRIVER_LIST_SIZE 0x8 #define UI_HII_DRIVER_LIST_SIZE 0x8
#define FRONT_PAGE_KEY_CONTINUE 0x1000 #define FRONT_PAGE_KEY_CONTINUE 0x1000
#define FRONT_PAGE_KEY_RESET 0x1001 #define FRONT_PAGE_KEY_RESET 0x1001
#define FRONT_PAGE_KEY_LANGUAGE 0x1002 #define FRONT_PAGE_KEY_LANGUAGE 0x1002
#define FRONT_PAGE_KEY_DRIVER 0x2000 #define FRONT_PAGE_KEY_DRIVER 0x2000
typedef struct { typedef struct {
EFI_STRING_ID PromptId; EFI_STRING_ID PromptId;
EFI_STRING_ID HelpId; EFI_STRING_ID HelpId;
EFI_STRING_ID DevicePathId; EFI_STRING_ID DevicePathId;
EFI_GUID FormSetGuid; EFI_GUID FormSetGuid;
BOOLEAN EmptyLineAfter; BOOLEAN EmptyLineAfter;
} UI_HII_DRIVER_INSTANCE; } UI_HII_DRIVER_INSTANCE;
CHAR8 *gLanguageString; CHAR8 *gLanguageString;
EFI_STRING_ID *gLanguageToken; EFI_STRING_ID *gLanguageToken;
UI_HII_DRIVER_INSTANCE *gHiiDriverList; UI_HII_DRIVER_INSTANCE *gHiiDriverList;
extern EFI_HII_HANDLE gStringPackHandle; extern EFI_HII_HANDLE gStringPackHandle;
UINT8 gCurrentLanguageIndex; UINT8 gCurrentLanguageIndex;
/** /**
Get next language from language code list (with separator ';'). Get next language from language code list (with separator ';').
@ -68,8 +67,8 @@ UINT8 gCurrentLanguageIndex;
**/ **/
VOID VOID
GetNextLanguage ( GetNextLanguage (
IN OUT CHAR8 **LangCode, IN OUT CHAR8 **LangCode,
OUT CHAR8 *Lang OUT CHAR8 *Lang
) )
{ {
UINTN Index; UINTN Index;
@ -79,7 +78,7 @@ GetNextLanguage (
ASSERT (*LangCode != NULL); ASSERT (*LangCode != NULL);
ASSERT (Lang != NULL); ASSERT (Lang != NULL);
Index = 0; Index = 0;
StringPtr = *LangCode; StringPtr = *LangCode;
while (StringPtr[Index] != 0 && StringPtr[Index] != ';') { while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {
Index++; Index++;
@ -91,6 +90,7 @@ GetNextLanguage (
if (StringPtr[Index] == ';') { if (StringPtr[Index] == ';') {
Index++; Index++;
} }
*LangCode = StringPtr + Index; *LangCode = StringPtr + Index;
} }
@ -106,13 +106,13 @@ GetNextLanguage (
**/ **/
EFI_STATUS EFI_STATUS
LanguageChangeHandler ( LanguageChangeHandler (
IN EFI_IFR_TYPE_VALUE *Value IN EFI_IFR_TYPE_VALUE *Value
) )
{ {
CHAR8 *LangCode; CHAR8 *LangCode;
CHAR8 *Lang; CHAR8 *Lang;
UINTN Index; UINTN Index;
EFI_STATUS Status; EFI_STATUS Status;
// //
// Allocate working buffer for RFC 4646 language in supported LanguageString. // Allocate working buffer for RFC 4646 language in supported LanguageString.
@ -120,7 +120,7 @@ LanguageChangeHandler (
Lang = AllocatePool (AsciiStrSize (gLanguageString)); Lang = AllocatePool (AsciiStrSize (gLanguageString));
ASSERT (Lang != NULL); ASSERT (Lang != NULL);
Index = 0; Index = 0;
LangCode = gLanguageString; LangCode = gLanguageString;
while (*LangCode != 0) { while (*LangCode != 0) {
GetNextLanguage (&LangCode, Lang); GetNextLanguage (&LangCode, Lang);
@ -148,6 +148,7 @@ LanguageChangeHandler (
} else { } else {
ASSERT (FALSE); ASSERT (FALSE);
} }
FreePool (Lang); FreePool (Lang);
return EFI_SUCCESS; return EFI_SUCCESS;
@ -172,28 +173,30 @@ LanguageChangeHandler (
**/ **/
BOOLEAN BOOLEAN
UiSupportLibCallbackHandler ( UiSupportLibCallbackHandler (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId, IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type, IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value, IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
OUT EFI_STATUS *Status OUT EFI_STATUS *Status
) )
{ {
if (QuestionId != FRONT_PAGE_KEY_CONTINUE && if ((QuestionId != FRONT_PAGE_KEY_CONTINUE) &&
QuestionId != FRONT_PAGE_KEY_RESET && (QuestionId != FRONT_PAGE_KEY_RESET) &&
QuestionId != FRONT_PAGE_KEY_LANGUAGE) { (QuestionId != FRONT_PAGE_KEY_LANGUAGE))
{
return FALSE; return FALSE;
} }
if (Action == EFI_BROWSER_ACTION_RETRIEVE) { if (Action == EFI_BROWSER_ACTION_RETRIEVE) {
if (QuestionId == FRONT_PAGE_KEY_LANGUAGE) { if (QuestionId == FRONT_PAGE_KEY_LANGUAGE) {
Value->u8 = gCurrentLanguageIndex; Value->u8 = gCurrentLanguageIndex;
*Status = EFI_SUCCESS; *Status = EFI_SUCCESS;
} else { } else {
*Status = EFI_UNSUPPORTED; *Status = EFI_UNSUPPORTED;
} }
return TRUE; return TRUE;
} }
@ -213,26 +216,26 @@ UiSupportLibCallbackHandler (
*Status = EFI_SUCCESS; *Status = EFI_SUCCESS;
switch (QuestionId) { switch (QuestionId) {
case FRONT_PAGE_KEY_CONTINUE: case FRONT_PAGE_KEY_CONTINUE:
// //
// This is the continue - clear the screen and return an error to get out of FrontPage loop // This is the continue - clear the screen and return an error to get out of FrontPage loop
// //
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT; *ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
break; break;
case FRONT_PAGE_KEY_LANGUAGE: case FRONT_PAGE_KEY_LANGUAGE:
*Status = LanguageChangeHandler(Value); *Status = LanguageChangeHandler (Value);
break; break;
case FRONT_PAGE_KEY_RESET: case FRONT_PAGE_KEY_RESET:
// //
// Reset // Reset
// //
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL); gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
*Status = EFI_UNSUPPORTED; *Status = EFI_UNSUPPORTED;
default: default:
break; break;
} }
} }
@ -248,20 +251,20 @@ UiSupportLibCallbackHandler (
**/ **/
VOID VOID
UiCreateLanguageMenu ( UiCreateLanguageMenu (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
) )
{ {
CHAR8 *LangCode; CHAR8 *LangCode;
CHAR8 *Lang; CHAR8 *Lang;
UINTN LangSize; UINTN LangSize;
CHAR8 *CurrentLang; CHAR8 *CurrentLang;
UINTN OptionCount; UINTN OptionCount;
CHAR16 *StringBuffer; CHAR16 *StringBuffer;
VOID *OptionsOpCodeHandle; VOID *OptionsOpCodeHandle;
UINTN StringSize; UINTN StringSize;
EFI_STATUS Status; EFI_STATUS Status;
EFI_HII_STRING_PROTOCOL *HiiString; EFI_HII_STRING_PROTOCOL *HiiString;
Lang = NULL; Lang = NULL;
StringBuffer = NULL; StringBuffer = NULL;
@ -272,17 +275,17 @@ UiCreateLanguageMenu (
OptionsOpCodeHandle = HiiAllocateOpCodeHandle (); OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
ASSERT (OptionsOpCodeHandle != NULL); ASSERT (OptionsOpCodeHandle != NULL);
GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL); GetEfiGlobalVariable2 (L"PlatformLang", (VOID **)&CurrentLang, NULL);
// //
// Get Support language list from variable. // Get Support language list from variable.
// //
GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&gLanguageString, NULL); GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID **)&gLanguageString, NULL);
if (gLanguageString == NULL) { if (gLanguageString == NULL) {
gLanguageString = AllocateCopyPool ( gLanguageString = AllocateCopyPool (
AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)), AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),
(CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes) (CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)
); );
ASSERT (gLanguageString != NULL); ASSERT (gLanguageString != NULL);
} }
@ -291,13 +294,13 @@ UiCreateLanguageMenu (
// Count the language list number. // Count the language list number.
// //
LangCode = gLanguageString; LangCode = gLanguageString;
Lang = AllocatePool (AsciiStrSize (gLanguageString)); Lang = AllocatePool (AsciiStrSize (gLanguageString));
ASSERT (Lang != NULL); ASSERT (Lang != NULL);
OptionCount = 0; OptionCount = 0;
while (*LangCode != 0) { while (*LangCode != 0) {
GetNextLanguage (&LangCode, Lang); GetNextLanguage (&LangCode, Lang);
OptionCount ++; OptionCount++;
} }
// //
@ -306,16 +309,16 @@ UiCreateLanguageMenu (
gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID)); gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));
ASSERT (gLanguageToken != NULL); ASSERT (gLanguageToken != NULL);
Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString); Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **)&HiiString);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
LangCode = gLanguageString; LangCode = gLanguageString;
OptionCount = 0; OptionCount = 0;
while (*LangCode != 0) { while (*LangCode != 0) {
GetNextLanguage (&LangCode, Lang); GetNextLanguage (&LangCode, Lang);
StringSize = 0; StringSize = 0;
Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL); Status = HiiString->GetString (HiiString, Lang, HiiHandle, PRINTABLE_LANGUAGE_NAME_STRING_ID, StringBuffer, &StringSize, NULL);
if (Status == EFI_BUFFER_TOO_SMALL) { if (Status == EFI_BUFFER_TOO_SMALL) {
StringBuffer = AllocateZeroPool (StringSize); StringBuffer = AllocateZeroPool (StringSize);
ASSERT (StringBuffer != NULL); ASSERT (StringBuffer != NULL);
@ -324,7 +327,7 @@ UiCreateLanguageMenu (
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
LangSize = AsciiStrSize (Lang); LangSize = AsciiStrSize (Lang);
StringBuffer = AllocatePool (LangSize * sizeof (CHAR16)); StringBuffer = AllocatePool (LangSize * sizeof (CHAR16));
ASSERT (StringBuffer != NULL); ASSERT (StringBuffer != NULL);
AsciiStrToUnicodeStrS (Lang, StringBuffer, LangSize); AsciiStrToUnicodeStrS (Lang, StringBuffer, LangSize);
@ -339,31 +342,32 @@ UiCreateLanguageMenu (
} }
ASSERT (gLanguageToken != NULL); ASSERT (gLanguageToken != NULL);
LangCode = gLanguageString; LangCode = gLanguageString;
OptionCount = 0; OptionCount = 0;
if (Lang == NULL) { if (Lang == NULL) {
Lang = AllocatePool (AsciiStrSize (gLanguageString)); Lang = AllocatePool (AsciiStrSize (gLanguageString));
ASSERT (Lang != NULL); ASSERT (Lang != NULL);
} }
while (*LangCode != 0) { while (*LangCode != 0) {
GetNextLanguage (&LangCode, Lang); GetNextLanguage (&LangCode, Lang);
if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) { if ((CurrentLang != NULL) && (AsciiStrCmp (Lang, CurrentLang) == 0)) {
HiiCreateOneOfOptionOpCode ( HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle, OptionsOpCodeHandle,
gLanguageToken[OptionCount], gLanguageToken[OptionCount],
EFI_IFR_OPTION_DEFAULT, EFI_IFR_OPTION_DEFAULT,
EFI_IFR_NUMERIC_SIZE_1, EFI_IFR_NUMERIC_SIZE_1,
(UINT8) OptionCount (UINT8)OptionCount
); );
gCurrentLanguageIndex = (UINT8) OptionCount; gCurrentLanguageIndex = (UINT8)OptionCount;
} else { } else {
HiiCreateOneOfOptionOpCode ( HiiCreateOneOfOptionOpCode (
OptionsOpCodeHandle, OptionsOpCodeHandle,
gLanguageToken[OptionCount], gLanguageToken[OptionCount],
0, 0,
EFI_IFR_NUMERIC_SIZE_1, EFI_IFR_NUMERIC_SIZE_1,
(UINT8) OptionCount (UINT8)OptionCount
); );
} }
@ -373,6 +377,7 @@ UiCreateLanguageMenu (
if (CurrentLang != NULL) { if (CurrentLang != NULL) {
FreePool (CurrentLang); FreePool (CurrentLang);
} }
FreePool (Lang); FreePool (Lang);
HiiCreateOneOfOpCode ( HiiCreateOneOfOpCode (
@ -398,8 +403,8 @@ UiCreateLanguageMenu (
**/ **/
VOID VOID
UiCreateContinueMenu ( UiCreateContinueMenu (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
) )
{ {
HiiCreateActionOpCode ( HiiCreateActionOpCode (
@ -421,8 +426,8 @@ UiCreateContinueMenu (
**/ **/
VOID VOID
UiCreateEmptyLine ( UiCreateEmptyLine (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
) )
{ {
HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0); HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);
@ -437,8 +442,8 @@ UiCreateEmptyLine (
**/ **/
VOID VOID
UiCreateResetMenu ( UiCreateResetMenu (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
) )
{ {
HiiCreateActionOpCode ( HiiCreateActionOpCode (
@ -462,11 +467,11 @@ UiCreateResetMenu (
**/ **/
CHAR16 * CHAR16 *
ExtractDevicePathFromHiiHandle ( ExtractDevicePathFromHiiHandle (
IN EFI_HII_HANDLE Handle IN EFI_HII_HANDLE Handle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE DriverHandle; EFI_HANDLE DriverHandle;
ASSERT (Handle != NULL); ASSERT (Handle != NULL);
@ -479,7 +484,7 @@ ExtractDevicePathFromHiiHandle (
return NULL; return NULL;
} }
return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE); return ConvertDevicePathToText (DevicePathFromHandle (DriverHandle), FALSE, FALSE);
} }
/** /**
@ -496,49 +501,49 @@ ExtractDevicePathFromHiiHandle (
**/ **/
BOOLEAN BOOLEAN
RequiredDriver ( RequiredDriver (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_GUID *Guid, IN EFI_GUID *Guid,
OUT EFI_STRING_ID *PromptId, OUT EFI_STRING_ID *PromptId,
OUT EFI_STRING_ID *HelpId, OUT EFI_STRING_ID *HelpId,
OUT VOID *FormsetGuid OUT VOID *FormsetGuid
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT8 ClassGuidNum; UINT8 ClassGuidNum;
EFI_GUID *ClassGuid; EFI_GUID *ClassGuid;
EFI_IFR_FORM_SET *Buffer; EFI_IFR_FORM_SET *Buffer;
UINTN BufferSize; UINTN BufferSize;
UINT8 *Ptr; UINT8 *Ptr;
UINTN TempSize; UINTN TempSize;
BOOLEAN RetVal; BOOLEAN RetVal;
Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize); Status = HiiGetFormSetFromHiiHandle (HiiHandle, &Buffer, &BufferSize);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return FALSE; return FALSE;
} }
RetVal = FALSE; RetVal = FALSE;
TempSize = 0; TempSize = 0;
Ptr = (UINT8 *) Buffer; Ptr = (UINT8 *)Buffer;
while(TempSize < BufferSize) { while (TempSize < BufferSize) {
TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length; TempSize += ((EFI_IFR_OP_HEADER *)Ptr)->Length;
if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){ if (((EFI_IFR_OP_HEADER *)Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {
Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length; Ptr += ((EFI_IFR_OP_HEADER *)Ptr)->Length;
continue; continue;
} }
ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3); ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET)); ClassGuid = (EFI_GUID *)(VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
while (ClassGuidNum-- > 0) { while (ClassGuidNum-- > 0) {
if (!CompareGuid (Guid, ClassGuid)){ if (!CompareGuid (Guid, ClassGuid)) {
ClassGuid ++; ClassGuid++;
continue; continue;
} }
*PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle; *PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;
*HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help; *HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;
CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID)); CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *)Ptr)->Guid, sizeof (EFI_GUID));
RetVal = TRUE; RetVal = TRUE;
} }
} }
@ -562,23 +567,23 @@ RequiredDriver (
**/ **/
EFI_STATUS EFI_STATUS
UiListThirdPartyDrivers ( UiListThirdPartyDrivers (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_GUID *ClassGuid, IN EFI_GUID *ClassGuid,
IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn, IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
) )
{ {
UINTN Index; UINTN Index;
EFI_STRING String; EFI_STRING String;
EFI_STRING_ID Token; EFI_STRING_ID Token;
EFI_STRING_ID TokenHelp; EFI_STRING_ID TokenHelp;
EFI_HII_HANDLE *HiiHandles; EFI_HII_HANDLE *HiiHandles;
CHAR16 *DevicePathStr; CHAR16 *DevicePathStr;
UINTN Count; UINTN Count;
UINTN CurrentSize; UINTN CurrentSize;
UI_HII_DRIVER_INSTANCE *DriverListPtr; UI_HII_DRIVER_INSTANCE *DriverListPtr;
EFI_STRING NewName; EFI_STRING NewName;
BOOLEAN EmptyLineAfter; BOOLEAN EmptyLineAfter;
if (gHiiDriverList != NULL) { if (gHiiDriverList != NULL) {
FreePool (gHiiDriverList); FreePool (gHiiDriverList);
@ -590,7 +595,7 @@ UiListThirdPartyDrivers (
gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE)); gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));
ASSERT (gHiiDriverList != NULL); ASSERT (gHiiDriverList != NULL);
DriverListPtr = gHiiDriverList; DriverListPtr = gHiiDriverList;
CurrentSize = UI_HII_DRIVER_LIST_SIZE; CurrentSize = UI_HII_DRIVER_LIST_SIZE;
for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) { for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {
if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) { if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {
@ -608,10 +613,11 @@ UiListThirdPartyDrivers (
EmptyLineAfter = FALSE; EmptyLineAfter = FALSE;
if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) { if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {
FreePool (String); FreePool (String);
String = NewName; String = NewName;
DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter; DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;
} }
} }
DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL); DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);
FreePool (String); FreePool (String);
@ -620,11 +626,12 @@ UiListThirdPartyDrivers (
String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL); String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
ASSERT (String != NULL); ASSERT (String != NULL);
} }
DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL); DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);
FreePool (String); FreePool (String);
DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]); DevicePathStr = ExtractDevicePathFromHiiHandle (HiiHandles[Index]);
if (DevicePathStr != NULL){ if (DevicePathStr != NULL) {
DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL); DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
FreePool (DevicePathStr); FreePool (DevicePathStr);
} else { } else {
@ -636,12 +643,12 @@ UiListThirdPartyDrivers (
DriverListPtr = ReallocatePool ( DriverListPtr = ReallocatePool (
CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE), CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE),
(Count + UI_HII_DRIVER_LIST_SIZE) (Count + UI_HII_DRIVER_LIST_SIZE)
* sizeof (UI_HII_DRIVER_INSTANCE), * sizeof (UI_HII_DRIVER_INSTANCE),
gHiiDriverList gHiiDriverList
); );
ASSERT (DriverListPtr != NULL); ASSERT (DriverListPtr != NULL);
gHiiDriverList = DriverListPtr; gHiiDriverList = DriverListPtr;
CurrentSize += UI_HII_DRIVER_LIST_SIZE; CurrentSize += UI_HII_DRIVER_LIST_SIZE;
} }
} }
@ -655,17 +662,17 @@ UiListThirdPartyDrivers (
gHiiDriverList[Index].PromptId, gHiiDriverList[Index].PromptId,
gHiiDriverList[Index].HelpId, gHiiDriverList[Index].HelpId,
0, 0,
(EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_DRIVER), (EFI_QUESTION_ID)(Index + FRONT_PAGE_KEY_DRIVER),
0, 0,
&gHiiDriverList[Index].FormSetGuid, &gHiiDriverList[Index].FormSetGuid,
gHiiDriverList[Index].DevicePathId gHiiDriverList[Index].DevicePathId
); );
if (gHiiDriverList[Index].EmptyLineAfter) { if (gHiiDriverList[Index].EmptyLineAfter) {
UiCreateEmptyLine (HiiHandle, StartOpCodeHandle); UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
} }
Index ++; Index++;
} }
return EFI_SUCCESS; return EFI_SUCCESS;

View File

@ -18,8 +18,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
VOID VOID
UiCreateContinueMenu ( UiCreateContinueMenu (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
); );
/** /**
@ -31,8 +31,8 @@ UiCreateContinueMenu (
**/ **/
VOID VOID
UiCreateEmptyLine ( UiCreateEmptyLine (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
); );
/** /**
@ -44,8 +44,8 @@ UiCreateEmptyLine (
**/ **/
VOID VOID
UiCreateLanguageMenu ( UiCreateLanguageMenu (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
); );
/** /**
@ -57,8 +57,8 @@ UiCreateLanguageMenu (
**/ **/
VOID VOID
UiCreateResetMenu ( UiCreateResetMenu (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
); );
/** /**
@ -77,7 +77,7 @@ BOOLEAN
IN CHAR16 *DriverName, IN CHAR16 *DriverName,
OUT CHAR16 **NewName, OUT CHAR16 **NewName,
OUT BOOLEAN *EmptyLineAfter OUT BOOLEAN *EmptyLineAfter
); );
/** /**
Search the drivers in the system which need to show in the front page Search the drivers in the system which need to show in the front page
@ -93,10 +93,10 @@ BOOLEAN
**/ **/
EFI_STATUS EFI_STATUS
UiListThirdPartyDrivers ( UiListThirdPartyDrivers (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_GUID *ClassGuid, IN EFI_GUID *ClassGuid,
IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn, IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
IN VOID *StartOpCodeHandle IN VOID *StartOpCodeHandle
); );
/** /**
@ -118,13 +118,13 @@ UiListThirdPartyDrivers (
**/ **/
BOOLEAN BOOLEAN
UiSupportLibCallbackHandler ( UiSupportLibCallbackHandler (
IN EFI_HII_HANDLE HiiHandle, IN EFI_HII_HANDLE HiiHandle,
IN EFI_BROWSER_ACTION Action, IN EFI_BROWSER_ACTION Action,
IN EFI_QUESTION_ID QuestionId, IN EFI_QUESTION_ID QuestionId,
IN UINT8 Type, IN UINT8 Type,
IN EFI_IFR_TYPE_VALUE *Value, IN EFI_IFR_TYPE_VALUE *Value,
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest, OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
OUT EFI_STATUS *Status OUT EFI_STATUS *Status
); );
#endif #endif

View File

@ -9,36 +9,36 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Ui.h" #include "Ui.h"
#include "FrontPage.h" #include "FrontPage.h"
EFI_HII_HANDLE gStringPackHandle; EFI_HII_HANDLE gStringPackHandle;
EFI_GUID mUiStringPackGuid = { EFI_GUID mUiStringPackGuid = {
0x136a3048, 0x752a, 0x4bf6, { 0xa7, 0x57, 0x9, 0x36, 0x11, 0x95, 0x38, 0xed } 0x136a3048, 0x752a, 0x4bf6, { 0xa7, 0x57, 0x9, 0x36, 0x11, 0x95, 0x38, 0xed }
}; };
EFI_GUID mFontPackageGuid = { EFI_GUID mFontPackageGuid = {
0x78941450, 0x90ab, 0x4fb1, {0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc} 0x78941450, 0x90ab, 0x4fb1, { 0xb7, 0x5f, 0x58, 0x92, 0x14, 0xe2, 0x4a, 0xc }
}; };
#define NARROW_GLYPH_NUMBER 8 #define NARROW_GLYPH_NUMBER 8
#define WIDE_GLYPH_NUMBER 75 #define WIDE_GLYPH_NUMBER 75
typedef struct { typedef struct {
/// ///
/// This 4-bytes total array length is required by HiiAddPackages() /// This 4-bytes total array length is required by HiiAddPackages()
/// ///
UINT32 Length; UINT32 Length;
// //
// This is the Font package definition // This is the Font package definition
// //
EFI_HII_PACKAGE_HEADER Header; EFI_HII_PACKAGE_HEADER Header;
UINT16 NumberOfNarrowGlyphs; UINT16 NumberOfNarrowGlyphs;
UINT16 NumberOfWideGlyphs; UINT16 NumberOfWideGlyphs;
EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER]; EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER]; EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
} FONT_PACK_BIN; } FONT_PACK_BIN;
FONT_PACK_BIN mFontBin = { FONT_PACK_BIN mFontBin = {
sizeof (FONT_PACK_BIN), sizeof (FONT_PACK_BIN),
{ {
sizeof (FONT_PACK_BIN) - sizeof (UINT32), sizeof (FONT_PACK_BIN) - sizeof (UINT32),
@ -260,11 +260,11 @@ InitializeStringSupport (
) )
{ {
gStringPackHandle = HiiAddPackages ( gStringPackHandle = HiiAddPackages (
&mUiStringPackGuid, &mUiStringPackGuid,
gImageHandle, gImageHandle,
UiAppStrings, UiAppStrings,
NULL NULL
); );
ASSERT (gStringPackHandle != NULL); ASSERT (gStringPackHandle != NULL);
} }
@ -292,7 +292,7 @@ UninitializeStringSupport (
**/ **/
CHAR16 * CHAR16 *
GetStringById ( GetStringById (
IN EFI_STRING_ID Id IN EFI_STRING_ID Id
) )
{ {
return HiiGetString (gStringPackHandle, Id, NULL); return HiiGetString (gStringPackHandle, Id, NULL);

View File

@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _STRING_H_ #ifndef _STRING_H_
#define _STRING_H_ #define _STRING_H_
extern EFI_HII_HANDLE gStringPackHandle; extern EFI_HII_HANDLE gStringPackHandle;
// //
// This is the VFR compiler generated header file which defines the // This is the VFR compiler generated header file which defines the
@ -38,7 +38,7 @@ extern UINT8 BdsDxeStrings[];
**/ **/
CHAR16 * CHAR16 *
GetStringById ( GetStringById (
IN EFI_STRING_ID Id IN EFI_STRING_ID Id
); );
/** /**

View File

@ -6,7 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef _BDS_MODULE_H_ #ifndef _BDS_MODULE_H_
#define _BDS_MODULE_H_ #define _BDS_MODULE_H_
@ -37,18 +36,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
/// HII specific Vendor Device Path definition. /// HII specific Vendor Device Path definition.
/// ///
typedef struct { typedef struct {
VENDOR_DEVICE_PATH VendorDevicePath; VENDOR_DEVICE_PATH VendorDevicePath;
EFI_DEVICE_PATH_PROTOCOL End; EFI_DEVICE_PATH_PROTOCOL End;
} HII_VENDOR_DEVICE_PATH; } HII_VENDOR_DEVICE_PATH;
#pragma pack() #pragma pack()
// //
//The interface functions related to the Setup Browser Reset Reminder feature // The interface functions related to the Setup Browser Reset Reminder feature
// //
/** /**
Record the info that a reset is required. Record the info that a reset is required.
A module boolean variable is used to record whether a reset is required. A module boolean variable is used to record whether a reset is required.
@ -60,8 +57,6 @@ EnableResetRequired (
VOID VOID
); );
/** /**
Check whether platform policy enables the reset reminder feature. The default is enabled. Check whether platform policy enables the reset reminder feature. The default is enabled.

View File

@ -41,23 +41,25 @@ EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2 = NULL;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GetVariableStatisticsData ( GetVariableStatisticsData (
IN OUT EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader, IN OUT EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader,
IN OUT UINTN *SmmCommunicateSize IN OUT UINTN *SmmCommunicateSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader; SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;
CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid); CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);
SmmCommunicateHeader->MessageLength = *SmmCommunicateSize - OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data); SmmCommunicateHeader->MessageLength = *SmmCommunicateSize - OFFSET_OF (EFI_MM_COMMUNICATE_HEADER, Data);
SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) &SmmCommunicateHeader->Data[0]; SmmVariableFunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)&SmmCommunicateHeader->Data[0];
SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_STATISTICS; SmmVariableFunctionHeader->Function = SMM_VARIABLE_FUNCTION_GET_STATISTICS;
Status = mMmCommunication2->Communicate (mMmCommunication2, Status = mMmCommunication2->Communicate (
SmmCommunicateHeader, mMmCommunication2,
SmmCommunicateHeader, SmmCommunicateHeader,
SmmCommunicateSize); SmmCommunicateHeader,
SmmCommunicateSize
);
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
Status = SmmVariableFunctionHeader->ReturnStatus; Status = SmmVariableFunctionHeader->ReturnStatus;
@ -77,62 +79,65 @@ PrintInfoFromSmm (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VARIABLE_INFO_ENTRY *VariableInfo; VARIABLE_INFO_ENTRY *VariableInfo;
EFI_MM_COMMUNICATE_HEADER *CommBuffer; EFI_MM_COMMUNICATE_HEADER *CommBuffer;
UINTN RealCommSize; UINTN RealCommSize;
UINTN CommSize; UINTN CommSize;
SMM_VARIABLE_COMMUNICATE_HEADER *FunctionHeader; SMM_VARIABLE_COMMUNICATE_HEADER *FunctionHeader;
EFI_SMM_VARIABLE_PROTOCOL *Smmvariable; EFI_SMM_VARIABLE_PROTOCOL *Smmvariable;
EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable; EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
UINT32 Index; UINT32 Index;
EFI_MEMORY_DESCRIPTOR *Entry; EFI_MEMORY_DESCRIPTOR *Entry;
UINTN Size; UINTN Size;
UINTN MaxSize; UINTN MaxSize;
Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &Smmvariable); Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)&Smmvariable);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **) &mMmCommunication2); Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
CommBuffer = NULL; CommBuffer = NULL;
RealCommSize = 0; RealCommSize = 0;
Status = EfiGetSystemConfigurationTable ( Status = EfiGetSystemConfigurationTable (
&gEdkiiPiSmmCommunicationRegionTableGuid, &gEdkiiPiSmmCommunicationRegionTableGuid,
(VOID **) &PiSmmCommunicationRegionTable (VOID **)&PiSmmCommunicationRegionTable
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
ASSERT (PiSmmCommunicationRegionTable != NULL); ASSERT (PiSmmCommunicationRegionTable != NULL);
Entry = (EFI_MEMORY_DESCRIPTOR *) (PiSmmCommunicationRegionTable + 1); Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1);
Size = 0; Size = 0;
MaxSize = 0; MaxSize = 0;
for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) { for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {
if (Entry->Type == EfiConventionalMemory) { if (Entry->Type == EfiConventionalMemory) {
Size = EFI_PAGES_TO_SIZE ((UINTN) Entry->NumberOfPages); Size = EFI_PAGES_TO_SIZE ((UINTN)Entry->NumberOfPages);
if (Size > (SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (VARIABLE_INFO_ENTRY))) { if (Size > (SMM_COMMUNICATE_HEADER_SIZE + SMM_VARIABLE_COMMUNICATE_HEADER_SIZE + sizeof (VARIABLE_INFO_ENTRY))) {
if (Size > MaxSize) { if (Size > MaxSize) {
MaxSize = Size; MaxSize = Size;
RealCommSize = MaxSize; RealCommSize = MaxSize;
CommBuffer = (EFI_MM_COMMUNICATE_HEADER *) (UINTN) Entry->PhysicalStart; CommBuffer = (EFI_MM_COMMUNICATE_HEADER *)(UINTN)Entry->PhysicalStart;
} }
} }
} }
Entry = (EFI_MEMORY_DESCRIPTOR *) ((UINT8 *) Entry + PiSmmCommunicationRegionTable->DescriptorSize);
Entry = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Entry + PiSmmCommunicationRegionTable->DescriptorSize);
} }
ASSERT (CommBuffer != NULL); ASSERT (CommBuffer != NULL);
ZeroMem (CommBuffer, RealCommSize); ZeroMem (CommBuffer, RealCommSize);
Print (L"SMM Driver Non-Volatile Variables:\n"); Print (L"SMM Driver Non-Volatile Variables:\n");
do { do {
CommSize = RealCommSize; CommSize = RealCommSize;
Status = GetVariableStatisticsData (CommBuffer, &CommSize); Status = GetVariableStatisticsData (CommBuffer, &CommSize);
if (Status == EFI_BUFFER_TOO_SMALL) { if (Status == EFI_BUFFER_TOO_SMALL) {
Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n"); Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n");
return Status; return Status;
@ -142,19 +147,19 @@ PrintInfoFromSmm (
break; break;
} }
FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data; FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)CommBuffer->Data;
VariableInfo = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data; VariableInfo = (VARIABLE_INFO_ENTRY *)FunctionHeader->Data;
if (!VariableInfo->Volatile) { if (!VariableInfo->Volatile) {
Print ( Print (
L"%g R%03d(%03d) W%03d D%03d:%s\n", L"%g R%03d(%03d) W%03d D%03d:%s\n",
&VariableInfo->VendorGuid, &VariableInfo->VendorGuid,
VariableInfo->ReadCount, VariableInfo->ReadCount,
VariableInfo->CacheCount, VariableInfo->CacheCount,
VariableInfo->WriteCount, VariableInfo->WriteCount,
VariableInfo->DeleteCount, VariableInfo->DeleteCount,
(CHAR16 *)(VariableInfo + 1) (CHAR16 *)(VariableInfo + 1)
); );
} }
} while (TRUE); } while (TRUE);
@ -162,7 +167,7 @@ PrintInfoFromSmm (
ZeroMem (CommBuffer, RealCommSize); ZeroMem (CommBuffer, RealCommSize);
do { do {
CommSize = RealCommSize; CommSize = RealCommSize;
Status = GetVariableStatisticsData (CommBuffer, &CommSize); Status = GetVariableStatisticsData (CommBuffer, &CommSize);
if (Status == EFI_BUFFER_TOO_SMALL) { if (Status == EFI_BUFFER_TOO_SMALL) {
Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n"); Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n");
return Status; return Status;
@ -172,19 +177,19 @@ PrintInfoFromSmm (
break; break;
} }
FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data; FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)CommBuffer->Data;
VariableInfo = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data; VariableInfo = (VARIABLE_INFO_ENTRY *)FunctionHeader->Data;
if (VariableInfo->Volatile) { if (VariableInfo->Volatile) {
Print ( Print (
L"%g R%03d(%03d) W%03d D%03d:%s\n", L"%g R%03d(%03d) W%03d D%03d:%s\n",
&VariableInfo->VendorGuid, &VariableInfo->VendorGuid,
VariableInfo->ReadCount, VariableInfo->ReadCount,
VariableInfo->CacheCount, VariableInfo->CacheCount,
VariableInfo->WriteCount, VariableInfo->WriteCount,
VariableInfo->DeleteCount, VariableInfo->DeleteCount,
(CHAR16 *)(VariableInfo + 1) (CHAR16 *)(VariableInfo + 1)
); );
} }
} while (TRUE); } while (TRUE);
@ -210,14 +215,14 @@ UefiMain (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS RuntimeDxeStatus; EFI_STATUS RuntimeDxeStatus;
EFI_STATUS SmmStatus; EFI_STATUS SmmStatus;
VARIABLE_INFO_ENTRY *VariableInfo; VARIABLE_INFO_ENTRY *VariableInfo;
VARIABLE_INFO_ENTRY *Entry; VARIABLE_INFO_ENTRY *Entry;
RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiVariableGuid, (VOID **) &Entry); RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiVariableGuid, (VOID **)&Entry);
if (EFI_ERROR (RuntimeDxeStatus) || (Entry == NULL)) { if (EFI_ERROR (RuntimeDxeStatus) || (Entry == NULL)) {
RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiAuthenticatedVariableGuid, (VOID **) &Entry); RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiAuthenticatedVariableGuid, (VOID **)&Entry);
} }
if (!EFI_ERROR (RuntimeDxeStatus) && (Entry != NULL)) { if (!EFI_ERROR (RuntimeDxeStatus) && (Entry != NULL)) {
@ -253,6 +258,7 @@ UefiMain (
VariableInfo->Name VariableInfo->Name
); );
} }
VariableInfo = VariableInfo->Next; VariableInfo = VariableInfo->Next;
} while (VariableInfo != NULL); } while (VariableInfo != NULL);
} }

File diff suppressed because it is too large Load Diff

View File

@ -40,7 +40,6 @@ EFI_PEI_NOTIFY_DESCRIPTOR mAhciEndOfPeiNotifyListTemplate = {
AhciPeimEndOfPei AhciPeimEndOfPei
}; };
/** /**
Free the DMA resources allocated by an ATA AHCI controller. Free the DMA resources allocated by an ATA AHCI controller.
@ -50,10 +49,10 @@ EFI_PEI_NOTIFY_DESCRIPTOR mAhciEndOfPeiNotifyListTemplate = {
**/ **/
VOID VOID
AhciFreeDmaResource ( AhciFreeDmaResource (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private
) )
{ {
EFI_AHCI_REGISTERS *AhciRegisters; EFI_AHCI_REGISTERS *AhciRegisters;
ASSERT (Private != NULL); ASSERT (Private != NULL);
@ -61,18 +60,18 @@ AhciFreeDmaResource (
if (AhciRegisters->AhciRFisMap != NULL) { if (AhciRegisters->AhciRFisMap != NULL) {
IoMmuFreeBuffer ( IoMmuFreeBuffer (
EFI_SIZE_TO_PAGES (AhciRegisters->MaxRFisSize), EFI_SIZE_TO_PAGES (AhciRegisters->MaxRFisSize),
AhciRegisters->AhciRFis, AhciRegisters->AhciRFis,
AhciRegisters->AhciRFisMap AhciRegisters->AhciRFisMap
); );
} }
if (AhciRegisters->AhciCmdListMap != NULL) { if (AhciRegisters->AhciCmdListMap != NULL) {
IoMmuFreeBuffer ( IoMmuFreeBuffer (
EFI_SIZE_TO_PAGES (AhciRegisters->MaxCmdListSize), EFI_SIZE_TO_PAGES (AhciRegisters->MaxCmdListSize),
AhciRegisters->AhciCmdList, AhciRegisters->AhciCmdList,
AhciRegisters->AhciCmdListMap AhciRegisters->AhciCmdListMap
); );
} }
if (AhciRegisters->AhciCmdTableMap != NULL) { if (AhciRegisters->AhciCmdTableMap != NULL) {
@ -82,7 +81,6 @@ AhciFreeDmaResource (
AhciRegisters->AhciCmdTableMap AhciRegisters->AhciCmdTableMap
); );
} }
} }
/** /**
@ -104,7 +102,7 @@ AhciPeimEndOfPei (
IN VOID *Ppi IN VOID *Ppi
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (NotifyDescriptor); Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_NOTIFY (NotifyDescriptor);
AhciFreeDmaResource (Private); AhciFreeDmaResource (Private);
@ -124,20 +122,20 @@ AhciPeimEndOfPei (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaAhciPeimEntry ( AtaAhciPeimEntry (
IN EFI_PEI_FILE_HANDLE FileHandle, IN EFI_PEI_FILE_HANDLE FileHandle,
IN CONST EFI_PEI_SERVICES **PeiServices IN CONST EFI_PEI_SERVICES **PeiServices
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_BOOT_MODE BootMode; EFI_BOOT_MODE BootMode;
EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi; EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi;
UINT8 Controller; UINT8 Controller;
UINTN MmioBase; UINTN MmioBase;
UINTN DevicePathLength; UINTN DevicePathLength;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINT32 PortBitMap; UINT32 PortBitMap;
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
UINT8 NumberOfPorts; UINT8 NumberOfPorts;
DEBUG ((DEBUG_INFO, "%a: Enters.\n", __FUNCTION__)); DEBUG ((DEBUG_INFO, "%a: Enters.\n", __FUNCTION__));
@ -157,7 +155,7 @@ AtaAhciPeimEntry (
&gEdkiiPeiAtaAhciHostControllerPpiGuid, &gEdkiiPeiAtaAhciHostControllerPpiGuid,
0, 0,
NULL, NULL,
(VOID **) &AhciHcPpi (VOID **)&AhciHcPpi
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG ((DEBUG_ERROR, "%a: Failed to locate AtaAhciHostControllerPpi.\n", __FUNCTION__)); DEBUG ((DEBUG_ERROR, "%a: Failed to locate AtaAhciHostControllerPpi.\n", __FUNCTION__));
@ -187,8 +185,10 @@ AtaAhciPeimEntry (
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((
DEBUG_ERROR, "%a: Fail to allocate get the device path for Controller %d.\n", DEBUG_ERROR,
__FUNCTION__, Controller "%a: Fail to allocate get the device path for Controller %d.\n",
__FUNCTION__,
Controller
)); ));
return Status; return Status;
} }
@ -199,8 +199,10 @@ AtaAhciPeimEntry (
Status = AhciIsHcDevicePathValid (DevicePath, DevicePathLength); Status = AhciIsHcDevicePathValid (DevicePath, DevicePathLength);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG (( DEBUG ((
DEBUG_ERROR, "%a: The device path is invalid for Controller %d.\n", DEBUG_ERROR,
__FUNCTION__, Controller "%a: The device path is invalid for Controller %d.\n",
__FUNCTION__,
Controller
)); ));
Controller++; Controller++;
continue; continue;
@ -231,8 +233,10 @@ AtaAhciPeimEntry (
Private = AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA)); Private = AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA));
if (Private == NULL) { if (Private == NULL) {
DEBUG (( DEBUG ((
DEBUG_ERROR, "%a: Fail to allocate private data for Controller %d.\n", DEBUG_ERROR,
__FUNCTION__, Controller "%a: Fail to allocate private data for Controller %d.\n",
__FUNCTION__,
Controller
)); ));
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -260,8 +264,8 @@ AtaAhciPeimEntry (
continue; continue;
} }
Private->AtaPassThruMode.Attributes = EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL | Private->AtaPassThruMode.Attributes = EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |
EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL; EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;
Private->AtaPassThruMode.IoAlign = sizeof (UINTN); Private->AtaPassThruMode.IoAlign = sizeof (UINTN);
Private->AtaPassThruPpi.Revision = EDKII_PEI_ATA_PASS_THRU_PPI_REVISION; Private->AtaPassThruPpi.Revision = EDKII_PEI_ATA_PASS_THRU_PPI_REVISION;
Private->AtaPassThruPpi.Mode = &Private->AtaPassThruMode; Private->AtaPassThruPpi.Mode = &Private->AtaPassThruMode;
@ -274,18 +278,18 @@ AtaAhciPeimEntry (
&mAhciAtaPassThruPpiListTemplate, &mAhciAtaPassThruPpiListTemplate,
sizeof (EFI_PEI_PPI_DESCRIPTOR) sizeof (EFI_PEI_PPI_DESCRIPTOR)
); );
Private->AtaPassThruPpiList.Ppi = &Private->AtaPassThruPpi; Private->AtaPassThruPpiList.Ppi = &Private->AtaPassThruPpi;
PeiServicesInstallPpi (&Private->AtaPassThruPpiList); PeiServicesInstallPpi (&Private->AtaPassThruPpiList);
Private->BlkIoPpi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo; Private->BlkIoPpi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo;
Private->BlkIoPpi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo; Private->BlkIoPpi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo;
Private->BlkIoPpi.ReadBlocks = AhciBlockIoReadBlocks; Private->BlkIoPpi.ReadBlocks = AhciBlockIoReadBlocks;
CopyMem ( CopyMem (
&Private->BlkIoPpiList, &Private->BlkIoPpiList,
&mAhciBlkIoPpiListTemplate, &mAhciBlkIoPpiListTemplate,
sizeof (EFI_PEI_PPI_DESCRIPTOR) sizeof (EFI_PEI_PPI_DESCRIPTOR)
); );
Private->BlkIoPpiList.Ppi = &Private->BlkIoPpi; Private->BlkIoPpiList.Ppi = &Private->BlkIoPpi;
PeiServicesInstallPpi (&Private->BlkIoPpiList); PeiServicesInstallPpi (&Private->BlkIoPpiList);
Private->BlkIo2Ppi.Revision = EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION; Private->BlkIo2Ppi.Revision = EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;
@ -297,14 +301,15 @@ AtaAhciPeimEntry (
&mAhciBlkIo2PpiListTemplate, &mAhciBlkIo2PpiListTemplate,
sizeof (EFI_PEI_PPI_DESCRIPTOR) sizeof (EFI_PEI_PPI_DESCRIPTOR)
); );
Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi; Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;
PeiServicesInstallPpi (&Private->BlkIo2PpiList); PeiServicesInstallPpi (&Private->BlkIo2PpiList);
if (Private->TrustComputingDevices != 0) { if (Private->TrustComputingDevices != 0) {
DEBUG (( DEBUG ((
DEBUG_INFO, DEBUG_INFO,
"%a: Security Security Command PPI will be produced for Controller %d.\n", "%a: Security Security Command PPI will be produced for Controller %d.\n",
__FUNCTION__, Controller __FUNCTION__,
Controller
)); ));
Private->StorageSecurityPpi.Revision = EDKII_STORAGE_SECURITY_PPI_REVISION; Private->StorageSecurityPpi.Revision = EDKII_STORAGE_SECURITY_PPI_REVISION;
Private->StorageSecurityPpi.GetNumberofDevices = AhciStorageSecurityGetDeviceNo; Private->StorageSecurityPpi.GetNumberofDevices = AhciStorageSecurityGetDeviceNo;
@ -316,7 +321,7 @@ AtaAhciPeimEntry (
&mAhciStorageSecurityPpiListTemplate, &mAhciStorageSecurityPpiListTemplate,
sizeof (EFI_PEI_PPI_DESCRIPTOR) sizeof (EFI_PEI_PPI_DESCRIPTOR)
); );
Private->StorageSecurityPpiList.Ppi = &Private->StorageSecurityPpi; Private->StorageSecurityPpiList.Ppi = &Private->StorageSecurityPpi;
PeiServicesInstallPpi (&Private->StorageSecurityPpiList); PeiServicesInstallPpi (&Private->StorageSecurityPpiList);
} }
@ -325,11 +330,13 @@ AtaAhciPeimEntry (
&mAhciEndOfPeiNotifyListTemplate, &mAhciEndOfPeiNotifyListTemplate,
sizeof (EFI_PEI_NOTIFY_DESCRIPTOR) sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)
); );
PeiServicesNotifyPpi (&Private->EndOfPeiNotifyList); PeiServicesNotifyPpi (&Private->EndOfPeiNotifyList);
DEBUG (( DEBUG ((
DEBUG_INFO, "%a: Controller %d has been successfully initialized.\n", DEBUG_INFO,
__FUNCTION__, Controller "%a: Controller %d has been successfully initialized.\n",
__FUNCTION__,
Controller
)); ));
Controller++; Controller++;
} }

View File

@ -33,7 +33,7 @@
// //
// Structure forward declarations // Structure forward declarations
// //
typedef struct _PEI_AHCI_CONTROLLER_PRIVATE_DATA PEI_AHCI_CONTROLLER_PRIVATE_DATA; typedef struct _PEI_AHCI_CONTROLLER_PRIVATE_DATA PEI_AHCI_CONTROLLER_PRIVATE_DATA;
#include "AhciPeiPassThru.h" #include "AhciPeiPassThru.h"
#include "AhciPeiBlockIo.h" #include "AhciPeiBlockIo.h"
@ -46,107 +46,107 @@ typedef struct _PEI_AHCI_CONTROLLER_PRIVATE_DATA PEI_AHCI_CONTROLLER_PRIVATE_DA
// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms. // Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms.
// The value is in millisecond units. Add a bit of margin for robustness. // The value is in millisecond units. Add a bit of margin for robustness.
// //
#define AHCI_BUS_PHY_DETECT_TIMEOUT 15 #define AHCI_BUS_PHY_DETECT_TIMEOUT 15
// //
// Refer SATA1.0a spec, the bus reset time should be less than 1s. // Refer SATA1.0a spec, the bus reset time should be less than 1s.
// The value is in 100ns units. // The value is in 100ns units.
// //
#define AHCI_PEI_RESET_TIMEOUT 10000000 #define AHCI_PEI_RESET_TIMEOUT 10000000
// //
// Time out Value for ATA pass through protocol, in 100ns units. // Time out Value for ATA pass through protocol, in 100ns units.
// //
#define ATA_TIMEOUT 30000000 #define ATA_TIMEOUT 30000000
// //
// Maximal number of Physical Region Descriptor Table entries supported. // Maximal number of Physical Region Descriptor Table entries supported.
// //
#define AHCI_MAX_PRDT_NUMBER 8 #define AHCI_MAX_PRDT_NUMBER 8
#define AHCI_CAPABILITY_OFFSET 0x0000 #define AHCI_CAPABILITY_OFFSET 0x0000
#define AHCI_CAP_SAM BIT18 #define AHCI_CAP_SAM BIT18
#define AHCI_CAP_SSS BIT27 #define AHCI_CAP_SSS BIT27
#define AHCI_GHC_OFFSET 0x0004 #define AHCI_GHC_OFFSET 0x0004
#define AHCI_GHC_RESET BIT0 #define AHCI_GHC_RESET BIT0
#define AHCI_GHC_ENABLE BIT31 #define AHCI_GHC_ENABLE BIT31
#define AHCI_IS_OFFSET 0x0008 #define AHCI_IS_OFFSET 0x0008
#define AHCI_PI_OFFSET 0x000C #define AHCI_PI_OFFSET 0x000C
#define AHCI_MAX_PORTS 32 #define AHCI_MAX_PORTS 32
typedef struct { typedef struct {
UINT32 Lower32; UINT32 Lower32;
UINT32 Upper32; UINT32 Upper32;
} DATA_32; } DATA_32;
typedef union { typedef union {
DATA_32 Uint32; DATA_32 Uint32;
UINT64 Uint64; UINT64 Uint64;
} DATA_64; } DATA_64;
#define AHCI_ATAPI_SIG_MASK 0xFFFF0000 #define AHCI_ATAPI_SIG_MASK 0xFFFF0000
#define AHCI_ATA_DEVICE_SIG 0x00000000 #define AHCI_ATA_DEVICE_SIG 0x00000000
// //
// Each PRDT entry can point to a memory block up to 4M byte // Each PRDT entry can point to a memory block up to 4M byte
// //
#define AHCI_MAX_DATA_PER_PRDT 0x400000 #define AHCI_MAX_DATA_PER_PRDT 0x400000
#define AHCI_FIS_REGISTER_H2D 0x27 //Register FIS - Host to Device #define AHCI_FIS_REGISTER_H2D 0x27 // Register FIS - Host to Device
#define AHCI_FIS_REGISTER_H2D_LENGTH 20 #define AHCI_FIS_REGISTER_H2D_LENGTH 20
#define AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host #define AHCI_FIS_REGISTER_D2H 0x34 // Register FIS - Device to Host
#define AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host #define AHCI_FIS_PIO_SETUP 0x5F // PIO Setup FIS - Device to Host
#define AHCI_D2H_FIS_OFFSET 0x40 #define AHCI_D2H_FIS_OFFSET 0x40
#define AHCI_PIO_FIS_OFFSET 0x20 #define AHCI_PIO_FIS_OFFSET 0x20
#define AHCI_FIS_TYPE_MASK 0xFF #define AHCI_FIS_TYPE_MASK 0xFF
// //
// Port register // Port register
// //
#define AHCI_PORT_START 0x0100 #define AHCI_PORT_START 0x0100
#define AHCI_PORT_REG_WIDTH 0x0080 #define AHCI_PORT_REG_WIDTH 0x0080
#define AHCI_PORT_CLB 0x0000 #define AHCI_PORT_CLB 0x0000
#define AHCI_PORT_CLBU 0x0004 #define AHCI_PORT_CLBU 0x0004
#define AHCI_PORT_FB 0x0008 #define AHCI_PORT_FB 0x0008
#define AHCI_PORT_FBU 0x000C #define AHCI_PORT_FBU 0x000C
#define AHCI_PORT_IS 0x0010 #define AHCI_PORT_IS 0x0010
#define AHCI_PORT_IE 0x0014 #define AHCI_PORT_IE 0x0014
#define AHCI_PORT_CMD 0x0018 #define AHCI_PORT_CMD 0x0018
#define AHCI_PORT_CMD_ST BIT0 #define AHCI_PORT_CMD_ST BIT0
#define AHCI_PORT_CMD_SUD BIT1 #define AHCI_PORT_CMD_SUD BIT1
#define AHCI_PORT_CMD_POD BIT2 #define AHCI_PORT_CMD_POD BIT2
#define AHCI_PORT_CMD_CLO BIT3 #define AHCI_PORT_CMD_CLO BIT3
#define AHCI_PORT_CMD_FRE BIT4 #define AHCI_PORT_CMD_FRE BIT4
#define AHCI_PORT_CMD_FR BIT14 #define AHCI_PORT_CMD_FR BIT14
#define AHCI_PORT_CMD_CR BIT15 #define AHCI_PORT_CMD_CR BIT15
#define AHCI_PORT_CMD_CPD BIT20 #define AHCI_PORT_CMD_CPD BIT20
#define AHCI_PORT_CMD_ATAPI BIT24 #define AHCI_PORT_CMD_ATAPI BIT24
#define AHCI_PORT_CMD_DLAE BIT25 #define AHCI_PORT_CMD_DLAE BIT25
#define AHCI_PORT_CMD_ALPE BIT26 #define AHCI_PORT_CMD_ALPE BIT26
#define AHCI_PORT_CMD_ACTIVE (1 << 28) #define AHCI_PORT_CMD_ACTIVE (1 << 28)
#define AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) #define AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
#define AHCI_PORT_TFD 0x0020 #define AHCI_PORT_TFD 0x0020
#define AHCI_PORT_TFD_ERR BIT0 #define AHCI_PORT_TFD_ERR BIT0
#define AHCI_PORT_TFD_DRQ BIT3 #define AHCI_PORT_TFD_DRQ BIT3
#define AHCI_PORT_TFD_BSY BIT7 #define AHCI_PORT_TFD_BSY BIT7
#define AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) #define AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
#define AHCI_PORT_SIG 0x0024 #define AHCI_PORT_SIG 0x0024
#define AHCI_PORT_SSTS 0x0028 #define AHCI_PORT_SSTS 0x0028
#define AHCI_PORT_SSTS_DET_MASK 0x000F #define AHCI_PORT_SSTS_DET_MASK 0x000F
#define AHCI_PORT_SSTS_DET 0x0001 #define AHCI_PORT_SSTS_DET 0x0001
#define AHCI_PORT_SSTS_DET_PCE 0x0003 #define AHCI_PORT_SSTS_DET_PCE 0x0003
#define AHCI_PORT_SCTL 0x002C #define AHCI_PORT_SCTL 0x002C
#define AHCI_PORT_SCTL_IPM_INIT 0x0300 #define AHCI_PORT_SCTL_IPM_INIT 0x0300
#define AHCI_PORT_SERR 0x0030 #define AHCI_PORT_SERR 0x0030
#define AHCI_PORT_CI 0x0038 #define AHCI_PORT_CI 0x0038
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0) #define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
#define TIMER_PERIOD_SECONDS(Seconds) MultU64x32((UINT64)(Seconds), 10000000) #define TIMER_PERIOD_SECONDS(Seconds) MultU64x32((UINT64)(Seconds), 10000000)
#pragma pack(1) #pragma pack(1)
@ -170,19 +170,19 @@ typedef struct {
// The entry Data structure is listed at the following. // The entry Data structure is listed at the following.
// //
typedef struct { typedef struct {
UINT32 AhciCmdCfl:5; //Command FIS Length UINT32 AhciCmdCfl : 5; // Command FIS Length
UINT32 AhciCmdA:1; //ATAPI UINT32 AhciCmdA : 1; // ATAPI
UINT32 AhciCmdW:1; //Write UINT32 AhciCmdW : 1; // Write
UINT32 AhciCmdP:1; //Prefetchable UINT32 AhciCmdP : 1; // Prefetchable
UINT32 AhciCmdR:1; //Reset UINT32 AhciCmdR : 1; // Reset
UINT32 AhciCmdB:1; //BIST UINT32 AhciCmdB : 1; // BIST
UINT32 AhciCmdC:1; //Clear Busy upon R_OK UINT32 AhciCmdC : 1; // Clear Busy upon R_OK
UINT32 AhciCmdRsvd:1; UINT32 AhciCmdRsvd : 1;
UINT32 AhciCmdPmp:4; //Port Multiplier Port UINT32 AhciCmdPmp : 4; // Port Multiplier Port
UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length UINT32 AhciCmdPrdtl : 16; // Physical Region Descriptor Table Length
UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count UINT32 AhciCmdPrdbc; // Physical Region Descriptor Byte Count
UINT32 AhciCmdCtba; //Command Table Descriptor Base Address UINT32 AhciCmdCtba; // Command Table Descriptor Base Address
UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs UINT32 AhciCmdCtbau; // Command Table Descriptor Base Address Upper 32-BITs
UINT32 AhciCmdRsvd1[4]; UINT32 AhciCmdRsvd1[4];
} EFI_AHCI_COMMAND_LIST; } EFI_AHCI_COMMAND_LIST;
@ -192,28 +192,28 @@ typedef struct {
// specified in the Serial ATA Revision 2.6 specification. // specified in the Serial ATA Revision 2.6 specification.
// //
typedef struct { typedef struct {
UINT8 AhciCFisType; UINT8 AhciCFisType;
UINT8 AhciCFisPmNum:4; UINT8 AhciCFisPmNum : 4;
UINT8 AhciCFisRsvd:1; UINT8 AhciCFisRsvd : 1;
UINT8 AhciCFisRsvd1:1; UINT8 AhciCFisRsvd1 : 1;
UINT8 AhciCFisRsvd2:1; UINT8 AhciCFisRsvd2 : 1;
UINT8 AhciCFisCmdInd:1; UINT8 AhciCFisCmdInd : 1;
UINT8 AhciCFisCmd; UINT8 AhciCFisCmd;
UINT8 AhciCFisFeature; UINT8 AhciCFisFeature;
UINT8 AhciCFisSecNum; UINT8 AhciCFisSecNum;
UINT8 AhciCFisClyLow; UINT8 AhciCFisClyLow;
UINT8 AhciCFisClyHigh; UINT8 AhciCFisClyHigh;
UINT8 AhciCFisDevHead; UINT8 AhciCFisDevHead;
UINT8 AhciCFisSecNumExp; UINT8 AhciCFisSecNumExp;
UINT8 AhciCFisClyLowExp; UINT8 AhciCFisClyLowExp;
UINT8 AhciCFisClyHighExp; UINT8 AhciCFisClyHighExp;
UINT8 AhciCFisFeatureExp; UINT8 AhciCFisFeatureExp;
UINT8 AhciCFisSecCount; UINT8 AhciCFisSecCount;
UINT8 AhciCFisSecCountExp; UINT8 AhciCFisSecCountExp;
UINT8 AhciCFisRsvd3; UINT8 AhciCFisRsvd3;
UINT8 AhciCFisControl; UINT8 AhciCFisControl;
UINT8 AhciCFisRsvd4[4]; UINT8 AhciCFisRsvd4[4];
UINT8 AhciCFisRsvd5[44]; UINT8 AhciCFisRsvd5[44];
} EFI_AHCI_COMMAND_FIS; } EFI_AHCI_COMMAND_FIS;
// //
@ -230,12 +230,12 @@ typedef struct {
// list entry for this command slot. // list entry for this command slot.
// //
typedef struct { typedef struct {
UINT32 AhciPrdtDba; //Data Base Address UINT32 AhciPrdtDba; // Data Base Address
UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs UINT32 AhciPrdtDbau; // Data Base Address Upper 32-BITs
UINT32 AhciPrdtRsvd; UINT32 AhciPrdtRsvd;
UINT32 AhciPrdtDbc:22; //Data Byte Count UINT32 AhciPrdtDbc : 22; // Data Byte Count
UINT32 AhciPrdtRsvd1:9; UINT32 AhciPrdtRsvd1 : 9;
UINT32 AhciPrdtIoc:1; //Interrupt on Completion UINT32 AhciPrdtIoc : 1; // Interrupt on Completion
} EFI_AHCI_COMMAND_PRDT; } EFI_AHCI_COMMAND_PRDT;
// //
@ -268,7 +268,7 @@ typedef struct {
// //
// Unique signature for AHCI ATA device information structure. // Unique signature for AHCI ATA device information structure.
// //
#define AHCI_PEI_ATA_DEVICE_DATA_SIGNATURE SIGNATURE_32 ('A', 'P', 'A', 'D') #define AHCI_PEI_ATA_DEVICE_DATA_SIGNATURE SIGNATURE_32 ('A', 'P', 'A', 'D')
// //
// AHCI mode device information structure. // AHCI mode device information structure.
@ -301,7 +301,7 @@ typedef struct {
// //
// Unique signature for private data structure. // Unique signature for private data structure.
// //
#define AHCI_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('A','P','C','P') #define AHCI_PEI_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('A','P','C','P')
// //
// ATA AHCI controller private data structure. // ATA AHCI controller private data structure.
@ -348,7 +348,7 @@ struct _PEI_AHCI_CONTROLLER_PRIVATE_DATA {
// //
// Global variables // Global variables
// //
extern UINT32 mMaxTransferBlockNumber[2]; extern UINT32 mMaxTransferBlockNumber[2];
// //
// Internal functions // Internal functions
@ -394,9 +394,9 @@ IoMmuAllocateBuffer (
**/ **/
EFI_STATUS EFI_STATUS
IoMmuFreeBuffer ( IoMmuFreeBuffer (
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress, IN VOID *HostAddress,
IN VOID *Mapping IN VOID *Mapping
); );
/** /**
@ -420,11 +420,11 @@ IoMmuFreeBuffer (
**/ **/
EFI_STATUS EFI_STATUS
IoMmuMap ( IoMmuMap (
IN EDKII_IOMMU_OPERATION Operation, IN EDKII_IOMMU_OPERATION Operation,
IN VOID *HostAddress, IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes, IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping OUT VOID **Mapping
); );
/** /**
@ -438,7 +438,7 @@ IoMmuMap (
**/ **/
EFI_STATUS EFI_STATUS
IoMmuUnmap ( IoMmuUnmap (
IN VOID *Mapping IN VOID *Mapping
); );
/** /**
@ -470,7 +470,7 @@ AhciPeimEndOfPei (
**/ **/
UINT8 UINT8
AhciGetNumberOfPortsFromMap ( AhciGetNumberOfPortsFromMap (
IN UINT32 PortBitMap IN UINT32 PortBitMap
); );
/** /**
@ -497,16 +497,16 @@ AhciGetNumberOfPortsFromMap (
**/ **/
EFI_STATUS EFI_STATUS
AhciPioTransfer ( AhciPioTransfer (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 PortMultiplier, IN UINT8 PortMultiplier,
IN UINT8 FisIndex, IN UINT8 FisIndex,
IN BOOLEAN Read, IN BOOLEAN Read,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN OUT VOID *MemoryAddr, IN OUT VOID *MemoryAddr,
IN UINT32 DataCount, IN UINT32 DataCount,
IN UINT64 Timeout IN UINT64 Timeout
); );
/** /**
@ -529,13 +529,13 @@ AhciPioTransfer (
**/ **/
EFI_STATUS EFI_STATUS
AhciNonDataTransfer ( AhciNonDataTransfer (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 PortMultiplier, IN UINT8 PortMultiplier,
IN UINT8 FisIndex, IN UINT8 FisIndex,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN UINT64 Timeout IN UINT64 Timeout
); );
/** /**
@ -554,7 +554,7 @@ AhciNonDataTransfer (
**/ **/
EFI_STATUS EFI_STATUS
AhciModeInitialization ( AhciModeInitialization (
IN OUT PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private IN OUT PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private
); );
/** /**
@ -576,11 +576,11 @@ AhciModeInitialization (
**/ **/
EFI_STATUS EFI_STATUS
TransferAtaDevice ( TransferAtaDevice (
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData, IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
IN OUT VOID *Buffer, IN OUT VOID *Buffer,
IN EFI_LBA StartLba, IN EFI_LBA StartLba,
IN UINT32 TransferLength, IN UINT32 TransferLength,
IN BOOLEAN IsWrite IN BOOLEAN IsWrite
); );
/** /**
@ -621,14 +621,14 @@ TransferAtaDevice (
**/ **/
EFI_STATUS EFI_STATUS
TrustTransferAtaDevice ( TrustTransferAtaDevice (
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData, IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
IN OUT VOID *Buffer, IN OUT VOID *Buffer,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN TransferLength, IN UINTN TransferLength,
IN BOOLEAN IsTrustSend, IN BOOLEAN IsTrustSend,
IN UINT64 Timeout, IN UINT64 Timeout,
OUT UINTN *TransferLengthOut OUT UINTN *TransferLengthOut
); );
/** /**
@ -662,9 +662,9 @@ NextDevicePathNode (
**/ **/
EFI_STATUS EFI_STATUS
GetDevicePathInstanceSize ( GetDevicePathInstanceSize (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT UINTN *InstanceSize, OUT UINTN *InstanceSize,
OUT BOOLEAN *EntireDevicePathEnd OUT BOOLEAN *EntireDevicePathEnd
); );
/** /**
@ -680,8 +680,8 @@ GetDevicePathInstanceSize (
**/ **/
EFI_STATUS EFI_STATUS
AhciIsHcDevicePathValid ( AhciIsHcDevicePathValid (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN UINTN DevicePathLength IN UINTN DevicePathLength
); );
/** /**
@ -702,11 +702,11 @@ AhciIsHcDevicePathValid (
**/ **/
EFI_STATUS EFI_STATUS
AhciBuildDevicePath ( AhciBuildDevicePath (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
OUT UINTN *DevicePathLength, OUT UINTN *DevicePathLength,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
/** /**
@ -723,9 +723,9 @@ AhciBuildDevicePath (
**/ **/
UINT8 UINT8
AhciS3GetEumeratePorts ( AhciS3GetEumeratePorts (
IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath,
IN UINTN HcDevicePathLength, IN UINTN HcDevicePathLength,
OUT UINT32 *PortBitMap OUT UINT32 *PortBitMap
); );
#endif #endif

View File

@ -23,12 +23,12 @@
**/ **/
PEI_AHCI_ATA_DEVICE_DATA * PEI_AHCI_ATA_DEVICE_DATA *
SearchDeviceByIndex ( SearchDeviceByIndex (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINTN DeviceIndex IN UINTN DeviceIndex
) )
{ {
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
LIST_ENTRY *Node; LIST_ENTRY *Node;
if ((DeviceIndex == 0) || (DeviceIndex > Private->ActiveDevices)) { if ((DeviceIndex == 0) || (DeviceIndex > Private->ActiveDevices)) {
return NULL; return NULL;
@ -66,26 +66,26 @@ SearchDeviceByIndex (
**/ **/
EFI_STATUS EFI_STATUS
AccessAtaDevice ( AccessAtaDevice (
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData, IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
IN OUT UINT8 *Buffer, IN OUT UINT8 *Buffer,
IN EFI_LBA StartLba, IN EFI_LBA StartLba,
IN UINTN NumberOfBlocks IN UINTN NumberOfBlocks
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN MaxTransferBlockNumber; UINTN MaxTransferBlockNumber;
UINTN TransferBlockNumber; UINTN TransferBlockNumber;
UINTN BlockSize; UINTN BlockSize;
// //
// Ensure Lba48Bit is a valid boolean value // Ensure Lba48Bit is a valid boolean value
// //
ASSERT ((UINTN) DeviceData->Lba48Bit < 2); ASSERT ((UINTN)DeviceData->Lba48Bit < 2);
if ((UINTN) DeviceData->Lba48Bit >= 2) { if ((UINTN)DeviceData->Lba48Bit >= 2) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
MaxTransferBlockNumber = mMaxTransferBlockNumber[DeviceData->Lba48Bit]; MaxTransferBlockNumber = mMaxTransferBlockNumber[DeviceData->Lba48Bit];
BlockSize = DeviceData->Media.BlockSize; BlockSize = DeviceData->Media.BlockSize;
@ -93,20 +93,24 @@ AccessAtaDevice (
if (NumberOfBlocks > MaxTransferBlockNumber) { if (NumberOfBlocks > MaxTransferBlockNumber) {
TransferBlockNumber = MaxTransferBlockNumber; TransferBlockNumber = MaxTransferBlockNumber;
NumberOfBlocks -= MaxTransferBlockNumber; NumberOfBlocks -= MaxTransferBlockNumber;
} else { } else {
TransferBlockNumber = NumberOfBlocks; TransferBlockNumber = NumberOfBlocks;
NumberOfBlocks = 0; NumberOfBlocks = 0;
} }
DEBUG (( DEBUG ((
DEBUG_BLKIO, "%a: Blocking AccessAtaDevice, TransferBlockNumber = %x; StartLba = %x\n", DEBUG_BLKIO,
__FUNCTION__, TransferBlockNumber, StartLba "%a: Blocking AccessAtaDevice, TransferBlockNumber = %x; StartLba = %x\n",
__FUNCTION__,
TransferBlockNumber,
StartLba
)); ));
Status = TransferAtaDevice ( Status = TransferAtaDevice (
DeviceData, DeviceData,
Buffer, Buffer,
StartLba, StartLba,
(UINT32) TransferBlockNumber, (UINT32)TransferBlockNumber,
FALSE // Read FALSE // Read
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -134,15 +138,15 @@ AccessAtaDevice (
**/ **/
EFI_STATUS EFI_STATUS
AhciRead ( AhciRead (
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData, IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
OUT VOID *Buffer, OUT VOID *Buffer,
IN EFI_LBA StartLba, IN EFI_LBA StartLba,
IN UINTN BufferSize IN UINTN BufferSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN BlockSize; UINTN BlockSize;
UINTN NumberOfBlocks; UINTN NumberOfBlocks;
// //
// Check parameters. // Check parameters.
@ -163,7 +167,8 @@ AhciRead (
if (StartLba > DeviceData->Media.LastBlock) { if (StartLba > DeviceData->Media.LastBlock) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
NumberOfBlocks = BufferSize / BlockSize;
NumberOfBlocks = BufferSize / BlockSize;
if (NumberOfBlocks - 1 > DeviceData->Media.LastBlock - StartLba) { if (NumberOfBlocks - 1 > DeviceData->Media.LastBlock - StartLba) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -176,7 +181,6 @@ AhciRead (
return Status; return Status;
} }
/** /**
Gets the count of block I/O devices that one specific block driver detects. Gets the count of block I/O devices that one specific block driver detects.
@ -201,13 +205,13 @@ AhciBlockIoGetDeviceNo (
OUT UINTN *NumberBlockDevices OUT UINTN *NumberBlockDevices
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
if (This == NULL || NumberBlockDevices == NULL) { if ((This == NULL) || (NumberBlockDevices == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_BLKIO (This); Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_BLKIO (This);
*NumberBlockDevices = Private->ActiveDevices; *NumberBlockDevices = Private->ActiveDevices;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -263,10 +267,10 @@ AhciBlockIoGetMediaInfo (
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
if (This == NULL || MediaInfo == NULL) { if ((This == NULL) || (MediaInfo == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -276,9 +280,9 @@ AhciBlockIoGetMediaInfo (
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
MediaInfo->DeviceType = (EFI_PEI_BLOCK_DEVICE_TYPE) EDKII_PEI_BLOCK_DEVICE_TYPE_ATA_HARD_DISK; MediaInfo->DeviceType = (EFI_PEI_BLOCK_DEVICE_TYPE)EDKII_PEI_BLOCK_DEVICE_TYPE_ATA_HARD_DISK;
MediaInfo->MediaPresent = TRUE; MediaInfo->MediaPresent = TRUE;
MediaInfo->LastBlock = (UINTN) DeviceData->Media.LastBlock; MediaInfo->LastBlock = (UINTN)DeviceData->Media.LastBlock;
MediaInfo->BlockSize = DeviceData->Media.BlockSize; MediaInfo->BlockSize = DeviceData->Media.BlockSize;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -329,8 +333,8 @@ AhciBlockIoReadBlocks (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
if (This == NULL) { if (This == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -369,13 +373,13 @@ AhciBlockIoGetDeviceNo2 (
OUT UINTN *NumberBlockDevices OUT UINTN *NumberBlockDevices
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
if (This == NULL || NumberBlockDevices == NULL) { if ((This == NULL) || (NumberBlockDevices == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_BLKIO2 (This); Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_BLKIO2 (This);
*NumberBlockDevices = Private->ActiveDevices; *NumberBlockDevices = Private->ActiveDevices;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -431,10 +435,10 @@ AhciBlockIoGetMediaInfo2 (
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
if (This == NULL || MediaInfo == NULL) { if ((This == NULL) || (MediaInfo == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -498,7 +502,7 @@ AhciBlockIoReadBlocks2 (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
if (This == NULL) { if (This == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;

View File

@ -14,7 +14,7 @@
// //
// ATA hard disk device for EFI_PEI_BLOCK_DEVICE_TYPE // ATA hard disk device for EFI_PEI_BLOCK_DEVICE_TYPE
// //
#define EDKII_PEI_BLOCK_DEVICE_TYPE_ATA_HARD_DISK 8 #define EDKII_PEI_BLOCK_DEVICE_TYPE_ATA_HARD_DISK 8
/** /**
Gets the count of block I/O devices that one specific block driver detects. Gets the count of block I/O devices that one specific block driver detects.

View File

@ -25,20 +25,21 @@
**/ **/
PEI_AHCI_ATA_DEVICE_DATA * PEI_AHCI_ATA_DEVICE_DATA *
SearchDeviceByPort ( SearchDeviceByPort (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort IN UINT16 PortMultiplierPort
) )
{ {
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
LIST_ENTRY *Node; LIST_ENTRY *Node;
Node = GetFirstNode (&Private->DeviceList); Node = GetFirstNode (&Private->DeviceList);
while (!IsNull (&Private->DeviceList, Node)) { while (!IsNull (&Private->DeviceList, Node)) {
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node); DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
if ((DeviceData->Port == Port) && if ((DeviceData->Port == Port) &&
(DeviceData->PortMultiplier == PortMultiplierPort)) { (DeviceData->PortMultiplier == PortMultiplierPort))
{
return DeviceData; return DeviceData;
} }
@ -82,21 +83,21 @@ SearchDeviceByPort (
**/ **/
EFI_STATUS EFI_STATUS
AhciPassThruExecute ( AhciPassThruExecute (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
IN UINT8 FisIndex, IN UINT8 FisIndex,
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
switch (Packet->Protocol) { switch (Packet->Protocol) {
case EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA: case EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA:
Status = AhciNonDataTransfer ( Status = AhciNonDataTransfer (
Private, Private,
(UINT8) Port, (UINT8)Port,
(UINT8) PortMultiplierPort, (UINT8)PortMultiplierPort,
FisIndex, FisIndex,
Packet->Acb, Packet->Acb,
Packet->Asb, Packet->Asb,
@ -106,8 +107,8 @@ AhciPassThruExecute (
case EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN: case EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN:
Status = AhciPioTransfer ( Status = AhciPioTransfer (
Private, Private,
(UINT8) Port, (UINT8)Port,
(UINT8) PortMultiplierPort, (UINT8)PortMultiplierPort,
FisIndex, FisIndex,
TRUE, TRUE,
Packet->Acb, Packet->Acb,
@ -120,8 +121,8 @@ AhciPassThruExecute (
case EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT: case EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT:
Status = AhciPioTransfer ( Status = AhciPioTransfer (
Private, Private,
(UINT8) Port, (UINT8)Port,
(UINT8) PortMultiplierPort, (UINT8)PortMultiplierPort,
FisIndex, FisIndex,
FALSE, FALSE,
Packet->Acb, Packet->Acb,
@ -176,19 +177,19 @@ AhciPassThruExecute (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruPassThru ( AhciAtaPassThruPassThru (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
) )
{ {
UINT32 IoAlign; UINT32 IoAlign;
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
UINT32 MaxSectorCount; UINT32 MaxSectorCount;
UINT32 BlockSize; UINT32 BlockSize;
if (This == NULL || Packet == NULL) { if ((This == NULL) || (Packet == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -205,7 +206,7 @@ AhciAtaPassThruPassThru (
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_PASS_THRU (This); Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_PASS_THRU (This);
DeviceData = SearchDeviceByPort (Private, Port, PortMultiplierPort); DeviceData = SearchDeviceByPort (Private, Port, PortMultiplierPort);
if (DeviceData == NULL) { if (DeviceData == NULL) {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
@ -218,7 +219,8 @@ AhciAtaPassThruPassThru (
// Convert the transfer length from sector count to byte. // Convert the transfer length from sector count to byte.
// //
if (((Packet->Length & EFI_ATA_PASS_THRU_LENGTH_BYTES) == 0) && if (((Packet->Length & EFI_ATA_PASS_THRU_LENGTH_BYTES) == 0) &&
(Packet->InTransferLength != 0)) { (Packet->InTransferLength != 0))
{
Packet->InTransferLength = Packet->InTransferLength * BlockSize; Packet->InTransferLength = Packet->InTransferLength * BlockSize;
} }
@ -226,7 +228,8 @@ AhciAtaPassThruPassThru (
// Convert the transfer length from sector count to byte. // Convert the transfer length from sector count to byte.
// //
if (((Packet->Length & EFI_ATA_PASS_THRU_LENGTH_BYTES) == 0) && if (((Packet->Length & EFI_ATA_PASS_THRU_LENGTH_BYTES) == 0) &&
(Packet->OutTransferLength != 0)) { (Packet->OutTransferLength != 0))
{
Packet->OutTransferLength = Packet->OutTransferLength * BlockSize; Packet->OutTransferLength = Packet->OutTransferLength * BlockSize;
} }
@ -236,7 +239,8 @@ AhciAtaPassThruPassThru (
// command, then no data is transferred and EFI_BAD_BUFFER_SIZE is returned. // command, then no data is transferred and EFI_BAD_BUFFER_SIZE is returned.
// //
if (((Packet->InTransferLength != 0) && (Packet->InTransferLength > MaxSectorCount * BlockSize)) || if (((Packet->InTransferLength != 0) && (Packet->InTransferLength > MaxSectorCount * BlockSize)) ||
((Packet->OutTransferLength != 0) && (Packet->OutTransferLength > MaxSectorCount * BlockSize))) { ((Packet->OutTransferLength != 0) && (Packet->OutTransferLength > MaxSectorCount * BlockSize)))
{
return EFI_BAD_BUFFER_SIZE; return EFI_BAD_BUFFER_SIZE;
} }
@ -284,15 +288,15 @@ AhciAtaPassThruPassThru (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruGetNextPort ( AhciAtaPassThruGetNextPort (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
IN OUT UINT16 *Port IN OUT UINT16 *Port
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
LIST_ENTRY *Node; LIST_ENTRY *Node;
if (This == NULL || Port == NULL) { if ((This == NULL) || (Port == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -318,7 +322,7 @@ AhciAtaPassThruGetNextPort (
while (!IsNull (&Private->DeviceList, Node)) { while (!IsNull (&Private->DeviceList, Node)) {
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node); DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
if (DeviceData->Port > *Port){ if (DeviceData->Port > *Port) {
*Port = DeviceData->Port; *Port = DeviceData->Port;
goto Exit; goto Exit;
} }
@ -393,16 +397,16 @@ Exit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruGetNextDevice ( AhciAtaPassThruGetNextDevice (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
IN UINT16 Port, IN UINT16 Port,
IN OUT UINT16 *PortMultiplierPort IN OUT UINT16 *PortMultiplierPort
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
LIST_ENTRY *Node; LIST_ENTRY *Node;
if (This == NULL || PortMultiplierPort == NULL) { if ((This == NULL) || (PortMultiplierPort == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -425,7 +429,8 @@ AhciAtaPassThruGetNextDevice (
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node); DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
if ((DeviceData->Port == Port) && if ((DeviceData->Port == Port) &&
(DeviceData->PortMultiplier > *PortMultiplierPort)){ (DeviceData->PortMultiplier > *PortMultiplierPort))
{
*PortMultiplierPort = DeviceData->PortMultiplier; *PortMultiplierPort = DeviceData->PortMultiplier;
goto Exit; goto Exit;
} }
@ -444,7 +449,7 @@ AhciAtaPassThruGetNextDevice (
while (!IsNull (&Private->DeviceList, Node)) { while (!IsNull (&Private->DeviceList, Node)) {
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node); DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
if (DeviceData->Port == Port){ if (DeviceData->Port == Port) {
*PortMultiplierPort = DeviceData->PortMultiplier; *PortMultiplierPort = DeviceData->PortMultiplier;
goto Exit; goto Exit;
} }
@ -490,14 +495,14 @@ Exit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruGetDevicePath ( AhciAtaPassThruGetDevicePath (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
OUT UINTN *DevicePathLength, OUT UINTN *DevicePathLength,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) { if ((This == NULL) || (DevicePathLength == NULL) || (DevicePath == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }

View File

@ -49,10 +49,10 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruPassThru ( AhciAtaPassThruPassThru (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
); );
/** /**
@ -90,8 +90,8 @@ AhciAtaPassThruPassThru (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruGetNextPort ( AhciAtaPassThruGetNextPort (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
IN OUT UINT16 *Port IN OUT UINT16 *Port
); );
/** /**
@ -144,9 +144,9 @@ AhciAtaPassThruGetNextPort (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruGetNextDevice ( AhciAtaPassThruGetNextDevice (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
IN UINT16 Port, IN UINT16 Port,
IN OUT UINT16 *PortMultiplierPort IN OUT UINT16 *PortMultiplierPort
); );
/** /**
@ -169,9 +169,9 @@ AhciAtaPassThruGetNextDevice (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciAtaPassThruGetDevicePath ( AhciAtaPassThruGetDevicePath (
IN EDKII_PEI_ATA_PASS_THRU_PPI *This, IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
OUT UINTN *DevicePathLength, OUT UINTN *DevicePathLength,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
#endif #endif

View File

@ -28,19 +28,19 @@
**/ **/
UINT8 UINT8
AhciS3GetEumeratePorts ( AhciS3GetEumeratePorts (
IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath, IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath,
IN UINTN HcDevicePathLength, IN UINTN HcDevicePathLength,
OUT UINT32 *PortBitMap OUT UINT32 *PortBitMap
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT8 DummyData; UINT8 DummyData;
UINTN S3InitDevicesLength; UINTN S3InitDevicesLength;
EFI_DEVICE_PATH_PROTOCOL *S3InitDevices; EFI_DEVICE_PATH_PROTOCOL *S3InitDevices;
EFI_DEVICE_PATH_PROTOCOL *DevicePathInst; EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;
UINTN DevicePathInstLength; UINTN DevicePathInstLength;
BOOLEAN EntireEnd; BOOLEAN EntireEnd;
SATA_DEVICE_PATH *SataDeviceNode; SATA_DEVICE_PATH *SataDeviceNode;
*PortBitMap = 0; *PortBitMap = 0;
@ -51,7 +51,7 @@ AhciS3GetEumeratePorts (
S3InitDevices = NULL; S3InitDevices = NULL;
S3InitDevicesLength = sizeof (DummyData); S3InitDevicesLength = sizeof (DummyData);
EntireEnd = FALSE; EntireEnd = FALSE;
Status = RestoreLockBox (&gS3StorageDeviceInitListGuid, &DummyData, &S3InitDevicesLength); Status = RestoreLockBox (&gS3StorageDeviceInitListGuid, &DummyData, &S3InitDevicesLength);
if (Status != EFI_BUFFER_TOO_SMALL) { if (Status != EFI_BUFFER_TOO_SMALL) {
return 0; return 0;
} else { } else {
@ -87,7 +87,7 @@ AhciS3GetEumeratePorts (
} }
DevicePathInst = S3InitDevices; DevicePathInst = S3InitDevices;
S3InitDevices = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN) S3InitDevices + DevicePathInstLength); S3InitDevices = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)S3InitDevices + DevicePathInstLength);
if (HcDevicePathLength >= DevicePathInstLength) { if (HcDevicePathLength >= DevicePathInstLength) {
continue; continue;
@ -101,25 +101,30 @@ AhciS3GetEumeratePorts (
DevicePathInst, DevicePathInst,
HcDevicePath, HcDevicePath,
HcDevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL) HcDevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)
) == 0) { ) == 0)
{
// //
// Get the port number. // Get the port number.
// //
while (DevicePathInst->Type != END_DEVICE_PATH_TYPE) { while (DevicePathInst->Type != END_DEVICE_PATH_TYPE) {
if ((DevicePathInst->Type == MESSAGING_DEVICE_PATH) && if ((DevicePathInst->Type == MESSAGING_DEVICE_PATH) &&
(DevicePathInst->SubType == MSG_SATA_DP)) { (DevicePathInst->SubType == MSG_SATA_DP))
SataDeviceNode = (SATA_DEVICE_PATH *) DevicePathInst; {
SataDeviceNode = (SATA_DEVICE_PATH *)DevicePathInst;
// //
// For now, the driver only support upto AHCI_MAX_PORTS ports and // For now, the driver only support upto AHCI_MAX_PORTS ports and
// devices directly connected to a HBA. // devices directly connected to a HBA.
// //
if ((SataDeviceNode->HBAPortNumber >= AHCI_MAX_PORTS) || if ((SataDeviceNode->HBAPortNumber >= AHCI_MAX_PORTS) ||
(SataDeviceNode->PortMultiplierPortNumber != 0xFFFF)) { (SataDeviceNode->PortMultiplierPortNumber != 0xFFFF))
{
break; break;
} }
*PortBitMap |= (UINT32)BIT0 << SataDeviceNode->HBAPortNumber; *PortBitMap |= (UINT32)BIT0 << SataDeviceNode->HBAPortNumber;
break; break;
} }
DevicePathInst = NextDevicePathNode (DevicePathInst); DevicePathInst = NextDevicePathNode (DevicePathInst);
} }
} }

View File

@ -24,12 +24,12 @@
**/ **/
PEI_AHCI_ATA_DEVICE_DATA * PEI_AHCI_ATA_DEVICE_DATA *
SearchTrustComputingDeviceByIndex ( SearchTrustComputingDeviceByIndex (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINTN TrustComputingDeviceIndex IN UINTN TrustComputingDeviceIndex
) )
{ {
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
LIST_ENTRY *Node; LIST_ENTRY *Node;
Node = GetFirstNode (&Private->DeviceList); Node = GetFirstNode (&Private->DeviceList);
while (!IsNull (&Private->DeviceList, Node)) { while (!IsNull (&Private->DeviceList, Node)) {
@ -58,17 +58,17 @@ SearchTrustComputingDeviceByIndex (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStorageSecurityGetDeviceNo ( AhciStorageSecurityGetDeviceNo (
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This, IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
OUT UINTN *NumberofDevices OUT UINTN *NumberofDevices
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
if (This == NULL || NumberofDevices == NULL) { if ((This == NULL) || (NumberofDevices == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_STROAGE_SECURITY (This); Private = GET_AHCI_PEIM_HC_PRIVATE_DATA_FROM_THIS_STROAGE_SECURITY (This);
*NumberofDevices = Private->TrustComputingDevices; *NumberofDevices = Private->TrustComputingDevices;
return EFI_SUCCESS; return EFI_SUCCESS;
@ -102,17 +102,17 @@ AhciStorageSecurityGetDeviceNo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStorageSecurityGetDevicePath ( AhciStorageSecurityGetDevicePath (
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This, IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
OUT UINTN *DevicePathLength, OUT UINTN *DevicePathLength,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
EFI_STATUS Status; EFI_STATUS Status;
if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) { if ((This == NULL) || (DevicePathLength == NULL) || (DevicePath == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -229,18 +229,18 @@ AhciStorageSecurityGetDevicePath (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStorageSecurityReceiveData ( AhciStorageSecurityReceiveData (
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This, IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
OUT VOID *PayloadBuffer, OUT VOID *PayloadBuffer,
OUT UINTN *PayloadTransferSize OUT UINTN *PayloadTransferSize
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
if ((PayloadBuffer == NULL) || (PayloadTransferSize == NULL) || (PayloadBufferSize == 0)) { if ((PayloadBuffer == NULL) || (PayloadTransferSize == NULL) || (PayloadBufferSize == 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -349,8 +349,8 @@ AhciStorageSecuritySendData (
IN VOID *PayloadBuffer IN VOID *PayloadBuffer
) )
{ {
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private; PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
PEI_AHCI_ATA_DEVICE_DATA *DeviceData; PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) { if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;

View File

@ -24,8 +24,8 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStorageSecurityGetDeviceNo ( AhciStorageSecurityGetDeviceNo (
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This, IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
OUT UINTN *NumberofDevices OUT UINTN *NumberofDevices
); );
/** /**
@ -56,10 +56,10 @@ AhciStorageSecurityGetDeviceNo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStorageSecurityGetDevicePath ( AhciStorageSecurityGetDevicePath (
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This, IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
OUT UINTN *DevicePathLength, OUT UINTN *DevicePathLength,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
/** /**
@ -151,14 +151,14 @@ AhciStorageSecurityGetDevicePath (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStorageSecurityReceiveData ( AhciStorageSecurityReceiveData (
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This, IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
OUT VOID *PayloadBuffer, OUT VOID *PayloadBuffer,
OUT UINTN *PayloadTransferSize OUT UINTN *PayloadTransferSize
); );
/** /**

View File

@ -17,8 +17,8 @@ SATA_DEVICE_PATH mAhciSataDevicePathNodeTemplate = {
MESSAGING_DEVICE_PATH, MESSAGING_DEVICE_PATH,
MSG_SATA_DP, MSG_SATA_DP,
{ {
(UINT8) (sizeof (SATA_DEVICE_PATH)), (UINT8)(sizeof (SATA_DEVICE_PATH)),
(UINT8) ((sizeof (SATA_DEVICE_PATH)) >> 8) (UINT8)((sizeof (SATA_DEVICE_PATH)) >> 8)
} }
}, },
0x0, // HBAPortNumber 0x0, // HBAPortNumber
@ -33,8 +33,8 @@ EFI_DEVICE_PATH_PROTOCOL mAhciEndDevicePathNodeTemplate = {
END_DEVICE_PATH_TYPE, END_DEVICE_PATH_TYPE,
END_ENTIRE_DEVICE_PATH_SUBTYPE, END_ENTIRE_DEVICE_PATH_SUBTYPE,
{ {
(UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL)), (UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
(UINT8) ((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8) (UINT8)((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
} }
}; };
@ -79,7 +79,7 @@ NextDevicePathNode (
) )
{ {
ASSERT (Node != NULL); ASSERT (Node != NULL);
return (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)(Node) + DevicePathNodeLength(Node)); return (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)(Node) + DevicePathNodeLength (Node));
} }
/** /**
@ -97,14 +97,14 @@ NextDevicePathNode (
**/ **/
EFI_STATUS EFI_STATUS
GetDevicePathInstanceSize ( GetDevicePathInstanceSize (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT UINTN *InstanceSize, OUT UINTN *InstanceSize,
OUT BOOLEAN *EntireDevicePathEnd OUT BOOLEAN *EntireDevicePathEnd
) )
{ {
EFI_DEVICE_PATH_PROTOCOL *Walker; EFI_DEVICE_PATH_PROTOCOL *Walker;
if (DevicePath == NULL || InstanceSize == NULL || EntireDevicePathEnd == NULL) { if ((DevicePath == NULL) || (InstanceSize == NULL) || (EntireDevicePathEnd == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -130,7 +130,7 @@ GetDevicePathInstanceSize (
// //
// Compute the size of the device path instance // Compute the size of the device path instance
// //
*InstanceSize = ((UINTN) Walker - (UINTN) (DevicePath)) + sizeof (EFI_DEVICE_PATH_PROTOCOL); *InstanceSize = ((UINTN)Walker - (UINTN)(DevicePath)) + sizeof (EFI_DEVICE_PATH_PROTOCOL);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -148,12 +148,12 @@ GetDevicePathInstanceSize (
**/ **/
EFI_STATUS EFI_STATUS
AhciIsHcDevicePathValid ( AhciIsHcDevicePathValid (
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
IN UINTN DevicePathLength IN UINTN DevicePathLength
) )
{ {
EFI_DEVICE_PATH_PROTOCOL *Start; EFI_DEVICE_PATH_PROTOCOL *Start;
UINTN Size; UINTN Size;
if (DevicePath == NULL) { if (DevicePath == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -168,22 +168,24 @@ AhciIsHcDevicePathValid (
Start = DevicePath; Start = DevicePath;
while (!(DevicePath->Type == END_DEVICE_PATH_TYPE && while (!(DevicePath->Type == END_DEVICE_PATH_TYPE &&
DevicePath->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE)) { DevicePath->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE))
{
DevicePath = NextDevicePathNode (DevicePath); DevicePath = NextDevicePathNode (DevicePath);
// //
// Prevent overflow and invalid zero in the 'Length' field of a device path // Prevent overflow and invalid zero in the 'Length' field of a device path
// node. // node.
// //
if ((UINTN) DevicePath <= (UINTN) Start) { if ((UINTN)DevicePath <= (UINTN)Start) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
// //
// Prevent touching memory beyond given DevicePathLength. // Prevent touching memory beyond given DevicePathLength.
// //
if ((UINTN) DevicePath - (UINTN) Start > if ((UINTN)DevicePath - (UINTN)Start >
DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)) { DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
} }
@ -191,7 +193,7 @@ AhciIsHcDevicePathValid (
// //
// Check if the device path and its size match each other. // Check if the device path and its size match each other.
// //
Size = ((UINTN) DevicePath - (UINTN) Start) + sizeof (EFI_DEVICE_PATH_PROTOCOL); Size = ((UINTN)DevicePath - (UINTN)Start) + sizeof (EFI_DEVICE_PATH_PROTOCOL);
if (Size != DevicePathLength) { if (Size != DevicePathLength) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -217,17 +219,17 @@ AhciIsHcDevicePathValid (
**/ **/
EFI_STATUS EFI_STATUS
AhciBuildDevicePath ( AhciBuildDevicePath (
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private, IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
OUT UINTN *DevicePathLength, OUT UINTN *DevicePathLength,
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
) )
{ {
EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker; EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker;
SATA_DEVICE_PATH *SataDeviceNode; SATA_DEVICE_PATH *SataDeviceNode;
if (DevicePathLength == NULL || DevicePath == NULL) { if ((DevicePathLength == NULL) || (DevicePath == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -251,8 +253,8 @@ AhciBuildDevicePath (
// //
// Construct the SATA device node // Construct the SATA device node
// //
DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *) ((UINT8 *)DevicePathWalker + DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)DevicePathWalker +
(Private->DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL))); (Private->DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)));
CopyMem ( CopyMem (
DevicePathWalker, DevicePathWalker,
&mAhciSataDevicePathNodeTemplate, &mAhciSataDevicePathNodeTemplate,
@ -265,8 +267,8 @@ AhciBuildDevicePath (
// //
// Construct the end device node // Construct the end device node
// //
DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *) ((UINT8 *)DevicePathWalker + DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)DevicePathWalker +
sizeof (SATA_DEVICE_PATH)); sizeof (SATA_DEVICE_PATH));
CopyMem ( CopyMem (
DevicePathWalker, DevicePathWalker,
&mAhciEndDevicePathNodeTemplate, &mAhciEndDevicePathNodeTemplate,

View File

@ -20,15 +20,15 @@ GetIoMmu (
VOID VOID
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EDKII_IOMMU_PPI *IoMmu; EDKII_IOMMU_PPI *IoMmu;
IoMmu = NULL; IoMmu = NULL;
Status = PeiServicesLocatePpi ( Status = PeiServicesLocatePpi (
&gEdkiiIoMmuPpiGuid, &gEdkiiIoMmuPpiGuid,
0, 0,
NULL, NULL,
(VOID **) &IoMmu (VOID **)&IoMmu
); );
if (!EFI_ERROR (Status) && (IoMmu != NULL)) { if (!EFI_ERROR (Status) && (IoMmu != NULL)) {
return IoMmu; return IoMmu;
@ -58,48 +58,50 @@ GetIoMmu (
**/ **/
EFI_STATUS EFI_STATUS
IoMmuMap ( IoMmuMap (
IN EDKII_IOMMU_OPERATION Operation, IN EDKII_IOMMU_OPERATION Operation,
IN VOID *HostAddress, IN VOID *HostAddress,
IN OUT UINTN *NumberOfBytes, IN OUT UINTN *NumberOfBytes,
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress, OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
OUT VOID **Mapping OUT VOID **Mapping
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT64 Attribute; UINT64 Attribute;
EDKII_IOMMU_PPI *IoMmu; EDKII_IOMMU_PPI *IoMmu;
IoMmu = GetIoMmu (); IoMmu = GetIoMmu ();
if (IoMmu != NULL) { if (IoMmu != NULL) {
Status = IoMmu->Map ( Status = IoMmu->Map (
IoMmu, IoMmu,
Operation, Operation,
HostAddress, HostAddress,
NumberOfBytes, NumberOfBytes,
DeviceAddress, DeviceAddress,
Mapping Mapping
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
switch (Operation) { switch (Operation) {
case EdkiiIoMmuOperationBusMasterRead: case EdkiiIoMmuOperationBusMasterRead:
case EdkiiIoMmuOperationBusMasterRead64: case EdkiiIoMmuOperationBusMasterRead64:
Attribute = EDKII_IOMMU_ACCESS_READ; Attribute = EDKII_IOMMU_ACCESS_READ;
break; break;
case EdkiiIoMmuOperationBusMasterWrite: case EdkiiIoMmuOperationBusMasterWrite:
case EdkiiIoMmuOperationBusMasterWrite64: case EdkiiIoMmuOperationBusMasterWrite64:
Attribute = EDKII_IOMMU_ACCESS_WRITE; Attribute = EDKII_IOMMU_ACCESS_WRITE;
break; break;
case EdkiiIoMmuOperationBusMasterCommonBuffer: case EdkiiIoMmuOperationBusMasterCommonBuffer:
case EdkiiIoMmuOperationBusMasterCommonBuffer64: case EdkiiIoMmuOperationBusMasterCommonBuffer64:
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE; Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
break; break;
default: default:
ASSERT(FALSE); ASSERT (FALSE);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Status = IoMmu->SetAttribute ( Status = IoMmu->SetAttribute (
IoMmu, IoMmu,
*Mapping, *Mapping,
@ -110,9 +112,10 @@ IoMmuMap (
} }
} else { } else {
*DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress; *DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
*Mapping = NULL; *Mapping = NULL;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
return Status; return Status;
} }
@ -127,11 +130,11 @@ IoMmuMap (
**/ **/
EFI_STATUS EFI_STATUS
IoMmuUnmap ( IoMmuUnmap (
IN VOID *Mapping IN VOID *Mapping
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EDKII_IOMMU_PPI *IoMmu; EDKII_IOMMU_PPI *IoMmu;
IoMmu = GetIoMmu (); IoMmu = GetIoMmu ();
@ -141,6 +144,7 @@ IoMmuUnmap (
} else { } else {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
return Status; return Status;
} }
@ -175,7 +179,7 @@ IoMmuAllocateBuffer (
EFI_PHYSICAL_ADDRESS HostPhyAddress; EFI_PHYSICAL_ADDRESS HostPhyAddress;
EDKII_IOMMU_PPI *IoMmu; EDKII_IOMMU_PPI *IoMmu;
*HostAddress = NULL; *HostAddress = NULL;
*DeviceAddress = 0; *DeviceAddress = 0;
IoMmu = GetIoMmu (); IoMmu = GetIoMmu ();
@ -192,18 +196,19 @@ IoMmuAllocateBuffer (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
NumberOfBytes = EFI_PAGES_TO_SIZE(Pages); NumberOfBytes = EFI_PAGES_TO_SIZE (Pages);
Status = IoMmu->Map ( Status = IoMmu->Map (
IoMmu, IoMmu,
EdkiiIoMmuOperationBusMasterCommonBuffer, EdkiiIoMmuOperationBusMasterCommonBuffer,
*HostAddress, *HostAddress,
&NumberOfBytes, &NumberOfBytes,
DeviceAddress, DeviceAddress,
Mapping Mapping
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Status = IoMmu->SetAttribute ( Status = IoMmu->SetAttribute (
IoMmu, IoMmu,
*Mapping, *Mapping,
@ -221,10 +226,12 @@ IoMmuAllocateBuffer (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
*DeviceAddress = HostPhyAddress; *DeviceAddress = HostPhyAddress;
*Mapping = NULL; *Mapping = NULL;
} }
return Status; return Status;
} }
@ -242,13 +249,13 @@ IoMmuAllocateBuffer (
**/ **/
EFI_STATUS EFI_STATUS
IoMmuFreeBuffer ( IoMmuFreeBuffer (
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress, IN VOID *HostAddress,
IN VOID *Mapping IN VOID *Mapping
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EDKII_IOMMU_PPI *IoMmu; EDKII_IOMMU_PPI *IoMmu;
IoMmu = GetIoMmu (); IoMmu = GetIoMmu ();
@ -259,5 +266,6 @@ IoMmuFreeBuffer (
} else { } else {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
return Status; return Status;
} }

File diff suppressed because it is too large Load Diff

View File

@ -5,192 +5,193 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __ATA_HC_AHCI_MODE_H__ #ifndef __ATA_HC_AHCI_MODE_H__
#define __ATA_HC_AHCI_MODE_H__ #define __ATA_HC_AHCI_MODE_H__
#define EFI_AHCI_BAR_INDEX 0x05 #define EFI_AHCI_BAR_INDEX 0x05
#define EFI_AHCI_CAPABILITY_OFFSET 0x0000 #define EFI_AHCI_CAPABILITY_OFFSET 0x0000
#define EFI_AHCI_CAP_SAM BIT18 #define EFI_AHCI_CAP_SAM BIT18
#define EFI_AHCI_CAP_SSS BIT27 #define EFI_AHCI_CAP_SSS BIT27
#define EFI_AHCI_CAP_S64A BIT31 #define EFI_AHCI_CAP_S64A BIT31
#define EFI_AHCI_GHC_OFFSET 0x0004 #define EFI_AHCI_GHC_OFFSET 0x0004
#define EFI_AHCI_GHC_RESET BIT0 #define EFI_AHCI_GHC_RESET BIT0
#define EFI_AHCI_GHC_IE BIT1 #define EFI_AHCI_GHC_IE BIT1
#define EFI_AHCI_GHC_ENABLE BIT31 #define EFI_AHCI_GHC_ENABLE BIT31
#define EFI_AHCI_IS_OFFSET 0x0008 #define EFI_AHCI_IS_OFFSET 0x0008
#define EFI_AHCI_PI_OFFSET 0x000C #define EFI_AHCI_PI_OFFSET 0x000C
#define EFI_AHCI_MAX_PORTS 32 #define EFI_AHCI_MAX_PORTS 32
#define AHCI_CAPABILITY2_OFFSET 0x0024 #define AHCI_CAPABILITY2_OFFSET 0x0024
#define AHCI_CAP2_SDS BIT3 #define AHCI_CAP2_SDS BIT3
#define AHCI_CAP2_SADM BIT4 #define AHCI_CAP2_SADM BIT4
typedef struct { typedef struct {
UINT32 Lower32; UINT32 Lower32;
UINT32 Upper32; UINT32 Upper32;
} DATA_32; } DATA_32;
typedef union { typedef union {
DATA_32 Uint32; DATA_32 Uint32;
UINT64 Uint64; UINT64 Uint64;
} DATA_64; } DATA_64;
// //
// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms. // Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms.
// Add a bit of margin for robustness. // Add a bit of margin for robustness.
// //
#define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 15 #define EFI_AHCI_BUS_PHY_DETECT_TIMEOUT 15
// //
// Refer SATA1.0a spec, the FIS enable time should be less than 500ms. // Refer SATA1.0a spec, the FIS enable time should be less than 500ms.
// //
#define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500) #define EFI_AHCI_PORT_CMD_FR_CLEAR_TIMEOUT EFI_TIMER_PERIOD_MILLISECONDS(500)
// //
// Refer SATA1.0a spec, the bus reset time should be less than 1s. // Refer SATA1.0a spec, the bus reset time should be less than 1s.
// //
#define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1) #define EFI_AHCI_BUS_RESET_TIMEOUT EFI_TIMER_PERIOD_SECONDS(1)
#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000 #define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000
#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000 #define EFI_AHCI_ATA_DEVICE_SIG 0x00000000
#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000 #define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000
#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000 #define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000
// //
// Each PRDT entry can point to a memory block up to 4M byte // Each PRDT entry can point to a memory block up to 4M byte
// //
#define EFI_AHCI_MAX_DATA_PER_PRDT 0x400000 #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 0x27 // Register FIS - Host to Device
#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20 #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 0x34 // Register FIS - Device to Host
#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20 #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 0x39 // DMA Activate FIS - Device to Host
#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4 #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 0x41 // DMA Setup FIS - Bi-directional
#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28 #define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28
#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional #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 0x58 // BIST Activate FIS - Bi-directional
#define EFI_AHCI_FIS_BIST_LENGTH 12 #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 0x5F // PIO Setup FIS - Device to Host
#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20 #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 0xA1 // Set Device Bits FIS - Device to Host
#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8 #define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
#define EFI_AHCI_D2H_FIS_OFFSET 0x40 #define EFI_AHCI_D2H_FIS_OFFSET 0x40
#define EFI_AHCI_DMA_FIS_OFFSET 0x00 #define EFI_AHCI_DMA_FIS_OFFSET 0x00
#define EFI_AHCI_PIO_FIS_OFFSET 0x20 #define EFI_AHCI_PIO_FIS_OFFSET 0x20
#define EFI_AHCI_SDB_FIS_OFFSET 0x58 #define EFI_AHCI_SDB_FIS_OFFSET 0x58
#define EFI_AHCI_FIS_TYPE_MASK 0xFF #define EFI_AHCI_FIS_TYPE_MASK 0xFF
#define EFI_AHCI_U_FIS_OFFSET 0x60 #define EFI_AHCI_U_FIS_OFFSET 0x60
// //
// Port register // Port register
// //
#define EFI_AHCI_PORT_START 0x0100 #define EFI_AHCI_PORT_START 0x0100
#define EFI_AHCI_PORT_REG_WIDTH 0x0080 #define EFI_AHCI_PORT_REG_WIDTH 0x0080
#define EFI_AHCI_PORT_CLB 0x0000 #define EFI_AHCI_PORT_CLB 0x0000
#define EFI_AHCI_PORT_CLBU 0x0004 #define EFI_AHCI_PORT_CLBU 0x0004
#define EFI_AHCI_PORT_FB 0x0008 #define EFI_AHCI_PORT_FB 0x0008
#define EFI_AHCI_PORT_FBU 0x000C #define EFI_AHCI_PORT_FBU 0x000C
#define EFI_AHCI_PORT_IS 0x0010 #define EFI_AHCI_PORT_IS 0x0010
#define EFI_AHCI_PORT_IS_DHRS BIT0 #define EFI_AHCI_PORT_IS_DHRS BIT0
#define EFI_AHCI_PORT_IS_PSS BIT1 #define EFI_AHCI_PORT_IS_PSS BIT1
#define EFI_AHCI_PORT_IS_DSS BIT2 #define EFI_AHCI_PORT_IS_DSS BIT2
#define EFI_AHCI_PORT_IS_SDBS BIT3 #define EFI_AHCI_PORT_IS_SDBS BIT3
#define EFI_AHCI_PORT_IS_UFS BIT4 #define EFI_AHCI_PORT_IS_UFS BIT4
#define EFI_AHCI_PORT_IS_DPS BIT5 #define EFI_AHCI_PORT_IS_DPS BIT5
#define EFI_AHCI_PORT_IS_PCS BIT6 #define EFI_AHCI_PORT_IS_PCS BIT6
#define EFI_AHCI_PORT_IS_DIS BIT7 #define EFI_AHCI_PORT_IS_DIS BIT7
#define EFI_AHCI_PORT_IS_PRCS BIT22 #define EFI_AHCI_PORT_IS_PRCS BIT22
#define EFI_AHCI_PORT_IS_IPMS BIT23 #define EFI_AHCI_PORT_IS_IPMS BIT23
#define EFI_AHCI_PORT_IS_OFS BIT24 #define EFI_AHCI_PORT_IS_OFS BIT24
#define EFI_AHCI_PORT_IS_INFS BIT26 #define EFI_AHCI_PORT_IS_INFS BIT26
#define EFI_AHCI_PORT_IS_IFS BIT27 #define EFI_AHCI_PORT_IS_IFS BIT27
#define EFI_AHCI_PORT_IS_HBDS BIT28 #define EFI_AHCI_PORT_IS_HBDS BIT28
#define EFI_AHCI_PORT_IS_HBFS BIT29 #define EFI_AHCI_PORT_IS_HBFS BIT29
#define EFI_AHCI_PORT_IS_TFES BIT30 #define EFI_AHCI_PORT_IS_TFES BIT30
#define EFI_AHCI_PORT_IS_CPDS BIT31 #define EFI_AHCI_PORT_IS_CPDS BIT31
#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF #define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF
#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F #define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
#define EFI_AHCI_PORT_IS_ERROR_MASK (EFI_AHCI_PORT_IS_INFS | EFI_AHCI_PORT_IS_IFS | EFI_AHCI_PORT_IS_HBDS | EFI_AHCI_PORT_IS_HBFS | EFI_AHCI_PORT_IS_TFES) #define EFI_AHCI_PORT_IS_ERROR_MASK (EFI_AHCI_PORT_IS_INFS | EFI_AHCI_PORT_IS_IFS | EFI_AHCI_PORT_IS_HBDS | EFI_AHCI_PORT_IS_HBFS | EFI_AHCI_PORT_IS_TFES)
#define EFI_AHCI_PORT_IS_FATAL_ERROR_MASK (EFI_AHCI_PORT_IS_IFS | EFI_AHCI_PORT_IS_HBDS | EFI_AHCI_PORT_IS_HBFS | EFI_AHCI_PORT_IS_TFES) #define EFI_AHCI_PORT_IS_FATAL_ERROR_MASK (EFI_AHCI_PORT_IS_IFS | EFI_AHCI_PORT_IS_HBDS | EFI_AHCI_PORT_IS_HBFS | EFI_AHCI_PORT_IS_TFES)
#define EFI_AHCI_PORT_IE 0x0014 #define EFI_AHCI_PORT_IE 0x0014
#define EFI_AHCI_PORT_CMD 0x0018 #define EFI_AHCI_PORT_CMD 0x0018
#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE #define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE
#define EFI_AHCI_PORT_CMD_ST BIT0 #define EFI_AHCI_PORT_CMD_ST BIT0
#define EFI_AHCI_PORT_CMD_SUD BIT1 #define EFI_AHCI_PORT_CMD_SUD BIT1
#define EFI_AHCI_PORT_CMD_POD BIT2 #define EFI_AHCI_PORT_CMD_POD BIT2
#define EFI_AHCI_PORT_CMD_CLO BIT3 #define EFI_AHCI_PORT_CMD_CLO BIT3
#define EFI_AHCI_PORT_CMD_FRE BIT4 #define EFI_AHCI_PORT_CMD_FRE BIT4
#define EFI_AHCI_PORT_CMD_CCS_MASK (BIT8 | BIT9 | BIT10 | BIT11 | BIT12) #define EFI_AHCI_PORT_CMD_CCS_MASK (BIT8 | BIT9 | BIT10 | BIT11 | BIT12)
#define EFI_AHCI_PORT_CMD_CCS_SHIFT 8 #define EFI_AHCI_PORT_CMD_CCS_SHIFT 8
#define EFI_AHCI_PORT_CMD_FR BIT14 #define EFI_AHCI_PORT_CMD_FR BIT14
#define EFI_AHCI_PORT_CMD_CR BIT15 #define EFI_AHCI_PORT_CMD_CR BIT15
#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_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_PMA BIT17
#define EFI_AHCI_PORT_CMD_HPCP BIT18 #define EFI_AHCI_PORT_CMD_HPCP BIT18
#define EFI_AHCI_PORT_CMD_MPSP BIT19 #define EFI_AHCI_PORT_CMD_MPSP BIT19
#define EFI_AHCI_PORT_CMD_CPD BIT20 #define EFI_AHCI_PORT_CMD_CPD BIT20
#define EFI_AHCI_PORT_CMD_ESP BIT21 #define EFI_AHCI_PORT_CMD_ESP BIT21
#define EFI_AHCI_PORT_CMD_ATAPI BIT24 #define EFI_AHCI_PORT_CMD_ATAPI BIT24
#define EFI_AHCI_PORT_CMD_DLAE BIT25 #define EFI_AHCI_PORT_CMD_DLAE BIT25
#define EFI_AHCI_PORT_CMD_ALPE BIT26 #define EFI_AHCI_PORT_CMD_ALPE BIT26
#define EFI_AHCI_PORT_CMD_ASP BIT27 #define EFI_AHCI_PORT_CMD_ASP BIT27
#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31) #define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 ) #define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 )
#define EFI_AHCI_PORT_TFD 0x0020 #define EFI_AHCI_PORT_TFD 0x0020
#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0) #define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
#define EFI_AHCI_PORT_TFD_BSY BIT7 #define EFI_AHCI_PORT_TFD_BSY BIT7
#define EFI_AHCI_PORT_TFD_DRQ BIT3 #define EFI_AHCI_PORT_TFD_DRQ BIT3
#define EFI_AHCI_PORT_TFD_ERR BIT0 #define EFI_AHCI_PORT_TFD_ERR BIT0
#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00 #define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00
#define EFI_AHCI_PORT_SIG 0x0024 #define EFI_AHCI_PORT_SIG 0x0024
#define EFI_AHCI_PORT_SSTS 0x0028 #define EFI_AHCI_PORT_SSTS 0x0028
#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F #define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F
#define EFI_AHCI_PORT_SSTS_DET 0x0001 #define EFI_AHCI_PORT_SSTS_DET 0x0001
#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003 #define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003
#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0 #define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0
#define EFI_AHCI_PORT_SCTL 0x002C #define EFI_AHCI_PORT_SCTL 0x002C
#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F #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_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK)
#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001 #define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001
#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003 #define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003
#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0 #define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0
#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00 #define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00
#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300 #define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300
#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100 #define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100
#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200 #define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200
#define EFI_AHCI_PORT_SERR 0x0030 #define EFI_AHCI_PORT_SERR 0x0030
#define EFI_AHCI_PORT_SERR_RDIE BIT0 #define EFI_AHCI_PORT_SERR_RDIE BIT0
#define EFI_AHCI_PORT_SERR_RCE BIT1 #define EFI_AHCI_PORT_SERR_RCE BIT1
#define EFI_AHCI_PORT_SERR_TDIE BIT8 #define EFI_AHCI_PORT_SERR_TDIE BIT8
#define EFI_AHCI_PORT_SERR_PCDIE BIT9 #define EFI_AHCI_PORT_SERR_PCDIE BIT9
#define EFI_AHCI_PORT_SERR_PE BIT10 #define EFI_AHCI_PORT_SERR_PE BIT10
#define EFI_AHCI_PORT_SERR_IE BIT11 #define EFI_AHCI_PORT_SERR_IE BIT11
#define EFI_AHCI_PORT_SERR_PRC BIT16 #define EFI_AHCI_PORT_SERR_PRC BIT16
#define EFI_AHCI_PORT_SERR_PIE BIT17 #define EFI_AHCI_PORT_SERR_PIE BIT17
#define EFI_AHCI_PORT_SERR_CW BIT18 #define EFI_AHCI_PORT_SERR_CW BIT18
#define EFI_AHCI_PORT_SERR_BDE BIT19 #define EFI_AHCI_PORT_SERR_BDE BIT19
#define EFI_AHCI_PORT_SERR_DE BIT20 #define EFI_AHCI_PORT_SERR_DE BIT20
#define EFI_AHCI_PORT_SERR_CRCE BIT21 #define EFI_AHCI_PORT_SERR_CRCE BIT21
#define EFI_AHCI_PORT_SERR_HE BIT22 #define EFI_AHCI_PORT_SERR_HE BIT22
#define EFI_AHCI_PORT_SERR_LSE BIT23 #define EFI_AHCI_PORT_SERR_LSE BIT23
#define EFI_AHCI_PORT_SERR_TSTE BIT24 #define EFI_AHCI_PORT_SERR_TSTE BIT24
#define EFI_AHCI_PORT_SERR_UFT BIT25 #define EFI_AHCI_PORT_SERR_UFT BIT25
#define EFI_AHCI_PORT_SERR_EX BIT26 #define EFI_AHCI_PORT_SERR_EX BIT26
#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF #define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF
#define EFI_AHCI_PORT_SACT 0x0034 #define EFI_AHCI_PORT_SACT 0x0034
#define EFI_AHCI_PORT_CI 0x0038 #define EFI_AHCI_PORT_CI 0x0038
#define EFI_AHCI_PORT_SNTF 0x003C #define EFI_AHCI_PORT_SNTF 0x003C
#define AHCI_PORT_DEVSLP 0x0044 #define AHCI_PORT_DEVSLP 0x0044
#define AHCI_PORT_DEVSLP_ADSE BIT0 #define AHCI_PORT_DEVSLP_ADSE BIT0
#define AHCI_PORT_DEVSLP_DSP BIT1 #define AHCI_PORT_DEVSLP_DSP BIT1
#define AHCI_PORT_DEVSLP_DETO_MASK 0x000003FC #define AHCI_PORT_DEVSLP_DETO_MASK 0x000003FC
#define AHCI_PORT_DEVSLP_MDAT_MASK 0x00007C00 #define AHCI_PORT_DEVSLP_MDAT_MASK 0x00007C00
#define AHCI_PORT_DEVSLP_DITO_MASK 0x01FF8000 #define AHCI_PORT_DEVSLP_DITO_MASK 0x01FF8000
#define AHCI_PORT_DEVSLP_DM_MASK 0x1E000000 #define AHCI_PORT_DEVSLP_DM_MASK 0x1E000000
#define AHCI_COMMAND_RETRIES 5 #define AHCI_COMMAND_RETRIES 5
@ -200,20 +201,20 @@ typedef union {
// The entry data structure is listed at the following. // The entry data structure is listed at the following.
// //
typedef struct { typedef struct {
UINT32 AhciCmdCfl:5; //Command FIS Length UINT32 AhciCmdCfl : 5; // Command FIS Length
UINT32 AhciCmdA:1; //ATAPI UINT32 AhciCmdA : 1; // ATAPI
UINT32 AhciCmdW:1; //Write UINT32 AhciCmdW : 1; // Write
UINT32 AhciCmdP:1; //Prefetchable UINT32 AhciCmdP : 1; // Prefetchable
UINT32 AhciCmdR:1; //Reset UINT32 AhciCmdR : 1; // Reset
UINT32 AhciCmdB:1; //BIST UINT32 AhciCmdB : 1; // BIST
UINT32 AhciCmdC:1; //Clear Busy upon R_OK UINT32 AhciCmdC : 1; // Clear Busy upon R_OK
UINT32 AhciCmdRsvd:1; UINT32 AhciCmdRsvd : 1;
UINT32 AhciCmdPmp:4; //Port Multiplier Port UINT32 AhciCmdPmp : 4; // Port Multiplier Port
UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length UINT32 AhciCmdPrdtl : 16; // Physical Region Descriptor Table Length
UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count UINT32 AhciCmdPrdbc; // Physical Region Descriptor Byte Count
UINT32 AhciCmdCtba; //Command Table Descriptor Base Address UINT32 AhciCmdCtba; // Command Table Descriptor Base Address
UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs UINT32 AhciCmdCtbau; // Command Table Descriptor Base Address Upper 32-BITs
UINT32 AhciCmdRsvd1[4]; UINT32 AhciCmdRsvd1[4];
} EFI_AHCI_COMMAND_LIST; } EFI_AHCI_COMMAND_LIST;
// //
@ -223,11 +224,11 @@ typedef struct {
// //
typedef struct { typedef struct {
UINT8 AhciCFisType; UINT8 AhciCFisType;
UINT8 AhciCFisPmNum:4; UINT8 AhciCFisPmNum : 4;
UINT8 AhciCFisRsvd:1; UINT8 AhciCFisRsvd : 1;
UINT8 AhciCFisRsvd1:1; UINT8 AhciCFisRsvd1 : 1;
UINT8 AhciCFisRsvd2:1; UINT8 AhciCFisRsvd2 : 1;
UINT8 AhciCFisCmdInd:1; UINT8 AhciCFisCmdInd : 1;
UINT8 AhciCFisCmd; UINT8 AhciCFisCmd;
UINT8 AhciCFisFeature; UINT8 AhciCFisFeature;
UINT8 AhciCFisSecNum; UINT8 AhciCFisSecNum;
@ -266,12 +267,12 @@ typedef struct {
// list entry for this command slot. // list entry for this command slot.
// //
typedef struct { typedef struct {
UINT32 AhciPrdtDba; //Data Base Address UINT32 AhciPrdtDba; // Data Base Address
UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs UINT32 AhciPrdtDbau; // Data Base Address Upper 32-BITs
UINT32 AhciPrdtRsvd; UINT32 AhciPrdtRsvd;
UINT32 AhciPrdtDbc:22; //Data Byte Count UINT32 AhciPrdtDbc : 22; // Data Byte Count
UINT32 AhciPrdtRsvd1:9; UINT32 AhciPrdtRsvd1 : 9;
UINT32 AhciPrdtIoc:1; //Interrupt on Completion UINT32 AhciPrdtIoc : 1; // Interrupt on Completion
} EFI_AHCI_COMMAND_PRDT; } EFI_AHCI_COMMAND_PRDT;
// //
@ -288,24 +289,24 @@ typedef struct {
// Received FIS structure // Received FIS structure
// //
typedef struct { typedef struct {
UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00 UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00
UINT8 AhciDmaSetupFisRsvd[0x04]; UINT8 AhciDmaSetupFisRsvd[0x04];
UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20 UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20
UINT8 AhciPioSetupFisRsvd[0x0C]; UINT8 AhciPioSetupFisRsvd[0x0C];
UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40 UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40
UINT8 AhciD2HRegisterFisRsvd[0x04]; UINT8 AhciD2HRegisterFisRsvd[0x04];
UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58 UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58
UINT8 AhciUnknownFis[0x40]; // Unknown Fis: offset 0x60 UINT8 AhciUnknownFis[0x40]; // Unknown Fis: offset 0x60
UINT8 AhciUnknownFisRsvd[0x60]; UINT8 AhciUnknownFisRsvd[0x60];
} EFI_AHCI_RECEIVED_FIS; } EFI_AHCI_RECEIVED_FIS;
typedef struct { typedef struct {
UINT8 Madt : 5; UINT8 Madt : 5;
UINT8 Reserved_5 : 3; UINT8 Reserved_5 : 3;
UINT8 Deto; UINT8 Deto;
UINT16 Reserved_16; UINT16 Reserved_16;
UINT32 Reserved_32 : 31; UINT32 Reserved_32 : 31;
UINT32 Supported : 1; UINT32 Supported : 1;
} DEVSLP_TIMING_VARIABLES; } DEVSLP_TIMING_VARIABLES;
#pragma pack() #pragma pack()
@ -343,11 +344,11 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciPacketCommandExecute ( AhciPacketCommandExecute (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_AHCI_REGISTERS *AhciRegisters, IN EFI_AHCI_REGISTERS *AhciRegisters,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 PortMultiplier, IN UINT8 PortMultiplier,
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
); );
/** /**
@ -366,10 +367,10 @@ AhciPacketCommandExecute (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStartCommand ( AhciStartCommand (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 CommandSlot, IN UINT8 CommandSlot,
IN UINT64 Timeout IN UINT64 Timeout
); );
/** /**
@ -387,10 +388,9 @@ AhciStartCommand (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciStopCommand ( AhciStopCommand (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN UINT8 Port, IN UINT8 Port,
IN UINT64 Timeout IN UINT64 Timeout
); );
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __ATA_ATAPI_PASS_THRU_H__ #ifndef __ATA_ATAPI_PASS_THRU_H__
#define __ATA_ATAPI_PASS_THRU_H__ #define __ATA_ATAPI_PASS_THRU_H__
@ -36,14 +37,14 @@
#include "IdeMode.h" #include "IdeMode.h"
#include "AhciMode.h" #include "AhciMode.h"
extern EFI_DRIVER_BINDING_PROTOCOL gAtaAtapiPassThruDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gAtaAtapiPassThruDriverBinding;
extern EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2;
extern EDKII_ATA_ATAPI_POLICY_PROTOCOL *mAtaAtapiPolicy; extern EDKII_ATA_ATAPI_POLICY_PROTOCOL *mAtaAtapiPolicy;
#define ATA_ATAPI_PASS_THRU_SIGNATURE SIGNATURE_32 ('a', 'a', 'p', 't') #define ATA_ATAPI_PASS_THRU_SIGNATURE SIGNATURE_32 ('a', 'a', 'p', 't')
#define ATA_ATAPI_DEVICE_SIGNATURE SIGNATURE_32 ('a', 'd', 'e', 'v') #define ATA_ATAPI_DEVICE_SIGNATURE SIGNATURE_32 ('a', 'd', 'e', 'v')
#define ATA_NONBLOCKING_TASK_SIGNATURE SIGNATURE_32 ('a', 't', 's', 'k') #define ATA_NONBLOCKING_TASK_SIGNATURE SIGNATURE_32 ('a', 't', 's', 'k')
typedef struct _ATA_NONBLOCK_TASK ATA_NONBLOCK_TASK; typedef struct _ATA_NONBLOCK_TASK ATA_NONBLOCK_TASK;
@ -66,88 +67,88 @@ typedef enum {
// Ahci mode device info // Ahci mode device info
// //
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;
UINT16 Port; UINT16 Port;
UINT16 PortMultiplier; UINT16 PortMultiplier;
EFI_ATA_DEVICE_TYPE Type; EFI_ATA_DEVICE_TYPE Type;
EFI_IDENTIFY_DATA *IdentifyData; EFI_IDENTIFY_DATA *IdentifyData;
} EFI_ATA_DEVICE_INFO; } EFI_ATA_DEVICE_INFO;
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
EFI_HANDLE ControllerHandle; EFI_HANDLE ControllerHandle;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeControllerInit; EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeControllerInit;
EFI_ATA_PASS_THRU_MODE AtaPassThruMode; EFI_ATA_PASS_THRU_MODE AtaPassThruMode;
EFI_ATA_PASS_THRU_PROTOCOL AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL AtaPassThru;
EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode; EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL ExtScsiPassThru; EFI_EXT_SCSI_PASS_THRU_PROTOCOL ExtScsiPassThru;
EFI_ATA_HC_WORK_MODE Mode; EFI_ATA_HC_WORK_MODE Mode;
EFI_IDE_REGISTERS IdeRegisters[EfiIdeMaxChannel]; EFI_IDE_REGISTERS IdeRegisters[EfiIdeMaxChannel];
EFI_AHCI_REGISTERS AhciRegisters; EFI_AHCI_REGISTERS AhciRegisters;
// //
// The attached device list // The attached device list
// //
LIST_ENTRY DeviceList; LIST_ENTRY DeviceList;
UINT64 EnabledPciAttributes; UINT64 EnabledPciAttributes;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
// //
// For AtaPassThru protocol, using the following bytes to record the previous call in // For AtaPassThru protocol, using the following bytes to record the previous call in
// GetNextPort()/GetNextDevice(). // GetNextPort()/GetNextDevice().
// //
UINT16 PreviousPort; UINT16 PreviousPort;
UINT16 PreviousPortMultiplier; UINT16 PreviousPortMultiplier;
// //
// For ExtScsiPassThru protocol, using the following bytes to record the previous call in // For ExtScsiPassThru protocol, using the following bytes to record the previous call in
// GetNextTarget()/GetNextTargetLun(). // GetNextTarget()/GetNextTargetLun().
// //
UINT16 PreviousTargetId; UINT16 PreviousTargetId;
UINT64 PreviousLun; UINT64 PreviousLun;
// //
// For Non-blocking. // For Non-blocking.
// //
EFI_EVENT TimerEvent; EFI_EVENT TimerEvent;
LIST_ENTRY NonBlockingTaskList; LIST_ENTRY NonBlockingTaskList;
} ATA_ATAPI_PASS_THRU_INSTANCE; } ATA_ATAPI_PASS_THRU_INSTANCE;
// //
// Task for Non-blocking mode. // Task for Non-blocking mode.
// //
struct _ATA_NONBLOCK_TASK { struct _ATA_NONBLOCK_TASK {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;
UINT16 Port; UINT16 Port;
UINT16 PortMultiplier; UINT16 PortMultiplier;
EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet; EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet;
BOOLEAN IsStart; BOOLEAN IsStart;
EFI_EVENT Event; EFI_EVENT Event;
UINT64 RetryTimes; UINT64 RetryTimes;
BOOLEAN InfiniteWait; BOOLEAN InfiniteWait;
VOID *Map; // Pointer to map. VOID *Map; // Pointer to map.
VOID *TableMap; // Pointer to PRD table map. VOID *TableMap; // Pointer to PRD table map.
EFI_ATA_DMA_PRD *MapBaseAddress; // Pointer to range Base address for Map. EFI_ATA_DMA_PRD *MapBaseAddress; // Pointer to range Base address for Map.
UINTN PageCount; // The page numbers used by PCIO freebuffer. UINTN PageCount; // The page numbers used by PCIO freebuffer.
}; };
// //
// Timeout value which uses 100ns as a unit. // Timeout value which uses 100ns as a unit.
// It means 3 second span. // It means 3 second span.
// //
#define ATA_ATAPI_TIMEOUT EFI_TIMER_PERIOD_SECONDS(3) #define ATA_ATAPI_TIMEOUT EFI_TIMER_PERIOD_SECONDS(3)
#define ATA_SPINUP_TIMEOUT EFI_TIMER_PERIOD_SECONDS(10) #define ATA_SPINUP_TIMEOUT EFI_TIMER_PERIOD_SECONDS(10)
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0) #define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
#define ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS(a) \ #define ATA_PASS_THRU_PRIVATE_DATA_FROM_THIS(a) \
CR (a, \ CR (a, \
@ -295,11 +296,11 @@ AtaAtapiPassThruComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaAtapiPassThruComponentNameGetControllerName ( AtaAtapiPassThruComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
/** /**
@ -347,9 +348,9 @@ AtaAtapiPassThruComponentNameGetControllerName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaAtapiPassThruSupported ( AtaAtapiPassThruSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -390,9 +391,9 @@ AtaAtapiPassThruSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaAtapiPassThruStart ( AtaAtapiPassThruStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -424,10 +425,10 @@ AtaAtapiPassThruStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaAtapiPassThruStop ( AtaAtapiPassThruStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
/** /**
@ -446,9 +447,9 @@ LIST_ENTRY *
EFIAPI EFIAPI
SearchDeviceInfoList ( SearchDeviceInfoList (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance, IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplier, IN UINT16 PortMultiplier,
IN EFI_ATA_DEVICE_TYPE DeviceType IN EFI_ATA_DEVICE_TYPE DeviceType
); );
/** /**
@ -470,10 +471,10 @@ EFI_STATUS
EFIAPI EFIAPI
CreateNewDeviceInfo ( CreateNewDeviceInfo (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance, IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplier, IN UINT16 PortMultiplier,
IN EFI_ATA_DEVICE_TYPE DeviceType, IN EFI_ATA_DEVICE_TYPE DeviceType,
IN EFI_IDENTIFY_DATA *IdentifyData IN EFI_IDENTIFY_DATA *IdentifyData
); );
/** /**
@ -499,7 +500,7 @@ DestroyDeviceInfoList (
VOID VOID
EFIAPI EFIAPI
DestroyAsynTaskList ( DestroyAsynTaskList (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance, IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
IN BOOLEAN IsSigEvent IN BOOLEAN IsSigEvent
); );
@ -517,7 +518,7 @@ DestroyAsynTaskList (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EnumerateAttachedDevice ( EnumerateAttachedDevice (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
); );
/** /**
@ -532,7 +533,7 @@ VOID
EFIAPI EFIAPI
AsyncNonBlockingTransferRoutine ( AsyncNonBlockingTransferRoutine (
EFI_EVENT Event, EFI_EVENT Event,
VOID* Context VOID *Context
); );
/** /**
@ -567,11 +568,11 @@ AsyncNonBlockingTransferRoutine (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruPassThru ( AtaPassThruPassThru (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet, IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet,
IN EFI_EVENT Event OPTIONAL IN EFI_EVENT Event OPTIONAL
); );
/** /**
@ -608,8 +609,8 @@ AtaPassThruPassThru (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruGetNextPort ( AtaPassThruGetNextPort (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN OUT UINT16 *Port IN OUT UINT16 *Port
); );
/** /**
@ -657,9 +658,9 @@ AtaPassThruGetNextPort (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruGetNextDevice ( AtaPassThruGetNextDevice (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN UINT16 Port, IN UINT16 Port,
IN OUT UINT16 *PortMultiplierPort IN OUT UINT16 *PortMultiplierPort
); );
/** /**
@ -697,10 +698,10 @@ AtaPassThruGetNextDevice (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruBuildDevicePath ( AtaPassThruBuildDevicePath (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort, IN UINT16 PortMultiplierPort,
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
/** /**
@ -743,10 +744,10 @@ AtaPassThruBuildDevicePath (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruGetDevice ( AtaPassThruGetDevice (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT UINT16 *Port, OUT UINT16 *Port,
OUT UINT16 *PortMultiplierPort OUT UINT16 *PortMultiplierPort
); );
/** /**
@ -776,8 +777,8 @@ AtaPassThruGetDevice (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruResetPort ( AtaPassThruResetPort (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN UINT16 Port IN UINT16 Port
); );
/** /**
@ -814,9 +815,9 @@ AtaPassThruResetPort (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPassThruResetDevice ( AtaPassThruResetDevice (
IN EFI_ATA_PASS_THRU_PROTOCOL *This, IN EFI_ATA_PASS_THRU_PROTOCOL *This,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort IN UINT16 PortMultiplierPort
); );
/** /**
@ -863,11 +864,11 @@ AtaPassThruResetDevice (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruPassThru ( ExtScsiPassThruPassThru (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN UINT8 *Target, IN UINT8 *Target,
IN UINT64 Lun, IN UINT64 Lun,
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet, IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
IN EFI_EVENT Event OPTIONAL IN EFI_EVENT Event OPTIONAL
); );
/** /**
@ -899,9 +900,9 @@ ExtScsiPassThruPassThru (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruGetNextTargetLun ( ExtScsiPassThruGetNextTargetLun (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN OUT UINT8 **Target, IN OUT UINT8 **Target,
IN OUT UINT64 *Lun IN OUT UINT64 *Lun
); );
/** /**
@ -934,10 +935,10 @@ ExtScsiPassThruGetNextTargetLun (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruBuildDevicePath ( ExtScsiPassThruBuildDevicePath (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN UINT8 *Target, IN UINT8 *Target,
IN UINT64 Lun, IN UINT64 Lun,
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
/** /**
@ -962,10 +963,10 @@ ExtScsiPassThruBuildDevicePath (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruGetTargetLun ( ExtScsiPassThruGetTargetLun (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT UINT8 **Target, OUT UINT8 **Target,
OUT UINT64 *Lun OUT UINT64 *Lun
); );
/** /**
@ -982,7 +983,7 @@ ExtScsiPassThruGetTargetLun (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruResetChannel ( ExtScsiPassThruResetChannel (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
); );
/** /**
@ -1007,9 +1008,9 @@ ExtScsiPassThruResetChannel (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruResetTargetLun ( ExtScsiPassThruResetTargetLun (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN UINT8 *Target, IN UINT8 *Target,
IN UINT64 Lun IN UINT64 Lun
); );
/** /**
@ -1037,8 +1038,8 @@ ExtScsiPassThruResetTargetLun (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
ExtScsiPassThruGetNextTarget ( ExtScsiPassThruGetNextTarget (
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This, IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
IN OUT UINT8 **Target IN OUT UINT8 **Target
); );
/** /**
@ -1052,7 +1053,7 @@ ExtScsiPassThruGetNextTarget (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IdeModeInitialization ( IdeModeInitialization (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
); );
/** /**
@ -1066,7 +1067,7 @@ IdeModeInitialization (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciModeInitialization ( AhciModeInitialization (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
); );
/** /**
@ -1094,16 +1095,16 @@ AhciModeInitialization (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciNonDataTransfer ( AhciNonDataTransfer (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_AHCI_REGISTERS *AhciRegisters, IN EFI_AHCI_REGISTERS *AhciRegisters,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 PortMultiplier, IN UINT8 PortMultiplier,
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL, IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
IN UINT8 AtapiCommandLength, IN UINT8 AtapiCommandLength,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN UINT64 Timeout, IN UINT64 Timeout,
IN ATA_NONBLOCK_TASK *Task IN ATA_NONBLOCK_TASK *Task
); );
/** /**
@ -1134,19 +1135,19 @@ AhciNonDataTransfer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciDmaTransfer ( AhciDmaTransfer (
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance, IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
IN EFI_AHCI_REGISTERS *AhciRegisters, IN EFI_AHCI_REGISTERS *AhciRegisters,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 PortMultiplier, IN UINT8 PortMultiplier,
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL, IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
IN UINT8 AtapiCommandLength, IN UINT8 AtapiCommandLength,
IN BOOLEAN Read, IN BOOLEAN Read,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN OUT VOID *MemoryAddr, IN OUT VOID *MemoryAddr,
IN UINT32 DataCount, IN UINT32 DataCount,
IN UINT64 Timeout, IN UINT64 Timeout,
IN ATA_NONBLOCK_TASK *Task IN ATA_NONBLOCK_TASK *Task
); );
/** /**
@ -1177,19 +1178,19 @@ AhciDmaTransfer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AhciPioTransfer ( AhciPioTransfer (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_AHCI_REGISTERS *AhciRegisters, IN EFI_AHCI_REGISTERS *AhciRegisters,
IN UINT8 Port, IN UINT8 Port,
IN UINT8 PortMultiplier, IN UINT8 PortMultiplier,
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL, IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
IN UINT8 AtapiCommandLength, IN UINT8 AtapiCommandLength,
IN BOOLEAN Read, IN BOOLEAN Read,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN OUT VOID *MemoryAddr, IN OUT VOID *MemoryAddr,
IN UINT32 DataCount, IN UINT32 DataCount,
IN UINT64 Timeout, IN UINT64 Timeout,
IN ATA_NONBLOCK_TASK *Task IN ATA_NONBLOCK_TASK *Task
); );
/** /**
@ -1213,12 +1214,12 @@ AhciPioTransfer (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaNonDataCommandIn ( AtaNonDataCommandIn (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_IDE_REGISTERS *IdeRegisters, IN EFI_IDE_REGISTERS *IdeRegisters,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN UINT64 Timeout, IN UINT64 Timeout,
IN ATA_NONBLOCK_TASK *Task IN ATA_NONBLOCK_TASK *Task
); );
/** /**
@ -1284,16 +1285,15 @@ AtaUdmaInOut (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPioDataInOut ( AtaPioDataInOut (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_IDE_REGISTERS *IdeRegisters, IN EFI_IDE_REGISTERS *IdeRegisters,
IN OUT VOID *Buffer, IN OUT VOID *Buffer,
IN UINT64 ByteCount, IN UINT64 ByteCount,
IN BOOLEAN Read, IN BOOLEAN Read,
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock, IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock, IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
IN UINT64 Timeout, IN UINT64 Timeout,
IN ATA_NONBLOCK_TASK *Task IN ATA_NONBLOCK_TASK *Task
); );
#endif #endif

View File

@ -11,22 +11,22 @@
// //
// Driver name table // Driver name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruDriverNameTable[] = {
{ "eng;en", L"AtaAtapiPassThru Driver" }, { "eng;en", L"AtaAtapiPassThru Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
// Controller name table // Controller name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruIdeControllerNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruIdeControllerNameTable[] = {
{ "eng;en", L"IDE Controller" }, { "eng;en", L"IDE Controller" },
{ NULL , NULL } { NULL, NULL }
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruAhciControllerNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaAtapiPassThruAhciControllerNameTable[] = {
{ "eng;en", L"AHCI Controller" }, { "eng;en", L"AHCI Controller" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
@ -41,9 +41,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComp
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) AtaAtapiPassThruComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)AtaAtapiPassThruComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) AtaAtapiPassThruComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)AtaAtapiPassThruComponentNameGetControllerName,
"en" "en"
}; };
@ -103,7 +103,6 @@ AtaAtapiPassThruComponentNameGetDriverName (
); );
} }
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -175,11 +174,11 @@ AtaAtapiPassThruComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaAtapiPassThruComponentNameGetControllerName ( AtaAtapiPassThruComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -187,7 +186,7 @@ AtaAtapiPassThruComponentNameGetControllerName (
VOID *Interface; VOID *Interface;
ATA_ATAPI_PASS_THRU_INSTANCE *Instance; ATA_ATAPI_PASS_THRU_INSTANCE *Instance;
if (Language == NULL || ControllerName == NULL) { if ((Language == NULL) || (ControllerName == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }

File diff suppressed because it is too large Load Diff

View File

@ -5,6 +5,7 @@
SPDX-License-Identifier: BSD-2-Clause-Patent SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#ifndef __ATA_HC_IDE_MODE_H__ #ifndef __ATA_HC_IDE_MODE_H__
#define __ATA_HC_IDE_MODE_H__ #define __ATA_HC_IDE_MODE_H__
@ -59,50 +60,50 @@ typedef enum {
#define BMIS_INTERRUPT BIT2 #define BMIS_INTERRUPT BIT2
#define BMIS_ERROR BIT1 #define BMIS_ERROR BIT1
#define BMIC_OFFSET 0x00 #define BMIC_OFFSET 0x00
#define BMIS_OFFSET 0x02 #define BMIS_OFFSET 0x02
#define BMID_OFFSET 0x04 #define BMID_OFFSET 0x04
// //
// IDE transfer mode // IDE transfer mode
// //
#define EFI_ATA_MODE_DEFAULT_PIO 0x00 #define EFI_ATA_MODE_DEFAULT_PIO 0x00
#define EFI_ATA_MODE_FLOW_PIO 0x01 #define EFI_ATA_MODE_FLOW_PIO 0x01
#define EFI_ATA_MODE_MDMA 0x04 #define EFI_ATA_MODE_MDMA 0x04
#define EFI_ATA_MODE_UDMA 0x08 #define EFI_ATA_MODE_UDMA 0x08
typedef struct { typedef struct {
UINT32 RegionBaseAddr; UINT32 RegionBaseAddr;
UINT16 ByteCount; UINT16 ByteCount;
UINT16 EndOfTable; UINT16 EndOfTable;
} EFI_ATA_DMA_PRD; } EFI_ATA_DMA_PRD;
typedef struct { typedef struct {
UINT8 ModeNumber : 3; UINT8 ModeNumber : 3;
UINT8 ModeCategory : 5; UINT8 ModeCategory : 5;
} EFI_ATA_TRANSFER_MODE; } EFI_ATA_TRANSFER_MODE;
typedef struct { typedef struct {
UINT8 Sector; UINT8 Sector;
UINT8 Heads; UINT8 Heads;
UINT8 MultipleSector; UINT8 MultipleSector;
} EFI_ATA_DRIVE_PARMS; } EFI_ATA_DRIVE_PARMS;
// //
// IDE registers set // IDE registers set
// //
typedef struct { typedef struct {
UINT16 Data; UINT16 Data;
UINT16 ErrOrFeature; UINT16 ErrOrFeature;
UINT16 SectorCount; UINT16 SectorCount;
UINT16 SectorNumber; UINT16 SectorNumber;
UINT16 CylinderLsb; UINT16 CylinderLsb;
UINT16 CylinderMsb; UINT16 CylinderMsb;
UINT16 Head; UINT16 Head;
UINT16 CmdOrStatus; UINT16 CmdOrStatus;
UINT16 AltOrDev; UINT16 AltOrDev;
UINT16 BusMasterBaseAddr; UINT16 BusMasterBaseAddr;
} EFI_IDE_REGISTERS; } EFI_IDE_REGISTERS;
// //
@ -164,8 +165,8 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
GetIdeRegisterIoAddr ( GetIdeRegisterIoAddr (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN OUT EFI_IDE_REGISTERS *IdeRegisters IN OUT EFI_IDE_REGISTERS *IdeRegisters
); );
/** /**
@ -187,12 +188,11 @@ GetIdeRegisterIoAddr (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaPacketCommandExecute ( AtaPacketCommandExecute (
IN EFI_PCI_IO_PROTOCOL *PciIo, IN EFI_PCI_IO_PROTOCOL *PciIo,
IN EFI_IDE_REGISTERS *IdeRegisters, IN EFI_IDE_REGISTERS *IdeRegisters,
IN UINT8 Channel, IN UINT8 Channel,
IN UINT8 Device, IN UINT8 Device,
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
); );
#endif #endif

View File

@ -15,7 +15,7 @@
// //
// ATA Bus Driver Binding Protocol Instance // ATA Bus Driver Binding Protocol Instance
// //
EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding = { EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding = {
AtaBusDriverBindingSupported, AtaBusDriverBindingSupported,
AtaBusDriverBindingStart, AtaBusDriverBindingStart,
AtaBusDriverBindingStop, AtaBusDriverBindingStop,
@ -27,9 +27,9 @@ EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding = {
// //
// Template for ATA Child Device. // Template for ATA Child Device.
// //
ATA_DEVICE gAtaDeviceTemplate = { ATA_DEVICE gAtaDeviceTemplate = {
ATA_DEVICE_SIGNATURE, // Signature ATA_DEVICE_SIGNATURE, // Signature
NULL, // Handle NULL, // Handle
{ // BlockIo { // BlockIo
EFI_BLOCK_IO_PROTOCOL_REVISION, EFI_BLOCK_IO_PROTOCOL_REVISION,
NULL, NULL,
@ -65,25 +65,27 @@ ATA_DEVICE gAtaDeviceTemplate = {
AtaDiskInfoSenseData, AtaDiskInfoSenseData,
AtaDiskInfoWhichIde AtaDiskInfoWhichIde
}, },
NULL, // DevicePath NULL, // DevicePath
{ {
AtaStorageSecurityReceiveData, AtaStorageSecurityReceiveData,
AtaStorageSecuritySendData AtaStorageSecuritySendData
}, },
NULL, // AtaBusDriverData NULL, // AtaBusDriverData
0, // Port 0, // Port
0, // PortMultiplierPort 0, // PortMultiplierPort
{ 0, }, // Packet { 0, }, // Packet
{{ 0}, }, // Acb {
NULL, // Asb { 0 },
FALSE, // UdmaValid }, // Acb
FALSE, // Lba48Bit NULL, // Asb
NULL, // IdentifyData FALSE, // UdmaValid
NULL, // ControllerNameTable FALSE, // Lba48Bit
{L'\0', }, // ModelName NULL, // IdentifyData
{NULL, NULL}, // AtaTaskList NULL, // ControllerNameTable
{NULL, NULL}, // AtaSubTaskList { L'\0', }, // ModelName
FALSE // Abort { NULL, NULL }, // AtaTaskList
{ NULL, NULL }, // AtaSubTaskList
FALSE // Abort
}; };
/** /**
@ -101,8 +103,8 @@ ATA_DEVICE gAtaDeviceTemplate = {
**/ **/
VOID * VOID *
AllocateAlignedBuffer ( AllocateAlignedBuffer (
IN ATA_DEVICE *AtaDevice, IN ATA_DEVICE *AtaDevice,
IN UINTN BufferSize IN UINTN BufferSize
) )
{ {
return AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), AtaDevice->AtaBusDriverData->AtaPassThru->Mode->IoAlign); return AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), AtaDevice->AtaBusDriverData->AtaPassThru->Mode->IoAlign);
@ -120,8 +122,8 @@ AllocateAlignedBuffer (
**/ **/
VOID VOID
FreeAlignedBuffer ( FreeAlignedBuffer (
IN VOID *Buffer, IN VOID *Buffer,
IN UINTN BufferSize IN UINTN BufferSize
) )
{ {
if (Buffer != NULL) { if (Buffer != NULL) {
@ -129,7 +131,6 @@ FreeAlignedBuffer (
} }
} }
/** /**
Release all the resources allocated for the ATA device. Release all the resources allocated for the ATA device.
@ -143,11 +144,11 @@ ReleaseAtaResources (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
) )
{ {
ATA_BUS_ASYN_SUB_TASK *SubTask; ATA_BUS_ASYN_SUB_TASK *SubTask;
ATA_BUS_ASYN_TASK *AtaTask; ATA_BUS_ASYN_TASK *AtaTask;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
LIST_ENTRY *DelEntry; LIST_ENTRY *DelEntry;
EFI_TPL OldTpl; EFI_TPL OldTpl;
FreeUnicodeStringTable (AtaDevice->ControllerNameTable); FreeUnicodeStringTable (AtaDevice->ControllerNameTable);
FreeAlignedBuffer (AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK)); FreeAlignedBuffer (AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));
@ -155,14 +156,16 @@ ReleaseAtaResources (
if (AtaDevice->DevicePath != NULL) { if (AtaDevice->DevicePath != NULL) {
FreePool (AtaDevice->DevicePath); FreePool (AtaDevice->DevicePath);
} }
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
if (!IsListEmpty (&AtaDevice->AtaSubTaskList)) { if (!IsListEmpty (&AtaDevice->AtaSubTaskList)) {
// //
// Free the Subtask list. // Free the Subtask list.
// //
for(Entry = AtaDevice->AtaSubTaskList.ForwardLink; for (Entry = AtaDevice->AtaSubTaskList.ForwardLink;
Entry != (&AtaDevice->AtaSubTaskList); Entry != (&AtaDevice->AtaSubTaskList);
) { )
{
DelEntry = Entry; DelEntry = Entry;
Entry = Entry->ForwardLink; Entry = Entry->ForwardLink;
SubTask = ATA_ASYN_SUB_TASK_FROM_ENTRY (DelEntry); SubTask = ATA_ASYN_SUB_TASK_FROM_ENTRY (DelEntry);
@ -171,13 +174,15 @@ ReleaseAtaResources (
FreeAtaSubTask (SubTask); FreeAtaSubTask (SubTask);
} }
} }
if (!IsListEmpty (&AtaDevice->AtaTaskList)) { if (!IsListEmpty (&AtaDevice->AtaTaskList)) {
// //
// Free the Subtask list. // Free the Subtask list.
// //
for(Entry = AtaDevice->AtaTaskList.ForwardLink; for (Entry = AtaDevice->AtaTaskList.ForwardLink;
Entry != (&AtaDevice->AtaTaskList); Entry != (&AtaDevice->AtaTaskList);
) { )
{
DelEntry = Entry; DelEntry = Entry;
Entry = Entry->ForwardLink; Entry = Entry->ForwardLink;
AtaTask = ATA_ASYN_TASK_FROM_ENTRY (DelEntry); AtaTask = ATA_ASYN_TASK_FROM_ENTRY (DelEntry);
@ -186,11 +191,11 @@ ReleaseAtaResources (
FreePool (AtaTask); FreePool (AtaTask);
} }
} }
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
FreePool (AtaDevice); FreePool (AtaDevice);
} }
/** /**
Registers an ATA device. Registers an ATA device.
@ -210,29 +215,29 @@ ReleaseAtaResources (
**/ **/
EFI_STATUS EFI_STATUS
RegisterAtaDevice ( RegisterAtaDevice (
IN OUT ATA_BUS_DRIVER_DATA *AtaBusDriverData, IN OUT ATA_BUS_DRIVER_DATA *AtaBusDriverData,
IN UINT16 Port, IN UINT16 Port,
IN UINT16 PortMultiplierPort IN UINT16 PortMultiplierPort
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode; EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
EFI_HANDLE DeviceHandle; EFI_HANDLE DeviceHandle;
AtaDevice = NULL; AtaDevice = NULL;
NewDevicePathNode = NULL; NewDevicePathNode = NULL;
DevicePath = NULL; DevicePath = NULL;
RemainingDevicePath = NULL; RemainingDevicePath = NULL;
// //
// Build device path // Build device path
// //
AtaPassThru = AtaBusDriverData->AtaPassThru; AtaPassThru = AtaBusDriverData->AtaPassThru;
Status = AtaPassThru->BuildDevicePath (AtaPassThru, Port, PortMultiplierPort, &NewDevicePathNode); Status = AtaPassThru->BuildDevicePath (AtaPassThru, Port, PortMultiplierPort, &NewDevicePathNode);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Done; goto Done;
} }
@ -243,10 +248,10 @@ RegisterAtaDevice (
goto Done; goto Done;
} }
DeviceHandle = NULL; DeviceHandle = NULL;
RemainingDevicePath = DevicePath; RemainingDevicePath = DevicePath;
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle); Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) { if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
Status = EFI_ALREADY_STARTED; Status = EFI_ALREADY_STARTED;
FreePool (DevicePath); FreePool (DevicePath);
goto Done; goto Done;
@ -270,11 +275,12 @@ RegisterAtaDevice (
AtaDevice->DevicePath = DevicePath; AtaDevice->DevicePath = DevicePath;
AtaDevice->Port = Port; AtaDevice->Port = Port;
AtaDevice->PortMultiplierPort = PortMultiplierPort; AtaDevice->PortMultiplierPort = PortMultiplierPort;
AtaDevice->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK)); AtaDevice->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK));
if (AtaDevice->Asb == NULL) { if (AtaDevice->Asb == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Done; goto Done;
} }
AtaDevice->IdentifyData = AllocateAlignedBuffer (AtaDevice, sizeof (ATA_IDENTIFY_DATA)); AtaDevice->IdentifyData = AllocateAlignedBuffer (AtaDevice, sizeof (ATA_IDENTIFY_DATA));
if (AtaDevice->IdentifyData == NULL) { if (AtaDevice->IdentifyData == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
@ -368,13 +374,14 @@ RegisterAtaDevice (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Done; goto Done;
} }
DEBUG ((DEBUG_INFO, "Successfully Install Storage Security Protocol on the ATA device\n")); DEBUG ((DEBUG_INFO, "Successfully Install Storage Security Protocol on the ATA device\n"));
} }
gBS->OpenProtocol ( gBS->OpenProtocol (
AtaBusDriverData->Controller, AtaBusDriverData->Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
(VOID **) &AtaPassThru, (VOID **)&AtaPassThru,
AtaBusDriverData->DriverBindingHandle, AtaBusDriverData->DriverBindingHandle,
AtaDevice->Handle, AtaDevice->Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@ -389,10 +396,10 @@ Done:
ReleaseAtaResources (AtaDevice); ReleaseAtaResources (AtaDevice);
DEBUG ((DEBUG_ERROR | DEBUG_INIT, "Failed to initialize Port %x PortMultiplierPort %x, status = %r\n", Port, PortMultiplierPort, Status)); DEBUG ((DEBUG_ERROR | DEBUG_INIT, "Failed to initialize Port %x PortMultiplierPort %x, status = %r\n", Port, PortMultiplierPort, Status));
} }
return Status; return Status;
} }
/** /**
Unregisters an ATA device. Unregisters an ATA device.
@ -409,25 +416,25 @@ Done:
**/ **/
EFI_STATUS EFI_STATUS
UnregisterAtaDevice ( UnregisterAtaDevice (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_HANDLE Handle IN EFI_HANDLE Handle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_BLOCK_IO_PROTOCOL *BlockIo; EFI_BLOCK_IO_PROTOCOL *BlockIo;
EFI_BLOCK_IO2_PROTOCOL *BlockIo2; EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity; EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
BlockIo2 = NULL; BlockIo2 = NULL;
BlockIo = NULL; BlockIo = NULL;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlockIo, (VOID **)&BlockIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -439,7 +446,7 @@ UnregisterAtaDevice (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiBlockIo2ProtocolGuid, &gEfiBlockIo2ProtocolGuid,
(VOID **) &BlockIo2, (VOID **)&BlockIo2,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -488,13 +495,13 @@ UnregisterAtaDevice (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
gBS->OpenProtocol ( gBS->OpenProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
(VOID **) &AtaPassThru, (VOID **)&AtaPassThru,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
); );
return Status; return Status;
} }
@ -504,7 +511,7 @@ UnregisterAtaDevice (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiStorageSecurityCommandProtocolGuid, &gEfiStorageSecurityCommandProtocolGuid,
(VOID **) &StorageSecurity, (VOID **)&StorageSecurity,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -518,13 +525,13 @@ UnregisterAtaDevice (
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
gBS->OpenProtocol ( gBS->OpenProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
(VOID **) &AtaPassThru, (VOID **)&AtaPassThru,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
); );
return Status; return Status;
} }
} }
@ -533,8 +540,6 @@ UnregisterAtaDevice (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Tests to see if this driver supports a given controller. If a child device is provided, Tests to see if this driver supports a given controller. If a child device is provided,
it further tests to see if this driver supports creating a handle for the specified child device. it further tests to see if this driver supports creating a handle for the specified child device.
@ -585,11 +590,11 @@ AtaBusDriverBindingSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
UINT16 Port; UINT16 Port;
UINT16 PortMultiplierPort; UINT16 PortMultiplierPort;
// //
// Test EFI_ATA_PASS_THRU_PROTOCOL on controller handle. // Test EFI_ATA_PASS_THRU_PROTOCOL on controller handle.
@ -597,7 +602,7 @@ AtaBusDriverBindingSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
(VOID **) &AtaPassThru, (VOID **)&AtaPassThru,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -619,11 +624,11 @@ AtaBusDriverBindingSupported (
// Close the I/O Abstraction(s) used to perform the supported test // Close the I/O Abstraction(s) used to perform the supported test
// //
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -637,11 +642,11 @@ AtaBusDriverBindingSupported (
// Close the I/O Abstraction(s) used to perform the supported test // Close the I/O Abstraction(s) used to perform the supported test
// //
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
return Status; return Status;
} }
} }
@ -650,11 +655,11 @@ AtaBusDriverBindingSupported (
// Close the I/O Abstraction(s) used to perform the supported test // Close the I/O Abstraction(s) used to perform the supported test
// //
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
// //
// Open the EFI Device Path protocol needed to perform the supported test // Open the EFI Device Path protocol needed to perform the supported test
@ -662,7 +667,7 @@ AtaBusDriverBindingSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath, (VOID **)&ParentDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -670,7 +675,6 @@ AtaBusDriverBindingSupported (
return Status; return Status;
} }
/** /**
Starts a device controller or a bus controller. Starts a device controller or a bus controller.
@ -714,19 +718,19 @@ AtaBusDriverBindingStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
ATA_BUS_DRIVER_DATA *AtaBusDriverData; ATA_BUS_DRIVER_DATA *AtaBusDriverData;
UINT16 Port; UINT16 Port;
UINT16 PortMultiplierPort; UINT16 PortMultiplierPort;
AtaBusDriverData = NULL; AtaBusDriverData = NULL;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath, (VOID **)&ParentDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -747,7 +751,7 @@ AtaBusDriverBindingStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
(VOID **) &AtaPassThru, (VOID **)&AtaPassThru,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -766,9 +770,9 @@ AtaBusDriverBindingStart (
goto ErrorExit; goto ErrorExit;
} }
AtaBusDriverData->AtaPassThru = AtaPassThru; AtaBusDriverData->AtaPassThru = AtaPassThru;
AtaBusDriverData->Controller = Controller; AtaBusDriverData->Controller = Controller;
AtaBusDriverData->ParentDevicePath = ParentDevicePath; AtaBusDriverData->ParentDevicePath = ParentDevicePath;
AtaBusDriverData->DriverBindingHandle = This->DriverBindingHandle; AtaBusDriverData->DriverBindingHandle = This->DriverBindingHandle;
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
@ -780,12 +784,11 @@ AtaBusDriverBindingStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto ErrorExit; goto ErrorExit;
} }
} else { } else {
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
(VOID **) &AtaBusDriverData, (VOID **)&AtaBusDriverData,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -826,14 +829,16 @@ AtaBusDriverBindingStart (
// //
break; break;
} }
RegisterAtaDevice (AtaBusDriverData, Port, PortMultiplierPort); RegisterAtaDevice (AtaBusDriverData, Port, PortMultiplierPort);
} }
} }
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} else if (!IsDevicePathEnd (RemainingDevicePath)) { } else if (!IsDevicePathEnd (RemainingDevicePath)) {
Status = AtaPassThru->GetDevice (AtaPassThru, RemainingDevicePath, &Port, &PortMultiplierPort); Status = AtaPassThru->GetDevice (AtaPassThru, RemainingDevicePath, &Port, &PortMultiplierPort);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = RegisterAtaDevice (AtaBusDriverData,Port, PortMultiplierPort); Status = RegisterAtaDevice (AtaBusDriverData, Port, PortMultiplierPort);
} }
} }
@ -852,17 +857,15 @@ ErrorExit:
} }
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
return Status; return Status;
} }
/** /**
Stops a device controller or a bus controller. Stops a device controller or a bus controller.
@ -892,42 +895,42 @@ ErrorExit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBusDriverBindingStop ( AtaBusDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
BOOLEAN AllChildrenStopped; BOOLEAN AllChildrenStopped;
UINTN Index; UINTN Index;
ATA_BUS_DRIVER_DATA *AtaBusDriverData; ATA_BUS_DRIVER_DATA *AtaBusDriverData;
if (NumberOfChildren == 0) { if (NumberOfChildren == 0) {
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
(VOID **) &AtaBusDriverData, (VOID **)&AtaBusDriverData,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces ( gBS->UninstallMultipleProtocolInterfaces (
Controller, Controller,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
AtaBusDriverData, AtaBusDriverData,
NULL NULL
); );
FreePool (AtaBusDriverData); FreePool (AtaBusDriverData);
} }
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiAtaPassThruProtocolGuid, &gEfiAtaPassThruProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -935,7 +938,6 @@ AtaBusDriverBindingStop (
AllChildrenStopped = TRUE; AllChildrenStopped = TRUE;
for (Index = 0; Index < NumberOfChildren; Index++) { for (Index = 0; Index < NumberOfChildren; Index++) {
Status = UnregisterAtaDevice (This, Controller, ChildHandleBuffer[Index]); Status = UnregisterAtaDevice (This, Controller, ChildHandleBuffer[Index]);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
AllChildrenStopped = FALSE; AllChildrenStopped = FALSE;
@ -949,7 +951,6 @@ AtaBusDriverBindingStop (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Reset the Block Device. Reset the Block Device.
@ -964,13 +965,13 @@ AtaBusDriverBindingStop (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoReset ( AtaBlockIoReset (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
EFI_TPL OldTpl; EFI_TPL OldTpl;
OldTpl = gBS->RaiseTPL (TPL_CALLBACK); OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
@ -986,7 +987,6 @@ AtaBlockIoReset (
return Status; return Status;
} }
/** /**
Read/Write BufferSize bytes from Lba from/into Buffer. Read/Write BufferSize bytes from Lba from/into Buffer.
@ -1015,30 +1015,30 @@ AtaBlockIoReset (
**/ **/
EFI_STATUS EFI_STATUS
BlockIoReadWrite ( BlockIoReadWrite (
IN VOID *This, IN VOID *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN OUT EFI_BLOCK_IO2_TOKEN *Token,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer, OUT VOID *Buffer,
IN BOOLEAN IsBlockIo2, IN BOOLEAN IsBlockIo2,
IN BOOLEAN IsWrite IN BOOLEAN IsWrite
) )
{ {
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL OldTpl; EFI_TPL OldTpl;
EFI_BLOCK_IO_MEDIA *Media; EFI_BLOCK_IO_MEDIA *Media;
UINTN BlockSize; UINTN BlockSize;
UINTN NumberOfBlocks; UINTN NumberOfBlocks;
UINTN IoAlign; UINTN IoAlign;
if (IsBlockIo2) { if (IsBlockIo2) {
Media = ((EFI_BLOCK_IO2_PROTOCOL *) This)->Media; Media = ((EFI_BLOCK_IO2_PROTOCOL *)This)->Media;
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO2 (This); AtaDevice = ATA_DEVICE_FROM_BLOCK_IO2 (This);
} else { } else {
Media = ((EFI_BLOCK_IO_PROTOCOL *) This)->Media; Media = ((EFI_BLOCK_IO_PROTOCOL *)This)->Media;
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO (This); AtaDevice = ATA_DEVICE_FROM_BLOCK_IO (This);
} }
if (MediaId != Media->MediaId) { if (MediaId != Media->MediaId) {
@ -1057,6 +1057,7 @@ BlockIoReadWrite (
Token->TransactionStatus = EFI_SUCCESS; Token->TransactionStatus = EFI_SUCCESS;
gBS->SignalEvent (Token->Event); gBS->SignalEvent (Token->Event);
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -1065,13 +1066,13 @@ BlockIoReadWrite (
return EFI_BAD_BUFFER_SIZE; return EFI_BAD_BUFFER_SIZE;
} }
NumberOfBlocks = BufferSize / BlockSize; NumberOfBlocks = BufferSize / BlockSize;
if ((Lba + NumberOfBlocks - 1) > Media->LastBlock) { if ((Lba + NumberOfBlocks - 1) > Media->LastBlock) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
IoAlign = Media->IoAlign; IoAlign = Media->IoAlign;
if (IoAlign > 0 && (((UINTN) Buffer & (IoAlign - 1)) != 0)) { if ((IoAlign > 0) && (((UINTN)Buffer & (IoAlign - 1)) != 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -1087,7 +1088,6 @@ BlockIoReadWrite (
return Status; return Status;
} }
/** /**
Read BufferSize bytes from Lba into Buffer. Read BufferSize bytes from Lba into Buffer.
@ -1110,17 +1110,16 @@ BlockIoReadWrite (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoReadBlocks ( AtaBlockIoReadBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
return BlockIoReadWrite ((VOID *) This, MediaId, Lba, NULL, BufferSize, Buffer, FALSE, FALSE); return BlockIoReadWrite ((VOID *)This, MediaId, Lba, NULL, BufferSize, Buffer, FALSE, FALSE);
} }
/** /**
Write BufferSize bytes from Lba into Buffer. Write BufferSize bytes from Lba into Buffer.
@ -1144,17 +1143,16 @@ AtaBlockIoReadBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoWriteBlocks ( AtaBlockIoWriteBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
) )
{ {
return BlockIoReadWrite ((VOID *) This, MediaId, Lba, NULL, BufferSize, Buffer, FALSE, TRUE); return BlockIoReadWrite ((VOID *)This, MediaId, Lba, NULL, BufferSize, Buffer, FALSE, TRUE);
} }
/** /**
Flush the Block Device. Flush the Block Device.
@ -1168,7 +1166,7 @@ AtaBlockIoWriteBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoFlushBlocks ( AtaBlockIoFlushBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This IN EFI_BLOCK_IO_PROTOCOL *This
) )
{ {
// //
@ -1195,9 +1193,9 @@ AtaBlockIoResetEx (
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
EFI_TPL OldTpl; EFI_TPL OldTpl;
OldTpl = gBS->RaiseTPL (TPL_CALLBACK); OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
@ -1252,10 +1250,9 @@ AtaBlockIoReadBlocksEx (
OUT VOID *Buffer OUT VOID *Buffer
) )
{ {
return BlockIoReadWrite ((VOID *) This, MediaId, Lba, Token, BufferSize, Buffer, TRUE, FALSE); return BlockIoReadWrite ((VOID *)This, MediaId, Lba, Token, BufferSize, Buffer, TRUE, FALSE);
} }
/** /**
Write BufferSize bytes from Lba into Buffer. Write BufferSize bytes from Lba into Buffer.
@ -1289,10 +1286,9 @@ AtaBlockIoWriteBlocksEx (
IN VOID *Buffer IN VOID *Buffer
) )
{ {
return BlockIoReadWrite ((VOID *) This, MediaId, Lba, Token, BufferSize, Buffer, TRUE, TRUE); return BlockIoReadWrite ((VOID *)This, MediaId, Lba, Token, BufferSize, Buffer, TRUE, TRUE);
} }
/** /**
Flush the Block Device. Flush the Block Device.
@ -1314,12 +1310,14 @@ AtaBlockIoFlushBlocksEx (
// //
// Signal event and return directly. // Signal event and return directly.
// //
if (Token != NULL && Token->Event != NULL) { if ((Token != NULL) && (Token->Event != NULL)) {
Token->TransactionStatus = EFI_SUCCESS; Token->TransactionStatus = EFI_SUCCESS;
gBS->SignalEvent (Token->Event); gBS->SignalEvent (Token->Event);
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Provides inquiry information for the controller type. Provides inquiry information for the controller type.
@ -1339,15 +1337,14 @@ AtaBlockIoFlushBlocksEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoInquiry ( AtaDiskInfoInquiry (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *InquiryData, IN OUT VOID *InquiryData,
IN OUT UINT32 *InquiryDataSize IN OUT UINT32 *InquiryDataSize
) )
{ {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
Provides identify information for the controller type. Provides identify information for the controller type.
@ -1369,13 +1366,13 @@ AtaDiskInfoInquiry (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoIdentify ( AtaDiskInfoIdentify (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *IdentifyData, IN OUT VOID *IdentifyData,
IN OUT UINT32 *IdentifyDataSize IN OUT UINT32 *IdentifyDataSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This); AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This);
@ -1384,12 +1381,12 @@ AtaDiskInfoIdentify (
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
CopyMem (IdentifyData, AtaDevice->IdentifyData, sizeof (ATA_IDENTIFY_DATA)); CopyMem (IdentifyData, AtaDevice->IdentifyData, sizeof (ATA_IDENTIFY_DATA));
} }
*IdentifyDataSize = sizeof (ATA_IDENTIFY_DATA); *IdentifyDataSize = sizeof (ATA_IDENTIFY_DATA);
return Status; return Status;
} }
/** /**
Provides sense data information for the controller type. Provides sense data information for the controller type.
@ -1410,16 +1407,15 @@ AtaDiskInfoIdentify (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoSenseData ( AtaDiskInfoSenseData (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *SenseData, IN OUT VOID *SenseData,
IN OUT UINT32 *SenseDataSize, IN OUT UINT32 *SenseDataSize,
OUT UINT8 *SenseDataNumber OUT UINT8 *SenseDataNumber
) )
{ {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
This function is used by the IDE bus driver to get controller information. This function is used by the IDE bus driver to get controller information.
@ -1434,16 +1430,16 @@ AtaDiskInfoSenseData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoWhichIde ( AtaDiskInfoWhichIde (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
OUT UINT32 *IdeChannel, OUT UINT32 *IdeChannel,
OUT UINT32 *IdeDevice OUT UINT32 *IdeDevice
) )
{ {
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This); AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This);
*IdeChannel = AtaDevice->Port; *IdeChannel = AtaDevice->Port;
*IdeDevice = AtaDevice->PortMultiplierPort; *IdeDevice = AtaDevice->PortMultiplierPort;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -1523,22 +1519,22 @@ AtaDiskInfoWhichIde (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaStorageSecurityReceiveData ( AtaStorageSecurityReceiveData (
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
OUT VOID *PayloadBuffer, OUT VOID *PayloadBuffer,
OUT UINTN *PayloadTransferSize OUT UINTN *PayloadTransferSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ATA_DEVICE *Private; ATA_DEVICE *Private;
EFI_TPL OldTpl; EFI_TPL OldTpl;
DEBUG ((DEBUG_INFO, "EFI Storage Security Protocol - Read\n")); DEBUG ((DEBUG_INFO, "EFI Storage Security Protocol - Read\n"));
if ((PayloadBuffer == NULL || PayloadTransferSize == NULL) && PayloadBufferSize != 0) { if (((PayloadBuffer == NULL) || (PayloadTransferSize == NULL)) && (PayloadBufferSize != 0)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -1634,18 +1630,18 @@ AtaStorageSecurityReceiveData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaStorageSecuritySendData ( AtaStorageSecuritySendData (
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
IN VOID *PayloadBuffer IN VOID *PayloadBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ATA_DEVICE *Private; ATA_DEVICE *Private;
EFI_TPL OldTpl; EFI_TPL OldTpl;
DEBUG ((DEBUG_INFO, "EFI Storage Security Protocol - Send\n")); DEBUG ((DEBUG_INFO, "EFI Storage Security Protocol - Send\n"));
if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) { if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) {
@ -1687,12 +1683,12 @@ AtaStorageSecuritySendData (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeAtaBus( InitializeAtaBus (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).

View File

@ -38,27 +38,27 @@
// //
// Time out value for ATA pass through protocol // Time out value for ATA pass through protocol
// //
#define ATA_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3) #define ATA_TIMEOUT EFI_TIMER_PERIOD_SECONDS (3)
// //
// Maximum number of times to retry ATA command // Maximum number of times to retry ATA command
// //
#define MAX_RETRY_TIMES 3 #define MAX_RETRY_TIMES 3
// //
// The maximum total sectors count in 28 bit addressing mode // The maximum total sectors count in 28 bit addressing mode
// //
#define MAX_28BIT_ADDRESSING_CAPACITY 0xfffffff #define MAX_28BIT_ADDRESSING_CAPACITY 0xfffffff
// //
// The maximum ATA transaction sector count in 28 bit addressing mode. // The maximum ATA transaction sector count in 28 bit addressing mode.
// //
#define MAX_28BIT_TRANSFER_BLOCK_NUM 0x100 #define MAX_28BIT_TRANSFER_BLOCK_NUM 0x100
// //
// The maximum ATA transaction sector count in 48 bit addressing mode. // The maximum ATA transaction sector count in 48 bit addressing mode.
// //
//#define MAX_48BIT_TRANSFER_BLOCK_NUM 0x10000 // #define MAX_48BIT_TRANSFER_BLOCK_NUM 0x10000
// //
// BugBug: if the TransferLength is equal with 0x10000 (the 48bit max length), // BugBug: if the TransferLength is equal with 0x10000 (the 48bit max length),
@ -66,109 +66,109 @@
// seems not ready. Change the Maximum Sector Numbers to 0xFFFF to work round // seems not ready. Change the Maximum Sector Numbers to 0xFFFF to work round
// this issue. // this issue.
// //
#define MAX_48BIT_TRANSFER_BLOCK_NUM 0xFFFF #define MAX_48BIT_TRANSFER_BLOCK_NUM 0xFFFF
// //
// The maximum model name in ATA identify data // The maximum model name in ATA identify data
// //
#define MAX_MODEL_NAME_LEN 40 #define MAX_MODEL_NAME_LEN 40
#define ATA_TASK_SIGNATURE SIGNATURE_32 ('A', 'T', 'S', 'K') #define ATA_TASK_SIGNATURE SIGNATURE_32 ('A', 'T', 'S', 'K')
#define ATA_DEVICE_SIGNATURE SIGNATURE_32 ('A', 'B', 'I', 'D') #define ATA_DEVICE_SIGNATURE SIGNATURE_32 ('A', 'B', 'I', 'D')
#define ATA_SUB_TASK_SIGNATURE SIGNATURE_32 ('A', 'S', 'T', 'S') #define ATA_SUB_TASK_SIGNATURE SIGNATURE_32 ('A', 'S', 'T', 'S')
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0) #define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
// //
// ATA bus data structure for ATA controller // ATA bus data structure for ATA controller
// //
typedef struct { typedef struct {
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
EFI_HANDLE Controller; EFI_HANDLE Controller;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_HANDLE DriverBindingHandle; EFI_HANDLE DriverBindingHandle;
} ATA_BUS_DRIVER_DATA; } ATA_BUS_DRIVER_DATA;
// //
// ATA device data structure for each child device // ATA device data structure for each child device
// //
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
EFI_HANDLE Handle; EFI_HANDLE Handle;
EFI_BLOCK_IO_PROTOCOL BlockIo; EFI_BLOCK_IO_PROTOCOL BlockIo;
EFI_BLOCK_IO2_PROTOCOL BlockIo2; EFI_BLOCK_IO2_PROTOCOL BlockIo2;
EFI_BLOCK_IO_MEDIA BlockMedia; EFI_BLOCK_IO_MEDIA BlockMedia;
EFI_DISK_INFO_PROTOCOL DiskInfo; EFI_DISK_INFO_PROTOCOL DiskInfo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity; EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity;
ATA_BUS_DRIVER_DATA *AtaBusDriverData; ATA_BUS_DRIVER_DATA *AtaBusDriverData;
UINT16 Port; UINT16 Port;
UINT16 PortMultiplierPort; UINT16 PortMultiplierPort;
// //
// Buffer for the execution of ATA pass through protocol // Buffer for the execution of ATA pass through protocol
// //
EFI_ATA_PASS_THRU_COMMAND_PACKET Packet; EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
EFI_ATA_COMMAND_BLOCK Acb; EFI_ATA_COMMAND_BLOCK Acb;
EFI_ATA_STATUS_BLOCK *Asb; EFI_ATA_STATUS_BLOCK *Asb;
BOOLEAN UdmaValid; BOOLEAN UdmaValid;
BOOLEAN Lba48Bit; BOOLEAN Lba48Bit;
// //
// Cached data for ATA identify data // Cached data for ATA identify data
// //
ATA_IDENTIFY_DATA *IdentifyData; ATA_IDENTIFY_DATA *IdentifyData;
EFI_UNICODE_STRING_TABLE *ControllerNameTable; EFI_UNICODE_STRING_TABLE *ControllerNameTable;
CHAR16 ModelName[MAX_MODEL_NAME_LEN + 1]; CHAR16 ModelName[MAX_MODEL_NAME_LEN + 1];
LIST_ENTRY AtaTaskList; LIST_ENTRY AtaTaskList;
LIST_ENTRY AtaSubTaskList; LIST_ENTRY AtaSubTaskList;
BOOLEAN Abort; BOOLEAN Abort;
} ATA_DEVICE; } ATA_DEVICE;
// //
// Sub-Task for the non blocking I/O // Sub-Task for the non blocking I/O
// //
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
EFI_BLOCK_IO2_TOKEN *Token; EFI_BLOCK_IO2_TOKEN *Token;
UINTN *UnsignalledEventCount; UINTN *UnsignalledEventCount;
EFI_ATA_PASS_THRU_COMMAND_PACKET Packet; EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
BOOLEAN *IsError;// Indicate whether meeting error during source allocation for new task. BOOLEAN *IsError;// Indicate whether meeting error during source allocation for new task.
LIST_ENTRY TaskEntry; LIST_ENTRY TaskEntry;
} ATA_BUS_ASYN_SUB_TASK; } ATA_BUS_ASYN_SUB_TASK;
// //
// Task for the non blocking I/O // Task for the non blocking I/O
// //
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
EFI_BLOCK_IO2_TOKEN *Token; EFI_BLOCK_IO2_TOKEN *Token;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
UINT8 *Buffer; UINT8 *Buffer;
EFI_LBA StartLba; EFI_LBA StartLba;
UINTN NumberOfBlocks; UINTN NumberOfBlocks;
BOOLEAN IsWrite; BOOLEAN IsWrite;
LIST_ENTRY TaskEntry; LIST_ENTRY TaskEntry;
} ATA_BUS_ASYN_TASK; } ATA_BUS_ASYN_TASK;
#define ATA_DEVICE_FROM_BLOCK_IO(a) CR (a, ATA_DEVICE, BlockIo, ATA_DEVICE_SIGNATURE) #define ATA_DEVICE_FROM_BLOCK_IO(a) CR (a, ATA_DEVICE, BlockIo, ATA_DEVICE_SIGNATURE)
#define ATA_DEVICE_FROM_BLOCK_IO2(a) CR (a, ATA_DEVICE, BlockIo2, ATA_DEVICE_SIGNATURE) #define ATA_DEVICE_FROM_BLOCK_IO2(a) CR (a, ATA_DEVICE, BlockIo2, ATA_DEVICE_SIGNATURE)
#define ATA_DEVICE_FROM_DISK_INFO(a) CR (a, ATA_DEVICE, DiskInfo, ATA_DEVICE_SIGNATURE) #define ATA_DEVICE_FROM_DISK_INFO(a) CR (a, ATA_DEVICE, DiskInfo, ATA_DEVICE_SIGNATURE)
#define ATA_DEVICE_FROM_STORAGE_SECURITY(a) CR (a, ATA_DEVICE, StorageSecurity, ATA_DEVICE_SIGNATURE) #define ATA_DEVICE_FROM_STORAGE_SECURITY(a) CR (a, ATA_DEVICE, StorageSecurity, ATA_DEVICE_SIGNATURE)
#define ATA_ASYN_SUB_TASK_FROM_ENTRY(a) CR (a, ATA_BUS_ASYN_SUB_TASK, TaskEntry, ATA_SUB_TASK_SIGNATURE) #define ATA_ASYN_SUB_TASK_FROM_ENTRY(a) CR (a, ATA_BUS_ASYN_SUB_TASK, TaskEntry, ATA_SUB_TASK_SIGNATURE)
#define ATA_ASYN_TASK_FROM_ENTRY(a) CR (a, ATA_BUS_ASYN_TASK, TaskEntry, ATA_TASK_SIGNATURE) #define ATA_ASYN_TASK_FROM_ENTRY(a) CR (a, ATA_BUS_ASYN_TASK, TaskEntry, ATA_TASK_SIGNATURE)
// //
// Global Variables // Global Variables
// //
extern EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding;
extern EFI_COMPONENT_NAME_PROTOCOL gAtaBusComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gAtaBusComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2;
/** /**
Allocates an aligned buffer for ATA device. Allocates an aligned buffer for ATA device.
@ -185,8 +185,8 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2;
**/ **/
VOID * VOID *
AllocateAlignedBuffer ( AllocateAlignedBuffer (
IN ATA_DEVICE *AtaDevice, IN ATA_DEVICE *AtaDevice,
IN UINTN BufferSize IN UINTN BufferSize
); );
/** /**
@ -201,8 +201,8 @@ AllocateAlignedBuffer (
**/ **/
VOID VOID
FreeAlignedBuffer ( FreeAlignedBuffer (
IN VOID *Buffer, IN VOID *Buffer,
IN UINTN BufferSize IN UINTN BufferSize
); );
/** /**
@ -230,10 +230,9 @@ FreeAtaSubTask (
**/ **/
EFI_STATUS EFI_STATUS
ResetAtaDevice ( ResetAtaDevice (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
); );
/** /**
Discovers whether it is a valid ATA device. Discovers whether it is a valid ATA device.
@ -250,7 +249,7 @@ ResetAtaDevice (
**/ **/
EFI_STATUS EFI_STATUS
DiscoverAtaDevice ( DiscoverAtaDevice (
IN OUT ATA_DEVICE *AtaDevice IN OUT ATA_DEVICE *AtaDevice
); );
/** /**
@ -272,13 +271,13 @@ DiscoverAtaDevice (
**/ **/
EFI_STATUS EFI_STATUS
AccessAtaDevice( AccessAtaDevice (
IN OUT ATA_DEVICE *AtaDevice, IN OUT ATA_DEVICE *AtaDevice,
IN OUT UINT8 *Buffer, IN OUT UINT8 *Buffer,
IN EFI_LBA StartLba, IN EFI_LBA StartLba,
IN UINTN NumberOfBlocks, IN UINTN NumberOfBlocks,
IN BOOLEAN IsWrite, IN BOOLEAN IsWrite,
IN OUT EFI_BLOCK_IO2_TOKEN *Token IN OUT EFI_BLOCK_IO2_TOKEN *Token
); );
/** /**
@ -313,19 +312,20 @@ AccessAtaDevice(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TrustTransferAtaDevice ( TrustTransferAtaDevice (
IN OUT ATA_DEVICE *AtaDevice, IN OUT ATA_DEVICE *AtaDevice,
IN OUT VOID *Buffer, IN OUT VOID *Buffer,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN TransferLength, IN UINTN TransferLength,
IN BOOLEAN IsTrustSend, IN BOOLEAN IsTrustSend,
IN UINT64 Timeout, IN UINT64 Timeout,
OUT UINTN *TransferLengthOut OUT UINTN *TransferLengthOut
); );
// //
// Protocol interface prototypes // Protocol interface prototypes
// //
/** /**
Tests to see if this driver supports a given controller. If a child device is provided, Tests to see if this driver supports a given controller. If a child device is provided,
it further tests to see if this driver supports creating a handle for the specified child device. it further tests to see if this driver supports creating a handle for the specified child device.
@ -448,13 +448,12 @@ AtaBusDriverBindingStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBusDriverBindingStop ( AtaBusDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -502,7 +501,6 @@ AtaBusComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -574,14 +572,13 @@ AtaBusComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBusComponentNameGetControllerName ( AtaBusComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
/** /**
Reset the Block Device. Reset the Block Device.
@ -596,11 +593,10 @@ AtaBusComponentNameGetControllerName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoReset ( AtaBlockIoReset (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
); );
/** /**
Read BufferSize bytes from Lba into Buffer. Read BufferSize bytes from Lba into Buffer.
@ -623,14 +619,13 @@ AtaBlockIoReset (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoReadBlocks ( AtaBlockIoReadBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer OUT VOID *Buffer
); );
/** /**
Write BufferSize bytes from Lba into Buffer. Write BufferSize bytes from Lba into Buffer.
@ -654,14 +649,13 @@ AtaBlockIoReadBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoWriteBlocks ( AtaBlockIoWriteBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
); );
/** /**
Flush the Block Device. Flush the Block Device.
@ -675,7 +669,7 @@ AtaBlockIoWriteBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBlockIoFlushBlocks ( AtaBlockIoFlushBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This IN EFI_BLOCK_IO_PROTOCOL *This
); );
/** /**
@ -797,7 +791,7 @@ AtaBlockIoFlushBlocksEx (
VOID VOID
EFIAPI EFIAPI
AtaTerminateNonBlockingTask ( AtaTerminateNonBlockingTask (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
); );
/** /**
@ -819,12 +813,11 @@ AtaTerminateNonBlockingTask (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoInquiry ( AtaDiskInfoInquiry (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *InquiryData, IN OUT VOID *InquiryData,
IN OUT UINT32 *InquiryDataSize IN OUT UINT32 *InquiryDataSize
); );
/** /**
Provides identify information for the controller type. Provides identify information for the controller type.
@ -846,12 +839,11 @@ AtaDiskInfoInquiry (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoIdentify ( AtaDiskInfoIdentify (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *IdentifyData, IN OUT VOID *IdentifyData,
IN OUT UINT32 *IdentifyDataSize IN OUT UINT32 *IdentifyDataSize
); );
/** /**
Provides sense data information for the controller type. Provides sense data information for the controller type.
@ -872,13 +864,12 @@ AtaDiskInfoIdentify (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoSenseData ( AtaDiskInfoSenseData (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *SenseData, IN OUT VOID *SenseData,
IN OUT UINT32 *SenseDataSize, IN OUT UINT32 *SenseDataSize,
OUT UINT8 *SenseDataNumber OUT UINT8 *SenseDataNumber
); );
/** /**
This function is used by the IDE bus driver to get controller information. This function is used by the IDE bus driver to get controller information.
@ -893,9 +884,9 @@ AtaDiskInfoSenseData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaDiskInfoWhichIde ( AtaDiskInfoWhichIde (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
OUT UINT32 *IdeChannel, OUT UINT32 *IdeChannel,
OUT UINT32 *IdeDevice OUT UINT32 *IdeDevice
); );
/** /**
@ -973,14 +964,14 @@ AtaDiskInfoWhichIde (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaStorageSecurityReceiveData ( AtaStorageSecurityReceiveData (
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
OUT VOID *PayloadBuffer, OUT VOID *PayloadBuffer,
OUT UINTN *PayloadTransferSize OUT UINTN *PayloadTransferSize
); );
/** /**
@ -1047,13 +1038,13 @@ AtaStorageSecurityReceiveData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaStorageSecuritySendData ( AtaStorageSecuritySendData (
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
IN VOID *PayloadBuffer IN VOID *PayloadBuffer
); );
/** /**
@ -1069,7 +1060,7 @@ AtaStorageSecuritySendData (
**/ **/
VOID VOID
InitiateTPerReset ( InitiateTPerReset (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
); );
#endif #endif

View File

@ -19,16 +19,16 @@
#include "AtaBus.h" #include "AtaBus.h"
#define ATA_CMD_TRUST_NON_DATA 0x5B #define ATA_CMD_TRUST_NON_DATA 0x5B
#define ATA_CMD_TRUST_RECEIVE 0x5C #define ATA_CMD_TRUST_RECEIVE 0x5C
#define ATA_CMD_TRUST_RECEIVE_DMA 0x5D #define ATA_CMD_TRUST_RECEIVE_DMA 0x5D
#define ATA_CMD_TRUST_SEND 0x5E #define ATA_CMD_TRUST_SEND 0x5E
#define ATA_CMD_TRUST_SEND_DMA 0x5F #define ATA_CMD_TRUST_SEND_DMA 0x5F
// //
// Look up table (UdmaValid, IsWrite) for EFI_ATA_PASS_THRU_CMD_PROTOCOL // Look up table (UdmaValid, IsWrite) for EFI_ATA_PASS_THRU_CMD_PROTOCOL
// //
EFI_ATA_PASS_THRU_CMD_PROTOCOL mAtaPassThruCmdProtocols[][2] = { EFI_ATA_PASS_THRU_CMD_PROTOCOL mAtaPassThruCmdProtocols[][2] = {
{ {
EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN, EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN,
EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT
@ -42,7 +42,7 @@ EFI_ATA_PASS_THRU_CMD_PROTOCOL mAtaPassThruCmdProtocols[][2] = {
// //
// Look up table (UdmaValid, Lba48Bit, IsIsWrite) for ATA_CMD // Look up table (UdmaValid, Lba48Bit, IsIsWrite) for ATA_CMD
// //
UINT8 mAtaCommands[][2][2] = { UINT8 mAtaCommands[][2][2] = {
{ {
{ {
ATA_CMD_READ_SECTORS, // 28-bit LBA; PIO read ATA_CMD_READ_SECTORS, // 28-bit LBA; PIO read
@ -68,7 +68,7 @@ UINT8 mAtaCommands[][2][2] = {
// //
// Look up table (UdmaValid, IsTrustSend) for ATA_CMD // Look up table (UdmaValid, IsTrustSend) for ATA_CMD
// //
UINT8 mAtaTrustCommands[2][2] = { UINT8 mAtaTrustCommands[2][2] = {
{ {
ATA_CMD_TRUST_RECEIVE, // PIO read ATA_CMD_TRUST_RECEIVE, // PIO read
ATA_CMD_TRUST_SEND // PIO write ATA_CMD_TRUST_SEND // PIO write
@ -79,16 +79,14 @@ UINT8 mAtaTrustCommands[2][2] = {
} }
}; };
// //
// Look up table (Lba48Bit) for maximum transfer block number // Look up table (Lba48Bit) for maximum transfer block number
// //
UINTN mMaxTransferBlockNumber[] = { UINTN mMaxTransferBlockNumber[] = {
MAX_28BIT_TRANSFER_BLOCK_NUM, MAX_28BIT_TRANSFER_BLOCK_NUM,
MAX_48BIT_TRANSFER_BLOCK_NUM MAX_48BIT_TRANSFER_BLOCK_NUM
}; };
/** /**
Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.PassThru(). Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.PassThru().
@ -112,21 +110,21 @@ UINTN mMaxTransferBlockNumber[] = {
**/ **/
EFI_STATUS EFI_STATUS
AtaDevicePassThru ( AtaDevicePassThru (
IN OUT ATA_DEVICE *AtaDevice, IN OUT ATA_DEVICE *AtaDevice,
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL, IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL,
IN OUT EFI_EVENT Event OPTIONAL IN OUT EFI_EVENT Event OPTIONAL
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet; EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet;
// //
// Assemble packet. If it is non blocking mode, the Ata driver should keep each // Assemble packet. If it is non blocking mode, the Ata driver should keep each
// subtask and clean them when the event is signaled. // subtask and clean them when the event is signaled.
// //
if (TaskPacket != NULL) { if (TaskPacket != NULL) {
Packet = TaskPacket; Packet = TaskPacket;
Packet->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK)); Packet->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK));
if (Packet->Asb == NULL) { if (Packet->Asb == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -135,7 +133,7 @@ AtaDevicePassThru (
CopyMem (Packet->Asb, AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK)); CopyMem (Packet->Asb, AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));
Packet->Acb = AllocateCopyPool (sizeof (EFI_ATA_COMMAND_BLOCK), &AtaDevice->Acb); Packet->Acb = AllocateCopyPool (sizeof (EFI_ATA_COMMAND_BLOCK), &AtaDevice->Acb);
} else { } else {
Packet = &AtaDevice->Packet; Packet = &AtaDevice->Packet;
Packet->Asb = AtaDevice->Asb; Packet->Asb = AtaDevice->Asb;
Packet->Acb = &AtaDevice->Acb; Packet->Acb = &AtaDevice->Acb;
} }
@ -159,7 +157,6 @@ AtaDevicePassThru (
return Status; return Status;
} }
/** /**
Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.ResetDevice(). Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.ResetDevice().
@ -173,10 +170,10 @@ AtaDevicePassThru (
**/ **/
EFI_STATUS EFI_STATUS
ResetAtaDevice ( ResetAtaDevice (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
) )
{ {
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru; EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru; AtaPassThru = AtaDevice->AtaBusDriverData->AtaPassThru;
@ -196,7 +193,6 @@ ResetAtaDevice (
); );
} }
/** /**
Prints ATA model name to ATA device structure. Prints ATA model name to ATA device structure.
@ -216,20 +212,20 @@ PrintAtaModelName (
CHAR8 *Source; CHAR8 *Source;
CHAR16 *Destination; CHAR16 *Destination;
Source = AtaDevice->IdentifyData->ModelName; Source = AtaDevice->IdentifyData->ModelName;
Destination = AtaDevice->ModelName; Destination = AtaDevice->ModelName;
// //
// Swap the byte order in the original module name. // Swap the byte order in the original module name.
// //
for (Index = 0; Index < MAX_MODEL_NAME_LEN; Index += 2) { for (Index = 0; Index < MAX_MODEL_NAME_LEN; Index += 2) {
Destination[Index] = Source[Index + 1]; Destination[Index] = Source[Index + 1];
Destination[Index + 1] = Source[Index]; Destination[Index + 1] = Source[Index];
} }
AtaDevice->ModelName[MAX_MODEL_NAME_LEN] = L'\0'; AtaDevice->ModelName[MAX_MODEL_NAME_LEN] = L'\0';
} }
/** /**
Gets ATA device Capacity according to ATA 6. Gets ATA device Capacity according to ATA 6.
@ -244,13 +240,13 @@ PrintAtaModelName (
**/ **/
EFI_LBA EFI_LBA
GetAtapi6Capacity ( GetAtapi6Capacity (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
) )
{ {
EFI_LBA Capacity; EFI_LBA Capacity;
EFI_LBA TmpLba; EFI_LBA TmpLba;
UINTN Index; UINTN Index;
ATA_IDENTIFY_DATA *IdentifyData; ATA_IDENTIFY_DATA *IdentifyData;
IdentifyData = AtaDevice->IdentifyData; IdentifyData = AtaDevice->IdentifyData;
if ((IdentifyData->command_set_supported_83 & BIT10) == 0) { if ((IdentifyData->command_set_supported_83 & BIT10) == 0) {
@ -268,14 +264,13 @@ GetAtapi6Capacity (
// //
// Lower byte goes first: word[100] is the lowest word, word[103] is highest // Lower byte goes first: word[100] is the lowest word, word[103] is highest
// //
TmpLba = IdentifyData->maximum_lba_for_48bit_addressing[Index]; TmpLba = IdentifyData->maximum_lba_for_48bit_addressing[Index];
Capacity |= LShiftU64 (TmpLba, 16 * Index); Capacity |= LShiftU64 (TmpLba, 16 * Index);
} }
return Capacity; return Capacity;
} }
/** /**
Identifies ATA device via the Identify data. Identifies ATA device via the Identify data.
@ -291,14 +286,14 @@ GetAtapi6Capacity (
**/ **/
EFI_STATUS EFI_STATUS
IdentifyAtaDevice ( IdentifyAtaDevice (
IN OUT ATA_DEVICE *AtaDevice IN OUT ATA_DEVICE *AtaDevice
) )
{ {
ATA_IDENTIFY_DATA *IdentifyData; ATA_IDENTIFY_DATA *IdentifyData;
EFI_BLOCK_IO_MEDIA *BlockMedia; EFI_BLOCK_IO_MEDIA *BlockMedia;
EFI_LBA Capacity; EFI_LBA Capacity;
UINT16 PhyLogicSectorSupport; UINT16 PhyLogicSectorSupport;
UINT16 UdmaMode; UINT16 UdmaMode;
IdentifyData = AtaDevice->IdentifyData; IdentifyData = AtaDevice->IdentifyData;
@ -334,16 +329,16 @@ IdentifyAtaDevice (
// //
// This is a hard disk <= 120GB capacity, treat it as normal hard disk // This is a hard disk <= 120GB capacity, treat it as normal hard disk
// //
Capacity = ((UINT32)IdentifyData->user_addressable_sectors_hi << 16) | IdentifyData->user_addressable_sectors_lo; Capacity = ((UINT32)IdentifyData->user_addressable_sectors_hi << 16) | IdentifyData->user_addressable_sectors_lo;
AtaDevice->Lba48Bit = FALSE; AtaDevice->Lba48Bit = FALSE;
} }
// //
// Block Media Information: // Block Media Information:
// //
BlockMedia = &AtaDevice->BlockMedia; BlockMedia = &AtaDevice->BlockMedia;
BlockMedia->LastBlock = Capacity - 1; BlockMedia->LastBlock = Capacity - 1;
BlockMedia->IoAlign = AtaDevice->AtaBusDriverData->AtaPassThru->Mode->IoAlign; BlockMedia->IoAlign = AtaDevice->AtaBusDriverData->AtaPassThru->Mode->IoAlign;
// //
// Check whether Long Physical Sector Feature is supported // Check whether Long Physical Sector Feature is supported
// //
@ -353,23 +348,26 @@ IdentifyAtaDevice (
// Check whether one physical block contains multiple physical blocks // Check whether one physical block contains multiple physical blocks
// //
if ((PhyLogicSectorSupport & BIT13) != 0) { if ((PhyLogicSectorSupport & BIT13) != 0) {
BlockMedia->LogicalBlocksPerPhysicalBlock = (UINT32) (1 << (PhyLogicSectorSupport & 0x000f)); BlockMedia->LogicalBlocksPerPhysicalBlock = (UINT32)(1 << (PhyLogicSectorSupport & 0x000f));
// //
// Check lowest alignment of logical blocks within physical block // Check lowest alignment of logical blocks within physical block
// //
if ((IdentifyData->alignment_logic_in_phy_blocks & (BIT14 | BIT15)) == BIT14) { if ((IdentifyData->alignment_logic_in_phy_blocks & (BIT14 | BIT15)) == BIT14) {
BlockMedia->LowestAlignedLba = (EFI_LBA) ((BlockMedia->LogicalBlocksPerPhysicalBlock - ((UINT32)IdentifyData->alignment_logic_in_phy_blocks & 0x3fff)) % BlockMedia->LowestAlignedLba = (EFI_LBA)((BlockMedia->LogicalBlocksPerPhysicalBlock - ((UINT32)IdentifyData->alignment_logic_in_phy_blocks & 0x3fff)) %
BlockMedia->LogicalBlocksPerPhysicalBlock); BlockMedia->LogicalBlocksPerPhysicalBlock);
} }
} }
// //
// Check logical block size // Check logical block size
// //
if ((PhyLogicSectorSupport & BIT12) != 0) { if ((PhyLogicSectorSupport & BIT12) != 0) {
BlockMedia->BlockSize = (UINT32) (((IdentifyData->logic_sector_size_hi << 16) | IdentifyData->logic_sector_size_lo) * sizeof (UINT16)); BlockMedia->BlockSize = (UINT32)(((IdentifyData->logic_sector_size_hi << 16) | IdentifyData->logic_sector_size_lo) * sizeof (UINT16));
} }
AtaDevice->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2; AtaDevice->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
} }
// //
// Get ATA model name from identify data structure. // Get ATA model name from identify data structure.
// //
@ -378,7 +376,6 @@ IdentifyAtaDevice (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Discovers whether it is a valid ATA device. Discovers whether it is a valid ATA device.
@ -395,7 +392,7 @@ IdentifyAtaDevice (
**/ **/
EFI_STATUS EFI_STATUS
DiscoverAtaDevice ( DiscoverAtaDevice (
IN OUT ATA_DEVICE *AtaDevice IN OUT ATA_DEVICE *AtaDevice
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -406,19 +403,19 @@ DiscoverAtaDevice (
// //
// Prepare for ATA command block. // Prepare for ATA command block.
// //
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK)); Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
Acb->AtaCommand = ATA_CMD_IDENTIFY_DRIVE; Acb->AtaCommand = ATA_CMD_IDENTIFY_DRIVE;
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4))); Acb->AtaDeviceHead = (UINT8)(BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
// //
// Prepare for ATA pass through packet. // Prepare for ATA pass through packet.
// //
Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET)); Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
Packet->InDataBuffer = AtaDevice->IdentifyData; Packet->InDataBuffer = AtaDevice->IdentifyData;
Packet->InTransferLength = sizeof (ATA_IDENTIFY_DATA); Packet->InTransferLength = sizeof (ATA_IDENTIFY_DATA);
Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN; Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN;
Packet->Length = EFI_ATA_PASS_THRU_LENGTH_BYTES | EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT; Packet->Length = EFI_ATA_PASS_THRU_LENGTH_BYTES | EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;
Packet->Timeout = ATA_TIMEOUT; Packet->Timeout = ATA_TIMEOUT;
Retry = MAX_RETRY_TIMES; Retry = MAX_RETRY_TIMES;
do { do {
@ -463,13 +460,13 @@ DiscoverAtaDevice (
**/ **/
EFI_STATUS EFI_STATUS
TransferAtaDevice ( TransferAtaDevice (
IN OUT ATA_DEVICE *AtaDevice, IN OUT ATA_DEVICE *AtaDevice,
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL, IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL,
IN OUT VOID *Buffer, IN OUT VOID *Buffer,
IN EFI_LBA StartLba, IN EFI_LBA StartLba,
IN UINT32 TransferLength, IN UINT32 TransferLength,
IN BOOLEAN IsWrite, IN BOOLEAN IsWrite,
IN EFI_EVENT Event OPTIONAL IN EFI_EVENT Event OPTIONAL
) )
{ {
EFI_ATA_COMMAND_BLOCK *Acb; EFI_ATA_COMMAND_BLOCK *Acb;
@ -478,26 +475,26 @@ TransferAtaDevice (
// //
// Ensure AtaDevice->UdmaValid, AtaDevice->Lba48Bit and IsWrite are valid boolean values // Ensure AtaDevice->UdmaValid, AtaDevice->Lba48Bit and IsWrite are valid boolean values
// //
ASSERT ((UINTN) AtaDevice->UdmaValid < 2); ASSERT ((UINTN)AtaDevice->UdmaValid < 2);
ASSERT ((UINTN) AtaDevice->Lba48Bit < 2); ASSERT ((UINTN)AtaDevice->Lba48Bit < 2);
ASSERT ((UINTN) IsWrite < 2); ASSERT ((UINTN)IsWrite < 2);
// //
// Prepare for ATA command block. // Prepare for ATA command block.
// //
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK)); Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
Acb->AtaCommand = mAtaCommands[AtaDevice->UdmaValid][AtaDevice->Lba48Bit][IsWrite]; Acb->AtaCommand = mAtaCommands[AtaDevice->UdmaValid][AtaDevice->Lba48Bit][IsWrite];
Acb->AtaSectorNumber = (UINT8) StartLba; Acb->AtaSectorNumber = (UINT8)StartLba;
Acb->AtaCylinderLow = (UINT8) RShiftU64 (StartLba, 8); Acb->AtaCylinderLow = (UINT8)RShiftU64 (StartLba, 8);
Acb->AtaCylinderHigh = (UINT8) RShiftU64 (StartLba, 16); Acb->AtaCylinderHigh = (UINT8)RShiftU64 (StartLba, 16);
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4))); Acb->AtaDeviceHead = (UINT8)(BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
Acb->AtaSectorCount = (UINT8) TransferLength; Acb->AtaSectorCount = (UINT8)TransferLength;
if (AtaDevice->Lba48Bit) { if (AtaDevice->Lba48Bit) {
Acb->AtaSectorNumberExp = (UINT8) RShiftU64 (StartLba, 24); Acb->AtaSectorNumberExp = (UINT8)RShiftU64 (StartLba, 24);
Acb->AtaCylinderLowExp = (UINT8) RShiftU64 (StartLba, 32); Acb->AtaCylinderLowExp = (UINT8)RShiftU64 (StartLba, 32);
Acb->AtaCylinderHighExp = (UINT8) RShiftU64 (StartLba, 40); Acb->AtaCylinderHighExp = (UINT8)RShiftU64 (StartLba, 40);
Acb->AtaSectorCountExp = (UINT8) (TransferLength >> 8); Acb->AtaSectorCountExp = (UINT8)(TransferLength >> 8);
} else { } else {
Acb->AtaDeviceHead = (UINT8) (Acb->AtaDeviceHead | RShiftU64 (StartLba, 24)); Acb->AtaDeviceHead = (UINT8)(Acb->AtaDeviceHead | RShiftU64 (StartLba, 24));
} }
// //
@ -510,15 +507,15 @@ TransferAtaDevice (
} }
if (IsWrite) { if (IsWrite) {
Packet->OutDataBuffer = Buffer; Packet->OutDataBuffer = Buffer;
Packet->OutTransferLength = TransferLength; Packet->OutTransferLength = TransferLength;
} else { } else {
Packet->InDataBuffer = Buffer; Packet->InDataBuffer = Buffer;
Packet->InTransferLength = TransferLength; Packet->InTransferLength = TransferLength;
} }
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsWrite]; Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsWrite];
Packet->Length = EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT; Packet->Length = EFI_ATA_PASS_THRU_LENGTH_SECTOR_COUNT;
// //
// |------------------------|-----------------|------------------------|-----------------| // |------------------------|-----------------|------------------------|-----------------|
// | ATA PIO Transfer Mode | Transfer Rate | ATA DMA Transfer Mode | Transfer Rate | // | ATA PIO Transfer Mode | Transfer Rate | ATA DMA Transfer Mode | Transfer Rate |
@ -544,12 +541,12 @@ TransferAtaDevice (
// //
// Calculate the maximum timeout value for DMA read/write operation. // Calculate the maximum timeout value for DMA read/write operation.
// //
Packet->Timeout = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 (TransferLength, AtaDevice->BlockMedia.BlockSize), 2100000) + 31); Packet->Timeout = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 (TransferLength, AtaDevice->BlockMedia.BlockSize), 2100000) + 31);
} else { } else {
// //
// Calculate the maximum timeout value for PIO read/write operation // Calculate the maximum timeout value for PIO read/write operation
// //
Packet->Timeout = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 (TransferLength, AtaDevice->BlockMedia.BlockSize), 3300000) + 31); Packet->Timeout = EFI_TIMER_PERIOD_SECONDS (DivU64x32 (MultU64x32 (TransferLength, AtaDevice->BlockMedia.BlockSize), 3300000) + 31);
} }
return AtaDevicePassThru (AtaDevice, TaskPacket, Event); return AtaDevicePassThru (AtaDevice, TaskPacket, Event);
@ -570,6 +567,7 @@ FreeAtaSubTask (
if (Task->Packet.Asb != NULL) { if (Task->Packet.Asb != NULL) {
FreeAlignedBuffer (Task->Packet.Asb, sizeof (EFI_ATA_STATUS_BLOCK)); FreeAlignedBuffer (Task->Packet.Asb, sizeof (EFI_ATA_STATUS_BLOCK));
} }
if (Task->Packet.Acb != NULL) { if (Task->Packet.Acb != NULL) {
FreePool (Task->Packet.Acb); FreePool (Task->Packet.Acb);
} }
@ -590,14 +588,14 @@ FreeAtaSubTask (
VOID VOID
EFIAPI EFIAPI
AtaTerminateNonBlockingTask ( AtaTerminateNonBlockingTask (
IN ATA_DEVICE *AtaDevice IN ATA_DEVICE *AtaDevice
) )
{ {
BOOLEAN SubTaskEmpty; BOOLEAN SubTaskEmpty;
EFI_TPL OldTpl; EFI_TPL OldTpl;
ATA_BUS_ASYN_TASK *AtaTask; ATA_BUS_ASYN_TASK *AtaTask;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
LIST_ENTRY *List; LIST_ENTRY *List;
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
// //
@ -607,13 +605,14 @@ AtaTerminateNonBlockingTask (
List = &AtaDevice->AtaTaskList; List = &AtaDevice->AtaTaskList;
for (Entry = GetFirstNode (List); !IsNull (List, Entry);) { for (Entry = GetFirstNode (List); !IsNull (List, Entry);) {
AtaTask = ATA_ASYN_TASK_FROM_ENTRY (Entry); AtaTask = ATA_ASYN_TASK_FROM_ENTRY (Entry);
AtaTask->Token->TransactionStatus = EFI_ABORTED; AtaTask->Token->TransactionStatus = EFI_ABORTED;
gBS->SignalEvent (AtaTask->Token->Event); gBS->SignalEvent (AtaTask->Token->Event);
Entry = RemoveEntryList (Entry); Entry = RemoveEntryList (Entry);
FreePool (AtaTask); FreePool (AtaTask);
} }
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
do { do {
@ -628,7 +627,7 @@ AtaTerminateNonBlockingTask (
// //
// Aborting operation has been done. From now on, don't need to abort normal operation. // Aborting operation has been done. From now on, don't need to abort normal operation.
// //
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
AtaDevice->Abort = FALSE; AtaDevice->Abort = FALSE;
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
} }
@ -644,17 +643,17 @@ AtaTerminateNonBlockingTask (
VOID VOID
EFIAPI EFIAPI
AtaNonBlockingCallBack ( AtaNonBlockingCallBack (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
ATA_BUS_ASYN_SUB_TASK *Task; ATA_BUS_ASYN_SUB_TASK *Task;
ATA_BUS_ASYN_TASK *AtaTask; ATA_BUS_ASYN_TASK *AtaTask;
ATA_DEVICE *AtaDevice; ATA_DEVICE *AtaDevice;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
EFI_STATUS Status; EFI_STATUS Status;
Task = (ATA_BUS_ASYN_SUB_TASK *) Context; Task = (ATA_BUS_ASYN_SUB_TASK *)Context;
gBS->CloseEvent (Event); gBS->CloseEvent (Event);
AtaDevice = Task->AtaDevice; AtaDevice = Task->AtaDevice;
@ -682,7 +681,7 @@ AtaNonBlockingCallBack (
// //
// Reduce the SubEventCount, till it comes to zero. // Reduce the SubEventCount, till it comes to zero.
// //
(*Task->UnsignalledEventCount) --; (*Task->UnsignalledEventCount)--;
DEBUG ((DEBUG_BLKIO, "UnsignalledEventCount = %d\n", *Task->UnsignalledEventCount)); DEBUG ((DEBUG_BLKIO, "UnsignalledEventCount = %d\n", *Task->UnsignalledEventCount));
// //
@ -702,7 +701,6 @@ AtaNonBlockingCallBack (
FreePool (Task->UnsignalledEventCount); FreePool (Task->UnsignalledEventCount);
FreePool (Task->IsError); FreePool (Task->IsError);
// //
// Finish all subtasks and move to the next task in AtaTaskList. // Finish all subtasks and move to the next task in AtaTaskList.
// //
@ -723,6 +721,7 @@ AtaNonBlockingCallBack (
AtaTask->Token->TransactionStatus = Status; AtaTask->Token->TransactionStatus = Status;
gBS->SignalEvent (AtaTask->Token->Event); gBS->SignalEvent (AtaTask->Token->Event);
} }
RemoveEntryList (Entry); RemoveEntryList (Entry);
FreePool (AtaTask); FreePool (AtaTask);
} }
@ -763,27 +762,27 @@ AtaNonBlockingCallBack (
**/ **/
EFI_STATUS EFI_STATUS
AccessAtaDevice( AccessAtaDevice (
IN OUT ATA_DEVICE *AtaDevice, IN OUT ATA_DEVICE *AtaDevice,
IN OUT UINT8 *Buffer, IN OUT UINT8 *Buffer,
IN EFI_LBA StartLba, IN EFI_LBA StartLba,
IN UINTN NumberOfBlocks, IN UINTN NumberOfBlocks,
IN BOOLEAN IsWrite, IN BOOLEAN IsWrite,
IN OUT EFI_BLOCK_IO2_TOKEN *Token IN OUT EFI_BLOCK_IO2_TOKEN *Token
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN MaxTransferBlockNumber; UINTN MaxTransferBlockNumber;
UINTN TransferBlockNumber; UINTN TransferBlockNumber;
UINTN BlockSize; UINTN BlockSize;
ATA_BUS_ASYN_SUB_TASK *SubTask; ATA_BUS_ASYN_SUB_TASK *SubTask;
UINTN *EventCount; UINTN *EventCount;
UINTN TempCount; UINTN TempCount;
ATA_BUS_ASYN_TASK *AtaTask; ATA_BUS_ASYN_TASK *AtaTask;
EFI_EVENT SubEvent; EFI_EVENT SubEvent;
UINTN Index; UINTN Index;
BOOLEAN *IsError; BOOLEAN *IsError;
EFI_TPL OldTpl; EFI_TPL OldTpl;
TempCount = 0; TempCount = 0;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
@ -797,7 +796,7 @@ AccessAtaDevice(
// //
// Ensure AtaDevice->Lba48Bit is a valid boolean value // Ensure AtaDevice->Lba48Bit is a valid boolean value
// //
ASSERT ((UINTN) AtaDevice->Lba48Bit < 2); ASSERT ((UINTN)AtaDevice->Lba48Bit < 2);
MaxTransferBlockNumber = mMaxTransferBlockNumber[AtaDevice->Lba48Bit]; MaxTransferBlockNumber = mMaxTransferBlockNumber[AtaDevice->Lba48Bit];
BlockSize = AtaDevice->BlockMedia.BlockSize; BlockSize = AtaDevice->BlockMedia.BlockSize;
@ -813,6 +812,7 @@ AccessAtaDevice(
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
AtaTask->AtaDevice = AtaDevice; AtaTask->AtaDevice = AtaDevice;
AtaTask->Buffer = Buffer; AtaTask->Buffer = Buffer;
AtaTask->IsWrite = IsWrite; AtaTask->IsWrite = IsWrite;
@ -825,10 +825,11 @@ AccessAtaDevice(
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
Token->TransactionStatus = EFI_SUCCESS; Token->TransactionStatus = EFI_SUCCESS;
EventCount = AllocateZeroPool (sizeof (UINTN)); EventCount = AllocateZeroPool (sizeof (UINTN));
if (EventCount == NULL) { if (EventCount == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -838,8 +839,9 @@ AccessAtaDevice(
FreePool (EventCount); FreePool (EventCount);
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
DEBUG ((DEBUG_BLKIO, "Allocation IsError Addr=%x\n", IsError)); DEBUG ((DEBUG_BLKIO, "Allocation IsError Addr=%x\n", IsError));
*IsError = FALSE; *IsError = FALSE;
TempCount = (NumberOfBlocks + MaxTransferBlockNumber - 1) / MaxTransferBlockNumber; TempCount = (NumberOfBlocks + MaxTransferBlockNumber - 1) / MaxTransferBlockNumber;
*EventCount = TempCount; *EventCount = TempCount;
DEBUG ((DEBUG_BLKIO, "AccessAtaDevice, NumberOfBlocks=%x\n", NumberOfBlocks)); DEBUG ((DEBUG_BLKIO, "AccessAtaDevice, NumberOfBlocks=%x\n", NumberOfBlocks));
@ -858,7 +860,7 @@ AccessAtaDevice(
if (NumberOfBlocks > MaxTransferBlockNumber) { if (NumberOfBlocks > MaxTransferBlockNumber) {
TransferBlockNumber = MaxTransferBlockNumber; TransferBlockNumber = MaxTransferBlockNumber;
NumberOfBlocks -= MaxTransferBlockNumber; NumberOfBlocks -= MaxTransferBlockNumber;
} else { } else {
TransferBlockNumber = NumberOfBlocks; TransferBlockNumber = NumberOfBlocks;
NumberOfBlocks = 0; NumberOfBlocks = 0;
} }
@ -876,7 +878,7 @@ AccessAtaDevice(
goto EXIT; goto EXIT;
} }
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
SubTask->UnsignalledEventCount = EventCount; SubTask->UnsignalledEventCount = EventCount;
SubTask->Signature = ATA_SUB_TASK_SIGNATURE; SubTask->Signature = ATA_SUB_TASK_SIGNATURE;
SubTask->AtaDevice = AtaDevice; SubTask->AtaDevice = AtaDevice;
@ -901,13 +903,13 @@ AccessAtaDevice(
goto EXIT; goto EXIT;
} }
Status = TransferAtaDevice (AtaDevice, &SubTask->Packet, Buffer, StartLba, (UINT32) TransferBlockNumber, IsWrite, SubEvent); Status = TransferAtaDevice (AtaDevice, &SubTask->Packet, Buffer, StartLba, (UINT32)TransferBlockNumber, IsWrite, SubEvent);
} else { } else {
// //
// Blocking Mode. // Blocking Mode.
// //
DEBUG ((DEBUG_BLKIO, "Blocking AccessAtaDevice, TransferBlockNumber=%x; StartLba = %x\n", TransferBlockNumber, StartLba)); DEBUG ((DEBUG_BLKIO, "Blocking AccessAtaDevice, TransferBlockNumber=%x; StartLba = %x\n", TransferBlockNumber, StartLba));
Status = TransferAtaDevice (AtaDevice, NULL, Buffer, StartLba, (UINT32) TransferBlockNumber, IsWrite, NULL); Status = TransferAtaDevice (AtaDevice, NULL, Buffer, StartLba, (UINT32)TransferBlockNumber, IsWrite, NULL);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -925,10 +927,10 @@ EXIT:
// Release resource at non-blocking mode. // Release resource at non-blocking mode.
// //
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
OldTpl = gBS->RaiseTPL (TPL_NOTIFY); OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
Token->TransactionStatus = Status; Token->TransactionStatus = Status;
*EventCount = (*EventCount) - (TempCount - Index); *EventCount = (*EventCount) - (TempCount - Index);
*IsError = TRUE; *IsError = TRUE;
if (*EventCount == 0) { if (*EventCount == 0) {
FreePool (EventCount); FreePool (EventCount);
@ -943,6 +945,7 @@ EXIT:
if (SubEvent != NULL) { if (SubEvent != NULL) {
gBS->CloseEvent (SubEvent); gBS->CloseEvent (SubEvent);
} }
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
} }
} }
@ -982,14 +985,14 @@ EXIT:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
TrustTransferAtaDevice ( TrustTransferAtaDevice (
IN OUT ATA_DEVICE *AtaDevice, IN OUT ATA_DEVICE *AtaDevice,
IN OUT VOID *Buffer, IN OUT VOID *Buffer,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN TransferLength, IN UINTN TransferLength,
IN BOOLEAN IsTrustSend, IN BOOLEAN IsTrustSend,
IN UINT64 Timeout, IN UINT64 Timeout,
OUT UINTN *TransferLengthOut OUT UINTN *TransferLengthOut
) )
{ {
EFI_ATA_COMMAND_BLOCK *Acb; EFI_ATA_COMMAND_BLOCK *Acb;
@ -1001,27 +1004,28 @@ TrustTransferAtaDevice (
// //
// Ensure AtaDevice->UdmaValid and IsTrustSend are valid boolean values // Ensure AtaDevice->UdmaValid and IsTrustSend are valid boolean values
// //
ASSERT ((UINTN) AtaDevice->UdmaValid < 2); ASSERT ((UINTN)AtaDevice->UdmaValid < 2);
ASSERT ((UINTN) IsTrustSend < 2); ASSERT ((UINTN)IsTrustSend < 2);
// //
// Prepare for ATA command block. // Prepare for ATA command block.
// //
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK)); Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
if (TransferLength == 0) { if (TransferLength == 0) {
Acb->AtaCommand = ATA_CMD_TRUST_NON_DATA; Acb->AtaCommand = ATA_CMD_TRUST_NON_DATA;
} else { } else {
Acb->AtaCommand = mAtaTrustCommands[AtaDevice->UdmaValid][IsTrustSend]; Acb->AtaCommand = mAtaTrustCommands[AtaDevice->UdmaValid][IsTrustSend];
} }
Acb->AtaFeatures = SecurityProtocolId;
Acb->AtaSectorCount = (UINT8) (TransferLength / 512); Acb->AtaFeatures = SecurityProtocolId;
Acb->AtaSectorNumber = (UINT8) ((TransferLength / 512) >> 8); Acb->AtaSectorCount = (UINT8)(TransferLength / 512);
Acb->AtaSectorNumber = (UINT8)((TransferLength / 512) >> 8);
// //
// NOTE: ATA Spec has no explicitly definition for Security Protocol Specific layout. // NOTE: ATA Spec has no explicitly definition for Security Protocol Specific layout.
// Here use big endian for Cylinder register. // Here use big endian for Cylinder register.
// //
Acb->AtaCylinderHigh = (UINT8) SecurityProtocolSpecificData; Acb->AtaCylinderHigh = (UINT8)SecurityProtocolSpecificData;
Acb->AtaCylinderLow = (UINT8) (SecurityProtocolSpecificData >> 8); Acb->AtaCylinderLow = (UINT8)(SecurityProtocolSpecificData >> 8);
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4))); Acb->AtaDeviceHead = (UINT8)(BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
// //
// Prepare for ATA pass through packet. // Prepare for ATA pass through packet.
@ -1030,7 +1034,7 @@ TrustTransferAtaDevice (
if (TransferLength == 0) { if (TransferLength == 0) {
Packet->InTransferLength = 0; Packet->InTransferLength = 0;
Packet->OutTransferLength = 0; Packet->OutTransferLength = 0;
Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA; Packet->Protocol = EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA;
} else if (IsTrustSend) { } else if (IsTrustSend) {
// //
// Check the alignment of the incoming buffer prior to invoking underlying ATA PassThru // Check the alignment of the incoming buffer prior to invoking underlying ATA PassThru
@ -1046,22 +1050,25 @@ TrustTransferAtaDevice (
FreePool (Buffer); FreePool (Buffer);
Buffer = NewBuffer; Buffer = NewBuffer;
} }
Packet->OutDataBuffer = Buffer;
Packet->OutTransferLength = (UINT32) TransferLength; Packet->OutDataBuffer = Buffer;
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend]; Packet->OutTransferLength = (UINT32)TransferLength;
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
} else { } else {
Packet->InDataBuffer = Buffer; Packet->InDataBuffer = Buffer;
Packet->InTransferLength = (UINT32) TransferLength; Packet->InTransferLength = (UINT32)TransferLength;
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend]; Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
} }
Packet->Length = EFI_ATA_PASS_THRU_LENGTH_BYTES;
Packet->Timeout = Timeout; Packet->Length = EFI_ATA_PASS_THRU_LENGTH_BYTES;
Packet->Timeout = Timeout;
Status = AtaDevicePassThru (AtaDevice, NULL, NULL); Status = AtaDevicePassThru (AtaDevice, NULL, NULL);
if (TransferLengthOut != NULL) { if (TransferLengthOut != NULL) {
if (! IsTrustSend) { if (!IsTrustSend) {
*TransferLengthOut = Packet->InTransferLength; *TransferLengthOut = Packet->InTransferLength;
} }
} }
return Status; return Status;
} }

View File

@ -11,20 +11,19 @@
// //
// Driver name table // Driver name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaBusDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaBusDriverNameTable[] = {
{ "eng;en", L"ATA Bus Driver" }, { "eng;en", L"ATA Bus Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
// Controller name table // Controller name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaBusControllerNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mAtaBusControllerNameTable[] = {
{ "eng;en", L"ATA Controller" }, { "eng;en", L"ATA Controller" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
@ -37,9 +36,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gAtaBusComponentName
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) AtaBusComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)AtaBusComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) AtaBusComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)AtaBusComponentNameGetControllerName,
"en" "en"
}; };
@ -99,7 +98,6 @@ AtaBusComponentNameGetDriverName (
); );
} }
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -171,11 +169,11 @@ AtaBusComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtaBusComponentNameGetControllerName ( AtaBusComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -205,13 +203,14 @@ AtaBusComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Get the child context // Get the child context
// //
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ChildHandle, ChildHandle,
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlockIo, (VOID **)&BlockIo,
gAtaBusDriverBinding.DriverBindingHandle, gAtaBusDriverBinding.DriverBindingHandle,
ChildHandle, ChildHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -219,9 +218,11 @@ AtaBusComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO (BlockIo);
ControllerNameTable =AtaDevice->ControllerNameTable; AtaDevice = ATA_DEVICE_FROM_BLOCK_IO (BlockIo);
ControllerNameTable = AtaDevice->ControllerNameTable;
} }
return LookupUnicodeString2 ( return LookupUnicodeString2 (
Language, Language,
This->SupportedLanguages, This->SupportedLanguages,

View File

@ -12,7 +12,7 @@
// //
// EFI_DRIVER_BINDING_PROTOCOL instance // EFI_DRIVER_BINDING_PROTOCOL instance
// //
EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = { EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {
I2cBusDriverSupported, I2cBusDriverSupported,
I2cBusDriverStart, I2cBusDriverStart,
I2cBusDriverStop, I2cBusDriverStop,
@ -24,7 +24,7 @@ EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {
// //
// Template for I2C Bus Child Device. // Template for I2C Bus Child Device.
// //
I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = { I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {
I2C_DEVICE_SIGNATURE, I2C_DEVICE_SIGNATURE,
NULL, NULL,
{ // I2cIo Protocol { // I2cIo Protocol
@ -42,13 +42,13 @@ I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {
// //
// Template for controller device path node. // Template for controller device path node.
// //
CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = { CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {
{ {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_CONTROLLER_DP, HW_CONTROLLER_DP,
{ {
(UINT8) (sizeof (CONTROLLER_DEVICE_PATH)), (UINT8)(sizeof (CONTROLLER_DEVICE_PATH)),
(UINT8) ((sizeof (CONTROLLER_DEVICE_PATH)) >> 8) (UINT8)((sizeof (CONTROLLER_DEVICE_PATH)) >> 8)
} }
}, },
0 0
@ -57,39 +57,40 @@ CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {
// //
// Template for vendor device path node. // Template for vendor device path node.
// //
VENDOR_DEVICE_PATH gVendorDevicePathTemplate = { VENDOR_DEVICE_PATH gVendorDevicePathTemplate = {
{ {
HARDWARE_DEVICE_PATH, HARDWARE_DEVICE_PATH,
HW_VENDOR_DP, HW_VENDOR_DP,
{ {
(UINT8) (sizeof (VENDOR_DEVICE_PATH)), (UINT8)(sizeof (VENDOR_DEVICE_PATH)),
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8) (UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
} }
}, },
{ 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }} { 0x0, 0x0, 0x0, { 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0, 0x0 }
}
}; };
// //
// Driver name table // Driver name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cBusDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cBusDriverNameTable[] = {
{ "eng;en", (CHAR16 *) L"I2C Bus Driver" }, { "eng;en", (CHAR16 *)L"I2C Bus Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName = {
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) I2cBusComponentNameGetDriverName, (EFI_COMPONENT_NAME_GET_DRIVER_NAME)I2cBusComponentNameGetDriverName,
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) I2cBusComponentNameGetControllerName, (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)I2cBusComponentNameGetControllerName,
"eng" "eng"
}; };
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2 = {
I2cBusComponentNameGetDriverName, I2cBusComponentNameGetDriverName,
I2cBusComponentNameGetControllerName, I2cBusComponentNameGetControllerName,
"en" "en"
@ -138,8 +139,8 @@ EFI_STATUS
EFIAPI EFIAPI
I2cBusComponentNameGetDriverName ( I2cBusComponentNameGetDriverName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
) )
{ {
return LookupUnicodeString2 ( return LookupUnicodeString2 (
@ -222,11 +223,11 @@ I2cBusComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cBusComponentNameGetControllerName ( I2cBusComponentNameGetControllerName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
@ -254,16 +255,16 @@ CheckRemainingDevicePath (
IN UINT32 RemainingControllerNumber IN UINT32 RemainingControllerNumber
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *SystemDevicePath; EFI_DEVICE_PATH_PROTOCOL *SystemDevicePath;
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer; EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
UINTN EntryCount; UINTN EntryCount;
UINTN Index; UINTN Index;
BOOLEAN SystemHasControllerNode; BOOLEAN SystemHasControllerNode;
UINT32 SystemControllerNumber; UINT32 SystemControllerNumber;
SystemHasControllerNode = FALSE; SystemHasControllerNode = FALSE;
SystemControllerNumber = 0; SystemControllerNumber = 0;
Status = gBS->OpenProtocolInformation ( Status = gBS->OpenProtocolInformation (
Controller, Controller,
@ -280,7 +281,7 @@ CheckRemainingDevicePath (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
OpenInfoBuffer[Index].ControllerHandle, OpenInfoBuffer[Index].ControllerHandle,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &SystemDevicePath, (VOID **)&SystemDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -291,7 +292,8 @@ CheckRemainingDevicePath (
// //
while (!IsDevicePathEnd (SystemDevicePath)) { while (!IsDevicePathEnd (SystemDevicePath)) {
if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) && if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) &&
(DevicePathSubType (SystemDevicePath) == HW_VENDOR_DP)) { (DevicePathSubType (SystemDevicePath) == HW_VENDOR_DP))
{
// //
// Check if vendor device path is same between system device path and remaining device path // Check if vendor device path is same between system device path and remaining device path
// //
@ -301,31 +303,37 @@ CheckRemainingDevicePath (
// //
SystemDevicePath = NextDevicePathNode (SystemDevicePath); SystemDevicePath = NextDevicePathNode (SystemDevicePath);
if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) && if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) &&
(DevicePathSubType (SystemDevicePath) == HW_CONTROLLER_DP)) { (DevicePathSubType (SystemDevicePath) == HW_CONTROLLER_DP))
{
SystemHasControllerNode = TRUE; SystemHasControllerNode = TRUE;
SystemControllerNumber = ((CONTROLLER_DEVICE_PATH *) SystemDevicePath)->ControllerNumber; SystemControllerNumber = ((CONTROLLER_DEVICE_PATH *)SystemDevicePath)->ControllerNumber;
} else { } else {
SystemHasControllerNode = FALSE; SystemHasControllerNode = FALSE;
SystemControllerNumber = 0; SystemControllerNumber = 0;
} }
if (((SystemHasControllerNode) && (!RemainingHasControllerNode) && (SystemControllerNumber == 0)) || if (((SystemHasControllerNode) && (!RemainingHasControllerNode) && (SystemControllerNumber == 0)) ||
((!SystemHasControllerNode) && (RemainingHasControllerNode) && (RemainingControllerNumber == 0)) || ((!SystemHasControllerNode) && (RemainingHasControllerNode) && (RemainingControllerNumber == 0)) ||
((SystemHasControllerNode) && (RemainingHasControllerNode) && (SystemControllerNumber == RemainingControllerNumber)) || ((SystemHasControllerNode) && (RemainingHasControllerNode) && (SystemControllerNumber == RemainingControllerNumber)) ||
((!SystemHasControllerNode) && (!RemainingHasControllerNode))) { ((!SystemHasControllerNode) && (!RemainingHasControllerNode)))
DEBUG ((DEBUG_ERROR, "This I2C device has been already started.\n")); {
Status = EFI_UNSUPPORTED; DEBUG ((DEBUG_ERROR, "This I2C device has been already started.\n"));
break; Status = EFI_UNSUPPORTED;
break;
} }
} }
} }
SystemDevicePath = NextDevicePathNode (SystemDevicePath); SystemDevicePath = NextDevicePathNode (SystemDevicePath);
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
} }
} }
} }
} }
FreePool (OpenInfoBuffer); FreePool (OpenInfoBuffer);
return Status; return Status;
} }
@ -380,16 +388,16 @@ I2cBusDriverSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate; EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
EFI_I2C_HOST_PROTOCOL *I2cHost; EFI_I2C_HOST_PROTOCOL *I2cHost;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_DEVICE_PATH_PROTOCOL *DevPathNode; EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
BOOLEAN RemainingHasControllerNode; BOOLEAN RemainingHasControllerNode;
UINT32 RemainingControllerNumber; UINT32 RemainingControllerNumber;
RemainingHasControllerNode = FALSE; RemainingHasControllerNode = FALSE;
RemainingControllerNumber = 0; RemainingControllerNumber = 0;
// //
// Determine if the I2c Enumerate Protocol is available // Determine if the I2c Enumerate Protocol is available
@ -397,7 +405,7 @@ I2cBusDriverSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cEnumerateProtocolGuid, &gEfiI2cEnumerateProtocolGuid,
(VOID **) &I2cEnumerate, (VOID **)&I2cEnumerate,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -408,17 +416,17 @@ I2cBusDriverSupported (
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cEnumerateProtocolGuid, &gEfiI2cEnumerateProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath, (VOID **)&ParentDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -430,11 +438,11 @@ I2cBusDriverSupported (
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) { if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) {
@ -442,20 +450,23 @@ I2cBusDriverSupported (
// Check if the first node of RemainingDevicePath is a hardware vendor device path // Check if the first node of RemainingDevicePath is a hardware vendor device path
// //
if ((DevicePathType (RemainingDevicePath) != HARDWARE_DEVICE_PATH) || if ((DevicePathType (RemainingDevicePath) != HARDWARE_DEVICE_PATH) ||
(DevicePathSubType (RemainingDevicePath) != HW_VENDOR_DP)) { (DevicePathSubType (RemainingDevicePath) != HW_VENDOR_DP))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
// //
// Check if the second node of RemainingDevicePath is a controller node // Check if the second node of RemainingDevicePath is a controller node
// //
DevPathNode = NextDevicePathNode (RemainingDevicePath); DevPathNode = NextDevicePathNode (RemainingDevicePath);
if (!IsDevicePathEnd (DevPathNode)) { if (!IsDevicePathEnd (DevPathNode)) {
if ((DevicePathType (DevPathNode) != HARDWARE_DEVICE_PATH) || if ((DevicePathType (DevPathNode) != HARDWARE_DEVICE_PATH) ||
(DevicePathSubType (DevPathNode) != HW_CONTROLLER_DP)) { (DevicePathSubType (DevPathNode) != HW_CONTROLLER_DP))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} else { } else {
RemainingHasControllerNode = TRUE; RemainingHasControllerNode = TRUE;
RemainingControllerNumber = ((CONTROLLER_DEVICE_PATH *) DevPathNode)->ControllerNumber; RemainingControllerNumber = ((CONTROLLER_DEVICE_PATH *)DevPathNode)->ControllerNumber;
} }
} }
} }
@ -466,7 +477,7 @@ I2cBusDriverSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
(VOID **) &I2cHost, (VOID **)&I2cHost,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -474,17 +485,17 @@ I2cBusDriverSupported (
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if (Status == EFI_ALREADY_STARTED) { if (Status == EFI_ALREADY_STARTED) {
if ((RemainingDevicePath == NULL) || if ((RemainingDevicePath == NULL) ||
((RemainingDevicePath != NULL) && IsDevicePathEnd (RemainingDevicePath))) { ((RemainingDevicePath != NULL) && IsDevicePathEnd (RemainingDevicePath)))
{
// //
// If RemainingDevicePath is NULL or is the End of Device Path Node, return EFI_SUCCESS. // If RemainingDevicePath is NULL or is the End of Device Path Node, return EFI_SUCCESS.
// //
@ -549,16 +560,16 @@ I2cBusDriverStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate; EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
EFI_I2C_HOST_PROTOCOL *I2cHost; EFI_I2C_HOST_PROTOCOL *I2cHost;
I2C_BUS_CONTEXT *I2cBusContext; I2C_BUS_CONTEXT *I2cBusContext;
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
I2cBusContext = NULL; I2cBusContext = NULL;
ParentDevicePath = NULL; ParentDevicePath = NULL;
I2cEnumerate = NULL; I2cEnumerate = NULL;
I2cHost = NULL; I2cHost = NULL;
// //
// Determine if the I2C controller is available // Determine if the I2C controller is available
@ -566,7 +577,7 @@ I2cBusDriverStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
(VOID**)&I2cHost, (VOID **)&I2cHost,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -580,7 +591,7 @@ I2cBusDriverStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
(VOID **) &I2cBusContext, (VOID **)&I2cBusContext,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -597,7 +608,7 @@ I2cBusDriverStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cEnumerateProtocolGuid, &gEfiI2cEnumerateProtocolGuid,
(VOID**)&I2cEnumerate, (VOID **)&I2cEnumerate,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -608,13 +619,13 @@ I2cBusDriverStart (
} }
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath, (VOID **)&ParentDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
); );
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) { if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
DEBUG ((DEBUG_ERROR, "I2cBus: open device path error, Status = %r\n", Status)); DEBUG ((DEBUG_ERROR, "I2cBus: open device path error, Status = %r\n", Status));
goto Error; goto Error;
@ -661,7 +672,7 @@ I2cBusDriverStart (
// //
// Parent controller used to create children // Parent controller used to create children
// //
I2cBusContext->Controller = Controller; I2cBusContext->Controller = Controller;
// //
// Parent controller device path used to create children device path // Parent controller device path used to create children device path
// //
@ -693,29 +704,29 @@ Error:
DEBUG ((DEBUG_ERROR, "I2cBus: Start() function failed, Status = %r\n", Status)); DEBUG ((DEBUG_ERROR, "I2cBus: Start() function failed, Status = %r\n", Status));
if (ParentDevicePath != NULL) { if (ParentDevicePath != NULL) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if (I2cHost != NULL) { if (I2cHost != NULL) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if (I2cEnumerate != NULL) { if (I2cEnumerate != NULL) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cEnumerateProtocolGuid, &gEfiI2cEnumerateProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if (I2cBusContext != NULL) { if (I2cBusContext != NULL) {
@ -735,7 +746,6 @@ Error:
return Status; return Status;
} }
/** /**
Stops a device controller or a bus controller. Stops a device controller or a bus controller.
@ -771,60 +781,60 @@ I2cBusDriverStop (
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
I2C_BUS_CONTEXT *I2cBusContext; I2C_BUS_CONTEXT *I2cBusContext;
EFI_STATUS Status; EFI_STATUS Status;
BOOLEAN AllChildrenStopped; BOOLEAN AllChildrenStopped;
UINTN Index; UINTN Index;
if (NumberOfChildren == 0) { if (NumberOfChildren == 0) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cEnumerateProtocolGuid, &gEfiI2cEnumerateProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
(VOID **) &I2cBusContext, (VOID **)&I2cBusContext,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces ( gBS->UninstallMultipleProtocolInterfaces (
Controller, Controller,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
I2cBusContext, I2cBusContext,
NULL NULL
); );
// //
// No more child now, free bus context data. // No more child now, free bus context data.
// //
FreePool (I2cBusContext); FreePool (I2cBusContext);
} }
return Status; return Status;
} }
AllChildrenStopped = TRUE; AllChildrenStopped = TRUE;
for (Index = 0; Index < NumberOfChildren; Index++) { for (Index = 0; Index < NumberOfChildren; Index++) {
Status = UnRegisterI2cDevice (This, Controller, ChildHandleBuffer[Index]); Status = UnRegisterI2cDevice (This, Controller, ChildHandleBuffer[Index]);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
AllChildrenStopped = FALSE; AllChildrenStopped = FALSE;
@ -834,6 +844,7 @@ I2cBusDriverStop (
if (!AllChildrenStopped) { if (!AllChildrenStopped) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -853,22 +864,22 @@ I2cBusDriverStop (
**/ **/
EFI_STATUS EFI_STATUS
RegisterI2cDevice ( RegisterI2cDevice (
IN I2C_BUS_CONTEXT *I2cBusContext, IN I2C_BUS_CONTEXT *I2cBusContext,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
I2C_DEVICE_CONTEXT *I2cDeviceContext; I2C_DEVICE_CONTEXT *I2cDeviceContext;
EFI_STATUS Status; EFI_STATUS Status;
CONST EFI_I2C_DEVICE *Device; CONST EFI_I2C_DEVICE *Device;
CONST EFI_I2C_DEVICE *TempDevice; CONST EFI_I2C_DEVICE *TempDevice;
UINT32 RemainingPathDeviceIndex; UINT32 RemainingPathDeviceIndex;
EFI_DEVICE_PATH_PROTOCOL *DevPathNode; EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
BOOLEAN BuildControllerNode; BOOLEAN BuildControllerNode;
UINTN Count; UINTN Count;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
BuildControllerNode = TRUE; BuildControllerNode = TRUE;
// //
// Default DeviceIndex // Default DeviceIndex
@ -884,12 +895,13 @@ RegisterI2cDevice (
// //
DevPathNode = NextDevicePathNode (RemainingDevicePath); DevPathNode = NextDevicePathNode (RemainingDevicePath);
if ((DevicePathType (DevPathNode) == HARDWARE_DEVICE_PATH) && if ((DevicePathType (DevPathNode) == HARDWARE_DEVICE_PATH) &&
(DevicePathSubType(DevPathNode) == HW_CONTROLLER_DP)) { (DevicePathSubType (DevPathNode) == HW_CONTROLLER_DP))
{
// //
// RemainingDevicePath != NULL and RemainingDevicePath contains Controller Node, // RemainingDevicePath != NULL and RemainingDevicePath contains Controller Node,
// add Controller Node to Device Path on child handle. // add Controller Node to Device Path on child handle.
// //
RemainingPathDeviceIndex = ((CONTROLLER_DEVICE_PATH *) DevPathNode)->ControllerNumber; RemainingPathDeviceIndex = ((CONTROLLER_DEVICE_PATH *)DevPathNode)->ControllerNumber;
} else { } else {
// //
// RemainingDevicePath != NULL and RemainingDevicePath does not contain Controller Node, // RemainingDevicePath != NULL and RemainingDevicePath does not contain Controller Node,
@ -908,12 +920,13 @@ RegisterI2cDevice (
// Get the next I2C device // Get the next I2C device
// //
Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &Device); Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &Device);
if (EFI_ERROR (Status) || Device == NULL) { if (EFI_ERROR (Status) || (Device == NULL)) {
if (RemainingDevicePath != NULL) { if (RemainingDevicePath != NULL) {
Status = EFI_NOT_FOUND; Status = EFI_NOT_FOUND;
} else { } else {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
break; break;
} }
@ -937,14 +950,16 @@ RegisterI2cDevice (
// Get the next I2C device // Get the next I2C device
// //
Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &TempDevice); Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &TempDevice);
if (EFI_ERROR (Status) || TempDevice == NULL) { if (EFI_ERROR (Status) || (TempDevice == NULL)) {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
break; break;
} }
if (CompareGuid (Device->DeviceGuid, TempDevice->DeviceGuid)) { if (CompareGuid (Device->DeviceGuid, TempDevice->DeviceGuid)) {
Count++; Count++;
} }
} }
if (Count == 1) { if (Count == 1) {
// //
// RemainingDevicePath == NULL and only DeviceIndex 0 is present on the I2C bus, // RemainingDevicePath == NULL and only DeviceIndex 0 is present on the I2C bus,
@ -958,7 +973,8 @@ RegisterI2cDevice (
// Find I2C device reported in Remaining Device Path // Find I2C device reported in Remaining Device Path
// //
if ((!CompareGuid (&((VENDOR_DEVICE_PATH *)RemainingDevicePath)->Guid, Device->DeviceGuid)) || if ((!CompareGuid (&((VENDOR_DEVICE_PATH *)RemainingDevicePath)->Guid, Device->DeviceGuid)) ||
(RemainingPathDeviceIndex != Device->DeviceIndex)) { (RemainingPathDeviceIndex != Device->DeviceIndex))
{
continue; continue;
} }
} }
@ -976,11 +992,11 @@ RegisterI2cDevice (
// //
// Initialize the specific device context // Initialize the specific device context
// //
I2cDeviceContext->I2cBusContext = I2cBusContext; I2cDeviceContext->I2cBusContext = I2cBusContext;
I2cDeviceContext->I2cDevice = Device; I2cDeviceContext->I2cDevice = Device;
I2cDeviceContext->I2cIo.DeviceGuid = Device->DeviceGuid; I2cDeviceContext->I2cIo.DeviceGuid = Device->DeviceGuid;
I2cDeviceContext->I2cIo.DeviceIndex = Device->DeviceIndex; I2cDeviceContext->I2cIo.DeviceIndex = Device->DeviceIndex;
I2cDeviceContext->I2cIo.HardwareRevision = Device->HardwareRevision; I2cDeviceContext->I2cIo.HardwareRevision = Device->HardwareRevision;
I2cDeviceContext->I2cIo.I2cControllerCapabilities = I2cBusContext->I2cHost->I2cControllerCapabilities; I2cDeviceContext->I2cIo.I2cControllerCapabilities = I2cBusContext->I2cHost->I2cControllerCapabilities;
// //
@ -996,12 +1012,13 @@ RegisterI2cDevice (
// Install the protocol // Install the protocol
// //
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&I2cDeviceContext->Handle, &I2cDeviceContext->Handle,
&gEfiI2cIoProtocolGuid, &gEfiI2cIoProtocolGuid,
&I2cDeviceContext->I2cIo, &I2cDeviceContext->I2cIo,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
I2cDeviceContext->DevicePath, I2cDeviceContext->DevicePath,
NULL ); NULL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// Free resources for this I2C device // Free resources for this I2C device
@ -1016,7 +1033,7 @@ RegisterI2cDevice (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
(VOID **) &I2cBusContext->I2cHost, (VOID **)&I2cBusContext->I2cHost,
I2cBusContext->DriverBindingHandle, I2cBusContext->DriverBindingHandle,
I2cDeviceContext->Handle, I2cDeviceContext->Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@ -1048,7 +1065,6 @@ RegisterI2cDevice (
return Status; return Status;
} }
/** /**
Queue an I2C transaction for execution on the I2C device. Queue an I2C transaction for execution on the I2C device.
@ -1130,11 +1146,11 @@ I2cBusQueueRequest (
OUT EFI_STATUS *I2cStatus OPTIONAL OUT EFI_STATUS *I2cStatus OPTIONAL
) )
{ {
CONST EFI_I2C_DEVICE *I2cDevice; CONST EFI_I2C_DEVICE *I2cDevice;
I2C_BUS_CONTEXT *I2cBusContext; I2C_BUS_CONTEXT *I2cBusContext;
CONST EFI_I2C_HOST_PROTOCOL *I2cHost; CONST EFI_I2C_HOST_PROTOCOL *I2cHost;
I2C_DEVICE_CONTEXT *I2cDeviceContext; I2C_DEVICE_CONTEXT *I2cDeviceContext;
EFI_STATUS Status; EFI_STATUS Status;
if (RequestPacket == NULL) { if (RequestPacket == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -1161,7 +1177,7 @@ I2cBusQueueRequest (
Status = I2cHost->QueueRequest ( Status = I2cHost->QueueRequest (
I2cHost, I2cHost,
I2cDevice->I2cBusConfiguration, I2cDevice->I2cBusConfiguration,
I2cDevice->SlaveAddressArray [SlaveAddressIndex], I2cDevice->SlaveAddressArray[SlaveAddressIndex],
Event, Event,
RequestPacket, RequestPacket,
I2cStatus I2cStatus
@ -1180,7 +1196,7 @@ I2cBusQueueRequest (
**/ **/
VOID VOID
ReleaseI2cDeviceContext ( ReleaseI2cDeviceContext (
IN I2C_DEVICE_CONTEXT *I2cDeviceContext IN I2C_DEVICE_CONTEXT *I2cDeviceContext
) )
{ {
if (I2cDeviceContext == NULL) { if (I2cDeviceContext == NULL) {
@ -1210,22 +1226,22 @@ ReleaseI2cDeviceContext (
**/ **/
EFI_STATUS EFI_STATUS
UnRegisterI2cDevice ( UnRegisterI2cDevice (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_HANDLE Handle IN EFI_HANDLE Handle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
I2C_DEVICE_CONTEXT *I2cDeviceContext; I2C_DEVICE_CONTEXT *I2cDeviceContext;
EFI_I2C_IO_PROTOCOL *I2cIo; EFI_I2C_IO_PROTOCOL *I2cIo;
EFI_I2C_HOST_PROTOCOL *I2cHost; EFI_I2C_HOST_PROTOCOL *I2cHost;
I2cIo = NULL; I2cIo = NULL;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiI2cIoProtocolGuid, &gEfiI2cIoProtocolGuid,
(VOID **) &I2cIo, (VOID **)&I2cIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -1267,13 +1283,13 @@ UnRegisterI2cDevice (
// Keep parent and child relationship // Keep parent and child relationship
// //
gBS->OpenProtocol ( gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
(VOID **) &I2cHost, (VOID **)&I2cHost,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
); );
return Status; return Status;
} }
@ -1299,8 +1315,8 @@ UnRegisterI2cDevice (
**/ **/
EFI_STATUS EFI_STATUS
I2cBusDevicePathAppend ( I2cBusDevicePathAppend (
IN I2C_DEVICE_CONTEXT *I2cDeviceContext, IN I2C_DEVICE_CONTEXT *I2cDeviceContext,
IN BOOLEAN BuildControllerNode IN BOOLEAN BuildControllerNode
) )
{ {
EFI_DEVICE_PATH_PROTOCOL *PreviousDevicePath; EFI_DEVICE_PATH_PROTOCOL *PreviousDevicePath;
@ -1311,10 +1327,10 @@ I2cBusDevicePathAppend (
// Build vendor device path // Build vendor device path
// //
CopyMem (&gVendorDevicePathTemplate.Guid, I2cDeviceContext->I2cDevice->DeviceGuid, sizeof (EFI_GUID)); CopyMem (&gVendorDevicePathTemplate.Guid, I2cDeviceContext->I2cDevice->DeviceGuid, sizeof (EFI_GUID));
I2cDeviceContext->DevicePath = AppendDevicePathNode ( I2cDeviceContext->DevicePath = AppendDevicePathNode (
I2cDeviceContext->I2cBusContext->ParentDevicePath, I2cDeviceContext->I2cBusContext->ParentDevicePath,
(EFI_DEVICE_PATH_PROTOCOL *) &gVendorDevicePathTemplate (EFI_DEVICE_PATH_PROTOCOL *)&gVendorDevicePathTemplate
); );
ASSERT (I2cDeviceContext->DevicePath != NULL); ASSERT (I2cDeviceContext->DevicePath != NULL);
if (I2cDeviceContext->DevicePath == NULL) { if (I2cDeviceContext->DevicePath == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -1324,12 +1340,12 @@ I2cBusDevicePathAppend (
// //
// Build the final I2C device path with controller node // Build the final I2C device path with controller node
// //
PreviousDevicePath = I2cDeviceContext->DevicePath; PreviousDevicePath = I2cDeviceContext->DevicePath;
gControllerDevicePathTemplate.ControllerNumber = I2cDeviceContext->I2cDevice->DeviceIndex; gControllerDevicePathTemplate.ControllerNumber = I2cDeviceContext->I2cDevice->DeviceIndex;
I2cDeviceContext->DevicePath = AppendDevicePathNode ( I2cDeviceContext->DevicePath = AppendDevicePathNode (
I2cDeviceContext->DevicePath, I2cDeviceContext->DevicePath,
(EFI_DEVICE_PATH_PROTOCOL *) &gControllerDevicePathTemplate (EFI_DEVICE_PATH_PROTOCOL *)&gControllerDevicePathTemplate
); );
gBS->FreePool (PreviousDevicePath); gBS->FreePool (PreviousDevicePath);
ASSERT (I2cDeviceContext->DevicePath != NULL); ASSERT (I2cDeviceContext->DevicePath != NULL);
if (I2cDeviceContext->DevicePath == NULL) { if (I2cDeviceContext->DevicePath == NULL) {
@ -1353,12 +1369,12 @@ I2cBusDevicePathAppend (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeI2cBus( InitializeI2cBus (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).
@ -1373,7 +1389,6 @@ InitializeI2cBus(
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }
@ -1392,15 +1407,15 @@ InitializeI2cBus(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cBusUnload ( I2cBusUnload (
IN EFI_HANDLE ImageHandle IN EFI_HANDLE ImageHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE *DeviceHandleBuffer; EFI_HANDLE *DeviceHandleBuffer;
UINTN DeviceHandleCount; UINTN DeviceHandleCount;
UINTN Index; UINTN Index;
EFI_COMPONENT_NAME_PROTOCOL *ComponentName; EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
// //
// Get the list of all I2C Controller handles in the handle database. // Get the list of all I2C Controller handles in the handle database.
@ -1455,7 +1470,7 @@ I2cBusUnload (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gI2cBusDriverBinding.DriverBindingHandle, gI2cBusDriverBinding.DriverBindingHandle,
&gEfiComponentNameProtocolGuid, &gEfiComponentNameProtocolGuid,
(VOID **) &ComponentName (VOID **)&ComponentName
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallProtocolInterface ( gBS->UninstallProtocolInterface (
@ -1468,7 +1483,7 @@ I2cBusUnload (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gI2cBusDriverBinding.DriverBindingHandle, gI2cBusDriverBinding.DriverBindingHandle,
&gEfiComponentName2ProtocolGuid, &gEfiComponentName2ProtocolGuid,
(VOID **) &ComponentName2 (VOID **)&ComponentName2
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallProtocolInterface ( gBS->UninstallProtocolInterface (

View File

@ -20,21 +20,21 @@
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeI2c( InitializeI2c (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).
// //
Status = InitializeI2cHost ( ImageHandle, SystemTable ); Status = InitializeI2cHost (ImageHandle, SystemTable);
if ( !EFI_ERROR ( Status )) if ( !EFI_ERROR (Status)) {
{ Status = InitializeI2cBus (ImageHandle, SystemTable);
Status = InitializeI2cBus ( ImageHandle, SystemTable );
} }
return Status; return Status;
} }
@ -53,17 +53,18 @@ InitializeI2c(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cUnload ( I2cUnload (
IN EFI_HANDLE ImageHandle IN EFI_HANDLE ImageHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Disconnect the drivers // Disconnect the drivers
// //
Status = I2cBusUnload ( ImageHandle ); Status = I2cBusUnload (ImageHandle);
if ( !EFI_ERROR ( Status )) { if ( !EFI_ERROR (Status)) {
Status = I2cHostUnload ( ImageHandle ); Status = I2cHostUnload (ImageHandle);
} }
return Status; return Status;
} }

View File

@ -30,24 +30,24 @@
#include <Protocol/I2cBusConfigurationManagement.h> #include <Protocol/I2cBusConfigurationManagement.h>
#include <Protocol/LoadedImage.h> #include <Protocol/LoadedImage.h>
#define I2C_DEVICE_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'D') #define I2C_DEVICE_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'D')
#define I2C_HOST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'H') #define I2C_HOST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'H')
#define I2C_REQUEST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'R') #define I2C_REQUEST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'R')
// //
// Synchronize access to the list of requests // Synchronize access to the list of requests
// //
#define TPL_I2C_SYNC TPL_NOTIFY #define TPL_I2C_SYNC TPL_NOTIFY
// //
// I2C bus context // I2C bus context
// //
typedef struct { typedef struct {
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate; EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
EFI_I2C_HOST_PROTOCOL *I2cHost; EFI_I2C_HOST_PROTOCOL *I2cHost;
EFI_HANDLE Controller; EFI_HANDLE Controller;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_HANDLE DriverBindingHandle; EFI_HANDLE DriverBindingHandle;
} I2C_BUS_CONTEXT; } I2C_BUS_CONTEXT;
// //
@ -57,36 +57,36 @@ typedef struct {
// //
// Structure identification // Structure identification
// //
UINT32 Signature; UINT32 Signature;
// //
// I2c device handle // I2c device handle
// //
EFI_HANDLE Handle; EFI_HANDLE Handle;
// //
// Upper level API to support the I2C device I/O // Upper level API to support the I2C device I/O
// //
EFI_I2C_IO_PROTOCOL I2cIo; EFI_I2C_IO_PROTOCOL I2cIo;
// //
// Device path for this device // Device path for this device
// //
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
// //
// Platform specific data for this device // Platform specific data for this device
// //
CONST EFI_I2C_DEVICE *I2cDevice; CONST EFI_I2C_DEVICE *I2cDevice;
// //
// Context for the common I/O support including the // Context for the common I/O support including the
// lower level API to the host controller. // lower level API to the host controller.
// //
I2C_BUS_CONTEXT *I2cBusContext; I2C_BUS_CONTEXT *I2cBusContext;
} I2C_DEVICE_CONTEXT; } I2C_DEVICE_CONTEXT;
#define I2C_DEVICE_CONTEXT_FROM_PROTOCOL(a) CR (a, I2C_DEVICE_CONTEXT, I2cIo, I2C_DEVICE_SIGNATURE) #define I2C_DEVICE_CONTEXT_FROM_PROTOCOL(a) CR (a, I2C_DEVICE_CONTEXT, I2cIo, I2C_DEVICE_SIGNATURE)
// //
// I2C Request // I2C Request
@ -95,41 +95,41 @@ typedef struct {
// //
// Signature // Signature
// //
UINT32 Signature; UINT32 Signature;
// //
// Next request in the pending request list // Next request in the pending request list
// //
LIST_ENTRY Link; LIST_ENTRY Link;
// //
// I2C bus configuration for the operation // I2C bus configuration for the operation
// //
UINTN I2cBusConfiguration; UINTN I2cBusConfiguration;
// //
// I2C slave address for the operation // I2C slave address for the operation
// //
UINTN SlaveAddress; UINTN SlaveAddress;
// //
// Event to set for asynchronous operations, NULL for // Event to set for asynchronous operations, NULL for
// synchronous operations // synchronous operations
// //
EFI_EVENT Event; EFI_EVENT Event;
// //
// I2C operation description // I2C operation description
// //
EFI_I2C_REQUEST_PACKET *RequestPacket; EFI_I2C_REQUEST_PACKET *RequestPacket;
// //
// Optional buffer to receive the I2C operation completion status // Optional buffer to receive the I2C operation completion status
// //
EFI_STATUS *Status; EFI_STATUS *Status;
} I2C_REQUEST; } I2C_REQUEST;
#define I2C_REQUEST_FROM_ENTRY(a) CR (a, I2C_REQUEST, Link, I2C_REQUEST_SIGNATURE); #define I2C_REQUEST_FROM_ENTRY(a) CR (a, I2C_REQUEST, Link, I2C_REQUEST_SIGNATURE);
// //
// I2C host context // I2C host context
@ -138,66 +138,66 @@ typedef struct {
// //
// Structure identification // Structure identification
// //
UINTN Signature; UINTN Signature;
// //
// Current I2C bus configuration // Current I2C bus configuration
// //
UINTN I2cBusConfiguration; UINTN I2cBusConfiguration;
// //
// I2C bus configuration management event // I2C bus configuration management event
// //
EFI_EVENT I2cBusConfigurationEvent; EFI_EVENT I2cBusConfigurationEvent;
// //
// I2C operation completion event // I2C operation completion event
// //
EFI_EVENT I2cEvent; EFI_EVENT I2cEvent;
// //
// I2C operation and I2C bus configuration management status // I2C operation and I2C bus configuration management status
// //
EFI_STATUS Status; EFI_STATUS Status;
// //
// I2C bus configuration management operation pending // I2C bus configuration management operation pending
// //
BOOLEAN I2cBusConfigurationManagementPending; BOOLEAN I2cBusConfigurationManagementPending;
// //
// I2C request list maintained by I2C Host // I2C request list maintained by I2C Host
// //
LIST_ENTRY RequestList; LIST_ENTRY RequestList;
// //
// Upper level API // Upper level API
// //
EFI_I2C_HOST_PROTOCOL I2cHost; EFI_I2C_HOST_PROTOCOL I2cHost;
// //
// I2C bus configuration management protocol // I2C bus configuration management protocol
// //
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement; EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
// //
// Lower level API for I2C master (controller) // Lower level API for I2C master (controller)
// //
EFI_I2C_MASTER_PROTOCOL *I2cMaster; EFI_I2C_MASTER_PROTOCOL *I2cMaster;
} I2C_HOST_CONTEXT; } I2C_HOST_CONTEXT;
#define I2C_HOST_CONTEXT_FROM_PROTOCOL(a) CR (a, I2C_HOST_CONTEXT, I2cHost, I2C_HOST_SIGNATURE) #define I2C_HOST_CONTEXT_FROM_PROTOCOL(a) CR (a, I2C_HOST_CONTEXT, I2cHost, I2C_HOST_SIGNATURE)
// //
// Global Variables // Global Variables
// //
extern EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2;
extern EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding;
extern EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2;
extern EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding;
/** /**
Start the I2C driver Start the I2C driver
@ -217,7 +217,7 @@ extern EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding;
EFI_STATUS EFI_STATUS
RegisterI2cDevice ( RegisterI2cDevice (
IN I2C_BUS_CONTEXT *I2cBus, IN I2C_BUS_CONTEXT *I2cBus,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
@ -237,9 +237,9 @@ RegisterI2cDevice (
**/ **/
EFI_STATUS EFI_STATUS
UnRegisterI2cDevice ( UnRegisterI2cDevice (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_HANDLE Handle IN EFI_HANDLE Handle
); );
/** /**
@ -256,8 +256,8 @@ UnRegisterI2cDevice (
**/ **/
EFI_STATUS EFI_STATUS
I2cBusDevicePathAppend ( I2cBusDevicePathAppend (
IN I2C_DEVICE_CONTEXT *I2cDeviceContext, IN I2C_DEVICE_CONTEXT *I2cDeviceContext,
IN BOOLEAN BuildControllerNode IN BOOLEAN BuildControllerNode
); );
/** /**
@ -514,9 +514,9 @@ I2cBusDriverStop (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cBusComponentNameGetDriverName ( I2cBusComponentNameGetDriverName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
@ -590,11 +590,11 @@ I2cBusComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cBusComponentNameGetControllerName ( I2cBusComponentNameGetControllerName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
/** /**
@ -610,9 +610,9 @@ I2cBusComponentNameGetControllerName (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeI2cBus( InitializeI2cBus (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
); );
/** /**
@ -630,7 +630,7 @@ InitializeI2cBus(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cBusUnload ( I2cBusUnload (
IN EFI_HANDLE ImageHandle IN EFI_HANDLE ImageHandle
); );
/** /**
@ -643,7 +643,7 @@ I2cBusUnload (
**/ **/
VOID VOID
ReleaseI2cDeviceContext ( ReleaseI2cDeviceContext (
IN I2C_DEVICE_CONTEXT *I2cDeviceContext IN I2C_DEVICE_CONTEXT *I2cDeviceContext
); );
/** /**
@ -657,8 +657,8 @@ ReleaseI2cDeviceContext (
**/ **/
EFI_STATUS EFI_STATUS
I2cHostRequestComplete ( I2cHostRequestComplete (
I2C_HOST_CONTEXT *I2cHost, I2C_HOST_CONTEXT *I2cHost,
EFI_STATUS Status EFI_STATUS Status
); );
/** /**
@ -688,7 +688,7 @@ I2cHostRequestComplete (
**/ **/
EFI_STATUS EFI_STATUS
I2cHostRequestEnable ( I2cHostRequestEnable (
I2C_HOST_CONTEXT *I2cHost I2C_HOST_CONTEXT *I2cHost
); );
/** /**
@ -779,9 +779,9 @@ I2cHostDriverSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostDriverStart ( I2cHostDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -813,10 +813,10 @@ I2cHostDriverStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostDriverStop ( I2cHostDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
/** /**
@ -861,9 +861,9 @@ I2cHostDriverStop (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostComponentNameGetDriverName ( I2cHostComponentNameGetDriverName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
@ -937,11 +937,11 @@ I2cHostComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostComponentNameGetControllerName ( I2cHostComponentNameGetControllerName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
/** /**
@ -956,8 +956,8 @@ I2cHostComponentNameGetControllerName (
VOID VOID
EFIAPI EFIAPI
I2cHostRequestCompleteEvent ( I2cHostRequestCompleteEvent (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -972,8 +972,8 @@ I2cHostRequestCompleteEvent (
VOID VOID
EFIAPI EFIAPI
I2cHostI2cBusConfigurationAvailable ( I2cHostI2cBusConfigurationAvailable (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -1065,9 +1065,9 @@ I2cHostQueueRequest (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeI2cHost( InitializeI2cHost (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
); );
/** /**
@ -1085,7 +1085,7 @@ InitializeI2cHost(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostUnload ( I2cHostUnload (
IN EFI_HANDLE ImageHandle IN EFI_HANDLE ImageHandle
); );
#endif // __I2C_DXE_H__ #endif // __I2C_DXE_H__

View File

@ -10,7 +10,7 @@
#include "I2cDxe.h" #include "I2cDxe.h"
EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = { EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {
I2cHostDriverSupported, I2cHostDriverSupported,
I2cHostDriverStart, I2cHostDriverStart,
I2cHostDriverStop, I2cHostDriverStop,
@ -22,24 +22,24 @@ EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {
// //
// Driver name table // Driver name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cHostDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cHostDriverNameTable[] = {
{ "eng;en", L"I2c Host Driver" }, { "eng;en", L"I2c Host Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName = {
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) I2cHostComponentNameGetDriverName, (EFI_COMPONENT_NAME_GET_DRIVER_NAME)I2cHostComponentNameGetDriverName,
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) I2cHostComponentNameGetControllerName, (EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)I2cHostComponentNameGetControllerName,
"eng" "eng"
}; };
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2 = {
I2cHostComponentNameGetDriverName, I2cHostComponentNameGetDriverName,
I2cHostComponentNameGetControllerName, I2cHostComponentNameGetControllerName,
"en" "en"
@ -88,8 +88,8 @@ EFI_STATUS
EFIAPI EFIAPI
I2cHostComponentNameGetDriverName ( I2cHostComponentNameGetDriverName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
) )
{ {
return LookupUnicodeString2 ( return LookupUnicodeString2 (
@ -172,11 +172,11 @@ I2cHostComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostComponentNameGetControllerName ( I2cHostComponentNameGetControllerName (
IN EFI_COMPONENT_NAME2_PROTOCOL *This, IN EFI_COMPONENT_NAME2_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
@ -232,9 +232,9 @@ I2cHostDriverSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_I2C_MASTER_PROTOCOL *I2cMaster; EFI_I2C_MASTER_PROTOCOL *I2cMaster;
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement; EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
EFI_STATUS Status; EFI_STATUS Status;
// //
// Locate I2C Bus Configuration Management Protocol // Locate I2C Bus Configuration Management Protocol
@ -255,11 +255,11 @@ I2cHostDriverSupported (
// Close the protocol because we don't use it here // Close the protocol because we don't use it here
// //
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cBusConfigurationManagementProtocolGuid, &gEfiI2cBusConfigurationManagementProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
// //
// Locate I2C Master Protocol // Locate I2C Master Protocol
@ -317,15 +317,15 @@ I2cHostDriverSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostDriverStart ( I2cHostDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_I2C_MASTER_PROTOCOL *I2cMaster; EFI_I2C_MASTER_PROTOCOL *I2cMaster;
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement; EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
I2C_HOST_CONTEXT *I2cHostContext; I2C_HOST_CONTEXT *I2cHostContext;
I2cMaster = NULL; I2cMaster = NULL;
I2cHostContext = NULL; I2cHostContext = NULL;
@ -379,8 +379,8 @@ I2cHostDriverStart (
I2cHostContext->Signature = I2C_HOST_SIGNATURE; I2cHostContext->Signature = I2C_HOST_SIGNATURE;
I2cHostContext->I2cMaster = I2cMaster; I2cHostContext->I2cMaster = I2cMaster;
I2cHostContext->I2cBusConfigurationManagement = I2cBusConfigurationManagement; I2cHostContext->I2cBusConfigurationManagement = I2cBusConfigurationManagement;
I2cHostContext->I2cBusConfiguration = (UINTN) -1; I2cHostContext->I2cBusConfiguration = (UINTN)-1;
InitializeListHead(&I2cHostContext->RequestList); InitializeListHead (&I2cHostContext->RequestList);
// //
// Reset the controller // Reset the controller
@ -441,11 +441,11 @@ Exit:
DEBUG ((DEBUG_ERROR, "I2cHost: Start() function failed, Status = %r\n", Status)); DEBUG ((DEBUG_ERROR, "I2cHost: Start() function failed, Status = %r\n", Status));
if (I2cBusConfigurationManagement != NULL) { if (I2cBusConfigurationManagement != NULL) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiI2cBusConfigurationManagementProtocolGuid, &gEfiI2cBusConfigurationManagementProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if ((I2cHostContext != NULL) && (I2cHostContext->I2cEvent != NULL)) { if ((I2cHostContext != NULL) && (I2cHostContext->I2cEvent != NULL)) {
@ -501,16 +501,16 @@ Exit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostDriverStop ( I2cHostDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
I2C_HOST_CONTEXT *I2cHostContext; I2C_HOST_CONTEXT *I2cHostContext;
EFI_I2C_HOST_PROTOCOL *I2cHost; EFI_I2C_HOST_PROTOCOL *I2cHost;
EFI_TPL TplPrevious; EFI_TPL TplPrevious;
TplPrevious = EfiGetCurrentTpl (); TplPrevious = EfiGetCurrentTpl ();
if (TplPrevious > TPL_I2C_SYNC) { if (TplPrevious > TPL_I2C_SYNC) {
@ -521,7 +521,7 @@ I2cHostDriverStop (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiI2cHostProtocolGuid, &gEfiI2cHostProtocolGuid,
(VOID **) &I2cHost, (VOID **)&I2cHost,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -542,9 +542,9 @@ I2cHostDriverStop (
// If there is pending request or pending bus configuration, do not stop // If there is pending request or pending bus configuration, do not stop
// //
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;
if (( !I2cHostContext->I2cBusConfigurationManagementPending ) if ( (!I2cHostContext->I2cBusConfigurationManagementPending)
&& IsListEmpty (&I2cHostContext->RequestList)) { && IsListEmpty (&I2cHostContext->RequestList))
{
// //
// Remove the I2C host protocol // Remove the I2C host protocol
// //
@ -602,16 +602,16 @@ I2cHostDriverStop (
VOID VOID
EFIAPI EFIAPI
I2cHostI2cBusConfigurationAvailable ( I2cHostI2cBusConfigurationAvailable (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
I2C_HOST_CONTEXT *I2cHostContext; I2C_HOST_CONTEXT *I2cHostContext;
EFI_I2C_MASTER_PROTOCOL *I2cMaster; EFI_I2C_MASTER_PROTOCOL *I2cMaster;
I2C_REQUEST *I2cRequest; I2C_REQUEST *I2cRequest;
LIST_ENTRY *EntryHeader; LIST_ENTRY *EntryHeader;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
EFI_STATUS Status; EFI_STATUS Status;
// //
// Mark this I2C bus configuration management operation as complete // Mark this I2C bus configuration management operation as complete
@ -637,7 +637,7 @@ I2cHostI2cBusConfigurationAvailable (
// Unknown I2C bus configuration // Unknown I2C bus configuration
// Force next operation to enable the I2C bus configuration // Force next operation to enable the I2C bus configuration
// //
I2cHostContext->I2cBusConfiguration = (UINTN) -1; I2cHostContext->I2cBusConfiguration = (UINTN)-1;
// //
// Do not continue current I2C request // Do not continue current I2C request
@ -649,8 +649,8 @@ I2cHostI2cBusConfigurationAvailable (
// Get the first request in the link with FIFO order // Get the first request in the link with FIFO order
// //
EntryHeader = &I2cHostContext->RequestList; EntryHeader = &I2cHostContext->RequestList;
Entry = GetFirstNode (EntryHeader); Entry = GetFirstNode (EntryHeader);
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry); I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
// //
// Update the I2C bus configuration of the current I2C request // Update the I2C bus configuration of the current I2C request
@ -669,7 +669,7 @@ I2cHostI2cBusConfigurationAvailable (
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
DEBUG((DEBUG_ERROR, "I2cHostI2cBusConfigurationAvailable: Error starting I2C operation, %r\n", Status)); DEBUG ((DEBUG_ERROR, "I2cHostI2cBusConfigurationAvailable: Error starting I2C operation, %r\n", Status));
} }
} }
@ -686,20 +686,20 @@ I2cHostI2cBusConfigurationAvailable (
**/ **/
EFI_STATUS EFI_STATUS
I2cHostRequestComplete ( I2cHostRequestComplete (
I2C_HOST_CONTEXT *I2cHostContext, I2C_HOST_CONTEXT *I2cHostContext,
EFI_STATUS Status EFI_STATUS Status
) )
{ {
I2C_REQUEST *I2cRequest; I2C_REQUEST *I2cRequest;
LIST_ENTRY *EntryHeader; LIST_ENTRY *EntryHeader;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
// //
// Remove the current I2C request from the list // Remove the current I2C request from the list
// //
EntryHeader = &I2cHostContext->RequestList; EntryHeader = &I2cHostContext->RequestList;
Entry = GetFirstNode (EntryHeader); Entry = GetFirstNode (EntryHeader);
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry); I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
// //
// Save the status for QueueRequest // Save the status for QueueRequest
@ -725,7 +725,7 @@ I2cHostRequestComplete (
// //
// If there is more I2C request, start next one // If there is more I2C request, start next one
// //
if(!IsListEmpty (EntryHeader)) { if (!IsListEmpty (EntryHeader)) {
I2cHostRequestEnable (I2cHostContext); I2cHostRequestEnable (I2cHostContext);
} }
@ -744,11 +744,11 @@ I2cHostRequestComplete (
VOID VOID
EFIAPI EFIAPI
I2cHostRequestCompleteEvent ( I2cHostRequestCompleteEvent (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
I2C_HOST_CONTEXT *I2cHostContext; I2C_HOST_CONTEXT *I2cHostContext;
// //
// Handle the completion event // Handle the completion event
@ -784,16 +784,16 @@ I2cHostRequestCompleteEvent (
**/ **/
EFI_STATUS EFI_STATUS
I2cHostRequestEnable ( I2cHostRequestEnable (
I2C_HOST_CONTEXT *I2cHostContext I2C_HOST_CONTEXT *I2cHostContext
) )
{ {
UINTN I2cBusConfiguration; UINTN I2cBusConfiguration;
CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement; CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
I2C_REQUEST *I2cRequest; I2C_REQUEST *I2cRequest;
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL TplPrevious; EFI_TPL TplPrevious;
LIST_ENTRY *EntryHeader; LIST_ENTRY *EntryHeader;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
// //
// Assume pending request // Assume pending request
@ -807,7 +807,7 @@ I2cHostRequestEnable (
// //
EntryHeader = &I2cHostContext->RequestList; EntryHeader = &I2cHostContext->RequestList;
Entry = GetFirstNode (EntryHeader); Entry = GetFirstNode (EntryHeader);
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry); I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
I2cBusConfiguration = I2cRequest->I2cBusConfiguration; I2cBusConfiguration = I2cRequest->I2cBusConfiguration;
@ -820,16 +820,16 @@ I2cHostRequestEnable (
// Update bus configuration for this device's requesting bus configuration // Update bus configuration for this device's requesting bus configuration
// //
Status = I2cBusConfigurationManagement->EnableI2cBusConfiguration ( Status = I2cBusConfigurationManagement->EnableI2cBusConfiguration (
I2cBusConfigurationManagement, I2cBusConfigurationManagement,
I2cBusConfiguration, I2cBusConfiguration,
I2cHostContext->I2cBusConfigurationEvent, I2cHostContext->I2cBusConfigurationEvent,
&I2cHostContext->Status &I2cHostContext->Status
); );
} else { } else {
// //
// I2C bus configuration is same, no need change configuration and start I2c transaction directly // I2C bus configuration is same, no need change configuration and start I2c transaction directly
// //
TplPrevious = gBS->RaiseTPL ( TPL_I2C_SYNC ); TplPrevious = gBS->RaiseTPL (TPL_I2C_SYNC);
// //
// Same I2C bus configuration // Same I2C bus configuration
@ -840,8 +840,9 @@ I2cHostRequestEnable (
// //
// Release the thread synchronization // Release the thread synchronization
// //
gBS->RestoreTPL ( TplPrevious ); gBS->RestoreTPL (TplPrevious);
} }
return Status; return Status;
} }
@ -965,12 +966,12 @@ I2cHostQueueRequest (
// For synchronous transaction, register an event used to wait for finishing synchronous transaction // For synchronous transaction, register an event used to wait for finishing synchronous transaction
// //
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (
0, 0,
TPL_I2C_SYNC, TPL_I2C_SYNC,
NULL, NULL,
NULL, NULL,
&SyncEvent &SyncEvent
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -1007,7 +1008,7 @@ I2cHostQueueRequest (
// //
// Copy request packet into private buffer, as RequestPacket may be freed during asynchronous transaction // Copy request packet into private buffer, as RequestPacket may be freed during asynchronous transaction
// //
RequestPacketSize = sizeof (UINTN) + RequestPacket->OperationCount * sizeof (EFI_I2C_OPERATION); RequestPacketSize = sizeof (UINTN) + RequestPacket->OperationCount * sizeof (EFI_I2C_OPERATION);
I2cRequest->RequestPacket = AllocateZeroPool (RequestPacketSize); I2cRequest->RequestPacket = AllocateZeroPool (RequestPacketSize);
ASSERT (I2cRequest->RequestPacket != NULL); ASSERT (I2cRequest->RequestPacket != NULL);
CopyMem (I2cRequest->RequestPacket, RequestPacket, RequestPacketSize); CopyMem (I2cRequest->RequestPacket, RequestPacket, RequestPacketSize);
@ -1015,7 +1016,7 @@ I2cHostQueueRequest (
// //
// Synchronize with the other threads // Synchronize with the other threads
// //
gBS->RaiseTPL ( TPL_I2C_SYNC ); gBS->RaiseTPL (TPL_I2C_SYNC);
FirstRequest = IsListEmpty (&I2cHostContext->RequestList); FirstRequest = IsListEmpty (&I2cHostContext->RequestList);
@ -1085,12 +1086,12 @@ I2cHostQueueRequest (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializeI2cHost( InitializeI2cHost (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).
@ -1122,15 +1123,15 @@ InitializeI2cHost(
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
I2cHostUnload ( I2cHostUnload (
IN EFI_HANDLE ImageHandle IN EFI_HANDLE ImageHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE *DeviceHandleBuffer; EFI_HANDLE *DeviceHandleBuffer;
UINTN DeviceHandleCount; UINTN DeviceHandleCount;
UINTN Index; UINTN Index;
EFI_COMPONENT_NAME_PROTOCOL *ComponentName; EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
// //
// Get the list of all I2C Controller handles in the handle database. // Get the list of all I2C Controller handles in the handle database.
@ -1185,7 +1186,7 @@ I2cHostUnload (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gI2cHostDriverBinding.DriverBindingHandle, gI2cHostDriverBinding.DriverBindingHandle,
&gEfiComponentNameProtocolGuid, &gEfiComponentNameProtocolGuid,
(VOID **) &ComponentName (VOID **)&ComponentName
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallProtocolInterface ( gBS->UninstallProtocolInterface (
@ -1198,7 +1199,7 @@ I2cHostUnload (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
gI2cHostDriverBinding.DriverBindingHandle, gI2cHostDriverBinding.DriverBindingHandle,
&gEfiComponentName2ProtocolGuid, &gEfiComponentName2ProtocolGuid,
(VOID **) &ComponentName2 (VOID **)&ComponentName2
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallProtocolInterface ( gBS->UninstallProtocolInterface (

View File

@ -12,9 +12,9 @@
// //
// Driver name table // Driver name table
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIsaBusDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mIsaBusDriverNameTable[] = {
{ "eng;en", L"PI ISA BUS Driver" }, { "eng;en", L"PI ISA BUS Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
// //
@ -29,9 +29,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIsaBusComponentName
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IsaBusComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)IsaBusComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IsaBusComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)IsaBusComponentNameGetControllerName,
"en" "en"
}; };
@ -91,7 +91,6 @@ IsaBusComponentNameGetDriverName (
); );
} }
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -163,11 +162,11 @@ IsaBusComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IsaBusComponentNameGetControllerName ( IsaBusComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;

View File

@ -13,8 +13,8 @@
#include <Protocol/ComponentName.h> #include <Protocol/ComponentName.h>
#include <Protocol/ComponentName2.h> #include <Protocol/ComponentName2.h>
extern EFI_COMPONENT_NAME_PROTOCOL gIsaBusComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gIsaBusComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2;
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -63,7 +63,6 @@ IsaBusComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -135,11 +134,11 @@ IsaBusComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IsaBusComponentNameGetControllerName ( IsaBusComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
#endif #endif

View File

@ -43,13 +43,13 @@
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IsaBusDriverBindingSupported ( IsaBusDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
VOID *Instance; VOID *Instance;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
@ -61,11 +61,11 @@ IsaBusDriverBindingSupported (
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiIsaHcProtocolGuid, &gEfiIsaHcProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -82,17 +82,17 @@ IsaBusDriverBindingSupported (
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
} }
return Status; return Status;
} }
ISA_BUS_CHILD_PRIVATE_DATA mIsaBusChildPrivateTemplate = { ISA_BUS_CHILD_PRIVATE_DATA mIsaBusChildPrivateTemplate = {
ISA_BUS_CHILD_PRIVATE_DATA_SIGNATURE, ISA_BUS_CHILD_PRIVATE_DATA_SIGNATURE,
FALSE FALSE
}; };
@ -123,10 +123,10 @@ IsaBusCreateChild (
IN OUT EFI_HANDLE *ChildHandle IN OUT EFI_HANDLE *ChildHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ISA_BUS_PRIVATE_DATA *Private; ISA_BUS_PRIVATE_DATA *Private;
EFI_ISA_HC_PROTOCOL *IsaHc; EFI_ISA_HC_PROTOCOL *IsaHc;
ISA_BUS_CHILD_PRIVATE_DATA *Child; ISA_BUS_CHILD_PRIVATE_DATA *Child;
Private = ISA_BUS_PRIVATE_DATA_FROM_THIS (This); Private = ISA_BUS_PRIVATE_DATA_FROM_THIS (This);
@ -137,8 +137,10 @@ IsaBusCreateChild (
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
ChildHandle, ChildHandle,
&gEfiIsaHcProtocolGuid, Private->IsaHc, &gEfiIsaHcProtocolGuid,
&gEfiCallerIdGuid, Child, Private->IsaHc,
&gEfiCallerIdGuid,
Child,
NULL NULL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -149,7 +151,7 @@ IsaBusCreateChild (
return gBS->OpenProtocol ( return gBS->OpenProtocol (
Private->IsaHcHandle, Private->IsaHcHandle,
&gEfiIsaHcProtocolGuid, &gEfiIsaHcProtocolGuid,
(VOID **) &IsaHc, (VOID **)&IsaHc,
gIsaBusDriverBinding.DriverBindingHandle, gIsaBusDriverBinding.DriverBindingHandle,
*ChildHandle, *ChildHandle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@ -177,21 +179,21 @@ IsaBusCreateChild (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IsaBusDestroyChild ( IsaBusDestroyChild (
IN EFI_SERVICE_BINDING_PROTOCOL *This, IN EFI_SERVICE_BINDING_PROTOCOL *This,
IN EFI_HANDLE ChildHandle IN EFI_HANDLE ChildHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ISA_BUS_PRIVATE_DATA *Private; ISA_BUS_PRIVATE_DATA *Private;
EFI_ISA_HC_PROTOCOL *IsaHc; EFI_ISA_HC_PROTOCOL *IsaHc;
ISA_BUS_CHILD_PRIVATE_DATA *Child; ISA_BUS_CHILD_PRIVATE_DATA *Child;
Private = ISA_BUS_PRIVATE_DATA_FROM_THIS (This); Private = ISA_BUS_PRIVATE_DATA_FROM_THIS (This);
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ChildHandle, ChildHandle,
&gEfiCallerIdGuid, &gEfiCallerIdGuid,
(VOID **) &Child, (VOID **)&Child,
gIsaBusDriverBinding.DriverBindingHandle, gIsaBusDriverBinding.DriverBindingHandle,
ChildHandle, ChildHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -207,25 +209,27 @@ IsaBusDestroyChild (
} }
Child->InDestroying = TRUE; Child->InDestroying = TRUE;
Status = gBS->CloseProtocol ( Status = gBS->CloseProtocol (
Private->IsaHcHandle, Private->IsaHcHandle,
&gEfiIsaHcProtocolGuid, &gEfiIsaHcProtocolGuid,
gIsaBusDriverBinding.DriverBindingHandle, gIsaBusDriverBinding.DriverBindingHandle,
ChildHandle ChildHandle
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
Status = gBS->UninstallMultipleProtocolInterfaces ( Status = gBS->UninstallMultipleProtocolInterfaces (
ChildHandle, ChildHandle,
&gEfiIsaHcProtocolGuid, Private->IsaHc, &gEfiIsaHcProtocolGuid,
&gEfiCallerIdGuid, Child, Private->IsaHc,
&gEfiCallerIdGuid,
Child,
NULL NULL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
gBS->OpenProtocol ( gBS->OpenProtocol (
Private->IsaHcHandle, Private->IsaHcHandle,
&gEfiIsaHcProtocolGuid, &gEfiIsaHcProtocolGuid,
(VOID **) &IsaHc, (VOID **)&IsaHc,
gIsaBusDriverBinding.DriverBindingHandle, gIsaBusDriverBinding.DriverBindingHandle,
ChildHandle, ChildHandle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@ -242,7 +246,7 @@ IsaBusDestroyChild (
return Status; return Status;
} }
ISA_BUS_PRIVATE_DATA mIsaBusPrivateTemplate = { ISA_BUS_PRIVATE_DATA mIsaBusPrivateTemplate = {
ISA_BUS_PRIVATE_DATA_SIGNATURE, ISA_BUS_PRIVATE_DATA_SIGNATURE,
{ {
IsaBusCreateChild, IsaBusCreateChild,
@ -278,19 +282,19 @@ ISA_BUS_PRIVATE_DATA mIsaBusPrivateTemplate = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IsaBusDriverBindingStart ( IsaBusDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
ISA_BUS_PRIVATE_DATA *Private; ISA_BUS_PRIVATE_DATA *Private;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiIsaHcProtocolGuid, &gEfiIsaHcProtocolGuid,
(VOID **) &mIsaBusPrivateTemplate.IsaHc, (VOID **)&mIsaBusPrivateTemplate.IsaHc,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -302,7 +306,7 @@ IsaBusDriverBindingStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &DevicePath, (VOID **)&DevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -324,7 +328,8 @@ IsaBusDriverBindingStart (
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&Controller, &Controller,
&gEfiIsaHcServiceBindingProtocolGuid, &Private->ServiceBinding, &gEfiIsaHcServiceBindingProtocolGuid,
&Private->ServiceBinding,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
@ -350,22 +355,22 @@ IsaBusDriverBindingStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IsaBusDriverBindingStop ( IsaBusDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding; EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
ISA_BUS_PRIVATE_DATA *Private; ISA_BUS_PRIVATE_DATA *Private;
UINTN Index; UINTN Index;
BOOLEAN AllChildrenStopped; BOOLEAN AllChildrenStopped;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiIsaHcServiceBindingProtocolGuid, &gEfiIsaHcServiceBindingProtocolGuid,
(VOID **) &ServiceBinding, (VOID **)&ServiceBinding,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -379,7 +384,8 @@ IsaBusDriverBindingStop (
if (NumberOfChildren == 0) { if (NumberOfChildren == 0) {
Status = gBS->UninstallMultipleProtocolInterfaces ( Status = gBS->UninstallMultipleProtocolInterfaces (
Controller, Controller,
&gEfiIsaHcServiceBindingProtocolGuid, &Private->ServiceBinding, &gEfiIsaHcServiceBindingProtocolGuid,
&Private->ServiceBinding,
NULL NULL
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
@ -415,7 +421,7 @@ IsaBusDriverBindingStop (
// //
// ISA Bus Driver Binding Protocol Instance // ISA Bus Driver Binding Protocol Instance
// //
EFI_DRIVER_BINDING_PROTOCOL gIsaBusDriverBinding = { EFI_DRIVER_BINDING_PROTOCOL gIsaBusDriverBinding = {
IsaBusDriverBindingSupported, IsaBusDriverBindingSupported,
IsaBusDriverBindingStart, IsaBusDriverBindingStart,
IsaBusDriverBindingStop, IsaBusDriverBindingStop,
@ -440,7 +446,7 @@ InitializeIsaBus (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = EfiLibInstallDriverBindingComponentName2 ( Status = EfiLibInstallDriverBindingComponentName2 (
ImageHandle, ImageHandle,

View File

@ -26,15 +26,15 @@ typedef struct {
EFI_ISA_HC_PROTOCOL *IsaHc; ///< ISA HC protocol produced by the ISA Host Controller driver EFI_ISA_HC_PROTOCOL *IsaHc; ///< ISA HC protocol produced by the ISA Host Controller driver
EFI_HANDLE IsaHcHandle; ///< ISA HC handle created by the ISA Host Controller driver EFI_HANDLE IsaHcHandle; ///< ISA HC handle created by the ISA Host Controller driver
} ISA_BUS_PRIVATE_DATA; } ISA_BUS_PRIVATE_DATA;
#define ISA_BUS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'i', 's', 'b') #define ISA_BUS_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'i', 's', 'b')
#define ISA_BUS_PRIVATE_DATA_FROM_THIS(a) CR (a, ISA_BUS_PRIVATE_DATA, ServiceBinding, ISA_BUS_PRIVATE_DATA_SIGNATURE) #define ISA_BUS_PRIVATE_DATA_FROM_THIS(a) CR (a, ISA_BUS_PRIVATE_DATA, ServiceBinding, ISA_BUS_PRIVATE_DATA_SIGNATURE)
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
BOOLEAN InDestroying; ///< Flag to avoid DestroyChild() re-entry. BOOLEAN InDestroying; ///< Flag to avoid DestroyChild() re-entry.
} ISA_BUS_CHILD_PRIVATE_DATA; } ISA_BUS_CHILD_PRIVATE_DATA;
#define ISA_BUS_CHILD_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'i', 's', 'c') #define ISA_BUS_CHILD_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('_', 'i', 's', 'c')
extern EFI_DRIVER_BINDING_PROTOCOL gIsaBusDriverBinding; extern EFI_DRIVER_BINDING_PROTOCOL gIsaBusDriverBinding;
#endif #endif

View File

@ -11,6 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
// EFI Component Name Functions // EFI Component Name Functions
// //
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -58,7 +59,6 @@ Ps2KeyboardComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -130,14 +130,13 @@ Ps2KeyboardComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
Ps2KeyboardComponentNameGetControllerName ( Ps2KeyboardComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
@ -150,14 +149,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPs2KeyboardComponent
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2KeyboardComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2KeyboardComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ps2KeyboardComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)Ps2KeyboardComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ps2KeyboardComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)Ps2KeyboardComponentNameGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2KeyboardDriverNameTable[] = {
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2KeyboardDriverNameTable[] = {
{ {
"eng;en", "eng;en",
L"PS/2 Keyboard Driver" L"PS/2 Keyboard Driver"
@ -295,16 +293,17 @@ Ps2KeyboardComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
Ps2KeyboardComponentNameGetControllerName ( Ps2KeyboardComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
// //
// This is a device driver, so ChildHandle must be NULL. // This is a device driver, so ChildHandle must be NULL.
// //
@ -319,13 +318,14 @@ Ps2KeyboardComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Get the device context // Get the device context
// //
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ControllerHandle, ControllerHandle,
&gEfiSimpleTextInProtocolGuid, &gEfiSimpleTextInProtocolGuid,
(VOID **) &ConIn, (VOID **)&ConIn,
gKeyboardControllerDriver.DriverBindingHandle, gKeyboardControllerDriver.DriverBindingHandle,
ControllerHandle, ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL

File diff suppressed because it is too large Load Diff

View File

@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include "Ps2Keyboard.h" #include "Ps2Keyboard.h"
/** /**
@ -20,10 +19,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
BOOLEAN BOOLEAN
IsEfikeyBufEmpty ( IsEfikeyBufEmpty (
IN EFI_KEY_QUEUE *Queue IN EFI_KEY_QUEUE *Queue
) )
{ {
return (BOOLEAN) (Queue->Head == Queue->Tail); return (BOOLEAN)(Queue->Head == Queue->Tail);
} }
/** /**
@ -37,19 +36,21 @@ IsEfikeyBufEmpty (
**/ **/
EFI_STATUS EFI_STATUS
PopEfikeyBufHead ( PopEfikeyBufHead (
IN EFI_KEY_QUEUE *Queue, IN EFI_KEY_QUEUE *Queue,
OUT EFI_KEY_DATA *KeyData OPTIONAL OUT EFI_KEY_DATA *KeyData OPTIONAL
) )
{ {
if (IsEfikeyBufEmpty (Queue)) { if (IsEfikeyBufEmpty (Queue)) {
return EFI_NOT_READY; return EFI_NOT_READY;
} }
// //
// Retrieve and remove the values // Retrieve and remove the values
// //
if (KeyData != NULL) { if (KeyData != NULL) {
CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA)); CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA));
} }
Queue->Head = (Queue->Head + 1) % KEYBOARD_EFI_KEY_MAX_COUNT; Queue->Head = (Queue->Head + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -62,8 +63,8 @@ PopEfikeyBufHead (
**/ **/
VOID VOID
PushEfikeyBufTail ( PushEfikeyBufTail (
IN EFI_KEY_QUEUE *Queue, IN EFI_KEY_QUEUE *Queue,
IN EFI_KEY_DATA *KeyData IN EFI_KEY_DATA *KeyData
) )
{ {
if ((Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT == Queue->Head) { if ((Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT == Queue->Head) {
@ -72,6 +73,7 @@ PushEfikeyBufTail (
// //
PopEfikeyBufHead (Queue, NULL); PopEfikeyBufHead (Queue, NULL);
} }
CopyMem (&Queue->Buffer[Queue->Tail], KeyData, sizeof (EFI_KEY_DATA)); CopyMem (&Queue->Buffer[Queue->Tail], KeyData, sizeof (EFI_KEY_DATA));
Queue->Tail = (Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT; Queue->Tail = (Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;
} }
@ -98,24 +100,27 @@ IsKeyRegistered (
ASSERT (RegsiteredData != NULL && InputData != NULL); ASSERT (RegsiteredData != NULL && InputData != NULL);
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) || if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) { (RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
{
return FALSE; return FALSE;
} }
// //
// Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored. // Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
// //
if (RegsiteredData->KeyState.KeyShiftState != 0 && if ((RegsiteredData->KeyState.KeyShiftState != 0) &&
RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) { (RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState))
{
return FALSE; return FALSE;
} }
if (RegsiteredData->KeyState.KeyToggleState != 0 &&
RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState) { if ((RegsiteredData->KeyState.KeyToggleState != 0) &&
(RegsiteredData->KeyState.KeyToggleState != InputData->KeyState.KeyToggleState))
{
return FALSE; return FALSE;
} }
return TRUE; return TRUE;
} }
/** /**
@ -136,13 +141,13 @@ IsKeyRegistered (
**/ **/
EFI_STATUS EFI_STATUS
KeyboardReadKeyStrokeWorker ( KeyboardReadKeyStrokeWorker (
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev, IN KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev,
OUT EFI_KEY_DATA *KeyData OUT EFI_KEY_DATA *KeyData
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_TPL OldTpl; EFI_TPL OldTpl;
if (KeyData == NULL) { if (KeyData == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -185,9 +190,9 @@ KeyboardEfiReset (
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
EFI_TPL OldTpl; EFI_TPL OldTpl;
ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);
if (ConsoleIn->KeyboardErr) { if (ConsoleIn->KeyboardErr) {
@ -232,6 +237,7 @@ KeyboardEfiReset (
ConsoleIn->DevicePath ConsoleIn->DevicePath
); );
} }
// //
// Report the status If keyboard is locked // Report the status If keyboard is locked
// //
@ -261,9 +267,9 @@ KeyboardReadKeyStroke (
OUT EFI_INPUT_KEY *Key OUT EFI_INPUT_KEY *Key
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);
@ -280,21 +286,23 @@ KeyboardReadKeyStroke (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// If it is partial keystroke, skip it. // If it is partial keystroke, skip it.
// //
if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) { if ((KeyData.Key.ScanCode == SCAN_NULL) && (KeyData.Key.UnicodeChar == CHAR_NULL)) {
continue; continue;
} }
// //
// Translate the CTRL-Alpha characters to their corresponding control value // Translate the CTRL-Alpha characters to their corresponding control value
// (ctrl-a = 0x0001 through ctrl-Z = 0x001A) // (ctrl-a = 0x0001 through ctrl-Z = 0x001A)
// //
if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) { if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) {
if (KeyData.Key.UnicodeChar >= L'a' && KeyData.Key.UnicodeChar <= L'z') { if ((KeyData.Key.UnicodeChar >= L'a') && (KeyData.Key.UnicodeChar <= L'z')) {
KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'a' + 1); KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'a' + 1);
} else if (KeyData.Key.UnicodeChar >= L'A' && KeyData.Key.UnicodeChar <= L'Z') { } else if ((KeyData.Key.UnicodeChar >= L'A') && (KeyData.Key.UnicodeChar <= L'Z')) {
KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'A' + 1); KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'A' + 1);
} }
} }
@ -314,15 +322,15 @@ KeyboardReadKeyStroke (
VOID VOID
EFIAPI EFIAPI
KeyboardWaitForKey ( KeyboardWaitForKey (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_TPL OldTpl; EFI_TPL OldTpl;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context; ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *)Context;
// //
// Enter critical section // Enter critical section
@ -344,10 +352,11 @@ KeyboardWaitForKey (
&(ConsoleIn->EfiKeyQueue.Buffer[ConsoleIn->EfiKeyQueue.Head]), &(ConsoleIn->EfiKeyQueue.Buffer[ConsoleIn->EfiKeyQueue.Head]),
sizeof (EFI_KEY_DATA) sizeof (EFI_KEY_DATA)
); );
if (KeyData.Key.ScanCode == SCAN_NULL && KeyData.Key.UnicodeChar == CHAR_NULL) { if ((KeyData.Key.ScanCode == SCAN_NULL) && (KeyData.Key.UnicodeChar == CHAR_NULL)) {
PopEfikeyBufHead (&ConsoleIn->EfiKeyQueue, &KeyData); PopEfikeyBufHead (&ConsoleIn->EfiKeyQueue, &KeyData);
continue; continue;
} }
// //
// if there is pending value key, signal the event. // if there is pending value key, signal the event.
// //
@ -355,6 +364,7 @@ KeyboardWaitForKey (
break; break;
} }
} }
// //
// Leave critical section and return // Leave critical section and return
// //
@ -372,8 +382,8 @@ KeyboardWaitForKey (
VOID VOID
EFIAPI EFIAPI
KeyboardWaitForKeyEx ( KeyboardWaitForKeyEx (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
@ -399,7 +409,7 @@ KeyboardEfiResetEx (
) )
{ {
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This); ConsoleInDev = TEXT_INPUT_EX_KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);
@ -428,12 +438,12 @@ KeyboardEfiResetEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KeyboardReadKeyStrokeEx ( KeyboardReadKeyStrokeEx (
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
OUT EFI_KEY_DATA *KeyData OUT EFI_KEY_DATA *KeyData
) )
{ {
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
if (KeyData == NULL) { if (KeyData == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -465,9 +475,9 @@ KeyboardSetState (
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
EFI_TPL OldTpl; EFI_TPL OldTpl;
if (KeyToggleState == NULL) { if (KeyToggleState == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -501,12 +511,15 @@ KeyboardSetState (
if ((*KeyToggleState & EFI_SCROLL_LOCK_ACTIVE) == EFI_SCROLL_LOCK_ACTIVE) { if ((*KeyToggleState & EFI_SCROLL_LOCK_ACTIVE) == EFI_SCROLL_LOCK_ACTIVE) {
ConsoleInDev->ScrollLock = TRUE; ConsoleInDev->ScrollLock = TRUE;
} }
if ((*KeyToggleState & EFI_NUM_LOCK_ACTIVE) == EFI_NUM_LOCK_ACTIVE) { if ((*KeyToggleState & EFI_NUM_LOCK_ACTIVE) == EFI_NUM_LOCK_ACTIVE) {
ConsoleInDev->NumLock = TRUE; ConsoleInDev->NumLock = TRUE;
} }
if ((*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == EFI_CAPS_LOCK_ACTIVE) { if ((*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == EFI_CAPS_LOCK_ACTIVE) {
ConsoleInDev->CapsLock = TRUE; ConsoleInDev->CapsLock = TRUE;
} }
if ((*KeyToggleState & EFI_KEY_STATE_EXPOSED) == EFI_KEY_STATE_EXPOSED) { if ((*KeyToggleState & EFI_KEY_STATE_EXPOSED) == EFI_KEY_STATE_EXPOSED) {
ConsoleInDev->IsSupportPartialKey = TRUE; ConsoleInDev->IsSupportPartialKey = TRUE;
} }
@ -523,7 +536,6 @@ Exit:
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
return Status; return Status;
} }
/** /**
@ -553,14 +565,14 @@ KeyboardRegisterKeyNotify (
OUT VOID **NotifyHandle OUT VOID **NotifyHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
EFI_TPL OldTpl; EFI_TPL OldTpl;
LIST_ENTRY *Link; LIST_ENTRY *Link;
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify; KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify;
if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) { if ((KeyData == NULL) || (NotifyHandle == NULL) || (KeyNotificationFunction == NULL)) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -584,7 +596,7 @@ KeyboardRegisterKeyNotify (
if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) { if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) { if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
*NotifyHandle = CurrentNotify; *NotifyHandle = CurrentNotify;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
goto Exit; goto Exit;
} }
} }
@ -593,7 +605,7 @@ KeyboardRegisterKeyNotify (
// //
// Allocate resource to save the notification function // Allocate resource to save the notification function
// //
NewNotify = (KEYBOARD_CONSOLE_IN_EX_NOTIFY *) AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_EX_NOTIFY)); NewNotify = (KEYBOARD_CONSOLE_IN_EX_NOTIFY *)AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_EX_NOTIFY));
if (NewNotify == NULL) { if (NewNotify == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Exit; goto Exit;
@ -604,8 +616,8 @@ KeyboardRegisterKeyNotify (
CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA)); CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA));
InsertTailList (&ConsoleInDev->NotifyList, &NewNotify->NotifyEntry); InsertTailList (&ConsoleInDev->NotifyList, &NewNotify->NotifyEntry);
*NotifyHandle = NewNotify; *NotifyHandle = NewNotify;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
Exit: Exit:
// //
@ -613,7 +625,6 @@ Exit:
// //
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
return Status; return Status;
} }
/** /**
@ -634,11 +645,11 @@ KeyboardUnregisterKeyNotify (
IN VOID *NotificationHandle IN VOID *NotificationHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev; KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
EFI_TPL OldTpl; EFI_TPL OldTpl;
LIST_ENTRY *Link; LIST_ENTRY *Link;
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
if (NotificationHandle == NULL) { if (NotificationHandle == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
@ -691,19 +702,19 @@ Exit:
VOID VOID
EFIAPI EFIAPI
KeyNotifyProcessHandler ( KeyNotifyProcessHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
LIST_ENTRY *Link; LIST_ENTRY *Link;
LIST_ENTRY *NotifyList; LIST_ENTRY *NotifyList;
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify; KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
EFI_TPL OldTpl; EFI_TPL OldTpl;
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context; ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *)Context;
// //
// Invoke notification functions. // Invoke notification functions.
@ -722,6 +733,7 @@ KeyNotifyProcessHandler (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
} }
for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) { for (Link = GetFirstNode (NotifyList); !IsNull (NotifyList, Link); Link = GetNextNode (NotifyList, Link)) {
CurrentNotify = CR (Link, KEYBOARD_CONSOLE_IN_EX_NOTIFY, NotifyEntry, KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE); CurrentNotify = CR (Link, KEYBOARD_CONSOLE_IN_EX_NOTIFY, NotifyEntry, KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE);
if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) { if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {
@ -730,4 +742,3 @@ KeyNotifyProcessHandler (
} }
} }
} }

View File

@ -13,6 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// //
// Function prototypes // Function prototypes
// //
/** /**
Test controller is a keyboard Controller. Test controller is a keyboard Controller.
@ -26,9 +27,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KbdControllerDriverSupported ( KbdControllerDriverSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -43,9 +44,9 @@ KbdControllerDriverSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KbdControllerDriverStart ( KbdControllerDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -65,10 +66,10 @@ KbdControllerDriverStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KbdControllerDriverStop ( KbdControllerDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
/** /**
@ -81,13 +82,13 @@ KbdControllerDriverStop (
**/ **/
EFI_STATUS EFI_STATUS
KbdFreeNotifyList ( KbdFreeNotifyList (
IN OUT LIST_ENTRY *ListHead IN OUT LIST_ENTRY *ListHead
); );
// //
// DriverBinding Protocol Instance // DriverBinding Protocol Instance
// //
EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = { EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {
KbdControllerDriverSupported, KbdControllerDriverSupported,
KbdControllerDriverStart, KbdControllerDriverStart,
KbdControllerDriverStop, KbdControllerDriverStop,
@ -109,15 +110,15 @@ EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KbdControllerDriverSupported ( KbdControllerDriverSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIO_PROTOCOL *Sio; EFI_SIO_PROTOCOL *Sio;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
ACPI_HID_DEVICE_PATH *Acpi; ACPI_HID_DEVICE_PATH *Acpi;
// //
// Check whether the controller is keyboard. // Check whether the controller is keyboard.
@ -125,7 +126,7 @@ KbdControllerDriverSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &DevicePath, (VOID **)&DevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -135,16 +136,17 @@ KbdControllerDriverSupported (
} }
do { do {
Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath; Acpi = (ACPI_HID_DEVICE_PATH *)DevicePath;
DevicePath = NextDevicePathNode (DevicePath); DevicePath = NextDevicePathNode (DevicePath);
} while (!IsDevicePathEnd (DevicePath)); } while (!IsDevicePathEnd (DevicePath));
if (DevicePathType (Acpi) != ACPI_DEVICE_PATH || if ((DevicePathType (Acpi) != ACPI_DEVICE_PATH) ||
(DevicePathSubType (Acpi) != ACPI_DP && DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)) { ((DevicePathSubType (Acpi) != ACPI_DP) && (DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
if (Acpi->HID != EISA_PNP_ID (0x303) || Acpi->UID != 0) { if ((Acpi->HID != EISA_PNP_ID (0x303)) || (Acpi->UID != 0)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
@ -154,7 +156,7 @@ KbdControllerDriverSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSioProtocolGuid, &gEfiSioProtocolGuid,
(VOID **) &Sio, (VOID **)&Sio,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -188,25 +190,25 @@ KbdControllerDriverSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KbdControllerDriverStart ( KbdControllerDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_STATUS Status1; EFI_STATUS Status1;
EFI_SIO_PROTOCOL *Sio; EFI_SIO_PROTOCOL *Sio;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
UINT8 Data; UINT8 Data;
EFI_STATUS_CODE_VALUE StatusCode; EFI_STATUS_CODE_VALUE StatusCode;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
StatusCode = 0; StatusCode = 0;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &DevicePath, (VOID **)&DevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -214,6 +216,7 @@ KbdControllerDriverStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Report that the keyboard is being enabled // Report that the keyboard is being enabled
// //
@ -229,7 +232,7 @@ KbdControllerDriverStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSioProtocolGuid, &gEfiSioProtocolGuid,
(VOID **) &Sio, (VOID **)&Sio,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -237,15 +240,17 @@ KbdControllerDriverStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Allocate private data // Allocate private data
// //
ConsoleIn = AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_DEV)); ConsoleIn = AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_DEV));
if (ConsoleIn == NULL) { if (ConsoleIn == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
goto ErrorExit; goto ErrorExit;
} }
// //
// Setup the device instance // Setup the device instance
// //
@ -283,8 +288,8 @@ KbdControllerDriverStart (
// If nobody decodes KBC I/O port, it will read back as 0xFF. // If nobody decodes KBC I/O port, it will read back as 0xFF.
// Check the Time-Out and Parity bit to see if it has an active KBC in system // Check the Time-Out and Parity bit to see if it has an active KBC in system
// //
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
goto ErrorExit; goto ErrorExit;
} }
} }
@ -300,10 +305,11 @@ KbdControllerDriverStart (
&((ConsoleIn->ConIn).WaitForKey) &((ConsoleIn->ConIn).WaitForKey)
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
goto ErrorExit; goto ErrorExit;
} }
// //
// Setup the WaitForKeyEx event // Setup the WaitForKeyEx event
// //
@ -315,10 +321,11 @@ KbdControllerDriverStart (
&(ConsoleIn->ConInEx.WaitForKeyEx) &(ConsoleIn->ConInEx.WaitForKeyEx)
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
goto ErrorExit; goto ErrorExit;
} }
// Setup a periodic timer, used for reading keystrokes at a fixed interval // Setup a periodic timer, used for reading keystrokes at a fixed interval
// //
Status = gBS->CreateEvent ( Status = gBS->CreateEvent (
@ -329,8 +336,8 @@ KbdControllerDriverStart (
&ConsoleIn->TimerEvent &ConsoleIn->TimerEvent
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
goto ErrorExit; goto ErrorExit;
} }
@ -340,8 +347,8 @@ KbdControllerDriverStart (
KEYBOARD_TIMER_INTERVAL KEYBOARD_TIMER_INTERVAL
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
goto ErrorExit; goto ErrorExit;
} }
@ -353,8 +360,8 @@ KbdControllerDriverStart (
&ConsoleIn->KeyNotifyProcessEvent &ConsoleIn->KeyNotifyProcessEvent
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
goto ErrorExit; goto ErrorExit;
} }
@ -369,8 +376,8 @@ KbdControllerDriverStart (
// //
Status = ConsoleIn->ConInEx.Reset (&ConsoleIn->ConInEx, FeaturePcdGet (PcdPs2KbdExtendedVerification)); Status = ConsoleIn->ConInEx.Reset (&ConsoleIn->ConInEx, FeaturePcdGet (PcdPs2KbdExtendedVerification));
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED; StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
goto ErrorExit; goto ErrorExit;
} }
@ -396,7 +403,6 @@ KbdControllerDriverStart (
FALSE FALSE
); );
// //
// Install protocol interfaces for the keyboard device. // Install protocol interfaces for the keyboard device.
// //
@ -434,16 +440,20 @@ ErrorExit:
if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) { if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) {
gBS->CloseEvent (ConsoleIn->TimerEvent); gBS->CloseEvent (ConsoleIn->TimerEvent);
} }
if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) { if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {
gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx); gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);
} }
if ((ConsoleIn != NULL) && (ConsoleIn->KeyNotifyProcessEvent != NULL)) { if ((ConsoleIn != NULL) && (ConsoleIn->KeyNotifyProcessEvent != NULL)) {
gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent); gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);
} }
KbdFreeNotifyList (&ConsoleIn->NotifyList); KbdFreeNotifyList (&ConsoleIn->NotifyList);
if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) { if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {
FreeUnicodeStringTable (ConsoleIn->ControllerNameTable); FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);
} }
// //
// Since there will be no timer handler for keyboard input any more, // Since there will be no timer handler for keyboard input any more,
// exhaust input data just in case there is still keyboard data left // exhaust input data just in case there is still keyboard data left
@ -451,7 +461,7 @@ ErrorExit:
if (ConsoleIn != NULL) { if (ConsoleIn != NULL) {
Status1 = EFI_SUCCESS; Status1 = EFI_SUCCESS;
while (!EFI_ERROR (Status1) && (Status != EFI_DEVICE_ERROR)) { while (!EFI_ERROR (Status1) && (Status != EFI_DEVICE_ERROR)) {
Status1 = KeyboardRead (ConsoleIn, &Data);; Status1 = KeyboardRead (ConsoleIn, &Data);
} }
} }
@ -486,16 +496,16 @@ ErrorExit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KbdControllerDriverStop ( KbdControllerDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn; EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn; KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
UINT8 Data; UINT8 Data;
// //
// Disable Keyboard // Disable Keyboard
@ -503,7 +513,7 @@ KbdControllerDriverStop (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSimpleTextInProtocolGuid, &gEfiSimpleTextInProtocolGuid,
(VOID **) &ConIn, (VOID **)&ConIn,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -511,6 +521,7 @@ KbdControllerDriverStop (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSimpleTextInputExProtocolGuid, &gEfiSimpleTextInputExProtocolGuid,
@ -545,8 +556,9 @@ KbdControllerDriverStop (
// //
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
while (!EFI_ERROR (Status)) { while (!EFI_ERROR (Status)) {
Status = KeyboardRead (ConsoleIn, &Data);; Status = KeyboardRead (ConsoleIn, &Data);
} }
// //
// Uninstall the SimpleTextIn and SimpleTextInEx protocols // Uninstall the SimpleTextIn and SimpleTextInEx protocols
// //
@ -576,14 +588,17 @@ KbdControllerDriverStop (
gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey); gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);
(ConsoleIn->ConIn).WaitForKey = NULL; (ConsoleIn->ConIn).WaitForKey = NULL;
} }
if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) { if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) {
gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx); gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);
ConsoleIn->ConInEx.WaitForKeyEx = NULL; ConsoleIn->ConInEx.WaitForKeyEx = NULL;
} }
if (ConsoleIn->KeyNotifyProcessEvent != NULL) { if (ConsoleIn->KeyNotifyProcessEvent != NULL) {
gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent); gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);
ConsoleIn->KeyNotifyProcessEvent = NULL; ConsoleIn->KeyNotifyProcessEvent = NULL;
} }
KbdFreeNotifyList (&ConsoleIn->NotifyList); KbdFreeNotifyList (&ConsoleIn->NotifyList);
FreeUnicodeStringTable (ConsoleIn->ControllerNameTable); FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);
gBS->FreePool (ConsoleIn); gBS->FreePool (ConsoleIn);
@ -601,14 +616,15 @@ KbdControllerDriverStop (
**/ **/
EFI_STATUS EFI_STATUS
KbdFreeNotifyList ( KbdFreeNotifyList (
IN OUT LIST_ENTRY *ListHead IN OUT LIST_ENTRY *ListHead
) )
{ {
KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode; KEYBOARD_CONSOLE_IN_EX_NOTIFY *NotifyNode;
if (ListHead == NULL) { if (ListHead == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
while (!IsListEmpty (ListHead)) { while (!IsListEmpty (ListHead)) {
NotifyNode = CR ( NotifyNode = CR (
ListHead->ForwardLink, ListHead->ForwardLink,
@ -635,12 +651,12 @@ KbdFreeNotifyList (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializePs2Keyboard( InitializePs2Keyboard (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).
@ -655,7 +671,5 @@ InitializePs2Keyboard(
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -41,79 +41,79 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gPs2KeyboardComponentName2;
// //
// Driver Private Data // Driver Private Data
// //
#define KEYBOARD_CONSOLE_IN_DEV_SIGNATURE SIGNATURE_32 ('k', 'k', 'e', 'y') #define KEYBOARD_CONSOLE_IN_DEV_SIGNATURE SIGNATURE_32 ('k', 'k', 'e', 'y')
#define KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('k', 'c', 'e', 'n') #define KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('k', 'c', 'e', 'n')
typedef struct _KEYBOARD_CONSOLE_IN_EX_NOTIFY { typedef struct _KEYBOARD_CONSOLE_IN_EX_NOTIFY {
UINTN Signature; UINTN Signature;
EFI_KEY_DATA KeyData; EFI_KEY_DATA KeyData;
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn; EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
LIST_ENTRY NotifyEntry; LIST_ENTRY NotifyEntry;
} KEYBOARD_CONSOLE_IN_EX_NOTIFY; } KEYBOARD_CONSOLE_IN_EX_NOTIFY;
#define KEYBOARD_SCAN_CODE_MAX_COUNT 32 #define KEYBOARD_SCAN_CODE_MAX_COUNT 32
typedef struct { typedef struct {
UINT8 Buffer[KEYBOARD_SCAN_CODE_MAX_COUNT]; UINT8 Buffer[KEYBOARD_SCAN_CODE_MAX_COUNT];
UINTN Head; UINTN Head;
UINTN Tail; UINTN Tail;
} SCAN_CODE_QUEUE; } SCAN_CODE_QUEUE;
#define KEYBOARD_EFI_KEY_MAX_COUNT 256 #define KEYBOARD_EFI_KEY_MAX_COUNT 256
typedef struct { typedef struct {
EFI_KEY_DATA Buffer[KEYBOARD_EFI_KEY_MAX_COUNT]; EFI_KEY_DATA Buffer[KEYBOARD_EFI_KEY_MAX_COUNT];
UINTN Head; UINTN Head;
UINTN Tail; UINTN Tail;
} EFI_KEY_QUEUE; } EFI_KEY_QUEUE;
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
EFI_HANDLE Handle; EFI_HANDLE Handle;
EFI_SIMPLE_TEXT_INPUT_PROTOCOL ConIn; EFI_SIMPLE_TEXT_INPUT_PROTOCOL ConIn;
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL ConInEx; EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL ConInEx;
EFI_EVENT TimerEvent; EFI_EVENT TimerEvent;
UINT32 DataRegisterAddress; UINT32 DataRegisterAddress;
UINT32 StatusRegisterAddress; UINT32 StatusRegisterAddress;
UINT32 CommandRegisterAddress; UINT32 CommandRegisterAddress;
BOOLEAN LeftCtrl; BOOLEAN LeftCtrl;
BOOLEAN RightCtrl; BOOLEAN RightCtrl;
BOOLEAN LeftAlt; BOOLEAN LeftAlt;
BOOLEAN RightAlt; BOOLEAN RightAlt;
BOOLEAN LeftShift; BOOLEAN LeftShift;
BOOLEAN RightShift; BOOLEAN RightShift;
BOOLEAN LeftLogo; BOOLEAN LeftLogo;
BOOLEAN RightLogo; BOOLEAN RightLogo;
BOOLEAN Menu; BOOLEAN Menu;
BOOLEAN SysReq; BOOLEAN SysReq;
BOOLEAN CapsLock; BOOLEAN CapsLock;
BOOLEAN NumLock; BOOLEAN NumLock;
BOOLEAN ScrollLock; BOOLEAN ScrollLock;
BOOLEAN IsSupportPartialKey; BOOLEAN IsSupportPartialKey;
// //
// Queue storing key scancodes // Queue storing key scancodes
// //
SCAN_CODE_QUEUE ScancodeQueue; SCAN_CODE_QUEUE ScancodeQueue;
EFI_KEY_QUEUE EfiKeyQueue; EFI_KEY_QUEUE EfiKeyQueue;
EFI_KEY_QUEUE EfiKeyQueueForNotify; EFI_KEY_QUEUE EfiKeyQueueForNotify;
// //
// Error state // Error state
// //
BOOLEAN KeyboardErr; BOOLEAN KeyboardErr;
EFI_UNICODE_STRING_TABLE *ControllerNameTable; EFI_UNICODE_STRING_TABLE *ControllerNameTable;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
// //
// Notification Function List // Notification Function List
// //
LIST_ENTRY NotifyList; LIST_ENTRY NotifyList;
EFI_EVENT KeyNotifyProcessEvent; EFI_EVENT KeyNotifyProcessEvent;
} KEYBOARD_CONSOLE_IN_DEV; } KEYBOARD_CONSOLE_IN_DEV;
#define KEYBOARD_CONSOLE_IN_DEV_FROM_THIS(a) CR (a, KEYBOARD_CONSOLE_IN_DEV, ConIn, KEYBOARD_CONSOLE_IN_DEV_SIGNATURE) #define KEYBOARD_CONSOLE_IN_DEV_FROM_THIS(a) CR (a, KEYBOARD_CONSOLE_IN_DEV, ConIn, KEYBOARD_CONSOLE_IN_DEV_SIGNATURE)
@ -124,11 +124,12 @@ typedef struct {
KEYBOARD_CONSOLE_IN_DEV_SIGNATURE \ KEYBOARD_CONSOLE_IN_DEV_SIGNATURE \
) )
#define TABLE_END 0x0 #define TABLE_END 0x0
// //
// Driver entry point // Driver entry point
// //
/** /**
The user Entry Point for module Ps2Keyboard. The user code starts with this function. The user Entry Point for module Ps2Keyboard. The user code starts with this function.
@ -142,58 +143,57 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InstallPs2KeyboardDriver ( InstallPs2KeyboardDriver (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
); );
#define KEYBOARD_8042_DATA_REGISTER 0x60 #define KEYBOARD_8042_DATA_REGISTER 0x60
#define KEYBOARD_8042_STATUS_REGISTER 0x64 #define KEYBOARD_8042_STATUS_REGISTER 0x64
#define KEYBOARD_8042_COMMAND_REGISTER 0x64 #define KEYBOARD_8042_COMMAND_REGISTER 0x64
#define KEYBOARD_KBEN 0xF4 #define KEYBOARD_KBEN 0xF4
#define KEYBOARD_CMDECHO_ACK 0xFA #define KEYBOARD_CMDECHO_ACK 0xFA
#define KEYBOARD_MAX_TRY 256 // 256 #define KEYBOARD_MAX_TRY 256 // 256
#define KEYBOARD_TIMEOUT 65536 // 0.07s #define KEYBOARD_TIMEOUT 65536 // 0.07s
#define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s #define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s
#define KEYBOARD_BAT_TIMEOUT 4000000 // 4s #define KEYBOARD_BAT_TIMEOUT 4000000 // 4s
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s #define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
#define SCANCODE_EXTENDED0 0xE0 #define SCANCODE_EXTENDED0 0xE0
#define SCANCODE_EXTENDED1 0xE1 #define SCANCODE_EXTENDED1 0xE1
#define SCANCODE_CTRL_MAKE 0x1D #define SCANCODE_CTRL_MAKE 0x1D
#define SCANCODE_CTRL_BREAK 0x9D #define SCANCODE_CTRL_BREAK 0x9D
#define SCANCODE_ALT_MAKE 0x38 #define SCANCODE_ALT_MAKE 0x38
#define SCANCODE_ALT_BREAK 0xB8 #define SCANCODE_ALT_BREAK 0xB8
#define SCANCODE_LEFT_SHIFT_MAKE 0x2A #define SCANCODE_LEFT_SHIFT_MAKE 0x2A
#define SCANCODE_LEFT_SHIFT_BREAK 0xAA #define SCANCODE_LEFT_SHIFT_BREAK 0xAA
#define SCANCODE_RIGHT_SHIFT_MAKE 0x36 #define SCANCODE_RIGHT_SHIFT_MAKE 0x36
#define SCANCODE_RIGHT_SHIFT_BREAK 0xB6 #define SCANCODE_RIGHT_SHIFT_BREAK 0xB6
#define SCANCODE_CAPS_LOCK_MAKE 0x3A #define SCANCODE_CAPS_LOCK_MAKE 0x3A
#define SCANCODE_NUM_LOCK_MAKE 0x45 #define SCANCODE_NUM_LOCK_MAKE 0x45
#define SCANCODE_SCROLL_LOCK_MAKE 0x46 #define SCANCODE_SCROLL_LOCK_MAKE 0x46
#define SCANCODE_DELETE_MAKE 0x53 #define SCANCODE_DELETE_MAKE 0x53
#define SCANCODE_LEFT_LOGO_MAKE 0x5B //GUI key defined in Keyboard scan code #define SCANCODE_LEFT_LOGO_MAKE 0x5B// GUI key defined in Keyboard scan code
#define SCANCODE_LEFT_LOGO_BREAK 0xDB #define SCANCODE_LEFT_LOGO_BREAK 0xDB
#define SCANCODE_RIGHT_LOGO_MAKE 0x5C #define SCANCODE_RIGHT_LOGO_MAKE 0x5C
#define SCANCODE_RIGHT_LOGO_BREAK 0xDC #define SCANCODE_RIGHT_LOGO_BREAK 0xDC
#define SCANCODE_MENU_MAKE 0x5D //APPS key defined in Keyboard scan code #define SCANCODE_MENU_MAKE 0x5D// APPS key defined in Keyboard scan code
#define SCANCODE_MENU_BREAK 0xDD #define SCANCODE_MENU_BREAK 0xDD
#define SCANCODE_SYS_REQ_MAKE 0x37 #define SCANCODE_SYS_REQ_MAKE 0x37
#define SCANCODE_SYS_REQ_BREAK 0xB7 #define SCANCODE_SYS_REQ_BREAK 0xB7
#define SCANCODE_SYS_REQ_MAKE_WITH_ALT 0x54 #define SCANCODE_SYS_REQ_MAKE_WITH_ALT 0x54
#define SCANCODE_SYS_REQ_BREAK_WITH_ALT 0xD4 #define SCANCODE_SYS_REQ_BREAK_WITH_ALT 0xD4
#define SCANCODE_MAX_MAKE 0x60 #define SCANCODE_MAX_MAKE 0x60
#define KEYBOARD_STATUS_REGISTER_HAS_OUTPUT_DATA BIT0 ///< 0 - Output register has no data; 1 - Output register has data
#define KEYBOARD_STATUS_REGISTER_HAS_OUTPUT_DATA BIT0 ///< 0 - Output register has no data; 1 - Output register has data #define KEYBOARD_STATUS_REGISTER_HAS_INPUT_DATA BIT1 ///< 0 - Input register has no data; 1 - Input register has data
#define KEYBOARD_STATUS_REGISTER_HAS_INPUT_DATA BIT1 ///< 0 - Input register has no data; 1 - Input register has data #define KEYBOARD_STATUS_REGISTER_SYSTEM_FLAG BIT2 ///< Set to 0 after power on reset
#define KEYBOARD_STATUS_REGISTER_SYSTEM_FLAG BIT2 ///< Set to 0 after power on reset #define KEYBOARD_STATUS_REGISTER_INPUT_DATA_TYPE BIT3 ///< 0 - Data in input register is data; 1 - Data in input register is command
#define KEYBOARD_STATUS_REGISTER_INPUT_DATA_TYPE BIT3 ///< 0 - Data in input register is data; 1 - Data in input register is command #define KEYBOARD_STATUS_REGISTER_ENABLE_FLAG BIT4 ///< 0 - Keyboard is disable; 1 - Keyboard is enable
#define KEYBOARD_STATUS_REGISTER_ENABLE_FLAG BIT4 ///< 0 - Keyboard is disable; 1 - Keyboard is enable #define KEYBOARD_STATUS_REGISTER_TRANSMIT_TIMEOUT BIT5 ///< 0 - Transmit is complete without timeout; 1 - Transmit is timeout without complete
#define KEYBOARD_STATUS_REGISTER_TRANSMIT_TIMEOUT BIT5 ///< 0 - Transmit is complete without timeout; 1 - Transmit is timeout without complete #define KEYBOARD_STATUS_REGISTER_RECEIVE_TIMEOUT BIT6 ///< 0 - Receive is complete without timeout; 1 - Receive is timeout without complete
#define KEYBOARD_STATUS_REGISTER_RECEIVE_TIMEOUT BIT6 ///< 0 - Receive is complete without timeout; 1 - Receive is timeout without complete #define KEYBOARD_STATUS_REGISTER_PARITY BIT7 ///< 0 - Odd parity; 1 - Even parity
#define KEYBOARD_STATUS_REGISTER_PARITY BIT7 ///< 0 - Odd parity; 1 - Even parity
#define KEYBOARD_8042_COMMAND_READ 0x20 #define KEYBOARD_8042_COMMAND_READ 0x20
#define KEYBOARD_8042_COMMAND_WRITE 0x60 #define KEYBOARD_8042_COMMAND_WRITE 0x60
@ -203,14 +203,13 @@ InstallPs2KeyboardDriver (
#define KEYBOARD_8042_COMMAND_KEYBOARD_INTERFACE_SELF_TEST 0xAB #define KEYBOARD_8042_COMMAND_KEYBOARD_INTERFACE_SELF_TEST 0xAB
#define KEYBOARD_8042_COMMAND_DISABLE_KEYBOARD_INTERFACE 0xAD #define KEYBOARD_8042_COMMAND_DISABLE_KEYBOARD_INTERFACE 0xAD
#define KEYBOARD_8048_COMMAND_CLEAR_OUTPUT_DATA 0xF4 #define KEYBOARD_8048_COMMAND_CLEAR_OUTPUT_DATA 0xF4
#define KEYBOARD_8048_COMMAND_RESET 0xFF #define KEYBOARD_8048_COMMAND_RESET 0xFF
#define KEYBOARD_8048_COMMAND_SELECT_SCAN_CODE_SET 0xF0 #define KEYBOARD_8048_COMMAND_SELECT_SCAN_CODE_SET 0xF0
#define KEYBOARD_8048_RETURN_8042_BAT_SUCCESS 0xAA
#define KEYBOARD_8048_RETURN_8042_BAT_ERROR 0xFC
#define KEYBOARD_8048_RETURN_8042_ACK 0xFA
#define KEYBOARD_8048_RETURN_8042_BAT_SUCCESS 0xAA
#define KEYBOARD_8048_RETURN_8042_BAT_ERROR 0xFC
#define KEYBOARD_8048_RETURN_8042_ACK 0xFA
// //
// Keyboard Controller Status // Keyboard Controller Status
@ -221,6 +220,7 @@ InstallPs2KeyboardDriver (
// //
// Other functions that are used among .c files // Other functions that are used among .c files
// //
/** /**
Show keyboard status lights according to Show keyboard status lights according to
indicators in ConsoleIn. indicators in ConsoleIn.
@ -232,7 +232,7 @@ InstallPs2KeyboardDriver (
**/ **/
EFI_STATUS EFI_STATUS
UpdateStatusLights ( UpdateStatusLights (
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
); );
/** /**
@ -261,7 +261,7 @@ KeyboardRead (
**/ **/
VOID VOID
KeyGetchar ( KeyGetchar (
IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
); );
/** /**
@ -273,8 +273,8 @@ KeyGetchar (
VOID VOID
EFIAPI EFIAPI
KeyNotifyProcessHandler ( KeyNotifyProcessHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -290,11 +290,10 @@ KeyNotifyProcessHandler (
**/ **/
EFI_STATUS EFI_STATUS
InitKeyboard ( InitKeyboard (
IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn, IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
); );
/** /**
Timer event handler: read a series of scancodes from 8042 Timer event handler: read a series of scancodes from 8042
and put them into memory scancode buffer. and put them into memory scancode buffer.
@ -309,8 +308,8 @@ InitKeyboard (
VOID VOID
EFIAPI EFIAPI
KeyboardTimerHandler ( KeyboardTimerHandler (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -358,8 +357,8 @@ KeyboardReadKeyStroke (
VOID VOID
EFIAPI EFIAPI
KeyboardWaitForKey ( KeyboardWaitForKey (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -372,7 +371,7 @@ KeyboardWaitForKey (
**/ **/
UINT8 UINT8
KeyReadStatusRegister ( KeyReadStatusRegister (
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
); );
/** /**
@ -388,7 +387,7 @@ KeyReadStatusRegister (
BOOLEAN BOOLEAN
EFIAPI EFIAPI
CheckKeyboardConnect ( CheckKeyboardConnect (
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
); );
/** /**
@ -402,8 +401,8 @@ CheckKeyboardConnect (
VOID VOID
EFIAPI EFIAPI
KeyboardWaitForKeyEx ( KeyboardWaitForKeyEx (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
// //
@ -447,8 +446,8 @@ KeyboardEfiResetEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
KeyboardReadKeyStrokeEx ( KeyboardReadKeyStrokeEx (
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This, IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
OUT EFI_KEY_DATA *KeyData OUT EFI_KEY_DATA *KeyData
); );
/** /**
@ -526,8 +525,8 @@ KeyboardUnregisterKeyNotify (
**/ **/
VOID VOID
PushEfikeyBufTail ( PushEfikeyBufTail (
IN EFI_KEY_QUEUE *Queue, IN EFI_KEY_QUEUE *Queue,
IN EFI_KEY_DATA *KeyData IN EFI_KEY_DATA *KeyData
); );
/** /**
@ -556,8 +555,8 @@ IsKeyRegistered (
**/ **/
VOID VOID
InitializeKeyState ( InitializeKeyState (
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn, IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,
OUT EFI_KEY_STATE *KeyState OUT EFI_KEY_STATE *KeyState
); );
#endif #endif

View File

@ -9,9 +9,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Ps2Mouse.h" #include "Ps2Mouse.h"
#include "CommPs2.h" #include "CommPs2.h"
UINT8 SampleRateTbl[MaxSampleRate] = { 0xa, 0x14, 0x28, 0x3c, 0x50, 0x64, 0xc8 }; UINT8 SampleRateTbl[MaxSampleRate] = { 0xa, 0x14, 0x28, 0x3c, 0x50, 0x64, 0xc8 };
UINT8 ResolutionTbl[MaxResolution] = { 0, 1, 2, 3 }; UINT8 ResolutionTbl[MaxResolution] = { 0, 1, 2, 3 };
/** /**
Issue self test command via IsaIo interface. Issue self test command via IsaIo interface.
@ -34,6 +34,7 @@ KbcSelfTest (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Read return code // Read return code
// //
@ -45,6 +46,7 @@ KbcSelfTest (
if (Data != 0x55) { if (Data != 0x55) {
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
// //
// Set system flag // Set system flag
// //
@ -63,7 +65,7 @@ KbcSelfTest (
return Status; return Status;
} }
Data |= CMD_SYS_FLAG; Data |= CMD_SYS_FLAG;
Status = Out8042Data (Data); Status = Out8042Data (Data);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
@ -149,7 +151,7 @@ KbcDisableKb (
**/ **/
EFI_STATUS EFI_STATUS
CheckKbStatus ( CheckKbStatus (
OUT BOOLEAN *KeyboardEnable OUT BOOLEAN *KeyboardEnable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -167,6 +169,7 @@ CheckKbStatus (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Check keyboard enable or not // Check keyboard enable or not
// //
@ -201,6 +204,7 @@ PS2MouseReset (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Check BAT Complete Code // Check BAT Complete Code
// //
@ -212,6 +216,7 @@ PS2MouseReset (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Check BAT Complete Code // Check BAT Complete Code
// //
@ -231,7 +236,7 @@ PS2MouseReset (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseSetSampleRate ( PS2MouseSetSampleRate (
IN MOUSE_SR SampleRate IN MOUSE_SR SampleRate
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -258,7 +263,7 @@ PS2MouseSetSampleRate (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseSetResolution ( PS2MouseSetResolution (
IN MOUSE_RE Resolution IN MOUSE_RE Resolution
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -285,7 +290,7 @@ PS2MouseSetResolution (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseSetScaling ( PS2MouseSetScaling (
IN MOUSE_SF Scaling IN MOUSE_SF Scaling
) )
{ {
// //
@ -321,7 +326,7 @@ PS2MouseEnable (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseGetPacket ( PS2MouseGetPacket (
PS2_MOUSE_DEV *MouseDev PS2_MOUSE_DEV *MouseDev
) )
{ {
@ -336,111 +341,112 @@ PS2MouseGetPacket (
BOOLEAN LButton; BOOLEAN LButton;
BOOLEAN RButton; BOOLEAN RButton;
KeyboardEnable = FALSE; KeyboardEnable = FALSE;
State = PS2_READ_BYTE_ONE; State = PS2_READ_BYTE_ONE;
// //
// State machine to get mouse packet // State machine to get mouse packet
// //
while (1) { while (1) {
switch (State) { switch (State) {
case PS2_READ_BYTE_ONE: case PS2_READ_BYTE_ONE:
// //
// Read mouse first byte data, if failed, immediately return // Read mouse first byte data, if failed, immediately return
// //
KbcDisableAux (); KbcDisableAux ();
Count = 1; Count = 1;
Status = PS2MouseRead (&Data, &Count, State); Status = PS2MouseRead (&Data, &Count, State);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
KbcEnableAux (); KbcEnableAux ();
return EFI_NOT_READY; return EFI_NOT_READY;
} }
if (Count != 1) { if (Count != 1) {
KbcEnableAux (); KbcEnableAux ();
return EFI_NOT_READY; return EFI_NOT_READY;
} }
if (IS_PS2_SYNC_BYTE (Data)) { if (IS_PS2_SYNC_BYTE (Data)) {
Packet[0] = Data; Packet[0] = Data;
State = PS2_READ_DATA_BYTE; State = PS2_READ_DATA_BYTE;
CheckKbStatus (&KeyboardEnable); CheckKbStatus (&KeyboardEnable);
KbcDisableKb (); KbcDisableKb ();
KbcEnableAux (); KbcEnableAux ();
} }
break;
case PS2_READ_DATA_BYTE: break;
Count = 2;
Status = PS2MouseRead ((Packet + 1), &Count, State); case PS2_READ_DATA_BYTE:
if (EFI_ERROR (Status)) { Count = 2;
Status = PS2MouseRead ((Packet + 1), &Count, State);
if (EFI_ERROR (Status)) {
if (KeyboardEnable) {
KbcEnableKb ();
}
return EFI_NOT_READY;
}
if (Count != 2) {
if (KeyboardEnable) {
KbcEnableKb ();
}
return EFI_NOT_READY;
}
State = PS2_PROCESS_PACKET;
break;
case PS2_PROCESS_PACKET:
if (KeyboardEnable) { if (KeyboardEnable) {
KbcEnableKb (); KbcEnableKb ();
} }
return EFI_NOT_READY; //
} // Decode the packet
//
if (Count != 2) { RelativeMovementX = Packet[1];
if (KeyboardEnable) { RelativeMovementY = Packet[2];
KbcEnableKb (); //
// Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
// Byte 0 | Y overflow | X overflow | Y sign bit | X sign bit | Always 1 | Middle Btn | Right Btn | Left Btn
// Byte 1 | 8 bit X Movement
// Byte 2 | 8 bit Y Movement
//
// X sign bit + 8 bit X Movement : 9-bit signed twos complement integer that presents the relative displacement of the device in the X direction since the last data transmission.
// Y sign bit + 8 bit Y Movement : Same as X sign bit + 8 bit X Movement.
//
//
// First, Clear X and Y high 8 bits
//
RelativeMovementX = (INT16)(RelativeMovementX & 0xFF);
RelativeMovementY = (INT16)(RelativeMovementY & 0xFF);
//
// Second, if the 9-bit signed twos complement integer is negative, set the high 8 bit 0xff
//
if ((Packet[0] & 0x10) != 0) {
RelativeMovementX = (INT16)(RelativeMovementX | 0xFF00);
} }
return EFI_NOT_READY; if ((Packet[0] & 0x20) != 0) {
} RelativeMovementY = (INT16)(RelativeMovementY | 0xFF00);
}
State = PS2_PROCESS_PACKET; RButton = (UINT8)(Packet[0] & 0x2);
break; LButton = (UINT8)(Packet[0] & 0x1);
case PS2_PROCESS_PACKET: //
if (KeyboardEnable) { // Update mouse state
KbcEnableKb (); //
} MouseDev->State.RelativeMovementX += RelativeMovementX;
// MouseDev->State.RelativeMovementY -= RelativeMovementY;
// Decode the packet MouseDev->State.RightButton = (UINT8)(RButton ? TRUE : FALSE);
// MouseDev->State.LeftButton = (UINT8)(LButton ? TRUE : FALSE);
RelativeMovementX = Packet[1]; MouseDev->StateChanged = TRUE;
RelativeMovementY = Packet[2];
//
// Bit 7 | Bit 6 | Bit 5 | Bit 4 | Bit 3 | Bit 2 | Bit 1 | Bit 0
// Byte 0 | Y overflow | X overflow | Y sign bit | X sign bit | Always 1 | Middle Btn | Right Btn | Left Btn
// Byte 1 | 8 bit X Movement
// Byte 2 | 8 bit Y Movement
//
// X sign bit + 8 bit X Movement : 9-bit signed twos complement integer that presents the relative displacement of the device in the X direction since the last data transmission.
// Y sign bit + 8 bit Y Movement : Same as X sign bit + 8 bit X Movement.
//
//
// First, Clear X and Y high 8 bits
//
RelativeMovementX = (INT16) (RelativeMovementX & 0xFF);
RelativeMovementY = (INT16) (RelativeMovementY & 0xFF);
//
// Second, if the 9-bit signed twos complement integer is negative, set the high 8 bit 0xff
//
if ((Packet[0] & 0x10) != 0) {
RelativeMovementX = (INT16) (RelativeMovementX | 0xFF00);
}
if ((Packet[0] & 0x20) != 0) {
RelativeMovementY = (INT16) (RelativeMovementY | 0xFF00);
}
return EFI_SUCCESS;
RButton = (UINT8) (Packet[0] & 0x2);
LButton = (UINT8) (Packet[0] & 0x1);
//
// Update mouse state
//
MouseDev->State.RelativeMovementX += RelativeMovementX;
MouseDev->State.RelativeMovementY -= RelativeMovementY;
MouseDev->State.RightButton = (UINT8) (RButton ? TRUE : FALSE);
MouseDev->State.LeftButton = (UINT8) (LButton ? TRUE : FALSE);
MouseDev->StateChanged = TRUE;
return EFI_SUCCESS;
} }
} }
} }
@ -456,15 +462,15 @@ PS2MouseGetPacket (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseRead ( PS2MouseRead (
OUT UINT8 *Buffer, OUT UINT8 *Buffer,
IN OUT UINTN *BufSize, IN OUT UINTN *BufSize,
IN UINTN State IN UINTN State
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN BytesRead; UINTN BytesRead;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
if (State == PS2_READ_BYTE_ONE) { if (State == PS2_READ_BYTE_ONE) {
// //
@ -478,17 +484,18 @@ PS2MouseRead (
} }
for (BytesRead = 0; BytesRead < *BufSize; BytesRead++) { for (BytesRead = 0; BytesRead < *BufSize; BytesRead++) {
Status = WaitOutputFull (TIMEOUT); Status = WaitOutputFull (TIMEOUT);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
} }
Buffer[BytesRead] = IoRead8 (KBC_DATA_PORT); Buffer[BytesRead] = IoRead8 (KBC_DATA_PORT);
} }
// //
// Verify the correct number of bytes read // Verify the correct number of bytes read
// //
if (BytesRead == 0 || BytesRead != *BufSize) { if ((BytesRead == 0) || (BytesRead != *BufSize)) {
Status = EFI_NOT_FOUND; Status = EFI_NOT_FOUND;
} }
@ -499,6 +506,7 @@ PS2MouseRead (
// //
// 8042 I/O function // 8042 I/O function
// //
/** /**
I/O work flow of outing 8042 command. I/O work flow of outing 8042 command.
@ -509,7 +517,7 @@ PS2MouseRead (
**/ **/
EFI_STATUS EFI_STATUS
Out8042Command ( Out8042Command (
IN UINT8 Command IN UINT8 Command
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -521,6 +529,7 @@ Out8042Command (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Send command // Send command
// //
@ -544,10 +553,11 @@ Out8042Command (
**/ **/
EFI_STATUS EFI_STATUS
Out8042Data ( Out8042Data (
IN UINT8 Data IN UINT8 Data
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Wait keyboard controller input buffer empty // Wait keyboard controller input buffer empty
// //
@ -570,10 +580,10 @@ Out8042Data (
**/ **/
EFI_STATUS EFI_STATUS
In8042Data ( In8042Data (
IN OUT UINT8 *Data IN OUT UINT8 *Data
) )
{ {
UINTN Delay; UINTN Delay;
Delay = TIMEOUT / 50; Delay = TIMEOUT / 50;
@ -609,8 +619,8 @@ In8042Data (
**/ **/
EFI_STATUS EFI_STATUS
Out8042AuxCommand ( Out8042AuxCommand (
IN UINT8 Command, IN UINT8 Command,
IN BOOLEAN Resend IN BOOLEAN Resend
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -623,6 +633,7 @@ Out8042AuxCommand (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Send write to auxiliary device command // Send write to auxiliary device command
// //
@ -632,6 +643,7 @@ Out8042AuxCommand (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Send auxiliary device command // Send auxiliary device command
// //
@ -650,13 +662,11 @@ Out8042AuxCommand (
// Receive mouse acknowledge, command send success // Receive mouse acknowledge, command send success
// //
return EFI_SUCCESS; return EFI_SUCCESS;
} else if (Resend) { } else if (Resend) {
// //
// Resend fail // Resend fail
// //
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} else if (Data == PS2_RESEND) { } else if (Data == PS2_RESEND) {
// //
// Resend command // Resend command
@ -665,13 +675,11 @@ Out8042AuxCommand (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
} else { } else {
// //
// Invalid return code // Invalid return code
// //
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
return EFI_SUCCESS; return EFI_SUCCESS;
@ -687,10 +695,11 @@ Out8042AuxCommand (
**/ **/
EFI_STATUS EFI_STATUS
Out8042AuxData ( Out8042AuxData (
IN UINT8 Data IN UINT8 Data
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Wait keyboard controller input buffer empty // Wait keyboard controller input buffer empty
// //
@ -698,6 +707,7 @@ Out8042AuxData (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Send write to auxiliary device command // Send write to auxiliary device command
// //
@ -728,7 +738,7 @@ Out8042AuxData (
**/ **/
EFI_STATUS EFI_STATUS
In8042AuxData ( In8042AuxData (
IN OUT UINT8 *Data IN OUT UINT8 *Data
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -746,7 +756,6 @@ In8042AuxData (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Check keyboard controller status, if it is output buffer full and for auxiliary device. Check keyboard controller status, if it is output buffer full and for auxiliary device.
@ -758,7 +767,7 @@ CheckForInput (
VOID VOID
) )
{ {
UINT8 Data; UINT8 Data;
Data = IoRead8 (KBC_CMD_STS_PORT); Data = IoRead8 (KBC_CMD_STS_PORT);
@ -782,11 +791,11 @@ CheckForInput (
**/ **/
EFI_STATUS EFI_STATUS
WaitInputEmpty ( WaitInputEmpty (
IN UINTN Timeout IN UINTN Timeout
) )
{ {
UINTN Delay; UINTN Delay;
UINT8 Data; UINT8 Data;
Delay = Timeout / 50; Delay = Timeout / 50;
@ -821,11 +830,11 @@ WaitInputEmpty (
**/ **/
EFI_STATUS EFI_STATUS
WaitOutputFull ( WaitOutputFull (
IN UINTN Timeout IN UINTN Timeout
) )
{ {
UINTN Delay; UINTN Delay;
UINT8 Data; UINT8 Data;
Delay = Timeout / 50; Delay = Timeout / 50;

View File

@ -11,18 +11,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Ps2Mouse.h" #include "Ps2Mouse.h"
#define PS2_PACKET_LENGTH 3 #define PS2_PACKET_LENGTH 3
#define PS2_SYNC_MASK 0xc #define PS2_SYNC_MASK 0xc
#define PS2_SYNC_BYTE 0x8 #define PS2_SYNC_BYTE 0x8
#define IS_PS2_SYNC_BYTE(byte) ((byte & PS2_SYNC_MASK) == PS2_SYNC_BYTE) #define IS_PS2_SYNC_BYTE(byte) ((byte & PS2_SYNC_MASK) == PS2_SYNC_BYTE)
#define PS2_READ_BYTE_ONE 0 #define PS2_READ_BYTE_ONE 0
#define PS2_READ_DATA_BYTE 1 #define PS2_READ_DATA_BYTE 1
#define PS2_PROCESS_PACKET 2 #define PS2_PROCESS_PACKET 2
#define TIMEOUT 50000 #define TIMEOUT 50000
#define BAT_TIMEOUT 500000 #define BAT_TIMEOUT 500000
// //
// 8042 I/O Port // 8042 I/O Port
@ -42,31 +42,31 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define ENABLE_KB 0xae #define ENABLE_KB 0xae
#define WRITE_AUX_DEV 0xd4 #define WRITE_AUX_DEV 0xd4
#define CMD_SYS_FLAG 0x04 #define CMD_SYS_FLAG 0x04
#define CMD_KB_STS 0x10 #define CMD_KB_STS 0x10
#define CMD_KB_DIS 0x10 #define CMD_KB_DIS 0x10
#define CMD_KB_EN 0x0 #define CMD_KB_EN 0x0
// //
// 8042 Auxiliary Device Command // 8042 Auxiliary Device Command
// //
#define SETSF1_CMD 0xe6 #define SETSF1_CMD 0xe6
#define SETSF2_CMD 0xe7 #define SETSF2_CMD 0xe7
#define SETRE_CMD 0xe8 #define SETRE_CMD 0xe8
#define READ_CMD 0xeb #define READ_CMD 0xeb
#define SETRM_CMD 0xf0 #define SETRM_CMD 0xf0
#define SETSR_CMD 0xf3 #define SETSR_CMD 0xf3
#define ENABLE_CMD 0xf4 #define ENABLE_CMD 0xf4
#define DISABLE_CMD 0xf5 #define DISABLE_CMD 0xf5
#define RESET_CMD 0xff #define RESET_CMD 0xff
// //
// return code // return code
// //
#define PS2_ACK 0xfa #define PS2_ACK 0xfa
#define PS2_RESEND 0xfe #define PS2_RESEND 0xfe
#define PS2MOUSE_BAT1 0xaa #define PS2MOUSE_BAT1 0xaa
#define PS2MOUSE_BAT2 0x0 #define PS2MOUSE_BAT2 0x0
// //
// Keyboard Controller Status // Keyboard Controller Status
@ -78,7 +78,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
/// ///
/// General Time Out /// General Time Out
/// ///
#define KBC_TIM 0x40 #define KBC_TIM 0x40
/// ///
/// Output buffer for auxiliary device (PS/2): /// Output buffer for auxiliary device (PS/2):
/// 0 - Holds keyboard data /// 0 - Holds keyboard data
@ -176,7 +176,7 @@ KbcDisableKb (
**/ **/
EFI_STATUS EFI_STATUS
CheckKbStatus ( CheckKbStatus (
OUT BOOLEAN *KeyboardEnable OUT BOOLEAN *KeyboardEnable
); );
/** /**
@ -198,7 +198,7 @@ PS2MouseReset (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseSetSampleRate ( PS2MouseSetSampleRate (
IN MOUSE_SR SampleRate IN MOUSE_SR SampleRate
); );
/** /**
@ -210,7 +210,7 @@ PS2MouseSetSampleRate (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseSetResolution ( PS2MouseSetResolution (
IN MOUSE_RE Resolution IN MOUSE_RE Resolution
); );
/** /**
@ -222,7 +222,7 @@ PS2MouseSetResolution (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseSetScaling ( PS2MouseSetScaling (
IN MOUSE_SF Scaling IN MOUSE_SF Scaling
); );
/** /**
@ -246,7 +246,7 @@ PS2MouseEnable (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseGetPacket ( PS2MouseGetPacket (
PS2_MOUSE_DEV *MouseDev PS2_MOUSE_DEV *MouseDev
); );
/** /**
@ -260,14 +260,15 @@ PS2MouseGetPacket (
**/ **/
EFI_STATUS EFI_STATUS
PS2MouseRead ( PS2MouseRead (
OUT UINT8 *Buffer, OUT UINT8 *Buffer,
IN OUT UINTN *BufSize, IN OUT UINTN *BufSize,
IN UINTN State IN UINTN State
); );
// //
// 8042 I/O function // 8042 I/O function
// //
/** /**
I/O work flow of outing 8042 command. I/O work flow of outing 8042 command.
@ -278,7 +279,7 @@ PS2MouseRead (
**/ **/
EFI_STATUS EFI_STATUS
Out8042Command ( Out8042Command (
IN UINT8 Command IN UINT8 Command
); );
/** /**
@ -291,7 +292,7 @@ Out8042Command (
**/ **/
EFI_STATUS EFI_STATUS
In8042Data ( In8042Data (
IN OUT UINT8 *Data IN OUT UINT8 *Data
); );
/** /**
@ -304,7 +305,7 @@ In8042Data (
**/ **/
EFI_STATUS EFI_STATUS
Out8042Data ( Out8042Data (
IN UINT8 Data IN UINT8 Data
); );
/** /**
@ -318,8 +319,8 @@ Out8042Data (
**/ **/
EFI_STATUS EFI_STATUS
Out8042AuxCommand ( Out8042AuxCommand (
IN UINT8 Command, IN UINT8 Command,
IN BOOLEAN Resend IN BOOLEAN Resend
); );
/** /**
@ -332,7 +333,7 @@ Out8042AuxCommand (
**/ **/
EFI_STATUS EFI_STATUS
In8042AuxData ( In8042AuxData (
IN OUT UINT8 *Data IN OUT UINT8 *Data
); );
/** /**
@ -345,7 +346,7 @@ In8042AuxData (
**/ **/
EFI_STATUS EFI_STATUS
Out8042AuxData ( Out8042AuxData (
IN UINT8 Data IN UINT8 Data
); );
/** /**
@ -369,7 +370,7 @@ CheckForInput (
**/ **/
EFI_STATUS EFI_STATUS
WaitInputEmpty ( WaitInputEmpty (
IN UINTN Timeout IN UINTN Timeout
); );
/** /**
@ -382,8 +383,7 @@ WaitInputEmpty (
**/ **/
EFI_STATUS EFI_STATUS
WaitOutputFull ( WaitOutputFull (
IN UINTN Timeout IN UINTN Timeout
); );
#endif #endif

View File

@ -20,14 +20,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPs2MouseComponentNam
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2MouseComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2MouseComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ps2MouseComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)Ps2MouseComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ps2MouseComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)Ps2MouseComponentNameGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2MouseDriverNameTable[] = {
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2MouseDriverNameTable[] = {
{ {
"eng;en", "eng;en",
L"PS/2 Mouse Driver" L"PS/2 Mouse Driver"
@ -165,16 +164,16 @@ Ps2MouseComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
Ps2MouseComponentNameGetControllerName ( Ps2MouseComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol; EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
// //
// This is a device driver, so ChildHandle must be NULL. // This is a device driver, so ChildHandle must be NULL.
@ -182,6 +181,7 @@ Ps2MouseComponentNameGetControllerName (
if (ChildHandle != NULL) { if (ChildHandle != NULL) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
// //
// Check Controller's handle // Check Controller's handle
// //
@ -190,13 +190,14 @@ Ps2MouseComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Get the device context // Get the device context
// //
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ControllerHandle, ControllerHandle,
&gEfiSimplePointerProtocolGuid, &gEfiSimplePointerProtocolGuid,
(VOID **) &SimplePointerProtocol, (VOID **)&SimplePointerProtocol,
gPS2MouseDriver.DriverBindingHandle, gPS2MouseDriver.DriverBindingHandle,
ControllerHandle, ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL

View File

@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
/// ///
/// DriverBinding Protocol Instance /// DriverBinding Protocol Instance
/// ///
EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = { EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {
PS2MouseDriverSupported, PS2MouseDriverSupported,
PS2MouseDriverStart, PS2MouseDriverStart,
PS2MouseDriverStop, PS2MouseDriverStop,
@ -39,15 +39,15 @@ EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PS2MouseDriverSupported ( PS2MouseDriverSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIO_PROTOCOL *Sio; EFI_SIO_PROTOCOL *Sio;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
ACPI_HID_DEVICE_PATH *Acpi; ACPI_HID_DEVICE_PATH *Acpi;
// //
// Check whether the controller is keyboard. // Check whether the controller is keyboard.
@ -55,7 +55,7 @@ PS2MouseDriverSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &DevicePath, (VOID **)&DevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -65,37 +65,38 @@ PS2MouseDriverSupported (
} }
do { do {
Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath; Acpi = (ACPI_HID_DEVICE_PATH *)DevicePath;
DevicePath = NextDevicePathNode (DevicePath); DevicePath = NextDevicePathNode (DevicePath);
} while (!IsDevicePathEnd (DevicePath)); } while (!IsDevicePathEnd (DevicePath));
if (DevicePathType (Acpi) != ACPI_DEVICE_PATH || if ((DevicePathType (Acpi) != ACPI_DEVICE_PATH) ||
(DevicePathSubType (Acpi) != ACPI_DP && DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)) { ((DevicePathSubType (Acpi) != ACPI_DP) && (DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)))
{
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
switch (Acpi->HID) { switch (Acpi->HID) {
case EISA_PNP_ID (0xF03): case EISA_PNP_ID (0xF03):
// //
// Microsoft PS/2 style mouse // Microsoft PS/2 style mouse
// //
case EISA_PNP_ID (0xF13): case EISA_PNP_ID (0xF13):
// //
// PS/2 Port for PS/2-style Mice // PS/2 Port for PS/2-style Mice
// //
break;
case EISA_PNP_ID (0x303):
//
// IBM Enhanced (101/102-key, PS/2 mouse support)
//
if (Acpi->UID == 1) {
break; break;
}
default: case EISA_PNP_ID (0x303):
return EFI_UNSUPPORTED; //
break; // IBM Enhanced (101/102-key, PS/2 mouse support)
//
if (Acpi->UID == 1) {
break;
}
default:
return EFI_UNSUPPORTED;
break;
} }
// //
@ -104,7 +105,7 @@ PS2MouseDriverSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSioProtocolGuid, &gEfiSioProtocolGuid,
(VOID **) &Sio, (VOID **)&Sio,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -143,21 +144,21 @@ PS2MouseDriverSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PS2MouseDriverStart ( PS2MouseDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_STATUS EmptyStatus; EFI_STATUS EmptyStatus;
EFI_SIO_PROTOCOL *Sio; EFI_SIO_PROTOCOL *Sio;
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
UINT8 Data; UINT8 Data;
EFI_TPL OldTpl; EFI_TPL OldTpl;
EFI_STATUS_CODE_VALUE StatusCode; EFI_STATUS_CODE_VALUE StatusCode;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
StatusCode = 0; StatusCode = 0;
// //
// Open the device path protocol // Open the device path protocol
@ -165,7 +166,7 @@ PS2MouseDriverStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &DevicePath, (VOID **)&DevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -173,6 +174,7 @@ PS2MouseDriverStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Report that the keyboard is being enabled // Report that the keyboard is being enabled
// //
@ -188,7 +190,7 @@ PS2MouseDriverStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSioProtocolGuid, &gEfiSioProtocolGuid,
(VOID **) &Sio, (VOID **)&Sio,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -196,6 +198,7 @@ PS2MouseDriverStart (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Raise TPL to avoid keyboard operation impact // Raise TPL to avoid keyboard operation impact
// //
@ -209,6 +212,7 @@ PS2MouseDriverStart (
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto ErrorExit; goto ErrorExit;
} }
// //
// Setup the device instance // Setup the device instance
// //
@ -223,14 +227,14 @@ PS2MouseDriverStart (
// //
// Resolution = 4 counts/mm // Resolution = 4 counts/mm
// //
MouseDev->Mode.ResolutionX = 4; MouseDev->Mode.ResolutionX = 4;
MouseDev->Mode.ResolutionY = 4; MouseDev->Mode.ResolutionY = 4;
MouseDev->Mode.LeftButton = TRUE; MouseDev->Mode.LeftButton = TRUE;
MouseDev->Mode.RightButton = TRUE; MouseDev->Mode.RightButton = TRUE;
MouseDev->SimplePointerProtocol.Reset = MouseReset; MouseDev->SimplePointerProtocol.Reset = MouseReset;
MouseDev->SimplePointerProtocol.GetState = MouseGetState; MouseDev->SimplePointerProtocol.GetState = MouseGetState;
MouseDev->SimplePointerProtocol.Mode = &(MouseDev->Mode); MouseDev->SimplePointerProtocol.Mode = &(MouseDev->Mode);
// //
// Initialize keyboard controller if necessary // Initialize keyboard controller if necessary
@ -275,15 +279,15 @@ PS2MouseDriverStart (
// Reset the mouse // Reset the mouse
// //
Status = MouseDev->SimplePointerProtocol.Reset ( Status = MouseDev->SimplePointerProtocol.Reset (
&MouseDev->SimplePointerProtocol, &MouseDev->SimplePointerProtocol,
FeaturePcdGet (PcdPs2MouseExtendedVerification) FeaturePcdGet (PcdPs2MouseExtendedVerification)
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
// //
// mouse not connected // mouse not connected
// //
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED; StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
goto ErrorExit; goto ErrorExit;
} }
@ -307,6 +311,7 @@ PS2MouseDriverStart (
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto ErrorExit; goto ErrorExit;
} }
// //
// Setup a periodic timer, used to poll mouse state // Setup a periodic timer, used to poll mouse state
// //
@ -321,6 +326,7 @@ PS2MouseDriverStart (
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto ErrorExit; goto ErrorExit;
} }
// //
// Start timer to poll mouse (100 samples per second) // Start timer to poll mouse (100 samples per second)
// //
@ -346,7 +352,6 @@ PS2MouseDriverStart (
FALSE FALSE
); );
// //
// Install protocol interfaces for the mouse device. // Install protocol interfaces for the mouse device.
// //
@ -441,21 +446,21 @@ ErrorExit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PS2MouseDriverStop ( PS2MouseDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol; EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
UINT8 Data; UINT8 Data;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiSimplePointerProtocolGuid, &gEfiSimplePointerProtocolGuid,
(VOID **) &SimplePointerProtocol, (VOID **)&SimplePointerProtocol,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -535,15 +540,15 @@ PS2MouseDriverStop (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MouseReset ( MouseReset (
IN EFI_SIMPLE_POINTER_PROTOCOL *This, IN EFI_SIMPLE_POINTER_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
EFI_TPL OldTpl; EFI_TPL OldTpl;
BOOLEAN KeyboardEnable; BOOLEAN KeyboardEnable;
UINT8 Data; UINT8 Data;
MouseDev = PS2_MOUSE_DEV_FROM_THIS (This); MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
@ -625,6 +630,7 @@ MouseReset (
goto Exit; goto Exit;
} }
} }
Exit: Exit:
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
@ -646,11 +652,11 @@ Exit:
**/ **/
BOOLEAN BOOLEAN
CheckMouseConnect ( CheckMouseConnect (
IN PS2_MOUSE_DEV *MouseDev IN PS2_MOUSE_DEV *MouseDev
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = PS2MouseEnable (); Status = PS2MouseEnable ();
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
@ -673,12 +679,12 @@ CheckMouseConnect (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MouseGetState ( MouseGetState (
IN EFI_SIMPLE_POINTER_PROTOCOL *This, IN EFI_SIMPLE_POINTER_PROTOCOL *This,
IN OUT EFI_SIMPLE_POINTER_STATE *State IN OUT EFI_SIMPLE_POINTER_STATE *State
) )
{ {
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
EFI_TPL OldTpl; EFI_TPL OldTpl;
MouseDev = PS2_MOUSE_DEV_FROM_THIS (This); MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
@ -717,13 +723,13 @@ MouseGetState (
VOID VOID
EFIAPI EFIAPI
MouseWaitForInput ( MouseWaitForInput (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
MouseDev = (PS2_MOUSE_DEV *) Context; MouseDev = (PS2_MOUSE_DEV *)Context;
// //
// Someone is waiting on the mouse event, if there's // Someone is waiting on the mouse event, if there's
@ -732,7 +738,6 @@ MouseWaitForInput (
if (MouseDev->StateChanged) { if (MouseDev->StateChanged) {
gBS->SignalEvent (Event); gBS->SignalEvent (Event);
} }
} }
/** /**
@ -751,9 +756,9 @@ PollMouse (
) )
{ {
PS2_MOUSE_DEV *MouseDev; PS2_MOUSE_DEV *MouseDev;
MouseDev = (PS2_MOUSE_DEV *) Context; MouseDev = (PS2_MOUSE_DEV *)Context;
// //
// Polling mouse packet data // Polling mouse packet data
@ -773,12 +778,12 @@ PollMouse (
**/ **/
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
InitializePs2Mouse( InitializePs2Mouse (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install driver model protocol(s). // Install driver model protocol(s).
@ -793,7 +798,5 @@ InitializePs2Mouse(
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -69,29 +69,29 @@ typedef enum {
// //
// Driver Private Data // Driver Private Data
// //
#define PS2_MOUSE_DEV_SIGNATURE SIGNATURE_32 ('p', 's', '2', 'm') #define PS2_MOUSE_DEV_SIGNATURE SIGNATURE_32 ('p', 's', '2', 'm')
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
EFI_HANDLE Handle; EFI_HANDLE Handle;
EFI_SIMPLE_POINTER_PROTOCOL SimplePointerProtocol; EFI_SIMPLE_POINTER_PROTOCOL SimplePointerProtocol;
EFI_SIMPLE_POINTER_STATE State; EFI_SIMPLE_POINTER_STATE State;
EFI_SIMPLE_POINTER_MODE Mode; EFI_SIMPLE_POINTER_MODE Mode;
BOOLEAN StateChanged; BOOLEAN StateChanged;
// //
// PS2 Mouse device specific information // PS2 Mouse device specific information
// //
MOUSE_SR SampleRate; MOUSE_SR SampleRate;
MOUSE_RE Resolution; MOUSE_RE Resolution;
MOUSE_SF Scaling; MOUSE_SF Scaling;
UINT8 DataPackageSize; UINT8 DataPackageSize;
EFI_EVENT TimerEvent; EFI_EVENT TimerEvent;
EFI_UNICODE_STRING_TABLE *ControllerNameTable; EFI_UNICODE_STRING_TABLE *ControllerNameTable;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
} PS2_MOUSE_DEV; } PS2_MOUSE_DEV;
#define PS2_MOUSE_DEV_FROM_THIS(a) CR (a, PS2_MOUSE_DEV, SimplePointerProtocol, PS2_MOUSE_DEV_SIGNATURE) #define PS2_MOUSE_DEV_FROM_THIS(a) CR (a, PS2_MOUSE_DEV, SimplePointerProtocol, PS2_MOUSE_DEV_SIGNATURE)
@ -99,6 +99,7 @@ typedef struct {
// //
// Function prototypes // Function prototypes
// //
/** /**
Test to see if this driver supports ControllerHandle. Any ControllerHandle Test to see if this driver supports ControllerHandle. Any ControllerHandle
than contains a IsaIo protocol can be supported. than contains a IsaIo protocol can be supported.
@ -116,9 +117,9 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PS2MouseDriverSupported ( PS2MouseDriverSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -139,9 +140,9 @@ PS2MouseDriverSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PS2MouseDriverStart ( PS2MouseDriverStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -161,15 +162,16 @@ PS2MouseDriverStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
PS2MouseDriverStop ( PS2MouseDriverStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
// //
// EFI Component Name Functions // EFI Component Name Functions
// //
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -217,7 +219,6 @@ Ps2MouseComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -289,11 +290,11 @@ Ps2MouseComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
Ps2MouseComponentNameGetControllerName ( Ps2MouseComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
/** /**
@ -311,8 +312,8 @@ Ps2MouseComponentNameGetControllerName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MouseReset ( MouseReset (
IN EFI_SIMPLE_POINTER_PROTOCOL *This, IN EFI_SIMPLE_POINTER_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
); );
/** /**
@ -328,8 +329,8 @@ MouseReset (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
MouseGetState ( MouseGetState (
IN EFI_SIMPLE_POINTER_PROTOCOL *This, IN EFI_SIMPLE_POINTER_PROTOCOL *This,
IN OUT EFI_SIMPLE_POINTER_STATE *State IN OUT EFI_SIMPLE_POINTER_STATE *State
); );
/** /**
@ -344,8 +345,8 @@ MouseGetState (
VOID VOID
EFIAPI EFIAPI
MouseWaitForInput ( MouseWaitForInput (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
/** /**
@ -373,7 +374,7 @@ PollMouse (
**/ **/
EFI_STATUS EFI_STATUS
In8042Data ( In8042Data (
IN OUT UINT8 *Data IN OUT UINT8 *Data
); );
/** /**
@ -387,7 +388,7 @@ In8042Data (
**/ **/
BOOLEAN BOOLEAN
CheckMouseConnect ( CheckMouseConnect (
IN PS2_MOUSE_DEV *MouseDev IN PS2_MOUSE_DEV *MouseDev
); );
#endif #endif

View File

@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Ehci.h" #include "Ehci.h"
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
@ -22,19 +21,17 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName =
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EhciComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EhciComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EhciComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EhciComponentNameGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEhciDriverNameTable[] = {
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mEhciDriverNameTable[] = {
{ "eng;en", L"Usb Ehci Driver" }, { "eng;en", L"Usb Ehci Driver" },
{ NULL , NULL } { NULL, NULL }
}; };
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -162,16 +159,16 @@ EhciComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhciComponentNameGetControllerName ( EhciComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
USB2_HC_DEV *EhciDev; USB2_HC_DEV *EhciDev;
EFI_USB2_HC_PROTOCOL *Usb2Hc; EFI_USB2_HC_PROTOCOL *Usb2Hc;
// //
// This is a device driver, so ChildHandle must be NULL. // This is a device driver, so ChildHandle must be NULL.
@ -179,6 +176,7 @@ EhciComponentNameGetControllerName (
if (ChildHandle != NULL) { if (ChildHandle != NULL) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
// //
// Make sure this driver is currently managing ControllerHandle // Make sure this driver is currently managing ControllerHandle
// //
@ -190,13 +188,14 @@ EhciComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Get the device context // Get the device context
// //
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ControllerHandle, ControllerHandle,
&gEfiUsb2HcProtocolGuid, &gEfiUsb2HcProtocolGuid,
(VOID **) &Usb2Hc, (VOID **)&Usb2Hc,
gEhciDriverBinding.DriverBindingHandle, gEhciDriverBinding.DriverBindingHandle,
ControllerHandle, ControllerHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -214,5 +213,4 @@ EhciComponentNameGetControllerName (
ControllerName, ControllerName,
(BOOLEAN)(This == &gEhciComponentName) (BOOLEAN)(This == &gEhciComponentName)
); );
} }

View File

@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _COMPONENT_NAME_H_ #ifndef _COMPONENT_NAME_H_
#define _COMPONENT_NAME_H_ #define _COMPONENT_NAME_H_
/** /**
Retrieves a Unicode string that is the user readable name of the driver. Retrieves a Unicode string that is the user readable name of the driver.
@ -58,7 +57,6 @@ EhciComponentNameGetDriverName (
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
); );
/** /**
Retrieves a Unicode string that is the user readable name of the controller Retrieves a Unicode string that is the user readable name of the controller
that is being managed by a driver. that is being managed by a driver.
@ -130,12 +128,11 @@ EhciComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhciComponentNameGetControllerName ( EhciComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_H_ #ifndef _EFI_EHCI_H_
#define _EFI_EHCI_H_ #define _EFI_EHCI_H_
#include <Uefi.h> #include <Uefi.h>
#include <Protocol/Usb2HostController.h> #include <Protocol/Usb2HostController.h>
@ -31,7 +30,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <IndustryStandard/Pci.h> #include <IndustryStandard/Pci.h>
typedef struct _USB2_HC_DEV USB2_HC_DEV; typedef struct _USB2_HC_DEV USB2_HC_DEV;
#include "UsbHcMem.h" #include "UsbHcMem.h"
#include "EhciReg.h" #include "EhciReg.h"
@ -44,64 +43,63 @@ typedef struct _USB2_HC_DEV USB2_HC_DEV;
// EHC timeout experience values // EHC timeout experience values
// //
#define EHC_1_MICROSECOND 1 #define EHC_1_MICROSECOND 1
#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND) #define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND) #define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
// //
// EHCI register operation timeout, set by experience // EHCI register operation timeout, set by experience
// //
#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND) #define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND) #define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
// //
// Wait for roothub port power stable, refers to Spec[EHCI1.0-2.3.9] // Wait for roothub port power stable, refers to Spec[EHCI1.0-2.3.9]
// //
#define EHC_ROOT_PORT_RECOVERY_STALL (20 * EHC_1_MILLISECOND) #define EHC_ROOT_PORT_RECOVERY_STALL (20 * EHC_1_MILLISECOND)
// //
// Sync and Async transfer polling interval, set by experience, // Sync and Async transfer polling interval, set by experience,
// and the unit of Async is 100us, means 1ms as interval. // and the unit of Async is 100us, means 1ms as interval.
// //
#define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND) #define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND)
#define EHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1) #define EHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1)
// //
// EHCI debug port control status register bit definition // EHCI debug port control status register bit definition
// //
#define USB_DEBUG_PORT_IN_USE BIT10 #define USB_DEBUG_PORT_IN_USE BIT10
#define USB_DEBUG_PORT_ENABLE BIT28 #define USB_DEBUG_PORT_ENABLE BIT28
#define USB_DEBUG_PORT_OWNER BIT30 #define USB_DEBUG_PORT_OWNER BIT30
#define USB_DEBUG_PORT_IN_USE_MASK (USB_DEBUG_PORT_IN_USE | \ #define USB_DEBUG_PORT_IN_USE_MASK (USB_DEBUG_PORT_IN_USE | \
USB_DEBUG_PORT_OWNER) USB_DEBUG_PORT_OWNER)
// //
// EHC raises TPL to TPL_NOTIFY to serialize all its operations // EHC raises TPL to TPL_NOTIFY to serialize all its operations
// to protect shared data structures. // to protect shared data structures.
// //
#define EHC_TPL TPL_NOTIFY #define EHC_TPL TPL_NOTIFY
#define EFI_LIST_CONTAINER(Entry, Type, Field) BASE_CR(Entry, Type, Field) #define EFI_LIST_CONTAINER(Entry, Type, Field) BASE_CR(Entry, Type, Field)
#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 0XFFFFFFFF))
#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 0XFFFFFFFF)) #define EHC_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF))
#define EHC_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF)) #define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
#define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
#define EHC_REG_BIT_IS_SET(Ehc, Offset, Bit) \ #define EHC_REG_BIT_IS_SET(Ehc, Offset, Bit) \
(EHC_BIT_IS_SET(EhcReadOpReg ((Ehc), (Offset)), (Bit))) (EHC_BIT_IS_SET(EhcReadOpReg ((Ehc), (Offset)), (Bit)))
#define USB2_HC_DEV_SIGNATURE SIGNATURE_32 ('e', 'h', 'c', 'i') #define USB2_HC_DEV_SIGNATURE SIGNATURE_32 ('e', 'h', 'c', 'i')
#define EHC_FROM_THIS(a) CR(a, USB2_HC_DEV, Usb2Hc, USB2_HC_DEV_SIGNATURE) #define EHC_FROM_THIS(a) CR(a, USB2_HC_DEV, Usb2Hc, USB2_HC_DEV_SIGNATURE)
struct _USB2_HC_DEV { struct _USB2_HC_DEV {
UINTN Signature; UINTN Signature;
EFI_USB2_HC_PROTOCOL Usb2Hc; EFI_USB2_HC_PROTOCOL Usb2Hc;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
UINT64 OriginalPciAttributes; UINT64 OriginalPciAttributes;
USBHC_MEM_POOL *MemPool; USBHC_MEM_POOL *MemPool;
// //
// Schedule data shared between asynchronous and periodic // Schedule data shared between asynchronous and periodic
@ -112,58 +110,57 @@ struct _USB2_HC_DEV {
// For control transfer, even the short read happens, try the // For control transfer, even the short read happens, try the
// status stage. // status stage.
// //
EHC_QTD *ShortReadStop; EHC_QTD *ShortReadStop;
EFI_EVENT PollTimer; EFI_EVENT PollTimer;
// //
// ExitBootServicesEvent is used to stop the EHC DMA operation // ExitBootServicesEvent is used to stop the EHC DMA operation
// after exit boot service. // after exit boot service.
// //
EFI_EVENT ExitBootServiceEvent; EFI_EVENT ExitBootServiceEvent;
// //
// Asynchronous(bulk and control) transfer schedule data: // Asynchronous(bulk and control) transfer schedule data:
// ReclaimHead is used as the head of the asynchronous transfer // ReclaimHead is used as the head of the asynchronous transfer
// list. It acts as the reclamation header. // list. It acts as the reclamation header.
// //
EHC_QH *ReclaimHead; EHC_QH *ReclaimHead;
// //
// Periodic (interrupt) transfer schedule data: // Periodic (interrupt) transfer schedule data:
// //
VOID *PeriodFrame; // the buffer pointed by this pointer is used to store pci bus address of the QH descriptor. VOID *PeriodFrame; // the buffer pointed by this pointer is used to store pci bus address of the QH descriptor.
VOID *PeriodFrameHost; // the buffer pointed by this pointer is used to store host memory address of the QH descriptor. VOID *PeriodFrameHost; // the buffer pointed by this pointer is used to store host memory address of the QH descriptor.
VOID *PeriodFrameMap; VOID *PeriodFrameMap;
EHC_QH *PeriodOne; EHC_QH *PeriodOne;
LIST_ENTRY AsyncIntTransfers; LIST_ENTRY AsyncIntTransfers;
// //
// EHCI configuration data // EHCI configuration data
// //
UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
UINT32 CapLen; // Capability length UINT32 CapLen; // Capability length
// //
// Misc // Misc
// //
EFI_UNICODE_STRING_TABLE *ControllerNameTable; EFI_UNICODE_STRING_TABLE *ControllerNameTable;
// //
// EHCI debug port info // EHCI debug port info
// //
UINT16 DebugPortOffset; // The offset of debug port mmio register UINT16 DebugPortOffset; // The offset of debug port mmio register
UINT8 DebugPortBarNum; // The bar number of debug port mmio register UINT8 DebugPortBarNum; // The bar number of debug port mmio register
UINT8 DebugPortNum; // The port number of usb debug port UINT8 DebugPortNum; // The port number of usb debug port
BOOLEAN Support64BitDma; // Whether 64 bit DMA may be used with this device BOOLEAN Support64BitDma; // Whether 64 bit DMA may be used with this device
}; };
extern EFI_DRIVER_BINDING_PROTOCOL gEhciDriverBinding;
extern EFI_DRIVER_BINDING_PROTOCOL gEhciDriverBinding; extern EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName;
extern EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName; extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
/** /**
Test to see if this driver supports ControllerHandle. Any Test to see if this driver supports ControllerHandle. Any
@ -181,9 +178,9 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcDriverBindingSupported ( EhcDriverBindingSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -202,9 +199,9 @@ EhcDriverBindingSupported (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcDriverBindingStart ( EhcDriverBindingStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
); );
/** /**
@ -223,11 +220,10 @@ EhcDriverBindingStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcDriverBindingStop ( EhcDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
#endif #endif

View File

@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include "Ehci.h" #include "Ehci.h"
/** /**
@ -19,7 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
VOID VOID
EhcDumpStatus ( EhcDumpStatus (
IN UINT32 State IN UINT32 State
) )
{ {
if (EHC_BIT_IS_SET (State, QTD_STAT_DO_PING)) { if (EHC_BIT_IS_SET (State, QTD_STAT_DO_PING)) {
@ -57,7 +56,6 @@ EhcDumpStatus (
DEBUG ((DEBUG_VERBOSE, "\n")); DEBUG ((DEBUG_VERBOSE, "\n"));
} }
/** /**
Dump the fields of a QTD. Dump the fields of a QTD.
@ -67,12 +65,12 @@ EhcDumpStatus (
**/ **/
VOID VOID
EhcDumpQtd ( EhcDumpQtd (
IN EHC_QTD *Qtd, IN EHC_QTD *Qtd,
IN CHAR8 *Msg IN CHAR8 *Msg
) )
{ {
QTD_HW *QtdHw; QTD_HW *QtdHw;
UINTN Index; UINTN Index;
if (Msg != NULL) { if (Msg != NULL) {
DEBUG ((DEBUG_VERBOSE, Msg)); DEBUG ((DEBUG_VERBOSE, Msg));
@ -89,13 +87,10 @@ EhcDumpQtd (
if (QtdHw->Pid == QTD_PID_SETUP) { if (QtdHw->Pid == QTD_PID_SETUP) {
DEBUG ((DEBUG_VERBOSE, "PID : Setup\n")); DEBUG ((DEBUG_VERBOSE, "PID : Setup\n"));
} else if (QtdHw->Pid == QTD_PID_INPUT) { } else if (QtdHw->Pid == QTD_PID_INPUT) {
DEBUG ((DEBUG_VERBOSE, "PID : IN\n")); DEBUG ((DEBUG_VERBOSE, "PID : IN\n"));
} else if (QtdHw->Pid == QTD_PID_OUTPUT) { } else if (QtdHw->Pid == QTD_PID_OUTPUT) {
DEBUG ((DEBUG_VERBOSE, "PID : OUT\n")); DEBUG ((DEBUG_VERBOSE, "PID : OUT\n"));
} }
DEBUG ((DEBUG_VERBOSE, "Error Count : %d\n", QtdHw->ErrCnt)); DEBUG ((DEBUG_VERBOSE, "Error Count : %d\n", QtdHw->ErrCnt));
@ -109,7 +104,6 @@ EhcDumpQtd (
} }
} }
/** /**
Dump the queue head. Dump the queue head.
@ -120,22 +114,27 @@ EhcDumpQtd (
**/ **/
VOID VOID
EhcDumpQh ( EhcDumpQh (
IN EHC_QH *Qh, IN EHC_QH *Qh,
IN CHAR8 *Msg, IN CHAR8 *Msg,
IN BOOLEAN DumpBuf IN BOOLEAN DumpBuf
) )
{ {
EHC_QTD *Qtd; EHC_QTD *Qtd;
QH_HW *QhHw; QH_HW *QhHw;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
UINTN Index; UINTN Index;
if (Msg != NULL) { if (Msg != NULL) {
DEBUG ((DEBUG_VERBOSE, Msg)); DEBUG ((DEBUG_VERBOSE, Msg));
} }
DEBUG ((DEBUG_VERBOSE, "Queue head @ 0x%p, interval %ld, next qh %p\n", DEBUG ((
Qh, (UINT64)Qh->Interval, Qh->NextQh)); DEBUG_VERBOSE,
"Queue head @ 0x%p, interval %ld, next qh %p\n",
Qh,
(UINT64)Qh->Interval,
Qh->NextQh
));
QhHw = &Qh->QhHw; QhHw = &Qh->QhHw;
@ -166,10 +165,8 @@ EhcDumpQh (
if (QhHw->Pid == QTD_PID_SETUP) { if (QhHw->Pid == QTD_PID_SETUP) {
DEBUG ((DEBUG_VERBOSE, "PID : Setup\n")); DEBUG ((DEBUG_VERBOSE, "PID : Setup\n"));
} else if (QhHw->Pid == QTD_PID_INPUT) { } else if (QhHw->Pid == QTD_PID_INPUT) {
DEBUG ((DEBUG_VERBOSE, "PID : IN\n")); DEBUG ((DEBUG_VERBOSE, "PID : IN\n"));
} else if (QhHw->Pid == QTD_PID_OUTPUT) { } else if (QhHw->Pid == QTD_PID_OUTPUT) {
DEBUG ((DEBUG_VERBOSE, "PID : OUT\n")); DEBUG ((DEBUG_VERBOSE, "PID : OUT\n"));
} }
@ -196,7 +193,6 @@ EhcDumpQh (
} }
} }
/** /**
Dump the buffer in the form of hex. Dump the buffer in the form of hex.
@ -206,15 +202,15 @@ EhcDumpQh (
**/ **/
VOID VOID
EhcDumpBuf ( EhcDumpBuf (
IN UINT8 *Buf, IN UINT8 *Buf,
IN UINTN Len IN UINTN Len
) )
{ {
UINTN Index; UINTN Index;
for (Index = 0; Index < Len; Index++) { for (Index = 0; Index < Len; Index++) {
if (Index % 16 == 0) { if (Index % 16 == 0) {
DEBUG ((DEBUG_VERBOSE,"\n")); DEBUG ((DEBUG_VERBOSE, "\n"));
} }
DEBUG ((DEBUG_VERBOSE, "%02x ", Buf[Index])); DEBUG ((DEBUG_VERBOSE, "%02x ", Buf[Index]));

View File

@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_DEBUG_H_ #ifndef _EFI_EHCI_DEBUG_H_
#define _EFI_EHCI_DEBUG_H_ #define _EFI_EHCI_DEBUG_H_
/** /**
Dump the fields of a QTD. Dump the fields of a QTD.
@ -20,11 +19,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
VOID VOID
EhcDumpQtd ( EhcDumpQtd (
IN EHC_QTD *Qtd, IN EHC_QTD *Qtd,
IN CHAR8 *Msg IN CHAR8 *Msg
); );
/** /**
Dump the queue head. Dump the queue head.
@ -35,12 +33,11 @@ EhcDumpQtd (
**/ **/
VOID VOID
EhcDumpQh ( EhcDumpQh (
IN EHC_QH *Qh, IN EHC_QH *Qh,
IN CHAR8 *Msg, IN CHAR8 *Msg,
IN BOOLEAN DumpBuf IN BOOLEAN DumpBuf
); );
/** /**
Dump the buffer in the form of hex. Dump the buffer in the form of hex.
@ -50,9 +47,8 @@ EhcDumpQh (
**/ **/
VOID VOID
EhcDumpBuf ( EhcDumpBuf (
IN UINT8 *Buf, IN UINT8 *Buf,
IN UINTN Len IN UINTN Len
); );
#endif #endif

View File

@ -7,10 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include "Ehci.h" #include "Ehci.h"
/** /**
Read EHCI capability register. Read EHCI capability register.
@ -23,18 +21,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
UINT32 UINT32
EhcReadCapRegister ( EhcReadCapRegister (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
{ {
UINT32 Data; UINT32 Data;
EFI_STATUS Status; EFI_STATUS Status;
Status = Ehc->PciIo->Mem.Read ( Status = Ehc->PciIo->Mem.Read (
Ehc->PciIo, Ehc->PciIo,
EfiPciIoWidthUint32, EfiPciIoWidthUint32,
EHC_BAR_INDEX, EHC_BAR_INDEX,
(UINT64) Offset, (UINT64)Offset,
1, 1,
&Data &Data
); );
@ -59,12 +57,12 @@ EhcReadCapRegister (
**/ **/
UINT32 UINT32
EhcReadDbgRegister ( EhcReadDbgRegister (
IN CONST USB2_HC_DEV *Ehc, IN CONST USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
{ {
UINT32 Data; UINT32 Data;
EFI_STATUS Status; EFI_STATUS Status;
Status = Ehc->PciIo->Mem.Read ( Status = Ehc->PciIo->Mem.Read (
Ehc->PciIo, Ehc->PciIo,
@ -83,7 +81,6 @@ EhcReadDbgRegister (
return Data; return Data;
} }
/** /**
Check whether the host controller has an in-use debug port. Check whether the host controller has an in-use debug port.
@ -105,11 +102,11 @@ EhcReadDbgRegister (
**/ **/
BOOLEAN BOOLEAN
EhcIsDebugPortInUse ( EhcIsDebugPortInUse (
IN CONST USB2_HC_DEV *Ehc, IN CONST USB2_HC_DEV *Ehc,
IN CONST UINT8 *PortNumber OPTIONAL IN CONST UINT8 *PortNumber OPTIONAL
) )
{ {
UINT32 State; UINT32 State;
if (Ehc->DebugPortNum == 0) { if (Ehc->DebugPortNum == 0) {
// //
@ -121,7 +118,7 @@ EhcIsDebugPortInUse (
// //
// The Debug Port Number field in HCSPARAMS is one-based. // The Debug Port Number field in HCSPARAMS is one-based.
// //
if (PortNumber != NULL && *PortNumber != Ehc->DebugPortNum - 1) { if ((PortNumber != NULL) && (*PortNumber != Ehc->DebugPortNum - 1)) {
// //
// The caller specified a port, but it's not the debug port of the host // The caller specified a port, but it's not the debug port of the host
// controller. // controller.
@ -132,11 +129,10 @@ EhcIsDebugPortInUse (
// //
// Deduce usage from the Control Register. // Deduce usage from the Control Register.
// //
State = EhcReadDbgRegister(Ehc, 0); State = EhcReadDbgRegister (Ehc, 0);
return (State & USB_DEBUG_PORT_IN_USE_MASK) == USB_DEBUG_PORT_IN_USE_MASK; return (State & USB_DEBUG_PORT_IN_USE_MASK) == USB_DEBUG_PORT_IN_USE_MASK;
} }
/** /**
Read EHCI Operation register. Read EHCI Operation register.
@ -149,12 +145,12 @@ EhcIsDebugPortInUse (
**/ **/
UINT32 UINT32
EhcReadOpReg ( EhcReadOpReg (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
{ {
UINT32 Data; UINT32 Data;
EFI_STATUS Status; EFI_STATUS Status;
ASSERT (Ehc->CapLen != 0); ASSERT (Ehc->CapLen != 0);
@ -175,7 +171,6 @@ EhcReadOpReg (
return Data; return Data;
} }
/** /**
Write the data to the EHCI operation register. Write the data to the EHCI operation register.
@ -186,12 +181,12 @@ EhcReadOpReg (
**/ **/
VOID VOID
EhcWriteOpReg ( EhcWriteOpReg (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Data IN UINT32 Data
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
ASSERT (Ehc->CapLen != 0); ASSERT (Ehc->CapLen != 0);
@ -209,7 +204,6 @@ EhcWriteOpReg (
} }
} }
/** /**
Set one bit of the operational register while keeping other bits. Set one bit of the operational register while keeping other bits.
@ -220,19 +214,18 @@ EhcWriteOpReg (
**/ **/
VOID VOID
EhcSetOpRegBit ( EhcSetOpRegBit (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit IN UINT32 Bit
) )
{ {
UINT32 Data; UINT32 Data;
Data = EhcReadOpReg (Ehc, Offset); Data = EhcReadOpReg (Ehc, Offset);
Data |= Bit; Data |= Bit;
EhcWriteOpReg (Ehc, Offset, Data); EhcWriteOpReg (Ehc, Offset, Data);
} }
/** /**
Clear one bit of the operational register while keeping other bits. Clear one bit of the operational register while keeping other bits.
@ -243,19 +236,18 @@ EhcSetOpRegBit (
**/ **/
VOID VOID
EhcClearOpRegBit ( EhcClearOpRegBit (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit IN UINT32 Bit
) )
{ {
UINT32 Data; UINT32 Data;
Data = EhcReadOpReg (Ehc, Offset); Data = EhcReadOpReg (Ehc, Offset);
Data &= ~Bit; Data &= ~Bit;
EhcWriteOpReg (Ehc, Offset, Data); EhcWriteOpReg (Ehc, Offset, Data);
} }
/** /**
Wait the operation register's bit as specified by Bit Wait the operation register's bit as specified by Bit
to become set (or clear). to become set (or clear).
@ -272,14 +264,14 @@ EhcClearOpRegBit (
**/ **/
EFI_STATUS EFI_STATUS
EhcWaitOpRegBit ( EhcWaitOpRegBit (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit, IN UINT32 Bit,
IN BOOLEAN WaitToSet, IN BOOLEAN WaitToSet,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
UINT32 Index; UINT32 Index;
for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) { for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) {
if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) { if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) {
@ -292,7 +284,6 @@ EhcWaitOpRegBit (
return EFI_TIMEOUT; return EFI_TIMEOUT;
} }
/** /**
Add support for UEFI Over Legacy (UoL) feature, stop Add support for UEFI Over Legacy (UoL) feature, stop
the legacy USB SMI support. the legacy USB SMI support.
@ -302,13 +293,13 @@ EhcWaitOpRegBit (
**/ **/
VOID VOID
EhcClearLegacySupport ( EhcClearLegacySupport (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
UINT32 ExtendCap; UINT32 ExtendCap;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
UINT32 Value; UINT32 Value;
UINT32 TimeOut; UINT32 TimeOut;
DEBUG ((DEBUG_INFO, "EhcClearLegacySupport: called to clear legacy support\n")); DEBUG ((DEBUG_INFO, "EhcClearLegacySupport: called to clear legacy support\n"));
@ -337,8 +328,6 @@ EhcClearLegacySupport (
PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value); PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value);
} }
/** /**
Set door bell and wait it to be ACKed by host controller. Set door bell and wait it to be ACKed by host controller.
This function is used to synchronize with the hardware. This function is used to synchronize with the hardware.
@ -352,12 +341,12 @@ EhcClearLegacySupport (
**/ **/
EFI_STATUS EFI_STATUS
EhcSetAndWaitDoorBell ( EhcSetAndWaitDoorBell (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 Data; UINT32 Data;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD);
@ -376,7 +365,6 @@ EhcSetAndWaitDoorBell (
return Status; return Status;
} }
/** /**
Clear all the interrutp status bits, these bits Clear all the interrutp status bits, these bits
are Write-Clean. are Write-Clean.
@ -386,13 +374,12 @@ EhcSetAndWaitDoorBell (
**/ **/
VOID VOID
EhcAckAllInterrupt ( EhcAckAllInterrupt (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK); EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK);
} }
/** /**
Enable the periodic schedule then wait EHC to Enable the periodic schedule then wait EHC to
actually enable it. actually enable it.
@ -406,11 +393,11 @@ EhcAckAllInterrupt (
**/ **/
EFI_STATUS EFI_STATUS
EhcEnablePeriodSchd ( EhcEnablePeriodSchd (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD);
@ -418,11 +405,6 @@ EhcEnablePeriodSchd (
return Status; return Status;
} }
/** /**
Enable asynchrounous schedule. Enable asynchrounous schedule.
@ -435,11 +417,11 @@ EhcEnablePeriodSchd (
**/ **/
EFI_STATUS EFI_STATUS
EhcEnableAsyncSchd ( EhcEnableAsyncSchd (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC);
@ -447,12 +429,6 @@ EhcEnableAsyncSchd (
return Status; return Status;
} }
/** /**
Whether Ehc is halted. Whether Ehc is halted.
@ -464,13 +440,12 @@ EhcEnableAsyncSchd (
**/ **/
BOOLEAN BOOLEAN
EhcIsHalt ( EhcIsHalt (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT); return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT);
} }
/** /**
Whether system error occurred. Whether system error occurred.
@ -482,13 +457,12 @@ EhcIsHalt (
**/ **/
BOOLEAN BOOLEAN
EhcIsSysError ( EhcIsSysError (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR); return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR);
} }
/** /**
Reset the host controller. Reset the host controller.
@ -501,11 +475,11 @@ EhcIsSysError (
**/ **/
EFI_STATUS EFI_STATUS
EhcResetHC ( EhcResetHC (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Host can only be reset when it is halt. If not so, halt it // Host can only be reset when it is halt. If not so, halt it
@ -523,7 +497,6 @@ EhcResetHC (
return Status; return Status;
} }
/** /**
Halt the host controller. Halt the host controller.
@ -536,18 +509,17 @@ EhcResetHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcHaltHC ( EhcHaltHC (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN); EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout); Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout);
return Status; return Status;
} }
/** /**
Set the EHCI to run. Set the EHCI to run.
@ -560,18 +532,17 @@ EhcHaltHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcRunHC ( EhcRunHC (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout); Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout);
return Status; return Status;
} }
/** /**
Initialize the HC hardware. Initialize the HC hardware.
EHCI spec lists the five things to do to initialize the hardware: EHCI spec lists the five things to do to initialize the hardware:
@ -589,12 +560,12 @@ EhcRunHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcInitHC ( EhcInitHC (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 Index; UINT32 Index;
UINT32 RegVal; UINT32 RegVal;
// This ASSERT crashes the BeagleBoard. There is some issue in the USB stack. // This ASSERT crashes the BeagleBoard. There is some issue in the USB stack.
// This ASSERT needs to be removed so the BeagleBoard will boot. When we fix // This ASSERT needs to be removed so the BeagleBoard will boot. When we fix
@ -629,15 +600,15 @@ EhcInitHC (
// 3. Power up all ports if EHCI has Port Power Control (PPC) support // 3. Power up all ports if EHCI has Port Power Control (PPC) support
// //
if (Ehc->HcStructParams & HCSP_PPC) { if (Ehc->HcStructParams & HCSP_PPC) {
for (Index = 0; Index < (UINT8) (Ehc->HcStructParams & HCSP_NPORTS); Index++) { for (Index = 0; Index < (UINT8)(Ehc->HcStructParams & HCSP_NPORTS); Index++) {
// //
// Do not clear port status bits on initialization. Otherwise devices will // Do not clear port status bits on initialization. Otherwise devices will
// not enumerate properly at startup. // not enumerate properly at startup.
// //
RegVal = EhcReadOpReg(Ehc, (UINT32)(EHC_PORT_STAT_OFFSET + (4 * Index))); RegVal = EhcReadOpReg (Ehc, (UINT32)(EHC_PORT_STAT_OFFSET + (4 * Index)));
RegVal &= ~PORTSC_CHANGE_MASK; RegVal &= ~PORTSC_CHANGE_MASK;
RegVal |= PORTSC_POWER; RegVal |= PORTSC_POWER;
EhcWriteOpReg (Ehc, (UINT32) (EHC_PORT_STAT_OFFSET + (4 * Index)), RegVal); EhcWriteOpReg (Ehc, (UINT32)(EHC_PORT_STAT_OFFSET + (4 * Index)), RegVal);
} }
} }

View File

@ -14,20 +14,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// EHCI register offset // EHCI register offset
// //
// //
// Capability register offset // Capability register offset
// //
#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset #define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h #define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset #define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
// //
// Capability register bit definition // Capability register bit definition
// //
#define HCSP_NPORTS 0x0F // Number of root hub port #define HCSP_NPORTS 0x0F // Number of root hub port
#define HCSP_PPC 0x10 // Port Power Control #define HCSP_PPC 0x10 // Port Power Control
#define HCCP_64BIT 0x01 // 64-bit addressing capability #define HCCP_64BIT 0x01 // 64-bit addressing capability
// //
// Operational register offset // Operational register offset
@ -42,66 +41,66 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define EHC_CONFIG_FLAG_OFFSET 0x40 // Configure flag register offset #define EHC_CONFIG_FLAG_OFFSET 0x40 // Configure flag register offset
#define EHC_PORT_STAT_OFFSET 0x44 // Port status/control offset #define EHC_PORT_STAT_OFFSET 0x44 // Port status/control offset
#define EHC_FRAME_LEN 1024 #define EHC_FRAME_LEN 1024
// //
// Register bit definition // Register bit definition
// //
#define CONFIGFLAG_ROUTE_EHC 0x01 // Route port to EHC #define CONFIGFLAG_ROUTE_EHC 0x01 // Route port to EHC
#define USBCMD_RUN 0x01 // Run/stop #define USBCMD_RUN 0x01 // Run/stop
#define USBCMD_RESET 0x02 // Start the host controller reset #define USBCMD_RESET 0x02 // Start the host controller reset
#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule #define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule #define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell #define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
#define USBSTS_IAA 0x20 // Interrupt on async advance #define USBSTS_IAA 0x20 // Interrupt on async advance
#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status #define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status #define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
#define USBSTS_HALT 0x1000 // Host controller halted #define USBSTS_HALT 0x1000 // Host controller halted
#define USBSTS_SYS_ERROR 0x10 // Host system error #define USBSTS_SYS_ERROR 0x10 // Host system error
#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC #define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
// (write clean) bits in USBSTS register // (write clean) bits in USBSTS register
#define PORTSC_CONN 0x01 // Current Connect Status #define PORTSC_CONN 0x01 // Current Connect Status
#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change #define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
#define PORTSC_ENABLED 0x04 // Port Enable / Disable #define PORTSC_ENABLED 0x04 // Port Enable / Disable
#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change #define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
#define PORTSC_OVERCUR 0x10 // Over current Active #define PORTSC_OVERCUR 0x10 // Over current Active
#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change #define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
#define PORSTSC_RESUME 0x40 // Force Port Resume #define PORSTSC_RESUME 0x40 // Force Port Resume
#define PORTSC_SUSPEND 0x80 // Port Suspend State #define PORTSC_SUSPEND 0x80 // Port Suspend State
#define PORTSC_RESET 0x100 // Port Reset #define PORTSC_RESET 0x100 // Port Reset
#define PORTSC_LINESTATE_K 0x400 // Line Status K-state #define PORTSC_LINESTATE_K 0x400 // Line Status K-state
#define PORTSC_LINESTATE_J 0x800 // Line Status J-state #define PORTSC_LINESTATE_J 0x800 // Line Status J-state
#define PORTSC_POWER 0x1000 // Port Power #define PORTSC_POWER 0x1000 // Port Power
#define PORTSC_OWNER 0x2000 // Port Owner #define PORTSC_OWNER 0x2000 // Port Owner
#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits, #define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
// they are WC (write clean) // they are WC (write clean)
// //
// PCI Configuration Registers // PCI Configuration Registers
// //
#define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10 #define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10
// //
// Debug port capability id // Debug port capability id
// //
#define EHC_DEBUG_PORT_CAP_ID 0x0A #define EHC_DEBUG_PORT_CAP_ID 0x0A
#define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0) #define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0)
#define EHC_ADDR(High, QhHw32) \ #define EHC_ADDR(High, QhHw32) \
((VOID *) (UINTN) (LShiftU64 ((High), 32) | ((QhHw32) & 0xFFFFFFF0))) ((VOID *) (UINTN) (LShiftU64 ((High), 32) | ((QhHw32) & 0xFFFFFFF0)))
#define EHCI_IS_DATAIN(EndpointAddr) EHC_BIT_IS_SET((EndpointAddr), 0x80) #define EHCI_IS_DATAIN(EndpointAddr) EHC_BIT_IS_SET((EndpointAddr), 0x80)
// //
// Structure to map the hardware port states to the // Structure to map the hardware port states to the
// UEFI's port states. // UEFI's port states.
// //
typedef struct { typedef struct {
UINT16 HwState; UINT16 HwState;
UINT16 UefiState; UINT16 UefiState;
} USB_PORT_STATE_MAP; } USB_PORT_STATE_MAP;
// //
@ -109,9 +108,9 @@ typedef struct {
// //
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
UINT8 ProgInterface; UINT8 ProgInterface;
UINT8 SubClassCode; UINT8 SubClassCode;
UINT8 BaseCode; UINT8 BaseCode;
} USB_CLASSC; } USB_CLASSC;
#pragma pack() #pragma pack()
@ -126,8 +125,8 @@ typedef struct {
**/ **/
UINT32 UINT32
EhcReadCapRegister ( EhcReadCapRegister (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
); );
/** /**
@ -151,8 +150,8 @@ EhcReadCapRegister (
**/ **/
BOOLEAN BOOLEAN
EhcIsDebugPortInUse ( EhcIsDebugPortInUse (
IN CONST USB2_HC_DEV *Ehc, IN CONST USB2_HC_DEV *Ehc,
IN CONST UINT8 *PortNumber OPTIONAL IN CONST UINT8 *PortNumber OPTIONAL
); );
/** /**
@ -166,11 +165,10 @@ EhcIsDebugPortInUse (
**/ **/
UINT32 UINT32
EhcReadOpReg ( EhcReadOpReg (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
); );
/** /**
Write the data to the EHCI operation register. Write the data to the EHCI operation register.
@ -181,9 +179,9 @@ EhcReadOpReg (
**/ **/
VOID VOID
EhcWriteOpReg ( EhcWriteOpReg (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Data IN UINT32 Data
); );
/** /**
@ -196,9 +194,9 @@ EhcWriteOpReg (
**/ **/
VOID VOID
EhcSetOpRegBit ( EhcSetOpRegBit (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit IN UINT32 Bit
); );
/** /**
@ -211,9 +209,9 @@ EhcSetOpRegBit (
**/ **/
VOID VOID
EhcClearOpRegBit ( EhcClearOpRegBit (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit IN UINT32 Bit
); );
/** /**
@ -225,11 +223,9 @@ EhcClearOpRegBit (
**/ **/
VOID VOID
EhcClearLegacySupport ( EhcClearLegacySupport (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
Set door bell and wait it to be ACKed by host controller. Set door bell and wait it to be ACKed by host controller.
This function is used to synchronize with the hardware. This function is used to synchronize with the hardware.
@ -243,11 +239,10 @@ EhcClearLegacySupport (
**/ **/
EFI_STATUS EFI_STATUS
EhcSetAndWaitDoorBell ( EhcSetAndWaitDoorBell (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
); );
/** /**
Clear all the interrutp status bits, these bits are Write-Clean. Clear all the interrutp status bits, these bits are Write-Clean.
@ -256,11 +251,9 @@ EhcSetAndWaitDoorBell (
**/ **/
VOID VOID
EhcAckAllInterrupt ( EhcAckAllInterrupt (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
Whether Ehc is halted. Whether Ehc is halted.
@ -272,10 +265,9 @@ EhcAckAllInterrupt (
**/ **/
BOOLEAN BOOLEAN
EhcIsHalt ( EhcIsHalt (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
Whether system error occurred. Whether system error occurred.
@ -287,10 +279,9 @@ EhcIsHalt (
**/ **/
BOOLEAN BOOLEAN
EhcIsSysError ( EhcIsSysError (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
Reset the host controller. Reset the host controller.
@ -303,11 +294,10 @@ EhcIsSysError (
**/ **/
EFI_STATUS EFI_STATUS
EhcResetHC ( EhcResetHC (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
); );
/** /**
Halt the host controller. Halt the host controller.
@ -320,11 +310,10 @@ EhcResetHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcHaltHC ( EhcHaltHC (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
); );
/** /**
Set the EHCI to run. Set the EHCI to run.
@ -337,12 +326,10 @@ EhcHaltHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcRunHC ( EhcRunHC (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
); );
/** /**
Initialize the HC hardware. Initialize the HC hardware.
EHCI spec lists the five things to do to initialize the hardware: EHCI spec lists the five things to do to initialize the hardware:
@ -360,7 +347,7 @@ EhcRunHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcInitHC ( EhcInitHC (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
#endif #endif

View File

@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Ehci.h" #include "Ehci.h"
/** /**
Create helper QTD/QH for the EHCI device. Create helper QTD/QH for the EHCI device.
@ -22,14 +21,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
EFI_STATUS EFI_STATUS
EhcCreateHelpQ ( EhcCreateHelpQ (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
USB_ENDPOINT Ep; USB_ENDPOINT Ep;
EHC_QH *Qh; EHC_QH *Qh;
QH_HW *QhHw; QH_HW *QhHw;
EHC_QTD *Qtd; EHC_QTD *Qtd;
EFI_PHYSICAL_ADDRESS PciAddr; EFI_PHYSICAL_ADDRESS PciAddr;
// //
// Create an inactive Qtd to terminate the short packet read. // Create an inactive Qtd to terminate the short packet read.
@ -40,25 +39,25 @@ EhcCreateHelpQ (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Qtd->QtdHw.Status = QTD_STAT_HALTED; Qtd->QtdHw.Status = QTD_STAT_HALTED;
Ehc->ShortReadStop = Qtd; Ehc->ShortReadStop = Qtd;
// //
// Create a QH to act as the EHC reclamation header. // Create a QH to act as the EHC reclamation header.
// Set the header to loopback to itself. // Set the header to loopback to itself.
// //
Ep.DevAddr = 0; Ep.DevAddr = 0;
Ep.EpAddr = 1; Ep.EpAddr = 1;
Ep.Direction = EfiUsbDataIn; Ep.Direction = EfiUsbDataIn;
Ep.DevSpeed = EFI_USB_SPEED_HIGH; Ep.DevSpeed = EFI_USB_SPEED_HIGH;
Ep.MaxPacket = 64; Ep.MaxPacket = 64;
Ep.HubAddr = 0; Ep.HubAddr = 0;
Ep.HubPort = 0; Ep.HubPort = 0;
Ep.Toggle = 0; Ep.Toggle = 0;
Ep.Type = EHC_BULK_TRANSFER; Ep.Type = EHC_BULK_TRANSFER;
Ep.PollRate = 1; Ep.PollRate = 1;
Qh = EhcCreateQh (Ehc, &Ep); Qh = EhcCreateQh (Ehc, &Ep);
if (Qh == NULL) { if (Qh == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -66,7 +65,7 @@ EhcCreateHelpQ (
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
QhHw = &Qh->QhHw; QhHw = &Qh->QhHw;
QhHw->HorizonLink = QH_LINK (PciAddr + OFFSET_OF(EHC_QH, QhHw), EHC_TYPE_QH, FALSE); QhHw->HorizonLink = QH_LINK (PciAddr + OFFSET_OF (EHC_QH, QhHw), EHC_TYPE_QH, FALSE);
QhHw->Status = QTD_STAT_HALTED; QhHw->Status = QTD_STAT_HALTED;
QhHw->ReclaimHead = 1; QhHw->ReclaimHead = 1;
Qh->NextQh = Qh; Qh->NextQh = Qh;
@ -75,10 +74,10 @@ EhcCreateHelpQ (
// //
// Create a dummy QH to act as the terminator for periodical schedule // Create a dummy QH to act as the terminator for periodical schedule
// //
Ep.EpAddr = 2; Ep.EpAddr = 2;
Ep.Type = EHC_INT_TRANSFER_SYNC; Ep.Type = EHC_INT_TRANSFER_SYNC;
Qh = EhcCreateQh (Ehc, &Ep); Qh = EhcCreateQh (Ehc, &Ep);
if (Qh == NULL) { if (Qh == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -90,7 +89,6 @@ EhcCreateHelpQ (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Initialize the schedule data structure such as frame list. Initialize the schedule data structure such as frame list.
@ -102,7 +100,7 @@ EhcCreateHelpQ (
**/ **/
EFI_STATUS EFI_STATUS
EhcInitSched ( EhcInitSched (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
@ -154,8 +152,8 @@ EhcInitSched (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Ehc->PeriodFrame = Buf; Ehc->PeriodFrame = Buf;
Ehc->PeriodFrameMap = Map; Ehc->PeriodFrameMap = Map;
// //
// Program the FRAMELISTBASE register with the low 32 bit addr // Program the FRAMELISTBASE register with the low 32 bit addr
@ -191,13 +189,13 @@ EhcInitSched (
// //
// Initialize the frame list entries then set the registers // Initialize the frame list entries then set the registers
// //
Ehc->PeriodFrameHost = AllocateZeroPool (EHC_FRAME_LEN * sizeof (UINTN)); Ehc->PeriodFrameHost = AllocateZeroPool (EHC_FRAME_LEN * sizeof (UINTN));
if (Ehc->PeriodFrameHost == NULL) { if (Ehc->PeriodFrameHost == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto ErrorExit; goto ErrorExit;
} }
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (EHC_QH));
for (Index = 0; Index < EHC_FRAME_LEN; Index++) { for (Index = 0; Index < EHC_FRAME_LEN; Index++) {
// //
@ -242,7 +240,6 @@ ErrorExit1:
return Status; return Status;
} }
/** /**
Free the schedule data. It may be partially initialized. Free the schedule data. It may be partially initialized.
@ -251,10 +248,10 @@ ErrorExit1:
**/ **/
VOID VOID
EhcFreeSched ( EhcFreeSched (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, 0); EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, 0);
EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, 0); EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, 0);
@ -300,7 +297,6 @@ EhcFreeSched (
} }
} }
/** /**
Link the queue head to the asynchronous schedule list. Link the queue head to the asynchronous schedule list.
UEFI only supports one CTRL/BULK transfer at a time UEFI only supports one CTRL/BULK transfer at a time
@ -314,30 +310,29 @@ EhcFreeSched (
**/ **/
VOID VOID
EhcLinkQhToAsync ( EhcLinkQhToAsync (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
) )
{ {
EHC_QH *Head; EHC_QH *Head;
EFI_PHYSICAL_ADDRESS PciAddr; EFI_PHYSICAL_ADDRESS PciAddr;
// //
// Append the queue head after the reclaim header, then // Append the queue head after the reclaim header, then
// fix the hardware visiable parts (EHCI R1.0 page 72). // fix the hardware visiable parts (EHCI R1.0 page 72).
// ReclaimHead is always linked to the EHCI's AsynListAddr. // ReclaimHead is always linked to the EHCI's AsynListAddr.
// //
Head = Ehc->ReclaimHead; Head = Ehc->ReclaimHead;
Qh->NextQh = Head->NextQh; Qh->NextQh = Head->NextQh;
Head->NextQh = Qh; Head->NextQh = Qh;
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh->NextQh, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh->NextQh, sizeof (EHC_QH));
Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
} }
/** /**
Unlink a queue head from the asynchronous schedule list. Unlink a queue head from the asynchronous schedule list.
Need to synchronize with hardware. Need to synchronize with hardware.
@ -348,13 +343,13 @@ EhcLinkQhToAsync (
**/ **/
VOID VOID
EhcUnlinkQhFromAsync ( EhcUnlinkQhFromAsync (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
) )
{ {
EHC_QH *Head; EHC_QH *Head;
EFI_STATUS Status; EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS PciAddr; EFI_PHYSICAL_ADDRESS PciAddr;
ASSERT (Ehc->ReclaimHead->NextQh == Qh); ASSERT (Ehc->ReclaimHead->NextQh == Qh);
@ -363,13 +358,13 @@ EhcUnlinkQhFromAsync (
// visiable part: Only need to loopback the ReclaimHead. The Qh // visiable part: Only need to loopback the ReclaimHead. The Qh
// is pointing to ReclaimHead (which is staill in the list). // is pointing to ReclaimHead (which is staill in the list).
// //
Head = Ehc->ReclaimHead; Head = Ehc->ReclaimHead;
Head->NextQh = Qh->NextQh; Head->NextQh = Qh->NextQh;
Qh->NextQh = NULL; Qh->NextQh = NULL;
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
// //
// Set and wait the door bell to synchronize with the hardware // Set and wait the door bell to synchronize with the hardware
@ -381,7 +376,6 @@ EhcUnlinkQhFromAsync (
} }
} }
/** /**
Link a queue head for interrupt transfer to the periodic Link a queue head for interrupt transfer to the periodic
schedule frame list. This code is very much the same as schedule frame list. This code is very much the same as
@ -393,23 +387,23 @@ EhcUnlinkQhFromAsync (
**/ **/
VOID VOID
EhcLinkQhToPeriod ( EhcLinkQhToPeriod (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
) )
{ {
UINTN Index; UINTN Index;
EHC_QH *Prev; EHC_QH *Prev;
EHC_QH *Next; EHC_QH *Next;
EFI_PHYSICAL_ADDRESS PciAddr; EFI_PHYSICAL_ADDRESS PciAddr;
for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) { for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {
// //
// First QH can't be NULL because we always keep PeriodOne // First QH can't be NULL because we always keep PeriodOne
// heads on the frame list // heads on the frame list
// //
ASSERT (!EHC_LINK_TERMINATED (((UINT32*)Ehc->PeriodFrame)[Index])); ASSERT (!EHC_LINK_TERMINATED (((UINT32 *)Ehc->PeriodFrame)[Index]));
Next = (EHC_QH*)((UINTN*)Ehc->PeriodFrameHost)[Index]; Next = (EHC_QH *)((UINTN *)Ehc->PeriodFrameHost)[Index];
Prev = NULL; Prev = NULL;
// //
// Now, insert the queue head (Qh) into this frame: // Now, insert the queue head (Qh) into this frame:
@ -422,8 +416,8 @@ EhcLinkQhToPeriod (
// Then, insert the Qh between then // Then, insert the Qh between then
// //
while (Next->Interval > Qh->Interval) { while (Next->Interval > Qh->Interval) {
Prev = Next; Prev = Next;
Next = Next->NextQh; Next = Next->NextQh;
} }
ASSERT (Next != NULL); ASSERT (Next != NULL);
@ -449,15 +443,15 @@ EhcLinkQhToPeriod (
// //
ASSERT ((Index == 0) && (Qh->NextQh == NULL)); ASSERT ((Index == 0) && (Qh->NextQh == NULL));
Prev = Next; Prev = Next;
Next = Next->NextQh; Next = Next->NextQh;
Qh->NextQh = Next; Qh->NextQh = Next;
Prev->NextQh = Qh; Prev->NextQh = Qh;
Qh->QhHw.HorizonLink = Prev->QhHw.HorizonLink; Qh->QhHw.HorizonLink = Prev->QhHw.HorizonLink;
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
break; break;
} }
@ -467,24 +461,23 @@ EhcLinkQhToPeriod (
// guarranted by 2^n polling interval. // guarranted by 2^n polling interval.
// //
if (Qh->NextQh == NULL) { if (Qh->NextQh == NULL) {
Qh->NextQh = Next; Qh->NextQh = Next;
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Next, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Next, sizeof (EHC_QH));
Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
} }
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
if (Prev == NULL) { if (Prev == NULL) {
((UINT32*)Ehc->PeriodFrame)[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); ((UINT32 *)Ehc->PeriodFrame)[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
((UINTN*)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh; ((UINTN *)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh;
} else { } else {
Prev->NextQh = Qh; Prev->NextQh = Qh;
Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
} }
} }
} }
/** /**
Unlink an interrupt queue head from the periodic Unlink an interrupt queue head from the periodic
schedule frame list. schedule frame list.
@ -495,30 +488,30 @@ EhcLinkQhToPeriod (
**/ **/
VOID VOID
EhcUnlinkQhFromPeriod ( EhcUnlinkQhFromPeriod (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
) )
{ {
UINTN Index; UINTN Index;
EHC_QH *Prev; EHC_QH *Prev;
EHC_QH *This; EHC_QH *This;
for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) { for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {
// //
// Frame link can't be NULL because we always keep PeroidOne // Frame link can't be NULL because we always keep PeroidOne
// on the frame list // on the frame list
// //
ASSERT (!EHC_LINK_TERMINATED (((UINT32*)Ehc->PeriodFrame)[Index])); ASSERT (!EHC_LINK_TERMINATED (((UINT32 *)Ehc->PeriodFrame)[Index]));
This = (EHC_QH*)((UINTN*)Ehc->PeriodFrameHost)[Index]; This = (EHC_QH *)((UINTN *)Ehc->PeriodFrameHost)[Index];
Prev = NULL; Prev = NULL;
// //
// Walk through the frame's QH list to find the // Walk through the frame's QH list to find the
// queue head to remove // queue head to remove
// //
while ((This != NULL) && (This != Qh)) { while ((This != NULL) && (This != Qh)) {
Prev = This; Prev = This;
This = This->NextQh; This = This->NextQh;
} }
// //
@ -533,16 +526,15 @@ EhcUnlinkQhFromPeriod (
// //
// Qh is the first entry in the frame // Qh is the first entry in the frame
// //
((UINT32*)Ehc->PeriodFrame)[Index] = Qh->QhHw.HorizonLink; ((UINT32 *)Ehc->PeriodFrame)[Index] = Qh->QhHw.HorizonLink;
((UINTN*)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh->NextQh; ((UINTN *)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh->NextQh;
} else { } else {
Prev->NextQh = Qh->NextQh; Prev->NextQh = Qh->NextQh;
Prev->QhHw.HorizonLink = Qh->QhHw.HorizonLink; Prev->QhHw.HorizonLink = Qh->QhHw.HorizonLink;
} }
} }
} }
/** /**
Check the URB's execution result and update the URB's Check the URB's execution result and update the URB's
result accordingly. result accordingly.
@ -555,23 +547,23 @@ EhcUnlinkQhFromPeriod (
**/ **/
BOOLEAN BOOLEAN
EhcCheckUrbResult ( EhcCheckUrbResult (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb IN URB *Urb
) )
{ {
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
EHC_QTD *Qtd; EHC_QTD *Qtd;
QTD_HW *QtdHw; QTD_HW *QtdHw;
UINT8 State; UINT8 State;
BOOLEAN Finished; BOOLEAN Finished;
EFI_PHYSICAL_ADDRESS PciAddr; EFI_PHYSICAL_ADDRESS PciAddr;
ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL)); ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));
Finished = TRUE; Finished = TRUE;
Urb->Completed = 0; Urb->Completed = 0;
Urb->Result = EFI_USB_NOERROR; Urb->Result = EFI_USB_NOERROR;
if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) { if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
Urb->Result |= EFI_USB_ERR_SYSTEM; Urb->Result |= EFI_USB_ERR_SYSTEM;
@ -581,7 +573,7 @@ EhcCheckUrbResult (
BASE_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) { BASE_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) {
Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList); Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
QtdHw = &Qtd->QtdHw; QtdHw = &Qtd->QtdHw;
State = (UINT8) QtdHw->Status; State = (UINT8)QtdHw->Status;
if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) { if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) {
// //
@ -606,7 +598,6 @@ EhcCheckUrbResult (
Finished = TRUE; Finished = TRUE;
goto ON_EXIT; goto ON_EXIT;
} else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) { } else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) {
// //
// The QTD is still active, no need to check furthur. // The QTD is still active, no need to check furthur.
@ -615,7 +606,6 @@ EhcCheckUrbResult (
Finished = FALSE; Finished = FALSE;
goto ON_EXIT; goto ON_EXIT;
} else { } else {
// //
// This QTD is finished OK or met short packet read. Update the // This QTD is finished OK or met short packet read. Update the
@ -657,12 +647,11 @@ ON_EXIT:
// NOTICE: don't move DT update before the loop, otherwise there is // NOTICE: don't move DT update before the loop, otherwise there is
// a race condition that DT is wrong. // a race condition that DT is wrong.
// //
Urb->DataToggle = (UINT8) Urb->Qh->QhHw.DataToggle; Urb->DataToggle = (UINT8)Urb->Qh->QhHw.DataToggle;
return Finished; return Finished;
} }
/** /**
Execute the transfer by polling the URB. This is a synchronous operation. Execute the transfer by polling the URB. This is a synchronous operation.
@ -677,16 +666,16 @@ ON_EXIT:
**/ **/
EFI_STATUS EFI_STATUS
EhcExecTransfer ( EhcExecTransfer (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb, IN URB *Urb,
IN UINTN TimeOut IN UINTN TimeOut
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN Index; UINTN Index;
UINTN Loop; UINTN Loop;
BOOLEAN Finished; BOOLEAN Finished;
BOOLEAN InfiniteLoop; BOOLEAN InfiniteLoop;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
Loop = TimeOut * EHC_1_MILLISECOND; Loop = TimeOut * EHC_1_MILLISECOND;
@ -717,7 +706,6 @@ EhcExecTransfer (
EhcDumpQh (Urb->Qh, NULL, FALSE); EhcDumpQh (Urb->Qh, NULL, FALSE);
Status = EFI_TIMEOUT; Status = EFI_TIMEOUT;
} else if (Urb->Result != EFI_USB_NOERROR) { } else if (Urb->Result != EFI_USB_NOERROR) {
DEBUG ((DEBUG_ERROR, "EhcExecTransfer: transfer failed with %x\n", Urb->Result)); DEBUG ((DEBUG_ERROR, "EhcExecTransfer: transfer failed with %x\n", Urb->Result));
EhcDumpQh (Urb->Qh, NULL, FALSE); EhcDumpQh (Urb->Qh, NULL, FALSE);
@ -728,7 +716,6 @@ EhcExecTransfer (
return Status; return Status;
} }
/** /**
Delete a single asynchronous interrupt transfer for Delete a single asynchronous interrupt transfer for
the device and endpoint. the device and endpoint.
@ -744,10 +731,10 @@ EhcExecTransfer (
**/ **/
EFI_STATUS EFI_STATUS
EhciDelAsyncIntTransfer ( EhciDelAsyncIntTransfer (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpNum, IN UINT8 EpNum,
OUT UINT8 *DataToggle OUT UINT8 *DataToggle
) )
{ {
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
@ -762,7 +749,8 @@ EhciDelAsyncIntTransfer (
Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList); Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
if ((Urb->Ep.DevAddr == DevAddr) && (Urb->Ep.EpAddr == EpNum) && if ((Urb->Ep.DevAddr == DevAddr) && (Urb->Ep.EpAddr == EpNum) &&
(Urb->Ep.Direction == Direction)) { (Urb->Ep.Direction == Direction))
{
// //
// Check the URB status to retrieve the next data toggle // Check the URB status to retrieve the next data toggle
// from the associated queue head. // from the associated queue head.
@ -782,7 +770,6 @@ EhciDelAsyncIntTransfer (
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
Remove all the asynchronous interrutp transfers. Remove all the asynchronous interrutp transfers.
@ -791,12 +778,12 @@ EhciDelAsyncIntTransfer (
**/ **/
VOID VOID
EhciDelAllAsyncIntTransfers ( EhciDelAllAsyncIntTransfers (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
) )
{ {
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
LIST_ENTRY *Next; LIST_ENTRY *Next;
URB *Urb; URB *Urb;
BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) { BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList); Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
@ -830,21 +817,21 @@ EhciDelAllAsyncIntTransfers (
**/ **/
URB * URB *
EhciInsertAsyncIntTransfer ( EhciInsertAsyncIntTransfer (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpAddr, IN UINT8 EpAddr,
IN UINT8 DevSpeed, IN UINT8 DevSpeed,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket, IN UINTN MaxPacket,
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub, IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
IN UINTN DataLen, IN UINTN DataLen,
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
IN VOID *Context, IN VOID *Context,
IN UINTN Interval IN UINTN Interval
) )
{ {
VOID *Data; VOID *Data;
URB *Urb; URB *Urb;
Data = AllocatePool (DataLen); Data = AllocatePool (DataLen);
@ -899,16 +886,16 @@ EhciInsertAsyncIntTransfer (
**/ **/
EFI_STATUS EFI_STATUS
EhcFlushAsyncIntMap ( EhcFlushAsyncIntMap (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb IN URB *Urb
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS PhyAddr; EFI_PHYSICAL_ADDRESS PhyAddr;
EFI_PCI_IO_PROTOCOL_OPERATION MapOp; EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
UINTN Len; UINTN Len;
VOID *Map; VOID *Map;
PciIo = Ehc->PciIo; PciIo = Ehc->PciIo;
Len = Urb->DataLen; Len = Urb->DataLen;
@ -931,15 +918,14 @@ EhcFlushAsyncIntMap (
goto ON_ERROR; goto ON_ERROR;
} }
Urb->DataPhy = (VOID *) ((UINTN) PhyAddr); Urb->DataPhy = (VOID *)((UINTN)PhyAddr);
Urb->DataMap = Map; Urb->DataMap = Map;
return EFI_SUCCESS; return EFI_SUCCESS;
ON_ERROR: ON_ERROR:
return EFI_DEVICE_ERROR; return EFI_DEVICE_ERROR;
} }
/** /**
Update the queue head for next round of asynchronous transfer. Update the queue head for next round of asynchronous transfer.
@ -949,17 +935,17 @@ ON_ERROR:
**/ **/
VOID VOID
EhcUpdateAsyncRequest ( EhcUpdateAsyncRequest (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb IN URB *Urb
) )
{ {
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
EHC_QTD *FirstQtd; EHC_QTD *FirstQtd;
QH_HW *QhHw; QH_HW *QhHw;
EHC_QTD *Qtd; EHC_QTD *Qtd;
QTD_HW *QtdHw; QTD_HW *QtdHw;
UINTN Index; UINTN Index;
EFI_PHYSICAL_ADDRESS PciAddr; EFI_PHYSICAL_ADDRESS PciAddr;
Qtd = NULL; Qtd = NULL;
@ -985,13 +971,13 @@ EhcUpdateAsyncRequest (
QtdHw->Status = QTD_STAT_ACTIVE; QtdHw->Status = QTD_STAT_ACTIVE;
QtdHw->ErrCnt = QTD_MAX_ERR; QtdHw->ErrCnt = QTD_MAX_ERR;
QtdHw->CurPage = 0; QtdHw->CurPage = 0;
QtdHw->TotalBytes = (UINT32) Qtd->DataLen; QtdHw->TotalBytes = (UINT32)Qtd->DataLen;
// //
// calculate physical address by offset. // calculate physical address by offset.
// //
PciAddr = (UINTN)Urb->DataPhy + ((UINTN)Qtd->Data - (UINTN)Urb->Data); PciAddr = (UINTN)Urb->DataPhy + ((UINTN)Qtd->Data - (UINTN)Urb->Data);
QtdHw->Page[0] = EHC_LOW_32BIT (PciAddr); QtdHw->Page[0] = EHC_LOW_32BIT (PciAddr);
QtdHw->PageHigh[0]= EHC_HIGH_32BIT (PciAddr); QtdHw->PageHigh[0] = EHC_HIGH_32BIT (PciAddr);
} }
// //
@ -1000,30 +986,29 @@ EhcUpdateAsyncRequest (
// zero out the overlay area and set NextQtd to the first // zero out the overlay area and set NextQtd to the first
// QTD. DateToggle bit is left untouched. // QTD. DateToggle bit is left untouched.
// //
QhHw = &Urb->Qh->QhHw; QhHw = &Urb->Qh->QhHw;
QhHw->CurQtd = QTD_LINK (0, TRUE); QhHw->CurQtd = QTD_LINK (0, TRUE);
QhHw->AltQtd = 0; QhHw->AltQtd = 0;
QhHw->Status = 0; QhHw->Status = 0;
QhHw->Pid = 0; QhHw->Pid = 0;
QhHw->ErrCnt = 0; QhHw->ErrCnt = 0;
QhHw->CurPage = 0; QhHw->CurPage = 0;
QhHw->Ioc = 0; QhHw->Ioc = 0;
QhHw->TotalBytes = 0; QhHw->TotalBytes = 0;
for (Index = 0; Index < 5; Index++) { for (Index = 0; Index < 5; Index++) {
QhHw->Page[Index] = 0; QhHw->Page[Index] = 0;
QhHw->PageHigh[Index] = 0; QhHw->PageHigh[Index] = 0;
} }
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, FirstQtd, sizeof (EHC_QTD)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, FirstQtd, sizeof (EHC_QTD));
QhHw->NextQtd = QTD_LINK (PciAddr, FALSE); QhHw->NextQtd = QTD_LINK (PciAddr, FALSE);
} }
return ; return;
} }
/** /**
Interrupt transfer periodic check handler. Interrupt transfer periodic check handler.
@ -1034,21 +1019,21 @@ EhcUpdateAsyncRequest (
VOID VOID
EFIAPI EFIAPI
EhcMonitorAsyncRequests ( EhcMonitorAsyncRequests (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
) )
{ {
USB2_HC_DEV *Ehc; USB2_HC_DEV *Ehc;
EFI_TPL OldTpl; EFI_TPL OldTpl;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
LIST_ENTRY *Next; LIST_ENTRY *Next;
BOOLEAN Finished; BOOLEAN Finished;
UINT8 *ProcBuf; UINT8 *ProcBuf;
URB *Urb; URB *Urb;
EFI_STATUS Status; EFI_STATUS Status;
OldTpl = gBS->RaiseTPL (EHC_TPL); OldTpl = gBS->RaiseTPL (EHC_TPL);
Ehc = (USB2_HC_DEV *) Context; Ehc = (USB2_HC_DEV *)Context;
BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) { BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList); Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
@ -1113,7 +1098,7 @@ EhcMonitorAsyncRequests (
// his callback. Some drivers may has a lower TPL restriction. // his callback. Some drivers may has a lower TPL restriction.
// //
gBS->RestoreTPL (OldTpl); gBS->RestoreTPL (OldTpl);
(Urb->Callback) (ProcBuf, Urb->Completed, Urb->Context, Urb->Result); (Urb->Callback)(ProcBuf, Urb->Completed, Urb->Context, Urb->Result);
OldTpl = gBS->RaiseTPL (EHC_TPL); OldTpl = gBS->RaiseTPL (EHC_TPL);
} }

View File

@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_SCHED_H_ #ifndef _EFI_EHCI_SCHED_H_
#define _EFI_EHCI_SCHED_H_ #define _EFI_EHCI_SCHED_H_
/** /**
Initialize the schedule data structure such as frame list. Initialize the schedule data structure such as frame list.
@ -22,10 +21,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
EFI_STATUS EFI_STATUS
EhcInitSched ( EhcInitSched (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
Free the schedule data. It may be partially initialized. Free the schedule data. It may be partially initialized.
@ -34,10 +32,9 @@ EhcInitSched (
**/ **/
VOID VOID
EhcFreeSched ( EhcFreeSched (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
Link the queue head to the asynchronous schedule list. Link the queue head to the asynchronous schedule list.
UEFI only supports one CTRL/BULK transfer at a time UEFI only supports one CTRL/BULK transfer at a time
@ -51,11 +48,10 @@ EhcFreeSched (
**/ **/
VOID VOID
EhcLinkQhToAsync ( EhcLinkQhToAsync (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
); );
/** /**
Unlink a queue head from the asynchronous schedule list. Unlink a queue head from the asynchronous schedule list.
Need to synchronize with hardware. Need to synchronize with hardware.
@ -66,11 +62,10 @@ EhcLinkQhToAsync (
**/ **/
VOID VOID
EhcUnlinkQhFromAsync ( EhcUnlinkQhFromAsync (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
); );
/** /**
Link a queue head for interrupt transfer to the periodic Link a queue head for interrupt transfer to the periodic
schedule frame list. This code is very much the same as schedule frame list. This code is very much the same as
@ -82,11 +77,10 @@ EhcUnlinkQhFromAsync (
**/ **/
VOID VOID
EhcLinkQhToPeriod ( EhcLinkQhToPeriod (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
); );
/** /**
Unlink an interrupt queue head from the periodic Unlink an interrupt queue head from the periodic
schedule frame list. schedule frame list.
@ -97,12 +91,10 @@ EhcLinkQhToPeriod (
**/ **/
VOID VOID
EhcUnlinkQhFromPeriod ( EhcUnlinkQhFromPeriod (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN EHC_QH *Qh IN EHC_QH *Qh
); );
/** /**
Execute the transfer by polling the URB. This is a synchronous operation. Execute the transfer by polling the URB. This is a synchronous operation.
@ -117,12 +109,11 @@ EhcUnlinkQhFromPeriod (
**/ **/
EFI_STATUS EFI_STATUS
EhcExecTransfer ( EhcExecTransfer (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb, IN URB *Urb,
IN UINTN TimeOut IN UINTN TimeOut
); );
/** /**
Delete a single asynchronous interrupt transfer for Delete a single asynchronous interrupt transfer for
the device and endpoint. the device and endpoint.
@ -138,13 +129,12 @@ EhcExecTransfer (
**/ **/
EFI_STATUS EFI_STATUS
EhciDelAsyncIntTransfer ( EhciDelAsyncIntTransfer (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpNum, IN UINT8 EpNum,
OUT UINT8 *DataToggle OUT UINT8 *DataToggle
); );
/** /**
Remove all the asynchronous interrutp transfers. Remove all the asynchronous interrutp transfers.
@ -153,7 +143,7 @@ EhciDelAsyncIntTransfer (
**/ **/
VOID VOID
EhciDelAllAsyncIntTransfers ( EhciDelAllAsyncIntTransfers (
IN USB2_HC_DEV *Ehc IN USB2_HC_DEV *Ehc
); );
/** /**
@ -177,17 +167,17 @@ EhciDelAllAsyncIntTransfers (
**/ **/
URB * URB *
EhciInsertAsyncIntTransfer ( EhciInsertAsyncIntTransfer (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpAddr, IN UINT8 EpAddr,
IN UINT8 DevSpeed, IN UINT8 DevSpeed,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket, IN UINTN MaxPacket,
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub, IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
IN UINTN DataLen, IN UINTN DataLen,
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
IN VOID *Context, IN VOID *Context,
IN UINTN Interval IN UINTN Interval
); );
/** /**
@ -200,8 +190,8 @@ EhciInsertAsyncIntTransfer (
VOID VOID
EFIAPI EFIAPI
EhcMonitorAsyncRequests ( EhcMonitorAsyncRequests (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID *Context IN VOID *Context
); );
#endif #endif

View File

@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include "Ehci.h" #include "Ehci.h"
/** /**
Create a single QTD to hold the data. Create a single QTD to hold the data.
@ -28,20 +27,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
EHC_QTD * EHC_QTD *
EhcCreateQtd ( EhcCreateQtd (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 *Data, IN UINT8 *Data,
IN UINT8 *DataPhy, IN UINT8 *DataPhy,
IN UINTN DataLen, IN UINTN DataLen,
IN UINT8 PktId, IN UINT8 PktId,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket IN UINTN MaxPacket
) )
{ {
EHC_QTD *Qtd; EHC_QTD *Qtd;
QTD_HW *QtdHw; QTD_HW *QtdHw;
UINTN Index; UINTN Index;
UINTN Len; UINTN Len;
UINTN ThisBufLen; UINTN ThisBufLen;
ASSERT (Ehc != NULL); ASSERT (Ehc != NULL);
@ -51,9 +50,9 @@ EhcCreateQtd (
return NULL; return NULL;
} }
Qtd->Signature = EHC_QTD_SIG; Qtd->Signature = EHC_QTD_SIG;
Qtd->Data = Data; Qtd->Data = Data;
Qtd->DataLen = 0; Qtd->DataLen = 0;
InitializeListHead (&Qtd->QtdList); InitializeListHead (&Qtd->QtdList);
@ -79,18 +78,18 @@ EhcCreateQtd (
// compute the offset and clear Reserved fields. This is already // compute the offset and clear Reserved fields. This is already
// done in the data point. // done in the data point.
// //
QtdHw->Page[Index] = EHC_LOW_32BIT (DataPhy); QtdHw->Page[Index] = EHC_LOW_32BIT (DataPhy);
QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (DataPhy); QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (DataPhy);
ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (DataPhy) & QTD_BUF_MASK); ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (DataPhy) & QTD_BUF_MASK);
if (Len + ThisBufLen >= DataLen) { if (Len + ThisBufLen >= DataLen) {
Len = DataLen; Len = DataLen;
break; break;
} }
Len += ThisBufLen; Len += ThisBufLen;
Data += ThisBufLen; Data += ThisBufLen;
DataPhy += ThisBufLen; DataPhy += ThisBufLen;
} }
@ -104,15 +103,13 @@ EhcCreateQtd (
Len = Len - Len % MaxPacket; Len = Len - Len % MaxPacket;
} }
QtdHw->TotalBytes = (UINT32) Len; QtdHw->TotalBytes = (UINT32)Len;
Qtd->DataLen = Len; Qtd->DataLen = Len;
} }
return Qtd; return Qtd;
} }
/** /**
Initialize the queue head for interrupt transfer, Initialize the queue head for interrupt transfer,
that is, initialize the following three fields: that is, initialize the following three fields:
@ -126,8 +123,8 @@ EhcCreateQtd (
**/ **/
VOID VOID
EhcInitIntQh ( EhcInitIntQh (
IN USB_ENDPOINT *Ep, IN USB_ENDPOINT *Ep,
IN QH_HW *QhHw IN QH_HW *QhHw
) )
{ {
// //
@ -139,7 +136,7 @@ EhcInitIntQh (
// //
if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) { if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) {
QhHw->SMask = QH_MICROFRAME_0; QhHw->SMask = QH_MICROFRAME_0;
return ; return;
} }
// //
@ -157,8 +154,6 @@ EhcInitIntQh (
QhHw->CMask = QH_MICROFRAME_3 | QH_MICROFRAME_4 | QH_MICROFRAME_5; QhHw->CMask = QH_MICROFRAME_3 | QH_MICROFRAME_4 | QH_MICROFRAME_5;
} }
/** /**
Allocate and initialize a EHCI queue head. Allocate and initialize a EHCI queue head.
@ -170,12 +165,12 @@ EhcInitIntQh (
**/ **/
EHC_QH * EHC_QH *
EhcCreateQh ( EhcCreateQh (
IN USB2_HC_DEV *Ehci, IN USB2_HC_DEV *Ehci,
IN USB_ENDPOINT *Ep IN USB_ENDPOINT *Ep
) )
{ {
EHC_QH *Qh; EHC_QH *Qh;
QH_HW *QhHw; QH_HW *QhHw;
Qh = UsbHcAllocateMem (Ehci->MemPool, sizeof (EHC_QH)); Qh = UsbHcAllocateMem (Ehci->MemPool, sizeof (EHC_QH));
@ -183,68 +178,68 @@ EhcCreateQh (
return NULL; return NULL;
} }
Qh->Signature = EHC_QH_SIG; Qh->Signature = EHC_QH_SIG;
Qh->NextQh = NULL; Qh->NextQh = NULL;
Qh->Interval = Ep->PollRate; Qh->Interval = Ep->PollRate;
InitializeListHead (&Qh->Qtds); InitializeListHead (&Qh->Qtds);
QhHw = &Qh->QhHw; QhHw = &Qh->QhHw;
QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE); QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
QhHw->DeviceAddr = Ep->DevAddr; QhHw->DeviceAddr = Ep->DevAddr;
QhHw->Inactive = 0; QhHw->Inactive = 0;
QhHw->EpNum = Ep->EpAddr; QhHw->EpNum = Ep->EpAddr;
QhHw->EpSpeed = Ep->DevSpeed; QhHw->EpSpeed = Ep->DevSpeed;
QhHw->DtCtrl = 0; QhHw->DtCtrl = 0;
QhHw->ReclaimHead = 0; QhHw->ReclaimHead = 0;
QhHw->MaxPacketLen = (UINT32) Ep->MaxPacket; QhHw->MaxPacketLen = (UINT32)Ep->MaxPacket;
QhHw->CtrlEp = 0; QhHw->CtrlEp = 0;
QhHw->NakReload = QH_NAK_RELOAD; QhHw->NakReload = QH_NAK_RELOAD;
QhHw->HubAddr = Ep->HubAddr; QhHw->HubAddr = Ep->HubAddr;
QhHw->PortNum = Ep->HubPort; QhHw->PortNum = Ep->HubPort;
QhHw->Multiplier = 1; QhHw->Multiplier = 1;
QhHw->DataToggle = Ep->Toggle; QhHw->DataToggle = Ep->Toggle;
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) { if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
QhHw->Status |= QTD_STAT_DO_SS; QhHw->Status |= QTD_STAT_DO_SS;
} }
switch (Ep->Type) { switch (Ep->Type) {
case EHC_CTRL_TRANSFER: case EHC_CTRL_TRANSFER:
// //
// Special initialization for the control transfer: // Special initialization for the control transfer:
// 1. Control transfer initialize data toggle from each QTD // 1. Control transfer initialize data toggle from each QTD
// 2. Set the Control Endpoint Flag (C) for low/full speed endpoint. // 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
// //
QhHw->DtCtrl = 1; QhHw->DtCtrl = 1;
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) { if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
QhHw->CtrlEp = 1; QhHw->CtrlEp = 1;
} }
break;
case EHC_INT_TRANSFER_ASYNC: break;
case EHC_INT_TRANSFER_SYNC:
//
// Special initialization for the interrupt transfer
// to set the S-Mask and C-Mask
//
QhHw->NakReload = 0;
EhcInitIntQh (Ep, QhHw);
break;
case EHC_BULK_TRANSFER: case EHC_INT_TRANSFER_ASYNC:
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) { case EHC_INT_TRANSFER_SYNC:
QhHw->Status |= QTD_STAT_DO_PING; //
} // Special initialization for the interrupt transfer
// to set the S-Mask and C-Mask
//
QhHw->NakReload = 0;
EhcInitIntQh (Ep, QhHw);
break;
break; case EHC_BULK_TRANSFER:
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
QhHw->Status |= QTD_STAT_DO_PING;
}
break;
} }
return Qh; return Qh;
} }
/** /**
Convert the poll interval from application to that Convert the poll interval from application to that
be used by EHCI interface data structure. Only need be used by EHCI interface data structure. Only need
@ -260,10 +255,10 @@ EhcCreateQh (
**/ **/
UINTN UINTN
EhcConvertPollRate ( EhcConvertPollRate (
IN UINTN Interval IN UINTN Interval
) )
{ {
UINTN BitCount; UINTN BitCount;
if (Interval == 0) { if (Interval == 0) {
return 1; return 1;
@ -282,7 +277,6 @@ EhcConvertPollRate (
return (UINTN)1 << (BitCount - 1); return (UINTN)1 << (BitCount - 1);
} }
/** /**
Free a list of QTDs. Free a list of QTDs.
@ -292,13 +286,13 @@ EhcConvertPollRate (
**/ **/
VOID VOID
EhcFreeQtds ( EhcFreeQtds (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN LIST_ENTRY *Qtds IN LIST_ENTRY *Qtds
) )
{ {
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
LIST_ENTRY *Next; LIST_ENTRY *Next;
EHC_QTD *Qtd; EHC_QTD *Qtd;
BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) { BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {
Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList); Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
@ -308,7 +302,6 @@ EhcFreeQtds (
} }
} }
/** /**
Free an allocated URB. It is possible for it to be partially inited. Free an allocated URB. It is possible for it to be partially inited.
@ -318,11 +311,11 @@ EhcFreeQtds (
**/ **/
VOID VOID
EhcFreeUrb ( EhcFreeUrb (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb IN URB *Urb
) )
{ {
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
PciIo = Ehc->PciIo; PciIo = Ehc->PciIo;
@ -346,7 +339,6 @@ EhcFreeUrb (
gBS->FreePool (Urb); gBS->FreePool (Urb);
} }
/** /**
Create a list of QTDs for the URB. Create a list of QTDs for the URB.
@ -359,21 +351,21 @@ EhcFreeUrb (
**/ **/
EFI_STATUS EFI_STATUS
EhcCreateQtds ( EhcCreateQtds (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb IN URB *Urb
) )
{ {
USB_ENDPOINT *Ep; USB_ENDPOINT *Ep;
EHC_QH *Qh; EHC_QH *Qh;
EHC_QTD *Qtd; EHC_QTD *Qtd;
EHC_QTD *StatusQtd; EHC_QTD *StatusQtd;
EHC_QTD *NextQtd; EHC_QTD *NextQtd;
LIST_ENTRY *Entry; LIST_ENTRY *Entry;
UINT32 AlterNext; UINT32 AlterNext;
UINT8 Toggle; UINT8 Toggle;
UINTN Len; UINTN Len;
UINT8 Pid; UINT8 Pid;
EFI_PHYSICAL_ADDRESS PhyAddr; EFI_PHYSICAL_ADDRESS PhyAddr;
ASSERT ((Urb != NULL) && (Urb->Qh != NULL)); ASSERT ((Urb != NULL) && (Urb->Qh != NULL));
@ -389,7 +381,7 @@ EhcCreateQtds (
StatusQtd = NULL; StatusQtd = NULL;
AlterNext = QTD_LINK (NULL, TRUE); AlterNext = QTD_LINK (NULL, TRUE);
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD)); PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ShortReadStop, sizeof (EHC_QTD));
if (Ep->Direction == EfiUsbDataIn) { if (Ep->Direction == EfiUsbDataIn) {
AlterNext = QTD_LINK (PhyAddr, FALSE); AlterNext = QTD_LINK (PhyAddr, FALSE);
} }
@ -448,8 +440,8 @@ EhcCreateQtds (
while (Len < Urb->DataLen) { while (Len < Urb->DataLen) {
Qtd = EhcCreateQtd ( Qtd = EhcCreateQtd (
Ehc, Ehc,
(UINT8 *) Urb->Data + Len, (UINT8 *)Urb->Data + Len,
(UINT8 *) Urb->DataPhy + Len, (UINT8 *)Urb->DataPhy + Len,
Urb->DataLen - Len, Urb->DataLen - Len,
Pid, Pid,
Toggle, Toggle,
@ -467,7 +459,7 @@ EhcCreateQtds (
// Switch the Toggle bit if odd number of packets are included in the QTD. // Switch the Toggle bit if odd number of packets are included in the QTD.
// //
if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) { if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) {
Toggle = (UINT8) (1 - Toggle); Toggle = (UINT8)(1 - Toggle);
} }
Len += Qtd->DataLen; Len += Qtd->DataLen;
@ -493,17 +485,17 @@ EhcCreateQtds (
break; break;
} }
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, EHC_QTD, QtdList); NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, EHC_QTD, QtdList);
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD)); PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
Qtd->QtdHw.NextQtd = QTD_LINK (PhyAddr, FALSE); Qtd->QtdHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
} }
// //
// Link the QTDs to the queue head // Link the QTDs to the queue head
// //
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, EHC_QTD, QtdList); NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, EHC_QTD, QtdList);
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD)); PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
Qh->QhHw.NextQtd = QTD_LINK (PhyAddr, FALSE); Qh->QhHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
return EFI_SUCCESS; return EFI_SUCCESS;
ON_ERROR: ON_ERROR:
@ -511,7 +503,6 @@ ON_ERROR:
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
/** /**
Create a new URB and its associated QTD. Create a new URB and its associated QTD.
@ -535,30 +526,30 @@ ON_ERROR:
**/ **/
URB * URB *
EhcCreateUrb ( EhcCreateUrb (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpAddr, IN UINT8 EpAddr,
IN UINT8 DevSpeed, IN UINT8 DevSpeed,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket, IN UINTN MaxPacket,
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub, IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
IN UINTN Type, IN UINTN Type,
IN EFI_USB_DEVICE_REQUEST *Request, IN EFI_USB_DEVICE_REQUEST *Request,
IN VOID *Data, IN VOID *Data,
IN UINTN DataLen, IN UINTN DataLen,
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
IN VOID *Context, IN VOID *Context,
IN UINTN Interval IN UINTN Interval
) )
{ {
USB_ENDPOINT *Ep; USB_ENDPOINT *Ep;
EFI_PHYSICAL_ADDRESS PhyAddr; EFI_PHYSICAL_ADDRESS PhyAddr;
EFI_PCI_IO_PROTOCOL_OPERATION MapOp; EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
EFI_STATUS Status; EFI_STATUS Status;
UINTN Len; UINTN Len;
URB *Urb; URB *Urb;
VOID *Map; VOID *Map;
Urb = AllocateZeroPool (sizeof (URB)); Urb = AllocateZeroPool (sizeof (URB));
@ -566,38 +557,38 @@ EhcCreateUrb (
return NULL; return NULL;
} }
Urb->Signature = EHC_URB_SIG; Urb->Signature = EHC_URB_SIG;
InitializeListHead (&Urb->UrbList); InitializeListHead (&Urb->UrbList);
Ep = &Urb->Ep; Ep = &Urb->Ep;
Ep->DevAddr = DevAddr; Ep->DevAddr = DevAddr;
Ep->EpAddr = (UINT8) (EpAddr & 0x0F); Ep->EpAddr = (UINT8)(EpAddr & 0x0F);
Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut); Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
Ep->DevSpeed = DevSpeed; Ep->DevSpeed = DevSpeed;
Ep->MaxPacket = MaxPacket; Ep->MaxPacket = MaxPacket;
Ep->HubAddr = 0; Ep->HubAddr = 0;
Ep->HubPort = 0; Ep->HubPort = 0;
if (DevSpeed != EFI_USB_SPEED_HIGH) { if (DevSpeed != EFI_USB_SPEED_HIGH) {
ASSERT (Hub != NULL); ASSERT (Hub != NULL);
Ep->HubAddr = Hub->TranslatorHubAddress; Ep->HubAddr = Hub->TranslatorHubAddress;
Ep->HubPort = Hub->TranslatorPortNumber; Ep->HubPort = Hub->TranslatorPortNumber;
} }
Ep->Toggle = Toggle; Ep->Toggle = Toggle;
Ep->Type = Type; Ep->Type = Type;
Ep->PollRate = EhcConvertPollRate (Interval); Ep->PollRate = EhcConvertPollRate (Interval);
Urb->Request = Request; Urb->Request = Request;
Urb->Data = Data; Urb->Data = Data;
Urb->DataLen = DataLen; Urb->DataLen = DataLen;
Urb->Callback = Callback; Urb->Callback = Callback;
Urb->Context = Context; Urb->Context = Context;
PciIo = Ehc->PciIo; PciIo = Ehc->PciIo;
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep); Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
if (Urb->Qh == NULL) { if (Urb->Qh == NULL) {
goto ON_ERROR; goto ON_ERROR;
@ -607,20 +598,20 @@ EhcCreateUrb (
// Map the request and user data // Map the request and user data
// //
if (Request != NULL) { if (Request != NULL) {
Len = sizeof (EFI_USB_DEVICE_REQUEST); Len = sizeof (EFI_USB_DEVICE_REQUEST);
MapOp = EfiPciIoOperationBusMasterRead; MapOp = EfiPciIoOperationBusMasterRead;
Status = PciIo->Map (PciIo, MapOp, Request, &Len, &PhyAddr, &Map); Status = PciIo->Map (PciIo, MapOp, Request, &Len, &PhyAddr, &Map);
if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) { if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) {
goto ON_ERROR; goto ON_ERROR;
} }
Urb->RequestPhy = (VOID *) ((UINTN) PhyAddr); Urb->RequestPhy = (VOID *)((UINTN)PhyAddr);
Urb->RequestMap = Map; Urb->RequestMap = Map;
} }
if (Data != NULL) { if (Data != NULL) {
Len = DataLen; Len = DataLen;
if (Ep->Direction == EfiUsbDataIn) { if (Ep->Direction == EfiUsbDataIn) {
MapOp = EfiPciIoOperationBusMasterWrite; MapOp = EfiPciIoOperationBusMasterWrite;
@ -628,14 +619,14 @@ EhcCreateUrb (
MapOp = EfiPciIoOperationBusMasterRead; MapOp = EfiPciIoOperationBusMasterRead;
} }
Status = PciIo->Map (PciIo, MapOp, Data, &Len, &PhyAddr, &Map); Status = PciIo->Map (PciIo, MapOp, Data, &Len, &PhyAddr, &Map);
if (EFI_ERROR (Status) || (Len != DataLen)) { if (EFI_ERROR (Status) || (Len != DataLen)) {
goto ON_ERROR; goto ON_ERROR;
} }
Urb->DataPhy = (VOID *) ((UINTN) PhyAddr); Urb->DataPhy = (VOID *)((UINTN)PhyAddr);
Urb->DataMap = Map; Urb->DataMap = Map;
} }
Status = EhcCreateQtds (Ehc, Urb); Status = EhcCreateQtds (Ehc, Urb);

View File

@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_URB_H_ #ifndef _EFI_EHCI_URB_H_
#define _EFI_EHCI_URB_H_ #define _EFI_EHCI_URB_H_
typedef struct _EHC_QTD EHC_QTD; typedef struct _EHC_QTD EHC_QTD;
typedef struct _EHC_QH EHC_QH; typedef struct _EHC_QH EHC_QH;
typedef struct _URB URB; typedef struct _URB URB;
@ -24,51 +23,51 @@ typedef struct _URB URB;
#define EHC_INT_TRANSFER_SYNC 0x04 #define EHC_INT_TRANSFER_SYNC 0x04
#define EHC_INT_TRANSFER_ASYNC 0x08 #define EHC_INT_TRANSFER_ASYNC 0x08
#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T') #define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H') #define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R') #define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
// //
// Hardware related bit definitions // Hardware related bit definitions
// //
#define EHC_TYPE_ITD 0x00 #define EHC_TYPE_ITD 0x00
#define EHC_TYPE_QH 0x02 #define EHC_TYPE_QH 0x02
#define EHC_TYPE_SITD 0x04 #define EHC_TYPE_SITD 0x04
#define EHC_TYPE_FSTN 0x06 #define EHC_TYPE_FSTN 0x06
#define QH_NAK_RELOAD 3 #define QH_NAK_RELOAD 3
#define QH_HSHBW_MULTI 1 #define QH_HSHBW_MULTI 1
#define QTD_MAX_ERR 3 #define QTD_MAX_ERR 3
#define QTD_PID_OUTPUT 0x00 #define QTD_PID_OUTPUT 0x00
#define QTD_PID_INPUT 0x01 #define QTD_PID_INPUT 0x01
#define QTD_PID_SETUP 0x02 #define QTD_PID_SETUP 0x02
#define QTD_STAT_DO_OUT 0 #define QTD_STAT_DO_OUT 0
#define QTD_STAT_DO_SS 0 #define QTD_STAT_DO_SS 0
#define QTD_STAT_DO_PING 0x01 #define QTD_STAT_DO_PING 0x01
#define QTD_STAT_DO_CS 0x02 #define QTD_STAT_DO_CS 0x02
#define QTD_STAT_TRANS_ERR 0x08 #define QTD_STAT_TRANS_ERR 0x08
#define QTD_STAT_BABBLE_ERR 0x10 #define QTD_STAT_BABBLE_ERR 0x10
#define QTD_STAT_BUFF_ERR 0x20 #define QTD_STAT_BUFF_ERR 0x20
#define QTD_STAT_HALTED 0x40 #define QTD_STAT_HALTED 0x40
#define QTD_STAT_ACTIVE 0x80 #define QTD_STAT_ACTIVE 0x80
#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR) #define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
#define QTD_MAX_BUFFER 4 #define QTD_MAX_BUFFER 4
#define QTD_BUF_LEN 4096 #define QTD_BUF_LEN 4096
#define QTD_BUF_MASK 0x0FFF #define QTD_BUF_MASK 0x0FFF
#define QH_MICROFRAME_0 0x01 #define QH_MICROFRAME_0 0x01
#define QH_MICROFRAME_1 0x02 #define QH_MICROFRAME_1 0x02
#define QH_MICROFRAME_2 0x04 #define QH_MICROFRAME_2 0x04
#define QH_MICROFRAME_3 0x08 #define QH_MICROFRAME_3 0x08
#define QH_MICROFRAME_4 0x10 #define QH_MICROFRAME_4 0x10
#define QH_MICROFRAME_5 0x20 #define QH_MICROFRAME_5 0x20
#define QH_MICROFRAME_6 0x40 #define QH_MICROFRAME_6 0x40
#define QH_MICROFRAME_7 0x80 #define QH_MICROFRAME_7 0x80
#define USB_ERR_SHORT_PACKET 0x200 #define USB_ERR_SHORT_PACKET 0x200
// //
// Fill in the hardware link point: pass in a EHC_QH/QH_HW // Fill in the hardware link point: pass in a EHC_QH/QH_HW
@ -77,7 +76,7 @@ typedef struct _URB URB;
#define QH_LINK(Addr, Type, Term) \ #define QH_LINK(Addr, Type, Term) \
((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0))) ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))
#define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term)) #define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term))
// //
// The defination of EHCI hardware used data structure for // The defination of EHCI hardware used data structure for
@ -87,77 +86,76 @@ typedef struct _URB URB;
// //
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
UINT32 NextQtd; UINT32 NextQtd;
UINT32 AltNext; UINT32 AltNext;
UINT32 Status : 8; UINT32 Status : 8;
UINT32 Pid : 2; UINT32 Pid : 2;
UINT32 ErrCnt : 2; UINT32 ErrCnt : 2;
UINT32 CurPage : 3; UINT32 CurPage : 3;
UINT32 Ioc : 1; UINT32 Ioc : 1;
UINT32 TotalBytes : 15; UINT32 TotalBytes : 15;
UINT32 DataToggle : 1; UINT32 DataToggle : 1;
UINT32 Page[5]; UINT32 Page[5];
UINT32 PageHigh[5]; UINT32 PageHigh[5];
} QTD_HW; } QTD_HW;
typedef struct { typedef struct {
UINT32 HorizonLink; UINT32 HorizonLink;
// //
// Endpoint capabilities/Characteristics DWord 1 and DWord 2 // Endpoint capabilities/Characteristics DWord 1 and DWord 2
// //
UINT32 DeviceAddr : 7; UINT32 DeviceAddr : 7;
UINT32 Inactive : 1; UINT32 Inactive : 1;
UINT32 EpNum : 4; UINT32 EpNum : 4;
UINT32 EpSpeed : 2; UINT32 EpSpeed : 2;
UINT32 DtCtrl : 1; UINT32 DtCtrl : 1;
UINT32 ReclaimHead : 1; UINT32 ReclaimHead : 1;
UINT32 MaxPacketLen : 11; UINT32 MaxPacketLen : 11;
UINT32 CtrlEp : 1; UINT32 CtrlEp : 1;
UINT32 NakReload : 4; UINT32 NakReload : 4;
UINT32 SMask : 8; UINT32 SMask : 8;
UINT32 CMask : 8; UINT32 CMask : 8;
UINT32 HubAddr : 7; UINT32 HubAddr : 7;
UINT32 PortNum : 7; UINT32 PortNum : 7;
UINT32 Multiplier : 2; UINT32 Multiplier : 2;
// //
// Transaction execution overlay area // Transaction execution overlay area
// //
UINT32 CurQtd; UINT32 CurQtd;
UINT32 NextQtd; UINT32 NextQtd;
UINT32 AltQtd; UINT32 AltQtd;
UINT32 Status : 8; UINT32 Status : 8;
UINT32 Pid : 2; UINT32 Pid : 2;
UINT32 ErrCnt : 2; UINT32 ErrCnt : 2;
UINT32 CurPage : 3; UINT32 CurPage : 3;
UINT32 Ioc : 1; UINT32 Ioc : 1;
UINT32 TotalBytes : 15; UINT32 TotalBytes : 15;
UINT32 DataToggle : 1; UINT32 DataToggle : 1;
UINT32 Page[5]; UINT32 Page[5];
UINT32 PageHigh[5]; UINT32 PageHigh[5];
} QH_HW; } QH_HW;
#pragma pack() #pragma pack()
// //
// Endpoint address and its capabilities // Endpoint address and its capabilities
// //
typedef struct _USB_ENDPOINT { typedef struct _USB_ENDPOINT {
UINT8 DevAddr; UINT8 DevAddr;
UINT8 EpAddr; // Endpoint address, no direction encoded in UINT8 EpAddr; // Endpoint address, no direction encoded in
EFI_USB_DATA_DIRECTION Direction; EFI_USB_DATA_DIRECTION Direction;
UINT8 DevSpeed; UINT8 DevSpeed;
UINTN MaxPacket; UINTN MaxPacket;
UINT8 HubAddr; UINT8 HubAddr;
UINT8 HubPort; UINT8 HubPort;
UINT8 Toggle; // Data toggle, not used for control transfer UINT8 Toggle; // Data toggle, not used for control transfer
UINTN Type; UINTN Type;
UINTN PollRate; // Polling interval used by EHCI UINTN PollRate; // Polling interval used by EHCI
} USB_ENDPOINT; } USB_ENDPOINT;
// //
@ -165,11 +163,11 @@ typedef struct _USB_ENDPOINT {
// QTD generated from a URB. Don't add fields before QtdHw. // QTD generated from a URB. Don't add fields before QtdHw.
// //
struct _EHC_QTD { struct _EHC_QTD {
QTD_HW QtdHw; QTD_HW QtdHw;
UINT32 Signature; UINT32 Signature;
LIST_ENTRY QtdList; // The list of QTDs to one end point LIST_ENTRY QtdList; // The list of QTDs to one end point
UINT8 *Data; // Buffer of the original data UINT8 *Data; // Buffer of the original data
UINTN DataLen; // Original amount of data in this QTD UINTN DataLen; // Original amount of data in this QTD
}; };
// //
@ -188,11 +186,11 @@ struct _EHC_QTD {
// as the reclamation header. New transfer is inserted after this QH. // as the reclamation header. New transfer is inserted after this QH.
// //
struct _EHC_QH { struct _EHC_QH {
QH_HW QhHw; QH_HW QhHw;
UINT32 Signature; UINT32 Signature;
EHC_QH *NextQh; // The queue head pointed to by horizontal link EHC_QH *NextQh; // The queue head pointed to by horizontal link
LIST_ENTRY Qtds; // The list of QTDs to this queue head LIST_ENTRY Qtds; // The list of QTDs to this queue head
UINTN Interval; UINTN Interval;
}; };
// //
@ -200,38 +198,36 @@ struct _EHC_QH {
// usb requests. // usb requests.
// //
struct _URB { struct _URB {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY UrbList; LIST_ENTRY UrbList;
// //
// Transaction information // Transaction information
// //
USB_ENDPOINT Ep; USB_ENDPOINT Ep;
EFI_USB_DEVICE_REQUEST *Request; // Control transfer only EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
VOID *RequestPhy; // Address of the mapped request VOID *RequestPhy; // Address of the mapped request
VOID *RequestMap; VOID *RequestMap;
VOID *Data; VOID *Data;
UINTN DataLen; UINTN DataLen;
VOID *DataPhy; // Address of the mapped user data VOID *DataPhy; // Address of the mapped user data
VOID *DataMap; VOID *DataMap;
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback; EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
VOID *Context; VOID *Context;
// //
// Schedule data // Schedule data
// //
EHC_QH *Qh; EHC_QH *Qh;
// //
// Transaction result // Transaction result
// //
UINT32 Result; UINT32 Result;
UINTN Completed; // completed data length UINTN Completed; // completed data length
UINT8 DataToggle; UINT8 DataToggle;
}; };
/** /**
Create a single QTD to hold the data. Create a single QTD to hold the data.
@ -248,17 +244,15 @@ struct _URB {
**/ **/
EHC_QTD * EHC_QTD *
EhcCreateQtd ( EhcCreateQtd (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 *Data, IN UINT8 *Data,
IN UINT8 *DataPhy, IN UINT8 *DataPhy,
IN UINTN DataLen, IN UINTN DataLen,
IN UINT8 PktId, IN UINT8 PktId,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket IN UINTN MaxPacket
); );
/** /**
Allocate and initialize a EHCI queue head. Allocate and initialize a EHCI queue head.
@ -270,11 +264,10 @@ EhcCreateQtd (
**/ **/
EHC_QH * EHC_QH *
EhcCreateQh ( EhcCreateQh (
IN USB2_HC_DEV *Ehci, IN USB2_HC_DEV *Ehci,
IN USB_ENDPOINT *Ep IN USB_ENDPOINT *Ep
); );
/** /**
Free an allocated URB. It is possible for it to be partially inited. Free an allocated URB. It is possible for it to be partially inited.
@ -284,11 +277,10 @@ EhcCreateQh (
**/ **/
VOID VOID
EhcFreeUrb ( EhcFreeUrb (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN URB *Urb IN URB *Urb
); );
/** /**
Create a new URB and its associated QTD. Create a new URB and its associated QTD.
@ -312,19 +304,20 @@ EhcFreeUrb (
**/ **/
URB * URB *
EhcCreateUrb ( EhcCreateUrb (
IN USB2_HC_DEV *Ehc, IN USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpAddr, IN UINT8 EpAddr,
IN UINT8 DevSpeed, IN UINT8 DevSpeed,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket, IN UINTN MaxPacket,
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub, IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
IN UINTN Type, IN UINTN Type,
IN EFI_USB_DEVICE_REQUEST *Request, IN EFI_USB_DEVICE_REQUEST *Request,
IN VOID *Data, IN VOID *Data,
IN UINTN DataLen, IN UINTN DataLen,
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
IN VOID *Context, IN VOID *Context,
IN UINTN Interval IN UINTN Interval
); );
#endif #endif

View File

@ -7,10 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
#include "Ehci.h" #include "Ehci.h"
/** /**
Allocate a block of memory to be used by the buffer pool. Allocate a block of memory to be used by the buffer pool.
@ -22,17 +20,17 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
USBHC_MEM_BLOCK * USBHC_MEM_BLOCK *
UsbHcAllocMemBlock ( UsbHcAllocMemBlock (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN UINTN Pages IN UINTN Pages
) )
{ {
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
VOID *BufHost; VOID *BufHost;
VOID *Mapping; VOID *Mapping;
EFI_PHYSICAL_ADDRESS MappedAddr; EFI_PHYSICAL_ADDRESS MappedAddr;
UINTN Bytes; UINTN Bytes;
EFI_STATUS Status; EFI_STATUS Status;
PciIo = Pool->PciIo; PciIo = Pool->PciIo;
@ -47,9 +45,9 @@ UsbHcAllocMemBlock (
// //
ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE); ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
Block->BufLen = EFI_PAGES_TO_SIZE (Pages); Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8); Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
Block->Bits = AllocateZeroPool (Block->BitsLen); Block->Bits = AllocateZeroPool (Block->BitsLen);
if (Block->Bits == NULL) { if (Block->Bits == NULL) {
gBS->FreePool (Block); gBS->FreePool (Block);
@ -73,7 +71,7 @@ UsbHcAllocMemBlock (
goto FREE_BITARRAY; goto FREE_BITARRAY;
} }
Bytes = EFI_PAGES_TO_SIZE (Pages); Bytes = EFI_PAGES_TO_SIZE (Pages);
Status = PciIo->Map ( Status = PciIo->Map (
PciIo, PciIo,
EfiPciIoOperationBusMasterCommonBuffer, EfiPciIoOperationBusMasterCommonBuffer,
@ -96,9 +94,9 @@ UsbHcAllocMemBlock (
goto FREE_BUFFER; goto FREE_BUFFER;
} }
Block->BufHost = BufHost; Block->BufHost = BufHost;
Block->Buf = (UINT8 *) ((UINTN) MappedAddr); Block->Buf = (UINT8 *)((UINTN)MappedAddr);
Block->Mapping = Mapping; Block->Mapping = Mapping;
return Block; return Block;
@ -111,7 +109,6 @@ FREE_BITARRAY:
return NULL; return NULL;
} }
/** /**
Free the memory block from the memory pool. Free the memory block from the memory pool.
@ -121,11 +118,11 @@ FREE_BITARRAY:
**/ **/
VOID VOID
UsbHcFreeMemBlock ( UsbHcFreeMemBlock (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN USBHC_MEM_BLOCK *Block IN USBHC_MEM_BLOCK *Block
) )
{ {
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
ASSERT ((Pool != NULL) && (Block != NULL)); ASSERT ((Pool != NULL) && (Block != NULL));
@ -141,7 +138,6 @@ UsbHcFreeMemBlock (
gBS->FreePool (Block); gBS->FreePool (Block);
} }
/** /**
Alloc some memory from the block. Alloc some memory from the block.
@ -154,22 +150,22 @@ UsbHcFreeMemBlock (
**/ **/
VOID * VOID *
UsbHcAllocMemFromBlock ( UsbHcAllocMemFromBlock (
IN USBHC_MEM_BLOCK *Block, IN USBHC_MEM_BLOCK *Block,
IN UINTN Units IN UINTN Units
) )
{ {
UINTN Byte; UINTN Byte;
UINT8 Bit; UINT8 Bit;
UINTN StartByte; UINTN StartByte;
UINT8 StartBit; UINT8 StartBit;
UINTN Available; UINTN Available;
UINTN Count; UINTN Count;
ASSERT ((Block != 0) && (Units != 0)); ASSERT ((Block != 0) && (Units != 0));
StartByte = 0; StartByte = 0;
StartBit = 0; StartBit = 0;
Available = 0; Available = 0;
for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) { for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
// //
@ -185,13 +181,12 @@ UsbHcAllocMemFromBlock (
} }
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
} else { } else {
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
Available = 0; Available = 0;
StartByte = Byte; StartByte = Byte;
StartBit = Bit; StartBit = Bit;
} }
} }
@ -202,13 +197,13 @@ UsbHcAllocMemFromBlock (
// //
// Mark the memory as allocated // Mark the memory as allocated
// //
Byte = StartByte; Byte = StartByte;
Bit = StartBit; Bit = StartBit;
for (Count = 0; Count < Units; Count++) { for (Count = 0; Count < Units; Count++) {
ASSERT (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit)); ASSERT (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] | USB_HC_BIT (Bit)); Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] | USB_HC_BIT (Bit));
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
} }
@ -226,16 +221,16 @@ UsbHcAllocMemFromBlock (
**/ **/
EFI_PHYSICAL_ADDRESS EFI_PHYSICAL_ADDRESS
UsbHcGetPciAddressForHostMem ( UsbHcGetPciAddressForHostMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
) )
{ {
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
UINTN AllocSize; UINTN AllocSize;
EFI_PHYSICAL_ADDRESS PhyAddr; EFI_PHYSICAL_ADDRESS PhyAddr;
UINTN Offset; UINTN Offset;
Head = Pool->Head; Head = Pool->Head;
AllocSize = USBHC_MEM_ROUND (Size); AllocSize = USBHC_MEM_ROUND (Size);
@ -249,7 +244,7 @@ UsbHcGetPciAddressForHostMem (
// scan the memory block list for the memory block that // scan the memory block list for the memory block that
// completely contains the allocated memory. // completely contains the allocated memory.
// //
if ((Block->BufHost <= (UINT8 *) Mem) && (((UINT8 *) Mem + AllocSize) <= (Block->BufHost + Block->BufLen))) { if ((Block->BufHost <= (UINT8 *)Mem) && (((UINT8 *)Mem + AllocSize) <= (Block->BufHost + Block->BufLen))) {
break; break;
} }
} }
@ -258,12 +253,11 @@ UsbHcGetPciAddressForHostMem (
// //
// calculate the pci memory address for host memory address. // calculate the pci memory address for host memory address.
// //
Offset = (UINT8 *)Mem - Block->BufHost; Offset = (UINT8 *)Mem - Block->BufHost;
PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN) (Block->Buf + Offset); PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN)(Block->Buf + Offset);
return PhyAddr; return PhyAddr;
} }
/** /**
Insert the memory block to the pool's list of the blocks. Insert the memory block to the pool's list of the blocks.
@ -273,8 +267,8 @@ UsbHcGetPciAddressForHostMem (
**/ **/
VOID VOID
UsbHcInsertMemBlockToPool ( UsbHcInsertMemBlockToPool (
IN USBHC_MEM_BLOCK *Head, IN USBHC_MEM_BLOCK *Head,
IN USBHC_MEM_BLOCK *Block IN USBHC_MEM_BLOCK *Block
) )
{ {
ASSERT ((Head != NULL) && (Block != NULL)); ASSERT ((Head != NULL) && (Block != NULL));
@ -282,7 +276,6 @@ UsbHcInsertMemBlockToPool (
Head->Next = Block; Head->Next = Block;
} }
/** /**
Is the memory block empty? Is the memory block empty?
@ -294,10 +287,10 @@ UsbHcInsertMemBlockToPool (
**/ **/
BOOLEAN BOOLEAN
UsbHcIsMemBlockEmpty ( UsbHcIsMemBlockEmpty (
IN USBHC_MEM_BLOCK *Block IN USBHC_MEM_BLOCK *Block
) )
{ {
UINTN Index; UINTN Index;
for (Index = 0; Index < Block->BitsLen; Index++) { for (Index = 0; Index < Block->BitsLen; Index++) {
if (Block->Bits[Index] != 0) { if (Block->Bits[Index] != 0) {
@ -308,7 +301,6 @@ UsbHcIsMemBlockEmpty (
return TRUE; return TRUE;
} }
/** /**
Unlink the memory block from the pool's list. Unlink the memory block from the pool's list.
@ -318,11 +310,11 @@ UsbHcIsMemBlockEmpty (
**/ **/
VOID VOID
UsbHcUnlinkMemBlock ( UsbHcUnlinkMemBlock (
IN USBHC_MEM_BLOCK *Head, IN USBHC_MEM_BLOCK *Head,
IN USBHC_MEM_BLOCK *BlockToUnlink IN USBHC_MEM_BLOCK *BlockToUnlink
) )
{ {
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
ASSERT ((Head != NULL) && (BlockToUnlink != NULL)); ASSERT ((Head != NULL) && (BlockToUnlink != NULL));
@ -335,7 +327,6 @@ UsbHcUnlinkMemBlock (
} }
} }
/** /**
Initialize the memory management pool for the host controller. Initialize the memory management pool for the host controller.
@ -355,7 +346,7 @@ UsbHcInitMemPool (
IN UINT32 Which4G IN UINT32 Which4G
) )
{ {
USBHC_MEM_POOL *Pool; USBHC_MEM_POOL *Pool;
Pool = AllocatePool (sizeof (USBHC_MEM_POOL)); Pool = AllocatePool (sizeof (USBHC_MEM_POOL));
@ -376,7 +367,6 @@ UsbHcInitMemPool (
return Pool; return Pool;
} }
/** /**
Release the memory management pool. Release the memory management pool.
@ -388,10 +378,10 @@ UsbHcInitMemPool (
**/ **/
EFI_STATUS EFI_STATUS
UsbHcFreeMemPool ( UsbHcFreeMemPool (
IN USBHC_MEM_POOL *Pool IN USBHC_MEM_POOL *Pool
) )
{ {
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
ASSERT (Pool->Head != NULL); ASSERT (Pool->Head != NULL);
@ -410,7 +400,6 @@ UsbHcFreeMemPool (
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
Allocate some memory from the host controller's memory pool Allocate some memory from the host controller's memory pool
which can be used to communicate with host controller. which can be used to communicate with host controller.
@ -423,16 +412,16 @@ UsbHcFreeMemPool (
**/ **/
VOID * VOID *
UsbHcAllocateMem ( UsbHcAllocateMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN UINTN Size IN UINTN Size
) )
{ {
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
USBHC_MEM_BLOCK *NewBlock; USBHC_MEM_BLOCK *NewBlock;
VOID *Mem; VOID *Mem;
UINTN AllocSize; UINTN AllocSize;
UINTN Pages; UINTN Pages;
Mem = NULL; Mem = NULL;
AllocSize = USBHC_MEM_ROUND (Size); AllocSize = USBHC_MEM_ROUND (Size);
@ -487,7 +476,6 @@ UsbHcAllocateMem (
return Mem; return Mem;
} }
/** /**
Free the allocated memory back to the memory pool. Free the allocated memory back to the memory pool.
@ -498,22 +486,22 @@ UsbHcAllocateMem (
**/ **/
VOID VOID
UsbHcFreeMem ( UsbHcFreeMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
) )
{ {
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
UINT8 *ToFree; UINT8 *ToFree;
UINTN AllocSize; UINTN AllocSize;
UINTN Byte; UINTN Byte;
UINTN Bit; UINTN Bit;
UINTN Count; UINTN Count;
Head = Pool->Head; Head = Pool->Head;
AllocSize = USBHC_MEM_ROUND (Size); AllocSize = USBHC_MEM_ROUND (Size);
ToFree = (UINT8 *) Mem; ToFree = (UINT8 *)Mem;
for (Block = Head; Block != NULL; Block = Block->Next) { for (Block = Head; Block != NULL; Block = Block->Next) {
// //
@ -524,8 +512,8 @@ UsbHcFreeMem (
// //
// compute the start byte and bit in the bit array // compute the start byte and bit in the bit array
// //
Byte = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) / 8; Byte = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) / 8;
Bit = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) % 8; Bit = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) % 8;
// //
// reset associated bits in bit array // reset associated bits in bit array
@ -533,7 +521,7 @@ UsbHcFreeMem (
for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) { for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) {
ASSERT (USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit)); ASSERT (USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] ^ USB_HC_BIT (Bit)); Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] ^ USB_HC_BIT (Bit));
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
} }
@ -556,5 +544,5 @@ UsbHcFreeMem (
UsbHcFreeMemBlock (Pool, Block); UsbHcFreeMemBlock (Pool, Block);
} }
return ; return;
} }

View File

@ -10,7 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_MEM_H_ #ifndef _EFI_EHCI_MEM_H_
#define _EFI_EHCI_MEM_H_ #define _EFI_EHCI_MEM_H_
#define USB_HC_BIT(a) ((UINTN)(1 << (a))) #define USB_HC_BIT(a) ((UINTN)(1 << (a)))
#define USB_HC_BIT_IS_SET(Data, Bit) \ #define USB_HC_BIT_IS_SET(Data, Bit) \
((BOOLEAN)(((Data) & USB_HC_BIT(Bit)) == USB_HC_BIT(Bit))) ((BOOLEAN)(((Data) & USB_HC_BIT(Bit)) == USB_HC_BIT(Bit)))
@ -20,13 +20,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
typedef struct _USBHC_MEM_BLOCK USBHC_MEM_BLOCK; typedef struct _USBHC_MEM_BLOCK USBHC_MEM_BLOCK;
struct _USBHC_MEM_BLOCK { struct _USBHC_MEM_BLOCK {
UINT8 *Bits; // Bit array to record which unit is allocated UINT8 *Bits; // Bit array to record which unit is allocated
UINTN BitsLen; UINTN BitsLen;
UINT8 *Buf; UINT8 *Buf;
UINT8 *BufHost; UINT8 *BufHost;
UINTN BufLen; // Memory size in bytes UINTN BufLen; // Memory size in bytes
VOID *Mapping; VOID *Mapping;
USBHC_MEM_BLOCK *Next; USBHC_MEM_BLOCK *Next;
}; };
// //
@ -35,16 +35,16 @@ struct _USBHC_MEM_BLOCK {
// data to be on the same 4G memory. // data to be on the same 4G memory.
// //
typedef struct _USBHC_MEM_POOL { typedef struct _USBHC_MEM_POOL {
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
BOOLEAN Check4G; BOOLEAN Check4G;
UINT32 Which4G; UINT32 Which4G;
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
} USBHC_MEM_POOL; } USBHC_MEM_POOL;
// //
// Memory allocation unit, must be 2^n, n>4 // Memory allocation unit, must be 2^n, n>4
// //
#define USBHC_MEM_UNIT 64 #define USBHC_MEM_UNIT 64
#define USBHC_MEM_UNIT_MASK (USBHC_MEM_UNIT - 1) #define USBHC_MEM_UNIT_MASK (USBHC_MEM_UNIT - 1)
#define USBHC_MEM_DEFAULT_PAGES 16 #define USBHC_MEM_DEFAULT_PAGES 16
@ -63,8 +63,6 @@ typedef struct _USBHC_MEM_POOL {
} \ } \
} while (0) } while (0)
/** /**
Initialize the memory management pool for the host controller. Initialize the memory management pool for the host controller.
@ -84,7 +82,6 @@ UsbHcInitMemPool (
IN UINT32 Which4G IN UINT32 Which4G
); );
/** /**
Release the memory management pool. Release the memory management pool.
@ -96,10 +93,9 @@ UsbHcInitMemPool (
**/ **/
EFI_STATUS EFI_STATUS
UsbHcFreeMemPool ( UsbHcFreeMemPool (
IN USBHC_MEM_POOL *Pool IN USBHC_MEM_POOL *Pool
); );
/** /**
Allocate some memory from the host controller's memory pool Allocate some memory from the host controller's memory pool
which can be used to communicate with host controller. which can be used to communicate with host controller.
@ -112,11 +108,10 @@ UsbHcFreeMemPool (
**/ **/
VOID * VOID *
UsbHcAllocateMem ( UsbHcAllocateMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN UINTN Size IN UINTN Size
); );
/** /**
Free the allocated memory back to the memory pool. Free the allocated memory back to the memory pool.
@ -127,9 +122,9 @@ UsbHcAllocateMem (
**/ **/
VOID VOID
UsbHcFreeMem ( UsbHcFreeMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
); );
/** /**
@ -143,9 +138,9 @@ UsbHcFreeMem (
**/ **/
EFI_PHYSICAL_ADDRESS EFI_PHYSICAL_ADDRESS
UsbHcGetPciAddressForHostMem ( UsbHcGetPciAddressForHostMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
); );
#endif #endif

View File

@ -39,8 +39,8 @@ IoMmuMap (
OUT VOID **Mapping OUT VOID **Mapping
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT64 Attribute; UINT64 Attribute;
if (IoMmu != NULL) { if (IoMmu != NULL) {
Status = IoMmu->Map ( Status = IoMmu->Map (
@ -54,23 +54,25 @@ IoMmuMap (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
switch (Operation) { switch (Operation) {
case EdkiiIoMmuOperationBusMasterRead: case EdkiiIoMmuOperationBusMasterRead:
case EdkiiIoMmuOperationBusMasterRead64: case EdkiiIoMmuOperationBusMasterRead64:
Attribute = EDKII_IOMMU_ACCESS_READ; Attribute = EDKII_IOMMU_ACCESS_READ;
break; break;
case EdkiiIoMmuOperationBusMasterWrite: case EdkiiIoMmuOperationBusMasterWrite:
case EdkiiIoMmuOperationBusMasterWrite64: case EdkiiIoMmuOperationBusMasterWrite64:
Attribute = EDKII_IOMMU_ACCESS_WRITE; Attribute = EDKII_IOMMU_ACCESS_WRITE;
break; break;
case EdkiiIoMmuOperationBusMasterCommonBuffer: case EdkiiIoMmuOperationBusMasterCommonBuffer:
case EdkiiIoMmuOperationBusMasterCommonBuffer64: case EdkiiIoMmuOperationBusMasterCommonBuffer64:
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE; Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
break; break;
default: default:
ASSERT(FALSE); ASSERT (FALSE);
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Status = IoMmu->SetAttribute ( Status = IoMmu->SetAttribute (
IoMmu, IoMmu,
*Mapping, *Mapping,
@ -82,10 +84,11 @@ IoMmuMap (
return Status; return Status;
} }
} else { } else {
*DeviceAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress; *DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
*Mapping = NULL; *Mapping = NULL;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
} }
return Status; return Status;
} }
@ -98,8 +101,8 @@ IoMmuMap (
**/ **/
VOID VOID
IoMmuUnmap ( IoMmuUnmap (
IN EDKII_IOMMU_PPI *IoMmu, IN EDKII_IOMMU_PPI *IoMmu,
IN VOID *Mapping IN VOID *Mapping
) )
{ {
if (IoMmu != NULL) { if (IoMmu != NULL) {
@ -140,9 +143,9 @@ IoMmuAllocateBuffer (
UINTN NumberOfBytes; UINTN NumberOfBytes;
EFI_PHYSICAL_ADDRESS HostPhyAddress; EFI_PHYSICAL_ADDRESS HostPhyAddress;
*HostAddress = NULL; *HostAddress = NULL;
*DeviceAddress = 0; *DeviceAddress = 0;
*Mapping = NULL; *Mapping = NULL;
if (IoMmu != NULL) { if (IoMmu != NULL) {
Status = IoMmu->AllocateBuffer ( Status = IoMmu->AllocateBuffer (
@ -157,19 +160,20 @@ IoMmuAllocateBuffer (
} }
NumberOfBytes = EFI_PAGES_TO_SIZE (Pages); NumberOfBytes = EFI_PAGES_TO_SIZE (Pages);
Status = IoMmu->Map ( Status = IoMmu->Map (
IoMmu, IoMmu,
EdkiiIoMmuOperationBusMasterCommonBuffer, EdkiiIoMmuOperationBusMasterCommonBuffer,
*HostAddress, *HostAddress,
&NumberOfBytes, &NumberOfBytes,
DeviceAddress, DeviceAddress,
Mapping Mapping
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress); IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress);
*HostAddress = NULL; *HostAddress = NULL;
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Status = IoMmu->SetAttribute ( Status = IoMmu->SetAttribute (
IoMmu, IoMmu,
*Mapping, *Mapping,
@ -178,7 +182,7 @@ IoMmuAllocateBuffer (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
IoMmu->Unmap (IoMmu, *Mapping); IoMmu->Unmap (IoMmu, *Mapping);
IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress); IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress);
*Mapping = NULL; *Mapping = NULL;
*HostAddress = NULL; *HostAddress = NULL;
return Status; return Status;
} }
@ -191,10 +195,12 @@ IoMmuAllocateBuffer (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
*HostAddress = (VOID *) (UINTN) HostPhyAddress;
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
*DeviceAddress = HostPhyAddress; *DeviceAddress = HostPhyAddress;
*Mapping = NULL; *Mapping = NULL;
} }
return Status; return Status;
} }
@ -209,10 +215,10 @@ IoMmuAllocateBuffer (
**/ **/
VOID VOID
IoMmuFreeBuffer ( IoMmuFreeBuffer (
IN EDKII_IOMMU_PPI *IoMmu, IN EDKII_IOMMU_PPI *IoMmu,
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress, IN VOID *HostAddress,
IN VOID *Mapping IN VOID *Mapping
) )
{ {
if (IoMmu != NULL) { if (IoMmu != NULL) {
@ -230,14 +236,13 @@ IoMmuFreeBuffer (
**/ **/
VOID VOID
IoMmuInit ( IoMmuInit (
OUT EDKII_IOMMU_PPI **IoMmu OUT EDKII_IOMMU_PPI **IoMmu
) )
{ {
PeiServicesLocatePpi ( PeiServicesLocatePpi (
&gEdkiiIoMmuPpiGuid, &gEdkiiIoMmuPpiGuid,
0, 0,
NULL, NULL,
(VOID **) IoMmu (VOID **)IoMmu
); );
} }

View File

@ -15,19 +15,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
// to the UEFI protocol's port state (change). // to the UEFI protocol's port state (change).
// //
USB_PORT_STATE_MAP mUsbPortStateMap[] = { USB_PORT_STATE_MAP mUsbPortStateMap[] = {
{PORTSC_CONN, USB_PORT_STAT_CONNECTION}, { PORTSC_CONN, USB_PORT_STAT_CONNECTION },
{PORTSC_ENABLED, USB_PORT_STAT_ENABLE}, { PORTSC_ENABLED, USB_PORT_STAT_ENABLE },
{PORTSC_SUSPEND, USB_PORT_STAT_SUSPEND}, { PORTSC_SUSPEND, USB_PORT_STAT_SUSPEND },
{PORTSC_OVERCUR, USB_PORT_STAT_OVERCURRENT}, { PORTSC_OVERCUR, USB_PORT_STAT_OVERCURRENT },
{PORTSC_RESET, USB_PORT_STAT_RESET}, { PORTSC_RESET, USB_PORT_STAT_RESET },
{PORTSC_POWER, USB_PORT_STAT_POWER}, { PORTSC_POWER, USB_PORT_STAT_POWER },
{PORTSC_OWNER, USB_PORT_STAT_OWNER} { PORTSC_OWNER, USB_PORT_STAT_OWNER }
}; };
USB_PORT_STATE_MAP mUsbPortChangeMap[] = { USB_PORT_STATE_MAP mUsbPortChangeMap[] = {
{PORTSC_CONN_CHANGE, USB_PORT_STAT_C_CONNECTION}, { PORTSC_CONN_CHANGE, USB_PORT_STAT_C_CONNECTION },
{PORTSC_ENABLE_CHANGE, USB_PORT_STAT_C_ENABLE}, { PORTSC_ENABLE_CHANGE, USB_PORT_STAT_C_ENABLE },
{PORTSC_OVERCUR_CHANGE, USB_PORT_STAT_C_OVERCURRENT} { PORTSC_OVERCUR_CHANGE, USB_PORT_STAT_C_OVERCURRENT }
}; };
/** /**
@ -41,11 +41,11 @@ USB_PORT_STATE_MAP mUsbPortChangeMap[] = {
**/ **/
UINT32 UINT32
EhcReadOpReg ( EhcReadOpReg (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
{ {
UINT32 Data; UINT32 Data;
ASSERT (Ehc->CapLen != 0); ASSERT (Ehc->CapLen != 0);
@ -64,16 +64,14 @@ EhcReadOpReg (
**/ **/
VOID VOID
EhcWriteOpReg ( EhcWriteOpReg (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Data IN UINT32 Data
) )
{ {
ASSERT (Ehc->CapLen != 0); ASSERT (Ehc->CapLen != 0);
MmioWrite32(Ehc->UsbHostControllerBaseAddress + Ehc->CapLen + Offset, Data); MmioWrite32 (Ehc->UsbHostControllerBaseAddress + Ehc->CapLen + Offset, Data);
} }
/** /**
@ -86,12 +84,12 @@ EhcWriteOpReg (
**/ **/
VOID VOID
EhcSetOpRegBit ( EhcSetOpRegBit (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit IN UINT32 Bit
) )
{ {
UINT32 Data; UINT32 Data;
Data = EhcReadOpReg (Ehc, Offset); Data = EhcReadOpReg (Ehc, Offset);
Data |= Bit; Data |= Bit;
@ -108,12 +106,12 @@ EhcSetOpRegBit (
**/ **/
VOID VOID
EhcClearOpRegBit ( EhcClearOpRegBit (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit IN UINT32 Bit
) )
{ {
UINT32 Data; UINT32 Data;
Data = EhcReadOpReg (Ehc, Offset); Data = EhcReadOpReg (Ehc, Offset);
Data &= ~Bit; Data &= ~Bit;
@ -136,14 +134,14 @@ EhcClearOpRegBit (
**/ **/
EFI_STATUS EFI_STATUS
EhcWaitOpRegBit ( EhcWaitOpRegBit (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Bit, IN UINT32 Bit,
IN BOOLEAN WaitToSet, IN BOOLEAN WaitToSet,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
UINT32 Index; UINT32 Index;
for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) { for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) {
if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) { if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) {
@ -167,13 +165,13 @@ EhcWaitOpRegBit (
**/ **/
UINT32 UINT32
EhcReadCapRegister ( EhcReadCapRegister (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
{ {
UINT32 Data; UINT32 Data;
Data = MmioRead32(Ehc->UsbHostControllerBaseAddress + Offset); Data = MmioRead32 (Ehc->UsbHostControllerBaseAddress + Offset);
return Data; return Data;
} }
@ -191,12 +189,12 @@ EhcReadCapRegister (
**/ **/
EFI_STATUS EFI_STATUS
EhcSetAndWaitDoorBell ( EhcSetAndWaitDoorBell (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 Data; UINT32 Data;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD);
@ -224,7 +222,7 @@ EhcSetAndWaitDoorBell (
**/ **/
VOID VOID
EhcAckAllInterrupt ( EhcAckAllInterrupt (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK); EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK);
@ -243,11 +241,11 @@ EhcAckAllInterrupt (
**/ **/
EFI_STATUS EFI_STATUS
EhcEnablePeriodSchd ( EhcEnablePeriodSchd (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD);
@ -267,11 +265,11 @@ EhcEnablePeriodSchd (
**/ **/
EFI_STATUS EFI_STATUS
EhcEnableAsyncSchd ( EhcEnableAsyncSchd (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC);
@ -290,7 +288,7 @@ EhcEnableAsyncSchd (
**/ **/
BOOLEAN BOOLEAN
EhcIsHalt ( EhcIsHalt (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT); return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT);
@ -307,7 +305,7 @@ EhcIsHalt (
**/ **/
BOOLEAN BOOLEAN
EhcIsSysError ( EhcIsSysError (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR); return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR);
@ -325,11 +323,11 @@ EhcIsSysError (
**/ **/
EFI_STATUS EFI_STATUS
EhcResetHC ( EhcResetHC (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Host can only be reset when it is halt. If not so, halt it // Host can only be reset when it is halt. If not so, halt it
@ -359,11 +357,11 @@ EhcResetHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcHaltHC ( EhcHaltHC (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN); EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout); Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout);
@ -382,11 +380,11 @@ EhcHaltHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcRunHC ( EhcRunHC (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN); EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout); Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout);
@ -401,12 +399,12 @@ EhcRunHC (
**/ **/
VOID VOID
EhcPowerOnAllPorts ( EhcPowerOnAllPorts (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
UINT8 PortNumber; UINT8 PortNumber;
UINT8 Index; UINT8 Index;
UINT32 RegVal; UINT32 RegVal;
PortNumber = (UINT8)(Ehc->HcStructParams & HCSP_NPORTS); PortNumber = (UINT8)(Ehc->HcStructParams & HCSP_NPORTS);
for (Index = 0; Index < PortNumber; Index++) { for (Index = 0; Index < PortNumber; Index++) {
@ -414,7 +412,7 @@ EhcPowerOnAllPorts (
// Do not clear port status bits on initialization. Otherwise devices will // Do not clear port status bits on initialization. Otherwise devices will
// not enumerate properly at startup. // not enumerate properly at startup.
// //
RegVal = EhcReadOpReg(Ehc, EHC_PORT_STAT_OFFSET + 4 * Index); RegVal = EhcReadOpReg (Ehc, EHC_PORT_STAT_OFFSET + 4 * Index);
RegVal &= ~PORTSC_CHANGE_MASK; RegVal &= ~PORTSC_CHANGE_MASK;
RegVal |= PORTSC_POWER; RegVal |= PORTSC_POWER;
EhcWriteOpReg (Ehc, EHC_PORT_STAT_OFFSET + 4 * Index, RegVal); EhcWriteOpReg (Ehc, EHC_PORT_STAT_OFFSET + 4 * Index, RegVal);
@ -438,12 +436,12 @@ EhcPowerOnAllPorts (
**/ **/
EFI_STATUS EFI_STATUS
EhcInitHC ( EhcInitHC (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS TempPtr; EFI_PHYSICAL_ADDRESS TempPtr;
UINTN PageNumber; UINTN PageNumber;
ASSERT (EhcIsHalt (Ehc)); ASSERT (EhcIsHalt (Ehc));
@ -454,13 +452,14 @@ EhcInitHC (
if (Ehc->PeriodFrame != NULL) { if (Ehc->PeriodFrame != NULL) {
EhcFreeSched (Ehc); EhcFreeSched (Ehc);
} }
PageNumber = sizeof(PEI_URB)/PAGESIZE +1;
Status = PeiServicesAllocatePages ( PageNumber = sizeof (PEI_URB)/PAGESIZE +1;
EfiBootServicesCode, Status = PeiServicesAllocatePages (
PageNumber, EfiBootServicesCode,
&TempPtr PageNumber,
); &TempPtr
Ehc->Urb = (PEI_URB *) ((UINTN) TempPtr); );
Ehc->Urb = (PEI_URB *)((UINTN)TempPtr);
if (Ehc->Urb == NULL) { if (Ehc->Urb == NULL) {
return Status; return Status;
} }
@ -473,6 +472,7 @@ EhcInitHC (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// 1. Program the CTRLDSSEGMENT register with the high 32 bit addr // 1. Program the CTRLDSSEGMENT register with the high 32 bit addr
// //
@ -563,15 +563,16 @@ EhcBulkTransfer (
OUT UINT32 *TransferResult OUT UINT32 *TransferResult
) )
{ {
PEI_USB2_HC_DEV *Ehc; PEI_USB2_HC_DEV *Ehc;
PEI_URB *Urb; PEI_URB *Urb;
EFI_STATUS Status; EFI_STATUS Status;
// //
// Validate the parameters // Validate the parameters
// //
if ((DataLength == NULL) || (*DataLength == 0) || if ((DataLength == NULL) || (*DataLength == 0) ||
(Data == NULL) || (Data[0] == NULL) || (TransferResult == NULL)) { (Data == NULL) || (Data[0] == NULL) || (TransferResult == NULL))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
@ -581,11 +582,12 @@ EhcBulkTransfer (
if ((DeviceSpeed == EFI_USB_SPEED_LOW) || if ((DeviceSpeed == EFI_USB_SPEED_LOW) ||
((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) || ((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) ||
((EFI_USB_SPEED_HIGH == DeviceSpeed) && (MaximumPacketLength > 512))) { ((EFI_USB_SPEED_HIGH == DeviceSpeed) && (MaximumPacketLength > 512)))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Ehc =PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS(This); Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
*TransferResult = EFI_USB_ERR_SYSTEM; *TransferResult = EFI_USB_ERR_SYSTEM;
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;
@ -656,13 +658,13 @@ ON_EXIT:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcGetRootHubPortNumber ( EhcGetRootHubPortNumber (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN PEI_USB2_HOST_CONTROLLER_PPI *This, IN PEI_USB2_HOST_CONTROLLER_PPI *This,
OUT UINT8 *PortNumber OUT UINT8 *PortNumber
) )
{ {
PEI_USB2_HC_DEV *EhcDev;
PEI_USB2_HC_DEV *EhcDev;
EhcDev = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This); EhcDev = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
if (PortNumber == NULL) { if (PortNumber == NULL) {
@ -671,7 +673,6 @@ EhcGetRootHubPortNumber (
*PortNumber = (UINT8)(EhcDev->HcStructParams & HCSP_NPORTS); *PortNumber = (UINT8)(EhcDev->HcStructParams & HCSP_NPORTS);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
/** /**
@ -692,20 +693,20 @@ EhcGetRootHubPortNumber (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcClearRootHubPortFeature ( EhcClearRootHubPortFeature (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN PEI_USB2_HOST_CONTROLLER_PPI *This, IN PEI_USB2_HOST_CONTROLLER_PPI *This,
IN UINT8 PortNumber, IN UINT8 PortNumber,
IN EFI_USB_PORT_FEATURE PortFeature IN EFI_USB_PORT_FEATURE PortFeature
) )
{ {
PEI_USB2_HC_DEV *Ehc; PEI_USB2_HC_DEV *Ehc;
UINT32 Offset; UINT32 Offset;
UINT32 State; UINT32 State;
UINT32 TotalPort; UINT32 TotalPort;
EFI_STATUS Status; EFI_STATUS Status;
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This); Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
TotalPort = (Ehc->HcStructParams & HCSP_NPORTS); TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
@ -714,82 +715,82 @@ EhcClearRootHubPortFeature (
goto ON_EXIT; goto ON_EXIT;
} }
Offset = EHC_PORT_STAT_OFFSET + (4 * PortNumber); Offset = EHC_PORT_STAT_OFFSET + (4 * PortNumber);
State = EhcReadOpReg (Ehc, Offset); State = EhcReadOpReg (Ehc, Offset);
State &= ~PORTSC_CHANGE_MASK; State &= ~PORTSC_CHANGE_MASK;
switch (PortFeature) { switch (PortFeature) {
case EfiUsbPortEnable: case EfiUsbPortEnable:
// //
// Clear PORT_ENABLE feature means disable port. // Clear PORT_ENABLE feature means disable port.
// //
State &= ~PORTSC_ENABLED; State &= ~PORTSC_ENABLED;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortSuspend: case EfiUsbPortSuspend:
// //
// A write of zero to this bit is ignored by the host // A write of zero to this bit is ignored by the host
// controller. The host controller will unconditionally // controller. The host controller will unconditionally
// set this bit to a zero when: // set this bit to a zero when:
// 1. software sets the Forct Port Resume bit to a zero from a one. // 1. software sets the Forct Port Resume bit to a zero from a one.
// 2. software sets the Port Reset bit to a one frome a zero. // 2. software sets the Port Reset bit to a one frome a zero.
// //
State &= ~PORSTSC_RESUME; State &= ~PORSTSC_RESUME;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortReset: case EfiUsbPortReset:
// //
// Clear PORT_RESET means clear the reset signal. // Clear PORT_RESET means clear the reset signal.
// //
State &= ~PORTSC_RESET; State &= ~PORTSC_RESET;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortOwner: case EfiUsbPortOwner:
// //
// Clear port owner means this port owned by EHC // Clear port owner means this port owned by EHC
// //
State &= ~PORTSC_OWNER; State &= ~PORTSC_OWNER;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortConnectChange: case EfiUsbPortConnectChange:
// //
// Clear connect status change // Clear connect status change
// //
State |= PORTSC_CONN_CHANGE; State |= PORTSC_CONN_CHANGE;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortEnableChange: case EfiUsbPortEnableChange:
// //
// Clear enable status change // Clear enable status change
// //
State |= PORTSC_ENABLE_CHANGE; State |= PORTSC_ENABLE_CHANGE;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortOverCurrentChange: case EfiUsbPortOverCurrentChange:
// //
// Clear PortOverCurrent change // Clear PortOverCurrent change
// //
State |= PORTSC_OVERCUR_CHANGE; State |= PORTSC_OVERCUR_CHANGE;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortPower: case EfiUsbPortPower:
case EfiUsbPortSuspendChange: case EfiUsbPortSuspendChange:
case EfiUsbPortResetChange: case EfiUsbPortResetChange:
// //
// Not supported or not related operation // Not supported or not related operation
// //
break; break;
default: default:
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
break; break;
} }
ON_EXIT: ON_EXIT:
@ -812,20 +813,20 @@ ON_EXIT:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcSetRootHubPortFeature ( EhcSetRootHubPortFeature (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN PEI_USB2_HOST_CONTROLLER_PPI *This, IN PEI_USB2_HOST_CONTROLLER_PPI *This,
IN UINT8 PortNumber, IN UINT8 PortNumber,
IN EFI_USB_PORT_FEATURE PortFeature IN EFI_USB_PORT_FEATURE PortFeature
) )
{ {
PEI_USB2_HC_DEV *Ehc; PEI_USB2_HC_DEV *Ehc;
UINT32 Offset; UINT32 Offset;
UINT32 State; UINT32 State;
UINT32 TotalPort; UINT32 TotalPort;
EFI_STATUS Status; EFI_STATUS Status;
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This); Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
TotalPort = (Ehc->HcStructParams & HCSP_NPORTS); TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
@ -834,8 +835,8 @@ EhcSetRootHubPortFeature (
goto ON_EXIT; goto ON_EXIT;
} }
Offset = (UINT32) (EHC_PORT_STAT_OFFSET + (4 * PortNumber)); Offset = (UINT32)(EHC_PORT_STAT_OFFSET + (4 * PortNumber));
State = EhcReadOpReg (Ehc, Offset); State = EhcReadOpReg (Ehc, Offset);
// //
// Mask off the port status change bits, these bits are // Mask off the port status change bits, these bits are
@ -844,54 +845,54 @@ EhcSetRootHubPortFeature (
State &= ~PORTSC_CHANGE_MASK; State &= ~PORTSC_CHANGE_MASK;
switch (PortFeature) { switch (PortFeature) {
case EfiUsbPortEnable: case EfiUsbPortEnable:
// //
// Sofeware can't set this bit, Port can only be enable by // Sofeware can't set this bit, Port can only be enable by
// EHCI as a part of the reset and enable // EHCI as a part of the reset and enable
// //
State |= PORTSC_ENABLED; State |= PORTSC_ENABLED;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortSuspend: case EfiUsbPortSuspend:
State |= PORTSC_SUSPEND; State |= PORTSC_SUSPEND;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortReset: case EfiUsbPortReset:
// //
// Make sure Host Controller not halt before reset it // Make sure Host Controller not halt before reset it
// //
if (EhcIsHalt (Ehc)) { if (EhcIsHalt (Ehc)) {
Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT); Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
break; break;
}
} }
}
// //
// Set one to PortReset bit must also set zero to PortEnable bit // Set one to PortReset bit must also set zero to PortEnable bit
// //
State |= PORTSC_RESET; State |= PORTSC_RESET;
State &= ~PORTSC_ENABLED; State &= ~PORTSC_ENABLED;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
case EfiUsbPortPower: case EfiUsbPortPower:
// //
// Not supported, ignore the operation // Not supported, ignore the operation
// //
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
break; break;
case EfiUsbPortOwner: case EfiUsbPortOwner:
State |= PORTSC_OWNER; State |= PORTSC_OWNER;
EhcWriteOpReg (Ehc, Offset, State); EhcWriteOpReg (Ehc, Offset, State);
break; break;
default: default:
Status = EFI_INVALID_PARAMETER; Status = EFI_INVALID_PARAMETER;
} }
ON_EXIT: ON_EXIT:
@ -914,26 +915,26 @@ ON_EXIT:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
EhcGetRootHubPortStatus ( EhcGetRootHubPortStatus (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN PEI_USB2_HOST_CONTROLLER_PPI *This, IN PEI_USB2_HOST_CONTROLLER_PPI *This,
IN UINT8 PortNumber, IN UINT8 PortNumber,
OUT EFI_USB_PORT_STATUS *PortStatus OUT EFI_USB_PORT_STATUS *PortStatus
) )
{ {
PEI_USB2_HC_DEV *Ehc; PEI_USB2_HC_DEV *Ehc;
UINT32 Offset; UINT32 Offset;
UINT32 State; UINT32 State;
UINT32 TotalPort; UINT32 TotalPort;
UINTN Index; UINTN Index;
UINTN MapSize; UINTN MapSize;
EFI_STATUS Status; EFI_STATUS Status;
if (PortStatus == NULL) { if (PortStatus == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS(This); Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
TotalPort = (Ehc->HcStructParams & HCSP_NPORTS); TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
@ -942,11 +943,11 @@ EhcGetRootHubPortStatus (
goto ON_EXIT; goto ON_EXIT;
} }
Offset = (UINT32) (EHC_PORT_STAT_OFFSET + (4 * PortNumber)); Offset = (UINT32)(EHC_PORT_STAT_OFFSET + (4 * PortNumber));
PortStatus->PortStatus = 0; PortStatus->PortStatus = 0;
PortStatus->PortChangeStatus = 0; PortStatus->PortChangeStatus = 0;
State = EhcReadOpReg (Ehc, Offset); State = EhcReadOpReg (Ehc, Offset);
// //
// Identify device speed. If in K state, it is low speed. // Identify device speed. If in K state, it is low speed.
@ -956,7 +957,6 @@ EhcGetRootHubPortStatus (
// //
if (EHC_BIT_IS_SET (State, PORTSC_LINESTATE_K)) { if (EHC_BIT_IS_SET (State, PORTSC_LINESTATE_K)) {
PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED; PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED;
} else if (EHC_BIT_IS_SET (State, PORTSC_ENABLED)) { } else if (EHC_BIT_IS_SET (State, PORTSC_ENABLED)) {
PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED; PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
} }
@ -968,7 +968,7 @@ EhcGetRootHubPortStatus (
for (Index = 0; Index < MapSize; Index++) { for (Index = 0; Index < MapSize; Index++) {
if (EHC_BIT_IS_SET (State, mUsbPortStateMap[Index].HwState)) { if (EHC_BIT_IS_SET (State, mUsbPortStateMap[Index].HwState)) {
PortStatus->PortStatus = (UINT16) (PortStatus->PortStatus | mUsbPortStateMap[Index].UefiState); PortStatus->PortStatus = (UINT16)(PortStatus->PortStatus | mUsbPortStateMap[Index].UefiState);
} }
} }
@ -976,7 +976,7 @@ EhcGetRootHubPortStatus (
for (Index = 0; Index < MapSize; Index++) { for (Index = 0; Index < MapSize; Index++) {
if (EHC_BIT_IS_SET (State, mUsbPortChangeMap[Index].HwState)) { if (EHC_BIT_IS_SET (State, mUsbPortChangeMap[Index].HwState)) {
PortStatus->PortChangeStatus = (UINT16) (PortStatus->PortChangeStatus | mUsbPortChangeMap[Index].UefiState); PortStatus->PortChangeStatus = (UINT16)(PortStatus->PortChangeStatus | mUsbPortChangeMap[Index].UefiState);
} }
} }
@ -1027,10 +1027,10 @@ EhcControlTransfer (
OUT UINT32 *TransferResult OUT UINT32 *TransferResult
) )
{ {
PEI_USB2_HC_DEV *Ehc; PEI_USB2_HC_DEV *Ehc;
PEI_URB *Urb; PEI_URB *Urb;
UINT8 Endpoint; UINT8 Endpoint;
EFI_STATUS Status; EFI_STATUS Status;
// //
// Validate parameters // Validate parameters
@ -1041,33 +1041,37 @@ EhcControlTransfer (
if ((TransferDirection != EfiUsbDataIn) && if ((TransferDirection != EfiUsbDataIn) &&
(TransferDirection != EfiUsbDataOut) && (TransferDirection != EfiUsbDataOut) &&
(TransferDirection != EfiUsbNoData)) { (TransferDirection != EfiUsbNoData))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if ((TransferDirection == EfiUsbNoData) && if ((TransferDirection == EfiUsbNoData) &&
((Data != NULL) || (*DataLength != 0))) { ((Data != NULL) || (*DataLength != 0)))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if ((TransferDirection != EfiUsbNoData) && if ((TransferDirection != EfiUsbNoData) &&
((Data == NULL) || (*DataLength == 0))) { ((Data == NULL) || (*DataLength == 0)))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if ((MaximumPacketLength != 8) && (MaximumPacketLength != 16) && if ((MaximumPacketLength != 8) && (MaximumPacketLength != 16) &&
(MaximumPacketLength != 32) && (MaximumPacketLength != 64)) { (MaximumPacketLength != 32) && (MaximumPacketLength != 64))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
if ((DeviceSpeed == EFI_USB_SPEED_LOW) || if ((DeviceSpeed == EFI_USB_SPEED_LOW) ||
((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) || ((DeviceSpeed == EFI_USB_SPEED_FULL) && (MaximumPacketLength > 64)) ||
((EFI_USB_SPEED_HIGH == DeviceSpeed) && (MaximumPacketLength > 512))) { ((EFI_USB_SPEED_HIGH == DeviceSpeed) && (MaximumPacketLength > 512)))
{
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This); Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
Status = EFI_DEVICE_ERROR; Status = EFI_DEVICE_ERROR;
*TransferResult = EFI_USB_ERR_SYSTEM; *TransferResult = EFI_USB_ERR_SYSTEM;
@ -1088,23 +1092,23 @@ EhcControlTransfer (
// endpoint is bidirectional. EhcCreateUrb expects this // endpoint is bidirectional. EhcCreateUrb expects this
// combination of Ep addr and its direction. // combination of Ep addr and its direction.
// //
Endpoint = (UINT8) (0 | ((TransferDirection == EfiUsbDataIn) ? 0x80 : 0)); Endpoint = (UINT8)(0 | ((TransferDirection == EfiUsbDataIn) ? 0x80 : 0));
Urb = EhcCreateUrb ( Urb = EhcCreateUrb (
Ehc, Ehc,
DeviceAddress, DeviceAddress,
Endpoint, Endpoint,
DeviceSpeed, DeviceSpeed,
0, 0,
MaximumPacketLength, MaximumPacketLength,
Translator, Translator,
EHC_CTRL_TRANSFER, EHC_CTRL_TRANSFER,
Request, Request,
Data, Data,
*DataLength, *DataLength,
NULL, NULL,
NULL, NULL,
1 1
); );
if (Urb == NULL) { if (Urb == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
@ -1152,7 +1156,7 @@ EhcEndOfPei (
IN VOID *Ppi IN VOID *Ppi
) )
{ {
PEI_USB2_HC_DEV *Ehc; PEI_USB2_HC_DEV *Ehc;
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_THIS_NOTIFY (NotifyDescriptor); Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_THIS_NOTIFY (NotifyDescriptor);
@ -1177,14 +1181,14 @@ EhcPeimEntry (
IN CONST EFI_PEI_SERVICES **PeiServices IN CONST EFI_PEI_SERVICES **PeiServices
) )
{ {
PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi; PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi;
EFI_STATUS Status; EFI_STATUS Status;
UINT8 Index; UINT8 Index;
UINTN ControllerType; UINTN ControllerType;
UINTN BaseAddress; UINTN BaseAddress;
UINTN MemPages; UINTN MemPages;
PEI_USB2_HC_DEV *EhcDev; PEI_USB2_HC_DEV *EhcDev;
EFI_PHYSICAL_ADDRESS TempPtr; EFI_PHYSICAL_ADDRESS TempPtr;
// //
// Shadow this PEIM to run from memory // Shadow this PEIM to run from memory
@ -1197,7 +1201,7 @@ EhcPeimEntry (
&gPeiUsbControllerPpiGuid, &gPeiUsbControllerPpiGuid,
0, 0,
NULL, NULL,
(VOID **) &ChipSetUsbControllerPpi (VOID **)&ChipSetUsbControllerPpi
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
@ -1206,7 +1210,7 @@ EhcPeimEntry (
Index = 0; Index = 0;
while (TRUE) { while (TRUE) {
Status = ChipSetUsbControllerPpi->GetUsbController ( Status = ChipSetUsbControllerPpi->GetUsbController (
(EFI_PEI_SERVICES **) PeiServices, (EFI_PEI_SERVICES **)PeiServices,
ChipSetUsbControllerPpi, ChipSetUsbControllerPpi,
Index, Index,
&ControllerType, &ControllerType,
@ -1228,24 +1232,23 @@ EhcPeimEntry (
} }
MemPages = sizeof (PEI_USB2_HC_DEV) / PAGESIZE + 1; MemPages = sizeof (PEI_USB2_HC_DEV) / PAGESIZE + 1;
Status = PeiServicesAllocatePages ( Status = PeiServicesAllocatePages (
EfiBootServicesCode, EfiBootServicesCode,
MemPages, MemPages,
&TempPtr &TempPtr
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
ZeroMem((VOID *)(UINTN)TempPtr, MemPages*PAGESIZE); ZeroMem ((VOID *)(UINTN)TempPtr, MemPages*PAGESIZE);
EhcDev = (PEI_USB2_HC_DEV *) ((UINTN) TempPtr); EhcDev = (PEI_USB2_HC_DEV *)((UINTN)TempPtr);
EhcDev->Signature = USB2_HC_DEV_SIGNATURE; EhcDev->Signature = USB2_HC_DEV_SIGNATURE;
IoMmuInit (&EhcDev->IoMmu); IoMmuInit (&EhcDev->IoMmu);
EhcDev->UsbHostControllerBaseAddress = (UINT32) BaseAddress; EhcDev->UsbHostControllerBaseAddress = (UINT32)BaseAddress;
EhcDev->HcStructParams = EhcReadCapRegister (EhcDev, EHC_HCSPARAMS_OFFSET); EhcDev->HcStructParams = EhcReadCapRegister (EhcDev, EHC_HCSPARAMS_OFFSET);
EhcDev->HcCapParams = EhcReadCapRegister (EhcDev, EHC_HCCPARAMS_OFFSET); EhcDev->HcCapParams = EhcReadCapRegister (EhcDev, EHC_HCCPARAMS_OFFSET);
@ -1258,16 +1261,16 @@ EhcPeimEntry (
return Status; return Status;
} }
EhcDev->Usb2HostControllerPpi.ControlTransfer = EhcControlTransfer; EhcDev->Usb2HostControllerPpi.ControlTransfer = EhcControlTransfer;
EhcDev->Usb2HostControllerPpi.BulkTransfer = EhcBulkTransfer; EhcDev->Usb2HostControllerPpi.BulkTransfer = EhcBulkTransfer;
EhcDev->Usb2HostControllerPpi.GetRootHubPortNumber = EhcGetRootHubPortNumber; EhcDev->Usb2HostControllerPpi.GetRootHubPortNumber = EhcGetRootHubPortNumber;
EhcDev->Usb2HostControllerPpi.GetRootHubPortStatus = EhcGetRootHubPortStatus; EhcDev->Usb2HostControllerPpi.GetRootHubPortStatus = EhcGetRootHubPortStatus;
EhcDev->Usb2HostControllerPpi.SetRootHubPortFeature = EhcSetRootHubPortFeature; EhcDev->Usb2HostControllerPpi.SetRootHubPortFeature = EhcSetRootHubPortFeature;
EhcDev->Usb2HostControllerPpi.ClearRootHubPortFeature = EhcClearRootHubPortFeature; EhcDev->Usb2HostControllerPpi.ClearRootHubPortFeature = EhcClearRootHubPortFeature;
EhcDev->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); EhcDev->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
EhcDev->PpiDescriptor.Guid = &gPeiUsb2HostControllerPpiGuid; EhcDev->PpiDescriptor.Guid = &gPeiUsb2HostControllerPpiGuid;
EhcDev->PpiDescriptor.Ppi = &EhcDev->Usb2HostControllerPpi; EhcDev->PpiDescriptor.Ppi = &EhcDev->Usb2HostControllerPpi;
Status = PeiServicesInstallPpi (&EhcDev->PpiDescriptor); Status = PeiServicesInstallPpi (&EhcDev->PpiDescriptor);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
@ -1275,8 +1278,8 @@ EhcPeimEntry (
continue; continue;
} }
EhcDev->EndOfPeiNotifyList.Flags = (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST); EhcDev->EndOfPeiNotifyList.Flags = (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
EhcDev->EndOfPeiNotifyList.Guid = &gEfiEndOfPeiSignalPpiGuid; EhcDev->EndOfPeiNotifyList.Guid = &gEfiEndOfPeiSignalPpiGuid;
EhcDev->EndOfPeiNotifyList.Notify = EhcEndOfPei; EhcDev->EndOfPeiNotifyList.Notify = EhcEndOfPei;
PeiServicesNotifyPpi (&EhcDev->EndOfPeiNotifyList); PeiServicesNotifyPpi (&EhcDev->EndOfPeiNotifyList);
@ -1296,12 +1299,11 @@ EhcPeimEntry (
**/ **/
EFI_STATUS EFI_STATUS
InitializeUsbHC ( InitializeUsbHC (
IN PEI_USB2_HC_DEV *EhcDev IN PEI_USB2_HC_DEV *EhcDev
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EhcResetHC (EhcDev, EHC_RESET_TIMEOUT); EhcResetHC (EhcDev, EHC_RESET_TIMEOUT);
Status = EhcInitHC (EhcDev); Status = EhcInitHC (EhcDev);

View File

@ -28,46 +28,44 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
typedef struct _PEI_USB2_HC_DEV PEI_USB2_HC_DEV; typedef struct _PEI_USB2_HC_DEV PEI_USB2_HC_DEV;
#define EFI_LIST_ENTRY LIST_ENTRY #define EFI_LIST_ENTRY LIST_ENTRY
#include "UsbHcMem.h" #include "UsbHcMem.h"
#include "EhciReg.h" #include "EhciReg.h"
#include "EhciUrb.h" #include "EhciUrb.h"
#include "EhciSched.h" #include "EhciSched.h"
#define EFI_USB_SPEED_FULL 0x0000 #define EFI_USB_SPEED_FULL 0x0000
#define EFI_USB_SPEED_LOW 0x0001 #define EFI_USB_SPEED_LOW 0x0001
#define EFI_USB_SPEED_HIGH 0x0002 #define EFI_USB_SPEED_HIGH 0x0002
#define PAGESIZE 4096 #define PAGESIZE 4096
#define EHC_1_MICROSECOND 1 #define EHC_1_MICROSECOND 1
#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND) #define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND) #define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
// //
// EHCI register operation timeout, set by experience // EHCI register operation timeout, set by experience
// //
#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND) #define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND) #define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
// //
// Wait for roothub port power stable, refers to Spec[EHCI1.0-2.3.9] // Wait for roothub port power stable, refers to Spec[EHCI1.0-2.3.9]
// //
#define EHC_ROOT_PORT_RECOVERY_STALL (20 * EHC_1_MILLISECOND) #define EHC_ROOT_PORT_RECOVERY_STALL (20 * EHC_1_MILLISECOND)
// //
// Sync transfer polling interval, set by experience. // Sync transfer polling interval, set by experience.
// //
#define EHC_SYNC_POLL_INTERVAL (6 * EHC_1_MILLISECOND) #define EHC_SYNC_POLL_INTERVAL (6 * EHC_1_MILLISECOND)
#define EFI_LIST_CONTAINER(Entry, Type, Field) BASE_CR(Entry, Type, Field) #define EFI_LIST_CONTAINER(Entry, Type, Field) BASE_CR(Entry, Type, Field)
#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 0XFFFFFFFF))
#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 0XFFFFFFFF)) #define EHC_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF))
#define EHC_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF)) #define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
#define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
#define EHC_REG_BIT_IS_SET(Ehc, Offset, Bit) \ #define EHC_REG_BIT_IS_SET(Ehc, Offset, Bit) \
(EHC_BIT_IS_SET(EhcReadOpReg ((Ehc), (Offset)), (Bit))) (EHC_BIT_IS_SET(EhcReadOpReg ((Ehc), (Offset)), (Bit)))
@ -75,18 +73,18 @@ typedef struct _PEI_USB2_HC_DEV PEI_USB2_HC_DEV;
#define USB2_HC_DEV_SIGNATURE SIGNATURE_32 ('e', 'h', 'c', 'i') #define USB2_HC_DEV_SIGNATURE SIGNATURE_32 ('e', 'h', 'c', 'i')
struct _PEI_USB2_HC_DEV { struct _PEI_USB2_HC_DEV {
UINTN Signature; UINTN Signature;
PEI_USB2_HOST_CONTROLLER_PPI Usb2HostControllerPpi; PEI_USB2_HOST_CONTROLLER_PPI Usb2HostControllerPpi;
EDKII_IOMMU_PPI *IoMmu; EDKII_IOMMU_PPI *IoMmu;
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
// //
// EndOfPei callback is used to stop the EHC DMA operation // EndOfPei callback is used to stop the EHC DMA operation
// after exit PEI phase. // after exit PEI phase.
// //
EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList; EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;
UINT32 UsbHostControllerBaseAddress; UINT32 UsbHostControllerBaseAddress;
PEI_URB *Urb; PEI_URB *Urb;
USBHC_MEM_POOL *MemPool; USBHC_MEM_POOL *MemPool;
// //
// Schedule data shared between asynchronous and periodic // Schedule data shared between asynchronous and periodic
@ -97,36 +95,36 @@ struct _PEI_USB2_HC_DEV {
// For control transfer, even the short read happens, try the // For control transfer, even the short read happens, try the
// status stage. // status stage.
// //
PEI_EHC_QTD *ShortReadStop; PEI_EHC_QTD *ShortReadStop;
EFI_EVENT PollTimer; EFI_EVENT PollTimer;
// //
// Asynchronous(bulk and control) transfer schedule data: // Asynchronous(bulk and control) transfer schedule data:
// ReclaimHead is used as the head of the asynchronous transfer // ReclaimHead is used as the head of the asynchronous transfer
// list. It acts as the reclamation header. // list. It acts as the reclamation header.
// //
PEI_EHC_QH *ReclaimHead; PEI_EHC_QH *ReclaimHead;
// //
// Periodic (interrupt) transfer schedule data: // Periodic (interrupt) transfer schedule data:
// //
VOID *PeriodFrame; // Mapped as common buffer VOID *PeriodFrame; // Mapped as common buffer
VOID *PeriodFrameMap; VOID *PeriodFrameMap;
PEI_EHC_QH *PeriodOne; PEI_EHC_QH *PeriodOne;
EFI_LIST_ENTRY AsyncIntTransfers; EFI_LIST_ENTRY AsyncIntTransfers;
// //
// EHCI configuration data // EHCI configuration data
// //
UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
UINT32 CapLen; // Capability length UINT32 CapLen; // Capability length
UINT32 High32bitAddr; UINT32 High32bitAddr;
}; };
#define PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS(a) CR (a, PEI_USB2_HC_DEV, Usb2HostControllerPpi, USB2_HC_DEV_SIGNATURE) #define PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS(a) CR (a, PEI_USB2_HC_DEV, Usb2HostControllerPpi, USB2_HC_DEV_SIGNATURE)
#define PEI_RECOVERY_USB_EHC_DEV_FROM_THIS_NOTIFY(a) CR (a, PEI_USB2_HC_DEV, EndOfPeiNotifyList, USB2_HC_DEV_SIGNATURE) #define PEI_RECOVERY_USB_EHC_DEV_FROM_THIS_NOTIFY(a) CR (a, PEI_USB2_HC_DEV, EndOfPeiNotifyList, USB2_HC_DEV_SIGNATURE)
/** /**
@param EhcDev EHCI Device. @param EhcDev EHCI Device.
@ -137,7 +135,7 @@ struct _PEI_USB2_HC_DEV {
**/ **/
EFI_STATUS EFI_STATUS
InitializeUsbHC ( InitializeUsbHC (
IN PEI_USB2_HC_DEV *EhcDev IN PEI_USB2_HC_DEV *EhcDev
); );
/** /**
@ -154,9 +152,9 @@ InitializeUsbHC (
**/ **/
USBHC_MEM_POOL * USBHC_MEM_POOL *
UsbHcInitMemPool ( UsbHcInitMemPool (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN BOOLEAN Check4G, IN BOOLEAN Check4G,
IN UINT32 Which4G IN UINT32 Which4G
) )
; ;
@ -172,8 +170,8 @@ UsbHcInitMemPool (
**/ **/
EFI_STATUS EFI_STATUS
UsbHcFreeMemPool ( UsbHcFreeMemPool (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool IN USBHC_MEM_POOL *Pool
) )
; ;
@ -190,9 +188,9 @@ UsbHcFreeMemPool (
**/ **/
VOID * VOID *
UsbHcAllocateMem ( UsbHcAllocateMem (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN UINTN Size IN UINTN Size
) )
; ;
@ -207,10 +205,10 @@ UsbHcAllocateMem (
**/ **/
VOID VOID
UsbHcFreeMem ( UsbHcFreeMem (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
) )
; ;
@ -253,8 +251,8 @@ IoMmuMap (
**/ **/
VOID VOID
IoMmuUnmap ( IoMmuUnmap (
IN EDKII_IOMMU_PPI *IoMmu, IN EDKII_IOMMU_PPI *IoMmu,
IN VOID *Mapping IN VOID *Mapping
); );
/** /**
@ -296,10 +294,10 @@ IoMmuAllocateBuffer (
**/ **/
VOID VOID
IoMmuFreeBuffer ( IoMmuFreeBuffer (
IN EDKII_IOMMU_PPI *IoMmu, IN EDKII_IOMMU_PPI *IoMmu,
IN UINTN Pages, IN UINTN Pages,
IN VOID *HostAddress, IN VOID *HostAddress,
IN VOID *Mapping IN VOID *Mapping
); );
/** /**
@ -310,7 +308,7 @@ IoMmuFreeBuffer (
**/ **/
VOID VOID
IoMmuInit ( IoMmuInit (
OUT EDKII_IOMMU_PPI **IoMmu OUT EDKII_IOMMU_PPI **IoMmu
); );
#endif #endif

View File

@ -10,20 +10,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_REG_H_ #ifndef _EFI_EHCI_REG_H_
#define _EFI_EHCI_REG_H_ #define _EFI_EHCI_REG_H_
// //
// Capability register offset // Capability register offset
// //
#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset #define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h #define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset #define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
// //
// Capability register bit definition // Capability register bit definition
// //
#define HCSP_NPORTS 0x0F // Number of root hub port #define HCSP_NPORTS 0x0F // Number of root hub port
#define HCCP_64BIT 0x01 // 64-bit addressing capability #define HCCP_64BIT 0x01 // 64-bit addressing capability
// //
// Operational register offset // Operational register offset
@ -38,61 +36,61 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#define EHC_CONFIG_FLAG_OFFSET 0x40 // Configure flag register offset #define EHC_CONFIG_FLAG_OFFSET 0x40 // Configure flag register offset
#define EHC_PORT_STAT_OFFSET 0x44 // Port status/control offset #define EHC_PORT_STAT_OFFSET 0x44 // Port status/control offset
#define EHC_FRAME_LEN 1024 #define EHC_FRAME_LEN 1024
// //
// Register bit definition // Register bit definition
// //
#define CONFIGFLAG_ROUTE_EHC 0x01 // Route port to EHC #define CONFIGFLAG_ROUTE_EHC 0x01 // Route port to EHC
#define USBCMD_RUN 0x01 // Run/stop #define USBCMD_RUN 0x01 // Run/stop
#define USBCMD_RESET 0x02 // Start the host controller reset #define USBCMD_RESET 0x02 // Start the host controller reset
#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule #define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule #define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell #define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
#define USBSTS_IAA 0x20 // Interrupt on async advance #define USBSTS_IAA 0x20 // Interrupt on async advance
#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status #define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status #define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
#define USBSTS_HALT 0x1000 // Host controller halted #define USBSTS_HALT 0x1000 // Host controller halted
#define USBSTS_SYS_ERROR 0x10 // Host system error #define USBSTS_SYS_ERROR 0x10 // Host system error
#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC #define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
// (write clean) bits in USBSTS register // (write clean) bits in USBSTS register
#define PORTSC_CONN 0x01 // Current Connect Status #define PORTSC_CONN 0x01 // Current Connect Status
#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change #define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
#define PORTSC_ENABLED 0x04 // Port Enable / Disable #define PORTSC_ENABLED 0x04 // Port Enable / Disable
#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change #define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
#define PORTSC_OVERCUR 0x10 // Over current Active #define PORTSC_OVERCUR 0x10 // Over current Active
#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change #define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
#define PORSTSC_RESUME 0x40 // Force Port Resume #define PORSTSC_RESUME 0x40 // Force Port Resume
#define PORTSC_SUSPEND 0x80 // Port Suspend State #define PORTSC_SUSPEND 0x80 // Port Suspend State
#define PORTSC_RESET 0x100 // Port Reset #define PORTSC_RESET 0x100 // Port Reset
#define PORTSC_LINESTATE_K 0x400 // Line Status K-state #define PORTSC_LINESTATE_K 0x400 // Line Status K-state
#define PORTSC_LINESTATE_J 0x800 // Line Status J-state #define PORTSC_LINESTATE_J 0x800 // Line Status J-state
#define PORTSC_POWER 0x1000 // Port Power #define PORTSC_POWER 0x1000 // Port Power
#define PORTSC_OWNER 0x2000 // Port Owner #define PORTSC_OWNER 0x2000 // Port Owner
#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits, #define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
// they are WC (write clean) // they are WC (write clean)
// //
// PCI Configuration Registers // PCI Configuration Registers
// //
#define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10 #define EHC_BAR_INDEX 0 // how many bytes away from USB_BASE to 0x10
#define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0) #define EHC_LINK_TERMINATED(Link) (((Link) & 0x01) != 0)
#define EHC_ADDR(High, QhHw32) \ #define EHC_ADDR(High, QhHw32) \
((VOID *) (UINTN) (LShiftU64 ((High), 32) | ((QhHw32) & 0xFFFFFFF0))) ((VOID *) (UINTN) (LShiftU64 ((High), 32) | ((QhHw32) & 0xFFFFFFF0)))
#define EHCI_IS_DATAIN(EndpointAddr) EHC_BIT_IS_SET((EndpointAddr), 0x80) #define EHCI_IS_DATAIN(EndpointAddr) EHC_BIT_IS_SET((EndpointAddr), 0x80)
// //
// Structure to map the hardware port states to the // Structure to map the hardware port states to the
// UEFI's port states. // UEFI's port states.
// //
typedef struct { typedef struct {
UINT16 HwState; UINT16 HwState;
UINT16 UefiState; UINT16 UefiState;
} USB_PORT_STATE_MAP; } USB_PORT_STATE_MAP;
// //
@ -100,13 +98,12 @@ typedef struct {
// //
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
UINT8 Pi; UINT8 Pi;
UINT8 SubClassCode; UINT8 SubClassCode;
UINT8 BaseCode; UINT8 BaseCode;
} USB_CLASSC; } USB_CLASSC;
#pragma pack() #pragma pack()
/** /**
Read EHCI capability register. Read EHCI capability register.
@ -118,8 +115,8 @@ typedef struct {
**/ **/
UINT32 UINT32
EhcReadCapRegister ( EhcReadCapRegister (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
; ;
@ -134,8 +131,8 @@ EhcReadCapRegister (
**/ **/
UINT32 UINT32
EhcReadOpReg ( EhcReadOpReg (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset IN UINT32 Offset
) )
; ;
@ -149,9 +146,9 @@ EhcReadOpReg (
**/ **/
VOID VOID
EhcWriteOpReg ( EhcWriteOpReg (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Offset, IN UINT32 Offset,
IN UINT32 Data IN UINT32 Data
) )
; ;
@ -163,7 +160,7 @@ EhcWriteOpReg (
**/ **/
VOID VOID
EhcClearLegacySupport ( EhcClearLegacySupport (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;
@ -180,8 +177,8 @@ EhcClearLegacySupport (
**/ **/
EFI_STATUS EFI_STATUS
EhcSetAndWaitDoorBell ( EhcSetAndWaitDoorBell (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
; ;
@ -194,7 +191,7 @@ EhcSetAndWaitDoorBell (
**/ **/
VOID VOID
EhcAckAllInterrupt ( EhcAckAllInterrupt (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;
@ -209,7 +206,7 @@ EhcAckAllInterrupt (
**/ **/
BOOLEAN BOOLEAN
EhcIsHalt ( EhcIsHalt (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;
@ -224,7 +221,7 @@ EhcIsHalt (
**/ **/
BOOLEAN BOOLEAN
EhcIsSysError ( EhcIsSysError (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;
@ -240,8 +237,8 @@ EhcIsSysError (
**/ **/
EFI_STATUS EFI_STATUS
EhcResetHC ( EhcResetHC (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
; ;
@ -257,8 +254,8 @@ EhcResetHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcHaltHC ( EhcHaltHC (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
; ;
@ -274,8 +271,8 @@ EhcHaltHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcRunHC ( EhcRunHC (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT32 Timeout IN UINT32 Timeout
) )
; ;
@ -296,7 +293,7 @@ EhcRunHC (
**/ **/
EFI_STATUS EFI_STATUS
EhcInitHC ( EhcInitHC (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;

View File

@ -22,13 +22,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
EFI_STATUS EFI_STATUS
EhcCreateHelpQ ( EhcCreateHelpQ (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
USB_ENDPOINT Ep; USB_ENDPOINT Ep;
PEI_EHC_QH *Qh; PEI_EHC_QH *Qh;
QH_HW *QhHw; QH_HW *QhHw;
PEI_EHC_QTD *Qtd; PEI_EHC_QTD *Qtd;
// //
// Create an inactive Qtd to terminate the short packet read. // Create an inactive Qtd to terminate the short packet read.
@ -39,25 +39,25 @@ EhcCreateHelpQ (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Qtd->QtdHw.Status = QTD_STAT_HALTED; Qtd->QtdHw.Status = QTD_STAT_HALTED;
Ehc->ShortReadStop = Qtd; Ehc->ShortReadStop = Qtd;
// //
// Create a QH to act as the EHC reclamation header. // Create a QH to act as the EHC reclamation header.
// Set the header to loopback to itself. // Set the header to loopback to itself.
// //
Ep.DevAddr = 0; Ep.DevAddr = 0;
Ep.EpAddr = 1; Ep.EpAddr = 1;
Ep.Direction = EfiUsbDataIn; Ep.Direction = EfiUsbDataIn;
Ep.DevSpeed = EFI_USB_SPEED_HIGH; Ep.DevSpeed = EFI_USB_SPEED_HIGH;
Ep.MaxPacket = 64; Ep.MaxPacket = 64;
Ep.HubAddr = 0; Ep.HubAddr = 0;
Ep.HubPort = 0; Ep.HubPort = 0;
Ep.Toggle = 0; Ep.Toggle = 0;
Ep.Type = EHC_BULK_TRANSFER; Ep.Type = EHC_BULK_TRANSFER;
Ep.PollRate = 1; Ep.PollRate = 1;
Qh = EhcCreateQh (Ehc, &Ep); Qh = EhcCreateQh (Ehc, &Ep);
if (Qh == NULL) { if (Qh == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -72,10 +72,10 @@ EhcCreateHelpQ (
// //
// Create a dummy QH to act as the terminator for periodical schedule // Create a dummy QH to act as the terminator for periodical schedule
// //
Ep.EpAddr = 2; Ep.EpAddr = 2;
Ep.Type = EHC_INT_TRANSFER_SYNC; Ep.Type = EHC_INT_TRANSFER_SYNC;
Qh = EhcCreateQh (Ehc, &Ep); Qh = EhcCreateQh (Ehc, &Ep);
if (Qh == NULL) { if (Qh == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
@ -98,7 +98,7 @@ EhcCreateHelpQ (
**/ **/
EFI_STATUS EFI_STATUS
EhcInitSched ( EhcInitSched (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
VOID *Buf; VOID *Buf;
@ -132,9 +132,9 @@ EhcInitSched (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Ehc->PeriodFrame = Buf; Ehc->PeriodFrame = Buf;
Ehc->PeriodFrameMap = Map; Ehc->PeriodFrameMap = Map;
Ehc->High32bitAddr = EHC_HIGH_32BIT (PhyAddr); Ehc->High32bitAddr = EHC_HIGH_32BIT (PhyAddr);
// //
// Init memory pool management then create the helper // Init memory pool management then create the helper
@ -160,8 +160,8 @@ EhcInitSched (
// //
// Initialize the frame list entries then set the registers // Initialize the frame list entries then set the registers
// //
Desc = (UINT32 *) Ehc->PeriodFrame; Desc = (UINT32 *)Ehc->PeriodFrame;
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (PEI_EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (PEI_EHC_QH));
for (Index = 0; Index < EHC_FRAME_LEN; Index++) { for (Index = 0; Index < EHC_FRAME_LEN; Index++) {
Desc[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE); Desc[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
} }
@ -173,7 +173,7 @@ EhcInitSched (
// Only need to set the AsynListAddr register to // Only need to set the AsynListAddr register to
// the reclamation header // the reclamation header
// //
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ReclaimHead, sizeof (PEI_EHC_QH)); PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->ReclaimHead, sizeof (PEI_EHC_QH));
EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, EHC_LOW_32BIT (PciAddr)); EhcWriteOpReg (Ehc, EHC_ASYNC_HEAD_OFFSET, EHC_LOW_32BIT (PciAddr));
return EFI_SUCCESS; return EFI_SUCCESS;
} }
@ -186,7 +186,7 @@ EhcInitSched (
**/ **/
VOID VOID
EhcFreeSched ( EhcFreeSched (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
{ {
EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, 0); EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, 0);
@ -231,24 +231,24 @@ EhcFreeSched (
**/ **/
VOID VOID
EhcLinkQhToAsync ( EhcLinkQhToAsync (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_EHC_QH *Qh IN PEI_EHC_QH *Qh
) )
{ {
PEI_EHC_QH *Head; PEI_EHC_QH *Head;
// //
// Append the queue head after the reclaim header, then // Append the queue head after the reclaim header, then
// fix the hardware visiable parts (EHCI R1.0 page 72). // fix the hardware visiable parts (EHCI R1.0 page 72).
// ReclaimHead is always linked to the EHCI's AsynListAddr. // ReclaimHead is always linked to the EHCI's AsynListAddr.
// //
Head = Ehc->ReclaimHead; Head = Ehc->ReclaimHead;
Qh->NextQh = Head->NextQh; Qh->NextQh = Head->NextQh;
Head->NextQh = Qh; Head->NextQh = Qh;
Qh->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);; Qh->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);
Head->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE); Head->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE);
} }
/** /**
@ -261,11 +261,11 @@ EhcLinkQhToAsync (
**/ **/
VOID VOID
EhcUnlinkQhFromAsync ( EhcUnlinkQhFromAsync (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_EHC_QH *Qh IN PEI_EHC_QH *Qh
) )
{ {
PEI_EHC_QH *Head; PEI_EHC_QH *Head;
ASSERT (Ehc->ReclaimHead->NextQh == Qh); ASSERT (Ehc->ReclaimHead->NextQh == Qh);
@ -274,12 +274,12 @@ EhcUnlinkQhFromAsync (
// visiable part: Only need to loopback the ReclaimHead. The Qh // visiable part: Only need to loopback the ReclaimHead. The Qh
// is pointing to ReclaimHead (which is staill in the list). // is pointing to ReclaimHead (which is staill in the list).
// //
Head = Ehc->ReclaimHead; Head = Ehc->ReclaimHead;
Head->NextQh = Qh->NextQh; Head->NextQh = Qh->NextQh;
Qh->NextQh = NULL; Qh->NextQh = NULL;
Head->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE); Head->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);
// //
// Set and wait the door bell to synchronize with the hardware // Set and wait the door bell to synchronize with the hardware
@ -302,22 +302,22 @@ EhcUnlinkQhFromAsync (
**/ **/
BOOLEAN BOOLEAN
EhcCheckUrbResult ( EhcCheckUrbResult (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_URB *Urb IN PEI_URB *Urb
) )
{ {
EFI_LIST_ENTRY *Entry; EFI_LIST_ENTRY *Entry;
PEI_EHC_QTD *Qtd; PEI_EHC_QTD *Qtd;
QTD_HW *QtdHw; QTD_HW *QtdHw;
UINT8 State; UINT8 State;
BOOLEAN Finished; BOOLEAN Finished;
ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL)); ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));
Finished = TRUE; Finished = TRUE;
Urb->Completed = 0; Urb->Completed = 0;
Urb->Result = EFI_USB_NOERROR; Urb->Result = EFI_USB_NOERROR;
if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) { if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
Urb->Result |= EFI_USB_ERR_SYSTEM; Urb->Result |= EFI_USB_ERR_SYSTEM;
@ -327,7 +327,7 @@ EhcCheckUrbResult (
BASE_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) { BASE_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) {
Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList); Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList);
QtdHw = &Qtd->QtdHw; QtdHw = &Qtd->QtdHw;
State = (UINT8) QtdHw->Status; State = (UINT8)QtdHw->Status;
if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) { if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) {
// //
@ -352,7 +352,6 @@ EhcCheckUrbResult (
Finished = TRUE; Finished = TRUE;
goto ON_EXIT; goto ON_EXIT;
} else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) { } else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) {
// //
// The QTD is still active, no need to check furthur. // The QTD is still active, no need to check furthur.
@ -361,7 +360,6 @@ EhcCheckUrbResult (
Finished = FALSE; Finished = FALSE;
goto ON_EXIT; goto ON_EXIT;
} else { } else {
// //
// This QTD is finished OK or met short packet read. Update the // This QTD is finished OK or met short packet read. Update the
@ -372,7 +370,7 @@ EhcCheckUrbResult (
} }
if ((QtdHw->TotalBytes != 0) && (QtdHw->Pid == QTD_PID_INPUT)) { if ((QtdHw->TotalBytes != 0) && (QtdHw->Pid == QTD_PID_INPUT)) {
//EHC_DUMP_QH ((Urb->Qh, "Short packet read", FALSE)); // EHC_DUMP_QH ((Urb->Qh, "Short packet read", FALSE));
// //
// Short packet read condition. If it isn't a setup transfer, // Short packet read condition. If it isn't a setup transfer,
@ -381,7 +379,6 @@ EhcCheckUrbResult (
// Status Stage of the setup transfer to get the finial result // Status Stage of the setup transfer to get the finial result
// //
if (QtdHw->AltNext == QTD_LINK (Ehc->ShortReadStop, FALSE)) { if (QtdHw->AltNext == QTD_LINK (Ehc->ShortReadStop, FALSE)) {
Finished = TRUE; Finished = TRUE;
goto ON_EXIT; goto ON_EXIT;
} }
@ -399,7 +396,7 @@ ON_EXIT:
// NOTICE: don't move DT update before the loop, otherwise there is // NOTICE: don't move DT update before the loop, otherwise there is
// a race condition that DT is wrong. // a race condition that DT is wrong.
// //
Urb->DataToggle = (UINT8) Urb->Qh->QhHw.DataToggle; Urb->DataToggle = (UINT8)Urb->Qh->QhHw.DataToggle;
return Finished; return Finished;
} }
@ -418,19 +415,19 @@ ON_EXIT:
**/ **/
EFI_STATUS EFI_STATUS
EhcExecTransfer ( EhcExecTransfer (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_URB *Urb, IN PEI_URB *Urb,
IN UINTN TimeOut IN UINTN TimeOut
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINTN Index; UINTN Index;
UINTN Loop; UINTN Loop;
BOOLEAN Finished; BOOLEAN Finished;
BOOLEAN InfiniteLoop; BOOLEAN InfiniteLoop;
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
Loop = TimeOut * EHC_1_MILLISECOND; Loop = TimeOut * EHC_1_MILLISECOND;
Finished = FALSE; Finished = FALSE;
InfiniteLoop = FALSE; InfiniteLoop = FALSE;
@ -460,4 +457,3 @@ EhcExecTransfer (
return Status; return Status;
} }

View File

@ -21,7 +21,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
EFI_STATUS EFI_STATUS
EhcInitSched ( EhcInitSched (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;
@ -33,7 +33,7 @@ EhcInitSched (
**/ **/
VOID VOID
EhcFreeSched ( EhcFreeSched (
IN PEI_USB2_HC_DEV *Ehc IN PEI_USB2_HC_DEV *Ehc
) )
; ;
@ -50,8 +50,8 @@ EhcFreeSched (
**/ **/
VOID VOID
EhcLinkQhToAsync ( EhcLinkQhToAsync (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_EHC_QH *Qh IN PEI_EHC_QH *Qh
) )
; ;
@ -65,8 +65,8 @@ EhcLinkQhToAsync (
**/ **/
VOID VOID
EhcUnlinkQhFromAsync ( EhcUnlinkQhFromAsync (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_EHC_QH *Qh IN PEI_EHC_QH *Qh
) )
; ;
@ -84,9 +84,9 @@ EhcUnlinkQhFromAsync (
**/ **/
EFI_STATUS EFI_STATUS
EhcExecTransfer ( EhcExecTransfer (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_URB *Urb, IN PEI_URB *Urb,
IN UINTN TimeOut IN UINTN TimeOut
) )
; ;

View File

@ -27,19 +27,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
PEI_EHC_QTD * PEI_EHC_QTD *
EhcCreateQtd ( EhcCreateQtd (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT8 *Data, IN UINT8 *Data,
IN UINTN DataLen, IN UINTN DataLen,
IN UINT8 PktId, IN UINT8 PktId,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket IN UINTN MaxPacket
) )
{ {
PEI_EHC_QTD *Qtd; PEI_EHC_QTD *Qtd;
QTD_HW *QtdHw; QTD_HW *QtdHw;
UINTN Index; UINTN Index;
UINTN Len; UINTN Len;
UINTN ThisBufLen; UINTN ThisBufLen;
ASSERT (Ehc != NULL); ASSERT (Ehc != NULL);
@ -49,9 +49,9 @@ EhcCreateQtd (
return NULL; return NULL;
} }
Qtd->Signature = EHC_QTD_SIG; Qtd->Signature = EHC_QTD_SIG;
Qtd->Data = Data; Qtd->Data = Data;
Qtd->DataLen = 0; Qtd->DataLen = 0;
InitializeListHead (&Qtd->QtdList); InitializeListHead (&Qtd->QtdList);
@ -77,17 +77,17 @@ EhcCreateQtd (
// compute the offset and clear Reserved fields. This is already // compute the offset and clear Reserved fields. This is already
// done in the data point. // done in the data point.
// //
QtdHw->Page[Index] = EHC_LOW_32BIT (Data); QtdHw->Page[Index] = EHC_LOW_32BIT (Data);
QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (Data); QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (Data);
ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (Data) & QTD_BUF_MASK); ThisBufLen = QTD_BUF_LEN - (EHC_LOW_32BIT (Data) & QTD_BUF_MASK);
if (Len + ThisBufLen >= DataLen) { if (Len + ThisBufLen >= DataLen) {
Len = DataLen; Len = DataLen;
break; break;
} }
Len += ThisBufLen; Len += ThisBufLen;
Data += ThisBufLen; Data += ThisBufLen;
} }
@ -101,7 +101,7 @@ EhcCreateQtd (
Len = Len - Len % MaxPacket; Len = Len - Len % MaxPacket;
} }
QtdHw->TotalBytes = (UINT32) Len; QtdHw->TotalBytes = (UINT32)Len;
Qtd->DataLen = Len; Qtd->DataLen = Len;
} }
@ -121,8 +121,8 @@ EhcCreateQtd (
**/ **/
VOID VOID
EhcInitIntQh ( EhcInitIntQh (
IN USB_ENDPOINT *Ep, IN USB_ENDPOINT *Ep,
IN QH_HW *QhHw IN QH_HW *QhHw
) )
{ {
// //
@ -134,7 +134,7 @@ EhcInitIntQh (
// //
if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) { if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) {
QhHw->SMask = QH_MICROFRAME_0; QhHw->SMask = QH_MICROFRAME_0;
return ; return;
} }
// //
@ -163,12 +163,12 @@ EhcInitIntQh (
**/ **/
PEI_EHC_QH * PEI_EHC_QH *
EhcCreateQh ( EhcCreateQh (
IN PEI_USB2_HC_DEV *Ehci, IN PEI_USB2_HC_DEV *Ehci,
IN USB_ENDPOINT *Ep IN USB_ENDPOINT *Ep
) )
{ {
PEI_EHC_QH *Qh; PEI_EHC_QH *Qh;
QH_HW *QhHw; QH_HW *QhHw;
Qh = UsbHcAllocateMem (Ehci, Ehci->MemPool, sizeof (PEI_EHC_QH)); Qh = UsbHcAllocateMem (Ehci, Ehci->MemPool, sizeof (PEI_EHC_QH));
@ -176,62 +176,63 @@ EhcCreateQh (
return NULL; return NULL;
} }
Qh->Signature = EHC_QH_SIG; Qh->Signature = EHC_QH_SIG;
Qh->NextQh = NULL; Qh->NextQh = NULL;
Qh->Interval = Ep->PollRate; Qh->Interval = Ep->PollRate;
InitializeListHead (&Qh->Qtds); InitializeListHead (&Qh->Qtds);
QhHw = &Qh->QhHw; QhHw = &Qh->QhHw;
QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE); QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
QhHw->DeviceAddr = Ep->DevAddr; QhHw->DeviceAddr = Ep->DevAddr;
QhHw->Inactive = 0; QhHw->Inactive = 0;
QhHw->EpNum = Ep->EpAddr; QhHw->EpNum = Ep->EpAddr;
QhHw->EpSpeed = Ep->DevSpeed; QhHw->EpSpeed = Ep->DevSpeed;
QhHw->DtCtrl = 0; QhHw->DtCtrl = 0;
QhHw->ReclaimHead = 0; QhHw->ReclaimHead = 0;
QhHw->MaxPacketLen = (UINT32) Ep->MaxPacket; QhHw->MaxPacketLen = (UINT32)Ep->MaxPacket;
QhHw->CtrlEp = 0; QhHw->CtrlEp = 0;
QhHw->NakReload = QH_NAK_RELOAD; QhHw->NakReload = QH_NAK_RELOAD;
QhHw->HubAddr = Ep->HubAddr; QhHw->HubAddr = Ep->HubAddr;
QhHw->PortNum = Ep->HubPort; QhHw->PortNum = Ep->HubPort;
QhHw->Multiplier = 1; QhHw->Multiplier = 1;
QhHw->DataToggle = Ep->Toggle; QhHw->DataToggle = Ep->Toggle;
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) { if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
QhHw->Status |= QTD_STAT_DO_SS; QhHw->Status |= QTD_STAT_DO_SS;
} }
switch (Ep->Type) { switch (Ep->Type) {
case EHC_CTRL_TRANSFER: case EHC_CTRL_TRANSFER:
// //
// Special initialization for the control transfer: // Special initialization for the control transfer:
// 1. Control transfer initialize data toggle from each QTD // 1. Control transfer initialize data toggle from each QTD
// 2. Set the Control Endpoint Flag (C) for low/full speed endpoint. // 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
// //
QhHw->DtCtrl = 1; QhHw->DtCtrl = 1;
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) { if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
QhHw->CtrlEp = 1; QhHw->CtrlEp = 1;
} }
break;
case EHC_INT_TRANSFER_ASYNC: break;
case EHC_INT_TRANSFER_SYNC:
//
// Special initialization for the interrupt transfer
// to set the S-Mask and C-Mask
//
QhHw->NakReload = 0;
EhcInitIntQh (Ep, QhHw);
break;
case EHC_BULK_TRANSFER: case EHC_INT_TRANSFER_ASYNC:
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) { case EHC_INT_TRANSFER_SYNC:
QhHw->Status |= QTD_STAT_DO_PING; //
} // Special initialization for the interrupt transfer
// to set the S-Mask and C-Mask
//
QhHw->NakReload = 0;
EhcInitIntQh (Ep, QhHw);
break;
break; case EHC_BULK_TRANSFER:
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
QhHw->Status |= QTD_STAT_DO_PING;
}
break;
} }
return Qh; return Qh;
@ -252,10 +253,10 @@ EhcCreateQh (
**/ **/
UINTN UINTN
EhcConvertPollRate ( EhcConvertPollRate (
IN UINTN Interval IN UINTN Interval
) )
{ {
UINTN BitCount; UINTN BitCount;
if (Interval == 0) { if (Interval == 0) {
return 1; return 1;
@ -283,13 +284,13 @@ EhcConvertPollRate (
**/ **/
VOID VOID
EhcFreeQtds ( EhcFreeQtds (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN EFI_LIST_ENTRY *Qtds IN EFI_LIST_ENTRY *Qtds
) )
{ {
EFI_LIST_ENTRY *Entry; EFI_LIST_ENTRY *Entry;
EFI_LIST_ENTRY *Next; EFI_LIST_ENTRY *Next;
PEI_EHC_QTD *Qtd; PEI_EHC_QTD *Qtd;
BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) { BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {
Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList); Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList);
@ -308,8 +309,8 @@ EhcFreeQtds (
**/ **/
VOID VOID
EhcFreeUrb ( EhcFreeUrb (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_URB *Urb IN PEI_URB *Urb
) )
{ {
if (Urb->RequestPhy != NULL) { if (Urb->RequestPhy != NULL) {
@ -342,20 +343,20 @@ EhcFreeUrb (
**/ **/
EFI_STATUS EFI_STATUS
EhcCreateQtds ( EhcCreateQtds (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_URB *Urb IN PEI_URB *Urb
) )
{ {
USB_ENDPOINT *Ep; USB_ENDPOINT *Ep;
PEI_EHC_QH *Qh; PEI_EHC_QH *Qh;
PEI_EHC_QTD *Qtd; PEI_EHC_QTD *Qtd;
PEI_EHC_QTD *StatusQtd; PEI_EHC_QTD *StatusQtd;
PEI_EHC_QTD *NextQtd; PEI_EHC_QTD *NextQtd;
EFI_LIST_ENTRY *Entry; EFI_LIST_ENTRY *Entry;
UINT32 AlterNext; UINT32 AlterNext;
UINT8 Toggle; UINT8 Toggle;
UINTN Len; UINTN Len;
UINT8 Pid; UINT8 Pid;
ASSERT ((Urb != NULL) && (Urb->Qh != NULL)); ASSERT ((Urb != NULL) && (Urb->Qh != NULL));
@ -428,7 +429,7 @@ EhcCreateQtds (
while (Len < Urb->DataLen) { while (Len < Urb->DataLen) {
Qtd = EhcCreateQtd ( Qtd = EhcCreateQtd (
Ehc, Ehc,
(UINT8 *) Urb->DataPhy + Len, (UINT8 *)Urb->DataPhy + Len,
Urb->DataLen - Len, Urb->DataLen - Len,
Pid, Pid,
Toggle, Toggle,
@ -446,7 +447,7 @@ EhcCreateQtds (
// Switch the Toggle bit if odd number of packets are included in the QTD. // Switch the Toggle bit if odd number of packets are included in the QTD.
// //
if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) { if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) {
Toggle = (UINT8) (1 - Toggle); Toggle = (UINT8)(1 - Toggle);
} }
Len += Qtd->DataLen; Len += Qtd->DataLen;
@ -472,15 +473,15 @@ EhcCreateQtds (
break; break;
} }
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, PEI_EHC_QTD, QtdList); NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, PEI_EHC_QTD, QtdList);
Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE); Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE);
} }
// //
// Link the QTDs to the queue head // Link the QTDs to the queue head
// //
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, PEI_EHC_QTD, QtdList); NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, PEI_EHC_QTD, QtdList);
Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE); Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE);
return EFI_SUCCESS; return EFI_SUCCESS;
ON_ERROR: ON_ERROR:
@ -511,63 +512,63 @@ ON_ERROR:
**/ **/
PEI_URB * PEI_URB *
EhcCreateUrb ( EhcCreateUrb (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpAddr, IN UINT8 EpAddr,
IN UINT8 DevSpeed, IN UINT8 DevSpeed,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket, IN UINTN MaxPacket,
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub, IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
IN UINTN Type, IN UINTN Type,
IN EFI_USB_DEVICE_REQUEST *Request, IN EFI_USB_DEVICE_REQUEST *Request,
IN VOID *Data, IN VOID *Data,
IN UINTN DataLen, IN UINTN DataLen,
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
IN VOID *Context, IN VOID *Context,
IN UINTN Interval IN UINTN Interval
) )
{ {
USB_ENDPOINT *Ep; USB_ENDPOINT *Ep;
EFI_PHYSICAL_ADDRESS PhyAddr; EFI_PHYSICAL_ADDRESS PhyAddr;
EDKII_IOMMU_OPERATION MapOp; EDKII_IOMMU_OPERATION MapOp;
EFI_STATUS Status; EFI_STATUS Status;
UINTN Len; UINTN Len;
PEI_URB *Urb; PEI_URB *Urb;
VOID *Map; VOID *Map;
Map = NULL; Map = NULL;
Urb = Ehc->Urb; Urb = Ehc->Urb;
Urb->Signature = EHC_URB_SIG; Urb->Signature = EHC_URB_SIG;
InitializeListHead (&Urb->UrbList); InitializeListHead (&Urb->UrbList);
Ep = &Urb->Ep; Ep = &Urb->Ep;
Ep->DevAddr = DevAddr; Ep->DevAddr = DevAddr;
Ep->EpAddr = (UINT8) (EpAddr & 0x0F); Ep->EpAddr = (UINT8)(EpAddr & 0x0F);
Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut); Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
Ep->DevSpeed = DevSpeed; Ep->DevSpeed = DevSpeed;
Ep->MaxPacket = MaxPacket; Ep->MaxPacket = MaxPacket;
Ep->HubAddr = 0; Ep->HubAddr = 0;
Ep->HubPort = 0; Ep->HubPort = 0;
if (DevSpeed != EFI_USB_SPEED_HIGH) { if (DevSpeed != EFI_USB_SPEED_HIGH) {
ASSERT (Hub != NULL); ASSERT (Hub != NULL);
Ep->HubAddr = Hub->TranslatorHubAddress; Ep->HubAddr = Hub->TranslatorHubAddress;
Ep->HubPort = Hub->TranslatorPortNumber; Ep->HubPort = Hub->TranslatorPortNumber;
} }
Ep->Toggle = Toggle; Ep->Toggle = Toggle;
Ep->Type = Type; Ep->Type = Type;
Ep->PollRate = EhcConvertPollRate (Interval); Ep->PollRate = EhcConvertPollRate (Interval);
Urb->Request = Request; Urb->Request = Request;
Urb->Data = Data; Urb->Data = Data;
Urb->DataLen = DataLen; Urb->DataLen = DataLen;
Urb->Callback = Callback; Urb->Callback = Callback;
Urb->Context = Context; Urb->Context = Context;
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep); Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
if (Urb->Qh == NULL) { if (Urb->Qh == NULL) {
goto ON_ERROR; goto ON_ERROR;
@ -575,27 +576,27 @@ EhcCreateUrb (
Urb->RequestPhy = NULL; Urb->RequestPhy = NULL;
Urb->RequestMap = NULL; Urb->RequestMap = NULL;
Urb->DataPhy = NULL; Urb->DataPhy = NULL;
Urb->DataMap = NULL; Urb->DataMap = NULL;
// //
// Map the request and user data // Map the request and user data
// //
if (Request != NULL) { if (Request != NULL) {
Len = sizeof (EFI_USB_DEVICE_REQUEST); Len = sizeof (EFI_USB_DEVICE_REQUEST);
MapOp = EdkiiIoMmuOperationBusMasterRead; MapOp = EdkiiIoMmuOperationBusMasterRead;
Status = IoMmuMap (Ehc->IoMmu, MapOp, Request, &Len, &PhyAddr, &Map); Status = IoMmuMap (Ehc->IoMmu, MapOp, Request, &Len, &PhyAddr, &Map);
if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) { if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) {
goto ON_ERROR; goto ON_ERROR;
} }
Urb->RequestPhy = (VOID *) ((UINTN) PhyAddr); Urb->RequestPhy = (VOID *)((UINTN)PhyAddr);
Urb->RequestMap = Map; Urb->RequestMap = Map;
} }
if (Data != NULL) { if (Data != NULL) {
Len = DataLen; Len = DataLen;
if (Ep->Direction == EfiUsbDataIn) { if (Ep->Direction == EfiUsbDataIn) {
MapOp = EdkiiIoMmuOperationBusMasterWrite; MapOp = EdkiiIoMmuOperationBusMasterWrite;
@ -603,14 +604,14 @@ EhcCreateUrb (
MapOp = EdkiiIoMmuOperationBusMasterRead; MapOp = EdkiiIoMmuOperationBusMasterRead;
} }
Status = IoMmuMap (Ehc->IoMmu, MapOp, Data, &Len, &PhyAddr, &Map); Status = IoMmuMap (Ehc->IoMmu, MapOp, Data, &Len, &PhyAddr, &Map);
if (EFI_ERROR (Status) || (Len != DataLen)) { if (EFI_ERROR (Status) || (Len != DataLen)) {
goto ON_ERROR; goto ON_ERROR;
} }
Urb->DataPhy = (VOID *) ((UINTN) PhyAddr); Urb->DataPhy = (VOID *)((UINTN)PhyAddr);
Urb->DataMap = Map; Urb->DataMap = Map;
} }
Status = EhcCreateQtds (Ehc, Urb); Status = EhcCreateQtds (Ehc, Urb);

View File

@ -10,60 +10,60 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#ifndef _EFI_EHCI_URB_H_ #ifndef _EFI_EHCI_URB_H_
#define _EFI_EHCI_URB_H_ #define _EFI_EHCI_URB_H_
typedef struct _PEI_EHC_QTD PEI_EHC_QTD; typedef struct _PEI_EHC_QTD PEI_EHC_QTD;
typedef struct _PEI_EHC_QH PEI_EHC_QH; typedef struct _PEI_EHC_QH PEI_EHC_QH;
typedef struct _PEI_URB PEI_URB; typedef struct _PEI_URB PEI_URB;
#define EHC_CTRL_TRANSFER 0x01 #define EHC_CTRL_TRANSFER 0x01
#define EHC_BULK_TRANSFER 0x02 #define EHC_BULK_TRANSFER 0x02
#define EHC_INT_TRANSFER_SYNC 0x04 #define EHC_INT_TRANSFER_SYNC 0x04
#define EHC_INT_TRANSFER_ASYNC 0x08 #define EHC_INT_TRANSFER_ASYNC 0x08
#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T') #define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H') #define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R') #define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
// //
// Hardware related bit definitions // Hardware related bit definitions
// //
#define EHC_TYPE_ITD 0x00 #define EHC_TYPE_ITD 0x00
#define EHC_TYPE_QH 0x02 #define EHC_TYPE_QH 0x02
#define EHC_TYPE_SITD 0x04 #define EHC_TYPE_SITD 0x04
#define EHC_TYPE_FSTN 0x06 #define EHC_TYPE_FSTN 0x06
#define QH_NAK_RELOAD 3 #define QH_NAK_RELOAD 3
#define QH_HSHBW_MULTI 1 #define QH_HSHBW_MULTI 1
#define QTD_MAX_ERR 3 #define QTD_MAX_ERR 3
#define QTD_PID_OUTPUT 0x00 #define QTD_PID_OUTPUT 0x00
#define QTD_PID_INPUT 0x01 #define QTD_PID_INPUT 0x01
#define QTD_PID_SETUP 0x02 #define QTD_PID_SETUP 0x02
#define QTD_STAT_DO_OUT 0 #define QTD_STAT_DO_OUT 0
#define QTD_STAT_DO_SS 0 #define QTD_STAT_DO_SS 0
#define QTD_STAT_DO_PING 0x01 #define QTD_STAT_DO_PING 0x01
#define QTD_STAT_DO_CS 0x02 #define QTD_STAT_DO_CS 0x02
#define QTD_STAT_TRANS_ERR 0x08 #define QTD_STAT_TRANS_ERR 0x08
#define QTD_STAT_BABBLE_ERR 0x10 #define QTD_STAT_BABBLE_ERR 0x10
#define QTD_STAT_BUFF_ERR 0x20 #define QTD_STAT_BUFF_ERR 0x20
#define QTD_STAT_HALTED 0x40 #define QTD_STAT_HALTED 0x40
#define QTD_STAT_ACTIVE 0x80 #define QTD_STAT_ACTIVE 0x80
#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR) #define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
#define QTD_MAX_BUFFER 4 #define QTD_MAX_BUFFER 4
#define QTD_BUF_LEN 4096 #define QTD_BUF_LEN 4096
#define QTD_BUF_MASK 0x0FFF #define QTD_BUF_MASK 0x0FFF
#define QH_MICROFRAME_0 0x01 #define QH_MICROFRAME_0 0x01
#define QH_MICROFRAME_1 0x02 #define QH_MICROFRAME_1 0x02
#define QH_MICROFRAME_2 0x04 #define QH_MICROFRAME_2 0x04
#define QH_MICROFRAME_3 0x08 #define QH_MICROFRAME_3 0x08
#define QH_MICROFRAME_4 0x10 #define QH_MICROFRAME_4 0x10
#define QH_MICROFRAME_5 0x20 #define QH_MICROFRAME_5 0x20
#define QH_MICROFRAME_6 0x40 #define QH_MICROFRAME_6 0x40
#define QH_MICROFRAME_7 0x80 #define QH_MICROFRAME_7 0x80
#define USB_ERR_SHORT_PACKET 0x200 #define USB_ERR_SHORT_PACKET 0x200
// //
// Fill in the hardware link point: pass in a EHC_QH/QH_HW // Fill in the hardware link point: pass in a EHC_QH/QH_HW
@ -72,7 +72,7 @@ typedef struct _PEI_URB PEI_URB;
#define QH_LINK(Addr, Type, Term) \ #define QH_LINK(Addr, Type, Term) \
((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0))) ((UINT32) ((EHC_LOW_32BIT (Addr) & 0xFFFFFFE0) | (Type) | ((Term) ? 1 : 0)))
#define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term)) #define QTD_LINK(Addr, Term) QH_LINK((Addr), 0, (Term))
// //
// The defination of EHCI hardware used data structure for // The defination of EHCI hardware used data structure for
@ -82,77 +82,76 @@ typedef struct _PEI_URB PEI_URB;
// //
#pragma pack(1) #pragma pack(1)
typedef struct { typedef struct {
UINT32 NextQtd; UINT32 NextQtd;
UINT32 AltNext; UINT32 AltNext;
UINT32 Status : 8; UINT32 Status : 8;
UINT32 Pid : 2; UINT32 Pid : 2;
UINT32 ErrCnt : 2; UINT32 ErrCnt : 2;
UINT32 CurPage : 3; UINT32 CurPage : 3;
UINT32 Ioc : 1; UINT32 Ioc : 1;
UINT32 TotalBytes : 15; UINT32 TotalBytes : 15;
UINT32 DataToggle : 1; UINT32 DataToggle : 1;
UINT32 Page[5]; UINT32 Page[5];
UINT32 PageHigh[5]; UINT32 PageHigh[5];
} QTD_HW; } QTD_HW;
typedef struct { typedef struct {
UINT32 HorizonLink; UINT32 HorizonLink;
// //
// Endpoint capabilities/Characteristics DWord 1 and DWord 2 // Endpoint capabilities/Characteristics DWord 1 and DWord 2
// //
UINT32 DeviceAddr : 7; UINT32 DeviceAddr : 7;
UINT32 Inactive : 1; UINT32 Inactive : 1;
UINT32 EpNum : 4; UINT32 EpNum : 4;
UINT32 EpSpeed : 2; UINT32 EpSpeed : 2;
UINT32 DtCtrl : 1; UINT32 DtCtrl : 1;
UINT32 ReclaimHead : 1; UINT32 ReclaimHead : 1;
UINT32 MaxPacketLen : 11; UINT32 MaxPacketLen : 11;
UINT32 CtrlEp : 1; UINT32 CtrlEp : 1;
UINT32 NakReload : 4; UINT32 NakReload : 4;
UINT32 SMask : 8; UINT32 SMask : 8;
UINT32 CMask : 8; UINT32 CMask : 8;
UINT32 HubAddr : 7; UINT32 HubAddr : 7;
UINT32 PortNum : 7; UINT32 PortNum : 7;
UINT32 Multiplier : 2; UINT32 Multiplier : 2;
// //
// Transaction execution overlay area // Transaction execution overlay area
// //
UINT32 CurQtd; UINT32 CurQtd;
UINT32 NextQtd; UINT32 NextQtd;
UINT32 AltQtd; UINT32 AltQtd;
UINT32 Status : 8; UINT32 Status : 8;
UINT32 Pid : 2; UINT32 Pid : 2;
UINT32 ErrCnt : 2; UINT32 ErrCnt : 2;
UINT32 CurPage : 3; UINT32 CurPage : 3;
UINT32 Ioc : 1; UINT32 Ioc : 1;
UINT32 TotalBytes : 15; UINT32 TotalBytes : 15;
UINT32 DataToggle : 1; UINT32 DataToggle : 1;
UINT32 Page[5]; UINT32 Page[5];
UINT32 PageHigh[5]; UINT32 PageHigh[5];
} QH_HW; } QH_HW;
#pragma pack() #pragma pack()
// //
// Endpoint address and its capabilities // Endpoint address and its capabilities
// //
typedef struct _USB_ENDPOINT { typedef struct _USB_ENDPOINT {
UINT8 DevAddr; UINT8 DevAddr;
UINT8 EpAddr; // Endpoint address, no direction encoded in UINT8 EpAddr; // Endpoint address, no direction encoded in
EFI_USB_DATA_DIRECTION Direction; EFI_USB_DATA_DIRECTION Direction;
UINT8 DevSpeed; UINT8 DevSpeed;
UINTN MaxPacket; UINTN MaxPacket;
UINT8 HubAddr; UINT8 HubAddr;
UINT8 HubPort; UINT8 HubPort;
UINT8 Toggle; // Data toggle, not used for control transfer UINT8 Toggle; // Data toggle, not used for control transfer
UINTN Type; UINTN Type;
UINTN PollRate; // Polling interval used by EHCI UINTN PollRate; // Polling interval used by EHCI
} USB_ENDPOINT; } USB_ENDPOINT;
// //
@ -160,15 +159,13 @@ typedef struct _USB_ENDPOINT {
// QTD generated from a URB. Don't add fields before QtdHw. // QTD generated from a URB. Don't add fields before QtdHw.
// //
struct _PEI_EHC_QTD { struct _PEI_EHC_QTD {
QTD_HW QtdHw; QTD_HW QtdHw;
UINT32 Signature; UINT32 Signature;
EFI_LIST_ENTRY QtdList; // The list of QTDs to one end point EFI_LIST_ENTRY QtdList; // The list of QTDs to one end point
UINT8 *Data; // Buffer of the original data UINT8 *Data; // Buffer of the original data
UINTN DataLen; // Original amount of data in this QTD UINTN DataLen; // Original amount of data in this QTD
}; };
// //
// Software QH structure. All three different transaction types // Software QH structure. All three different transaction types
// supported by UEFI USB, that is the control/bulk/interrupt // supported by UEFI USB, that is the control/bulk/interrupt
@ -185,11 +182,11 @@ struct _PEI_EHC_QTD {
// as the reclamation header. New transfer is inserted after this QH. // as the reclamation header. New transfer is inserted after this QH.
// //
struct _PEI_EHC_QH { struct _PEI_EHC_QH {
QH_HW QhHw; QH_HW QhHw;
UINT32 Signature; UINT32 Signature;
PEI_EHC_QH *NextQh; // The queue head pointed to by horizontal link PEI_EHC_QH *NextQh; // The queue head pointed to by horizontal link
EFI_LIST_ENTRY Qtds; // The list of QTDs to this queue head EFI_LIST_ENTRY Qtds; // The list of QTDs to this queue head
UINTN Interval; UINTN Interval;
}; };
// //
@ -197,34 +194,34 @@ struct _PEI_EHC_QH {
// usb requests. // usb requests.
// //
struct _PEI_URB { struct _PEI_URB {
UINT32 Signature; UINT32 Signature;
EFI_LIST_ENTRY UrbList; EFI_LIST_ENTRY UrbList;
// //
// Transaction information // Transaction information
// //
USB_ENDPOINT Ep; USB_ENDPOINT Ep;
EFI_USB_DEVICE_REQUEST *Request; // Control transfer only EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
VOID *RequestPhy; // Address of the mapped request VOID *RequestPhy; // Address of the mapped request
VOID *RequestMap; VOID *RequestMap;
VOID *Data; VOID *Data;
UINTN DataLen; UINTN DataLen;
VOID *DataPhy; // Address of the mapped user data VOID *DataPhy; // Address of the mapped user data
VOID *DataMap; VOID *DataMap;
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback; EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
VOID *Context; VOID *Context;
// //
// Schedule data // Schedule data
// //
PEI_EHC_QH *Qh; PEI_EHC_QH *Qh;
// //
// Transaction result // Transaction result
// //
UINT32 Result; UINT32 Result;
UINTN Completed; // completed data length UINTN Completed; // completed data length
UINT8 DataToggle; UINT8 DataToggle;
}; };
/** /**
@ -243,12 +240,12 @@ struct _PEI_URB {
**/ **/
PEI_EHC_QTD * PEI_EHC_QTD *
EhcCreateQtd ( EhcCreateQtd (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT8 *Data, IN UINT8 *Data,
IN UINTN DataLen, IN UINTN DataLen,
IN UINT8 PktId, IN UINT8 PktId,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket IN UINTN MaxPacket
) )
; ;
@ -263,8 +260,8 @@ EhcCreateQtd (
**/ **/
PEI_EHC_QH * PEI_EHC_QH *
EhcCreateQh ( EhcCreateQh (
IN PEI_USB2_HC_DEV *Ehci, IN PEI_USB2_HC_DEV *Ehci,
IN USB_ENDPOINT *Ep IN USB_ENDPOINT *Ep
) )
; ;
@ -277,8 +274,8 @@ EhcCreateQh (
**/ **/
VOID VOID
EhcFreeUrb ( EhcFreeUrb (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN PEI_URB *Urb IN PEI_URB *Urb
) )
; ;
@ -305,20 +302,21 @@ EhcFreeUrb (
**/ **/
PEI_URB * PEI_URB *
EhcCreateUrb ( EhcCreateUrb (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN UINT8 DevAddr, IN UINT8 DevAddr,
IN UINT8 EpAddr, IN UINT8 EpAddr,
IN UINT8 DevSpeed, IN UINT8 DevSpeed,
IN UINT8 Toggle, IN UINT8 Toggle,
IN UINTN MaxPacket, IN UINTN MaxPacket,
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub, IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
IN UINTN Type, IN UINTN Type,
IN EFI_USB_DEVICE_REQUEST *Request, IN EFI_USB_DEVICE_REQUEST *Request,
IN VOID *Data, IN VOID *Data,
IN UINTN DataLen, IN UINTN DataLen,
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback, IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
IN VOID *Context, IN VOID *Context,
IN UINTN Interval IN UINTN Interval
) )
; ;
#endif #endif

View File

@ -22,30 +22,31 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
USBHC_MEM_BLOCK * USBHC_MEM_BLOCK *
UsbHcAllocMemBlock ( UsbHcAllocMemBlock (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN UINTN Pages IN UINTN Pages
) )
{ {
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
VOID *BufHost; VOID *BufHost;
VOID *Mapping; VOID *Mapping;
EFI_PHYSICAL_ADDRESS MappedAddr; EFI_PHYSICAL_ADDRESS MappedAddr;
EFI_STATUS Status; EFI_STATUS Status;
UINTN PageNumber; UINTN PageNumber;
EFI_PHYSICAL_ADDRESS TempPtr; EFI_PHYSICAL_ADDRESS TempPtr;
Mapping = NULL; Mapping = NULL;
PageNumber = sizeof(USBHC_MEM_BLOCK)/PAGESIZE +1; PageNumber = sizeof (USBHC_MEM_BLOCK)/PAGESIZE +1;
Status = PeiServicesAllocatePages ( Status = PeiServicesAllocatePages (
EfiBootServicesCode, EfiBootServicesCode,
PageNumber, PageNumber,
&TempPtr &TempPtr
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return NULL; return NULL;
} }
ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE); ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE);
// //
@ -54,34 +55,36 @@ UsbHcAllocMemBlock (
// //
ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE); ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
Block = (USBHC_MEM_BLOCK*)(UINTN)TempPtr; Block = (USBHC_MEM_BLOCK *)(UINTN)TempPtr;
Block->BufLen = EFI_PAGES_TO_SIZE (Pages); Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8); Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
PageNumber = (Block->BitsLen)/PAGESIZE +1; PageNumber = (Block->BitsLen)/PAGESIZE +1;
Status = PeiServicesAllocatePages ( Status = PeiServicesAllocatePages (
EfiBootServicesCode, EfiBootServicesCode,
PageNumber, PageNumber,
&TempPtr &TempPtr
); );
if (EFI_ERROR (Status)) {
return NULL;
}
if (EFI_ERROR (Status)) {
return NULL;
}
ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE); ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE);
Block->Bits = (UINT8 *)(UINTN)TempPtr; Block->Bits = (UINT8 *)(UINTN)TempPtr;
Status = IoMmuAllocateBuffer ( Status = IoMmuAllocateBuffer (
Ehc->IoMmu, Ehc->IoMmu,
Pages, Pages,
(VOID **) &BufHost, (VOID **)&BufHost,
&MappedAddr, &MappedAddr,
&Mapping &Mapping
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return NULL; return NULL;
} }
ZeroMem (BufHost, Pages*EFI_PAGE_SIZE); ZeroMem (BufHost, Pages*EFI_PAGE_SIZE);
// //
@ -89,16 +92,15 @@ UsbHcAllocMemBlock (
// should be restricted into the same 4G // should be restricted into the same 4G
// //
if (Pool->Check4G && (Pool->Which4G != USB_HC_HIGH_32BIT (MappedAddr))) { if (Pool->Check4G && (Pool->Which4G != USB_HC_HIGH_32BIT (MappedAddr))) {
return NULL; return NULL;
} }
Block->BufHost = BufHost; Block->BufHost = BufHost;
Block->Buf = (UINT8 *) ((UINTN) MappedAddr); Block->Buf = (UINT8 *)((UINTN)MappedAddr);
Block->Mapping = Mapping; Block->Mapping = Mapping;
Block->Next = NULL; Block->Next = NULL;
return Block; return Block;
} }
/** /**
@ -111,9 +113,9 @@ UsbHcAllocMemBlock (
**/ **/
VOID VOID
UsbHcFreeMemBlock ( UsbHcFreeMemBlock (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN USBHC_MEM_BLOCK *Block IN USBHC_MEM_BLOCK *Block
) )
{ {
ASSERT ((Pool != NULL) && (Block != NULL)); ASSERT ((Pool != NULL) && (Block != NULL));
@ -133,22 +135,22 @@ UsbHcFreeMemBlock (
**/ **/
VOID * VOID *
UsbHcAllocMemFromBlock ( UsbHcAllocMemFromBlock (
IN USBHC_MEM_BLOCK *Block, IN USBHC_MEM_BLOCK *Block,
IN UINTN Units IN UINTN Units
) )
{ {
UINTN Byte; UINTN Byte;
UINT8 Bit; UINT8 Bit;
UINTN StartByte; UINTN StartByte;
UINT8 StartBit; UINT8 StartBit;
UINTN Available; UINTN Available;
UINTN Count; UINTN Count;
ASSERT ((Block != 0) && (Units != 0)); ASSERT ((Block != 0) && (Units != 0));
StartByte = 0; StartByte = 0;
StartBit = 0; StartBit = 0;
Available = 0; Available = 0;
for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) { for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
// //
@ -164,13 +166,12 @@ UsbHcAllocMemFromBlock (
} }
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
} else { } else {
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
Available = 0; Available = 0;
StartByte = Byte; StartByte = Byte;
StartBit = Bit; StartBit = Bit;
} }
} }
@ -181,13 +182,13 @@ UsbHcAllocMemFromBlock (
// //
// Mark the memory as allocated // Mark the memory as allocated
// //
Byte = StartByte; Byte = StartByte;
Bit = StartBit; Bit = StartBit;
for (Count = 0; Count < Units; Count++) { for (Count = 0; Count < Units; Count++) {
ASSERT (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit)); ASSERT (!USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] | (UINT8) USB_HC_BIT (Bit)); Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] | (UINT8)USB_HC_BIT (Bit));
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
} }
@ -205,16 +206,16 @@ UsbHcAllocMemFromBlock (
**/ **/
EFI_PHYSICAL_ADDRESS EFI_PHYSICAL_ADDRESS
UsbHcGetPciAddressForHostMem ( UsbHcGetPciAddressForHostMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
) )
{ {
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
UINTN AllocSize; UINTN AllocSize;
EFI_PHYSICAL_ADDRESS PhyAddr; EFI_PHYSICAL_ADDRESS PhyAddr;
UINTN Offset; UINTN Offset;
Head = Pool->Head; Head = Pool->Head;
AllocSize = USBHC_MEM_ROUND (Size); AllocSize = USBHC_MEM_ROUND (Size);
@ -228,7 +229,7 @@ UsbHcGetPciAddressForHostMem (
// scan the memory block list for the memory block that // scan the memory block list for the memory block that
// completely contains the allocated memory. // completely contains the allocated memory.
// //
if ((Block->BufHost <= (UINT8 *) Mem) && (((UINT8 *) Mem + AllocSize) <= (Block->BufHost + Block->BufLen))) { if ((Block->BufHost <= (UINT8 *)Mem) && (((UINT8 *)Mem + AllocSize) <= (Block->BufHost + Block->BufLen))) {
break; break;
} }
} }
@ -237,8 +238,8 @@ UsbHcGetPciAddressForHostMem (
// //
// calculate the pci memory address for host memory address. // calculate the pci memory address for host memory address.
// //
Offset = (UINT8 *)Mem - Block->BufHost; Offset = (UINT8 *)Mem - Block->BufHost;
PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN) (Block->Buf + Offset); PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN)(Block->Buf + Offset);
return PhyAddr; return PhyAddr;
} }
@ -251,8 +252,8 @@ UsbHcGetPciAddressForHostMem (
**/ **/
VOID VOID
UsbHcInsertMemBlockToPool ( UsbHcInsertMemBlockToPool (
IN USBHC_MEM_BLOCK *Head, IN USBHC_MEM_BLOCK *Head,
IN USBHC_MEM_BLOCK *Block IN USBHC_MEM_BLOCK *Block
) )
{ {
ASSERT ((Head != NULL) && (Block != NULL)); ASSERT ((Head != NULL) && (Block != NULL));
@ -271,11 +272,10 @@ UsbHcInsertMemBlockToPool (
**/ **/
BOOLEAN BOOLEAN
UsbHcIsMemBlockEmpty ( UsbHcIsMemBlockEmpty (
IN USBHC_MEM_BLOCK *Block IN USBHC_MEM_BLOCK *Block
) )
{ {
UINTN Index; UINTN Index;
for (Index = 0; Index < Block->BitsLen; Index++) { for (Index = 0; Index < Block->BitsLen; Index++) {
if (Block->Bits[Index] != 0) { if (Block->Bits[Index] != 0) {
@ -286,7 +286,6 @@ UsbHcIsMemBlockEmpty (
return TRUE; return TRUE;
} }
/** /**
Initialize the memory management pool for the host controller. Initialize the memory management pool for the host controller.
@ -301,29 +300,30 @@ UsbHcIsMemBlockEmpty (
**/ **/
USBHC_MEM_POOL * USBHC_MEM_POOL *
UsbHcInitMemPool ( UsbHcInitMemPool (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN BOOLEAN Check4G, IN BOOLEAN Check4G,
IN UINT32 Which4G IN UINT32 Which4G
) )
{ {
USBHC_MEM_POOL *Pool; USBHC_MEM_POOL *Pool;
UINTN PageNumber; UINTN PageNumber;
EFI_STATUS Status; EFI_STATUS Status;
EFI_PHYSICAL_ADDRESS TempPtr; EFI_PHYSICAL_ADDRESS TempPtr;
PageNumber = sizeof(USBHC_MEM_POOL)/PAGESIZE +1; PageNumber = sizeof (USBHC_MEM_POOL)/PAGESIZE +1;
Status = PeiServicesAllocatePages ( Status = PeiServicesAllocatePages (
EfiBootServicesCode, EfiBootServicesCode,
PageNumber, PageNumber,
&TempPtr &TempPtr
); );
if (EFI_ERROR (Status)) {
return NULL;
}
if (EFI_ERROR (Status)) {
return NULL;
}
ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE); ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE);
Pool = (USBHC_MEM_POOL *) ((UINTN) TempPtr); Pool = (USBHC_MEM_POOL *)((UINTN)TempPtr);
Pool->Check4G = Check4G; Pool->Check4G = Check4G;
Pool->Which4G = Which4G; Pool->Which4G = Which4G;
@ -348,11 +348,11 @@ UsbHcInitMemPool (
**/ **/
EFI_STATUS EFI_STATUS
UsbHcFreeMemPool ( UsbHcFreeMemPool (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool IN USBHC_MEM_POOL *Pool
) )
{ {
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
ASSERT (Pool->Head != NULL); ASSERT (Pool->Head != NULL);
@ -381,17 +381,17 @@ UsbHcFreeMemPool (
**/ **/
VOID * VOID *
UsbHcAllocateMem ( UsbHcAllocateMem (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN UINTN Size IN UINTN Size
) )
{ {
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
USBHC_MEM_BLOCK *NewBlock; USBHC_MEM_BLOCK *NewBlock;
VOID *Mem; VOID *Mem;
UINTN AllocSize; UINTN AllocSize;
UINTN Pages; UINTN Pages;
Mem = NULL; Mem = NULL;
AllocSize = USBHC_MEM_ROUND (Size); AllocSize = USBHC_MEM_ROUND (Size);
@ -425,7 +425,8 @@ UsbHcAllocateMem (
} else { } else {
Pages = USBHC_MEM_DEFAULT_PAGES; Pages = USBHC_MEM_DEFAULT_PAGES;
} }
NewBlock = UsbHcAllocMemBlock (Ehc,Pool, Pages);
NewBlock = UsbHcAllocMemBlock (Ehc, Pool, Pages);
if (NewBlock == NULL) { if (NewBlock == NULL) {
return NULL; return NULL;
@ -455,23 +456,23 @@ UsbHcAllocateMem (
**/ **/
VOID VOID
UsbHcFreeMem ( UsbHcFreeMem (
IN PEI_USB2_HC_DEV *Ehc, IN PEI_USB2_HC_DEV *Ehc,
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
) )
{ {
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
USBHC_MEM_BLOCK *Block; USBHC_MEM_BLOCK *Block;
UINT8 *ToFree; UINT8 *ToFree;
UINTN AllocSize; UINTN AllocSize;
UINTN Byte; UINTN Byte;
UINTN Bit; UINTN Bit;
UINTN Count; UINTN Count;
Head = Pool->Head; Head = Pool->Head;
AllocSize = USBHC_MEM_ROUND (Size); AllocSize = USBHC_MEM_ROUND (Size);
ToFree = (UINT8 *) Mem; ToFree = (UINT8 *)Mem;
for (Block = Head; Block != NULL; Block = Block->Next) { for (Block = Head; Block != NULL; Block = Block->Next) {
// //
@ -482,8 +483,8 @@ UsbHcFreeMem (
// //
// compute the start byte and bit in the bit array // compute the start byte and bit in the bit array
// //
Byte = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) / 8; Byte = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) / 8;
Bit = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) % 8; Bit = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) % 8;
// //
// reset associated bits in bit array // reset associated bits in bit array
@ -491,7 +492,7 @@ UsbHcFreeMem (
for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) { for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) {
ASSERT (USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit)); ASSERT (USB_HC_BIT_IS_SET (Block->Bits[Byte], Bit));
Block->Bits[Byte] = (UINT8) (Block->Bits[Byte] ^ USB_HC_BIT (Bit)); Block->Bits[Byte] = (UINT8)(Block->Bits[Byte] ^ USB_HC_BIT (Bit));
NEXT_BIT (Byte, Bit); NEXT_BIT (Byte, Bit);
} }
@ -513,5 +514,5 @@ UsbHcFreeMem (
UsbHcFreeMemBlock (Ehc, Pool, Block); UsbHcFreeMemBlock (Ehc, Pool, Block);
} }
return ; return;
} }

View File

@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Uefi.h> #include <Uefi.h>
#include <IndustryStandard/Pci22.h> #include <IndustryStandard/Pci22.h>
#define USB_HC_BIT(a) ((UINTN)(1 << (a))) #define USB_HC_BIT(a) ((UINTN)(1 << (a)))
#define USB_HC_BIT_IS_SET(Data, Bit) \ #define USB_HC_BIT_IS_SET(Data, Bit) \
((BOOLEAN)(((Data) & USB_HC_BIT(Bit)) == USB_HC_BIT(Bit))) ((BOOLEAN)(((Data) & USB_HC_BIT(Bit)) == USB_HC_BIT(Bit)))
@ -24,13 +24,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
typedef struct _USBHC_MEM_BLOCK USBHC_MEM_BLOCK; typedef struct _USBHC_MEM_BLOCK USBHC_MEM_BLOCK;
struct _USBHC_MEM_BLOCK { struct _USBHC_MEM_BLOCK {
UINT8 *Bits; // Bit array to record which unit is allocated UINT8 *Bits; // Bit array to record which unit is allocated
UINTN BitsLen; UINTN BitsLen;
UINT8 *Buf; UINT8 *Buf;
UINT8 *BufHost; UINT8 *BufHost;
UINTN BufLen; // Memory size in bytes UINTN BufLen; // Memory size in bytes
VOID *Mapping; VOID *Mapping;
USBHC_MEM_BLOCK *Next; USBHC_MEM_BLOCK *Next;
}; };
// //
@ -39,15 +39,15 @@ struct _USBHC_MEM_BLOCK {
// data to be on the same 4G memory. // data to be on the same 4G memory.
// //
typedef struct _USBHC_MEM_POOL { typedef struct _USBHC_MEM_POOL {
BOOLEAN Check4G; BOOLEAN Check4G;
UINT32 Which4G; UINT32 Which4G;
USBHC_MEM_BLOCK *Head; USBHC_MEM_BLOCK *Head;
} USBHC_MEM_POOL; } USBHC_MEM_POOL;
// //
// Memory allocation unit, must be 2^n, n>4 // Memory allocation unit, must be 2^n, n>4
// //
#define USBHC_MEM_UNIT 64 #define USBHC_MEM_UNIT 64
#define USBHC_MEM_UNIT_MASK (USBHC_MEM_UNIT - 1) #define USBHC_MEM_UNIT_MASK (USBHC_MEM_UNIT - 1)
#define USBHC_MEM_DEFAULT_PAGES 16 #define USBHC_MEM_DEFAULT_PAGES 16
@ -66,7 +66,6 @@ typedef struct _USBHC_MEM_POOL {
} \ } \
} while (0) } while (0)
/** /**
Calculate the corresponding pci bus address according to the Mem parameter. Calculate the corresponding pci bus address according to the Mem parameter.
@ -78,9 +77,9 @@ typedef struct _USBHC_MEM_POOL {
**/ **/
EFI_PHYSICAL_ADDRESS EFI_PHYSICAL_ADDRESS
UsbHcGetPciAddressForHostMem ( UsbHcGetPciAddressForHostMem (
IN USBHC_MEM_POOL *Pool, IN USBHC_MEM_POOL *Pool,
IN VOID *Mem, IN VOID *Mem,
IN UINTN Size IN UINTN Size
); );
#endif #endif

File diff suppressed because it is too large Load Diff

View File

@ -26,12 +26,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <Library/MemoryAllocationLib.h> #include <Library/MemoryAllocationLib.h>
#include <Library/PcdLib.h> #include <Library/PcdLib.h>
#include <IndustryStandard/Atapi.h> #include <IndustryStandard/Atapi.h>
#define MAX_SENSE_KEY_COUNT 6 #define MAX_SENSE_KEY_COUNT 6
#define MAX_IDE_CHANNELS 4 // Ide and Sata Primary, Secondary Channel. #define MAX_IDE_CHANNELS 4 // Ide and Sata Primary, Secondary Channel.
#define MAX_IDE_DEVICES 8 // Ide, Sata Primary, Secondary and Master, Slave device. #define MAX_IDE_DEVICES 8 // Ide, Sata Primary, Secondary and Master, Slave device.
typedef enum { typedef enum {
IdePrimary = 0, IdePrimary = 0,
@ -40,72 +39,69 @@ typedef enum {
} EFI_IDE_CHANNEL; } EFI_IDE_CHANNEL;
typedef enum { typedef enum {
IdeMaster = 0, IdeMaster = 0,
IdeSlave = 1, IdeSlave = 1,
IdeMaxDevice = 2 IdeMaxDevice = 2
} EFI_IDE_DEVICE; } EFI_IDE_DEVICE;
// //
// IDE Registers // IDE Registers
// //
typedef union { typedef union {
UINT16 Command; /* when write */ UINT16 Command; /* when write */
UINT16 Status; /* when read */ UINT16 Status; /* when read */
} IDE_CMD_OR_STATUS; } IDE_CMD_OR_STATUS;
typedef union { typedef union {
UINT16 Error; /* when read */ UINT16 Error; /* when read */
UINT16 Feature; /* when write */ UINT16 Feature; /* when write */
} IDE_ERROR_OR_FEATURE; } IDE_ERROR_OR_FEATURE;
typedef union { typedef union {
UINT16 AltStatus; /* when read */ UINT16 AltStatus; /* when read */
UINT16 DeviceControl; /* when write */ UINT16 DeviceControl; /* when write */
} IDE_ALTSTATUS_OR_DEVICECONTROL; } IDE_ALTSTATUS_OR_DEVICECONTROL;
// //
// IDE registers set // IDE registers set
// //
typedef struct { typedef struct {
UINT16 Data; UINT16 Data;
IDE_ERROR_OR_FEATURE Reg1; IDE_ERROR_OR_FEATURE Reg1;
UINT16 SectorCount; UINT16 SectorCount;
UINT16 SectorNumber; UINT16 SectorNumber;
UINT16 CylinderLsb; UINT16 CylinderLsb;
UINT16 CylinderMsb; UINT16 CylinderMsb;
UINT16 Head; UINT16 Head;
IDE_CMD_OR_STATUS Reg; IDE_CMD_OR_STATUS Reg;
IDE_ALTSTATUS_OR_DEVICECONTROL Alt; IDE_ALTSTATUS_OR_DEVICECONTROL Alt;
UINT16 DriveAddress; UINT16 DriveAddress;
} IDE_BASE_REGISTERS; } IDE_BASE_REGISTERS;
typedef struct { typedef struct {
UINTN DevicePosition;
UINTN DevicePosition; EFI_PEI_BLOCK_IO_MEDIA MediaInfo;
EFI_PEI_BLOCK_IO_MEDIA MediaInfo; EFI_PEI_BLOCK_IO2_MEDIA MediaInfo2;
EFI_PEI_BLOCK_IO2_MEDIA MediaInfo2;
} PEI_ATAPI_DEVICE_INFO; } PEI_ATAPI_DEVICE_INFO;
#define ATAPI_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('a', 'b', 'i', 'o') #define ATAPI_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('a', 'b', 'i', 'o')
typedef struct { typedef struct {
UINTN Signature; UINTN Signature;
EFI_PEI_RECOVERY_BLOCK_IO_PPI AtapiBlkIo; EFI_PEI_RECOVERY_BLOCK_IO_PPI AtapiBlkIo;
EFI_PEI_RECOVERY_BLOCK_IO2_PPI AtapiBlkIo2; EFI_PEI_RECOVERY_BLOCK_IO2_PPI AtapiBlkIo2;
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor; EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor2; EFI_PEI_PPI_DESCRIPTOR PpiDescriptor2;
PEI_ATA_CONTROLLER_PPI *AtaControllerPpi; PEI_ATA_CONTROLLER_PPI *AtaControllerPpi;
UINTN DeviceCount; UINTN DeviceCount;
PEI_ATAPI_DEVICE_INFO DeviceInfo[MAX_IDE_DEVICES]; //for max 8 device PEI_ATAPI_DEVICE_INFO DeviceInfo[MAX_IDE_DEVICES]; // for max 8 device
IDE_BASE_REGISTERS IdeIoPortReg[MAX_IDE_CHANNELS]; //for max 4 channel. IDE_BASE_REGISTERS IdeIoPortReg[MAX_IDE_CHANNELS]; // for max 4 channel.
} ATAPI_BLK_IO_DEV; } ATAPI_BLK_IO_DEV;
#define PEI_RECOVERY_ATAPI_FROM_BLKIO_THIS(a) CR (a, ATAPI_BLK_IO_DEV, AtapiBlkIo, ATAPI_BLK_IO_DEV_SIGNATURE) #define PEI_RECOVERY_ATAPI_FROM_BLKIO_THIS(a) CR (a, ATAPI_BLK_IO_DEV, AtapiBlkIo, ATAPI_BLK_IO_DEV_SIGNATURE)
#define PEI_RECOVERY_ATAPI_FROM_BLKIO2_THIS(a) CR (a, ATAPI_BLK_IO_DEV, AtapiBlkIo2, ATAPI_BLK_IO_DEV_SIGNATURE) #define PEI_RECOVERY_ATAPI_FROM_BLKIO2_THIS(a) CR (a, ATAPI_BLK_IO_DEV, AtapiBlkIo2, ATAPI_BLK_IO_DEV_SIGNATURE)
#define STALL_1_MILLI_SECOND 1000 // stall 1 ms #define STALL_1_MILLI_SECOND 1000 // stall 1 ms
#define STALL_1_SECONDS 1000 * STALL_1_MILLI_SECOND #define STALL_1_SECONDS 1000 * STALL_1_MILLI_SECOND
@ -152,9 +148,9 @@ typedef struct {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtapiGetNumberOfBlockDevices ( AtapiGetNumberOfBlockDevices (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
OUT UINTN *NumberBlockDevices OUT UINTN *NumberBlockDevices
); );
/** /**
@ -188,10 +184,10 @@ AtapiGetNumberOfBlockDevices (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtapiGetBlockDeviceMediaInfo ( AtapiGetBlockDeviceMediaInfo (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
); );
/** /**
@ -231,12 +227,12 @@ AtapiGetBlockDeviceMediaInfo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtapiReadBlocks ( AtapiReadBlocks (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This, IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
IN EFI_PEI_LBA StartLBA, IN EFI_PEI_LBA StartLBA,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer OUT VOID *Buffer
); );
/** /**
@ -261,9 +257,9 @@ AtapiReadBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtapiGetNumberOfBlockDevices2 ( AtapiGetNumberOfBlockDevices2 (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
OUT UINTN *NumberBlockDevices OUT UINTN *NumberBlockDevices
); );
/** /**
@ -297,10 +293,10 @@ AtapiGetNumberOfBlockDevices2 (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtapiGetBlockDeviceMediaInfo2 ( AtapiGetBlockDeviceMediaInfo2 (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
); );
/** /**
@ -340,12 +336,12 @@ AtapiGetBlockDeviceMediaInfo2 (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
AtapiReadBlocks2 ( AtapiReadBlocks2 (
IN EFI_PEI_SERVICES **PeiServices, IN EFI_PEI_SERVICES **PeiServices,
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This, IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
IN UINTN DeviceIndex, IN UINTN DeviceIndex,
IN EFI_PEI_LBA StartLBA, IN EFI_PEI_LBA StartLBA,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer OUT VOID *Buffer
); );
// //
@ -379,10 +375,10 @@ AtapiEnumerateDevices (
**/ **/
BOOLEAN BOOLEAN
DiscoverAtapiDevice ( DiscoverAtapiDevice (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition, IN UINTN DevicePosition,
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2 OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
); );
/** /**
@ -397,8 +393,8 @@ DiscoverAtapiDevice (
**/ **/
BOOLEAN BOOLEAN
DetectIDEController ( DetectIDEController (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition IN UINTN DevicePosition
); );
/** /**
@ -523,8 +519,8 @@ DRQReady2 (
**/ **/
EFI_STATUS EFI_STATUS
CheckErrorStatus ( CheckErrorStatus (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINT16 StatusReg IN UINT16 StatusReg
); );
/** /**
@ -539,8 +535,8 @@ CheckErrorStatus (
**/ **/
EFI_STATUS EFI_STATUS
ATAPIIdentify ( ATAPIIdentify (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition IN UINTN DevicePosition
); );
/** /**
@ -556,9 +552,9 @@ ATAPIIdentify (
**/ **/
EFI_STATUS EFI_STATUS
TestUnitReady ( TestUnitReady (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition IN UINTN DevicePosition
) ; );
/** /**
Send out ATAPI commands conforms to the Packet Command with PIO Data In Protocol. Send out ATAPI commands conforms to the Packet Command with PIO Data In Protocol.
@ -600,10 +596,10 @@ AtapiPacketCommandIn (
**/ **/
EFI_STATUS EFI_STATUS
Inquiry ( Inquiry (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition, IN UINTN DevicePosition,
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2 OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
); );
/** /**
@ -623,10 +619,10 @@ Inquiry (
**/ **/
EFI_STATUS EFI_STATUS
DetectMedia ( DetectMedia (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition, IN UINTN DevicePosition,
IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2 IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
); );
/** /**
@ -683,10 +679,10 @@ RequestSense (
**/ **/
EFI_STATUS EFI_STATUS
ReadCapacity ( ReadCapacity (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition, IN UINTN DevicePosition,
IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo, IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2 IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
); );
/** /**
@ -705,12 +701,12 @@ ReadCapacity (
**/ **/
EFI_STATUS EFI_STATUS
ReadSectors ( ReadSectors (
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev, IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
IN UINTN DevicePosition, IN UINTN DevicePosition,
IN VOID *Buffer, IN VOID *Buffer,
IN EFI_PEI_LBA StartLba, IN EFI_PEI_LBA StartLba,
IN UINTN NumberOfBlocks, IN UINTN NumberOfBlocks,
IN UINTN BlockSize IN UINTN BlockSize
); );
/** /**
@ -725,8 +721,8 @@ ReadSectors (
**/ **/
BOOLEAN BOOLEAN
IsNoMedia ( IsNoMedia (
IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN ATAPI_REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts IN UINTN SenseCounts
); );
/** /**
@ -741,8 +737,8 @@ IsNoMedia (
**/ **/
BOOLEAN BOOLEAN
IsDeviceStateUnclear ( IsDeviceStateUnclear (
IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN ATAPI_REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts IN UINTN SenseCounts
); );
/** /**
@ -757,8 +753,8 @@ IsDeviceStateUnclear (
**/ **/
BOOLEAN BOOLEAN
IsMediaError ( IsMediaError (
IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN ATAPI_REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts IN UINTN SenseCounts
); );
/** /**
@ -774,9 +770,9 @@ IsMediaError (
**/ **/
BOOLEAN BOOLEAN
IsDriveReady ( IsDriveReady (
IN ATAPI_REQUEST_SENSE_DATA *SenseData, IN ATAPI_REQUEST_SENSE_DATA *SenseData,
IN UINTN SenseCounts, IN UINTN SenseCounts,
OUT BOOLEAN *NeedRetry OUT BOOLEAN *NeedRetry
); );
#endif #endif

View File

@ -21,32 +21,32 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
#include <IndustryStandard/Acpi.h> #include <IndustryStandard/Acpi.h>
typedef struct { typedef struct {
UINT64 VendorId; UINT64 VendorId;
UINT64 DeviceId; UINT64 DeviceId;
UINT64 RevisionId; UINT64 RevisionId;
UINT64 SubsystemVendorId; UINT64 SubsystemVendorId;
UINT64 SubsystemDeviceId; UINT64 SubsystemDeviceId;
} EFI_PCI_DEVICE_HEADER_INFO; } EFI_PCI_DEVICE_HEADER_INFO;
typedef struct { typedef struct {
UINT64 ResType; UINT64 ResType;
UINT64 GenFlag; UINT64 GenFlag;
UINT64 SpecificFlag; UINT64 SpecificFlag;
UINT64 AddrSpaceGranularity; UINT64 AddrSpaceGranularity;
UINT64 AddrRangeMin; UINT64 AddrRangeMin;
UINT64 AddrRangeMax; UINT64 AddrRangeMax;
UINT64 AddrTranslationOffset; UINT64 AddrTranslationOffset;
UINT64 AddrLen; UINT64 AddrLen;
} EFI_PCI_RESOUCE_DESCRIPTOR; } EFI_PCI_RESOUCE_DESCRIPTOR;
#define PCI_DEVICE_ID(VendorId, DeviceId, Revision, SubVendorId, SubDeviceId) \ #define PCI_DEVICE_ID(VendorId, DeviceId, Revision, SubVendorId, SubDeviceId) \
VendorId, DeviceId, Revision, SubVendorId, SubDeviceId VendorId, DeviceId, Revision, SubVendorId, SubDeviceId
#define DEVICE_INF_TAG 0xFFF2 #define DEVICE_INF_TAG 0xFFF2
#define DEVICE_RES_TAG 0xFFF1 #define DEVICE_RES_TAG 0xFFF1
#define LIST_END_TAG 0x0000 #define LIST_END_TAG 0x0000
#define EVEN_ALIGN 0xFFFFFFFFFFFFFFFEULL #define EVEN_ALIGN 0xFFFFFFFFFFFFFFFEULL
/** /**
Returns a list of ACPI resource descriptors that detail the special Returns a list of ACPI resource descriptors that detail the special
@ -82,7 +82,7 @@ PCheckDevice (
// //
// Handle onto which the Incompatible PCI Device List is installed // Handle onto which the Incompatible PCI Device List is installed
// //
EFI_HANDLE mIncompatiblePciDeviceSupportHandle = NULL; EFI_HANDLE mIncompatiblePciDeviceSupportHandle = NULL;
// //
// The Incompatible PCI Device Support Protocol instance produced by this driver // The Incompatible PCI Device Support Protocol instance produced by this driver
@ -94,7 +94,7 @@ EFI_INCOMPATIBLE_PCI_DEVICE_SUPPORT_PROTOCOL mIncompatiblePciDeviceSupport = {
// //
// The incompatible PCI devices list template // The incompatible PCI devices list template
// //
GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = { GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
// //
// DEVICE_INF_TAG, // DEVICE_INF_TAG,
// PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId), // PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId),
@ -106,7 +106,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
// Device Adaptec 9004 // Device Adaptec 9004
// //
DEVICE_INF_TAG, DEVICE_INF_TAG,
PCI_DEVICE_ID(0x9004, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64), PCI_DEVICE_ID (0x9004, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64),
DEVICE_RES_TAG, DEVICE_RES_TAG,
ACPI_ADDRESS_SPACE_TYPE_IO, ACPI_ADDRESS_SPACE_TYPE_IO,
0, 0,
@ -120,7 +120,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
// Device Adaptec 9005 // Device Adaptec 9005
// //
DEVICE_INF_TAG, DEVICE_INF_TAG,
PCI_DEVICE_ID(0x9005, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64), PCI_DEVICE_ID (0x9005, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64),
DEVICE_RES_TAG, DEVICE_RES_TAG,
ACPI_ADDRESS_SPACE_TYPE_IO, ACPI_ADDRESS_SPACE_TYPE_IO,
0, 0,
@ -134,7 +134,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
// Device QLogic 1007 // Device QLogic 1007
// //
DEVICE_INF_TAG, DEVICE_INF_TAG,
PCI_DEVICE_ID(0x1077, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64), PCI_DEVICE_ID (0x1077, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64),
DEVICE_RES_TAG, DEVICE_RES_TAG,
ACPI_ADDRESS_SPACE_TYPE_IO, ACPI_ADDRESS_SPACE_TYPE_IO,
0, 0,
@ -148,7 +148,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
// Device Agilent 103C // Device Agilent 103C
// //
DEVICE_INF_TAG, DEVICE_INF_TAG,
PCI_DEVICE_ID(0x103C, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64), PCI_DEVICE_ID (0x103C, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64),
DEVICE_RES_TAG, DEVICE_RES_TAG,
ACPI_ADDRESS_SPACE_TYPE_IO, ACPI_ADDRESS_SPACE_TYPE_IO,
0, 0,
@ -162,7 +162,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
// Device Agilent 15BC // Device Agilent 15BC
// //
DEVICE_INF_TAG, DEVICE_INF_TAG,
PCI_DEVICE_ID(0x15BC, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64), PCI_DEVICE_ID (0x15BC, MAX_UINT64, MAX_UINT64, MAX_UINT64, MAX_UINT64),
DEVICE_RES_TAG, DEVICE_RES_TAG,
ACPI_ADDRESS_SPACE_TYPE_IO, ACPI_ADDRESS_SPACE_TYPE_IO,
0, 0,
@ -178,7 +178,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
LIST_END_TAG LIST_END_TAG
}; };
/** /**
Entry point of the incompatible pci device support code. Setup an incompatible device list template Entry point of the incompatible pci device support code. Setup an incompatible device list template
and install EFI Incompatible PCI Device Support protocol. and install EFI Incompatible PCI Device Support protocol.
@ -193,11 +192,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
IncompatiblePciDeviceSupportEntryPoint ( IncompatiblePciDeviceSupportEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
// //
// Install EFI Incompatible PCI Device Support Protocol on a new handle // Install EFI Incompatible PCI Device Support Protocol on a new handle
@ -244,15 +243,15 @@ PCheckDevice (
OUT VOID **Configuration OUT VOID **Configuration
) )
{ {
UINT64 Tag; UINT64 Tag;
UINT64 *ListPtr; UINT64 *ListPtr;
UINT64 *TempListPtr; UINT64 *TempListPtr;
EFI_PCI_DEVICE_HEADER_INFO *Header; EFI_PCI_DEVICE_HEADER_INFO *Header;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AcpiPtr; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AcpiPtr;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *OldAcpiPtr; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *OldAcpiPtr;
EFI_PCI_RESOUCE_DESCRIPTOR *Dsc; EFI_PCI_RESOUCE_DESCRIPTOR *Dsc;
EFI_ACPI_END_TAG_DESCRIPTOR *PtrEnd; EFI_ACPI_END_TAG_DESCRIPTOR *PtrEnd;
UINTN Index; UINTN Index;
// //
// Validate the parameters // Validate the parameters
@ -260,120 +259,121 @@ PCheckDevice (
if (Configuration == NULL) { if (Configuration == NULL) {
return EFI_INVALID_PARAMETER; return EFI_INVALID_PARAMETER;
} }
// //
// Initialize the return value to NULL // Initialize the return value to NULL
// //
* (VOID **) Configuration = NULL; *(VOID **)Configuration = NULL;
ListPtr = mIncompatiblePciDeviceList; ListPtr = mIncompatiblePciDeviceList;
while (*ListPtr != LIST_END_TAG) { while (*ListPtr != LIST_END_TAG) {
Tag = *ListPtr; Tag = *ListPtr;
switch (Tag) { switch (Tag) {
case DEVICE_INF_TAG: case DEVICE_INF_TAG:
Header = (EFI_PCI_DEVICE_HEADER_INFO *) (ListPtr + 1); Header = (EFI_PCI_DEVICE_HEADER_INFO *)(ListPtr + 1);
ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_HEADER_INFO) / sizeof (UINT64); ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_HEADER_INFO) / sizeof (UINT64);
// //
// See if the Header matches the parameters passed in // See if the Header matches the parameters passed in
// //
if ((Header->VendorId != MAX_UINT64) && (VendorId != MAX_UINTN)) { if ((Header->VendorId != MAX_UINT64) && (VendorId != MAX_UINTN)) {
if (Header->VendorId != VendorId) { if (Header->VendorId != VendorId) {
continue; continue;
}
} }
}
if ((Header->DeviceId != MAX_UINT64) && (DeviceId != MAX_UINTN)) { if ((Header->DeviceId != MAX_UINT64) && (DeviceId != MAX_UINTN)) {
if (DeviceId != Header->DeviceId) { if (DeviceId != Header->DeviceId) {
continue; continue;
}
} }
}
if ((Header->RevisionId != MAX_UINT64) && (RevisionId != MAX_UINTN)) { if ((Header->RevisionId != MAX_UINT64) && (RevisionId != MAX_UINTN)) {
if (RevisionId != Header->RevisionId) { if (RevisionId != Header->RevisionId) {
continue; continue;
}
} }
}
if ((Header->SubsystemVendorId != MAX_UINT64) && (SubsystemVendorId != MAX_UINTN)) { if ((Header->SubsystemVendorId != MAX_UINT64) && (SubsystemVendorId != MAX_UINTN)) {
if (SubsystemVendorId != Header->SubsystemVendorId) { if (SubsystemVendorId != Header->SubsystemVendorId) {
continue; continue;
}
} }
}
if ((Header->SubsystemDeviceId != MAX_UINT64) && (SubsystemDeviceId != MAX_UINTN)) { if ((Header->SubsystemDeviceId != MAX_UINT64) && (SubsystemDeviceId != MAX_UINTN)) {
if (SubsystemDeviceId != Header->SubsystemDeviceId) { if (SubsystemDeviceId != Header->SubsystemDeviceId) {
continue; continue;
}
} }
}
//
// Matched an item, so construct the ACPI descriptor for the resource.
//
//
// Count the resource items so that to allocate space
//
for (Index = 0, TempListPtr = ListPtr; *TempListPtr == DEVICE_RES_TAG; Index++) {
TempListPtr = TempListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
}
//
// If there is at least one type of resource request,
// allocate an acpi resource node
//
if (Index == 0) {
return EFI_UNSUPPORTED;
}
AcpiPtr = AllocateZeroPool (sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * Index + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR)); //
if (AcpiPtr == NULL) { // Matched an item, so construct the ACPI descriptor for the resource.
return EFI_OUT_OF_RESOURCES; //
} //
// Count the resource items so that to allocate space
//
for (Index = 0, TempListPtr = ListPtr; *TempListPtr == DEVICE_RES_TAG; Index++) {
TempListPtr = TempListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
}
OldAcpiPtr = AcpiPtr; //
// // If there is at least one type of resource request,
// Fill the EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR structure // allocate an acpi resource node
// according to the EFI_PCI_RESOUCE_DESCRIPTOR structure //
// if (Index == 0) {
for (; *ListPtr == DEVICE_RES_TAG;) { return EFI_UNSUPPORTED;
}
Dsc = (EFI_PCI_RESOUCE_DESCRIPTOR *) (ListPtr + 1); AcpiPtr = AllocateZeroPool (sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) * Index + sizeof (EFI_ACPI_END_TAG_DESCRIPTOR));
if (AcpiPtr == NULL) {
return EFI_OUT_OF_RESOURCES;
}
AcpiPtr->Desc = ACPI_ADDRESS_SPACE_DESCRIPTOR; OldAcpiPtr = AcpiPtr;
AcpiPtr->Len = (UINT16) sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - 3; //
AcpiPtr->ResType = (UINT8) Dsc->ResType; // Fill the EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR structure
AcpiPtr->GenFlag = (UINT8) Dsc->GenFlag; // according to the EFI_PCI_RESOUCE_DESCRIPTOR structure
AcpiPtr->SpecificFlag = (UINT8) Dsc->SpecificFlag; //
AcpiPtr->AddrSpaceGranularity = Dsc->AddrSpaceGranularity;; for ( ; *ListPtr == DEVICE_RES_TAG;) {
AcpiPtr->AddrRangeMin = Dsc->AddrRangeMin; Dsc = (EFI_PCI_RESOUCE_DESCRIPTOR *)(ListPtr + 1);
AcpiPtr->AddrRangeMax = Dsc->AddrRangeMax;
AcpiPtr->AddrTranslationOffset = Dsc->AddrTranslationOffset;
AcpiPtr->AddrLen = Dsc->AddrLen;
AcpiPtr->Desc = ACPI_ADDRESS_SPACE_DESCRIPTOR;
AcpiPtr->Len = (UINT16)sizeof (EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR) - 3;
AcpiPtr->ResType = (UINT8)Dsc->ResType;
AcpiPtr->GenFlag = (UINT8)Dsc->GenFlag;
AcpiPtr->SpecificFlag = (UINT8)Dsc->SpecificFlag;
AcpiPtr->AddrSpaceGranularity = Dsc->AddrSpaceGranularity;
AcpiPtr->AddrRangeMin = Dsc->AddrRangeMin;
AcpiPtr->AddrRangeMax = Dsc->AddrRangeMax;
AcpiPtr->AddrTranslationOffset = Dsc->AddrTranslationOffset;
AcpiPtr->AddrLen = Dsc->AddrLen;
ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
AcpiPtr++;
}
//
// Put the checksum
//
PtrEnd = (EFI_ACPI_END_TAG_DESCRIPTOR *)(AcpiPtr);
PtrEnd->Desc = ACPI_END_TAG_DESCRIPTOR;
PtrEnd->Checksum = 0;
*(VOID **)Configuration = OldAcpiPtr;
return EFI_SUCCESS;
case DEVICE_RES_TAG:
//
// Adjust the pointer to the next PCI resource descriptor item
//
ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64)); ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
AcpiPtr++; break;
}
//
// Put the checksum
//
PtrEnd = (EFI_ACPI_END_TAG_DESCRIPTOR *) (AcpiPtr);
PtrEnd->Desc = ACPI_END_TAG_DESCRIPTOR;
PtrEnd->Checksum = 0;
*(VOID **) Configuration = OldAcpiPtr; default:
return EFI_UNSUPPORTED;
return EFI_SUCCESS;
case DEVICE_RES_TAG:
//
// Adjust the pointer to the next PCI resource descriptor item
//
ListPtr = ListPtr + 1 + ((sizeof (EFI_PCI_RESOUCE_DESCRIPTOR)) / sizeof (UINT64));
break;
default:
return EFI_UNSUPPORTED;
} }
} }
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }

View File

@ -17,12 +17,12 @@
// //
STATIC STATIC
EFI_UNICODE_STRING_TABLE mDriverNameTable[] = { EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {
{ "eng;en", L"PCI I/O protocol emulation driver for non-discoverable devices" }, { "eng;en", L"PCI I/O protocol emulation driver for non-discoverable devices" },
{ NULL, NULL } { NULL, NULL }
}; };
EFI_COMPONENT_NAME_PROTOCOL gComponentName; EFI_COMPONENT_NAME_PROTOCOL gComponentName;
/** /**
Retrieves a Unicode string that is the user readable name of the UEFI Driver. Retrieves a Unicode string that is the user readable name of the UEFI Driver.
@ -49,9 +49,9 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonDiscoverablePciGetDriverName ( NonDiscoverablePciGetDriverName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
) )
{ {
return LookupUnicodeString2 ( return LookupUnicodeString2 (
@ -93,24 +93,24 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonDiscoverablePciGetDeviceName ( NonDiscoverablePciGetDeviceName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE DeviceHandle, IN EFI_HANDLE DeviceHandle,
IN EFI_HANDLE ChildHandle, IN EFI_HANDLE ChildHandle,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
EFI_COMPONENT_NAME_PROTOCOL gComponentName = { EFI_COMPONENT_NAME_PROTOCOL gComponentName = {
&NonDiscoverablePciGetDriverName, &NonDiscoverablePciGetDriverName,
&NonDiscoverablePciGetDeviceName, &NonDiscoverablePciGetDeviceName,
"eng" // SupportedLanguages, ISO 639-2 language codes "eng" // SupportedLanguages, ISO 639-2 language codes
}; };
EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = { EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) &NonDiscoverablePciGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)&NonDiscoverablePciGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) &NonDiscoverablePciGetDeviceName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)&NonDiscoverablePciGetDeviceName,
"en" // SupportedLanguages, RFC 4646 language codes "en" // SupportedLanguages, RFC 4646 language codes
}; };

View File

@ -10,16 +10,16 @@
#include <Protocol/DriverBinding.h> #include <Protocol/DriverBinding.h>
#define MAX_NON_DISCOVERABLE_PCI_DEVICE_ID (32 * 256) #define MAX_NON_DISCOVERABLE_PCI_DEVICE_ID (32 * 256)
STATIC UINTN mUniqueIdCounter = 0; STATIC UINTN mUniqueIdCounter = 0;
EFI_CPU_ARCH_PROTOCOL *mCpu; EFI_CPU_ARCH_PROTOCOL *mCpu;
// //
// We only support the following device types // We only support the following device types
// //
STATIC STATIC
CONST EFI_GUID * CONST CONST EFI_GUID *CONST
SupportedNonDiscoverableDevices[] = { SupportedNonDiscoverableDevices[] = {
&gEdkiiNonDiscoverableAhciDeviceGuid, &gEdkiiNonDiscoverableAhciDeviceGuid,
&gEdkiiNonDiscoverableEhciDeviceGuid, &gEdkiiNonDiscoverableEhciDeviceGuid,
@ -63,27 +63,31 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonDiscoverablePciDeviceSupported ( NonDiscoverablePciDeviceSupported (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE DeviceHandle, IN EFI_HANDLE DeviceHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
NON_DISCOVERABLE_DEVICE *Device; NON_DISCOVERABLE_DEVICE *Device;
EFI_STATUS Status; EFI_STATUS Status;
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Desc; EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Desc;
INTN Idx; INTN Idx;
Status = gBS->OpenProtocol (DeviceHandle, Status = gBS->OpenProtocol (
&gEdkiiNonDiscoverableDeviceProtocolGuid, (VOID **)&Device, DeviceHandle,
This->DriverBindingHandle, DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid,
EFI_OPEN_PROTOCOL_BY_DRIVER); (VOID **)&Device,
This->DriverBindingHandle,
DeviceHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
for (Idx = 0; Idx < ARRAY_SIZE (SupportedNonDiscoverableDevices); Idx++) { for (Idx = 0; Idx < ARRAY_SIZE (SupportedNonDiscoverableDevices); Idx++) {
if (CompareGuid (Device->Type, SupportedNonDiscoverableDevices [Idx])) { if (CompareGuid (Device->Type, SupportedNonDiscoverableDevices[Idx])) {
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
break; break;
} }
@ -98,17 +102,23 @@ NonDiscoverablePciDeviceSupported (
// that they only describe things that we can handle // that they only describe things that we can handle
// //
for (Desc = Device->Resources; Desc->Desc != ACPI_END_TAG_DESCRIPTOR; for (Desc = Device->Resources; Desc->Desc != ACPI_END_TAG_DESCRIPTOR;
Desc = (VOID *)((UINT8 *)Desc + Desc->Len + 3)) { Desc = (VOID *)((UINT8 *)Desc + Desc->Len + 3))
if (Desc->Desc != ACPI_ADDRESS_SPACE_DESCRIPTOR || {
Desc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM) { if ((Desc->Desc != ACPI_ADDRESS_SPACE_DESCRIPTOR) ||
(Desc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM))
{
Status = EFI_UNSUPPORTED; Status = EFI_UNSUPPORTED;
break; break;
} }
} }
CloseProtocol: CloseProtocol:
gBS->CloseProtocol (DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid, gBS->CloseProtocol (
This->DriverBindingHandle, DeviceHandle); DeviceHandle,
&gEdkiiNonDiscoverableDeviceProtocolGuid,
This->DriverBindingHandle,
DeviceHandle
);
return Status; return Status;
} }
@ -130,13 +140,13 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonDiscoverablePciDeviceStart ( NonDiscoverablePciDeviceStart (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE DeviceHandle, IN EFI_HANDLE DeviceHandle,
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
) )
{ {
NON_DISCOVERABLE_PCI_DEVICE *Dev; NON_DISCOVERABLE_PCI_DEVICE *Dev;
EFI_STATUS Status; EFI_STATUS Status;
ASSERT (mUniqueIdCounter < MAX_NON_DISCOVERABLE_PCI_DEVICE_ID); ASSERT (mUniqueIdCounter < MAX_NON_DISCOVERABLE_PCI_DEVICE_ID);
if (mUniqueIdCounter >= MAX_NON_DISCOVERABLE_PCI_DEVICE_ID) { if (mUniqueIdCounter >= MAX_NON_DISCOVERABLE_PCI_DEVICE_ID) {
@ -148,10 +158,14 @@ NonDiscoverablePciDeviceStart (
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
Status = gBS->OpenProtocol (DeviceHandle, Status = gBS->OpenProtocol (
DeviceHandle,
&gEdkiiNonDiscoverableDeviceProtocolGuid, &gEdkiiNonDiscoverableDeviceProtocolGuid,
(VOID **)&Dev->Device, This->DriverBindingHandle, (VOID **)&Dev->Device,
DeviceHandle, EFI_OPEN_PROTOCOL_BY_DRIVER); This->DriverBindingHandle,
DeviceHandle,
EFI_OPEN_PROTOCOL_BY_DRIVER
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto FreeDev; goto FreeDev;
} }
@ -163,8 +177,12 @@ NonDiscoverablePciDeviceStart (
// EFI_PCI_IO_PROTOCOL interface. // EFI_PCI_IO_PROTOCOL interface.
// //
Dev->Signature = NON_DISCOVERABLE_PCI_DEVICE_SIG; Dev->Signature = NON_DISCOVERABLE_PCI_DEVICE_SIG;
Status = gBS->InstallProtocolInterface (&DeviceHandle, &gEfiPciIoProtocolGuid, Status = gBS->InstallProtocolInterface (
EFI_NATIVE_INTERFACE, &Dev->PciIo); &DeviceHandle,
&gEfiPciIoProtocolGuid,
EFI_NATIVE_INTERFACE,
&Dev->PciIo
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto CloseProtocol; goto CloseProtocol;
} }
@ -174,8 +192,12 @@ NonDiscoverablePciDeviceStart (
return EFI_SUCCESS; return EFI_SUCCESS;
CloseProtocol: CloseProtocol:
gBS->CloseProtocol (DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid, gBS->CloseProtocol (
This->DriverBindingHandle, DeviceHandle); DeviceHandle,
&gEdkiiNonDiscoverableDeviceProtocolGuid,
This->DriverBindingHandle,
DeviceHandle
);
FreeDev: FreeDev:
FreePool (Dev); FreePool (Dev);
@ -199,19 +221,24 @@ STATIC
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonDiscoverablePciDeviceStop ( NonDiscoverablePciDeviceStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE DeviceHandle, IN EFI_HANDLE DeviceHandle,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
NON_DISCOVERABLE_PCI_DEVICE *Dev; NON_DISCOVERABLE_PCI_DEVICE *Dev;
Status = gBS->OpenProtocol (DeviceHandle, &gEfiPciIoProtocolGuid, Status = gBS->OpenProtocol (
(VOID **)&PciIo, This->DriverBindingHandle, DeviceHandle, DeviceHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL); &gEfiPciIoProtocolGuid,
(VOID **)&PciIo,
This->DriverBindingHandle,
DeviceHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
@ -221,27 +248,33 @@ NonDiscoverablePciDeviceStop (
// //
// Handle Stop() requests for in-use driver instances gracefully. // Handle Stop() requests for in-use driver instances gracefully.
// //
Status = gBS->UninstallProtocolInterface (DeviceHandle, Status = gBS->UninstallProtocolInterface (
&gEfiPciIoProtocolGuid, &Dev->PciIo); DeviceHandle,
&gEfiPciIoProtocolGuid,
&Dev->PciIo
);
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
gBS->CloseProtocol (DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid, gBS->CloseProtocol (
This->DriverBindingHandle, DeviceHandle); DeviceHandle,
&gEdkiiNonDiscoverableDeviceProtocolGuid,
This->DriverBindingHandle,
DeviceHandle
);
FreePool (Dev); FreePool (Dev);
return EFI_SUCCESS; return EFI_SUCCESS;
} }
// //
// The static object that groups the Supported() (ie. probe), Start() and // The static object that groups the Supported() (ie. probe), Start() and
// Stop() functions of the driver together. Refer to UEFI Spec 2.3.1 + Errata // Stop() functions of the driver together. Refer to UEFI Spec 2.3.1 + Errata
// C, 10.1 EFI Driver Binding Protocol. // C, 10.1 EFI Driver Binding Protocol.
// //
STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = { STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
&NonDiscoverablePciDeviceSupported, &NonDiscoverablePciDeviceSupported,
&NonDiscoverablePciDeviceStart, &NonDiscoverablePciDeviceStart,
&NonDiscoverablePciDeviceStop, &NonDiscoverablePciDeviceStop,
@ -263,14 +296,14 @@ STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NonDiscoverablePciDeviceDxeEntryPoint ( NonDiscoverablePciDeviceDxeEntryPoint (
IN EFI_HANDLE ImageHandle, IN EFI_HANDLE ImageHandle,
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu); Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
ASSERT_EFI_ERROR(Status); ASSERT_EFI_ERROR (Status);
return EfiLibInstallDriverBindingComponentName2 ( return EfiLibInstallDriverBindingComponentName2 (
ImageHandle, ImageHandle,

View File

@ -24,7 +24,7 @@
#include <Protocol/Cpu.h> #include <Protocol/Cpu.h>
#include <Protocol/PciIo.h> #include <Protocol/PciIo.h>
#define NON_DISCOVERABLE_PCI_DEVICE_SIG SIGNATURE_32 ('P', 'P', 'I', 'D') #define NON_DISCOVERABLE_PCI_DEVICE_SIG SIGNATURE_32 ('P', 'P', 'I', 'D')
#define NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(PciIoPointer) \ #define NON_DISCOVERABLE_PCI_DEVICE_FROM_PCI_IO(PciIoPointer) \
CR (PciIoPointer, NON_DISCOVERABLE_PCI_DEVICE, PciIo, \ CR (PciIoPointer, NON_DISCOVERABLE_PCI_DEVICE, PciIo, \
@ -33,74 +33,74 @@
#define DEV_SUPPORTED_ATTRIBUTES \ #define DEV_SUPPORTED_ATTRIBUTES \
(EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE) (EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE)
#define PCI_ID_VENDOR_UNKNOWN 0xffff #define PCI_ID_VENDOR_UNKNOWN 0xffff
#define PCI_ID_DEVICE_DONTCARE 0x0000 #define PCI_ID_DEVICE_DONTCARE 0x0000
extern EFI_CPU_ARCH_PROTOCOL *mCpu; extern EFI_CPU_ARCH_PROTOCOL *mCpu;
typedef struct { typedef struct {
// //
// The linked-list next pointer // The linked-list next pointer
// //
LIST_ENTRY List; LIST_ENTRY List;
// //
// The address of the uncached allocation // The address of the uncached allocation
// //
VOID *HostAddress; VOID *HostAddress;
// //
// The number of pages in the allocation // The number of pages in the allocation
// //
UINTN NumPages; UINTN NumPages;
// //
// The attributes of the allocation // The attributes of the allocation
// //
UINT64 Attributes; UINT64 Attributes;
} NON_DISCOVERABLE_DEVICE_UNCACHED_ALLOCATION; } NON_DISCOVERABLE_DEVICE_UNCACHED_ALLOCATION;
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
// //
// The bound non-discoverable device protocol instance // The bound non-discoverable device protocol instance
// //
NON_DISCOVERABLE_DEVICE *Device; NON_DISCOVERABLE_DEVICE *Device;
// //
// The exposed PCI I/O protocol instance. // The exposed PCI I/O protocol instance.
// //
EFI_PCI_IO_PROTOCOL PciIo; EFI_PCI_IO_PROTOCOL PciIo;
// //
// The emulated PCI config space of the device. Only the minimally required // The emulated PCI config space of the device. Only the minimally required
// items are assigned. // items are assigned.
// //
PCI_TYPE00 ConfigSpace; PCI_TYPE00 ConfigSpace;
// //
// The first virtual BAR to assign based on the resources described // The first virtual BAR to assign based on the resources described
// by the non-discoverable device. // by the non-discoverable device.
// //
UINT32 BarOffset; UINT32 BarOffset;
// //
// The number of virtual BARs we expose based on the number of // The number of virtual BARs we expose based on the number of
// resources // resources
// //
UINT32 BarCount; UINT32 BarCount;
// //
// The PCI I/O attributes for this device // The PCI I/O attributes for this device
// //
UINT64 Attributes; UINT64 Attributes;
// //
// Whether this device has been enabled // Whether this device has been enabled
// //
BOOLEAN Enabled; BOOLEAN Enabled;
// //
// Linked list to keep track of uncached allocations performed // Linked list to keep track of uncached allocations performed
// on behalf of this device // on behalf of this device
// //
LIST_ENTRY UncachedAllocationList; LIST_ENTRY UncachedAllocationList;
// //
// Unique ID for this device instance: needed so that we can report unique // Unique ID for this device instance: needed so that we can report unique
// segment/bus/device number for each device instance. Note that this number // segment/bus/device number for each device instance. Note that this number
// may change when disconnecting/reconnecting the driver. // may change when disconnecting/reconnecting the driver.
// //
UINTN UniqueId; UINTN UniqueId;
} NON_DISCOVERABLE_PCI_DEVICE; } NON_DISCOVERABLE_PCI_DEVICE;
/** /**
@ -111,10 +111,10 @@ typedef struct {
**/ **/
VOID VOID
InitializePciIoProtocol ( InitializePciIoProtocol (
NON_DISCOVERABLE_PCI_DEVICE *Device NON_DISCOVERABLE_PCI_DEVICE *Device
); );
extern EFI_COMPONENT_NAME_PROTOCOL gComponentName; extern EFI_COMPONENT_NAME_PROTOCOL gComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2;
#endif #endif

View File

@ -12,7 +12,7 @@
// //
// EFI Component Name Protocol // EFI Component Name Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName = {
NvmExpressComponentNameGetDriverName, NvmExpressComponentNameGetDriverName,
NvmExpressComponentNameGetControllerName, NvmExpressComponentNameGetControllerName,
"eng" "eng"
@ -21,20 +21,20 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentNa
// //
// EFI Component Name 2 Protocol // EFI Component Name 2 Protocol
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2 = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2 = {
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) NvmExpressComponentNameGetDriverName, (EFI_COMPONENT_NAME2_GET_DRIVER_NAME)NvmExpressComponentNameGetDriverName,
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) NvmExpressComponentNameGetControllerName, (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)NvmExpressComponentNameGetControllerName,
"en" "en"
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressDriverNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressDriverNameTable[] = {
{ "eng;en", L"NVM Express Driver" }, { "eng;en", L"NVM Express Driver" },
{ NULL, NULL } { NULL, NULL }
}; };
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerNameTable[] = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerNameTable[] = {
{ "eng;en", L"NVM Express Controller" }, { "eng;en", L"NVM Express Controller" },
{ NULL, NULL } { NULL, NULL }
}; };
/** /**
@ -79,9 +79,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerName
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressComponentNameGetDriverName ( NvmExpressComponentNameGetDriverName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **DriverName OUT CHAR16 **DriverName
) )
{ {
return LookupUnicodeString2 ( return LookupUnicodeString2 (
@ -164,17 +164,17 @@ NvmExpressComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressComponentNameGetControllerName ( NvmExpressComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_BLOCK_IO_PROTOCOL *BlockIo; EFI_BLOCK_IO_PROTOCOL *BlockIo;
NVME_DEVICE_PRIVATE_DATA *Device; NVME_DEVICE_PRIVATE_DATA *Device;
EFI_UNICODE_STRING_TABLE *ControllerNameTable; EFI_UNICODE_STRING_TABLE *ControllerNameTable;
// //
// Make sure this driver is currently managing ControllHandle // Make sure this driver is currently managing ControllHandle
@ -198,13 +198,14 @@ NvmExpressComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return Status; return Status;
} }
// //
// Get the child context // Get the child context
// //
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
ChildHandle, ChildHandle,
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlockIo, (VOID **)&BlockIo,
gNvmExpressDriverBinding.DriverBindingHandle, gNvmExpressDriverBinding.DriverBindingHandle,
ChildHandle, ChildHandle,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -212,7 +213,8 @@ NvmExpressComponentNameGetControllerName (
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
ControllerNameTable = Device->ControllerNameTable; ControllerNameTable = Device->ControllerNameTable;
} }
@ -223,5 +225,4 @@ NvmExpressComponentNameGetControllerName (
ControllerName, ControllerName,
(BOOLEAN)(This == &gNvmExpressComponentName) (BOOLEAN)(This == &gNvmExpressComponentName)
); );
} }

View File

@ -12,7 +12,7 @@
// //
// NVM Express Driver Binding Protocol Instance // NVM Express Driver Binding Protocol Instance
// //
EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = { EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
NvmExpressDriverBindingSupported, NvmExpressDriverBindingSupported,
NvmExpressDriverBindingStart, NvmExpressDriverBindingStart,
NvmExpressDriverBindingStop, NvmExpressDriverBindingStop,
@ -24,7 +24,7 @@ EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
// //
// NVM Express EFI Driver Supported EFI Version Protocol Instance // NVM Express EFI Driver Supported EFI Version Protocol Instance
// //
EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion = { EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion = {
sizeof (EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL), // Size of Protocol structure. sizeof (EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL), // Size of Protocol structure.
0 // Version number to be filled at start up. 0 // Version number to be filled at start up.
}; };
@ -32,7 +32,7 @@ EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion =
// //
// Template for NVM Express Pass Thru Mode data structure. // Template for NVM Express Pass Thru Mode data structure.
// //
GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassThruMode = { GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassThruMode = {
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL | EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_PHYSICAL |
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL | EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_LOGICAL |
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKIO | EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKIO |
@ -56,24 +56,24 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassT
**/ **/
EFI_STATUS EFI_STATUS
EnumerateNvmeDevNamespace ( EnumerateNvmeDevNamespace (
IN NVME_CONTROLLER_PRIVATE_DATA *Private, IN NVME_CONTROLLER_PRIVATE_DATA *Private,
UINT32 NamespaceId UINT32 NamespaceId
) )
{ {
NVME_ADMIN_NAMESPACE_DATA *NamespaceData; NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode; EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
EFI_DEVICE_PATH_PROTOCOL *DevicePath; EFI_DEVICE_PATH_PROTOCOL *DevicePath;
EFI_HANDLE DeviceHandle; EFI_HANDLE DeviceHandle;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath; EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
NVME_DEVICE_PRIVATE_DATA *Device; NVME_DEVICE_PRIVATE_DATA *Device;
EFI_STATUS Status; EFI_STATUS Status;
UINT32 Lbads; UINT32 Lbads;
UINT32 Flbas; UINT32 Flbas;
UINT32 LbaFmtIdx; UINT32 LbaFmtIdx;
UINT8 Sn[21]; UINT8 Sn[21];
UINT8 Mn[41]; UINT8 Mn[41];
VOID *DummyInterface; VOID *DummyInterface;
NewDevicePathNode = NULL; NewDevicePathNode = NULL;
DevicePath = NULL; DevicePath = NULL;
@ -82,8 +82,8 @@ EnumerateNvmeDevNamespace (
// //
// Allocate a buffer for Identify Namespace data // Allocate a buffer for Identify Namespace data
// //
NamespaceData = AllocateZeroPool(sizeof (NVME_ADMIN_NAMESPACE_DATA)); NamespaceData = AllocateZeroPool (sizeof (NVME_ADMIN_NAMESPACE_DATA));
if(NamespaceData == NULL) { if (NamespaceData == NULL) {
return EFI_OUT_OF_RESOURCES; return EFI_OUT_OF_RESOURCES;
} }
@ -96,9 +96,10 @@ EnumerateNvmeDevNamespace (
NamespaceId, NamespaceId,
(VOID *)NamespaceData (VOID *)NamespaceData
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
// //
// Validate Namespace // Validate Namespace
// //
@ -108,7 +109,7 @@ EnumerateNvmeDevNamespace (
// //
// allocate device private data for each discovered namespace // allocate device private data for each discovered namespace
// //
Device = AllocateZeroPool(sizeof(NVME_DEVICE_PRIVATE_DATA)); Device = AllocateZeroPool (sizeof (NVME_DEVICE_PRIVATE_DATA));
if (Device == NULL) { if (Device == NULL) {
Status = EFI_OUT_OF_RESOURCES; Status = EFI_OUT_OF_RESOURCES;
goto Exit; goto Exit;
@ -117,9 +118,9 @@ EnumerateNvmeDevNamespace (
// //
// Initialize SSD namespace instance data // Initialize SSD namespace instance data
// //
Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE; Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE;
Device->NamespaceId = NamespaceId; Device->NamespaceId = NamespaceId;
Device->NamespaceUuid = NamespaceData->Eui64; Device->NamespaceUuid = NamespaceData->Eui64;
Device->ControllerHandle = Private->ControllerHandle; Device->ControllerHandle = Private->ControllerHandle;
Device->DriverBindingHandle = Private->DriverBindingHandle; Device->DriverBindingHandle = Private->DriverBindingHandle;
@ -128,17 +129,17 @@ EnumerateNvmeDevNamespace (
// //
// Build BlockIo media structure // Build BlockIo media structure
// //
Device->Media.MediaId = 0; Device->Media.MediaId = 0;
Device->Media.RemovableMedia = FALSE; Device->Media.RemovableMedia = FALSE;
Device->Media.MediaPresent = TRUE; Device->Media.MediaPresent = TRUE;
Device->Media.LogicalPartition = FALSE; Device->Media.LogicalPartition = FALSE;
Device->Media.ReadOnly = FALSE; Device->Media.ReadOnly = FALSE;
Device->Media.WriteCaching = FALSE; Device->Media.WriteCaching = FALSE;
Device->Media.IoAlign = Private->PassThruMode.IoAlign; Device->Media.IoAlign = Private->PassThruMode.IoAlign;
Flbas = NamespaceData->Flbas; Flbas = NamespaceData->Flbas;
LbaFmtIdx = Flbas & 0xF; LbaFmtIdx = Flbas & 0xF;
Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads; Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads;
Device->Media.BlockSize = (UINT32)1 << Lbads; Device->Media.BlockSize = (UINT32)1 << Lbads;
Device->Media.LastBlock = NamespaceData->Nsze - 1; Device->Media.LastBlock = NamespaceData->Nsze - 1;
@ -148,21 +149,21 @@ EnumerateNvmeDevNamespace (
// //
// Create BlockIo Protocol instance // Create BlockIo Protocol instance
// //
Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2; Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
Device->BlockIo.Media = &Device->Media; Device->BlockIo.Media = &Device->Media;
Device->BlockIo.Reset = NvmeBlockIoReset; Device->BlockIo.Reset = NvmeBlockIoReset;
Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks; Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks;
Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks; Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks;
Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks; Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks;
// //
// Create BlockIo2 Protocol instance // Create BlockIo2 Protocol instance
// //
Device->BlockIo2.Media = &Device->Media; Device->BlockIo2.Media = &Device->Media;
Device->BlockIo2.Reset = NvmeBlockIoResetEx; Device->BlockIo2.Reset = NvmeBlockIoResetEx;
Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx; Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx;
Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx; Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx;
Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx; Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx;
InitializeListHead (&Device->AsyncQueue); InitializeListHead (&Device->AsyncQueue);
// //
@ -186,7 +187,7 @@ EnumerateNvmeDevNamespace (
&NewDevicePathNode &NewDevicePathNode
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
@ -199,10 +200,10 @@ EnumerateNvmeDevNamespace (
goto Exit; goto Exit;
} }
DeviceHandle = NULL; DeviceHandle = NULL;
RemainingDevicePath = DevicePath; RemainingDevicePath = DevicePath;
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle); Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) { if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
Status = EFI_ALREADY_STARTED; Status = EFI_ALREADY_STARTED;
FreePool (DevicePath); FreePool (DevicePath);
goto Exit; goto Exit;
@ -228,7 +229,7 @@ EnumerateNvmeDevNamespace (
NULL NULL
); );
if(EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
@ -242,7 +243,7 @@ EnumerateNvmeDevNamespace (
EFI_NATIVE_INTERFACE, EFI_NATIVE_INTERFACE,
&Device->StorageSecurity &Device->StorageSecurity
); );
if(EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
gBS->UninstallMultipleProtocolInterfaces ( gBS->UninstallMultipleProtocolInterfaces (
Device->DeviceHandle, Device->DeviceHandle,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
@ -262,7 +263,7 @@ EnumerateNvmeDevNamespace (
gBS->OpenProtocol ( gBS->OpenProtocol (
Private->ControllerHandle, Private->ControllerHandle,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
(VOID **) &DummyInterface, (VOID **)&DummyInterface,
Private->DriverBindingHandle, Private->DriverBindingHandle,
Device->DeviceHandle, Device->DeviceHandle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@ -304,7 +305,7 @@ EnumerateNvmeDevNamespace (
} }
Exit: Exit:
if(NamespaceData != NULL) { if (NamespaceData != NULL) {
FreePool (NamespaceData); FreePool (NamespaceData);
} }
@ -312,12 +313,14 @@ Exit:
FreePool (NewDevicePathNode); FreePool (NewDevicePathNode);
} }
if(EFI_ERROR(Status) && (Device != NULL) && (Device->DevicePath != NULL)) { if (EFI_ERROR (Status) && (Device != NULL) && (Device->DevicePath != NULL)) {
FreePool (Device->DevicePath); FreePool (Device->DevicePath);
} }
if(EFI_ERROR(Status) && (Device != NULL)) {
if (EFI_ERROR (Status) && (Device != NULL)) {
FreePool (Device); FreePool (Device);
} }
return Status; return Status;
} }
@ -333,15 +336,15 @@ Exit:
**/ **/
EFI_STATUS EFI_STATUS
DiscoverAllNamespaces ( DiscoverAllNamespaces (
IN NVME_CONTROLLER_PRIVATE_DATA *Private IN NVME_CONTROLLER_PRIVATE_DATA *Private
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
UINT32 NamespaceId; UINT32 NamespaceId;
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *Passthru; EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *Passthru;
NamespaceId = 0xFFFFFFFF; NamespaceId = 0xFFFFFFFF;
Passthru = &Private->Passthru; Passthru = &Private->Passthru;
while (TRUE) { while (TRUE) {
Status = Passthru->GetNextNamespace ( Status = Passthru->GetNextNamespace (
@ -358,7 +361,7 @@ DiscoverAllNamespaces (
NamespaceId NamespaceId
); );
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
continue; continue;
} }
} }
@ -382,25 +385,25 @@ DiscoverAllNamespaces (
**/ **/
EFI_STATUS EFI_STATUS
UnregisterNvmeNamespace ( UnregisterNvmeNamespace (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN EFI_HANDLE Handle IN EFI_HANDLE Handle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_BLOCK_IO_PROTOCOL *BlockIo; EFI_BLOCK_IO_PROTOCOL *BlockIo;
NVME_DEVICE_PRIVATE_DATA *Device; NVME_DEVICE_PRIVATE_DATA *Device;
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity; EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
BOOLEAN IsEmpty; BOOLEAN IsEmpty;
EFI_TPL OldTpl; EFI_TPL OldTpl;
VOID *DummyInterface; VOID *DummyInterface;
BlockIo = NULL; BlockIo = NULL;
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiBlockIoProtocolGuid, &gEfiBlockIoProtocolGuid,
(VOID **) &BlockIo, (VOID **)&BlockIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -409,7 +412,7 @@ UnregisterNvmeNamespace (
return Status; return Status;
} }
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo); Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
// //
// Wait for the device's asynchronous I/O queue to become empty. // Wait for the device's asynchronous I/O queue to become empty.
@ -457,7 +460,7 @@ UnregisterNvmeNamespace (
gBS->OpenProtocol ( gBS->OpenProtocol (
Controller, Controller,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
(VOID **) &DummyInterface, (VOID **)&DummyInterface,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
@ -471,7 +474,7 @@ UnregisterNvmeNamespace (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Handle, Handle,
&gEfiStorageSecurityCommandProtocolGuid, &gEfiStorageSecurityCommandProtocolGuid,
(VOID **) &StorageSecurity, (VOID **)&StorageSecurity,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -485,18 +488,18 @@ UnregisterNvmeNamespace (
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
gBS->OpenProtocol ( gBS->OpenProtocol (
Controller, Controller,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
(VOID **) &DummyInterface, (VOID **)&DummyInterface,
This->DriverBindingHandle, This->DriverBindingHandle,
Handle, Handle,
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
); );
return Status; return Status;
} }
} }
if(Device->DevicePath != NULL) { if (Device->DevicePath != NULL) {
FreePool (Device->DevicePath); FreePool (Device->DevicePath);
} }
@ -520,25 +523,25 @@ UnregisterNvmeNamespace (
VOID VOID
EFIAPI EFIAPI
ProcessAsyncTaskList ( ProcessAsyncTaskList (
IN EFI_EVENT Event, IN EFI_EVENT Event,
IN VOID* Context IN VOID *Context
) )
{ {
NVME_CONTROLLER_PRIVATE_DATA *Private; NVME_CONTROLLER_PRIVATE_DATA *Private;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
NVME_CQ *Cq; NVME_CQ *Cq;
UINT16 QueueId; UINT16 QueueId;
UINT32 Data; UINT32 Data;
LIST_ENTRY *Link; LIST_ENTRY *Link;
LIST_ENTRY *NextLink; LIST_ENTRY *NextLink;
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest; NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
NVME_BLKIO2_SUBTASK *Subtask; NVME_BLKIO2_SUBTASK *Subtask;
NVME_BLKIO2_REQUEST *BlkIo2Request; NVME_BLKIO2_REQUEST *BlkIo2Request;
EFI_BLOCK_IO2_TOKEN *Token; EFI_BLOCK_IO2_TOKEN *Token;
BOOLEAN HasNewItem; BOOLEAN HasNewItem;
EFI_STATUS Status; EFI_STATUS Status;
Private = (NVME_CONTROLLER_PRIVATE_DATA*)Context; Private = (NVME_CONTROLLER_PRIVATE_DATA *)Context;
QueueId = 2; QueueId = 2;
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh; Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
HasNewItem = FALSE; HasNewItem = FALSE;
@ -549,7 +552,8 @@ ProcessAsyncTaskList (
// //
for (Link = GetFirstNode (&Private->UnsubmittedSubtasks); for (Link = GetFirstNode (&Private->UnsubmittedSubtasks);
!IsNull (&Private->UnsubmittedSubtasks, Link); !IsNull (&Private->UnsubmittedSubtasks, Link);
Link = NextLink) { Link = NextLink)
{
NextLink = GetNextNode (&Private->UnsubmittedSubtasks, Link); NextLink = GetNextNode (&Private->UnsubmittedSubtasks, Link);
Subtask = NVME_BLKIO2_SUBTASK_FROM_LINK (Link); Subtask = NVME_BLKIO2_SUBTASK_FROM_LINK (Link);
BlkIo2Request = Subtask->BlockIo2Request; BlkIo2Request = Subtask->BlockIo2Request;
@ -563,7 +567,8 @@ ProcessAsyncTaskList (
if (Token->TransactionStatus != EFI_SUCCESS) { if (Token->TransactionStatus != EFI_SUCCESS) {
if (IsListEmpty (&BlkIo2Request->SubtasksQueue) && if (IsListEmpty (&BlkIo2Request->SubtasksQueue) &&
BlkIo2Request->LastSubtaskSubmitted && BlkIo2Request->LastSubtaskSubmitted &&
(BlkIo2Request->UnsubmittedSubtaskNum == 0)) { (BlkIo2Request->UnsubmittedSubtaskNum == 0))
{
// //
// Remove the BlockIo2 request from the device asynchronous queue. // Remove the BlockIo2 request from the device asynchronous queue.
// //
@ -594,7 +599,8 @@ ProcessAsyncTaskList (
Token->TransactionStatus = EFI_DEVICE_ERROR; Token->TransactionStatus = EFI_DEVICE_ERROR;
if (IsListEmpty (&BlkIo2Request->SubtasksQueue) && if (IsListEmpty (&BlkIo2Request->SubtasksQueue) &&
Subtask->IsLast) { Subtask->IsLast)
{
// //
// Remove the BlockIo2 request from the device asynchronous queue. // Remove the BlockIo2 request from the device asynchronous queue.
// //
@ -625,8 +631,9 @@ ProcessAsyncTaskList (
// //
for (Link = GetFirstNode (&Private->AsyncPassThruQueue); for (Link = GetFirstNode (&Private->AsyncPassThruQueue);
!IsNull (&Private->AsyncPassThruQueue, Link); !IsNull (&Private->AsyncPassThruQueue, Link);
Link = NextLink) { Link = NextLink)
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link); {
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
AsyncRequest = NVME_PASS_THRU_ASYNC_REQ_FROM_THIS (Link); AsyncRequest = NVME_PASS_THRU_ASYNC_REQ_FROM_THIS (Link);
if (AsyncRequest->CommandId == Cq->Cid) { if (AsyncRequest->CommandId == Cq->Cid) {
// //
@ -636,7 +643,7 @@ ProcessAsyncTaskList (
CopyMem ( CopyMem (
AsyncRequest->Packet->NvmeCompletion, AsyncRequest->Packet->NvmeCompletion,
Cq, Cq,
sizeof(EFI_NVM_EXPRESS_COMPLETION) sizeof (EFI_NVM_EXPRESS_COMPLETION)
); );
// //
@ -645,12 +652,15 @@ ProcessAsyncTaskList (
if (AsyncRequest->MapData != NULL) { if (AsyncRequest->MapData != NULL) {
PciIo->Unmap (PciIo, AsyncRequest->MapData); PciIo->Unmap (PciIo, AsyncRequest->MapData);
} }
if (AsyncRequest->MapMeta != NULL) { if (AsyncRequest->MapMeta != NULL) {
PciIo->Unmap (PciIo, AsyncRequest->MapMeta); PciIo->Unmap (PciIo, AsyncRequest->MapMeta);
} }
if (AsyncRequest->MapPrpList != NULL) { if (AsyncRequest->MapPrpList != NULL) {
PciIo->Unmap (PciIo, AsyncRequest->MapPrpList); PciIo->Unmap (PciIo, AsyncRequest->MapPrpList);
} }
if (AsyncRequest->PrpListHost != NULL) { if (AsyncRequest->PrpListHost != NULL) {
PciIo->FreeBuffer ( PciIo->FreeBuffer (
PciIo, PciIo,
@ -674,19 +684,19 @@ ProcessAsyncTaskList (
Private->CqHdbl[QueueId].Cqh++; Private->CqHdbl[QueueId].Cqh++;
if (Private->CqHdbl[QueueId].Cqh > MIN (NVME_ASYNC_CCQ_SIZE, Private->Cap.Mqes)) { if (Private->CqHdbl[QueueId].Cqh > MIN (NVME_ASYNC_CCQ_SIZE, Private->Cap.Mqes)) {
Private->CqHdbl[QueueId].Cqh = 0; Private->CqHdbl[QueueId].Cqh = 0;
Private->Pt[QueueId] ^= 1; Private->Pt[QueueId] ^= 1;
} }
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh; Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
} }
if (HasNewItem) { if (HasNewItem) {
Data = ReadUnaligned32 ((UINT32*)&Private->CqHdbl[QueueId]); Data = ReadUnaligned32 ((UINT32 *)&Private->CqHdbl[QueueId]);
PciIo->Mem.Write ( PciIo->Mem.Write (
PciIo, PciIo,
EfiPciIoWidthUint32, EfiPciIoWidthUint32,
NVME_BAR, NVME_BAR,
NVME_CQHDBL_OFFSET(QueueId, Private->Cap.Dstrd), NVME_CQHDBL_OFFSET (QueueId, Private->Cap.Dstrd),
1, 1,
&Data &Data
); );
@ -766,8 +776,9 @@ NvmExpressDriverBindingSupported (
if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) || if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) ||
(DevicePathNode.DevPath->SubType != MSG_NVME_NAMESPACE_DP) || (DevicePathNode.DevPath->SubType != MSG_NVME_NAMESPACE_DP) ||
(DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH))) { (DevicePathNodeLength (DevicePathNode.DevPath) != sizeof (NVME_NAMESPACE_DEVICE_PATH)))
return EFI_UNSUPPORTED; {
return EFI_UNSUPPORTED;
} }
} }
} }
@ -778,7 +789,7 @@ NvmExpressDriverBindingSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath, (VOID **)&ParentDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -807,7 +818,7 @@ NvmExpressDriverBindingSupported (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo, (VOID **)&PciIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -853,7 +864,6 @@ Done:
return Status; return Status;
} }
/** /**
Starts a device controller or a bus controller. Starts a device controller or a bus controller.
@ -915,7 +925,7 @@ NvmExpressDriverBindingStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
(VOID **) &ParentDevicePath, (VOID **)&ParentDevicePath,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -927,7 +937,7 @@ NvmExpressDriverBindingStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
(VOID **) &PciIo, (VOID **)&PciIo,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_BY_DRIVER EFI_OPEN_PROTOCOL_BY_DRIVER
@ -965,14 +975,14 @@ NvmExpressDriverBindingStart (
AllocateAnyPages, AllocateAnyPages,
EfiBootServicesData, EfiBootServicesData,
6, 6,
(VOID**)&Private->Buffer, (VOID **)&Private->Buffer,
0 0
); );
if (EFI_ERROR (Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
Bytes = EFI_PAGES_TO_SIZE (6); Bytes = EFI_PAGES_TO_SIZE (6);
Status = PciIo->Map ( Status = PciIo->Map (
PciIo, PciIo,
EfiPciIoOperationBusMasterCommonBuffer, EfiPciIoOperationBusMasterCommonBuffer,
@ -988,7 +998,7 @@ NvmExpressDriverBindingStart (
Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr; Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr;
Private->Signature = NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE; Private->Signature = NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE;
Private->ControllerHandle = Controller; Private->ControllerHandle = Controller;
Private->ImageHandle = This->DriverBindingHandle; Private->ImageHandle = This->DriverBindingHandle;
Private->DriverBindingHandle = This->DriverBindingHandle; Private->DriverBindingHandle = This->DriverBindingHandle;
@ -1004,7 +1014,7 @@ NvmExpressDriverBindingStart (
InitializeListHead (&Private->UnsubmittedSubtasks); InitializeListHead (&Private->UnsubmittedSubtasks);
Status = NvmeControllerInit (Private); Status = NvmeControllerInit (Private);
if (EFI_ERROR(Status)) { if (EFI_ERROR (Status)) {
goto Exit; goto Exit;
} }
@ -1046,7 +1056,7 @@ NvmExpressDriverBindingStart (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
(VOID **) &Passthru, (VOID **)&Passthru,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -1065,7 +1075,6 @@ NvmExpressDriverBindingStart (
Status = DiscoverAllNamespaces ( Status = DiscoverAllNamespaces (
Private Private
); );
} else if (!IsDevicePathEnd (RemainingDevicePath)) { } else if (!IsDevicePathEnd (RemainingDevicePath)) {
// //
// Enumerate the specified NVME namespace // Enumerate the specified NVME namespace
@ -1127,7 +1136,6 @@ Exit:
return Status; return Status;
} }
/** /**
Stops a device controller or a bus controller. Stops a device controller or a bus controller.
@ -1157,10 +1165,10 @@ Exit:
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDriverBindingStop ( NvmExpressDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
@ -1175,7 +1183,7 @@ NvmExpressDriverBindingStop (
Status = gBS->OpenProtocol ( Status = gBS->OpenProtocol (
Controller, Controller,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
(VOID **) &PassThru, (VOID **)&PassThru,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller, Controller,
EFI_OPEN_PROTOCOL_GET_PROTOCOL EFI_OPEN_PROTOCOL_GET_PROTOCOL
@ -1201,11 +1209,11 @@ NvmExpressDriverBindingStop (
} }
gBS->UninstallMultipleProtocolInterfaces ( gBS->UninstallMultipleProtocolInterfaces (
Controller, Controller,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
PassThru, PassThru,
NULL NULL
); );
if (Private->TimerEvent != NULL) { if (Private->TimerEvent != NULL) {
gBS->CloseEvent (Private->TimerEvent); gBS->CloseEvent (Private->TimerEvent);
@ -1224,17 +1232,17 @@ NvmExpressDriverBindingStop (
} }
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiPciIoProtocolGuid, &gEfiPciIoProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
gBS->CloseProtocol ( gBS->CloseProtocol (
Controller, Controller,
&gEfiDevicePathProtocolGuid, &gEfiDevicePathProtocolGuid,
This->DriverBindingHandle, This->DriverBindingHandle,
Controller Controller
); );
NvmeUnregisterShutdownNotification (); NvmeUnregisterShutdownNotification ();
@ -1272,15 +1280,15 @@ NvmExpressDriverBindingStop (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressUnload ( NvmExpressUnload (
IN EFI_HANDLE ImageHandle IN EFI_HANDLE ImageHandle
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
EFI_HANDLE *DeviceHandleBuffer; EFI_HANDLE *DeviceHandleBuffer;
UINTN DeviceHandleCount; UINTN DeviceHandleCount;
UINTN Index; UINTN Index;
EFI_COMPONENT_NAME_PROTOCOL *ComponentName; EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2; EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
// //
// Get the list of the device handles managed by this driver. // Get the list of the device handles managed by this driver.
@ -1289,13 +1297,13 @@ NvmExpressUnload (
// those protocols installed at image handle. // those protocols installed at image handle.
// //
DeviceHandleBuffer = NULL; DeviceHandleBuffer = NULL;
Status = gBS->LocateHandleBuffer ( Status = gBS->LocateHandleBuffer (
ByProtocol, ByProtocol,
&gEfiNvmExpressPassThruProtocolGuid, &gEfiNvmExpressPassThruProtocolGuid,
NULL, NULL,
&DeviceHandleCount, &DeviceHandleCount,
&DeviceHandleBuffer &DeviceHandleBuffer
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
// //
@ -1342,7 +1350,7 @@ NvmExpressUnload (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
ImageHandle, ImageHandle,
&gEfiComponentNameProtocolGuid, &gEfiComponentNameProtocolGuid,
(VOID **) &ComponentName (VOID **)&ComponentName
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallProtocolInterface ( gBS->UninstallProtocolInterface (
@ -1355,7 +1363,7 @@ NvmExpressUnload (
Status = gBS->HandleProtocol ( Status = gBS->HandleProtocol (
ImageHandle, ImageHandle,
&gEfiComponentName2ProtocolGuid, &gEfiComponentName2ProtocolGuid,
(VOID **) &ComponentName2 (VOID **)&ComponentName2
); );
if (!EFI_ERROR (Status)) { if (!EFI_ERROR (Status)) {
gBS->UninstallProtocolInterface ( gBS->UninstallProtocolInterface (
@ -1374,6 +1382,7 @@ EXIT:
if (DeviceHandleBuffer != NULL) { if (DeviceHandleBuffer != NULL) {
gBS->FreePool (DeviceHandleBuffer); gBS->FreePool (DeviceHandleBuffer);
} }
return Status; return Status;
} }
@ -1394,7 +1403,7 @@ NvmExpressDriverEntry (
IN EFI_SYSTEM_TABLE *SystemTable IN EFI_SYSTEM_TABLE *SystemTable
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
Status = EfiLibInstallDriverBindingComponentName2 ( Status = EfiLibInstallDriverBindingComponentName2 (
ImageHandle, ImageHandle,
@ -1411,12 +1420,12 @@ NvmExpressDriverEntry (
// EFI drivers that are on PCI and other plug in cards. // EFI drivers that are on PCI and other plug in cards.
// //
gNvmExpressDriverSupportedEfiVersion.FirmwareVersion = 0x00020028; gNvmExpressDriverSupportedEfiVersion.FirmwareVersion = 0x00020028;
Status = gBS->InstallMultipleProtocolInterfaces ( Status = gBS->InstallMultipleProtocolInterfaces (
&ImageHandle, &ImageHandle,
&gEfiDriverSupportedEfiVersionProtocolGuid, &gEfiDriverSupportedEfiVersionProtocolGuid,
&gNvmExpressDriverSupportedEfiVersion, &gNvmExpressDriverSupportedEfiVersion,
NULL NULL
); );
ASSERT_EFI_ERROR (Status); ASSERT_EFI_ERROR (Status);
return Status; return Status;
} }

View File

@ -41,8 +41,8 @@
#include <Library/UefiDriverEntryPoint.h> #include <Library/UefiDriverEntryPoint.h>
#include <Library/ReportStatusCodeLib.h> #include <Library/ReportStatusCodeLib.h>
typedef struct _NVME_CONTROLLER_PRIVATE_DATA NVME_CONTROLLER_PRIVATE_DATA; typedef struct _NVME_CONTROLLER_PRIVATE_DATA NVME_CONTROLLER_PRIVATE_DATA;
typedef struct _NVME_DEVICE_PRIVATE_DATA NVME_DEVICE_PRIVATE_DATA; typedef struct _NVME_DEVICE_PRIVATE_DATA NVME_DEVICE_PRIVATE_DATA;
#include "NvmExpressBlockIo.h" #include "NvmExpressBlockIo.h"
#include "NvmExpressDiskInfo.h" #include "NvmExpressDiskInfo.h"
@ -53,67 +53,67 @@ extern EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName;
extern EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2; extern EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2;
extern EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion; extern EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion;
#define PCI_CLASS_MASS_STORAGE_NVM 0x08 // mass storage sub-class non-volatile memory. #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 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_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_ACQ_SIZE 1 // Number of admin completion queue entries, which is 0-based
#define NVME_CSQ_SIZE 1 // Number of I/O submission queue entries, which is 0-based #define NVME_CSQ_SIZE 1 // Number of I/O submission queue entries, which is 0-based
#define NVME_CCQ_SIZE 1 // Number of I/O completion queue entries, which is 0-based #define NVME_CCQ_SIZE 1 // Number of I/O completion queue entries, which is 0-based
// //
// Number of asynchronous I/O submission queue entries, which is 0-based. // Number of asynchronous I/O submission queue entries, which is 0-based.
// The asynchronous I/O submission queue size is 4kB in total. // The asynchronous I/O submission queue size is 4kB in total.
// //
#define NVME_ASYNC_CSQ_SIZE 63 #define NVME_ASYNC_CSQ_SIZE 63
// //
// Number of asynchronous I/O completion queue entries, which is 0-based. // Number of asynchronous I/O completion queue entries, which is 0-based.
// The asynchronous I/O completion queue size is 4kB in total. // The asynchronous I/O completion queue size is 4kB in total.
// //
#define NVME_ASYNC_CCQ_SIZE 255 #define NVME_ASYNC_CCQ_SIZE 255
#define NVME_MAX_QUEUES 3 // Number of queues supported by the driver #define NVME_MAX_QUEUES 3 // Number of queues supported by the driver
#define NVME_CONTROLLER_ID 0 #define NVME_CONTROLLER_ID 0
// //
// Time out value for Nvme transaction execution // Time out value for Nvme transaction execution
// //
#define NVME_GENERIC_TIMEOUT EFI_TIMER_PERIOD_SECONDS (5) #define NVME_GENERIC_TIMEOUT EFI_TIMER_PERIOD_SECONDS (5)
// //
// Nvme async transfer timer interval, set by experience. // Nvme async transfer timer interval, set by experience.
// //
#define NVME_HC_ASYNC_TIMER EFI_TIMER_PERIOD_MILLISECONDS (1) #define NVME_HC_ASYNC_TIMER EFI_TIMER_PERIOD_MILLISECONDS (1)
// //
// Unique signature for private data structure. // Unique signature for private data structure.
// //
#define NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('N','V','M','E') #define NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('N','V','M','E')
// //
// Nvme private data structure. // Nvme private data structure.
// //
struct _NVME_CONTROLLER_PRIVATE_DATA { struct _NVME_CONTROLLER_PRIVATE_DATA {
UINT32 Signature; UINT32 Signature;
EFI_HANDLE ControllerHandle; EFI_HANDLE ControllerHandle;
EFI_HANDLE ImageHandle; EFI_HANDLE ImageHandle;
EFI_HANDLE DriverBindingHandle; EFI_HANDLE DriverBindingHandle;
EFI_PCI_IO_PROTOCOL *PciIo; EFI_PCI_IO_PROTOCOL *PciIo;
UINT64 PciAttributes; UINT64 PciAttributes;
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath; EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode; EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL Passthru; EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL Passthru;
// //
// pointer to identify controller data // pointer to identify controller data
// //
NVME_ADMIN_CONTROLLER_DATA *ControllerData; NVME_ADMIN_CONTROLLER_DATA *ControllerData;
// //
// 6 x 4kB aligned buffers will be carved out of this buffer. // 6 x 4kB aligned buffers will be carved out of this buffer.
@ -124,45 +124,45 @@ struct _NVME_CONTROLLER_PRIVATE_DATA {
// 5th 4kB boundary is the start of I/O submission queue #2. // 5th 4kB boundary is the start of I/O submission queue #2.
// 6th 4kB boundary is the start of I/O completion queue #2. // 6th 4kB boundary is the start of I/O completion queue #2.
// //
UINT8 *Buffer; UINT8 *Buffer;
UINT8 *BufferPciAddr; UINT8 *BufferPciAddr;
// //
// Pointers to 4kB aligned submission & completion queues. // Pointers to 4kB aligned submission & completion queues.
// //
NVME_SQ *SqBuffer[NVME_MAX_QUEUES]; NVME_SQ *SqBuffer[NVME_MAX_QUEUES];
NVME_CQ *CqBuffer[NVME_MAX_QUEUES]; NVME_CQ *CqBuffer[NVME_MAX_QUEUES];
NVME_SQ *SqBufferPciAddr[NVME_MAX_QUEUES]; NVME_SQ *SqBufferPciAddr[NVME_MAX_QUEUES];
NVME_CQ *CqBufferPciAddr[NVME_MAX_QUEUES]; NVME_CQ *CqBufferPciAddr[NVME_MAX_QUEUES];
// //
// Submission and completion queue indices. // Submission and completion queue indices.
// //
NVME_SQTDBL SqTdbl[NVME_MAX_QUEUES]; NVME_SQTDBL SqTdbl[NVME_MAX_QUEUES];
NVME_CQHDBL CqHdbl[NVME_MAX_QUEUES]; NVME_CQHDBL CqHdbl[NVME_MAX_QUEUES];
UINT16 AsyncSqHead; UINT16 AsyncSqHead;
// //
// Flag to indicate internal IO queue creation. // Flag to indicate internal IO queue creation.
// //
BOOLEAN CreateIoQueue; BOOLEAN CreateIoQueue;
UINT8 Pt[NVME_MAX_QUEUES]; UINT8 Pt[NVME_MAX_QUEUES];
UINT16 Cid[NVME_MAX_QUEUES]; UINT16 Cid[NVME_MAX_QUEUES];
// //
// Nvme controller capabilities // Nvme controller capabilities
// //
NVME_CAP Cap; NVME_CAP Cap;
VOID *Mapping; VOID *Mapping;
// //
// For Non-blocking operations. // For Non-blocking operations.
// //
EFI_EVENT TimerEvent; EFI_EVENT TimerEvent;
LIST_ENTRY AsyncPassThruQueue; LIST_ENTRY AsyncPassThruQueue;
LIST_ENTRY UnsubmittedSubtasks; LIST_ENTRY UnsubmittedSubtasks;
}; };
#define NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU(a) \ #define NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU(a) \
@ -175,7 +175,7 @@ struct _NVME_CONTROLLER_PRIVATE_DATA {
// //
// Unique signature for private data structure. // Unique signature for private data structure.
// //
#define NVME_DEVICE_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('X','S','S','D') #define NVME_DEVICE_PRIVATE_DATA_SIGNATURE SIGNATURE_32 ('X','S','S','D')
// //
// Nvme device private data structure // Nvme device private data structure
@ -208,7 +208,6 @@ struct _NVME_DEVICE_PRIVATE_DATA {
NVME_ADMIN_NAMESPACE_DATA NamespaceData; NVME_ADMIN_NAMESPACE_DATA NamespaceData;
NVME_CONTROLLER_PRIVATE_DATA *Controller; NVME_CONTROLLER_PRIVATE_DATA *Controller;
}; };
// //
@ -235,7 +234,7 @@ struct _NVME_DEVICE_PRIVATE_DATA {
NVME_DEVICE_PRIVATE_DATA_SIGNATURE \ NVME_DEVICE_PRIVATE_DATA_SIGNATURE \
) )
#define NVME_DEVICE_PRIVATE_DATA_FROM_STORAGE_SECURITY(a)\ #define NVME_DEVICE_PRIVATE_DATA_FROM_STORAGE_SECURITY(a) \
CR (a, \ CR (a, \
NVME_DEVICE_PRIVATE_DATA, \ NVME_DEVICE_PRIVATE_DATA, \
StorageSecurity, \ StorageSecurity, \
@ -245,38 +244,38 @@ struct _NVME_DEVICE_PRIVATE_DATA {
// //
// Nvme block I/O 2 request. // Nvme block I/O 2 request.
// //
#define NVME_BLKIO2_REQUEST_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'R') #define NVME_BLKIO2_REQUEST_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'R')
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;
EFI_BLOCK_IO2_TOKEN *Token; EFI_BLOCK_IO2_TOKEN *Token;
UINTN UnsubmittedSubtaskNum; UINTN UnsubmittedSubtaskNum;
BOOLEAN LastSubtaskSubmitted; BOOLEAN LastSubtaskSubmitted;
// //
// The queue for Nvme read/write sub-tasks of a BlockIo2 request. // The queue for Nvme read/write sub-tasks of a BlockIo2 request.
// //
LIST_ENTRY SubtasksQueue; LIST_ENTRY SubtasksQueue;
} NVME_BLKIO2_REQUEST; } NVME_BLKIO2_REQUEST;
#define NVME_BLKIO2_REQUEST_FROM_LINK(a) \ #define NVME_BLKIO2_REQUEST_FROM_LINK(a) \
CR (a, NVME_BLKIO2_REQUEST, Link, NVME_BLKIO2_REQUEST_SIGNATURE) CR (a, NVME_BLKIO2_REQUEST, Link, NVME_BLKIO2_REQUEST_SIGNATURE)
#define NVME_BLKIO2_SUBTASK_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'S') #define NVME_BLKIO2_SUBTASK_SIGNATURE SIGNATURE_32 ('N', 'B', '2', 'S')
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;
BOOLEAN IsLast; BOOLEAN IsLast;
UINT32 NamespaceId; UINT32 NamespaceId;
EFI_EVENT Event; EFI_EVENT Event;
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *CommandPacket; EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *CommandPacket;
// //
// The BlockIo2 request this subtask belongs to // The BlockIo2 request this subtask belongs to
// //
NVME_BLKIO2_REQUEST *BlockIo2Request; NVME_BLKIO2_REQUEST *BlockIo2Request;
} NVME_BLKIO2_SUBTASK; } NVME_BLKIO2_SUBTASK;
#define NVME_BLKIO2_SUBTASK_FROM_LINK(a) \ #define NVME_BLKIO2_SUBTASK_FROM_LINK(a) \
@ -285,20 +284,20 @@ typedef struct {
// //
// Nvme asynchronous passthru request. // Nvme asynchronous passthru request.
// //
#define NVME_PASS_THRU_ASYNC_REQ_SIG SIGNATURE_32 ('N', 'P', 'A', 'R') #define NVME_PASS_THRU_ASYNC_REQ_SIG SIGNATURE_32 ('N', 'P', 'A', 'R')
typedef struct { typedef struct {
UINT32 Signature; UINT32 Signature;
LIST_ENTRY Link; LIST_ENTRY Link;
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet; EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet;
UINT16 CommandId; UINT16 CommandId;
VOID *MapPrpList; VOID *MapPrpList;
UINTN PrpListNo; UINTN PrpListNo;
VOID *PrpListHost; VOID *PrpListHost;
VOID *MapData; VOID *MapData;
VOID *MapMeta; VOID *MapMeta;
EFI_EVENT CallerEvent; EFI_EVENT CallerEvent;
} NVME_PASS_THRU_ASYNC_REQ; } NVME_PASS_THRU_ASYNC_REQ;
#define NVME_PASS_THRU_ASYNC_REQ_FROM_THIS(a) \ #define NVME_PASS_THRU_ASYNC_REQ_FROM_THIS(a) \
@ -426,11 +425,11 @@ NvmExpressComponentNameGetDriverName (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressComponentNameGetControllerName ( NvmExpressComponentNameGetControllerName (
IN EFI_COMPONENT_NAME_PROTOCOL *This, IN EFI_COMPONENT_NAME_PROTOCOL *This,
IN EFI_HANDLE ControllerHandle, IN EFI_HANDLE ControllerHandle,
IN EFI_HANDLE ChildHandle OPTIONAL, IN EFI_HANDLE ChildHandle OPTIONAL,
IN CHAR8 *Language, IN CHAR8 *Language,
OUT CHAR16 **ControllerName OUT CHAR16 **ControllerName
); );
/** /**
@ -555,10 +554,10 @@ NvmExpressDriverBindingStart (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDriverBindingStop ( NvmExpressDriverBindingStop (
IN EFI_DRIVER_BINDING_PROTOCOL *This, IN EFI_DRIVER_BINDING_PROTOCOL *This,
IN EFI_HANDLE Controller, IN EFI_HANDLE Controller,
IN UINTN NumberOfChildren, IN UINTN NumberOfChildren,
IN EFI_HANDLE *ChildHandleBuffer IN EFI_HANDLE *ChildHandleBuffer
); );
/** /**
@ -594,10 +593,10 @@ NvmExpressDriverBindingStop (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressPassThru ( NvmExpressPassThru (
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This, IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
IN UINT32 NamespaceId, IN UINT32 NamespaceId,
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet, IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
IN EFI_EVENT Event OPTIONAL IN EFI_EVENT Event OPTIONAL
); );
/** /**
@ -636,8 +635,8 @@ NvmExpressPassThru (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressGetNextNamespace ( NvmExpressGetNextNamespace (
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This, IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
IN OUT UINT32 *NamespaceId IN OUT UINT32 *NamespaceId
); );
/** /**
@ -667,9 +666,9 @@ NvmExpressGetNextNamespace (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressGetNamespace ( NvmExpressGetNamespace (
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This, IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath, IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
OUT UINT32 *NamespaceId OUT UINT32 *NamespaceId
); );
/** /**
@ -706,9 +705,9 @@ NvmExpressGetNamespace (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressBuildDevicePath ( NvmExpressBuildDevicePath (
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This, IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
IN UINT32 NamespaceId, IN UINT32 NamespaceId,
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
); );
/** /**
@ -719,7 +718,7 @@ NvmExpressBuildDevicePath (
**/ **/
VOID VOID
NvmeDumpStatus ( NvmeDumpStatus (
IN NVME_CQ *Cq IN NVME_CQ *Cq
); );
/** /**

File diff suppressed because it is too large Load Diff

View File

@ -23,8 +23,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoReset ( NvmeBlockIoReset (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN BOOLEAN ExtendedVerification IN BOOLEAN ExtendedVerification
); );
/** /**
@ -49,11 +49,11 @@ NvmeBlockIoReset (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoReadBlocks ( NvmeBlockIoReadBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer OUT VOID *Buffer
); );
/** /**
@ -79,11 +79,11 @@ NvmeBlockIoReadBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoWriteBlocks ( NvmeBlockIoWriteBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This, IN EFI_BLOCK_IO_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
); );
/** /**
@ -99,7 +99,7 @@ NvmeBlockIoWriteBlocks (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoFlushBlocks ( NvmeBlockIoFlushBlocks (
IN EFI_BLOCK_IO_PROTOCOL *This IN EFI_BLOCK_IO_PROTOCOL *This
); );
/** /**
@ -162,12 +162,12 @@ NvmeBlockIoResetEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoReadBlocksEx ( NvmeBlockIoReadBlocksEx (
IN EFI_BLOCK_IO2_PROTOCOL *This, IN EFI_BLOCK_IO2_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN OUT EFI_BLOCK_IO2_TOKEN *Token,
IN UINTN BufferSize, IN UINTN BufferSize,
OUT VOID *Buffer OUT VOID *Buffer
); );
/** /**
@ -212,11 +212,11 @@ EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoWriteBlocksEx ( NvmeBlockIoWriteBlocksEx (
IN EFI_BLOCK_IO2_PROTOCOL *This, IN EFI_BLOCK_IO2_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN EFI_LBA Lba, IN EFI_LBA Lba,
IN OUT EFI_BLOCK_IO2_TOKEN *Token, IN OUT EFI_BLOCK_IO2_TOKEN *Token,
IN UINTN BufferSize, IN UINTN BufferSize,
IN VOID *Buffer IN VOID *Buffer
); );
/** /**
@ -246,8 +246,8 @@ NvmeBlockIoWriteBlocksEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeBlockIoFlushBlocksEx ( NvmeBlockIoFlushBlocksEx (
IN EFI_BLOCK_IO2_PROTOCOL *This, IN EFI_BLOCK_IO2_PROTOCOL *This,
IN OUT EFI_BLOCK_IO2_TOKEN *Token IN OUT EFI_BLOCK_IO2_TOKEN *Token
); );
/** /**
@ -325,14 +325,14 @@ NvmeBlockIoFlushBlocksEx (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeStorageSecurityReceiveData ( NvmeStorageSecurityReceiveData (
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
OUT VOID *PayloadBuffer, OUT VOID *PayloadBuffer,
OUT UINTN *PayloadTransferSize OUT UINTN *PayloadTransferSize
); );
/** /**
@ -399,13 +399,13 @@ NvmeStorageSecurityReceiveData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmeStorageSecuritySendData ( NvmeStorageSecuritySendData (
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This, IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
IN UINT32 MediaId, IN UINT32 MediaId,
IN UINT64 Timeout, IN UINT64 Timeout,
IN UINT8 SecurityProtocolId, IN UINT8 SecurityProtocolId,
IN UINT16 SecurityProtocolSpecificData, IN UINT16 SecurityProtocolSpecificData,
IN UINTN PayloadBufferSize, IN UINTN PayloadBufferSize,
IN VOID *PayloadBuffer IN VOID *PayloadBuffer
); );
#endif #endif

View File

@ -8,7 +8,7 @@
#include "NvmExpress.h" #include "NvmExpress.h"
EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = { EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
EFI_DISK_INFO_NVME_INTERFACE_GUID, EFI_DISK_INFO_NVME_INTERFACE_GUID,
NvmExpressDiskInfoInquiry, NvmExpressDiskInfoInquiry,
NvmExpressDiskInfoIdentify, NvmExpressDiskInfoIdentify,
@ -27,13 +27,12 @@ EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
**/ **/
VOID VOID
InitializeDiskInfo ( InitializeDiskInfo (
IN NVME_DEVICE_PRIVATE_DATA *Device IN NVME_DEVICE_PRIVATE_DATA *Device
) )
{ {
CopyMem (&Device->DiskInfo, &gNvmExpressDiskInfoProtocolTemplate, sizeof (EFI_DISK_INFO_PROTOCOL)); CopyMem (&Device->DiskInfo, &gNvmExpressDiskInfoProtocolTemplate, sizeof (EFI_DISK_INFO_PROTOCOL));
} }
/** /**
Provides inquiry information for the controller type. Provides inquiry information for the controller type.
@ -53,15 +52,14 @@ InitializeDiskInfo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoInquiry ( NvmExpressDiskInfoInquiry (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *InquiryData, IN OUT VOID *InquiryData,
IN OUT UINT32 *InquiryDataSize IN OUT UINT32 *InquiryDataSize
) )
{ {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
Provides identify information for the controller type. Provides identify information for the controller type.
@ -83,13 +81,13 @@ NvmExpressDiskInfoInquiry (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoIdentify ( NvmExpressDiskInfoIdentify (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *IdentifyData, IN OUT VOID *IdentifyData,
IN OUT UINT32 *IdentifyDataSize IN OUT UINT32 *IdentifyDataSize
) )
{ {
EFI_STATUS Status; EFI_STATUS Status;
NVME_DEVICE_PRIVATE_DATA *Device; NVME_DEVICE_PRIVATE_DATA *Device;
Device = NVME_DEVICE_PRIVATE_DATA_FROM_DISK_INFO (This); Device = NVME_DEVICE_PRIVATE_DATA_FROM_DISK_INFO (This);
@ -98,6 +96,7 @@ NvmExpressDiskInfoIdentify (
Status = EFI_SUCCESS; Status = EFI_SUCCESS;
CopyMem (IdentifyData, &Device->NamespaceData, sizeof (Device->NamespaceData)); CopyMem (IdentifyData, &Device->NamespaceData, sizeof (Device->NamespaceData));
} }
*IdentifyDataSize = sizeof (Device->NamespaceData); *IdentifyDataSize = sizeof (Device->NamespaceData);
return Status; return Status;
} }
@ -122,16 +121,15 @@ NvmExpressDiskInfoIdentify (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoSenseData ( NvmExpressDiskInfoSenseData (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *SenseData, IN OUT VOID *SenseData,
IN OUT UINT32 *SenseDataSize, IN OUT UINT32 *SenseDataSize,
OUT UINT8 *SenseDataNumber OUT UINT8 *SenseDataNumber
) )
{ {
return EFI_NOT_FOUND; return EFI_NOT_FOUND;
} }
/** /**
This function is used to get controller information. This function is used to get controller information.
@ -146,11 +144,10 @@ NvmExpressDiskInfoSenseData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoWhichIde ( NvmExpressDiskInfoWhichIde (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
OUT UINT32 *IdeChannel, OUT UINT32 *IdeChannel,
OUT UINT32 *IdeDevice OUT UINT32 *IdeDevice
) )
{ {
return EFI_UNSUPPORTED; return EFI_UNSUPPORTED;
} }

View File

@ -20,10 +20,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
**/ **/
VOID VOID
InitializeDiskInfo ( InitializeDiskInfo (
IN NVME_DEVICE_PRIVATE_DATA *Device IN NVME_DEVICE_PRIVATE_DATA *Device
); );
/** /**
Provides inquiry information for the controller type. Provides inquiry information for the controller type.
@ -43,9 +42,9 @@ InitializeDiskInfo (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoInquiry ( NvmExpressDiskInfoInquiry (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *InquiryData, IN OUT VOID *InquiryData,
IN OUT UINT32 *InquiryDataSize IN OUT UINT32 *InquiryDataSize
); );
/** /**
@ -69,9 +68,9 @@ NvmExpressDiskInfoInquiry (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoIdentify ( NvmExpressDiskInfoIdentify (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *IdentifyData, IN OUT VOID *IdentifyData,
IN OUT UINT32 *IdentifyDataSize IN OUT UINT32 *IdentifyDataSize
); );
/** /**
@ -94,13 +93,12 @@ NvmExpressDiskInfoIdentify (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoSenseData ( NvmExpressDiskInfoSenseData (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
IN OUT VOID *SenseData, IN OUT VOID *SenseData,
IN OUT UINT32 *SenseDataSize, IN OUT UINT32 *SenseDataSize,
OUT UINT8 *SenseDataNumber OUT UINT8 *SenseDataNumber
); );
/** /**
This function is used to get controller information. This function is used to get controller information.
@ -115,9 +113,9 @@ NvmExpressDiskInfoSenseData (
EFI_STATUS EFI_STATUS
EFIAPI EFIAPI
NvmExpressDiskInfoWhichIde ( NvmExpressDiskInfoWhichIde (
IN EFI_DISK_INFO_PROTOCOL *This, IN EFI_DISK_INFO_PROTOCOL *This,
OUT UINT32 *IdeChannel, OUT UINT32 *IdeChannel,
OUT UINT32 *IdeDevice OUT UINT32 *IdeDevice
); );
#endif #endif

Some files were not shown because too many files have changed in this diff Show More