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:
committed by
mergify[bot]
parent
7c7184e201
commit
1436aea4d5
@ -8,24 +8,24 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include "BootManagerMenu.h"
|
||||
|
||||
EFI_HII_HANDLE gStringPackHandle;
|
||||
EFI_HII_HANDLE gStringPackHandle;
|
||||
|
||||
BOOLEAN mModeInitialized = FALSE;
|
||||
BOOLEAN mModeInitialized = FALSE;
|
||||
|
||||
//
|
||||
// Boot video resolution and text mode.
|
||||
//
|
||||
UINT32 mBootHorizontalResolution = 0;
|
||||
UINT32 mBootVerticalResolution = 0;
|
||||
UINT32 mBootTextModeColumn = 0;
|
||||
UINT32 mBootTextModeRow = 0;
|
||||
UINT32 mBootHorizontalResolution = 0;
|
||||
UINT32 mBootVerticalResolution = 0;
|
||||
UINT32 mBootTextModeColumn = 0;
|
||||
UINT32 mBootTextModeRow = 0;
|
||||
//
|
||||
// BIOS setup video resolution and text mode.
|
||||
//
|
||||
UINT32 mSetupTextModeColumn = 0;
|
||||
UINT32 mSetupTextModeRow = 0;
|
||||
UINT32 mSetupHorizontalResolution = 0;
|
||||
UINT32 mSetupVerticalResolution = 0;
|
||||
UINT32 mSetupTextModeColumn = 0;
|
||||
UINT32 mSetupTextModeRow = 0;
|
||||
UINT32 mSetupHorizontalResolution = 0;
|
||||
UINT32 mSetupVerticalResolution = 0;
|
||||
|
||||
/**
|
||||
Prints a unicode string to the default console, at
|
||||
@ -40,16 +40,16 @@ UINT32 mSetupVerticalResolution = 0;
|
||||
**/
|
||||
UINTN
|
||||
PrintStringAt (
|
||||
IN UINTN Column,
|
||||
IN UINTN Row,
|
||||
IN CHAR16 *String
|
||||
IN UINTN Column,
|
||||
IN UINTN Row,
|
||||
IN CHAR16 *String
|
||||
)
|
||||
{
|
||||
UINTN ScreenWidth;
|
||||
UINTN ScreenRows;
|
||||
CHAR16 *TurncateString;
|
||||
EFI_STATUS Status;
|
||||
UINTN ShowingLength;
|
||||
UINTN ScreenWidth;
|
||||
UINTN ScreenRows;
|
||||
CHAR16 *TurncateString;
|
||||
EFI_STATUS Status;
|
||||
UINTN ShowingLength;
|
||||
|
||||
gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
|
||||
|
||||
@ -60,7 +60,7 @@ PrintStringAt (
|
||||
&ScreenRows
|
||||
);
|
||||
|
||||
if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
|
||||
if ((Column > (ScreenWidth - 1)) || (Row > (ScreenRows - 1))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -71,7 +71,7 @@ PrintStringAt (
|
||||
// TurncateString length should leave one character for draw box and
|
||||
// require one character for string end.
|
||||
//
|
||||
ShowingLength = ScreenWidth - Column - 1;
|
||||
ShowingLength = ScreenWidth - Column - 1;
|
||||
TurncateString = AllocatePool ((ShowingLength + 1) * sizeof (CHAR16));
|
||||
|
||||
if (TurncateString == NULL) {
|
||||
@ -89,7 +89,7 @@ PrintStringAt (
|
||||
*(TurncateString + ShowingLength - 2) = L'.';
|
||||
*(TurncateString + ShowingLength - 1) = L'.';
|
||||
*(TurncateString + ShowingLength) = L'\0';
|
||||
ShowingLength = Print (L"%s", TurncateString);
|
||||
ShowingLength = Print (L"%s", TurncateString);
|
||||
FreePool (TurncateString);
|
||||
return ShowingLength;
|
||||
} else {
|
||||
@ -110,13 +110,13 @@ PrintStringAt (
|
||||
**/
|
||||
UINTN
|
||||
PrintCharAt (
|
||||
IN UINTN Column,
|
||||
IN UINTN Row,
|
||||
CHAR16 Character
|
||||
IN UINTN Column,
|
||||
IN UINTN Row,
|
||||
CHAR16 Character
|
||||
)
|
||||
{
|
||||
UINTN ScreenWidth;
|
||||
UINTN ScreenRows;
|
||||
UINTN ScreenWidth;
|
||||
UINTN ScreenRows;
|
||||
|
||||
gST->ConOut->SetCursorPosition (gST->ConOut, Column, Row);
|
||||
|
||||
@ -127,7 +127,7 @@ PrintCharAt (
|
||||
&ScreenRows
|
||||
);
|
||||
|
||||
if (Column > (ScreenWidth - 1) || Row > (ScreenRows - 1)) {
|
||||
if ((Column > (ScreenWidth - 1)) || (Row > (ScreenRows - 1))) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -145,30 +145,31 @@ PrintCharAt (
|
||||
**/
|
||||
UINTN
|
||||
GetLineWidth (
|
||||
IN EFI_STRING_ID StringId
|
||||
IN EFI_STRING_ID StringId
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN IncrementValue;
|
||||
EFI_STRING String;
|
||||
UINTN LineWidth;
|
||||
UINTN Index;
|
||||
UINTN IncrementValue;
|
||||
EFI_STRING String;
|
||||
UINTN LineWidth;
|
||||
|
||||
LineWidth = 0;
|
||||
String = HiiGetString (gStringPackHandle, StringId, NULL);
|
||||
String = HiiGetString (gStringPackHandle, StringId, NULL);
|
||||
|
||||
if (String != NULL) {
|
||||
Index = 0;
|
||||
IncrementValue = 1;
|
||||
Index = 0;
|
||||
IncrementValue = 1;
|
||||
|
||||
do {
|
||||
//
|
||||
// Advance to the null-terminator or to the first width directive
|
||||
//
|
||||
for (;
|
||||
(String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);
|
||||
Index++, LineWidth = LineWidth + IncrementValue
|
||||
)
|
||||
;
|
||||
for ( ;
|
||||
(String[Index] != NARROW_CHAR) && (String[Index] != WIDE_CHAR) && (String[Index] != 0);
|
||||
Index++, LineWidth = LineWidth + IncrementValue
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
//
|
||||
// We hit the null-terminator, we now have a count
|
||||
@ -176,6 +177,7 @@ GetLineWidth (
|
||||
if (String[Index] == 0) {
|
||||
break;
|
||||
}
|
||||
|
||||
//
|
||||
// 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)
|
||||
@ -194,6 +196,7 @@ GetLineWidth (
|
||||
IncrementValue = 2;
|
||||
}
|
||||
} while (String[Index] != 0);
|
||||
|
||||
FreePool (String);
|
||||
}
|
||||
|
||||
@ -214,35 +217,37 @@ InitializeBootMenuScreen (
|
||||
IN OUT BOOT_MENU_POPUP_DATA *BootMenuData
|
||||
)
|
||||
{
|
||||
UINTN MaxStrWidth;
|
||||
UINTN StrWidth;
|
||||
UINTN Index;
|
||||
UINTN Column;
|
||||
UINTN Row;
|
||||
UINTN MaxPrintRows;
|
||||
UINTN UnSelectableItmes;
|
||||
UINTN MaxStrWidth;
|
||||
UINTN StrWidth;
|
||||
UINTN Index;
|
||||
UINTN Column;
|
||||
UINTN Row;
|
||||
UINTN MaxPrintRows;
|
||||
UINTN UnSelectableItmes;
|
||||
|
||||
if (BootMenuData == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Get maximum string width
|
||||
//
|
||||
MaxStrWidth = 0;
|
||||
for (Index = 0; Index < TITLE_TOKEN_COUNT; Index++) {
|
||||
StrWidth = GetLineWidth (BootMenuData->TitleToken[Index]);
|
||||
StrWidth = GetLineWidth (BootMenuData->TitleToken[Index]);
|
||||
MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < BootMenuData->ItemCount; Index++) {
|
||||
StrWidth = GetLineWidth (BootMenuData->PtrTokens[Index]);
|
||||
StrWidth = GetLineWidth (BootMenuData->PtrTokens[Index]);
|
||||
MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < HELP_TOKEN_COUNT; Index++) {
|
||||
StrWidth = GetLineWidth (BootMenuData->HelpToken[Index]);
|
||||
StrWidth = GetLineWidth (BootMenuData->HelpToken[Index]);
|
||||
MaxStrWidth = MaxStrWidth > StrWidth ? MaxStrWidth : StrWidth;
|
||||
}
|
||||
|
||||
//
|
||||
// query current row and column to calculate boot menu location
|
||||
//
|
||||
@ -253,31 +258,34 @@ InitializeBootMenuScreen (
|
||||
&Row
|
||||
);
|
||||
|
||||
MaxPrintRows = Row - 6;
|
||||
MaxPrintRows = Row - 6;
|
||||
UnSelectableItmes = TITLE_TOKEN_COUNT + 2 + HELP_TOKEN_COUNT + 2;
|
||||
if (MaxStrWidth + 8 > Column) {
|
||||
BootMenuData->MenuScreen.Width = Column;
|
||||
} else {
|
||||
BootMenuData->MenuScreen.Width = MaxStrWidth + 8;
|
||||
}
|
||||
|
||||
if (BootMenuData->ItemCount + UnSelectableItmes > MaxPrintRows) {
|
||||
BootMenuData->MenuScreen.Height = MaxPrintRows;
|
||||
BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
|
||||
BootMenuData->MenuScreen.Height = MaxPrintRows;
|
||||
BootMenuData->ScrollBarControl.HasScrollBar = TRUE;
|
||||
BootMenuData->ScrollBarControl.ItemCountPerScreen = MaxPrintRows - UnSelectableItmes;
|
||||
BootMenuData->ScrollBarControl.FirstItem = 0;
|
||||
BootMenuData->ScrollBarControl.LastItem = MaxPrintRows - UnSelectableItmes - 1;
|
||||
BootMenuData->ScrollBarControl.FirstItem = 0;
|
||||
BootMenuData->ScrollBarControl.LastItem = MaxPrintRows - UnSelectableItmes - 1;
|
||||
} else {
|
||||
BootMenuData->MenuScreen.Height = BootMenuData->ItemCount + UnSelectableItmes;
|
||||
BootMenuData->ScrollBarControl.HasScrollBar = FALSE;
|
||||
BootMenuData->MenuScreen.Height = BootMenuData->ItemCount + UnSelectableItmes;
|
||||
BootMenuData->ScrollBarControl.HasScrollBar = FALSE;
|
||||
BootMenuData->ScrollBarControl.ItemCountPerScreen = BootMenuData->ItemCount;
|
||||
BootMenuData->ScrollBarControl.FirstItem = 0;
|
||||
BootMenuData->ScrollBarControl.LastItem = BootMenuData->ItemCount - 1;
|
||||
BootMenuData->ScrollBarControl.FirstItem = 0;
|
||||
BootMenuData->ScrollBarControl.LastItem = BootMenuData->ItemCount - 1;
|
||||
}
|
||||
|
||||
BootMenuData->MenuScreen.StartCol = (Column - BootMenuData->MenuScreen.Width) / 2;
|
||||
BootMenuData->MenuScreen.StartRow = (Row - BootMenuData->MenuScreen.Height) / 2;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
This function uses check boot option is wheher setup application or no
|
||||
|
||||
@ -289,18 +297,18 @@ InitializeBootMenuScreen (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsBootManagerMenu (
|
||||
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
||||
IN EFI_BOOT_MANAGER_LOAD_OPTION *BootOption
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu;
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_MANAGER_LOAD_OPTION BootManagerMenu;
|
||||
|
||||
Status = EfiBootManagerGetBootManagerMenu (&BootManagerMenu);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
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
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ImageDevicePath;
|
||||
|
||||
//
|
||||
// Ignore myself.
|
||||
//
|
||||
Status = gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageDevicePathProtocolGuid, (VOID **) &ImageDevicePath);
|
||||
Status = gBS->HandleProtocol (gImageHandle, &gEfiLoadedImageDevicePathProtocolGuid, (VOID **)&ImageDevicePath);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
if (CompareMem (BootOption->FilePath, ImageDevicePath, GetDevicePathSize (ImageDevicePath)) == 0) {
|
||||
return TRUE;
|
||||
@ -363,10 +371,10 @@ InitializeBootMenuData (
|
||||
OUT BOOT_MENU_POPUP_DATA *BootMenuData
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN StrIndex;
|
||||
UINTN Index;
|
||||
UINTN StrIndex;
|
||||
|
||||
if (BootOption == NULL || BootMenuData == NULL) {
|
||||
if ((BootOption == NULL) || (BootMenuData == NULL)) {
|
||||
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[1] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP2_STRING);
|
||||
BootMenuData->HelpToken[2] = STRING_TOKEN (STR_BOOT_POPUP_MENU_HELP3_STRING);
|
||||
@ -417,93 +425,101 @@ BootMenuSelectItem (
|
||||
IN OUT BOOT_MENU_POPUP_DATA *BootMenuData
|
||||
)
|
||||
{
|
||||
INT32 SavedAttribute;
|
||||
EFI_STRING String;
|
||||
UINTN StartCol;
|
||||
UINTN StartRow;
|
||||
UINTN PrintCol;
|
||||
UINTN PrintRow;
|
||||
UINTN TopShadeNum;
|
||||
UINTN LowShadeNum;
|
||||
UINTN FirstItem;
|
||||
UINTN LastItem;
|
||||
UINTN ItemCountPerScreen;
|
||||
UINTN Index;
|
||||
BOOLEAN RePaintItems;
|
||||
INT32 SavedAttribute;
|
||||
EFI_STRING String;
|
||||
UINTN StartCol;
|
||||
UINTN StartRow;
|
||||
UINTN PrintCol;
|
||||
UINTN PrintRow;
|
||||
UINTN TopShadeNum;
|
||||
UINTN LowShadeNum;
|
||||
UINTN FirstItem;
|
||||
UINTN LastItem;
|
||||
UINTN ItemCountPerScreen;
|
||||
UINTN Index;
|
||||
BOOLEAN RePaintItems;
|
||||
|
||||
if (BootMenuData == NULL || WantSelectItem >= BootMenuData->ItemCount) {
|
||||
if ((BootMenuData == NULL) || (WantSelectItem >= BootMenuData->ItemCount)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ASSERT (BootMenuData->ItemCount != 0);
|
||||
SavedAttribute = gST->ConOut->Mode->Attribute;
|
||||
RePaintItems = FALSE;
|
||||
StartCol = BootMenuData->MenuScreen.StartCol;
|
||||
StartRow = BootMenuData->MenuScreen.StartRow;
|
||||
RePaintItems = FALSE;
|
||||
StartCol = BootMenuData->MenuScreen.StartCol;
|
||||
StartRow = BootMenuData->MenuScreen.StartRow;
|
||||
//
|
||||
// print selectable items again and adjust scroll bar if need
|
||||
//
|
||||
if (BootMenuData->ScrollBarControl.HasScrollBar &&
|
||||
(WantSelectItem < BootMenuData->ScrollBarControl.FirstItem ||
|
||||
WantSelectItem > BootMenuData->ScrollBarControl.LastItem ||
|
||||
WantSelectItem == BootMenuData->SelectItem)) {
|
||||
ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen;
|
||||
((WantSelectItem < BootMenuData->ScrollBarControl.FirstItem) ||
|
||||
(WantSelectItem > BootMenuData->ScrollBarControl.LastItem) ||
|
||||
(WantSelectItem == BootMenuData->SelectItem)))
|
||||
{
|
||||
ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen;
|
||||
//
|
||||
// Set first item and last item
|
||||
//
|
||||
if (WantSelectItem < BootMenuData->ScrollBarControl.FirstItem) {
|
||||
BootMenuData->ScrollBarControl.FirstItem = WantSelectItem;
|
||||
BootMenuData->ScrollBarControl.LastItem = WantSelectItem + ItemCountPerScreen - 1;
|
||||
BootMenuData->ScrollBarControl.LastItem = WantSelectItem + ItemCountPerScreen - 1;
|
||||
} else if (WantSelectItem > BootMenuData->ScrollBarControl.LastItem) {
|
||||
BootMenuData->ScrollBarControl.FirstItem = WantSelectItem - ItemCountPerScreen + 1;
|
||||
BootMenuData->ScrollBarControl.LastItem = WantSelectItem;
|
||||
BootMenuData->ScrollBarControl.LastItem = WantSelectItem;
|
||||
}
|
||||
|
||||
gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE);
|
||||
FirstItem = BootMenuData->ScrollBarControl.FirstItem;
|
||||
LastItem = BootMenuData->ScrollBarControl.LastItem;
|
||||
FirstItem = BootMenuData->ScrollBarControl.FirstItem;
|
||||
LastItem = BootMenuData->ScrollBarControl.LastItem;
|
||||
TopShadeNum = 0;
|
||||
if (FirstItem != 0) {
|
||||
TopShadeNum = (FirstItem * ItemCountPerScreen) / BootMenuData->ItemCount;
|
||||
if ((FirstItem * ItemCountPerScreen) % BootMenuData->ItemCount != 0) {
|
||||
TopShadeNum++;
|
||||
}
|
||||
|
||||
PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2;
|
||||
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2;
|
||||
for (Index = 0; Index < TopShadeNum; Index++, PrintRow++) {
|
||||
PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_LIGHT_SHADE);
|
||||
}
|
||||
}
|
||||
|
||||
LowShadeNum = 0;
|
||||
if (LastItem != BootMenuData->ItemCount - 1) {
|
||||
LowShadeNum = ((BootMenuData->ItemCount - 1 - LastItem) * ItemCountPerScreen) / BootMenuData->ItemCount;
|
||||
if (((BootMenuData->ItemCount - 1 - LastItem) * ItemCountPerScreen) % BootMenuData->ItemCount != 0) {
|
||||
LowShadeNum++;
|
||||
}
|
||||
|
||||
PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2;
|
||||
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + ItemCountPerScreen - LowShadeNum;
|
||||
for (Index = 0; Index < LowShadeNum; Index++, PrintRow++) {
|
||||
PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_LIGHT_SHADE);
|
||||
}
|
||||
}
|
||||
|
||||
PrintCol = StartCol + BootMenuData->MenuScreen.Width - 2;
|
||||
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + TopShadeNum;
|
||||
for (Index = TopShadeNum; Index < ItemCountPerScreen - LowShadeNum; Index++, PrintRow++) {
|
||||
PrintCharAt (PrintCol, PrintRow, BLOCKELEMENT_FULL_BLOCK);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Clear selectable items first
|
||||
//
|
||||
PrintCol = StartCol + 1;
|
||||
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);
|
||||
for (Index = 0; Index < BootMenuData->MenuScreen.Width - 3; Index++) {
|
||||
String[Index] = 0x20;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < ItemCountPerScreen; Index++) {
|
||||
PrintStringAt (PrintCol, PrintRow + Index, String);
|
||||
}
|
||||
|
||||
FreePool (String);
|
||||
//
|
||||
// print selectable items
|
||||
@ -513,6 +529,7 @@ BootMenuSelectItem (
|
||||
PrintStringAt (PrintCol, PrintRow, String);
|
||||
FreePool (String);
|
||||
}
|
||||
|
||||
RePaintItems = TRUE;
|
||||
}
|
||||
|
||||
@ -521,9 +538,9 @@ BootMenuSelectItem (
|
||||
// items, clear select item
|
||||
//
|
||||
FirstItem = BootMenuData->ScrollBarControl.FirstItem;
|
||||
if (WantSelectItem != BootMenuData->SelectItem && !RePaintItems) {
|
||||
if ((WantSelectItem != BootMenuData->SelectItem) && !RePaintItems) {
|
||||
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;
|
||||
PrintRow = StartRow + 3 + BootMenuData->SelectItem - FirstItem;
|
||||
PrintStringAt (PrintCol, PrintRow, String);
|
||||
@ -534,7 +551,7 @@ BootMenuSelectItem (
|
||||
// Print want to select item
|
||||
//
|
||||
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;
|
||||
PrintRow = StartRow + TITLE_TOKEN_COUNT + 2 + WantSelectItem - FirstItem;
|
||||
PrintStringAt (PrintCol, PrintRow, String);
|
||||
@ -558,26 +575,26 @@ DrawBootPopupMenu (
|
||||
IN BOOT_MENU_POPUP_DATA *BootMenuData
|
||||
)
|
||||
{
|
||||
EFI_STRING String;
|
||||
UINTN Index;
|
||||
UINTN Width;
|
||||
UINTN StartCol;
|
||||
UINTN StartRow;
|
||||
UINTN PrintRow;
|
||||
UINTN PrintCol;
|
||||
UINTN LineWidth;
|
||||
INT32 SavedAttribute;
|
||||
UINTN ItemCountPerScreen;
|
||||
EFI_STRING String;
|
||||
UINTN Index;
|
||||
UINTN Width;
|
||||
UINTN StartCol;
|
||||
UINTN StartRow;
|
||||
UINTN PrintRow;
|
||||
UINTN PrintCol;
|
||||
UINTN LineWidth;
|
||||
INT32 SavedAttribute;
|
||||
UINTN ItemCountPerScreen;
|
||||
|
||||
gST->ConOut->ClearScreen (gST->ConOut);
|
||||
|
||||
SavedAttribute = gST->ConOut->Mode->Attribute;
|
||||
gST->ConOut->SetAttribute (gST->ConOut, EFI_WHITE | EFI_BACKGROUND_BLUE);
|
||||
Width = BootMenuData->MenuScreen.Width;
|
||||
StartCol = BootMenuData->MenuScreen.StartCol;
|
||||
StartRow = BootMenuData->MenuScreen.StartRow;
|
||||
Width = BootMenuData->MenuScreen.Width;
|
||||
StartCol = BootMenuData->MenuScreen.StartCol;
|
||||
StartRow = BootMenuData->MenuScreen.StartRow;
|
||||
ItemCountPerScreen = BootMenuData->ScrollBarControl.ItemCountPerScreen;
|
||||
PrintRow = StartRow;
|
||||
PrintRow = StartRow;
|
||||
|
||||
gST->ConOut->EnableCursor (gST->ConOut, FALSE);
|
||||
//
|
||||
@ -587,6 +604,7 @@ DrawBootPopupMenu (
|
||||
for (Index = 1; Index < Width - 1; Index++) {
|
||||
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
|
||||
}
|
||||
|
||||
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_DOWN_LEFT);
|
||||
|
||||
//
|
||||
@ -610,6 +628,7 @@ DrawBootPopupMenu (
|
||||
for (Index = 1; Index < Width - 1; Index++) {
|
||||
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
|
||||
}
|
||||
|
||||
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL_LEFT);
|
||||
|
||||
//
|
||||
@ -627,6 +646,7 @@ DrawBootPopupMenu (
|
||||
for (Index = 1; Index < Width - 1; Index++) {
|
||||
PrintCharAt (StartCol + Index, PrintRow, BOXDRAW_HORIZONTAL);
|
||||
}
|
||||
|
||||
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL_LEFT);
|
||||
|
||||
//
|
||||
@ -638,6 +658,7 @@ DrawBootPopupMenu (
|
||||
PrintStringAt (StartCol + 1, PrintRow, String);
|
||||
PrintCharAt (StartCol + Width - 1, PrintRow, BOXDRAW_VERTICAL);
|
||||
}
|
||||
|
||||
FreePool (String);
|
||||
|
||||
PrintRow++;
|
||||
@ -645,17 +666,17 @@ DrawBootPopupMenu (
|
||||
for (Index = 1; Index < Width - 1; Index++) {
|
||||
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
|
||||
//
|
||||
PrintRow = StartRow + 1;
|
||||
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]);
|
||||
PrintCol = StartCol + (Width - LineWidth) / 2;
|
||||
PrintCol = StartCol + (Width - LineWidth) / 2;
|
||||
PrintStringAt (PrintCol, PrintRow, String);
|
||||
FreePool (String);
|
||||
}
|
||||
@ -676,9 +697,9 @@ DrawBootPopupMenu (
|
||||
//
|
||||
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]);
|
||||
PrintCol = StartCol + (Width - LineWidth) / 2;
|
||||
PrintCol = StartCol + (Width - LineWidth) / 2;
|
||||
PrintStringAt (PrintCol, PrintRow, String);
|
||||
FreePool (String);
|
||||
}
|
||||
@ -718,8 +739,8 @@ BootFromSelectOption (
|
||||
IN UINTN SelectItem
|
||||
)
|
||||
{
|
||||
UINTN ItemNum;
|
||||
UINTN Index;
|
||||
UINTN ItemNum;
|
||||
UINTN Index;
|
||||
|
||||
ASSERT (BootOptions != NULL);
|
||||
|
||||
@ -778,7 +799,7 @@ BdsSetConsoleMode (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiGraphicsOutputProtocolGuid,
|
||||
(VOID**)&GraphicsOutput
|
||||
(VOID **)&GraphicsOutput
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
GraphicsOutput = NULL;
|
||||
@ -787,7 +808,7 @@ BdsSetConsoleMode (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
(VOID**)&SimpleTextOut
|
||||
(VOID **)&SimpleTextOut
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
SimpleTextOut = NULL;
|
||||
@ -816,7 +837,7 @@ BdsSetConsoleMode (
|
||||
}
|
||||
|
||||
if (GraphicsOutput != NULL) {
|
||||
MaxGopMode = GraphicsOutput->Mode->MaxMode;
|
||||
MaxGopMode = GraphicsOutput->Mode->MaxMode;
|
||||
}
|
||||
|
||||
if (SimpleTextOut != NULL) {
|
||||
@ -832,22 +853,24 @@ BdsSetConsoleMode (
|
||||
//
|
||||
for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {
|
||||
Status = GraphicsOutput->QueryMode (
|
||||
GraphicsOutput,
|
||||
ModeNumber,
|
||||
&SizeOfInfo,
|
||||
&Info
|
||||
);
|
||||
GraphicsOutput,
|
||||
ModeNumber,
|
||||
&SizeOfInfo,
|
||||
&Info
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if ((Info->HorizontalResolution == NewHorizontalResolution) &&
|
||||
(Info->VerticalResolution == NewVerticalResolution)) {
|
||||
(Info->VerticalResolution == NewVerticalResolution))
|
||||
{
|
||||
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
|
||||
//
|
||||
Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);
|
||||
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
|
||||
//
|
||||
@ -859,7 +882,7 @@ BdsSetConsoleMode (
|
||||
//
|
||||
for (Index = 0; Index < MaxTextMode; Index++) {
|
||||
Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {
|
||||
//
|
||||
// Required text mode is supported, set it.
|
||||
@ -878,6 +901,7 @@ BdsSetConsoleMode (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Index == MaxTextMode) {
|
||||
//
|
||||
// If required text mode is not supported, return error.
|
||||
@ -898,6 +922,7 @@ BdsSetConsoleMode (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (Info);
|
||||
}
|
||||
}
|
||||
@ -928,19 +953,21 @@ BdsSetConsoleMode (
|
||||
// Locate all the handles with GOP protocol and reconnect it.
|
||||
//
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
ByProtocol,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
|
||||
}
|
||||
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
|
||||
}
|
||||
|
||||
if (HandleBuffer != NULL) {
|
||||
FreePool (HandleBuffer);
|
||||
}
|
||||
@ -962,29 +989,29 @@ BdsSetConsoleMode (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
BootManagerMenuEntry (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_BOOT_MANAGER_LOAD_OPTION *BootOption;
|
||||
UINTN BootOptionCount;
|
||||
EFI_STATUS Status;
|
||||
BOOT_MENU_POPUP_DATA BootMenuData;
|
||||
UINTN Index;
|
||||
EFI_INPUT_KEY Key;
|
||||
BOOLEAN ExitApplication;
|
||||
UINTN SelectItem;
|
||||
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
|
||||
UINTN BootTextColumn;
|
||||
UINTN BootTextRow;
|
||||
EFI_BOOT_MANAGER_LOAD_OPTION *BootOption;
|
||||
UINTN BootOptionCount;
|
||||
EFI_STATUS Status;
|
||||
BOOT_MENU_POPUP_DATA BootMenuData;
|
||||
UINTN Index;
|
||||
EFI_INPUT_KEY Key;
|
||||
BOOLEAN ExitApplication;
|
||||
UINTN SelectItem;
|
||||
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
|
||||
UINTN BootTextColumn;
|
||||
UINTN BootTextRow;
|
||||
|
||||
//
|
||||
// Set Logo status invalid when boot manager menu is launched
|
||||
//
|
||||
BootLogo = NULL;
|
||||
Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **) &BootLogo);
|
||||
Status = gBS->LocateProtocol (&gEfiBootLogoProtocolGuid, NULL, (VOID **)&BootLogo);
|
||||
if (!EFI_ERROR (Status) && (BootLogo != NULL)) {
|
||||
Status = BootLogo->SetBootLogo (BootLogo, NULL, 0, 0, 0, 0);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@ -993,11 +1020,11 @@ BootManagerMenuEntry (
|
||||
gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
|
||||
|
||||
gStringPackHandle = HiiAddPackages (
|
||||
&gEfiCallerIdGuid,
|
||||
gImageHandle,
|
||||
BootManagerMenuAppStrings,
|
||||
NULL
|
||||
);
|
||||
&gEfiCallerIdGuid,
|
||||
gImageHandle,
|
||||
BootManagerMenuAppStrings,
|
||||
NULL
|
||||
);
|
||||
ASSERT (gStringPackHandle != NULL);
|
||||
|
||||
//
|
||||
@ -1016,7 +1043,7 @@ BootManagerMenuEntry (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiGraphicsOutputProtocolGuid,
|
||||
(VOID**)&GraphicsOutput
|
||||
(VOID **)&GraphicsOutput
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
GraphicsOutput = NULL;
|
||||
@ -1025,7 +1052,7 @@ BootManagerMenuEntry (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
(VOID**)&SimpleTextOut
|
||||
(VOID **)&SimpleTextOut
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
SimpleTextOut = NULL;
|
||||
@ -1083,58 +1110,57 @@ BootManagerMenuEntry (
|
||||
Status = gST->ConIn->ReadKeyStroke (gST->ConIn, &Key);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
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:
|
||||
switch (Key.ScanCode) {
|
||||
case SCAN_DOWN:
|
||||
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;
|
||||
|
||||
case SCAN_DOWN:
|
||||
SelectItem = BootMenuData.SelectItem == BootMenuData.ItemCount - 1 ? 0 : BootMenuData.SelectItem + 1;
|
||||
BootMenuSelectItem (SelectItem, &BootMenuData);
|
||||
break;
|
||||
|
||||
case SCAN_ESC:
|
||||
case CHAR_CARRIAGE_RETURN:
|
||||
gST->ConOut->ClearScreen (gST->ConOut);
|
||||
ExitApplication = TRUE;
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
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);
|
||||
FreePool (BootMenuData.PtrTokens);
|
||||
|
||||
HiiRemovePackages (gStringPackHandle);
|
||||
|
||||
return Status;
|
||||
|
||||
}
|
||||
|
@ -6,7 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef _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/BootLogo.h>
|
||||
|
||||
#define TITLE_TOKEN_COUNT 1
|
||||
#define HELP_TOKEN_COUNT 3
|
||||
#define TITLE_TOKEN_COUNT 1
|
||||
#define HELP_TOKEN_COUNT 3
|
||||
|
||||
typedef struct _BOOT_MENU_SCREEN {
|
||||
UINTN StartCol;
|
||||
UINTN StartRow;
|
||||
UINTN Width;
|
||||
UINTN Height;
|
||||
UINTN StartCol;
|
||||
UINTN StartRow;
|
||||
UINTN Width;
|
||||
UINTN Height;
|
||||
} BOOT_MENU_SCREEN;
|
||||
|
||||
typedef struct _BOOT_MENU_SCROLL_BAR_CONTROL {
|
||||
BOOLEAN HasScrollBar;
|
||||
UINTN ItemCountPerScreen;
|
||||
UINTN FirstItem;
|
||||
UINTN LastItem;
|
||||
BOOLEAN HasScrollBar;
|
||||
UINTN ItemCountPerScreen;
|
||||
UINTN FirstItem;
|
||||
UINTN LastItem;
|
||||
} BOOT_MENU_SCROLL_BAR_CONTROL;
|
||||
|
||||
typedef struct _BOOT_MENU_POPUP_DATA {
|
||||
@ -51,4 +50,3 @@ typedef struct _BOOT_MENU_POPUP_DATA {
|
||||
} BOOT_MENU_POPUP_DATA;
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -8,9 +8,9 @@
|
||||
|
||||
#include "CapsuleApp.h"
|
||||
|
||||
UINTN Argc;
|
||||
CHAR16 **Argv;
|
||||
EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
|
||||
UINTN Argc;
|
||||
CHAR16 **Argv;
|
||||
EFI_SHELL_PROTOCOL *mShellProtocol = NULL;
|
||||
|
||||
/**
|
||||
|
||||
@ -23,15 +23,15 @@ GetArg (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||
|
||||
Status = gBS->HandleProtocol (
|
||||
gImageHandle,
|
||||
&gEfiShellParametersProtocolGuid,
|
||||
(VOID**)&ShellParameters
|
||||
(VOID **)&ShellParameters
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -50,13 +50,13 @@ GetShellProtocol (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (mShellProtocol == NULL) {
|
||||
Status = gBS->LocateProtocol (
|
||||
&gEfiShellProtocolGuid,
|
||||
NULL,
|
||||
(VOID **) &mShellProtocol
|
||||
(VOID **)&mShellProtocol
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
mShellProtocol = NULL;
|
||||
@ -79,19 +79,19 @@ GetShellProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadFileToBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
UINT64 FileSize;
|
||||
UINTN TempBufferSize;
|
||||
VOID *TempBuffer;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
UINT64 FileSize;
|
||||
UINTN TempBufferSize;
|
||||
VOID *TempBuffer;
|
||||
|
||||
ShellProtocol = GetShellProtocol();
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
@ -117,8 +117,8 @@ ReadFileToBuffer (
|
||||
return Status;
|
||||
}
|
||||
|
||||
TempBufferSize = (UINTN) FileSize;
|
||||
TempBuffer = AllocateZeroPool (TempBufferSize);
|
||||
TempBufferSize = (UINTN)FileSize;
|
||||
TempBuffer = AllocateZeroPool (TempBufferSize);
|
||||
if (TempBuffer == NULL) {
|
||||
ShellProtocol->CloseFile (Handle);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -157,18 +157,18 @@ ReadFileToBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteFileFromBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
UINTN TempBufferSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
UINTN TempBufferSize;
|
||||
|
||||
ShellProtocol = GetShellProtocol();
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
@ -202,24 +202,25 @@ WriteFileFromBuffer (
|
||||
// Set the file size to 0.
|
||||
//
|
||||
FileInfo->FileSize = 0;
|
||||
Status = ShellProtocol->SetFileInfo (Handle, FileInfo);
|
||||
Status = ShellProtocol->SetFileInfo (Handle, FileInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
FreePool (FileInfo);
|
||||
ShellProtocol->CloseFile (Handle);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (FileInfo);
|
||||
|
||||
//
|
||||
// Write the file data from the buffer
|
||||
//
|
||||
TempBufferSize = BufferSize;
|
||||
Status = ShellProtocol->WriteFile (
|
||||
Handle,
|
||||
&TempBufferSize,
|
||||
Buffer
|
||||
);
|
||||
Status = ShellProtocol->WriteFile (
|
||||
Handle,
|
||||
&TempBufferSize,
|
||||
Buffer
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ShellProtocol->CloseFile (Handle);
|
||||
return Status;
|
||||
@ -229,4 +230,3 @@ WriteFileFromBuffer (
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
@ -27,52 +27,54 @@ CreateBmpFmp (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *BmpBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *BmpName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_DISPLAY_CAPSULE *DisplayCapsule;
|
||||
EFI_STATUS Status;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
|
||||
UINTN GopBltSize;
|
||||
UINTN Height;
|
||||
UINTN Width;
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *BmpBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *BmpName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_DISPLAY_CAPSULE *DisplayCapsule;
|
||||
EFI_STATUS Status;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
|
||||
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *Info;
|
||||
EFI_GRAPHICS_OUTPUT_BLT_PIXEL *GopBlt;
|
||||
UINTN GopBltSize;
|
||||
UINTN Height;
|
||||
UINTN Width;
|
||||
|
||||
Status = gBS->LocateProtocol(&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: NO GOP is found.\n");
|
||||
Status = gBS->LocateProtocol (&gEfiGraphicsOutputProtocolGuid, NULL, (VOID **)&Gop);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: NO GOP is found.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
Info = Gop->Mode->Info;
|
||||
Print(L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
|
||||
Print(L"HorizontalResolution - %d, ", Info->HorizontalResolution);
|
||||
Print(L"VerticalResolution - %d\n", Info->VerticalResolution);
|
||||
Print (L"Current GOP: Mode - %d, ", Gop->Mode->Mode);
|
||||
Print (L"HorizontalResolution - %d, ", Info->HorizontalResolution);
|
||||
Print (L"VerticalResolution - %d\n", Info->VerticalResolution);
|
||||
// HorizontalResolution >= BMP_IMAGE_HEADER.PixelWidth
|
||||
// VerticalResolution >= BMP_IMAGE_HEADER.PixelHeight
|
||||
|
||||
if (Argc != 5) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[3], L"-O") != 0) {
|
||||
Print(L"CapsuleApp: NO output capsule name.\n");
|
||||
if (StrCmp (Argv[3], L"-O") != 0) {
|
||||
Print (L"CapsuleApp: NO output capsule name.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
OutputCapsuleName = Argv[4];
|
||||
|
||||
BmpBuffer = NULL;
|
||||
FileSize = 0;
|
||||
BmpBuffer = NULL;
|
||||
FileSize = 0;
|
||||
FullCapsuleBuffer = NULL;
|
||||
|
||||
BmpName = Argv[2];
|
||||
Status = ReadFileToBuffer(BmpName, &FileSize, &BmpBuffer);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: BMP image (%s) is not found.\n", BmpName);
|
||||
Status = ReadFileToBuffer (BmpName, &FileSize, &BmpBuffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: BMP image (%s) is not found.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@ -85,45 +87,48 @@ CreateBmpFmp (
|
||||
&Height,
|
||||
&Width
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: BMP image (%s) is not valid.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if (GopBlt != NULL) {
|
||||
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) {
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
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);
|
||||
Print (L"CapsuleApp: BMP image (%s) height is larger than current resolution.\n", BmpName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
FullCapsuleBufferSize = sizeof(EFI_DISPLAY_CAPSULE) + FileSize;
|
||||
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
|
||||
if (Width > Info->HorizontalResolution) {
|
||||
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) {
|
||||
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;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
DisplayCapsule = (EFI_DISPLAY_CAPSULE *)FullCapsuleBuffer;
|
||||
CopyGuid(&DisplayCapsule->CapsuleHeader.CapsuleGuid, &gWindowsUxCapsuleGuid);
|
||||
DisplayCapsule->CapsuleHeader.HeaderSize = sizeof(DisplayCapsule->CapsuleHeader);
|
||||
DisplayCapsule->CapsuleHeader.Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
|
||||
CopyGuid (&DisplayCapsule->CapsuleHeader.CapsuleGuid, &gWindowsUxCapsuleGuid);
|
||||
DisplayCapsule->CapsuleHeader.HeaderSize = sizeof (DisplayCapsule->CapsuleHeader);
|
||||
DisplayCapsule->CapsuleHeader.Flags = CAPSULE_FLAGS_PERSIST_ACROSS_RESET;
|
||||
DisplayCapsule->CapsuleHeader.CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
|
||||
|
||||
DisplayCapsule->ImagePayload.Version = 1;
|
||||
DisplayCapsule->ImagePayload.Checksum = 0;
|
||||
DisplayCapsule->ImagePayload.Version = 1;
|
||||
DisplayCapsule->ImagePayload.Checksum = 0;
|
||||
DisplayCapsule->ImagePayload.ImageType = 0; // BMP
|
||||
DisplayCapsule->ImagePayload.Reserved = 0;
|
||||
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
|
||||
DisplayCapsule->ImagePayload.Reserved = 0;
|
||||
DisplayCapsule->ImagePayload.Mode = Gop->Mode->Mode;
|
||||
|
||||
//
|
||||
// Center the bitmap horizontally
|
||||
@ -140,26 +145,27 @@ CreateBmpFmp (
|
||||
(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,
|
||||
DisplayCapsule->ImagePayload.OffsetX,
|
||||
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);
|
||||
Print(L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
Status = WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print (L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
|
||||
Done:
|
||||
if (BmpBuffer != NULL) {
|
||||
FreePool(BmpBuffer);
|
||||
FreePool (BmpBuffer);
|
||||
}
|
||||
|
||||
if (FullCapsuleBuffer != NULL) {
|
||||
FreePool(FullCapsuleBuffer);
|
||||
FreePool (FullCapsuleBuffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@ -174,18 +180,19 @@ Done:
|
||||
**/
|
||||
EFI_GUID *
|
||||
GetCapsuleImageTypeId (
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader
|
||||
)
|
||||
{
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;
|
||||
UINT64 *ItemOffsetList;
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *FmpCapsuleHeader;
|
||||
UINT64 *ItemOffsetList;
|
||||
EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *ImageHeader;
|
||||
|
||||
FmpCapsuleHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_HEADER *)((UINT8 *)CapsuleHeader + CapsuleHeader->HeaderSize);
|
||||
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);
|
||||
ItemOffsetList = (UINT64 *)(FmpCapsuleHeader + 1);
|
||||
if (FmpCapsuleHeader->PayloadItemCount == 0) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ImageHeader = (EFI_FIRMWARE_MANAGEMENT_CAPSULE_IMAGE_HEADER *)((UINT8 *)FmpCapsuleHeader + ItemOffsetList[FmpCapsuleHeader->EmbeddedDriverCount]);
|
||||
return &ImageHeader->UpdateImageTypeId;
|
||||
}
|
||||
@ -199,7 +206,7 @@ GetCapsuleImageTypeId (
|
||||
**/
|
||||
UINT32
|
||||
GetEsrtFwType (
|
||||
IN EFI_GUID *ImageTypeId
|
||||
IN EFI_GUID *ImageTypeId
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -210,12 +217,12 @@ GetEsrtFwType (
|
||||
//
|
||||
// Check ESRT
|
||||
//
|
||||
Status = EfiGetSystemConfigurationTable(&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
ASSERT(Esrt != NULL);
|
||||
Status = EfiGetSystemConfigurationTable (&gEfiSystemResourceTableGuid, (VOID **)&Esrt);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
ASSERT (Esrt != NULL);
|
||||
EsrtEntry = (VOID *)(Esrt + 1);
|
||||
for (Index = 0; Index < Esrt->FwResourceCount; Index++, EsrtEntry++) {
|
||||
if (CompareGuid(&EsrtEntry->FwClass, ImageTypeId)) {
|
||||
if (CompareGuid (&EsrtEntry->FwClass, ImageTypeId)) {
|
||||
return EsrtEntry->FwType;
|
||||
}
|
||||
}
|
||||
@ -238,19 +245,22 @@ GetEsrtFwType (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsValidCapsuleHeader (
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader,
|
||||
IN UINT64 CapsuleSize
|
||||
IN EFI_CAPSULE_HEADER *CapsuleHeader,
|
||||
IN UINT64 CapsuleSize
|
||||
)
|
||||
{
|
||||
if (CapsuleSize < sizeof (EFI_CAPSULE_HEADER)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (CapsuleHeader->CapsuleImageSize != CapsuleSize) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (CapsuleHeader->HeaderSize > CapsuleHeader->CapsuleImageSize) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (CapsuleHeader->HeaderSize < sizeof (EFI_CAPSULE_HEADER)) {
|
||||
return FALSE;
|
||||
}
|
||||
@ -271,7 +281,7 @@ IsFmpCapsuleGuid (
|
||||
IN EFI_GUID *CapsuleGuid
|
||||
)
|
||||
{
|
||||
if (CompareGuid(&gEfiFmpCapsuleGuid, CapsuleGuid)) {
|
||||
if (CompareGuid (&gEfiFmpCapsuleGuid, CapsuleGuid)) {
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -291,96 +301,98 @@ CreateNestedFmp (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *CapsuleBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *CapsuleName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_CAPSULE_HEADER *NestedCapsuleHeader;
|
||||
EFI_GUID *ImageTypeId;
|
||||
UINT32 FwType;
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *OutputCapsuleName;
|
||||
VOID *CapsuleBuffer;
|
||||
UINTN FileSize;
|
||||
CHAR16 *CapsuleName;
|
||||
UINT8 *FullCapsuleBuffer;
|
||||
UINTN FullCapsuleBufferSize;
|
||||
EFI_CAPSULE_HEADER *NestedCapsuleHeader;
|
||||
EFI_GUID *ImageTypeId;
|
||||
UINT32 FwType;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (Argc != 5) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[3], L"-O") != 0) {
|
||||
Print(L"CapsuleApp: NO output capsule name.\n");
|
||||
if (StrCmp (Argv[3], L"-O") != 0) {
|
||||
Print (L"CapsuleApp: NO output capsule name.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
OutputCapsuleName = Argv[4];
|
||||
|
||||
CapsuleBuffer = NULL;
|
||||
FileSize = 0;
|
||||
CapsuleBuffer = NULL;
|
||||
FileSize = 0;
|
||||
FullCapsuleBuffer = NULL;
|
||||
|
||||
CapsuleName = Argv[2];
|
||||
Status = ReadFileToBuffer(CapsuleName, &FileSize, &CapsuleBuffer);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);
|
||||
Status = ReadFileToBuffer (CapsuleName, &FileSize, &CapsuleBuffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: Capsule image (%s) is not found.\n", CapsuleName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
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;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *) CapsuleBuffer)->CapsuleGuid)) {
|
||||
Print(L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);
|
||||
if (!IsFmpCapsuleGuid (&((EFI_CAPSULE_HEADER *)CapsuleBuffer)->CapsuleGuid)) {
|
||||
Print (L"CapsuleApp: Capsule image (%s) is not a FMP capsule.\n", CapsuleName);
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
ImageTypeId = GetCapsuleImageTypeId(CapsuleBuffer);
|
||||
ImageTypeId = GetCapsuleImageTypeId (CapsuleBuffer);
|
||||
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;
|
||||
goto Done;
|
||||
}
|
||||
FwType = GetEsrtFwType(ImageTypeId);
|
||||
|
||||
FwType = GetEsrtFwType (ImageTypeId);
|
||||
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;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
FullCapsuleBufferSize = NESTED_CAPSULE_HEADER_SIZE + FileSize;
|
||||
FullCapsuleBuffer = AllocatePool(FullCapsuleBufferSize);
|
||||
FullCapsuleBuffer = AllocatePool (FullCapsuleBufferSize);
|
||||
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;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
NestedCapsuleHeader = (EFI_CAPSULE_HEADER *)FullCapsuleBuffer;
|
||||
ZeroMem(NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);
|
||||
CopyGuid(&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);
|
||||
NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;
|
||||
NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;
|
||||
ZeroMem (NestedCapsuleHeader, NESTED_CAPSULE_HEADER_SIZE);
|
||||
CopyGuid (&NestedCapsuleHeader->CapsuleGuid, ImageTypeId);
|
||||
NestedCapsuleHeader->HeaderSize = NESTED_CAPSULE_HEADER_SIZE;
|
||||
NestedCapsuleHeader->Flags = (FwType == ESRT_FW_TYPE_SYSTEMFIRMWARE) ? SYSTEM_FIRMWARE_FLAG : DEVICE_FIRMWARE_FLAG;
|
||||
NestedCapsuleHeader->CapsuleImageSize = (UINT32)FullCapsuleBufferSize;
|
||||
|
||||
CopyMem((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);
|
||||
CopyMem ((UINT8 *)NestedCapsuleHeader + NestedCapsuleHeader->HeaderSize, CapsuleBuffer, FileSize);
|
||||
|
||||
Status = WriteFileFromBuffer(OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print(L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
Status = WriteFileFromBuffer (OutputCapsuleName, FullCapsuleBufferSize, FullCapsuleBuffer);
|
||||
Print (L"CapsuleApp: Write %s %r\n", OutputCapsuleName, Status);
|
||||
|
||||
Done:
|
||||
if (CapsuleBuffer != NULL) {
|
||||
FreePool(CapsuleBuffer);
|
||||
FreePool (CapsuleBuffer);
|
||||
}
|
||||
|
||||
if (FullCapsuleBuffer != NULL) {
|
||||
FreePool(FullCapsuleBuffer);
|
||||
FreePool (FullCapsuleBuffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Clear capsule status variable.
|
||||
|
||||
@ -391,19 +403,19 @@ ClearCapsuleStatusVariable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
CHAR16 CapsuleVarName[20];
|
||||
CHAR16 *TempVarName;
|
||||
BOOLEAN Found;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
CHAR16 CapsuleVarName[20];
|
||||
CHAR16 *TempVarName;
|
||||
BOOLEAN Found;
|
||||
|
||||
StrCpyS (CapsuleVarName, sizeof(CapsuleVarName)/sizeof(CapsuleVarName[0]), L"Capsule");
|
||||
StrCpyS (CapsuleVarName, sizeof (CapsuleVarName)/sizeof (CapsuleVarName[0]), L"Capsule");
|
||||
TempVarName = CapsuleVarName + StrLen (CapsuleVarName);
|
||||
Index = 0;
|
||||
Index = 0;
|
||||
|
||||
Found = FALSE;
|
||||
while (TRUE) {
|
||||
UnicodeSPrint (TempVarName, 5 * sizeof(CHAR16), L"%04x", Index);
|
||||
UnicodeSPrint (TempVarName, 5 * sizeof (CHAR16), L"%04x", Index);
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
CapsuleVarName,
|
||||
@ -418,6 +430,7 @@ ClearCapsuleStatusVariable (
|
||||
//
|
||||
break;
|
||||
}
|
||||
|
||||
Found = TRUE;
|
||||
|
||||
Print (L"Clear %s %r\n", CapsuleVarName, Status);
|
||||
@ -447,10 +460,10 @@ ClearCapsuleStatusVariable (
|
||||
**/
|
||||
EFI_STATUS
|
||||
BuildGatherList (
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *FileSize,
|
||||
IN UINTN CapsuleNum,
|
||||
OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *FileSize,
|
||||
IN UINTN CapsuleNum,
|
||||
OUT EFI_CAPSULE_BLOCK_DESCRIPTOR **BlockDescriptors
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -482,15 +495,15 @@ BuildGatherList (
|
||||
Count = (INT32)(NumberOfDescriptors + 2) / 2;
|
||||
}
|
||||
|
||||
Size = Count * sizeof (EFI_CAPSULE_BLOCK_DESCRIPTOR);
|
||||
BlockDescriptors1 = AllocateRuntimeZeroPool (Size);
|
||||
Size = Count * sizeof (EFI_CAPSULE_BLOCK_DESCRIPTOR);
|
||||
BlockDescriptors1 = AllocateRuntimeZeroPool (Size);
|
||||
if (BlockDescriptors1 == NULL) {
|
||||
Print (L"CapsuleApp: failed to allocate memory for descriptors\n");
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ERREXIT;
|
||||
} else {
|
||||
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: 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]);
|
||||
}
|
||||
|
||||
//
|
||||
@ -501,16 +514,16 @@ BuildGatherList (
|
||||
}
|
||||
|
||||
if (BlockDescriptorPre != NULL) {
|
||||
BlockDescriptorPre->Union.ContinuationPointer = (UINTN) BlockDescriptors1;
|
||||
BlockDescriptorPre->Length = 0;
|
||||
BlockDescriptorPre->Union.ContinuationPointer = (UINTN)BlockDescriptors1;
|
||||
BlockDescriptorPre->Length = 0;
|
||||
}
|
||||
|
||||
//
|
||||
// Fill them in
|
||||
//
|
||||
TempBlockPtr = BlockDescriptors1;
|
||||
TempDataPtr = CapsuleBuffer[Index];
|
||||
SizeLeft = FileSize[Index];
|
||||
TempBlockPtr = BlockDescriptors1;
|
||||
TempDataPtr = CapsuleBuffer[Index];
|
||||
SizeLeft = FileSize[Index];
|
||||
for (Number = 0; (Number < Count - 1) && (SizeLeft != 0); Number++) {
|
||||
//
|
||||
// Divide remaining data in half
|
||||
@ -524,10 +537,11 @@ BuildGatherList (
|
||||
} else {
|
||||
Size = SizeLeft;
|
||||
}
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN) TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN)TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
TempDataPtr += Size;
|
||||
TempBlockPtr++;
|
||||
}
|
||||
@ -555,10 +569,10 @@ BuildGatherList (
|
||||
//
|
||||
// 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 = BlockDescriptors2;
|
||||
TempBlockPtr->Length = 0;
|
||||
TempBlockPtr = BlockDescriptors2;
|
||||
for (Number = 0; Number < Count - 1; Number++) {
|
||||
//
|
||||
// If second-to-last one, then dump rest to this element
|
||||
@ -576,10 +590,10 @@ BuildGatherList (
|
||||
}
|
||||
}
|
||||
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN) TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
TempBlockPtr->Union.DataBlock = (UINTN)TempDataPtr;
|
||||
TempBlockPtr->Length = Size;
|
||||
Print (L"CapsuleApp: capsule block/size 0x%X/0x%X\n", (UINTN)TempDataPtr, Size);
|
||||
SizeLeft -= Size;
|
||||
TempDataPtr += Size;
|
||||
TempBlockPtr++;
|
||||
if (SizeLeft == 0) {
|
||||
@ -596,20 +610,20 @@ BuildGatherList (
|
||||
// Null-terminate.
|
||||
//
|
||||
if (TempBlockPtr != NULL) {
|
||||
TempBlockPtr->Union.ContinuationPointer = (UINTN)NULL;
|
||||
TempBlockPtr->Length = 0;
|
||||
*BlockDescriptors = BlockDescriptorsHeader;
|
||||
TempBlockPtr->Union.ContinuationPointer = (UINTN)NULL;
|
||||
TempBlockPtr->Length = 0;
|
||||
*BlockDescriptors = BlockDescriptorsHeader;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
ERREXIT:
|
||||
if (BlockDescriptors1 != NULL) {
|
||||
FreePool(BlockDescriptors1);
|
||||
FreePool (BlockDescriptors1);
|
||||
}
|
||||
|
||||
if (BlockDescriptors2 != NULL) {
|
||||
FreePool(BlockDescriptors2);
|
||||
FreePool (BlockDescriptors2);
|
||||
}
|
||||
|
||||
return Status;
|
||||
@ -623,18 +637,18 @@ ERREXIT:
|
||||
**/
|
||||
VOID
|
||||
CleanGatherList (
|
||||
IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors,
|
||||
IN UINTN CapsuleNum
|
||||
IN EFI_CAPSULE_BLOCK_DESCRIPTOR *BlockDescriptors,
|
||||
IN UINTN CapsuleNum
|
||||
)
|
||||
{
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr1;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr2;
|
||||
UINTN Index;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr1;
|
||||
EFI_CAPSULE_BLOCK_DESCRIPTOR *TempBlockPtr2;
|
||||
UINTN Index;
|
||||
|
||||
if (BlockDescriptors != NULL) {
|
||||
TempBlockPtr1 = BlockDescriptors;
|
||||
while (1){
|
||||
while (1) {
|
||||
TempBlockPtr = TempBlockPtr1;
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
if (TempBlockPtr[Index].Length == 0) {
|
||||
@ -646,8 +660,8 @@ CleanGatherList (
|
||||
break;
|
||||
}
|
||||
|
||||
TempBlockPtr2 = (VOID *) ((UINTN) TempBlockPtr[Index].Union.ContinuationPointer);
|
||||
FreePool(TempBlockPtr1);
|
||||
TempBlockPtr2 = (VOID *)((UINTN)TempBlockPtr[Index].Union.ContinuationPointer);
|
||||
FreePool (TempBlockPtr1);
|
||||
TempBlockPtr1 = TempBlockPtr2;
|
||||
}
|
||||
}
|
||||
@ -661,42 +675,42 @@ PrintUsage (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
Print(L"CapsuleApp: usage\n");
|
||||
Print(L" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n");
|
||||
Print(L" CapsuleApp -S\n");
|
||||
Print(L" CapsuleApp -C\n");
|
||||
Print(L" CapsuleApp -P\n");
|
||||
Print(L" CapsuleApp -E\n");
|
||||
Print(L" CapsuleApp -L\n");
|
||||
Print(L" CapsuleApp -L INFO\n");
|
||||
Print(L" CapsuleApp -F\n");
|
||||
Print(L" CapsuleApp -G <BMP> -O <Capsule>\n");
|
||||
Print(L" CapsuleApp -N <Capsule> -O <NestedCapsule>\n");
|
||||
Print(L" CapsuleApp -D <Capsule>\n");
|
||||
Print(L" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");
|
||||
Print(L"Parameter:\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" -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" which is defined in UEFI specification.\n");
|
||||
Print(L" -C: Clear capsule report variable (EFI_CAPSULE_REPORT_GUID),\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" ImageTypeId and Index (decimal format) to a file if 'GET'\n");
|
||||
Print(L" option is used.\n");
|
||||
Print(L" -E: Dump UEFI ESRT table info.\n");
|
||||
Print(L" -L: Dump provisioned capsule image information.\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" according to Windows Firmware Update document\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" according to Windows Firmware Update document\n");
|
||||
Print(L" -O: Output new Capsule file name\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 a FMP capsule.\n");
|
||||
Print (L"CapsuleApp: usage\n");
|
||||
Print (L" CapsuleApp <Capsule...> [-NR] [-OD [FSx]]\n");
|
||||
Print (L" CapsuleApp -S\n");
|
||||
Print (L" CapsuleApp -C\n");
|
||||
Print (L" CapsuleApp -P\n");
|
||||
Print (L" CapsuleApp -E\n");
|
||||
Print (L" CapsuleApp -L\n");
|
||||
Print (L" CapsuleApp -L INFO\n");
|
||||
Print (L" CapsuleApp -F\n");
|
||||
Print (L" CapsuleApp -G <BMP> -O <Capsule>\n");
|
||||
Print (L" CapsuleApp -N <Capsule> -O <NestedCapsule>\n");
|
||||
Print (L" CapsuleApp -D <Capsule>\n");
|
||||
Print (L" CapsuleApp -P GET <ImageTypeId> <Index> -O <FileName>\n");
|
||||
Print (L"Parameter:\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" -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" which is defined in UEFI specification.\n");
|
||||
Print (L" -C: Clear capsule report variable (EFI_CAPSULE_REPORT_GUID),\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" ImageTypeId and Index (decimal format) to a file if 'GET'\n");
|
||||
Print (L" option is used.\n");
|
||||
Print (L" -E: Dump UEFI ESRT table info.\n");
|
||||
Print (L" -L: Dump provisioned capsule image information.\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" according to Windows Firmware Update document\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" according to Windows Firmware Update document\n");
|
||||
Print (L" -O: Output new Capsule file name\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 a FMP capsule.\n");
|
||||
}
|
||||
|
||||
/**
|
||||
@ -738,54 +752,63 @@ UefiMain (
|
||||
EFI_GUID ImageTypeId;
|
||||
UINTN ImageIndex;
|
||||
|
||||
BlockDescriptors = NULL;
|
||||
MapFsStr = NULL;
|
||||
CapsuleNum = 0;
|
||||
BlockDescriptors = NULL;
|
||||
MapFsStr = NULL;
|
||||
CapsuleNum = 0;
|
||||
|
||||
Status = GetArg();
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"Please use UEFI SHELL to run this application!\n", Status);
|
||||
Status = GetArg ();
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Please use UEFI SHELL to run this application!\n", Status);
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Argc < 2) {
|
||||
PrintUsage();
|
||||
PrintUsage ();
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-D") == 0) {
|
||||
|
||||
if (StrCmp (Argv[1], L"-D") == 0) {
|
||||
if (Argc != 3) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
Status = DumpCapsule(Argv[2]);
|
||||
|
||||
Status = DumpCapsule (Argv[2]);
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-G") == 0) {
|
||||
Status = CreateBmpFmp();
|
||||
|
||||
if (StrCmp (Argv[1], L"-G") == 0) {
|
||||
Status = CreateBmpFmp ();
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-N") == 0) {
|
||||
Status = CreateNestedFmp();
|
||||
|
||||
if (StrCmp (Argv[1], L"-N") == 0) {
|
||||
Status = CreateNestedFmp ();
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-S") == 0) {
|
||||
Status = DumpCapsuleStatusVariable();
|
||||
|
||||
if (StrCmp (Argv[1], L"-S") == 0) {
|
||||
Status = DumpCapsuleStatusVariable ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-C") == 0) {
|
||||
Status = ClearCapsuleStatusVariable();
|
||||
|
||||
if (StrCmp (Argv[1], L"-C") == 0) {
|
||||
Status = ClearCapsuleStatusVariable ();
|
||||
return Status;
|
||||
}
|
||||
if (StrCmp(Argv[1], L"-P") == 0) {
|
||||
|
||||
if (StrCmp (Argv[1], L"-P") == 0) {
|
||||
if (Argc == 2) {
|
||||
DumpFmpData();
|
||||
DumpFmpData ();
|
||||
}
|
||||
|
||||
if (Argc >= 3) {
|
||||
if (StrCmp(Argv[2], L"GET") != 0) {
|
||||
Print(L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]);
|
||||
if (StrCmp (Argv[2], L"GET") != 0) {
|
||||
Print (L"CapsuleApp: Unrecognized option(%s).\n", Argv[2]);
|
||||
return EFI_UNSUPPORTED;
|
||||
} else {
|
||||
if (Argc != 7) {
|
||||
Print(L"CapsuleApp: Incorrect parameter count.\n");
|
||||
Print (L"CapsuleApp: Incorrect parameter count.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -797,54 +820,58 @@ UefiMain (
|
||||
Print (L"Invalid ImageTypeId - %s\n", Argv[3]);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
ImageIndex = StrDecimalToUintn(Argv[4]);
|
||||
if (StrCmp(Argv[5], L"-O") != 0) {
|
||||
Print(L"CapsuleApp: NO output file name.\n");
|
||||
|
||||
ImageIndex = StrDecimalToUintn (Argv[4]);
|
||||
if (StrCmp (Argv[5], L"-O") != 0) {
|
||||
Print (L"CapsuleApp: NO output file name.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
DumpFmpImage(&ImageTypeId, ImageIndex, Argv[6]);
|
||||
|
||||
DumpFmpImage (&ImageTypeId, ImageIndex, Argv[6]);
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[1], L"-E") == 0) {
|
||||
DumpEsrtData();
|
||||
if (StrCmp (Argv[1], L"-E") == 0) {
|
||||
DumpEsrtData ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[1], L"-L") == 0) {
|
||||
if (Argc >= 3 && StrCmp(Argv[2], L"INFO") == 0) {
|
||||
DumpProvisionedCapsule(TRUE);
|
||||
if (StrCmp (Argv[1], L"-L") == 0) {
|
||||
if ((Argc >= 3) && (StrCmp (Argv[2], L"INFO") == 0)) {
|
||||
DumpProvisionedCapsule (TRUE);
|
||||
} else {
|
||||
DumpProvisionedCapsule(FALSE);
|
||||
DumpProvisionedCapsule (FALSE);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
if (StrCmp(Argv[1], L"-F") == 0) {
|
||||
DumpAllEfiSysPartition();
|
||||
if (StrCmp (Argv[1], L"-F") == 0) {
|
||||
DumpAllEfiSysPartition ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
CapsuleFirstIndex = 1;
|
||||
NoReset = FALSE;
|
||||
CapsuleOnDisk = FALSE;
|
||||
ParaOdIndex = 0;
|
||||
ParaNrIndex = 0;
|
||||
NoReset = FALSE;
|
||||
CapsuleOnDisk = FALSE;
|
||||
ParaOdIndex = 0;
|
||||
ParaNrIndex = 0;
|
||||
|
||||
for (Index = 1; Index < Argc; Index++) {
|
||||
if (StrCmp(Argv[Index], L"-OD") == 0) {
|
||||
ParaOdIndex = Index;
|
||||
if (StrCmp (Argv[Index], L"-OD") == 0) {
|
||||
ParaOdIndex = Index;
|
||||
CapsuleOnDisk = TRUE;
|
||||
} else if (StrCmp(Argv[Index], L"-NR") == 0) {
|
||||
} else if (StrCmp (Argv[Index], L"-NR") == 0) {
|
||||
ParaNrIndex = Index;
|
||||
NoReset = TRUE;
|
||||
NoReset = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -886,37 +913,40 @@ UefiMain (
|
||||
CapsuleNum = CapsuleLastIndex - CapsuleFirstIndex + 1;
|
||||
|
||||
if (CapsuleFirstIndex > CapsuleLastIndex) {
|
||||
Print(L"CapsuleApp: NO capsule image.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
if (CapsuleNum > MAX_CAPSULE_NUM) {
|
||||
Print(L"CapsuleApp: Too many capsule images.\n");
|
||||
Print (L"CapsuleApp: NO capsule image.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
ZeroMem(&CapsuleBuffer, sizeof(CapsuleBuffer));
|
||||
ZeroMem(&CapsuleBufferSize, sizeof(CapsuleBufferSize));
|
||||
if (CapsuleNum > MAX_CAPSULE_NUM) {
|
||||
Print (L"CapsuleApp: Too many capsule images.\n");
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
ZeroMem (&CapsuleBuffer, sizeof (CapsuleBuffer));
|
||||
ZeroMem (&CapsuleBufferSize, sizeof (CapsuleBufferSize));
|
||||
BlockDescriptors = NULL;
|
||||
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
CapsuleName = Argv[CapsuleFirstIndex + Index];
|
||||
Status = ReadFileToBuffer(CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);
|
||||
Status = ReadFileToBuffer (CapsuleName, &CapsuleBufferSize[Index], &CapsuleBuffer[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: capsule image (%s) is not found.\n", CapsuleName);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
CapsuleNames[Index] = CapsuleName;
|
||||
}
|
||||
|
||||
//
|
||||
// Every capsule use 2 descriptor 1 for data 1 for end
|
||||
//
|
||||
Status = BuildGatherList(CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Status = BuildGatherList (CapsuleBuffer, CapsuleBufferSize, CapsuleNum, &BlockDescriptors);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
@ -925,18 +955,19 @@ UefiMain (
|
||||
//
|
||||
NeedReset = FALSE;
|
||||
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) {
|
||||
NeedReset = TRUE;
|
||||
}
|
||||
}
|
||||
|
||||
CapsuleHeaderArray[CapsuleNum] = NULL;
|
||||
|
||||
//
|
||||
// Inquire platform capability of UpdateCapsule.
|
||||
//
|
||||
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);
|
||||
goto Done;
|
||||
}
|
||||
@ -970,11 +1001,12 @@ UefiMain (
|
||||
// Check whether the input capsule image has the flag of persist across system reset.
|
||||
//
|
||||
if (NeedReset) {
|
||||
Status = gRT->UpdateCapsule(CapsuleHeaderArray,CapsuleNum,(UINTN) BlockDescriptors);
|
||||
Status = gRT->UpdateCapsule (CapsuleHeaderArray, CapsuleNum, (UINTN)BlockDescriptors);
|
||||
if (Status != EFI_SUCCESS) {
|
||||
Print (L"CapsuleApp: failed to update capsule - %r\n", Status);
|
||||
goto Done;
|
||||
}
|
||||
|
||||
//
|
||||
// For capsule with CAPSULE_FLAGS_PERSIST_ACROSS_RESET + CAPSULE_FLAGS_INITIATE_RESET,
|
||||
// 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
|
||||
// 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) {
|
||||
Print (L"CapsuleApp: failed to update capsule - %r\n", Status);
|
||||
}
|
||||
@ -1009,7 +1041,7 @@ Done:
|
||||
}
|
||||
}
|
||||
|
||||
CleanGatherList(BlockDescriptors, CapsuleNum);
|
||||
CleanGatherList (BlockDescriptors, CapsuleNum);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
@ -6,7 +6,6 @@
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef _CAPSULE_APP_H_
|
||||
#define _CAPSULE_APP_H_
|
||||
|
||||
@ -42,22 +41,22 @@
|
||||
#define CAPSULE_HEADER_SIZE 0x20
|
||||
|
||||
#define NESTED_CAPSULE_HEADER_SIZE SIZE_4KB
|
||||
#define SYSTEM_FIRMWARE_FLAG 0x50000
|
||||
#define DEVICE_FIRMWARE_FLAG 0x78010
|
||||
#define SYSTEM_FIRMWARE_FLAG 0x50000
|
||||
#define DEVICE_FIRMWARE_FLAG 0x78010
|
||||
|
||||
#define MAJOR_VERSION 1
|
||||
#define MINOR_VERSION 0
|
||||
#define MAJOR_VERSION 1
|
||||
#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)
|
||||
//
|
||||
#define MAX_FILE_NAME_SIZE 522
|
||||
#define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16))
|
||||
#define MAX_FILE_NAME_SIZE 522
|
||||
#define MAX_FILE_NAME_LEN (MAX_FILE_NAME_SIZE / sizeof(CHAR16))
|
||||
|
||||
extern UINTN Argc;
|
||||
extern CHAR16 **Argv;
|
||||
extern UINTN Argc;
|
||||
extern CHAR16 **Argv;
|
||||
|
||||
/**
|
||||
|
||||
@ -81,7 +80,6 @@ GetShellProtocol (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Read a file.
|
||||
|
||||
@ -95,9 +93,9 @@ GetShellProtocol (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadFileToBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
IN CHAR16 *FileName,
|
||||
OUT UINTN *BufferSize,
|
||||
OUT VOID **Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -113,12 +111,11 @@ ReadFileToBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteFileFromBuffer (
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN CHAR16 *FileName,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Dump capsule information
|
||||
|
||||
@ -129,7 +126,7 @@ WriteFileFromBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DumpCapsule (
|
||||
IN CHAR16 *CapsuleName
|
||||
IN CHAR16 *CapsuleName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -182,7 +179,7 @@ DumpEsrtData (
|
||||
**/
|
||||
VOID
|
||||
DumpProvisionedCapsule (
|
||||
IN BOOLEAN DumpCapsuleInfo
|
||||
IN BOOLEAN DumpCapsuleInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@ -193,7 +190,6 @@ DumpAllEfiSysPartition (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Get SimpleFileSystem from boot option file path.
|
||||
|
||||
@ -213,7 +209,6 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Process Capsule On Disk.
|
||||
|
||||
@ -229,12 +224,11 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ProcessCapsuleOnDisk (
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -8,7 +8,9 @@
|
||||
|
||||
#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.
|
||||
@ -20,13 +22,13 @@ EFI_GUID mCapsuleOnDiskBootOptionGuid = { 0x4CC29BB7, 0x2413, 0x40A2, { 0xB0, 0x
|
||||
**/
|
||||
CHAR16 *
|
||||
GetFileNameFromPath (
|
||||
CHAR16 *FilePath
|
||||
CHAR16 *FilePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
SHELL_FILE_HANDLE Handle;
|
||||
EFI_FILE_INFO *FileInfo;
|
||||
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
@ -68,13 +70,13 @@ GetFileNameFromPath (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsEfiSysPartitionDevicePath (
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
//
|
||||
// Check if the device path contains GPT node
|
||||
@ -83,12 +85,14 @@ IsEfiSysPartitionDevicePath (
|
||||
|
||||
while (!IsDevicePathEnd (TempDevicePath)) {
|
||||
if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))
|
||||
{
|
||||
Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
|
||||
if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TempDevicePath = NextDevicePathNode (TempDevicePath);
|
||||
}
|
||||
|
||||
@ -112,19 +116,19 @@ DumpAllEfiSysPartition (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINTN NumberEfiSystemPartitions;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINTN NumberEfiSystemPartitions;
|
||||
EFI_SHELL_PROTOCOL *ShellProtocol;
|
||||
|
||||
NumberEfiSystemPartitions = 0;
|
||||
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
Print (L"Get Shell Protocol Fail\n");;
|
||||
return ;
|
||||
Print (L"Get Shell Protocol Fail\n");
|
||||
return;
|
||||
}
|
||||
|
||||
Print (L"EFI System Partition list:\n");
|
||||
@ -141,12 +145,12 @@ DumpAllEfiSysPartition (
|
||||
DevicePath = DevicePathFromHandle (SimpleFileSystemHandles[Index]);
|
||||
if (IsEfiSysPartitionDevicePath (DevicePath)) {
|
||||
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) {
|
||||
Print(L" No ESP found.\n");
|
||||
Print (L" No ESP found.\n");
|
||||
}
|
||||
}
|
||||
|
||||
@ -162,21 +166,22 @@ IsCapsuleProvisioned (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
|
||||
OsIndication = 0;
|
||||
DataSize = sizeof(UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
DataSize = sizeof (UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
if (!EFI_ERROR (Status) &&
|
||||
(OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0) {
|
||||
((OsIndication & EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED) != 0))
|
||||
{
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -199,11 +204,11 @@ GetEfiSysPartition (
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
)
|
||||
{
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *SimpleFileSystemHandles;
|
||||
UINTN NumberSimpleFileSystemHandles;
|
||||
UINTN Index;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
@ -245,15 +250,15 @@ GetEfiSysPartition (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetEfiSysPartitionFromDevPath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **FsDevicePath,
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **FsDevicePath,
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *TempDevicePath;
|
||||
HARDDRIVE_DEVICE_PATH *Hd;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
//
|
||||
// Check if the device path contains GPT node
|
||||
@ -261,12 +266,14 @@ GetEfiSysPartitionFromDevPath (
|
||||
TempDevicePath = DevicePath;
|
||||
while (!IsDevicePathEnd (TempDevicePath)) {
|
||||
if ((DevicePathType (TempDevicePath) == MEDIA_DEVICE_PATH) &&
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP)) {
|
||||
(DevicePathSubType (TempDevicePath) == MEDIA_HARDDRIVE_DP))
|
||||
{
|
||||
Hd = (HARDDRIVE_DEVICE_PATH *)TempDevicePath;
|
||||
if (Hd->MBRType == MBR_TYPE_EFI_PARTITION_TABLE_HEADER) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
TempDevicePath = NextDevicePathNode (TempDevicePath);
|
||||
}
|
||||
|
||||
@ -310,13 +317,13 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *CurFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *PreFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FsFullPath;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *CurFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *PreFullPath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FsFullPath;
|
||||
|
||||
CurFullPath = NULL;
|
||||
FsFullPath = NULL;
|
||||
FsFullPath = NULL;
|
||||
//
|
||||
// Try every full device Path generated from bootoption
|
||||
//
|
||||
@ -337,13 +344,14 @@ GetEfiSysPartitionFromBootOptionFilePath (
|
||||
}
|
||||
|
||||
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 ();
|
||||
|
||||
Status = GetEfiSysPartitionFromDevPath (CurFullPath, &FsFullPath, Fs);
|
||||
@ -376,7 +384,7 @@ GetUpdateFileSystem (
|
||||
OUT UINT16 *BootNext,
|
||||
OUT EFI_SIMPLE_FILE_SYSTEM_PROTOCOL **Fs,
|
||||
OUT BOOLEAN *UpdateBootNext
|
||||
)
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CHAR16 BootOptionName[20];
|
||||
@ -396,7 +404,7 @@ GetUpdateFileSystem (
|
||||
|
||||
ShellProtocol = GetShellProtocol ();
|
||||
if (ShellProtocol == NULL) {
|
||||
Print (L"Get Shell Protocol Fail\n");;
|
||||
Print (L"Get Shell Protocol Fail\n");
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -404,14 +412,14 @@ GetUpdateFileSystem (
|
||||
// 1. If Fs is not assigned and there are capsule provisioned before,
|
||||
// Get EFI system partition from BootNext.
|
||||
//
|
||||
if (IsCapsuleProvisioned () && Map == NULL) {
|
||||
if (IsCapsuleProvisioned () && (Map == NULL)) {
|
||||
Status = GetVariable2 (
|
||||
L"BootNext",
|
||||
&gEfiGlobalVariableGuid,
|
||||
(VOID **)&BootNextData,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status) || BootNextData == NULL) {
|
||||
if (EFI_ERROR (Status) || (BootNextData == NULL)) {
|
||||
Print (L"Get Boot Next Data Fail. Status = %r\n", Status);
|
||||
return EFI_NOT_FOUND;
|
||||
} else {
|
||||
@ -419,11 +427,11 @@ GetUpdateFileSystem (
|
||||
Status = EfiBootManagerVariableToLoadOption (BootOptionName, &BootNextOption);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
DevicePath = BootNextOption.FilePath;
|
||||
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
|
||||
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
*UpdateBootNext = FALSE;
|
||||
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"Get EFI system partition from BootNext : %s\n", BootNextOption.Description);
|
||||
Print (L"%s %s\n", ShellProtocol->GetMapFromDevicePath (&FullPath), ConvertDevicePathToText (FullPath, TRUE, TRUE));
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
@ -436,10 +444,10 @@ GetUpdateFileSystem (
|
||||
if (Map != NULL) {
|
||||
MappedDevicePath = ShellProtocol->GetDevicePathFromMap (Map);
|
||||
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;
|
||||
} 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;
|
||||
}
|
||||
}
|
||||
@ -448,9 +456,10 @@ GetUpdateFileSystem (
|
||||
// 2. Get EFI system partition form boot options.
|
||||
//
|
||||
BootOptionBuffer = EfiBootManagerGetLoadOptions (&BootOptionCount, LoadOptionTypeBoot);
|
||||
if ( (BootOptionBuffer == NULL) ||
|
||||
(BootOptionCount == 0 && Map == NULL)
|
||||
) {
|
||||
if ((BootOptionBuffer == NULL) ||
|
||||
((BootOptionCount == 0) && (Map == NULL))
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -458,32 +467,34 @@ GetUpdateFileSystem (
|
||||
//
|
||||
// Get the boot option from the link list
|
||||
//
|
||||
DevicePath = BootOptionBuffer[Index].FilePath;
|
||||
DevicePath = BootOptionBuffer[Index].FilePath;
|
||||
|
||||
//
|
||||
// Skip inactive or legacy boot options
|
||||
//
|
||||
if ((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0 ||
|
||||
DevicePathType (DevicePath) == BBS_DEVICE_PATH) {
|
||||
if (((BootOptionBuffer[Index].Attributes & LOAD_OPTION_ACTIVE) == 0) ||
|
||||
(DevicePathType (DevicePath) == BBS_DEVICE_PATH))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
|
||||
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 ();
|
||||
|
||||
Status = GetEfiSysPartitionFromBootOptionFilePath (DevicePath, &FullPath, Fs);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if (Map == NULL) {
|
||||
*BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber;
|
||||
*BootNext = (UINT16)BootOptionBuffer[Index].OptionNumber;
|
||||
*UpdateBootNext = TRUE;
|
||||
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));
|
||||
@ -491,7 +502,7 @@ GetUpdateFileSystem (
|
||||
}
|
||||
|
||||
if (StrnCmp (Map, ShellProtocol->GetMapFromDevicePath (&FullPath), StrLen (Map)) == 0) {
|
||||
*BootNext = (UINT16) BootOptionBuffer[Index].OptionNumber;
|
||||
*BootNext = (UINT16)BootOptionBuffer[Index].OptionNumber;
|
||||
*UpdateBootNext = TRUE;
|
||||
Print (L"Found Boot Option on %s : %s\n", Map, BootOptionBuffer[Index].Description);
|
||||
return EFI_SUCCESS;
|
||||
@ -507,11 +518,12 @@ GetUpdateFileSystem (
|
||||
// If map is assigned, try to get ESP from mapped Fs.
|
||||
//
|
||||
DevicePath = DuplicateDevicePath (MappedDevicePath);
|
||||
Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);
|
||||
Status = GetEfiSysPartitionFromDevPath (DevicePath, &FullPath, Fs);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Error: Cannot get EFI system partition from '%s' - %r\n", Map, Status);
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
Print (L"Warning: Cannot find Boot Option on '%s'!\n", Map);
|
||||
} else {
|
||||
Status = GetEfiSysPartition (&DevicePath, Fs);
|
||||
@ -529,15 +541,16 @@ GetUpdateFileSystem (
|
||||
LOAD_OPTION_ACTIVE,
|
||||
L"UEFI Capsule On Disk",
|
||||
DevicePath,
|
||||
(UINT8 *) &mCapsuleOnDiskBootOptionGuid,
|
||||
sizeof(EFI_GUID)
|
||||
(UINT8 *)&mCapsuleOnDiskBootOptionGuid,
|
||||
sizeof (EFI_GUID)
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN) -1); {
|
||||
Status = EfiBootManagerAddLoadOptionVariable (&NewOption, (UINTN)-1);
|
||||
{
|
||||
if (!EFI_ERROR (Status)) {
|
||||
*UpdateBootNext = TRUE;
|
||||
*BootNext = (UINT16) NewOption.OptionNumber;
|
||||
Print (L" Boot%04x: %s\n", *BootNext, ConvertDevicePathToText(DevicePath, TRUE, TRUE));
|
||||
*BootNext = (UINT16)NewOption.OptionNumber;
|
||||
Print (L" Boot%04x: %s\n", *BootNext, ConvertDevicePathToText (DevicePath, TRUE, TRUE));
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
@ -564,25 +577,25 @@ GetUpdateFileSystem (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WriteUpdateFile (
|
||||
IN VOID **Buffer,
|
||||
IN UINTN *BufferSize,
|
||||
IN CHAR16 **FileName,
|
||||
IN UINTN BufferNum,
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs
|
||||
)
|
||||
IN VOID **Buffer,
|
||||
IN UINTN *BufferSize,
|
||||
IN CHAR16 **FileName,
|
||||
IN UINTN BufferNum,
|
||||
IN EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_FILE *Root;
|
||||
EFI_FILE *FileHandle;
|
||||
EFI_FILE_PROTOCOL *DirHandle;
|
||||
UINT64 FileInfo;
|
||||
VOID *Filebuffer;
|
||||
UINTN FileSize;
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
EFI_FILE *Root;
|
||||
EFI_FILE *FileHandle;
|
||||
EFI_FILE_PROTOCOL *DirHandle;
|
||||
UINT64 FileInfo;
|
||||
VOID *Filebuffer;
|
||||
UINTN FileSize;
|
||||
UINTN Index;
|
||||
|
||||
DirHandle = NULL;
|
||||
FileHandle = NULL;
|
||||
Index = 0;
|
||||
DirHandle = NULL;
|
||||
FileHandle = NULL;
|
||||
Index = 0;
|
||||
|
||||
//
|
||||
// Open Root from SFS
|
||||
@ -600,15 +613,16 @@ WriteUpdateFile (
|
||||
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);
|
||||
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;
|
||||
}
|
||||
}
|
||||
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)) {
|
||||
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)) {
|
||||
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;
|
||||
}
|
||||
}
|
||||
@ -643,7 +657,7 @@ WriteUpdateFile (
|
||||
// Set the file size to 0.
|
||||
//
|
||||
FileInfo = 0;
|
||||
Status = FileHandleSetSize (FileHandle, FileInfo);
|
||||
Status = FileHandleSetSize (FileHandle, FileInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Error Deleting %s\n", FileName[Index]);
|
||||
FileHandleClose (FileHandle);
|
||||
@ -655,8 +669,8 @@ WriteUpdateFile (
|
||||
// Write Filebuffer to file
|
||||
//
|
||||
Filebuffer = Buffer[Index];
|
||||
FileSize = BufferSize[Index];
|
||||
Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer);
|
||||
FileSize = BufferSize[Index];
|
||||
Status = FileHandleWrite (FileHandle, &FileSize, Filebuffer);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"Unable to write Capsule Update to %s, Status = %r\n", FileName[Index], Status);
|
||||
return EFI_NOT_FOUND;
|
||||
@ -680,36 +694,37 @@ WriteUpdateFile (
|
||||
**/
|
||||
EFI_STATUS
|
||||
SetCapsuleStatusVariable (
|
||||
BOOLEAN SetCap
|
||||
BOOLEAN SetCap
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndication;
|
||||
UINTN DataSize;
|
||||
|
||||
OsIndication = 0;
|
||||
DataSize = sizeof(UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
DataSize = sizeof (UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndication
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
OsIndication = 0;
|
||||
}
|
||||
|
||||
if (SetCap) {
|
||||
OsIndication |= ((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
|
||||
}
|
||||
else {
|
||||
} else {
|
||||
OsIndication &= ~((UINT64)EFI_OS_INDICATIONS_FILE_CAPSULE_DELIVERY_SUPPORTED);
|
||||
}
|
||||
|
||||
Status = gRT->SetVariable (
|
||||
L"OsIndications",
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
sizeof(UINT64),
|
||||
sizeof (UINT64),
|
||||
&OsIndication
|
||||
);
|
||||
|
||||
@ -728,18 +743,18 @@ IsCapsuleOnDiskSupported (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndicationsSupported;
|
||||
UINTN DataSize;
|
||||
EFI_STATUS Status;
|
||||
UINT64 OsIndicationsSupported;
|
||||
UINTN DataSize;
|
||||
|
||||
DataSize = sizeof(UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndicationsSupported",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndicationsSupported
|
||||
);
|
||||
DataSize = sizeof (UINT64);
|
||||
Status = gRT->GetVariable (
|
||||
L"OsIndicationsSupported",
|
||||
&gEfiGlobalVariableGuid,
|
||||
NULL,
|
||||
&DataSize,
|
||||
&OsIndicationsSupported
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
@ -766,19 +781,19 @@ IsCapsuleOnDiskSupported (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ProcessCapsuleOnDisk (
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
IN VOID **CapsuleBuffer,
|
||||
IN UINTN *CapsuleBufferSize,
|
||||
IN CHAR16 **FilePath,
|
||||
IN CHAR16 *Map,
|
||||
IN UINTN CapsuleNum
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT16 BootNext;
|
||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
|
||||
BOOLEAN UpdateBootNext;
|
||||
CHAR16 *FileName[MAX_CAPSULE_NUM];
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
UINT16 BootNext;
|
||||
EFI_SIMPLE_FILE_SYSTEM_PROTOCOL *Fs;
|
||||
BOOLEAN UpdateBootNext;
|
||||
CHAR16 *FileName[MAX_CAPSULE_NUM];
|
||||
UINTN Index;
|
||||
|
||||
//
|
||||
// Check if Capsule On Disk is supported
|
||||
@ -802,7 +817,7 @@ ProcessCapsuleOnDisk (
|
||||
//
|
||||
// Get file name from file path
|
||||
//
|
||||
for (Index = 0; Index < CapsuleNum; Index ++) {
|
||||
for (Index = 0; Index < CapsuleNum; Index++) {
|
||||
FileName[Index] = GetFileNameFromPath (FilePath[Index]);
|
||||
}
|
||||
|
||||
@ -826,13 +841,13 @@ ProcessCapsuleOnDisk (
|
||||
|
||||
if (UpdateBootNext) {
|
||||
Status = gRT->SetVariable (
|
||||
L"BootNext",
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
sizeof(UINT16),
|
||||
&BootNext
|
||||
);
|
||||
if (EFI_ERROR (Status)){
|
||||
L"BootNext",
|
||||
&gEfiGlobalVariableGuid,
|
||||
EFI_VARIABLE_BOOTSERVICE_ACCESS | EFI_VARIABLE_RUNTIME_ACCESS | EFI_VARIABLE_NON_VOLATILE,
|
||||
sizeof (UINT16),
|
||||
&BootNext
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"CapsuleApp: unable to set BootNext variable.\n");
|
||||
return Status;
|
||||
}
|
||||
|
@ -14,7 +14,6 @@
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
|
||||
|
||||
#include <Protocol/UnicodeCollation.h>
|
||||
#include <Protocol/PiPcd.h>
|
||||
#include <Protocol/Pcd.h>
|
||||
@ -23,7 +22,6 @@
|
||||
#include <Protocol/ShellParameters.h>
|
||||
#include <Protocol/Shell.h>
|
||||
|
||||
|
||||
//
|
||||
// String token ID of help message text.
|
||||
// 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
|
||||
// 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 MINOR_VERSION 0
|
||||
#define MAJOR_VERSION 1
|
||||
#define MINOR_VERSION 0
|
||||
|
||||
static EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL;
|
||||
static EFI_PCD_PROTOCOL *mPiPcd = NULL;
|
||||
static PCD_PROTOCOL *mPcd = NULL;
|
||||
static EFI_GET_PCD_INFO_PROTOCOL *mPiPcdInfo = NULL;
|
||||
static GET_PCD_INFO_PROTOCOL *mPcdInfo = NULL;
|
||||
static CHAR16 *mTempPcdNameBuffer = NULL;
|
||||
static UINTN mTempPcdNameBufferSize = 0;
|
||||
static EFI_UNICODE_COLLATION_PROTOCOL *mUnicodeCollation = NULL;
|
||||
static EFI_PCD_PROTOCOL *mPiPcd = NULL;
|
||||
static PCD_PROTOCOL *mPcd = NULL;
|
||||
static EFI_GET_PCD_INFO_PROTOCOL *mPiPcdInfo = NULL;
|
||||
static GET_PCD_INFO_PROTOCOL *mPcdInfo = NULL;
|
||||
static CHAR16 *mTempPcdNameBuffer = NULL;
|
||||
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 UINTN Argc;
|
||||
static CHAR16 **Argv;
|
||||
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;
|
||||
|
||||
/**
|
||||
|
||||
@ -63,15 +60,15 @@ GetArg (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||
EFI_STATUS Status;
|
||||
EFI_SHELL_PARAMETERS_PROTOCOL *ShellParameters;
|
||||
|
||||
Status = gBS->HandleProtocol (
|
||||
gImageHandle,
|
||||
&gEfiShellParametersProtocolGuid,
|
||||
(VOID**)&ShellParameters
|
||||
(VOID **)&ShellParameters
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -121,21 +118,21 @@ ShowHelp (
|
||||
static
|
||||
VOID
|
||||
DumpHex (
|
||||
IN UINTN Indent,
|
||||
IN UINTN Offset,
|
||||
IN UINTN DataSize,
|
||||
IN VOID *UserData
|
||||
IN UINTN Indent,
|
||||
IN UINTN Offset,
|
||||
IN UINTN DataSize,
|
||||
IN VOID *UserData
|
||||
)
|
||||
{
|
||||
UINT8 *Data;
|
||||
UINT8 *Data;
|
||||
|
||||
CHAR8 Val[50];
|
||||
CHAR8 Val[50];
|
||||
|
||||
CHAR8 Str[20];
|
||||
CHAR8 Str[20];
|
||||
|
||||
UINT8 TempByte;
|
||||
UINTN Size;
|
||||
UINTN Index;
|
||||
UINT8 TempByte;
|
||||
UINTN Size;
|
||||
UINTN Index;
|
||||
|
||||
Data = UserData;
|
||||
while (DataSize != 0) {
|
||||
@ -145,24 +142,23 @@ DumpHex (
|
||||
}
|
||||
|
||||
for (Index = 0; Index < Size; Index += 1) {
|
||||
TempByte = Data[Index];
|
||||
Val[Index * 3 + 0] = mHex[TempByte >> 4];
|
||||
Val[Index * 3 + 1] = mHex[TempByte & 0xF];
|
||||
Val[Index * 3 + 2] = (CHAR8) ((Index == 7) ? '-' : ' ');
|
||||
Str[Index] = (CHAR8) ((TempByte < ' ' || TempByte > 'z') ? '.' : TempByte);
|
||||
TempByte = Data[Index];
|
||||
Val[Index * 3 + 0] = mHex[TempByte >> 4];
|
||||
Val[Index * 3 + 1] = mHex[TempByte & 0xF];
|
||||
Val[Index * 3 + 2] = (CHAR8)((Index == 7) ? '-' : ' ');
|
||||
Str[Index] = (CHAR8)((TempByte < ' ' || TempByte > 'z') ? '.' : TempByte);
|
||||
}
|
||||
|
||||
Val[Index * 3] = 0;
|
||||
Str[Index] = 0;
|
||||
Val[Index * 3] = 0;
|
||||
Str[Index] = 0;
|
||||
Print (L"%*a%08X: %-48a *%a*\r\n", Indent, "", Offset, Val, Str);
|
||||
|
||||
Data += Size;
|
||||
Offset += Size;
|
||||
Data += Size;
|
||||
Offset += Size;
|
||||
DataSize -= Size;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Safely append with automatic string resizing given length of Destination and
|
||||
desired length of copy from Source.
|
||||
@ -194,23 +190,23 @@ DumpHex (
|
||||
@return Destination return the resultant string.
|
||||
**/
|
||||
static
|
||||
CHAR16*
|
||||
CHAR16 *
|
||||
InternalStrnCatGrow (
|
||||
IN OUT CHAR16 **Destination,
|
||||
IN OUT UINTN *CurrentSize,
|
||||
IN CONST CHAR16 *Source
|
||||
IN OUT CHAR16 **Destination,
|
||||
IN OUT UINTN *CurrentSize,
|
||||
IN CONST CHAR16 *Source
|
||||
)
|
||||
{
|
||||
UINTN DestinationStartSize;
|
||||
UINTN NewSize;
|
||||
UINTN SourceLen;
|
||||
UINTN DestinationStartSize;
|
||||
UINTN NewSize;
|
||||
UINTN SourceLen;
|
||||
|
||||
SourceLen = StrLen(Source);
|
||||
SourceLen = StrLen (Source);
|
||||
|
||||
//
|
||||
// ASSERTs
|
||||
//
|
||||
ASSERT(Destination != NULL);
|
||||
ASSERT (Destination != NULL);
|
||||
|
||||
//
|
||||
// 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
|
||||
//
|
||||
if (CurrentSize != NULL && *CurrentSize == 0) {
|
||||
if ((CurrentSize != NULL) && (*CurrentSize == 0)) {
|
||||
*Destination = NULL;
|
||||
}
|
||||
|
||||
@ -230,9 +226,9 @@ InternalStrnCatGrow (
|
||||
// allow for NULL pointers address as Destination
|
||||
//
|
||||
if (*Destination != NULL) {
|
||||
ASSERT(CurrentSize != 0);
|
||||
DestinationStartSize = StrSize(*Destination);
|
||||
ASSERT(DestinationStartSize <= *CurrentSize);
|
||||
ASSERT (CurrentSize != 0);
|
||||
DestinationStartSize = StrSize (*Destination);
|
||||
ASSERT (DestinationStartSize <= *CurrentSize);
|
||||
} else {
|
||||
DestinationStartSize = 0;
|
||||
}
|
||||
@ -242,16 +238,17 @@ InternalStrnCatGrow (
|
||||
//
|
||||
if (CurrentSize != NULL) {
|
||||
NewSize = *CurrentSize;
|
||||
if (NewSize < DestinationStartSize + (SourceLen * sizeof(CHAR16))) {
|
||||
while (NewSize < (DestinationStartSize + (SourceLen*sizeof(CHAR16)))) {
|
||||
NewSize += 2 * SourceLen * sizeof(CHAR16);
|
||||
if (NewSize < DestinationStartSize + (SourceLen * sizeof (CHAR16))) {
|
||||
while (NewSize < (DestinationStartSize + (SourceLen*sizeof (CHAR16)))) {
|
||||
NewSize += 2 * SourceLen * sizeof (CHAR16);
|
||||
}
|
||||
*Destination = ReallocatePool(*CurrentSize, NewSize, *Destination);
|
||||
|
||||
*Destination = ReallocatePool (*CurrentSize, NewSize, *Destination);
|
||||
*CurrentSize = NewSize;
|
||||
}
|
||||
} else {
|
||||
NewSize = (SourceLen + 1)*sizeof(CHAR16);
|
||||
*Destination = AllocateZeroPool(NewSize);
|
||||
NewSize = (SourceLen + 1)*sizeof (CHAR16);
|
||||
*Destination = AllocateZeroPool (NewSize);
|
||||
}
|
||||
|
||||
//
|
||||
@ -261,7 +258,7 @@ InternalStrnCatGrow (
|
||||
return (NULL);
|
||||
}
|
||||
|
||||
StrnCatS(*Destination, NewSize/sizeof(CHAR16), Source, SourceLen);
|
||||
StrnCatS (*Destination, NewSize/sizeof (CHAR16), Source, SourceLen);
|
||||
return *Destination;
|
||||
}
|
||||
|
||||
@ -276,15 +273,15 @@ InternalStrnCatGrow (
|
||||
static
|
||||
CHAR16 *
|
||||
GetPcdTypeString (
|
||||
IN CONST EFI_GUID *TokenSpace,
|
||||
IN EFI_PCD_TYPE PcdType
|
||||
IN CONST EFI_GUID *TokenSpace,
|
||||
IN EFI_PCD_TYPE PcdType
|
||||
)
|
||||
{
|
||||
UINTN BufLen;
|
||||
CHAR16 *RetString;
|
||||
UINTN BufLen;
|
||||
CHAR16 *RetString;
|
||||
|
||||
BufLen = 0;
|
||||
RetString = NULL;
|
||||
BufLen = 0;
|
||||
RetString = NULL;
|
||||
|
||||
switch (PcdType) {
|
||||
case EFI_PCD_TYPE_8:
|
||||
@ -329,18 +326,18 @@ GetPcdTypeString (
|
||||
static
|
||||
VOID
|
||||
DumpPcdInfo (
|
||||
IN CONST EFI_GUID *TokenSpace,
|
||||
IN UINTN TokenNumber,
|
||||
IN EFI_PCD_INFO *PcdInfo
|
||||
IN CONST EFI_GUID *TokenSpace,
|
||||
IN UINTN TokenNumber,
|
||||
IN EFI_PCD_INFO *PcdInfo
|
||||
)
|
||||
{
|
||||
CHAR16 *RetString;
|
||||
UINT8 Uint8;
|
||||
UINT16 Uint16;
|
||||
UINT32 Uint32;
|
||||
UINT64 Uint64;
|
||||
BOOLEAN Boolean;
|
||||
VOID *PcdData;
|
||||
CHAR16 *RetString;
|
||||
UINT8 Uint8;
|
||||
UINT16 Uint16;
|
||||
UINT32 Uint32;
|
||||
UINT64 Uint64;
|
||||
BOOLEAN Boolean;
|
||||
VOID *PcdData;
|
||||
|
||||
RetString = NULL;
|
||||
|
||||
@ -363,6 +360,7 @@ DumpPcdInfo (
|
||||
} else {
|
||||
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);
|
||||
break;
|
||||
case EFI_PCD_TYPE_16:
|
||||
@ -371,6 +369,7 @@ DumpPcdInfo (
|
||||
} else {
|
||||
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);
|
||||
break;
|
||||
case EFI_PCD_TYPE_32:
|
||||
@ -379,6 +378,7 @@ DumpPcdInfo (
|
||||
} else {
|
||||
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);
|
||||
break;
|
||||
case EFI_PCD_TYPE_64:
|
||||
@ -387,6 +387,7 @@ DumpPcdInfo (
|
||||
} else {
|
||||
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);
|
||||
break;
|
||||
case EFI_PCD_TYPE_BOOL:
|
||||
@ -395,6 +396,7 @@ DumpPcdInfo (
|
||||
} else {
|
||||
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");
|
||||
break;
|
||||
case EFI_PCD_TYPE_PTR:
|
||||
@ -403,6 +405,7 @@ DumpPcdInfo (
|
||||
} else {
|
||||
PcdData = mPiPcd->GetPtr (TokenSpace, TokenNumber);
|
||||
}
|
||||
|
||||
Print (L" Token = 0x%08x - Type = %H%-17s%N - Size = 0x%x\n", TokenNumber, RetString, PcdInfo->PcdSize);
|
||||
DumpHex (2, 0, PcdInfo->PcdSize, PcdData);
|
||||
break;
|
||||
@ -413,6 +416,7 @@ DumpPcdInfo (
|
||||
if (RetString != NULL) {
|
||||
FreePool (RetString);
|
||||
}
|
||||
|
||||
Print (L"\n");
|
||||
}
|
||||
|
||||
@ -429,20 +433,20 @@ DumpPcdInfo (
|
||||
static
|
||||
EFI_STATUS
|
||||
ProcessPcd (
|
||||
IN CHAR16 *InputPcdName
|
||||
IN CHAR16 *InputPcdName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_GUID *TokenSpace;
|
||||
UINTN TokenNumber;
|
||||
EFI_PCD_INFO PcdInfo;
|
||||
BOOLEAN Found;
|
||||
UINTN PcdNameSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_GUID *TokenSpace;
|
||||
UINTN TokenNumber;
|
||||
EFI_PCD_INFO PcdInfo;
|
||||
BOOLEAN Found;
|
||||
UINTN PcdNameSize;
|
||||
|
||||
PcdInfo.PcdName = NULL;
|
||||
PcdInfo.PcdSize = 0;
|
||||
PcdInfo.PcdType = 0xFF;
|
||||
Found = FALSE;
|
||||
Found = FALSE;
|
||||
|
||||
Print (L"Current system SKU ID: 0x%x\n\n", mPiPcdInfo->GetSku ());
|
||||
|
||||
@ -451,7 +455,7 @@ ProcessPcd (
|
||||
TokenNumber = 0;
|
||||
do {
|
||||
Status = mPiPcd->GetNextToken (TokenSpace, &TokenNumber);
|
||||
if (!EFI_ERROR (Status) && TokenNumber != 0) {
|
||||
if (!EFI_ERROR (Status) && (TokenNumber != 0)) {
|
||||
if (TokenSpace == NULL) {
|
||||
//
|
||||
// PCD in default Token Space.
|
||||
@ -460,27 +464,32 @@ ProcessPcd (
|
||||
} else {
|
||||
mPiPcdInfo->GetInfo (TokenSpace, TokenNumber, &PcdInfo);
|
||||
}
|
||||
|
||||
if (InputPcdName != NULL) {
|
||||
if (PcdInfo.PcdName == NULL) {
|
||||
continue;
|
||||
}
|
||||
|
||||
PcdNameSize = AsciiStrSize (PcdInfo.PcdName) * sizeof (CHAR16);
|
||||
if (mTempPcdNameBuffer == NULL) {
|
||||
mTempPcdNameBufferSize = PcdNameSize;
|
||||
mTempPcdNameBuffer = AllocatePool (mTempPcdNameBufferSize);
|
||||
mTempPcdNameBuffer = AllocatePool (mTempPcdNameBufferSize);
|
||||
} else if (mTempPcdNameBufferSize < PcdNameSize) {
|
||||
mTempPcdNameBuffer = ReallocatePool (mTempPcdNameBufferSize, PcdNameSize, mTempPcdNameBuffer);
|
||||
mTempPcdNameBuffer = ReallocatePool (mTempPcdNameBufferSize, PcdNameSize, mTempPcdNameBuffer);
|
||||
mTempPcdNameBufferSize = PcdNameSize;
|
||||
}
|
||||
|
||||
if (mTempPcdNameBuffer == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
AsciiStrToUnicodeStrS (PcdInfo.PcdName, mTempPcdNameBuffer, mTempPcdNameBufferSize / sizeof (CHAR16));
|
||||
//
|
||||
// Compare the input PCD name with the PCD name in PCD database.
|
||||
//
|
||||
if ((StrStr (mTempPcdNameBuffer, InputPcdName) != NULL) ||
|
||||
(mUnicodeCollation != NULL && mUnicodeCollation->MetaiMatch (mUnicodeCollation, mTempPcdNameBuffer, InputPcdName))) {
|
||||
((mUnicodeCollation != NULL) && mUnicodeCollation->MetaiMatch (mUnicodeCollation, mTempPcdNameBuffer, InputPcdName)))
|
||||
{
|
||||
//
|
||||
// Found matched PCD.
|
||||
//
|
||||
@ -493,7 +502,7 @@ ProcessPcd (
|
||||
}
|
||||
} 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);
|
||||
|
||||
if ((InputPcdName != NULL) && !Found) {
|
||||
@ -503,6 +512,7 @@ ProcessPcd (
|
||||
Print (L"%EError. %NNo matching PCD found: %s.\n", InputPcdName);
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -526,35 +536,35 @@ DumpDynPcdMain (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *InputPcdName;
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *InputPcdName;
|
||||
|
||||
InputPcdName = NULL;
|
||||
InputPcdName = NULL;
|
||||
|
||||
Status = gBS->LocateProtocol(&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID **) &mUnicodeCollation);
|
||||
Status = gBS->LocateProtocol (&gEfiUnicodeCollation2ProtocolGuid, NULL, (VOID **)&mUnicodeCollation);
|
||||
if (EFI_ERROR (Status)) {
|
||||
mUnicodeCollation = NULL;
|
||||
}
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiPcdProtocolGuid, NULL, (VOID **) &mPiPcd);
|
||||
Status = gBS->LocateProtocol (&gEfiPcdProtocolGuid, NULL, (VOID **)&mPiPcd);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"DumpDynPcd: %EError. %NPI PCD protocol is not present.\n");
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiGetPcdInfoProtocolGuid, NULL, (VOID **) &mPiPcdInfo);
|
||||
Status = gBS->LocateProtocol (&gEfiGetPcdInfoProtocolGuid, NULL, (VOID **)&mPiPcdInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"DumpDynPcd: %EError. %NPI PCD info protocol is not present.\n");
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **) &mPcd);
|
||||
Status = gBS->LocateProtocol (&gPcdProtocolGuid, NULL, (VOID **)&mPcd);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"DumpDynPcd: %EError. %NPCD protocol is not present.\n");
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->LocateProtocol (&gGetPcdInfoProtocolGuid, NULL, (VOID **) &mPcdInfo);
|
||||
Status = gBS->LocateProtocol (&gGetPcdInfoProtocolGuid, NULL, (VOID **)&mPcdInfo);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"DumpDynPcd: %EError. %NPCD info protocol is not present.\n");
|
||||
return Status;
|
||||
@ -563,33 +573,33 @@ DumpDynPcdMain (
|
||||
//
|
||||
// get the command line arguments
|
||||
//
|
||||
Status = GetArg();
|
||||
if (EFI_ERROR(Status)){
|
||||
Status = GetArg ();
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"DumpDynPcd: %EError. %NThe input parameters are not recognized.\n");
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Argc > 2){
|
||||
if (Argc > 2) {
|
||||
Print (L"DumpDynPcd: %EError. %NToo many arguments specified.\n");
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Argc == 1){
|
||||
if (Argc == 1) {
|
||||
Status = ProcessPcd (InputPcdName);
|
||||
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 ();
|
||||
goto Done;
|
||||
} 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 ();
|
||||
goto Done;
|
||||
} 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]);
|
||||
goto Done;
|
||||
}
|
||||
@ -597,9 +607,9 @@ DumpDynPcdMain (
|
||||
}
|
||||
|
||||
InputPcdName = Argv[1];
|
||||
Status = ProcessPcd (InputPcdName);
|
||||
Status = ProcessPcd (InputPcdName);
|
||||
|
||||
Done:
|
||||
Done:
|
||||
|
||||
if (mTempPcdNameBuffer != NULL) {
|
||||
FreePool (mTempPcdNameBuffer);
|
||||
@ -607,4 +617,3 @@ DumpDynPcdMain (
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -20,7 +20,7 @@
|
||||
// the resource section. Thus the application can use '-?' option to show help message in
|
||||
// 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
|
||||
@ -40,7 +40,7 @@ UefiMain (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
UINT32 Index;
|
||||
|
||||
Index = 0;
|
||||
|
||||
@ -48,11 +48,11 @@ UefiMain (
|
||||
// Three PCD type (FeatureFlag, UINT32 and String) are used as the sample.
|
||||
//
|
||||
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
|
||||
//
|
||||
Print ((CHAR16*)PcdGetPtr (PcdHelloWorldPrintString));
|
||||
Print ((CHAR16 *)PcdGetPtr (PcdHelloWorldPrintString));
|
||||
}
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -23,7 +23,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <Guid/SmiHandlerProfile.h>
|
||||
|
||||
#define PROFILE_NAME_STRING_LENGTH 64
|
||||
CHAR8 mNameString[PROFILE_NAME_STRING_LENGTH + 1];
|
||||
CHAR8 mNameString[PROFILE_NAME_STRING_LENGTH + 1];
|
||||
|
||||
VOID *mSmiHandlerProfileDatabase;
|
||||
UINTN mSmiHandlerProfileDatabaseSize;
|
||||
@ -41,6 +41,7 @@ InternalDumpData (
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < Size; Index++) {
|
||||
Print (L"%02x", (UINTN)Data[Index]);
|
||||
if ((Index + 1) != Size) {
|
||||
@ -53,79 +54,82 @@ InternalDumpData (
|
||||
Get SMI handler profile database.
|
||||
**/
|
||||
VOID
|
||||
GetSmiHandlerProfileDatabase(
|
||||
GetSmiHandlerProfileDatabase (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN CommSize;
|
||||
UINT8 *CommBuffer;
|
||||
EFI_SMM_COMMUNICATE_HEADER *CommHeader;
|
||||
SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *CommGetInfo;
|
||||
SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *CommGetData;
|
||||
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;
|
||||
UINTN MinimalSizeNeeded;
|
||||
EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
|
||||
UINT32 Index;
|
||||
EFI_MEMORY_DESCRIPTOR *Entry;
|
||||
VOID *Buffer;
|
||||
UINTN Size;
|
||||
UINTN Offset;
|
||||
EFI_STATUS Status;
|
||||
UINTN CommSize;
|
||||
UINT8 *CommBuffer;
|
||||
EFI_SMM_COMMUNICATE_HEADER *CommHeader;
|
||||
SMI_HANDLER_PROFILE_PARAMETER_GET_INFO *CommGetInfo;
|
||||
SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET *CommGetData;
|
||||
EFI_SMM_COMMUNICATION_PROTOCOL *SmmCommunication;
|
||||
UINTN MinimalSizeNeeded;
|
||||
EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
|
||||
UINT32 Index;
|
||||
EFI_MEMORY_DESCRIPTOR *Entry;
|
||||
VOID *Buffer;
|
||||
UINTN Size;
|
||||
UINTN Offset;
|
||||
|
||||
Status = gBS->LocateProtocol(&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&SmmCommunication);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"SmiHandlerProfile: Locate SmmCommunication protocol - %r\n", Status);
|
||||
return ;
|
||||
Status = gBS->LocateProtocol (&gEfiSmmCommunicationProtocolGuid, NULL, (VOID **)&SmmCommunication);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"SmiHandlerProfile: Locate SmmCommunication protocol - %r\n", Status);
|
||||
return;
|
||||
}
|
||||
|
||||
MinimalSizeNeeded = EFI_PAGE_SIZE;
|
||||
|
||||
Status = EfiGetSystemConfigurationTable(
|
||||
Status = EfiGetSystemConfigurationTable (
|
||||
&gEdkiiPiSmmCommunicationRegionTableGuid,
|
||||
(VOID **)&PiSmmCommunicationRegionTable
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"SmiHandlerProfile: Get PiSmmCommunicationRegionTable - %r\n", Status);
|
||||
return ;
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"SmiHandlerProfile: Get PiSmmCommunicationRegionTable - %r\n", Status);
|
||||
return;
|
||||
}
|
||||
ASSERT(PiSmmCommunicationRegionTable != NULL);
|
||||
|
||||
ASSERT (PiSmmCommunicationRegionTable != NULL);
|
||||
Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1);
|
||||
Size = 0;
|
||||
Size = 0;
|
||||
for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {
|
||||
if (Entry->Type == EfiConventionalMemory) {
|
||||
Size = EFI_PAGES_TO_SIZE((UINTN)Entry->NumberOfPages);
|
||||
Size = EFI_PAGES_TO_SIZE ((UINTN)Entry->NumberOfPages);
|
||||
if (Size >= MinimalSizeNeeded) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
Entry = (EFI_MEMORY_DESCRIPTOR *)((UINT8 *)Entry + PiSmmCommunicationRegionTable->DescriptorSize);
|
||||
}
|
||||
ASSERT(Index < PiSmmCommunicationRegionTable->NumberOfEntries);
|
||||
|
||||
ASSERT (Index < PiSmmCommunicationRegionTable->NumberOfEntries);
|
||||
CommBuffer = (UINT8 *)(UINTN)Entry->PhysicalStart;
|
||||
|
||||
//
|
||||
// Get Size
|
||||
//
|
||||
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
|
||||
CopyMem(&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof(gSmiHandlerProfileGuid));
|
||||
CommHeader->MessageLength = sizeof(SMI_HANDLER_PROFILE_PARAMETER_GET_INFO);
|
||||
CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
|
||||
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->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_INFO;
|
||||
CommGetInfo->Header.DataLength = sizeof(*CommGetInfo);
|
||||
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.DataLength = sizeof (*CommGetInfo);
|
||||
CommGetInfo->Header.ReturnStatus = (UINT64)-1;
|
||||
CommGetInfo->DataSize = 0;
|
||||
CommGetInfo->DataSize = 0;
|
||||
|
||||
CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + CommHeader->MessageLength;
|
||||
Status = SmmCommunication->Communicate(SmmCommunication, CommBuffer, &CommSize);
|
||||
if (EFI_ERROR(Status)) {
|
||||
Print(L"SmiHandlerProfile: SmmCommunication - %r\n", Status);
|
||||
return ;
|
||||
CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
|
||||
Status = SmmCommunication->Communicate (SmmCommunication, CommBuffer, &CommSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Print (L"SmiHandlerProfile: SmmCommunication - %r\n", Status);
|
||||
return;
|
||||
}
|
||||
|
||||
if (CommGetInfo->Header.ReturnStatus != 0) {
|
||||
Print(L"SmiHandlerProfile: GetInfo - 0x%0x\n", CommGetInfo->Header.ReturnStatus);
|
||||
return ;
|
||||
Print (L"SmiHandlerProfile: GetInfo - 0x%0x\n", CommGetInfo->Header.ReturnStatus);
|
||||
return;
|
||||
}
|
||||
|
||||
mSmiHandlerProfileDatabaseSize = (UINTN)CommGetInfo->DataSize;
|
||||
@ -133,25 +137,25 @@ GetSmiHandlerProfileDatabase(
|
||||
//
|
||||
// Get Data
|
||||
//
|
||||
mSmiHandlerProfileDatabase = AllocateZeroPool(mSmiHandlerProfileDatabaseSize);
|
||||
mSmiHandlerProfileDatabase = AllocateZeroPool (mSmiHandlerProfileDatabaseSize);
|
||||
if (mSmiHandlerProfileDatabase == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
Print(L"SmiHandlerProfile: AllocateZeroPool (0x%x) for dump buffer - %r\n", mSmiHandlerProfileDatabaseSize, Status);
|
||||
return ;
|
||||
Print (L"SmiHandlerProfile: AllocateZeroPool (0x%x) for dump buffer - %r\n", mSmiHandlerProfileDatabaseSize, Status);
|
||||
return;
|
||||
}
|
||||
|
||||
CommHeader = (EFI_SMM_COMMUNICATE_HEADER *)&CommBuffer[0];
|
||||
CopyMem(&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof(gSmiHandlerProfileGuid));
|
||||
CommHeader->MessageLength = sizeof(SMI_HANDLER_PROFILE_PARAMETER_GET_DATA_BY_OFFSET);
|
||||
CopyMem (&CommHeader->HeaderGuid, &gSmiHandlerProfileGuid, sizeof (gSmiHandlerProfileGuid));
|
||||
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->Header.Command = SMI_HANDLER_PROFILE_COMMAND_GET_DATA_BY_OFFSET;
|
||||
CommGetData->Header.DataLength = sizeof(*CommGetData);
|
||||
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.DataLength = sizeof (*CommGetData);
|
||||
CommGetData->Header.ReturnStatus = (UINT64)-1;
|
||||
|
||||
CommSize = sizeof(EFI_GUID) + sizeof(UINTN) + CommHeader->MessageLength;
|
||||
Buffer = (UINT8 *)CommHeader + CommSize;
|
||||
Size -= CommSize;
|
||||
CommSize = sizeof (EFI_GUID) + sizeof (UINTN) + CommHeader->MessageLength;
|
||||
Buffer = (UINT8 *)CommHeader + CommSize;
|
||||
Size -= CommSize;
|
||||
|
||||
CommGetData->DataBuffer = (PHYSICAL_ADDRESS)(UINTN)Buffer;
|
||||
CommGetData->DataOffset = 0;
|
||||
@ -162,21 +166,23 @@ GetSmiHandlerProfileDatabase(
|
||||
} else {
|
||||
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) {
|
||||
FreePool(mSmiHandlerProfileDatabase);
|
||||
FreePool (mSmiHandlerProfileDatabase);
|
||||
mSmiHandlerProfileDatabase = NULL;
|
||||
Print(L"SmiHandlerProfile: GetData - 0x%x\n", CommGetData->Header.ReturnStatus);
|
||||
return ;
|
||||
Print (L"SmiHandlerProfile: GetData - 0x%x\n", CommGetData->Header.ReturnStatus);
|
||||
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));
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -193,14 +199,14 @@ GetSmiHandlerProfileDatabase(
|
||||
**/
|
||||
VOID
|
||||
GetShortPdbFileName (
|
||||
IN CHAR8 *PdbFileName,
|
||||
OUT CHAR8 *AsciiBuffer
|
||||
IN CHAR8 *PdbFileName,
|
||||
OUT CHAR8 *AsciiBuffer
|
||||
)
|
||||
{
|
||||
UINTN IndexPdb; // Current work location within a Pdb string.
|
||||
UINTN IndexBuffer; // Current work location within a Buffer string.
|
||||
UINTN StartIndex;
|
||||
UINTN EndIndex;
|
||||
UINTN IndexPdb; // Current work location within a Pdb string.
|
||||
UINTN IndexBuffer; // Current work location within a Buffer string.
|
||||
UINTN StartIndex;
|
||||
UINTN EndIndex;
|
||||
|
||||
ZeroMem (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1);
|
||||
|
||||
@ -208,7 +214,9 @@ GetShortPdbFileName (
|
||||
AsciiStrnCpyS (AsciiBuffer, PROFILE_NAME_STRING_LENGTH + 1, " ", 1);
|
||||
} else {
|
||||
StartIndex = 0;
|
||||
for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++);
|
||||
for (EndIndex = 0; PdbFileName[EndIndex] != 0; EndIndex++) {
|
||||
}
|
||||
|
||||
for (IndexPdb = 0; PdbFileName[IndexPdb] != 0; IndexPdb++) {
|
||||
if ((PdbFileName[IndexPdb] == '\\') || (PdbFileName[IndexPdb] == '/')) {
|
||||
StartIndex = IndexPdb + 1;
|
||||
@ -248,9 +256,9 @@ GetDriverNameString (
|
||||
IN SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *NameString;
|
||||
UINTN StringSize;
|
||||
EFI_STATUS Status;
|
||||
CHAR16 *NameString;
|
||||
UINTN StringSize;
|
||||
|
||||
if (ImageStruct == NULL) {
|
||||
return "???";
|
||||
@ -260,7 +268,7 @@ GetDriverNameString (
|
||||
// Method 1: Get the name string from image PDB
|
||||
//
|
||||
if (ImageStruct->PdbStringOffset != 0) {
|
||||
GetShortPdbFileName ((CHAR8 *) ((UINTN) ImageStruct + ImageStruct->PdbStringOffset), mNameString);
|
||||
GetShortPdbFileName ((CHAR8 *)((UINTN)ImageStruct + ImageStruct->PdbStringOffset), mNameString);
|
||||
return mNameString;
|
||||
}
|
||||
|
||||
@ -270,13 +278,13 @@ GetDriverNameString (
|
||||
//
|
||||
NameString = NULL;
|
||||
StringSize = 0;
|
||||
Status = GetSectionFromAnyFv (
|
||||
&ImageStruct->FileGuid,
|
||||
EFI_SECTION_USER_INTERFACE,
|
||||
0,
|
||||
(VOID **) &NameString,
|
||||
&StringSize
|
||||
);
|
||||
Status = GetSectionFromAnyFv (
|
||||
&ImageStruct->FileGuid,
|
||||
EFI_SECTION_USER_INTERFACE,
|
||||
0,
|
||||
(VOID **)&NameString,
|
||||
&StringSize
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
// Method 2: Get the name string from FFS UI section
|
||||
@ -284,6 +292,7 @@ GetDriverNameString (
|
||||
if (StrLen (NameString) > PROFILE_NAME_STRING_LENGTH) {
|
||||
NameString[PROFILE_NAME_STRING_LENGTH] = 0;
|
||||
}
|
||||
|
||||
UnicodeStrToAsciiStrS (NameString, mNameString, sizeof (mNameString));
|
||||
FreePool (NameString);
|
||||
return mNameString;
|
||||
@ -306,7 +315,7 @@ GetDriverNameString (
|
||||
**/
|
||||
SMM_CORE_IMAGE_DATABASE_STRUCTURE *
|
||||
GetImageFromRef (
|
||||
IN UINTN ImageRef
|
||||
IN UINTN ImageRef
|
||||
)
|
||||
{
|
||||
SMM_CORE_IMAGE_DATABASE_STRUCTURE *ImageStruct;
|
||||
@ -318,6 +327,7 @@ GetImageFromRef (
|
||||
return ImageStruct;
|
||||
}
|
||||
}
|
||||
|
||||
ImageStruct = (VOID *)((UINTN)ImageStruct + ImageStruct->Header.Length);
|
||||
}
|
||||
|
||||
@ -328,7 +338,7 @@ GetImageFromRef (
|
||||
Dump SMM loaded image information.
|
||||
**/
|
||||
VOID
|
||||
DumpSmmLoadedImage(
|
||||
DumpSmmLoadedImage (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
@ -340,19 +350,21 @@ DumpSmmLoadedImage(
|
||||
while ((UINTN)ImageStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) {
|
||||
if (ImageStruct->Header.Signature == SMM_CORE_IMAGE_DATABASE_SIGNATURE) {
|
||||
NameString = GetDriverNameString (ImageStruct);
|
||||
Print(L" <Image Name=\"%a\"", NameString);
|
||||
Print(L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase, ImageStruct->ImageSize);
|
||||
Print (L" <Image Name=\"%a\"", NameString);
|
||||
Print (L" Base=\"0x%lx\" Size=\"0x%lx\"", ImageStruct->ImageBase, ImageStruct->ImageSize);
|
||||
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">\n");
|
||||
|
||||
Print (L" FvFile=\"%g\"", &ImageStruct->FileGuid);
|
||||
Print (L" RefId=\"0x%x\"", ImageStruct->ImageRef);
|
||||
Print (L">\n");
|
||||
if (ImageStruct->PdbStringOffset != 0) {
|
||||
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);
|
||||
@ -361,7 +373,7 @@ DumpSmmLoadedImage(
|
||||
return;
|
||||
}
|
||||
|
||||
CHAR8 *mSxTypeString[] = {
|
||||
CHAR8 *mSxTypeString[] = {
|
||||
"SxS0",
|
||||
"SxS1",
|
||||
"SxS2",
|
||||
@ -382,15 +394,15 @@ SxTypeToString (
|
||||
IN EFI_SLEEP_TYPE Type
|
||||
)
|
||||
{
|
||||
if (Type >= 0 && Type < ARRAY_SIZE(mSxTypeString)) {
|
||||
if ((Type >= 0) && (Type < ARRAY_SIZE (mSxTypeString))) {
|
||||
return mSxTypeString[Type];
|
||||
} else {
|
||||
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Type);
|
||||
AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
|
||||
return mNameString;
|
||||
}
|
||||
}
|
||||
|
||||
CHAR8 *mSxPhaseString[] = {
|
||||
CHAR8 *mSxPhaseString[] = {
|
||||
"SxEntry",
|
||||
"SxExit",
|
||||
};
|
||||
@ -404,18 +416,18 @@ CHAR8 *mSxPhaseString[] = {
|
||||
**/
|
||||
CHAR8 *
|
||||
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];
|
||||
} else {
|
||||
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Phase);
|
||||
AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
|
||||
return mNameString;
|
||||
}
|
||||
}
|
||||
|
||||
CHAR8 *mPowerButtonPhaseString[] = {
|
||||
CHAR8 *mPowerButtonPhaseString[] = {
|
||||
"PowerButtonEntry",
|
||||
"PowerButtonExit",
|
||||
};
|
||||
@ -432,15 +444,15 @@ PowerButtonPhaseToString (
|
||||
IN EFI_POWER_BUTTON_PHASE Phase
|
||||
)
|
||||
{
|
||||
if (Phase >= 0 && Phase < ARRAY_SIZE(mPowerButtonPhaseString)) {
|
||||
if ((Phase >= 0) && (Phase < ARRAY_SIZE (mPowerButtonPhaseString))) {
|
||||
return mPowerButtonPhaseString[Phase];
|
||||
} else {
|
||||
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Phase);
|
||||
AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
|
||||
return mNameString;
|
||||
}
|
||||
}
|
||||
|
||||
CHAR8 *mStandbyButtonPhaseString[] = {
|
||||
CHAR8 *mStandbyButtonPhaseString[] = {
|
||||
"StandbyButtonEntry",
|
||||
"StandbyButtonExit",
|
||||
};
|
||||
@ -457,15 +469,15 @@ StandbyButtonPhaseToString (
|
||||
IN EFI_STANDBY_BUTTON_PHASE Phase
|
||||
)
|
||||
{
|
||||
if (Phase >= 0 && Phase < ARRAY_SIZE(mStandbyButtonPhaseString)) {
|
||||
if ((Phase >= 0) && (Phase < ARRAY_SIZE (mStandbyButtonPhaseString))) {
|
||||
return mStandbyButtonPhaseString[Phase];
|
||||
} else {
|
||||
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Phase);
|
||||
AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Phase);
|
||||
return mNameString;
|
||||
}
|
||||
}
|
||||
|
||||
CHAR8 *mIoTrapTypeString[] = {
|
||||
CHAR8 *mIoTrapTypeString[] = {
|
||||
"WriteTrap",
|
||||
"ReadTrap",
|
||||
"ReadWriteTrap",
|
||||
@ -483,15 +495,15 @@ IoTrapTypeToString (
|
||||
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];
|
||||
} else {
|
||||
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Type);
|
||||
AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
|
||||
return mNameString;
|
||||
}
|
||||
}
|
||||
|
||||
CHAR8 *mUsbTypeString[] = {
|
||||
CHAR8 *mUsbTypeString[] = {
|
||||
"UsbLegacy",
|
||||
"UsbWake",
|
||||
};
|
||||
@ -505,13 +517,13 @@ CHAR8 *mUsbTypeString[] = {
|
||||
**/
|
||||
CHAR8 *
|
||||
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];
|
||||
} else {
|
||||
AsciiSPrint (mNameString, sizeof(mNameString), "0x%x", Type);
|
||||
AsciiSPrint (mNameString, sizeof (mNameString), "0x%x", Type);
|
||||
return mNameString;
|
||||
}
|
||||
}
|
||||
@ -525,42 +537,42 @@ UsbTypeToString (
|
||||
**/
|
||||
VOID
|
||||
DumpSmiChildContext (
|
||||
IN EFI_GUID *HandlerType,
|
||||
IN VOID *Context,
|
||||
IN UINTN ContextSize
|
||||
IN EFI_GUID *HandlerType,
|
||||
IN VOID *Context,
|
||||
IN UINTN ContextSize
|
||||
)
|
||||
{
|
||||
CHAR16 *Str;
|
||||
CHAR16 *Str;
|
||||
|
||||
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)) {
|
||||
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" SxType=\"%a\"", SxTypeToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Type));
|
||||
Print (L" SxPhase=\"%a\"", SxPhaseToString (((EFI_SMM_SX_REGISTER_CONTEXT *)Context)->Phase));
|
||||
} 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)) {
|
||||
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)) {
|
||||
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" PeriodicTimerPeriod=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->Period);
|
||||
Print (L" PeriodicTimerSmiTickInterval=\"%ld\"", ((EFI_SMM_PERIODIC_TIMER_REGISTER_CONTEXT *)Context)->SmiTickInterval);
|
||||
} 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)) {
|
||||
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" IoTrapType=\"%a\"", IoTrapTypeToString(((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));
|
||||
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" IoTrapType=\"%a\"", IoTrapTypeToString (((EFI_SMM_IO_TRAP_REGISTER_CONTEXT *)Context)->Type));
|
||||
} else if (CompareGuid (HandlerType, &gEfiSmmUsbDispatch2ProtocolGuid)) {
|
||||
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);
|
||||
Print(L" UsbDevicePath=\"%s\"", Str);
|
||||
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);
|
||||
Print (L" UsbDevicePath=\"%s\"", Str);
|
||||
if (Str != NULL) {
|
||||
FreePool (Str);
|
||||
}
|
||||
} else {
|
||||
Print(L" Context=\"");
|
||||
Print (L" Context=\"");
|
||||
InternalDumpData (Context, ContextSize);
|
||||
Print(L"\"");
|
||||
Print (L"\"");
|
||||
}
|
||||
}
|
||||
|
||||
@ -570,8 +582,8 @@ DumpSmiChildContext (
|
||||
@param HandlerCategory SMI handler category
|
||||
**/
|
||||
VOID
|
||||
DumpSmiHandler(
|
||||
IN UINT32 HandlerCategory
|
||||
DumpSmiHandler (
|
||||
IN UINT32 HandlerCategory
|
||||
)
|
||||
{
|
||||
SMM_CORE_SMI_DATABASE_STRUCTURE *SmiStruct;
|
||||
@ -584,39 +596,46 @@ DumpSmiHandler(
|
||||
while ((UINTN)SmiStruct < (UINTN)mSmiHandlerProfileDatabase + mSmiHandlerProfileDatabaseSize) {
|
||||
if ((SmiStruct->Header.Signature == SMM_CORE_SMI_DATABASE_SIGNATURE) && (SmiStruct->HandlerCategory == HandlerCategory)) {
|
||||
SmiHandlerStruct = (VOID *)(SmiStruct + 1);
|
||||
Print(L" <SmiEntry");
|
||||
Print (L" <SmiEntry");
|
||||
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++) {
|
||||
Print(L" <SmiHandler");
|
||||
Print (L" <SmiHandler");
|
||||
if (SmiHandlerStruct->ContextBufferSize != 0) {
|
||||
DumpSmiChildContext (&SmiStruct->HandlerType, (UINT8 *)SmiHandlerStruct + SmiHandlerStruct->ContextBufferOffset, SmiHandlerStruct->ContextBufferSize);
|
||||
}
|
||||
Print(L">\n");
|
||||
ImageStruct = GetImageFromRef((UINTN)SmiHandlerStruct->ImageRef);
|
||||
NameString = GetDriverNameString (ImageStruct);
|
||||
Print(L" <Module RefId=\"0x%x\" Name=\"%a\">\n", SmiHandlerStruct->ImageRef, NameString);
|
||||
|
||||
Print (L">\n");
|
||||
ImageStruct = GetImageFromRef ((UINTN)SmiHandlerStruct->ImageRef);
|
||||
NameString = GetDriverNameString (ImageStruct);
|
||||
Print (L" <Module RefId=\"0x%x\" Name=\"%a\">\n", SmiHandlerStruct->ImageRef, NameString);
|
||||
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) {
|
||||
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) {
|
||||
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);
|
||||
Print(L" </SmiHandler>\n");
|
||||
Print (L" </SmiHandler>\n");
|
||||
}
|
||||
Print(L" </SmiEntry>\n");
|
||||
|
||||
Print (L" </SmiEntry>\n");
|
||||
}
|
||||
|
||||
SmiStruct = (VOID *)((UINTN)SmiStruct + SmiStruct->Header.Length);
|
||||
}
|
||||
|
||||
@ -635,11 +654,11 @@ DumpSmiHandler(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
SmiHandlerProfileInfoEntrypoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
GetSmiHandlerProfileDatabase();
|
||||
GetSmiHandlerProfileDatabase ();
|
||||
|
||||
if (mSmiHandlerProfileDatabase == NULL) {
|
||||
return EFI_SUCCESS;
|
||||
@ -648,38 +667,38 @@ SmiHandlerProfileInfoEntrypoint (
|
||||
//
|
||||
// Dump all image
|
||||
//
|
||||
Print(L"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
|
||||
Print(L"<SmiHandlerProfile>\n");
|
||||
Print(L"<ImageDatabase>\n");
|
||||
Print(L" <!-- SMM image loaded -->\n");
|
||||
DumpSmmLoadedImage();
|
||||
Print(L"</ImageDatabase>\n\n");
|
||||
Print (L"<?xml version=\"1.0\" encoding=\"utf-8\"?>\n");
|
||||
Print (L"<SmiHandlerProfile>\n");
|
||||
Print (L"<ImageDatabase>\n");
|
||||
Print (L" <!-- SMM image loaded -->\n");
|
||||
DumpSmmLoadedImage ();
|
||||
Print (L"</ImageDatabase>\n\n");
|
||||
|
||||
//
|
||||
// Dump SMI Handler
|
||||
//
|
||||
Print(L"<SmiHandlerDatabase>\n");
|
||||
Print(L" <!-- SMI Handler registered -->\n\n");
|
||||
Print(L" <SmiHandlerCategory Name=\"RootSmi\">\n");
|
||||
Print(L" <!-- The root SMI Handler registered by SmmCore -->\n");
|
||||
DumpSmiHandler(SmmCoreSmiHandlerCategoryRootHandler);
|
||||
Print(L" </SmiHandlerCategory>\n\n");
|
||||
Print (L"<SmiHandlerDatabase>\n");
|
||||
Print (L" <!-- SMI Handler registered -->\n\n");
|
||||
Print (L" <SmiHandlerCategory Name=\"RootSmi\">\n");
|
||||
Print (L" <!-- The root SMI Handler registered by SmmCore -->\n");
|
||||
DumpSmiHandler (SmmCoreSmiHandlerCategoryRootHandler);
|
||||
Print (L" </SmiHandlerCategory>\n\n");
|
||||
|
||||
Print(L" <SmiHandlerCategory Name=\"GuidSmi\">\n");
|
||||
Print(L" <!-- The GUID SMI Handler registered by SmmCore -->\n");
|
||||
DumpSmiHandler(SmmCoreSmiHandlerCategoryGuidHandler);
|
||||
Print(L" </SmiHandlerCategory>\n\n");
|
||||
Print (L" <SmiHandlerCategory Name=\"GuidSmi\">\n");
|
||||
Print (L" <!-- The GUID SMI Handler registered by SmmCore -->\n");
|
||||
DumpSmiHandler (SmmCoreSmiHandlerCategoryGuidHandler);
|
||||
Print (L" </SmiHandlerCategory>\n\n");
|
||||
|
||||
Print(L" <SmiHandlerCategory Name=\"HardwareSmi\">\n");
|
||||
Print(L" <!-- The hardware SMI Handler registered by SmmChildDispatcher -->\n");
|
||||
DumpSmiHandler(SmmCoreSmiHandlerCategoryHardwareHandler);
|
||||
Print(L" </SmiHandlerCategory>\n\n");
|
||||
Print (L" <SmiHandlerCategory Name=\"HardwareSmi\">\n");
|
||||
Print (L" <!-- The hardware SMI Handler registered by SmmChildDispatcher -->\n");
|
||||
DumpSmiHandler (SmmCoreSmiHandlerCategoryHardwareHandler);
|
||||
Print (L" </SmiHandlerCategory>\n\n");
|
||||
|
||||
Print(L"</SmiHandlerDatabase>\n");
|
||||
Print(L"</SmiHandlerProfile>\n");
|
||||
Print (L"</SmiHandlerDatabase>\n");
|
||||
Print (L"</SmiHandlerProfile>\n");
|
||||
|
||||
if (mSmiHandlerProfileDatabase != NULL) {
|
||||
FreePool(mSmiHandlerProfileDatabase);
|
||||
FreePool (mSmiHandlerProfileDatabase);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
@ -10,29 +10,29 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include "FrontPage.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;
|
||||
CHAR8 *mLanguageString;
|
||||
BOOLEAN mModeInitialized = FALSE;
|
||||
EFI_FORM_BROWSER2_PROTOCOL *gFormBrowser2;
|
||||
CHAR8 *mLanguageString;
|
||||
BOOLEAN mModeInitialized = FALSE;
|
||||
//
|
||||
// Boot video resolution and text mode.
|
||||
//
|
||||
UINT32 mBootHorizontalResolution = 0;
|
||||
UINT32 mBootVerticalResolution = 0;
|
||||
UINT32 mBootTextModeColumn = 0;
|
||||
UINT32 mBootTextModeRow = 0;
|
||||
UINT32 mBootHorizontalResolution = 0;
|
||||
UINT32 mBootVerticalResolution = 0;
|
||||
UINT32 mBootTextModeColumn = 0;
|
||||
UINT32 mBootTextModeRow = 0;
|
||||
//
|
||||
// BIOS setup video resolution and text mode.
|
||||
//
|
||||
UINT32 mSetupTextModeColumn = 0;
|
||||
UINT32 mSetupTextModeRow = 0;
|
||||
UINT32 mSetupHorizontalResolution = 0;
|
||||
UINT32 mSetupVerticalResolution = 0;
|
||||
UINT32 mSetupTextModeColumn = 0;
|
||||
UINT32 mSetupTextModeRow = 0;
|
||||
UINT32 mSetupHorizontalResolution = 0;
|
||||
UINT32 mSetupVerticalResolution = 0;
|
||||
|
||||
FRONT_PAGE_CALLBACK_DATA gFrontPagePrivate = {
|
||||
FRONT_PAGE_CALLBACK_DATA_SIGNATURE,
|
||||
@ -52,21 +52,22 @@ HII_VENDOR_DEVICE_PATH mFrontPageHiiVendorDevicePath = {
|
||||
HARDWARE_DEVICE_PATH,
|
||||
HW_VENDOR_DP,
|
||||
{
|
||||
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
|
||||
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
|
||||
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
|
||||
(UINT8)((sizeof (VENDOR_DEVICE_PATH)) >> 8)
|
||||
}
|
||||
},
|
||||
//
|
||||
// {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_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||
{
|
||||
(UINT8) (END_DEVICE_PATH_LENGTH),
|
||||
(UINT8) ((END_DEVICE_PATH_LENGTH) >> 8)
|
||||
(UINT8)(END_DEVICE_PATH_LENGTH),
|
||||
(UINT8)((END_DEVICE_PATH_LENGTH) >> 8)
|
||||
}
|
||||
}
|
||||
};
|
||||
@ -105,15 +106,16 @@ UpdateFrontPageBannerStrings (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FakeExtractConfig (
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Request,
|
||||
OUT EFI_STRING *Progress,
|
||||
OUT EFI_STRING *Results
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Request,
|
||||
OUT EFI_STRING *Progress,
|
||||
OUT EFI_STRING *Results
|
||||
)
|
||||
{
|
||||
if (Progress == NULL || Results == NULL) {
|
||||
if ((Progress == NULL) || (Results == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
*Progress = Request;
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
@ -137,12 +139,12 @@ FakeExtractConfig (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FakeRouteConfig (
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Configuration,
|
||||
OUT EFI_STRING *Progress
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Configuration,
|
||||
OUT EFI_STRING *Progress
|
||||
)
|
||||
{
|
||||
if (Configuration == NULL || Progress == NULL) {
|
||||
if ((Configuration == NULL) || (Progress == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -172,12 +174,12 @@ FakeRouteConfig (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FrontPageCallback (
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
)
|
||||
{
|
||||
return UiFrontPageCallbackHandler (gFrontPagePrivate.HiiHandle, Action, QuestionId, Type, Value, ActionRequest);
|
||||
@ -193,10 +195,10 @@ UpdateFrontPageForm (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
VOID *StartOpCodeHandle;
|
||||
VOID *EndOpCodeHandle;
|
||||
EFI_IFR_GUID_LABEL *StartGuidLabel;
|
||||
EFI_IFR_GUID_LABEL *EndGuidLabel;
|
||||
VOID *StartOpCodeHandle;
|
||||
VOID *EndOpCodeHandle;
|
||||
EFI_IFR_GUID_LABEL *StartGuidLabel;
|
||||
EFI_IFR_GUID_LABEL *EndGuidLabel;
|
||||
|
||||
//
|
||||
// Allocate space for creation of UpdateData Buffer
|
||||
@ -209,18 +211,18 @@ UpdateFrontPageForm (
|
||||
//
|
||||
// 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->Number = LABEL_FRANTPAGE_INFORMATION;
|
||||
//
|
||||
// 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->Number = LABEL_END;
|
||||
|
||||
//
|
||||
//Updata Front Page form
|
||||
// Updata Front Page form
|
||||
//
|
||||
UiCustomizeFrontPage (
|
||||
gFrontPagePrivate.HiiHandle,
|
||||
@ -252,11 +254,12 @@ InitializeFrontPage (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Locate Hii relative protocols
|
||||
//
|
||||
Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **) &gFormBrowser2);
|
||||
Status = gBS->LocateProtocol (&gEfiFormBrowser2ProtocolGuid, NULL, (VOID **)&gFormBrowser2);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -265,14 +268,14 @@ InitializeFrontPage (
|
||||
// Install Device Path Protocol and Config Access protocol to driver handle
|
||||
//
|
||||
gFrontPagePrivate.DriverHandle = NULL;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&gFrontPagePrivate.DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mFrontPageHiiVendorDevicePath,
|
||||
&gEfiHiiConfigAccessProtocolGuid,
|
||||
&gFrontPagePrivate.ConfigAccess,
|
||||
NULL
|
||||
);
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&gFrontPagePrivate.DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
&mFrontPageHiiVendorDevicePath,
|
||||
&gEfiHiiConfigAccessProtocolGuid,
|
||||
&gFrontPagePrivate.ConfigAccess,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
//
|
||||
@ -288,14 +291,14 @@ InitializeFrontPage (
|
||||
ASSERT (gFrontPagePrivate.HiiHandle != NULL);
|
||||
|
||||
//
|
||||
//Updata Front Page banner strings
|
||||
// Updata Front Page banner strings
|
||||
//
|
||||
UpdateFrontPageBannerStrings ();
|
||||
|
||||
//
|
||||
// Update front page menus.
|
||||
//
|
||||
UpdateFrontPageForm();
|
||||
UpdateFrontPageForm ();
|
||||
|
||||
return Status;
|
||||
}
|
||||
@ -324,15 +327,15 @@ CallFrontPage (
|
||||
);
|
||||
|
||||
ActionRequest = EFI_BROWSER_ACTION_REQUEST_NONE;
|
||||
Status = gFormBrowser2->SendForm (
|
||||
gFormBrowser2,
|
||||
&gFrontPagePrivate.HiiHandle,
|
||||
1,
|
||||
&mFrontPageGuid,
|
||||
0,
|
||||
NULL,
|
||||
&ActionRequest
|
||||
);
|
||||
Status = gFormBrowser2->SendForm (
|
||||
gFormBrowser2,
|
||||
&gFrontPagePrivate.HiiHandle,
|
||||
1,
|
||||
&mFrontPageGuid,
|
||||
0,
|
||||
NULL,
|
||||
&ActionRequest
|
||||
);
|
||||
//
|
||||
// Check whether user change any option setting which needs a reset to be effective
|
||||
//
|
||||
@ -348,11 +351,12 @@ CallFrontPage (
|
||||
|
||||
**/
|
||||
VOID
|
||||
FreeFrontPage(
|
||||
FreeFrontPage (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
gFrontPagePrivate.DriverHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
@ -383,9 +387,9 @@ FreeFrontPage(
|
||||
**/
|
||||
VOID
|
||||
ConvertProcessorToString (
|
||||
IN UINT16 ProcessorFrequency,
|
||||
IN UINT16 Base10Exponent,
|
||||
OUT CHAR16 **String
|
||||
IN UINT16 ProcessorFrequency,
|
||||
IN UINT16 Base10Exponent,
|
||||
OUT CHAR16 **String
|
||||
)
|
||||
{
|
||||
CHAR16 *StringBuffer;
|
||||
@ -395,13 +399,14 @@ ConvertProcessorToString (
|
||||
|
||||
if (Base10Exponent >= 6) {
|
||||
FreqMhz = ProcessorFrequency;
|
||||
for (Index = 0; Index < (UINT32) Base10Exponent - 6; Index++) {
|
||||
for (Index = 0; Index < (UINT32)Base10Exponent - 6; Index++) {
|
||||
FreqMhz *= 10;
|
||||
}
|
||||
} else {
|
||||
FreqMhz = 0;
|
||||
}
|
||||
DestMax = 0x20 / sizeof (CHAR16);
|
||||
|
||||
DestMax = 0x20 / sizeof (CHAR16);
|
||||
StringBuffer = AllocateZeroPool (0x20);
|
||||
ASSERT (StringBuffer != NULL);
|
||||
UnicodeValueToStringS (StringBuffer, sizeof (CHAR16) * DestMax, LEFT_JUSTIFY, FreqMhz / 1000, 3);
|
||||
@ -415,11 +420,10 @@ ConvertProcessorToString (
|
||||
2
|
||||
);
|
||||
StrCatS (StringBuffer, DestMax, L" GHz");
|
||||
*String = (CHAR16 *) StringBuffer;
|
||||
return ;
|
||||
*String = (CHAR16 *)StringBuffer;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Convert Memory Size to a string.
|
||||
|
||||
@ -429,8 +433,8 @@ ConvertProcessorToString (
|
||||
**/
|
||||
VOID
|
||||
ConvertMemorySizeToString (
|
||||
IN UINT32 MemorySize,
|
||||
OUT CHAR16 **String
|
||||
IN UINT32 MemorySize,
|
||||
OUT CHAR16 **String
|
||||
)
|
||||
{
|
||||
CHAR16 *StringBuffer;
|
||||
@ -440,9 +444,9 @@ ConvertMemorySizeToString (
|
||||
UnicodeValueToStringS (StringBuffer, 0x24, LEFT_JUSTIFY, MemorySize, 10);
|
||||
StrCatS (StringBuffer, 0x24 / sizeof (CHAR16), L" MB RAM");
|
||||
|
||||
*String = (CHAR16 *) StringBuffer;
|
||||
*String = (CHAR16 *)StringBuffer;
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -459,12 +463,12 @@ ConvertMemorySizeToString (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetOptionalStringByIndex (
|
||||
IN CHAR8 *OptionalStrStart,
|
||||
IN UINT8 Index,
|
||||
OUT CHAR16 **String
|
||||
IN CHAR8 *OptionalStrStart,
|
||||
IN UINT8 Index,
|
||||
OUT CHAR16 **String
|
||||
)
|
||||
{
|
||||
UINTN StrSize;
|
||||
UINTN StrSize;
|
||||
|
||||
if (Index == 0) {
|
||||
*String = AllocateZeroPool (sizeof (CHAR16));
|
||||
@ -492,7 +496,6 @@ GetOptionalStringByIndex (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
|
||||
Update the banner information for the Front Page based on Smbios information.
|
||||
@ -503,22 +506,22 @@ UpdateFrontPageBannerStrings (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT8 StrIndex;
|
||||
CHAR16 *NewString;
|
||||
CHAR16 *FirmwareVersionString;
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
||||
SMBIOS_TABLE_TYPE0 *Type0Record;
|
||||
SMBIOS_TABLE_TYPE1 *Type1Record;
|
||||
SMBIOS_TABLE_TYPE4 *Type4Record;
|
||||
SMBIOS_TABLE_TYPE19 *Type19Record;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINT64 InstalledMemory;
|
||||
BOOLEAN FoundCpu;
|
||||
UINT8 StrIndex;
|
||||
CHAR16 *NewString;
|
||||
CHAR16 *FirmwareVersionString;
|
||||
EFI_STATUS Status;
|
||||
EFI_SMBIOS_HANDLE SmbiosHandle;
|
||||
EFI_SMBIOS_PROTOCOL *Smbios;
|
||||
SMBIOS_TABLE_TYPE0 *Type0Record;
|
||||
SMBIOS_TABLE_TYPE1 *Type1Record;
|
||||
SMBIOS_TABLE_TYPE4 *Type4Record;
|
||||
SMBIOS_TABLE_TYPE19 *Type19Record;
|
||||
EFI_SMBIOS_TABLE_HEADER *Record;
|
||||
UINT64 InstalledMemory;
|
||||
BOOLEAN FoundCpu;
|
||||
|
||||
InstalledMemory = 0;
|
||||
FoundCpu = 0;
|
||||
FoundCpu = 0;
|
||||
|
||||
//
|
||||
// Update default banner string.
|
||||
@ -546,7 +549,7 @@ UpdateFrontPageBannerStrings (
|
||||
//
|
||||
// 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)) {
|
||||
//
|
||||
// Smbios protocol not found, get the default value.
|
||||
@ -580,17 +583,17 @@ UpdateFrontPageBannerStrings (
|
||||
}
|
||||
|
||||
SmbiosHandle = SMBIOS_HANDLE_PI_RESERVED;
|
||||
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
|
||||
while (!EFI_ERROR(Status)) {
|
||||
Status = Smbios->GetNext (Smbios, &SmbiosHandle, NULL, &Record, NULL);
|
||||
while (!EFI_ERROR (Status)) {
|
||||
if (Record->Type == SMBIOS_TYPE_BIOS_INFORMATION) {
|
||||
Type0Record = (SMBIOS_TABLE_TYPE0 *) Record;
|
||||
StrIndex = Type0Record->BiosVersion;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);
|
||||
Type0Record = (SMBIOS_TABLE_TYPE0 *)Record;
|
||||
StrIndex = Type0Record->BiosVersion;
|
||||
GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type0Record + Type0Record->Hdr.Length), StrIndex, &NewString);
|
||||
|
||||
FirmwareVersionString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);
|
||||
FirmwareVersionString = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);
|
||||
if (*FirmwareVersionString != 0x0000 ) {
|
||||
FreePool (NewString);
|
||||
NewString = (CHAR16 *) PcdGetPtr (PcdFirmwareVersionString);
|
||||
NewString = (CHAR16 *)PcdGetPtr (PcdFirmwareVersionString);
|
||||
UiCustomizeFrontPageBanner (3, TRUE, &NewString);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_BIOS_VERSION), NewString, NULL);
|
||||
} else {
|
||||
@ -601,27 +604,27 @@ UpdateFrontPageBannerStrings (
|
||||
}
|
||||
|
||||
if (Record->Type == SMBIOS_TYPE_SYSTEM_INFORMATION) {
|
||||
Type1Record = (SMBIOS_TABLE_TYPE1 *) Record;
|
||||
StrIndex = Type1Record->ProductName;
|
||||
GetOptionalStringByIndex ((CHAR8*)((UINT8*)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
|
||||
Type1Record = (SMBIOS_TABLE_TYPE1 *)Record;
|
||||
StrIndex = Type1Record->ProductName;
|
||||
GetOptionalStringByIndex ((CHAR8 *)((UINT8 *)Type1Record + Type1Record->Hdr.Length), StrIndex, &NewString);
|
||||
UiCustomizeFrontPageBanner (1, TRUE, &NewString);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_COMPUTER_MODEL), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
}
|
||||
|
||||
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.
|
||||
//
|
||||
if ((Type4Record->Status & SMBIOS_TYPE4_CPU_SOCKET_POPULATED) == SMBIOS_TYPE4_CPU_SOCKET_POPULATED) {
|
||||
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);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_MODEL), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
|
||||
ConvertProcessorToString(Type4Record->CurrentSpeed, 6, &NewString);
|
||||
ConvertProcessorToString (Type4Record->CurrentSpeed, 6, &NewString);
|
||||
UiCustomizeFrontPageBanner (2, FALSE, &NewString);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_CPU_SPEED), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
@ -631,13 +634,19 @@ UpdateFrontPageBannerStrings (
|
||||
}
|
||||
|
||||
if ( Record->Type == SMBIOS_TYPE_MEMORY_ARRAY_MAPPED_ADDRESS ) {
|
||||
Type19Record = (SMBIOS_TABLE_TYPE19 *) Record;
|
||||
Type19Record = (SMBIOS_TABLE_TYPE19 *)Record;
|
||||
if (Type19Record->StartingAddress != 0xFFFFFFFF ) {
|
||||
InstalledMemory += RShiftU64(Type19Record->EndingAddress -
|
||||
Type19Record->StartingAddress + 1, 10);
|
||||
InstalledMemory += RShiftU64 (
|
||||
Type19Record->EndingAddress -
|
||||
Type19Record->StartingAddress + 1,
|
||||
10
|
||||
);
|
||||
} else {
|
||||
InstalledMemory += RShiftU64(Type19Record->ExtendedEndingAddress -
|
||||
Type19Record->ExtendedStartingAddress + 1, 20);
|
||||
InstalledMemory += RShiftU64 (
|
||||
Type19Record->ExtendedEndingAddress -
|
||||
Type19Record->ExtendedStartingAddress + 1,
|
||||
20
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
@ -647,7 +656,7 @@ UpdateFrontPageBannerStrings (
|
||||
//
|
||||
// Now update the total installed RAM size
|
||||
//
|
||||
ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString );
|
||||
ConvertMemorySizeToString ((UINT32)InstalledMemory, &NewString);
|
||||
UiCustomizeFrontPageBanner (3, FALSE, &NewString);
|
||||
HiiSetString (gFrontPagePrivate.HiiHandle, STRING_TOKEN (STR_FRONT_PAGE_MEMORY_SIZE), NewString, NULL);
|
||||
FreePool (NewString);
|
||||
@ -695,7 +704,7 @@ UiSetConsoleMode (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiGraphicsOutputProtocolGuid,
|
||||
(VOID**)&GraphicsOutput
|
||||
(VOID **)&GraphicsOutput
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
GraphicsOutput = NULL;
|
||||
@ -704,7 +713,7 @@ UiSetConsoleMode (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
(VOID**)&SimpleTextOut
|
||||
(VOID **)&SimpleTextOut
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
SimpleTextOut = NULL;
|
||||
@ -733,7 +742,7 @@ UiSetConsoleMode (
|
||||
}
|
||||
|
||||
if (GraphicsOutput != NULL) {
|
||||
MaxGopMode = GraphicsOutput->Mode->MaxMode;
|
||||
MaxGopMode = GraphicsOutput->Mode->MaxMode;
|
||||
}
|
||||
|
||||
if (SimpleTextOut != NULL) {
|
||||
@ -749,22 +758,24 @@ UiSetConsoleMode (
|
||||
//
|
||||
for (ModeNumber = 0; ModeNumber < MaxGopMode; ModeNumber++) {
|
||||
Status = GraphicsOutput->QueryMode (
|
||||
GraphicsOutput,
|
||||
ModeNumber,
|
||||
&SizeOfInfo,
|
||||
&Info
|
||||
);
|
||||
GraphicsOutput,
|
||||
ModeNumber,
|
||||
&SizeOfInfo,
|
||||
&Info
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if ((Info->HorizontalResolution == NewHorizontalResolution) &&
|
||||
(Info->VerticalResolution == NewVerticalResolution)) {
|
||||
(Info->VerticalResolution == NewVerticalResolution))
|
||||
{
|
||||
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
|
||||
//
|
||||
Status = SimpleTextOut->QueryMode (SimpleTextOut, SimpleTextOut->Mode->Mode, &CurrentColumn, &CurrentRow);
|
||||
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
|
||||
//
|
||||
@ -776,7 +787,7 @@ UiSetConsoleMode (
|
||||
//
|
||||
for (Index = 0; Index < MaxTextMode; Index++) {
|
||||
Status = SimpleTextOut->QueryMode (SimpleTextOut, Index, &CurrentColumn, &CurrentRow);
|
||||
if (!EFI_ERROR(Status)) {
|
||||
if (!EFI_ERROR (Status)) {
|
||||
if ((CurrentColumn == NewColumns) && (CurrentRow == NewRows)) {
|
||||
//
|
||||
// Required text mode is supported, set it.
|
||||
@ -795,6 +806,7 @@ UiSetConsoleMode (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (Index == MaxTextMode) {
|
||||
//
|
||||
// If required text mode is not supported, return error.
|
||||
@ -815,6 +827,7 @@ UiSetConsoleMode (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (Info);
|
||||
}
|
||||
}
|
||||
@ -845,19 +858,21 @@ UiSetConsoleMode (
|
||||
// Locate all the handles with GOP protocol and reconnect it.
|
||||
//
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
ByProtocol,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
NULL,
|
||||
&HandleCount,
|
||||
&HandleBuffer
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
gBS->DisconnectController (HandleBuffer[Index], NULL, NULL);
|
||||
}
|
||||
|
||||
for (Index = 0; Index < HandleCount; Index++) {
|
||||
gBS->ConnectController (HandleBuffer[Index], NULL, NULL, TRUE);
|
||||
}
|
||||
|
||||
if (HandleBuffer != NULL) {
|
||||
FreePool (HandleBuffer);
|
||||
}
|
||||
@ -885,12 +900,12 @@ InitializeUserInterface (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
EFI_STATUS Status;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
|
||||
UINTN BootTextColumn;
|
||||
UINTN BootTextRow;
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
EFI_STATUS Status;
|
||||
EFI_GRAPHICS_OUTPUT_PROTOCOL *GraphicsOutput;
|
||||
EFI_SIMPLE_TEXT_OUTPUT_PROTOCOL *SimpleTextOut;
|
||||
UINTN BootTextColumn;
|
||||
UINTN BootTextRow;
|
||||
|
||||
if (!mModeInitialized) {
|
||||
//
|
||||
@ -900,7 +915,7 @@ InitializeUserInterface (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiGraphicsOutputProtocolGuid,
|
||||
(VOID**)&GraphicsOutput
|
||||
(VOID **)&GraphicsOutput
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
GraphicsOutput = NULL;
|
||||
@ -909,7 +924,7 @@ InitializeUserInterface (
|
||||
Status = gBS->HandleProtocol (
|
||||
gST->ConsoleOutHandle,
|
||||
&gEfiSimpleTextOutProtocolGuid,
|
||||
(VOID**)&SimpleTextOut
|
||||
(VOID **)&SimpleTextOut
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
SimpleTextOut = NULL;
|
||||
@ -942,7 +957,7 @@ InitializeUserInterface (
|
||||
mSetupTextModeColumn = PcdGet32 (PcdSetupConOutColumn);
|
||||
mSetupTextModeRow = PcdGet32 (PcdSetupConOutRow);
|
||||
|
||||
mModeInitialized = TRUE;
|
||||
mModeInitialized = TRUE;
|
||||
}
|
||||
|
||||
gBS->SetWatchdogTimer (0x0000, 0x0000, 0x0000, NULL);
|
||||
@ -976,11 +991,11 @@ InitializeUserInterface (
|
||||
VOID
|
||||
EFIAPI
|
||||
UiEntry (
|
||||
IN BOOLEAN ConnectAllHappened
|
||||
IN BOOLEAN ConnectAllHappened
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_LOGO_PROTOCOL *BootLogo;
|
||||
|
||||
//
|
||||
// Enter Setup page.
|
||||
@ -1006,7 +1021,7 @@ UiEntry (
|
||||
//
|
||||
// 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)) {
|
||||
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 ();
|
||||
}
|
||||
@ -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.
|
||||
//
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Record the info that a reset is required.
|
||||
A module boolean variable is used to record whether a reset is required.
|
||||
@ -1052,10 +1063,6 @@ EnableResetRequired (
|
||||
mResetRequired = TRUE;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Check if user changed any option setting which needs a system reset to be effective.
|
||||
|
||||
@ -1069,7 +1076,6 @@ IsResetRequired (
|
||||
return mResetRequired;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
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
|
||||
@ -1082,15 +1088,14 @@ SetupResetReminder (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_INPUT_KEY Key;
|
||||
CHAR16 *StringBuffer1;
|
||||
CHAR16 *StringBuffer2;
|
||||
EFI_INPUT_KEY Key;
|
||||
CHAR16 *StringBuffer1;
|
||||
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 ()) {
|
||||
|
||||
StringBuffer1 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
|
||||
ASSERT (StringBuffer1 != NULL);
|
||||
StringBuffer2 = AllocateZeroPool (MAX_STRING_LEN * sizeof (CHAR16));
|
||||
@ -1110,4 +1115,3 @@ SetupResetReminder (
|
||||
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -18,24 +18,23 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
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
|
||||
// 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
|
||||
//
|
||||
#define FRONT_PAGE_FORM_ID 0x1000
|
||||
#define FRONT_PAGE_FORM_ID 0x1000
|
||||
|
||||
#define LABEL_FRANTPAGE_INFORMATION 0x1000
|
||||
#define LABEL_END 0xffff
|
||||
#define LABEL_FRANTPAGE_INFORMATION 0x1000
|
||||
#define LABEL_END 0xffff
|
||||
|
||||
#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')
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
//
|
||||
// HII relative handles
|
||||
//
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
EFI_HANDLE DriverHandle;
|
||||
EFI_STRING_ID *LanguageToken;
|
||||
EFI_HII_HANDLE HiiHandle;
|
||||
EFI_HANDLE DriverHandle;
|
||||
EFI_STRING_ID *LanguageToken;
|
||||
|
||||
//
|
||||
// Produced protocols
|
||||
//
|
||||
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
|
||||
EFI_HII_CONFIG_ACCESS_PROTOCOL ConfigAccess;
|
||||
} FRONT_PAGE_CALLBACK_DATA;
|
||||
|
||||
|
||||
#define EFI_FP_CALLBACK_DATA_FROM_THIS(a) \
|
||||
CR (a, \
|
||||
FRONT_PAGE_CALLBACK_DATA, \
|
||||
@ -93,10 +91,10 @@ typedef struct {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FakeExtractConfig (
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Request,
|
||||
OUT EFI_STRING *Progress,
|
||||
OUT EFI_STRING *Results
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Request,
|
||||
OUT EFI_STRING *Progress,
|
||||
OUT EFI_STRING *Results
|
||||
);
|
||||
|
||||
/**
|
||||
@ -118,9 +116,9 @@ FakeExtractConfig (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FakeRouteConfig (
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Configuration,
|
||||
OUT EFI_STRING *Progress
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN CONST EFI_STRING Configuration,
|
||||
OUT EFI_STRING *Progress
|
||||
);
|
||||
|
||||
/**
|
||||
@ -144,12 +142,12 @@ FakeRouteConfig (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
FrontPageCallback (
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
IN CONST EFI_HII_CONFIG_ACCESS_PROTOCOL *This,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
);
|
||||
|
||||
/**
|
||||
@ -177,9 +175,9 @@ InitializeFrontPage (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetProducerString (
|
||||
IN EFI_GUID *ProducerGuid,
|
||||
IN EFI_STRING_ID Token,
|
||||
OUT CHAR16 **String
|
||||
IN EFI_GUID *ProducerGuid,
|
||||
IN EFI_STRING_ID Token,
|
||||
OUT CHAR16 **String
|
||||
);
|
||||
|
||||
/**
|
||||
@ -192,7 +190,7 @@ GetProducerString (
|
||||
VOID
|
||||
EFIAPI
|
||||
UiEntry (
|
||||
IN BOOLEAN ConnectAllHappened
|
||||
IN BOOLEAN ConnectAllHappened
|
||||
);
|
||||
|
||||
/**
|
||||
@ -206,8 +204,7 @@ UiEntry (
|
||||
**/
|
||||
CHAR16 *
|
||||
ExtractDevicePathFromHiiHandle (
|
||||
IN EFI_HII_HANDLE Handle
|
||||
IN EFI_HII_HANDLE Handle
|
||||
);
|
||||
|
||||
#endif // _FRONT_PAGE_H_
|
||||
|
||||
|
@ -37,7 +37,7 @@ UiCustomizeFrontPage (
|
||||
//
|
||||
// Create empty line.
|
||||
//
|
||||
UiCreateEmptyLine(HiiHandle, StartOpCodeHandle);
|
||||
UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
|
||||
|
||||
//
|
||||
// Find third party drivers which need to be shown in the front page.
|
||||
@ -47,17 +47,17 @@ UiCustomizeFrontPage (
|
||||
//
|
||||
// Create empty line.
|
||||
//
|
||||
UiCreateEmptyLine(HiiHandle, StartOpCodeHandle);
|
||||
UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
|
||||
|
||||
//
|
||||
// Create "Continue" menu.
|
||||
//
|
||||
UiCreateContinueMenu(HiiHandle, StartOpCodeHandle);
|
||||
UiCreateContinueMenu (HiiHandle, StartOpCodeHandle);
|
||||
|
||||
//
|
||||
// Create reset menu.
|
||||
//
|
||||
UiCreateResetMenu(HiiHandle, StartOpCodeHandle);
|
||||
UiCreateResetMenu (HiiHandle, StartOpCodeHandle);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -80,15 +80,15 @@ UiCustomizeFrontPage (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UiFrontPageCallbackHandler (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (UiSupportLibCallbackHandler (HiiHandle, Action, QuestionId, Type, Value, ActionRequest, &Status)) {
|
||||
return Status;
|
||||
@ -121,19 +121,21 @@ UiFrontPageCallbackHandler (
|
||||
**/
|
||||
VOID
|
||||
UiCustomizeFrontPageBanner (
|
||||
IN UINTN LineIndex,
|
||||
IN BOOLEAN LeftOrRight,
|
||||
IN OUT EFI_STRING *BannerStr
|
||||
IN UINTN LineIndex,
|
||||
IN BOOLEAN LeftOrRight,
|
||||
IN OUT EFI_STRING *BannerStr
|
||||
)
|
||||
{
|
||||
if ((LineIndex == 5) && LeftOrRight) {
|
||||
// Update STR_CUSTOMIZE_BANNER_LINE5_LEFT
|
||||
if (PcdGetBool(PcdTestKeyUsed)) {
|
||||
if (PcdGetBool (PcdTestKeyUsed)) {
|
||||
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;
|
||||
}
|
||||
|
@ -33,9 +33,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
VOID
|
||||
UiCustomizeFrontPageBanner (
|
||||
IN UINTN LineIndex,
|
||||
IN BOOLEAN LeftOrRight,
|
||||
IN OUT EFI_STRING *BannerStr
|
||||
IN UINTN LineIndex,
|
||||
IN BOOLEAN LeftOrRight,
|
||||
IN OUT EFI_STRING *BannerStr
|
||||
);
|
||||
|
||||
/**
|
||||
@ -71,12 +71,12 @@ UiCustomizeFrontPage (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UiFrontPageCallbackHandler (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -30,29 +30,28 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
// This is the VFR compiler generated header file which defines the
|
||||
// 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_RESET 0x1001
|
||||
#define FRONT_PAGE_KEY_LANGUAGE 0x1002
|
||||
#define FRONT_PAGE_KEY_DRIVER 0x2000
|
||||
#define FRONT_PAGE_KEY_CONTINUE 0x1000
|
||||
#define FRONT_PAGE_KEY_RESET 0x1001
|
||||
#define FRONT_PAGE_KEY_LANGUAGE 0x1002
|
||||
#define FRONT_PAGE_KEY_DRIVER 0x2000
|
||||
|
||||
typedef struct {
|
||||
EFI_STRING_ID PromptId;
|
||||
EFI_STRING_ID HelpId;
|
||||
EFI_STRING_ID DevicePathId;
|
||||
EFI_GUID FormSetGuid;
|
||||
BOOLEAN EmptyLineAfter;
|
||||
EFI_STRING_ID PromptId;
|
||||
EFI_STRING_ID HelpId;
|
||||
EFI_STRING_ID DevicePathId;
|
||||
EFI_GUID FormSetGuid;
|
||||
BOOLEAN EmptyLineAfter;
|
||||
} UI_HII_DRIVER_INSTANCE;
|
||||
|
||||
CHAR8 *gLanguageString;
|
||||
EFI_STRING_ID *gLanguageToken;
|
||||
UI_HII_DRIVER_INSTANCE *gHiiDriverList;
|
||||
extern EFI_HII_HANDLE gStringPackHandle;
|
||||
UINT8 gCurrentLanguageIndex;
|
||||
|
||||
CHAR8 *gLanguageString;
|
||||
EFI_STRING_ID *gLanguageToken;
|
||||
UI_HII_DRIVER_INSTANCE *gHiiDriverList;
|
||||
extern EFI_HII_HANDLE gStringPackHandle;
|
||||
UINT8 gCurrentLanguageIndex;
|
||||
|
||||
/**
|
||||
Get next language from language code list (with separator ';').
|
||||
@ -68,8 +67,8 @@ UINT8 gCurrentLanguageIndex;
|
||||
**/
|
||||
VOID
|
||||
GetNextLanguage (
|
||||
IN OUT CHAR8 **LangCode,
|
||||
OUT CHAR8 *Lang
|
||||
IN OUT CHAR8 **LangCode,
|
||||
OUT CHAR8 *Lang
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
@ -79,7 +78,7 @@ GetNextLanguage (
|
||||
ASSERT (*LangCode != NULL);
|
||||
ASSERT (Lang != NULL);
|
||||
|
||||
Index = 0;
|
||||
Index = 0;
|
||||
StringPtr = *LangCode;
|
||||
while (StringPtr[Index] != 0 && StringPtr[Index] != ';') {
|
||||
Index++;
|
||||
@ -91,6 +90,7 @@ GetNextLanguage (
|
||||
if (StringPtr[Index] == ';') {
|
||||
Index++;
|
||||
}
|
||||
|
||||
*LangCode = StringPtr + Index;
|
||||
}
|
||||
|
||||
@ -106,13 +106,13 @@ GetNextLanguage (
|
||||
**/
|
||||
EFI_STATUS
|
||||
LanguageChangeHandler (
|
||||
IN EFI_IFR_TYPE_VALUE *Value
|
||||
IN EFI_IFR_TYPE_VALUE *Value
|
||||
)
|
||||
{
|
||||
CHAR8 *LangCode;
|
||||
CHAR8 *Lang;
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
CHAR8 *LangCode;
|
||||
CHAR8 *Lang;
|
||||
UINTN Index;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Allocate working buffer for RFC 4646 language in supported LanguageString.
|
||||
@ -120,7 +120,7 @@ LanguageChangeHandler (
|
||||
Lang = AllocatePool (AsciiStrSize (gLanguageString));
|
||||
ASSERT (Lang != NULL);
|
||||
|
||||
Index = 0;
|
||||
Index = 0;
|
||||
LangCode = gLanguageString;
|
||||
while (*LangCode != 0) {
|
||||
GetNextLanguage (&LangCode, Lang);
|
||||
@ -148,6 +148,7 @@ LanguageChangeHandler (
|
||||
} else {
|
||||
ASSERT (FALSE);
|
||||
}
|
||||
|
||||
FreePool (Lang);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -172,28 +173,30 @@ LanguageChangeHandler (
|
||||
**/
|
||||
BOOLEAN
|
||||
UiSupportLibCallbackHandler (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
|
||||
OUT EFI_STATUS *Status
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
|
||||
OUT EFI_STATUS *Status
|
||||
)
|
||||
{
|
||||
if (QuestionId != FRONT_PAGE_KEY_CONTINUE &&
|
||||
QuestionId != FRONT_PAGE_KEY_RESET &&
|
||||
QuestionId != FRONT_PAGE_KEY_LANGUAGE) {
|
||||
if ((QuestionId != FRONT_PAGE_KEY_CONTINUE) &&
|
||||
(QuestionId != FRONT_PAGE_KEY_RESET) &&
|
||||
(QuestionId != FRONT_PAGE_KEY_LANGUAGE))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (Action == EFI_BROWSER_ACTION_RETRIEVE) {
|
||||
if (QuestionId == FRONT_PAGE_KEY_LANGUAGE) {
|
||||
Value->u8 = gCurrentLanguageIndex;
|
||||
*Status = EFI_SUCCESS;
|
||||
*Status = EFI_SUCCESS;
|
||||
} else {
|
||||
*Status = EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
@ -213,26 +216,26 @@ UiSupportLibCallbackHandler (
|
||||
|
||||
*Status = EFI_SUCCESS;
|
||||
switch (QuestionId) {
|
||||
case FRONT_PAGE_KEY_CONTINUE:
|
||||
//
|
||||
// This is the continue - clear the screen and return an error to get out of FrontPage loop
|
||||
//
|
||||
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
|
||||
break;
|
||||
case FRONT_PAGE_KEY_CONTINUE:
|
||||
//
|
||||
// This is the continue - clear the screen and return an error to get out of FrontPage loop
|
||||
//
|
||||
*ActionRequest = EFI_BROWSER_ACTION_REQUEST_EXIT;
|
||||
break;
|
||||
|
||||
case FRONT_PAGE_KEY_LANGUAGE:
|
||||
*Status = LanguageChangeHandler(Value);
|
||||
break;
|
||||
case FRONT_PAGE_KEY_LANGUAGE:
|
||||
*Status = LanguageChangeHandler (Value);
|
||||
break;
|
||||
|
||||
case FRONT_PAGE_KEY_RESET:
|
||||
//
|
||||
// Reset
|
||||
//
|
||||
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
|
||||
*Status = EFI_UNSUPPORTED;
|
||||
case FRONT_PAGE_KEY_RESET:
|
||||
//
|
||||
// Reset
|
||||
//
|
||||
gRT->ResetSystem (EfiResetCold, EFI_SUCCESS, 0, NULL);
|
||||
*Status = EFI_UNSUPPORTED;
|
||||
|
||||
default:
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
@ -248,20 +251,20 @@ UiSupportLibCallbackHandler (
|
||||
**/
|
||||
VOID
|
||||
UiCreateLanguageMenu (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
)
|
||||
{
|
||||
CHAR8 *LangCode;
|
||||
CHAR8 *Lang;
|
||||
UINTN LangSize;
|
||||
CHAR8 *CurrentLang;
|
||||
UINTN OptionCount;
|
||||
CHAR16 *StringBuffer;
|
||||
VOID *OptionsOpCodeHandle;
|
||||
UINTN StringSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_HII_STRING_PROTOCOL *HiiString;
|
||||
CHAR8 *LangCode;
|
||||
CHAR8 *Lang;
|
||||
UINTN LangSize;
|
||||
CHAR8 *CurrentLang;
|
||||
UINTN OptionCount;
|
||||
CHAR16 *StringBuffer;
|
||||
VOID *OptionsOpCodeHandle;
|
||||
UINTN StringSize;
|
||||
EFI_STATUS Status;
|
||||
EFI_HII_STRING_PROTOCOL *HiiString;
|
||||
|
||||
Lang = NULL;
|
||||
StringBuffer = NULL;
|
||||
@ -272,17 +275,17 @@ UiCreateLanguageMenu (
|
||||
OptionsOpCodeHandle = HiiAllocateOpCodeHandle ();
|
||||
ASSERT (OptionsOpCodeHandle != NULL);
|
||||
|
||||
GetEfiGlobalVariable2 (L"PlatformLang", (VOID**)&CurrentLang, NULL);
|
||||
GetEfiGlobalVariable2 (L"PlatformLang", (VOID **)&CurrentLang, NULL);
|
||||
|
||||
//
|
||||
// Get Support language list from variable.
|
||||
//
|
||||
GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID**)&gLanguageString, NULL);
|
||||
GetEfiGlobalVariable2 (L"PlatformLangCodes", (VOID **)&gLanguageString, NULL);
|
||||
if (gLanguageString == NULL) {
|
||||
gLanguageString = AllocateCopyPool (
|
||||
AsciiStrSize ((CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),
|
||||
(CHAR8 *) PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)
|
||||
);
|
||||
AsciiStrSize ((CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)),
|
||||
(CHAR8 *)PcdGetPtr (PcdUefiVariableDefaultPlatformLangCodes)
|
||||
);
|
||||
ASSERT (gLanguageString != NULL);
|
||||
}
|
||||
|
||||
@ -291,13 +294,13 @@ UiCreateLanguageMenu (
|
||||
// Count the language list number.
|
||||
//
|
||||
LangCode = gLanguageString;
|
||||
Lang = AllocatePool (AsciiStrSize (gLanguageString));
|
||||
Lang = AllocatePool (AsciiStrSize (gLanguageString));
|
||||
ASSERT (Lang != NULL);
|
||||
|
||||
OptionCount = 0;
|
||||
while (*LangCode != 0) {
|
||||
GetNextLanguage (&LangCode, Lang);
|
||||
OptionCount ++;
|
||||
OptionCount++;
|
||||
}
|
||||
|
||||
//
|
||||
@ -306,16 +309,16 @@ UiCreateLanguageMenu (
|
||||
gLanguageToken = AllocateZeroPool ((OptionCount + 1) * sizeof (EFI_STRING_ID));
|
||||
ASSERT (gLanguageToken != NULL);
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **) &HiiString);
|
||||
Status = gBS->LocateProtocol (&gEfiHiiStringProtocolGuid, NULL, (VOID **)&HiiString);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
LangCode = gLanguageString;
|
||||
OptionCount = 0;
|
||||
LangCode = gLanguageString;
|
||||
OptionCount = 0;
|
||||
while (*LangCode != 0) {
|
||||
GetNextLanguage (&LangCode, Lang);
|
||||
|
||||
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) {
|
||||
StringBuffer = AllocateZeroPool (StringSize);
|
||||
ASSERT (StringBuffer != NULL);
|
||||
@ -324,7 +327,7 @@ UiCreateLanguageMenu (
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
LangSize = AsciiStrSize (Lang);
|
||||
LangSize = AsciiStrSize (Lang);
|
||||
StringBuffer = AllocatePool (LangSize * sizeof (CHAR16));
|
||||
ASSERT (StringBuffer != NULL);
|
||||
AsciiStrToUnicodeStrS (Lang, StringBuffer, LangSize);
|
||||
@ -339,31 +342,32 @@ UiCreateLanguageMenu (
|
||||
}
|
||||
|
||||
ASSERT (gLanguageToken != NULL);
|
||||
LangCode = gLanguageString;
|
||||
LangCode = gLanguageString;
|
||||
OptionCount = 0;
|
||||
if (Lang == NULL) {
|
||||
Lang = AllocatePool (AsciiStrSize (gLanguageString));
|
||||
ASSERT (Lang != NULL);
|
||||
}
|
||||
|
||||
while (*LangCode != 0) {
|
||||
GetNextLanguage (&LangCode, Lang);
|
||||
|
||||
if (CurrentLang != NULL && AsciiStrCmp (Lang, CurrentLang) == 0) {
|
||||
if ((CurrentLang != NULL) && (AsciiStrCmp (Lang, CurrentLang) == 0)) {
|
||||
HiiCreateOneOfOptionOpCode (
|
||||
OptionsOpCodeHandle,
|
||||
gLanguageToken[OptionCount],
|
||||
EFI_IFR_OPTION_DEFAULT,
|
||||
EFI_IFR_NUMERIC_SIZE_1,
|
||||
(UINT8) OptionCount
|
||||
(UINT8)OptionCount
|
||||
);
|
||||
gCurrentLanguageIndex = (UINT8) OptionCount;
|
||||
gCurrentLanguageIndex = (UINT8)OptionCount;
|
||||
} else {
|
||||
HiiCreateOneOfOptionOpCode (
|
||||
OptionsOpCodeHandle,
|
||||
gLanguageToken[OptionCount],
|
||||
0,
|
||||
EFI_IFR_NUMERIC_SIZE_1,
|
||||
(UINT8) OptionCount
|
||||
(UINT8)OptionCount
|
||||
);
|
||||
}
|
||||
|
||||
@ -373,6 +377,7 @@ UiCreateLanguageMenu (
|
||||
if (CurrentLang != NULL) {
|
||||
FreePool (CurrentLang);
|
||||
}
|
||||
|
||||
FreePool (Lang);
|
||||
|
||||
HiiCreateOneOfOpCode (
|
||||
@ -398,8 +403,8 @@ UiCreateLanguageMenu (
|
||||
**/
|
||||
VOID
|
||||
UiCreateContinueMenu (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
)
|
||||
{
|
||||
HiiCreateActionOpCode (
|
||||
@ -421,8 +426,8 @@ UiCreateContinueMenu (
|
||||
**/
|
||||
VOID
|
||||
UiCreateEmptyLine (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
)
|
||||
{
|
||||
HiiCreateSubTitleOpCode (StartOpCodeHandle, STRING_TOKEN (STR_NULL_STRING), 0, 0, 0);
|
||||
@ -437,8 +442,8 @@ UiCreateEmptyLine (
|
||||
**/
|
||||
VOID
|
||||
UiCreateResetMenu (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
)
|
||||
{
|
||||
HiiCreateActionOpCode (
|
||||
@ -462,11 +467,11 @@ UiCreateResetMenu (
|
||||
**/
|
||||
CHAR16 *
|
||||
ExtractDevicePathFromHiiHandle (
|
||||
IN EFI_HII_HANDLE Handle
|
||||
IN EFI_HII_HANDLE Handle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE DriverHandle;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE DriverHandle;
|
||||
|
||||
ASSERT (Handle != NULL);
|
||||
|
||||
@ -479,7 +484,7 @@ ExtractDevicePathFromHiiHandle (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return ConvertDevicePathToText(DevicePathFromHandle (DriverHandle), FALSE, FALSE);
|
||||
return ConvertDevicePathToText (DevicePathFromHandle (DriverHandle), FALSE, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -496,49 +501,49 @@ ExtractDevicePathFromHiiHandle (
|
||||
**/
|
||||
BOOLEAN
|
||||
RequiredDriver (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_GUID *Guid,
|
||||
OUT EFI_STRING_ID *PromptId,
|
||||
OUT EFI_STRING_ID *HelpId,
|
||||
OUT VOID *FormsetGuid
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_GUID *Guid,
|
||||
OUT EFI_STRING_ID *PromptId,
|
||||
OUT EFI_STRING_ID *HelpId,
|
||||
OUT VOID *FormsetGuid
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT8 ClassGuidNum;
|
||||
EFI_GUID *ClassGuid;
|
||||
EFI_IFR_FORM_SET *Buffer;
|
||||
UINTN BufferSize;
|
||||
UINT8 *Ptr;
|
||||
UINTN TempSize;
|
||||
BOOLEAN RetVal;
|
||||
EFI_STATUS Status;
|
||||
UINT8 ClassGuidNum;
|
||||
EFI_GUID *ClassGuid;
|
||||
EFI_IFR_FORM_SET *Buffer;
|
||||
UINTN BufferSize;
|
||||
UINT8 *Ptr;
|
||||
UINTN TempSize;
|
||||
BOOLEAN RetVal;
|
||||
|
||||
Status = HiiGetFormSetFromHiiHandle(HiiHandle, &Buffer,&BufferSize);
|
||||
Status = HiiGetFormSetFromHiiHandle (HiiHandle, &Buffer, &BufferSize);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
RetVal = FALSE;
|
||||
RetVal = FALSE;
|
||||
TempSize = 0;
|
||||
Ptr = (UINT8 *) Buffer;
|
||||
while(TempSize < BufferSize) {
|
||||
TempSize += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
|
||||
Ptr = (UINT8 *)Buffer;
|
||||
while (TempSize < BufferSize) {
|
||||
TempSize += ((EFI_IFR_OP_HEADER *)Ptr)->Length;
|
||||
|
||||
if (((EFI_IFR_OP_HEADER *) Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)){
|
||||
Ptr += ((EFI_IFR_OP_HEADER *) Ptr)->Length;
|
||||
if (((EFI_IFR_OP_HEADER *)Ptr)->Length <= OFFSET_OF (EFI_IFR_FORM_SET, Flags)) {
|
||||
Ptr += ((EFI_IFR_OP_HEADER *)Ptr)->Length;
|
||||
continue;
|
||||
}
|
||||
|
||||
ClassGuidNum = (UINT8) (((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
|
||||
ClassGuid = (EFI_GUID *) (VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
|
||||
ClassGuidNum = (UINT8)(((EFI_IFR_FORM_SET *)Ptr)->Flags & 0x3);
|
||||
ClassGuid = (EFI_GUID *)(VOID *)(Ptr + sizeof (EFI_IFR_FORM_SET));
|
||||
while (ClassGuidNum-- > 0) {
|
||||
if (!CompareGuid (Guid, ClassGuid)){
|
||||
ClassGuid ++;
|
||||
if (!CompareGuid (Guid, ClassGuid)) {
|
||||
ClassGuid++;
|
||||
continue;
|
||||
}
|
||||
|
||||
*PromptId = ((EFI_IFR_FORM_SET *)Ptr)->FormSetTitle;
|
||||
*HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;
|
||||
CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *) Ptr)->Guid, sizeof (EFI_GUID));
|
||||
*HelpId = ((EFI_IFR_FORM_SET *)Ptr)->Help;
|
||||
CopyMem (FormsetGuid, &((EFI_IFR_FORM_SET *)Ptr)->Guid, sizeof (EFI_GUID));
|
||||
RetVal = TRUE;
|
||||
}
|
||||
}
|
||||
@ -562,23 +567,23 @@ RequiredDriver (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UiListThirdPartyDrivers (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
|
||||
IN VOID *StartOpCodeHandle
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
EFI_STRING String;
|
||||
EFI_STRING_ID Token;
|
||||
EFI_STRING_ID TokenHelp;
|
||||
EFI_HII_HANDLE *HiiHandles;
|
||||
CHAR16 *DevicePathStr;
|
||||
UINTN Count;
|
||||
UINTN CurrentSize;
|
||||
UI_HII_DRIVER_INSTANCE *DriverListPtr;
|
||||
EFI_STRING NewName;
|
||||
BOOLEAN EmptyLineAfter;
|
||||
UINTN Index;
|
||||
EFI_STRING String;
|
||||
EFI_STRING_ID Token;
|
||||
EFI_STRING_ID TokenHelp;
|
||||
EFI_HII_HANDLE *HiiHandles;
|
||||
CHAR16 *DevicePathStr;
|
||||
UINTN Count;
|
||||
UINTN CurrentSize;
|
||||
UI_HII_DRIVER_INSTANCE *DriverListPtr;
|
||||
EFI_STRING NewName;
|
||||
BOOLEAN EmptyLineAfter;
|
||||
|
||||
if (gHiiDriverList != NULL) {
|
||||
FreePool (gHiiDriverList);
|
||||
@ -590,7 +595,7 @@ UiListThirdPartyDrivers (
|
||||
gHiiDriverList = AllocateZeroPool (UI_HII_DRIVER_LIST_SIZE * sizeof (UI_HII_DRIVER_INSTANCE));
|
||||
ASSERT (gHiiDriverList != NULL);
|
||||
DriverListPtr = gHiiDriverList;
|
||||
CurrentSize = UI_HII_DRIVER_LIST_SIZE;
|
||||
CurrentSize = UI_HII_DRIVER_LIST_SIZE;
|
||||
|
||||
for (Index = 0, Count = 0; HiiHandles[Index] != NULL; Index++) {
|
||||
if (!RequiredDriver (HiiHandles[Index], ClassGuid, &Token, &TokenHelp, &gHiiDriverList[Count].FormSetGuid)) {
|
||||
@ -608,10 +613,11 @@ UiListThirdPartyDrivers (
|
||||
EmptyLineAfter = FALSE;
|
||||
if (SpecialHandlerFn (String, &NewName, &EmptyLineAfter)) {
|
||||
FreePool (String);
|
||||
String = NewName;
|
||||
String = NewName;
|
||||
DriverListPtr[Count].EmptyLineAfter = EmptyLineAfter;
|
||||
}
|
||||
}
|
||||
|
||||
DriverListPtr[Count].PromptId = HiiSetString (HiiHandle, 0, String, NULL);
|
||||
FreePool (String);
|
||||
|
||||
@ -620,11 +626,12 @@ UiListThirdPartyDrivers (
|
||||
String = HiiGetString (gStringPackHandle, STRING_TOKEN (STR_MISSING_STRING), NULL);
|
||||
ASSERT (String != NULL);
|
||||
}
|
||||
|
||||
DriverListPtr[Count].HelpId = HiiSetString (HiiHandle, 0, String, NULL);
|
||||
FreePool (String);
|
||||
|
||||
DevicePathStr = ExtractDevicePathFromHiiHandle(HiiHandles[Index]);
|
||||
if (DevicePathStr != NULL){
|
||||
DevicePathStr = ExtractDevicePathFromHiiHandle (HiiHandles[Index]);
|
||||
if (DevicePathStr != NULL) {
|
||||
DriverListPtr[Count].DevicePathId = HiiSetString (HiiHandle, 0, DevicePathStr, NULL);
|
||||
FreePool (DevicePathStr);
|
||||
} else {
|
||||
@ -636,12 +643,12 @@ UiListThirdPartyDrivers (
|
||||
DriverListPtr = ReallocatePool (
|
||||
CurrentSize * sizeof (UI_HII_DRIVER_INSTANCE),
|
||||
(Count + UI_HII_DRIVER_LIST_SIZE)
|
||||
* sizeof (UI_HII_DRIVER_INSTANCE),
|
||||
* sizeof (UI_HII_DRIVER_INSTANCE),
|
||||
gHiiDriverList
|
||||
);
|
||||
ASSERT (DriverListPtr != NULL);
|
||||
gHiiDriverList = DriverListPtr;
|
||||
CurrentSize += UI_HII_DRIVER_LIST_SIZE;
|
||||
CurrentSize += UI_HII_DRIVER_LIST_SIZE;
|
||||
}
|
||||
}
|
||||
|
||||
@ -655,17 +662,17 @@ UiListThirdPartyDrivers (
|
||||
gHiiDriverList[Index].PromptId,
|
||||
gHiiDriverList[Index].HelpId,
|
||||
0,
|
||||
(EFI_QUESTION_ID) (Index + FRONT_PAGE_KEY_DRIVER),
|
||||
(EFI_QUESTION_ID)(Index + FRONT_PAGE_KEY_DRIVER),
|
||||
0,
|
||||
&gHiiDriverList[Index].FormSetGuid,
|
||||
gHiiDriverList[Index].DevicePathId
|
||||
);
|
||||
);
|
||||
|
||||
if (gHiiDriverList[Index].EmptyLineAfter) {
|
||||
UiCreateEmptyLine (HiiHandle, StartOpCodeHandle);
|
||||
}
|
||||
|
||||
Index ++;
|
||||
Index++;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
@ -18,8 +18,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
VOID
|
||||
UiCreateContinueMenu (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -31,8 +31,8 @@ UiCreateContinueMenu (
|
||||
**/
|
||||
VOID
|
||||
UiCreateEmptyLine (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -44,8 +44,8 @@ UiCreateEmptyLine (
|
||||
**/
|
||||
VOID
|
||||
UiCreateLanguageMenu (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -57,8 +57,8 @@ UiCreateLanguageMenu (
|
||||
**/
|
||||
VOID
|
||||
UiCreateResetMenu (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN VOID *StartOpCodeHandle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -77,7 +77,7 @@ BOOLEAN
|
||||
IN CHAR16 *DriverName,
|
||||
OUT CHAR16 **NewName,
|
||||
OUT BOOLEAN *EmptyLineAfter
|
||||
);
|
||||
);
|
||||
|
||||
/**
|
||||
Search the drivers in the system which need to show in the front page
|
||||
@ -93,10 +93,10 @@ BOOLEAN
|
||||
**/
|
||||
EFI_STATUS
|
||||
UiListThirdPartyDrivers (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
|
||||
IN VOID *StartOpCodeHandle
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_GUID *ClassGuid,
|
||||
IN DRIVER_SPECIAL_HANDLER SpecialHandlerFn,
|
||||
IN VOID *StartOpCodeHandle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -118,13 +118,13 @@ UiListThirdPartyDrivers (
|
||||
**/
|
||||
BOOLEAN
|
||||
UiSupportLibCallbackHandler (
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
|
||||
OUT EFI_STATUS *Status
|
||||
IN EFI_HII_HANDLE HiiHandle,
|
||||
IN EFI_BROWSER_ACTION Action,
|
||||
IN EFI_QUESTION_ID QuestionId,
|
||||
IN UINT8 Type,
|
||||
IN EFI_IFR_TYPE_VALUE *Value,
|
||||
OUT EFI_BROWSER_ACTION_REQUEST *ActionRequest,
|
||||
OUT EFI_STATUS *Status
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -9,36 +9,36 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include "Ui.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 }
|
||||
};
|
||||
|
||||
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 WIDE_GLYPH_NUMBER 75
|
||||
#define NARROW_GLYPH_NUMBER 8
|
||||
#define WIDE_GLYPH_NUMBER 75
|
||||
|
||||
typedef struct {
|
||||
///
|
||||
/// This 4-bytes total array length is required by HiiAddPackages()
|
||||
///
|
||||
UINT32 Length;
|
||||
UINT32 Length;
|
||||
|
||||
//
|
||||
// This is the Font package definition
|
||||
//
|
||||
EFI_HII_PACKAGE_HEADER Header;
|
||||
UINT16 NumberOfNarrowGlyphs;
|
||||
UINT16 NumberOfWideGlyphs;
|
||||
EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
|
||||
EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
|
||||
EFI_HII_PACKAGE_HEADER Header;
|
||||
UINT16 NumberOfNarrowGlyphs;
|
||||
UINT16 NumberOfWideGlyphs;
|
||||
EFI_NARROW_GLYPH NarrowArray[NARROW_GLYPH_NUMBER];
|
||||
EFI_WIDE_GLYPH WideArray[WIDE_GLYPH_NUMBER];
|
||||
} FONT_PACK_BIN;
|
||||
|
||||
FONT_PACK_BIN mFontBin = {
|
||||
FONT_PACK_BIN mFontBin = {
|
||||
sizeof (FONT_PACK_BIN),
|
||||
{
|
||||
sizeof (FONT_PACK_BIN) - sizeof (UINT32),
|
||||
@ -260,11 +260,11 @@ InitializeStringSupport (
|
||||
)
|
||||
{
|
||||
gStringPackHandle = HiiAddPackages (
|
||||
&mUiStringPackGuid,
|
||||
gImageHandle,
|
||||
UiAppStrings,
|
||||
NULL
|
||||
);
|
||||
&mUiStringPackGuid,
|
||||
gImageHandle,
|
||||
UiAppStrings,
|
||||
NULL
|
||||
);
|
||||
ASSERT (gStringPackHandle != NULL);
|
||||
}
|
||||
|
||||
@ -292,7 +292,7 @@ UninitializeStringSupport (
|
||||
**/
|
||||
CHAR16 *
|
||||
GetStringById (
|
||||
IN EFI_STRING_ID Id
|
||||
IN EFI_STRING_ID Id
|
||||
)
|
||||
{
|
||||
return HiiGetString (gStringPackHandle, Id, NULL);
|
||||
|
@ -9,7 +9,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _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
|
||||
@ -38,7 +38,7 @@ extern UINT8 BdsDxeStrings[];
|
||||
**/
|
||||
CHAR16 *
|
||||
GetStringById (
|
||||
IN EFI_STRING_ID Id
|
||||
IN EFI_STRING_ID Id
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -6,7 +6,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#ifndef _BDS_MODULE_H_
|
||||
#define _BDS_MODULE_H_
|
||||
|
||||
@ -37,18 +36,16 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
/// HII specific Vendor Device Path definition.
|
||||
///
|
||||
typedef struct {
|
||||
VENDOR_DEVICE_PATH VendorDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL End;
|
||||
VENDOR_DEVICE_PATH VendorDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL End;
|
||||
} HII_VENDOR_DEVICE_PATH;
|
||||
|
||||
#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.
|
||||
A module boolean variable is used to record whether a reset is required.
|
||||
@ -60,8 +57,6 @@ EnableResetRequired (
|
||||
VOID
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Check whether platform policy enables the reset reminder feature. The default is enabled.
|
||||
|
||||
|
@ -41,23 +41,25 @@ EFI_MM_COMMUNICATION2_PROTOCOL *mMmCommunication2 = NULL;
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GetVariableStatisticsData (
|
||||
IN OUT EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader,
|
||||
IN OUT UINTN *SmmCommunicateSize
|
||||
IN OUT EFI_MM_COMMUNICATE_HEADER *SmmCommunicateHeader,
|
||||
IN OUT UINTN *SmmCommunicateSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;
|
||||
EFI_STATUS Status;
|
||||
SMM_VARIABLE_COMMUNICATE_HEADER *SmmVariableFunctionHeader;
|
||||
|
||||
CopyGuid (&SmmCommunicateHeader->HeaderGuid, &gEfiSmmVariableProtocolGuid);
|
||||
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;
|
||||
|
||||
Status = mMmCommunication2->Communicate (mMmCommunication2,
|
||||
SmmCommunicateHeader,
|
||||
SmmCommunicateHeader,
|
||||
SmmCommunicateSize);
|
||||
Status = mMmCommunication2->Communicate (
|
||||
mMmCommunication2,
|
||||
SmmCommunicateHeader,
|
||||
SmmCommunicateHeader,
|
||||
SmmCommunicateSize
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = SmmVariableFunctionHeader->ReturnStatus;
|
||||
@ -77,62 +79,65 @@ PrintInfoFromSmm (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
VARIABLE_INFO_ENTRY *VariableInfo;
|
||||
EFI_MM_COMMUNICATE_HEADER *CommBuffer;
|
||||
UINTN RealCommSize;
|
||||
UINTN CommSize;
|
||||
SMM_VARIABLE_COMMUNICATE_HEADER *FunctionHeader;
|
||||
EFI_SMM_VARIABLE_PROTOCOL *Smmvariable;
|
||||
EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
|
||||
UINT32 Index;
|
||||
EFI_MEMORY_DESCRIPTOR *Entry;
|
||||
UINTN Size;
|
||||
UINTN MaxSize;
|
||||
EFI_STATUS Status;
|
||||
VARIABLE_INFO_ENTRY *VariableInfo;
|
||||
EFI_MM_COMMUNICATE_HEADER *CommBuffer;
|
||||
UINTN RealCommSize;
|
||||
UINTN CommSize;
|
||||
SMM_VARIABLE_COMMUNICATE_HEADER *FunctionHeader;
|
||||
EFI_SMM_VARIABLE_PROTOCOL *Smmvariable;
|
||||
EDKII_PI_SMM_COMMUNICATION_REGION_TABLE *PiSmmCommunicationRegionTable;
|
||||
UINT32 Index;
|
||||
EFI_MEMORY_DESCRIPTOR *Entry;
|
||||
UINTN Size;
|
||||
UINTN MaxSize;
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **) &Smmvariable);
|
||||
Status = gBS->LocateProtocol (&gEfiSmmVariableProtocolGuid, NULL, (VOID **)&Smmvariable);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **) &mMmCommunication2);
|
||||
Status = gBS->LocateProtocol (&gEfiMmCommunication2ProtocolGuid, NULL, (VOID **)&mMmCommunication2);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
CommBuffer = NULL;
|
||||
CommBuffer = NULL;
|
||||
RealCommSize = 0;
|
||||
Status = EfiGetSystemConfigurationTable (
|
||||
&gEdkiiPiSmmCommunicationRegionTableGuid,
|
||||
(VOID **) &PiSmmCommunicationRegionTable
|
||||
);
|
||||
Status = EfiGetSystemConfigurationTable (
|
||||
&gEdkiiPiSmmCommunicationRegionTableGuid,
|
||||
(VOID **)&PiSmmCommunicationRegionTable
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
ASSERT (PiSmmCommunicationRegionTable != NULL);
|
||||
Entry = (EFI_MEMORY_DESCRIPTOR *) (PiSmmCommunicationRegionTable + 1);
|
||||
Size = 0;
|
||||
Entry = (EFI_MEMORY_DESCRIPTOR *)(PiSmmCommunicationRegionTable + 1);
|
||||
Size = 0;
|
||||
MaxSize = 0;
|
||||
for (Index = 0; Index < PiSmmCommunicationRegionTable->NumberOfEntries; Index++) {
|
||||
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 > MaxSize) {
|
||||
MaxSize = Size;
|
||||
MaxSize = Size;
|
||||
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);
|
||||
ZeroMem (CommBuffer, RealCommSize);
|
||||
|
||||
Print (L"SMM Driver Non-Volatile Variables:\n");
|
||||
do {
|
||||
CommSize = RealCommSize;
|
||||
Status = GetVariableStatisticsData (CommBuffer, &CommSize);
|
||||
Status = GetVariableStatisticsData (CommBuffer, &CommSize);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n");
|
||||
return Status;
|
||||
@ -142,19 +147,19 @@ PrintInfoFromSmm (
|
||||
break;
|
||||
}
|
||||
|
||||
FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;
|
||||
VariableInfo = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;
|
||||
FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)CommBuffer->Data;
|
||||
VariableInfo = (VARIABLE_INFO_ENTRY *)FunctionHeader->Data;
|
||||
|
||||
if (!VariableInfo->Volatile) {
|
||||
Print (
|
||||
L"%g R%03d(%03d) W%03d D%03d:%s\n",
|
||||
&VariableInfo->VendorGuid,
|
||||
VariableInfo->ReadCount,
|
||||
VariableInfo->CacheCount,
|
||||
VariableInfo->WriteCount,
|
||||
VariableInfo->DeleteCount,
|
||||
(CHAR16 *)(VariableInfo + 1)
|
||||
);
|
||||
L"%g R%03d(%03d) W%03d D%03d:%s\n",
|
||||
&VariableInfo->VendorGuid,
|
||||
VariableInfo->ReadCount,
|
||||
VariableInfo->CacheCount,
|
||||
VariableInfo->WriteCount,
|
||||
VariableInfo->DeleteCount,
|
||||
(CHAR16 *)(VariableInfo + 1)
|
||||
);
|
||||
}
|
||||
} while (TRUE);
|
||||
|
||||
@ -162,7 +167,7 @@ PrintInfoFromSmm (
|
||||
ZeroMem (CommBuffer, RealCommSize);
|
||||
do {
|
||||
CommSize = RealCommSize;
|
||||
Status = GetVariableStatisticsData (CommBuffer, &CommSize);
|
||||
Status = GetVariableStatisticsData (CommBuffer, &CommSize);
|
||||
if (Status == EFI_BUFFER_TOO_SMALL) {
|
||||
Print (L"The generic SMM communication buffer provided by SmmCommunicationRegionTable is too small\n");
|
||||
return Status;
|
||||
@ -172,19 +177,19 @@ PrintInfoFromSmm (
|
||||
break;
|
||||
}
|
||||
|
||||
FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *) CommBuffer->Data;
|
||||
VariableInfo = (VARIABLE_INFO_ENTRY *) FunctionHeader->Data;
|
||||
FunctionHeader = (SMM_VARIABLE_COMMUNICATE_HEADER *)CommBuffer->Data;
|
||||
VariableInfo = (VARIABLE_INFO_ENTRY *)FunctionHeader->Data;
|
||||
|
||||
if (VariableInfo->Volatile) {
|
||||
Print (
|
||||
L"%g R%03d(%03d) W%03d D%03d:%s\n",
|
||||
&VariableInfo->VendorGuid,
|
||||
VariableInfo->ReadCount,
|
||||
VariableInfo->CacheCount,
|
||||
VariableInfo->WriteCount,
|
||||
VariableInfo->DeleteCount,
|
||||
(CHAR16 *)(VariableInfo + 1)
|
||||
);
|
||||
L"%g R%03d(%03d) W%03d D%03d:%s\n",
|
||||
&VariableInfo->VendorGuid,
|
||||
VariableInfo->ReadCount,
|
||||
VariableInfo->CacheCount,
|
||||
VariableInfo->WriteCount,
|
||||
VariableInfo->DeleteCount,
|
||||
(CHAR16 *)(VariableInfo + 1)
|
||||
);
|
||||
}
|
||||
} while (TRUE);
|
||||
|
||||
@ -210,14 +215,14 @@ UefiMain (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS RuntimeDxeStatus;
|
||||
EFI_STATUS SmmStatus;
|
||||
VARIABLE_INFO_ENTRY *VariableInfo;
|
||||
VARIABLE_INFO_ENTRY *Entry;
|
||||
EFI_STATUS RuntimeDxeStatus;
|
||||
EFI_STATUS SmmStatus;
|
||||
VARIABLE_INFO_ENTRY *VariableInfo;
|
||||
VARIABLE_INFO_ENTRY *Entry;
|
||||
|
||||
RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiVariableGuid, (VOID **) &Entry);
|
||||
RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiVariableGuid, (VOID **)&Entry);
|
||||
if (EFI_ERROR (RuntimeDxeStatus) || (Entry == NULL)) {
|
||||
RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiAuthenticatedVariableGuid, (VOID **) &Entry);
|
||||
RuntimeDxeStatus = EfiGetSystemConfigurationTable (&gEfiAuthenticatedVariableGuid, (VOID **)&Entry);
|
||||
}
|
||||
|
||||
if (!EFI_ERROR (RuntimeDxeStatus) && (Entry != NULL)) {
|
||||
@ -253,6 +258,7 @@ UefiMain (
|
||||
VariableInfo->Name
|
||||
);
|
||||
}
|
||||
|
||||
VariableInfo = VariableInfo->Next;
|
||||
} while (VariableInfo != NULL);
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -40,7 +40,6 @@ EFI_PEI_NOTIFY_DESCRIPTOR mAhciEndOfPeiNotifyListTemplate = {
|
||||
AhciPeimEndOfPei
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Free the DMA resources allocated by an ATA AHCI controller.
|
||||
|
||||
@ -50,10 +49,10 @@ EFI_PEI_NOTIFY_DESCRIPTOR mAhciEndOfPeiNotifyListTemplate = {
|
||||
**/
|
||||
VOID
|
||||
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);
|
||||
|
||||
@ -61,18 +60,18 @@ AhciFreeDmaResource (
|
||||
|
||||
if (AhciRegisters->AhciRFisMap != NULL) {
|
||||
IoMmuFreeBuffer (
|
||||
EFI_SIZE_TO_PAGES (AhciRegisters->MaxRFisSize),
|
||||
AhciRegisters->AhciRFis,
|
||||
AhciRegisters->AhciRFisMap
|
||||
);
|
||||
EFI_SIZE_TO_PAGES (AhciRegisters->MaxRFisSize),
|
||||
AhciRegisters->AhciRFis,
|
||||
AhciRegisters->AhciRFisMap
|
||||
);
|
||||
}
|
||||
|
||||
if (AhciRegisters->AhciCmdListMap != NULL) {
|
||||
IoMmuFreeBuffer (
|
||||
EFI_SIZE_TO_PAGES (AhciRegisters->MaxCmdListSize),
|
||||
AhciRegisters->AhciCmdList,
|
||||
AhciRegisters->AhciCmdListMap
|
||||
);
|
||||
EFI_SIZE_TO_PAGES (AhciRegisters->MaxCmdListSize),
|
||||
AhciRegisters->AhciCmdList,
|
||||
AhciRegisters->AhciCmdListMap
|
||||
);
|
||||
}
|
||||
|
||||
if (AhciRegisters->AhciCmdTableMap != NULL) {
|
||||
@ -82,7 +81,6 @@ AhciFreeDmaResource (
|
||||
AhciRegisters->AhciCmdTableMap
|
||||
);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -104,7 +102,7 @@ AhciPeimEndOfPei (
|
||||
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);
|
||||
AhciFreeDmaResource (Private);
|
||||
@ -124,20 +122,20 @@ AhciPeimEndOfPei (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaAhciPeimEntry (
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
IN EFI_PEI_FILE_HANDLE FileHandle,
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_MODE BootMode;
|
||||
EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi;
|
||||
UINT8 Controller;
|
||||
UINTN MmioBase;
|
||||
UINTN DevicePathLength;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT32 PortBitMap;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
UINT8 NumberOfPorts;
|
||||
EFI_STATUS Status;
|
||||
EFI_BOOT_MODE BootMode;
|
||||
EDKII_ATA_AHCI_HOST_CONTROLLER_PPI *AhciHcPpi;
|
||||
UINT8 Controller;
|
||||
UINTN MmioBase;
|
||||
UINTN DevicePathLength;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT32 PortBitMap;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
UINT8 NumberOfPorts;
|
||||
|
||||
DEBUG ((DEBUG_INFO, "%a: Enters.\n", __FUNCTION__));
|
||||
|
||||
@ -157,7 +155,7 @@ AtaAhciPeimEntry (
|
||||
&gEdkiiPeiAtaAhciHostControllerPpiGuid,
|
||||
0,
|
||||
NULL,
|
||||
(VOID **) &AhciHcPpi
|
||||
(VOID **)&AhciHcPpi
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a: Failed to locate AtaAhciHostControllerPpi.\n", __FUNCTION__));
|
||||
@ -187,8 +185,10 @@ AtaAhciPeimEntry (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR, "%a: Fail to allocate get the device path for Controller %d.\n",
|
||||
__FUNCTION__, Controller
|
||||
DEBUG_ERROR,
|
||||
"%a: Fail to allocate get the device path for Controller %d.\n",
|
||||
__FUNCTION__,
|
||||
Controller
|
||||
));
|
||||
return Status;
|
||||
}
|
||||
@ -199,8 +199,10 @@ AtaAhciPeimEntry (
|
||||
Status = AhciIsHcDevicePathValid (DevicePath, DevicePathLength);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR, "%a: The device path is invalid for Controller %d.\n",
|
||||
__FUNCTION__, Controller
|
||||
DEBUG_ERROR,
|
||||
"%a: The device path is invalid for Controller %d.\n",
|
||||
__FUNCTION__,
|
||||
Controller
|
||||
));
|
||||
Controller++;
|
||||
continue;
|
||||
@ -231,8 +233,10 @@ AtaAhciPeimEntry (
|
||||
Private = AllocateZeroPool (sizeof (PEI_AHCI_CONTROLLER_PRIVATE_DATA));
|
||||
if (Private == NULL) {
|
||||
DEBUG ((
|
||||
DEBUG_ERROR, "%a: Fail to allocate private data for Controller %d.\n",
|
||||
__FUNCTION__, Controller
|
||||
DEBUG_ERROR,
|
||||
"%a: Fail to allocate private data for Controller %d.\n",
|
||||
__FUNCTION__,
|
||||
Controller
|
||||
));
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@ -260,8 +264,8 @@ AtaAhciPeimEntry (
|
||||
continue;
|
||||
}
|
||||
|
||||
Private->AtaPassThruMode.Attributes = EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |
|
||||
EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;
|
||||
Private->AtaPassThruMode.Attributes = EFI_ATA_PASS_THRU_ATTRIBUTES_PHYSICAL |
|
||||
EFI_ATA_PASS_THRU_ATTRIBUTES_LOGICAL;
|
||||
Private->AtaPassThruMode.IoAlign = sizeof (UINTN);
|
||||
Private->AtaPassThruPpi.Revision = EDKII_PEI_ATA_PASS_THRU_PPI_REVISION;
|
||||
Private->AtaPassThruPpi.Mode = &Private->AtaPassThruMode;
|
||||
@ -274,18 +278,18 @@ AtaAhciPeimEntry (
|
||||
&mAhciAtaPassThruPpiListTemplate,
|
||||
sizeof (EFI_PEI_PPI_DESCRIPTOR)
|
||||
);
|
||||
Private->AtaPassThruPpiList.Ppi = &Private->AtaPassThruPpi;
|
||||
Private->AtaPassThruPpiList.Ppi = &Private->AtaPassThruPpi;
|
||||
PeiServicesInstallPpi (&Private->AtaPassThruPpiList);
|
||||
|
||||
Private->BlkIoPpi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo;
|
||||
Private->BlkIoPpi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo;
|
||||
Private->BlkIoPpi.ReadBlocks = AhciBlockIoReadBlocks;
|
||||
Private->BlkIoPpi.GetNumberOfBlockDevices = AhciBlockIoGetDeviceNo;
|
||||
Private->BlkIoPpi.GetBlockDeviceMediaInfo = AhciBlockIoGetMediaInfo;
|
||||
Private->BlkIoPpi.ReadBlocks = AhciBlockIoReadBlocks;
|
||||
CopyMem (
|
||||
&Private->BlkIoPpiList,
|
||||
&mAhciBlkIoPpiListTemplate,
|
||||
sizeof (EFI_PEI_PPI_DESCRIPTOR)
|
||||
);
|
||||
Private->BlkIoPpiList.Ppi = &Private->BlkIoPpi;
|
||||
Private->BlkIoPpiList.Ppi = &Private->BlkIoPpi;
|
||||
PeiServicesInstallPpi (&Private->BlkIoPpiList);
|
||||
|
||||
Private->BlkIo2Ppi.Revision = EFI_PEI_RECOVERY_BLOCK_IO2_PPI_REVISION;
|
||||
@ -297,14 +301,15 @@ AtaAhciPeimEntry (
|
||||
&mAhciBlkIo2PpiListTemplate,
|
||||
sizeof (EFI_PEI_PPI_DESCRIPTOR)
|
||||
);
|
||||
Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;
|
||||
Private->BlkIo2PpiList.Ppi = &Private->BlkIo2Ppi;
|
||||
PeiServicesInstallPpi (&Private->BlkIo2PpiList);
|
||||
|
||||
if (Private->TrustComputingDevices != 0) {
|
||||
DEBUG ((
|
||||
DEBUG_INFO,
|
||||
"%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.GetNumberofDevices = AhciStorageSecurityGetDeviceNo;
|
||||
@ -316,7 +321,7 @@ AtaAhciPeimEntry (
|
||||
&mAhciStorageSecurityPpiListTemplate,
|
||||
sizeof (EFI_PEI_PPI_DESCRIPTOR)
|
||||
);
|
||||
Private->StorageSecurityPpiList.Ppi = &Private->StorageSecurityPpi;
|
||||
Private->StorageSecurityPpiList.Ppi = &Private->StorageSecurityPpi;
|
||||
PeiServicesInstallPpi (&Private->StorageSecurityPpiList);
|
||||
}
|
||||
|
||||
@ -325,11 +330,13 @@ AtaAhciPeimEntry (
|
||||
&mAhciEndOfPeiNotifyListTemplate,
|
||||
sizeof (EFI_PEI_NOTIFY_DESCRIPTOR)
|
||||
);
|
||||
PeiServicesNotifyPpi (&Private->EndOfPeiNotifyList);
|
||||
PeiServicesNotifyPpi (&Private->EndOfPeiNotifyList);
|
||||
|
||||
DEBUG ((
|
||||
DEBUG_INFO, "%a: Controller %d has been successfully initialized.\n",
|
||||
__FUNCTION__, Controller
|
||||
DEBUG_INFO,
|
||||
"%a: Controller %d has been successfully initialized.\n",
|
||||
__FUNCTION__,
|
||||
Controller
|
||||
));
|
||||
Controller++;
|
||||
}
|
||||
|
@ -33,7 +33,7 @@
|
||||
//
|
||||
// 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 "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.
|
||||
// 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.
|
||||
// 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.
|
||||
//
|
||||
#define ATA_TIMEOUT 30000000
|
||||
#define ATA_TIMEOUT 30000000
|
||||
//
|
||||
// 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_CAP_SAM BIT18
|
||||
#define AHCI_CAP_SSS BIT27
|
||||
#define AHCI_CAPABILITY_OFFSET 0x0000
|
||||
#define AHCI_CAP_SAM BIT18
|
||||
#define AHCI_CAP_SSS BIT27
|
||||
|
||||
#define AHCI_GHC_OFFSET 0x0004
|
||||
#define AHCI_GHC_RESET BIT0
|
||||
#define AHCI_GHC_ENABLE BIT31
|
||||
#define AHCI_GHC_OFFSET 0x0004
|
||||
#define AHCI_GHC_RESET BIT0
|
||||
#define AHCI_GHC_ENABLE BIT31
|
||||
|
||||
#define AHCI_IS_OFFSET 0x0008
|
||||
#define AHCI_PI_OFFSET 0x000C
|
||||
#define AHCI_IS_OFFSET 0x0008
|
||||
#define AHCI_PI_OFFSET 0x000C
|
||||
|
||||
#define AHCI_MAX_PORTS 32
|
||||
#define AHCI_MAX_PORTS 32
|
||||
|
||||
typedef struct {
|
||||
UINT32 Lower32;
|
||||
UINT32 Upper32;
|
||||
UINT32 Lower32;
|
||||
UINT32 Upper32;
|
||||
} DATA_32;
|
||||
|
||||
typedef union {
|
||||
DATA_32 Uint32;
|
||||
UINT64 Uint64;
|
||||
DATA_32 Uint32;
|
||||
UINT64 Uint64;
|
||||
} DATA_64;
|
||||
|
||||
#define AHCI_ATAPI_SIG_MASK 0xFFFF0000
|
||||
#define AHCI_ATA_DEVICE_SIG 0x00000000
|
||||
#define AHCI_ATAPI_SIG_MASK 0xFFFF0000
|
||||
#define AHCI_ATA_DEVICE_SIG 0x00000000
|
||||
|
||||
//
|
||||
// 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_LENGTH 20
|
||||
#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_REGISTER_H2D 0x27 // Register FIS - Host to Device
|
||||
#define AHCI_FIS_REGISTER_H2D_LENGTH 20
|
||||
#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_D2H_FIS_OFFSET 0x40
|
||||
#define AHCI_PIO_FIS_OFFSET 0x20
|
||||
#define AHCI_FIS_TYPE_MASK 0xFF
|
||||
#define AHCI_D2H_FIS_OFFSET 0x40
|
||||
#define AHCI_PIO_FIS_OFFSET 0x20
|
||||
#define AHCI_FIS_TYPE_MASK 0xFF
|
||||
|
||||
//
|
||||
// Port register
|
||||
//
|
||||
#define AHCI_PORT_START 0x0100
|
||||
#define AHCI_PORT_REG_WIDTH 0x0080
|
||||
#define AHCI_PORT_CLB 0x0000
|
||||
#define AHCI_PORT_CLBU 0x0004
|
||||
#define AHCI_PORT_FB 0x0008
|
||||
#define AHCI_PORT_FBU 0x000C
|
||||
#define AHCI_PORT_IS 0x0010
|
||||
#define AHCI_PORT_IE 0x0014
|
||||
#define AHCI_PORT_CMD 0x0018
|
||||
#define AHCI_PORT_CMD_ST BIT0
|
||||
#define AHCI_PORT_CMD_SUD BIT1
|
||||
#define AHCI_PORT_CMD_POD BIT2
|
||||
#define AHCI_PORT_CMD_CLO BIT3
|
||||
#define AHCI_PORT_CMD_FRE BIT4
|
||||
#define AHCI_PORT_CMD_FR BIT14
|
||||
#define AHCI_PORT_CMD_CR BIT15
|
||||
#define AHCI_PORT_CMD_CPD BIT20
|
||||
#define AHCI_PORT_CMD_ATAPI BIT24
|
||||
#define AHCI_PORT_CMD_DLAE BIT25
|
||||
#define AHCI_PORT_CMD_ALPE BIT26
|
||||
#define AHCI_PORT_CMD_ACTIVE (1 << 28)
|
||||
#define AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
|
||||
#define AHCI_PORT_START 0x0100
|
||||
#define AHCI_PORT_REG_WIDTH 0x0080
|
||||
#define AHCI_PORT_CLB 0x0000
|
||||
#define AHCI_PORT_CLBU 0x0004
|
||||
#define AHCI_PORT_FB 0x0008
|
||||
#define AHCI_PORT_FBU 0x000C
|
||||
#define AHCI_PORT_IS 0x0010
|
||||
#define AHCI_PORT_IE 0x0014
|
||||
#define AHCI_PORT_CMD 0x0018
|
||||
#define AHCI_PORT_CMD_ST BIT0
|
||||
#define AHCI_PORT_CMD_SUD BIT1
|
||||
#define AHCI_PORT_CMD_POD BIT2
|
||||
#define AHCI_PORT_CMD_CLO BIT3
|
||||
#define AHCI_PORT_CMD_FRE BIT4
|
||||
#define AHCI_PORT_CMD_FR BIT14
|
||||
#define AHCI_PORT_CMD_CR BIT15
|
||||
#define AHCI_PORT_CMD_CPD BIT20
|
||||
#define AHCI_PORT_CMD_ATAPI BIT24
|
||||
#define AHCI_PORT_CMD_DLAE BIT25
|
||||
#define AHCI_PORT_CMD_ALPE BIT26
|
||||
#define AHCI_PORT_CMD_ACTIVE (1 << 28)
|
||||
#define AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
|
||||
|
||||
#define AHCI_PORT_TFD 0x0020
|
||||
#define AHCI_PORT_TFD_ERR BIT0
|
||||
#define AHCI_PORT_TFD_DRQ BIT3
|
||||
#define AHCI_PORT_TFD_BSY BIT7
|
||||
#define AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
|
||||
#define AHCI_PORT_TFD 0x0020
|
||||
#define AHCI_PORT_TFD_ERR BIT0
|
||||
#define AHCI_PORT_TFD_DRQ BIT3
|
||||
#define AHCI_PORT_TFD_BSY BIT7
|
||||
#define AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
|
||||
|
||||
#define AHCI_PORT_SIG 0x0024
|
||||
#define AHCI_PORT_SSTS 0x0028
|
||||
#define AHCI_PORT_SSTS_DET_MASK 0x000F
|
||||
#define AHCI_PORT_SSTS_DET 0x0001
|
||||
#define AHCI_PORT_SSTS_DET_PCE 0x0003
|
||||
#define AHCI_PORT_SIG 0x0024
|
||||
#define AHCI_PORT_SSTS 0x0028
|
||||
#define AHCI_PORT_SSTS_DET_MASK 0x000F
|
||||
#define AHCI_PORT_SSTS_DET 0x0001
|
||||
#define AHCI_PORT_SSTS_DET_PCE 0x0003
|
||||
|
||||
#define AHCI_PORT_SCTL 0x002C
|
||||
#define AHCI_PORT_SCTL_IPM_INIT 0x0300
|
||||
#define AHCI_PORT_SCTL 0x002C
|
||||
#define AHCI_PORT_SCTL_IPM_INIT 0x0300
|
||||
|
||||
#define AHCI_PORT_SERR 0x0030
|
||||
#define AHCI_PORT_CI 0x0038
|
||||
#define AHCI_PORT_SERR 0x0030
|
||||
#define AHCI_PORT_CI 0x0038
|
||||
|
||||
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
|
||||
#define TIMER_PERIOD_SECONDS(Seconds) MultU64x32((UINT64)(Seconds), 10000000)
|
||||
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
|
||||
#define TIMER_PERIOD_SECONDS(Seconds) MultU64x32((UINT64)(Seconds), 10000000)
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
@ -170,19 +170,19 @@ typedef struct {
|
||||
// The entry Data structure is listed at the following.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 AhciCmdCfl:5; //Command FIS Length
|
||||
UINT32 AhciCmdA:1; //ATAPI
|
||||
UINT32 AhciCmdW:1; //Write
|
||||
UINT32 AhciCmdP:1; //Prefetchable
|
||||
UINT32 AhciCmdR:1; //Reset
|
||||
UINT32 AhciCmdB:1; //BIST
|
||||
UINT32 AhciCmdC:1; //Clear Busy upon R_OK
|
||||
UINT32 AhciCmdRsvd:1;
|
||||
UINT32 AhciCmdPmp:4; //Port Multiplier Port
|
||||
UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length
|
||||
UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count
|
||||
UINT32 AhciCmdCtba; //Command Table Descriptor Base Address
|
||||
UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs
|
||||
UINT32 AhciCmdCfl : 5; // Command FIS Length
|
||||
UINT32 AhciCmdA : 1; // ATAPI
|
||||
UINT32 AhciCmdW : 1; // Write
|
||||
UINT32 AhciCmdP : 1; // Prefetchable
|
||||
UINT32 AhciCmdR : 1; // Reset
|
||||
UINT32 AhciCmdB : 1; // BIST
|
||||
UINT32 AhciCmdC : 1; // Clear Busy upon R_OK
|
||||
UINT32 AhciCmdRsvd : 1;
|
||||
UINT32 AhciCmdPmp : 4; // Port Multiplier Port
|
||||
UINT32 AhciCmdPrdtl : 16; // Physical Region Descriptor Table Length
|
||||
UINT32 AhciCmdPrdbc; // Physical Region Descriptor Byte Count
|
||||
UINT32 AhciCmdCtba; // Command Table Descriptor Base Address
|
||||
UINT32 AhciCmdCtbau; // Command Table Descriptor Base Address Upper 32-BITs
|
||||
UINT32 AhciCmdRsvd1[4];
|
||||
} EFI_AHCI_COMMAND_LIST;
|
||||
|
||||
@ -192,28 +192,28 @@ typedef struct {
|
||||
// specified in the Serial ATA Revision 2.6 specification.
|
||||
//
|
||||
typedef struct {
|
||||
UINT8 AhciCFisType;
|
||||
UINT8 AhciCFisPmNum:4;
|
||||
UINT8 AhciCFisRsvd:1;
|
||||
UINT8 AhciCFisRsvd1:1;
|
||||
UINT8 AhciCFisRsvd2:1;
|
||||
UINT8 AhciCFisCmdInd:1;
|
||||
UINT8 AhciCFisCmd;
|
||||
UINT8 AhciCFisFeature;
|
||||
UINT8 AhciCFisSecNum;
|
||||
UINT8 AhciCFisClyLow;
|
||||
UINT8 AhciCFisClyHigh;
|
||||
UINT8 AhciCFisDevHead;
|
||||
UINT8 AhciCFisSecNumExp;
|
||||
UINT8 AhciCFisClyLowExp;
|
||||
UINT8 AhciCFisClyHighExp;
|
||||
UINT8 AhciCFisFeatureExp;
|
||||
UINT8 AhciCFisSecCount;
|
||||
UINT8 AhciCFisSecCountExp;
|
||||
UINT8 AhciCFisRsvd3;
|
||||
UINT8 AhciCFisControl;
|
||||
UINT8 AhciCFisRsvd4[4];
|
||||
UINT8 AhciCFisRsvd5[44];
|
||||
UINT8 AhciCFisType;
|
||||
UINT8 AhciCFisPmNum : 4;
|
||||
UINT8 AhciCFisRsvd : 1;
|
||||
UINT8 AhciCFisRsvd1 : 1;
|
||||
UINT8 AhciCFisRsvd2 : 1;
|
||||
UINT8 AhciCFisCmdInd : 1;
|
||||
UINT8 AhciCFisCmd;
|
||||
UINT8 AhciCFisFeature;
|
||||
UINT8 AhciCFisSecNum;
|
||||
UINT8 AhciCFisClyLow;
|
||||
UINT8 AhciCFisClyHigh;
|
||||
UINT8 AhciCFisDevHead;
|
||||
UINT8 AhciCFisSecNumExp;
|
||||
UINT8 AhciCFisClyLowExp;
|
||||
UINT8 AhciCFisClyHighExp;
|
||||
UINT8 AhciCFisFeatureExp;
|
||||
UINT8 AhciCFisSecCount;
|
||||
UINT8 AhciCFisSecCountExp;
|
||||
UINT8 AhciCFisRsvd3;
|
||||
UINT8 AhciCFisControl;
|
||||
UINT8 AhciCFisRsvd4[4];
|
||||
UINT8 AhciCFisRsvd5[44];
|
||||
} EFI_AHCI_COMMAND_FIS;
|
||||
|
||||
//
|
||||
@ -230,12 +230,12 @@ typedef struct {
|
||||
// list entry for this command slot.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 AhciPrdtDba; //Data Base Address
|
||||
UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs
|
||||
UINT32 AhciPrdtDba; // Data Base Address
|
||||
UINT32 AhciPrdtDbau; // Data Base Address Upper 32-BITs
|
||||
UINT32 AhciPrdtRsvd;
|
||||
UINT32 AhciPrdtDbc:22; //Data Byte Count
|
||||
UINT32 AhciPrdtRsvd1:9;
|
||||
UINT32 AhciPrdtIoc:1; //Interrupt on Completion
|
||||
UINT32 AhciPrdtDbc : 22; // Data Byte Count
|
||||
UINT32 AhciPrdtRsvd1 : 9;
|
||||
UINT32 AhciPrdtIoc : 1; // Interrupt on Completion
|
||||
} EFI_AHCI_COMMAND_PRDT;
|
||||
|
||||
//
|
||||
@ -268,7 +268,7 @@ typedef struct {
|
||||
//
|
||||
// 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.
|
||||
@ -301,7 +301,7 @@ typedef struct {
|
||||
//
|
||||
// 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.
|
||||
@ -348,7 +348,7 @@ struct _PEI_AHCI_CONTROLLER_PRIVATE_DATA {
|
||||
//
|
||||
// Global variables
|
||||
//
|
||||
extern UINT32 mMaxTransferBlockNumber[2];
|
||||
extern UINT32 mMaxTransferBlockNumber[2];
|
||||
|
||||
//
|
||||
// Internal functions
|
||||
@ -394,9 +394,9 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuFreeBuffer (
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@ -420,11 +420,11 @@ IoMmuFreeBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuMap (
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@ -438,7 +438,7 @@ IoMmuMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuUnmap (
|
||||
IN VOID *Mapping
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@ -470,7 +470,7 @@ AhciPeimEndOfPei (
|
||||
**/
|
||||
UINT8
|
||||
AhciGetNumberOfPortsFromMap (
|
||||
IN UINT32 PortBitMap
|
||||
IN UINT32 PortBitMap
|
||||
);
|
||||
|
||||
/**
|
||||
@ -497,16 +497,16 @@ AhciGetNumberOfPortsFromMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciPioTransfer (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN UINT8 FisIndex,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN OUT VOID *MemoryAddr,
|
||||
IN UINT32 DataCount,
|
||||
IN UINT64 Timeout
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN UINT8 FisIndex,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN OUT VOID *MemoryAddr,
|
||||
IN UINT32 DataCount,
|
||||
IN UINT64 Timeout
|
||||
);
|
||||
|
||||
/**
|
||||
@ -529,13 +529,13 @@ AhciPioTransfer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciNonDataTransfer (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN UINT8 FisIndex,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN UINT8 FisIndex,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout
|
||||
);
|
||||
|
||||
/**
|
||||
@ -554,7 +554,7 @@ AhciNonDataTransfer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciModeInitialization (
|
||||
IN OUT PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN OUT PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private
|
||||
);
|
||||
|
||||
/**
|
||||
@ -576,11 +576,11 @@ AhciModeInitialization (
|
||||
**/
|
||||
EFI_STATUS
|
||||
TransferAtaDevice (
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
IN OUT VOID *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINT32 TransferLength,
|
||||
IN BOOLEAN IsWrite
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
IN OUT VOID *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINT32 TransferLength,
|
||||
IN BOOLEAN IsWrite
|
||||
);
|
||||
|
||||
/**
|
||||
@ -621,14 +621,14 @@ TransferAtaDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
TrustTransferAtaDevice (
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN TransferLength,
|
||||
IN BOOLEAN IsTrustSend,
|
||||
IN UINT64 Timeout,
|
||||
OUT UINTN *TransferLengthOut
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN TransferLength,
|
||||
IN BOOLEAN IsTrustSend,
|
||||
IN UINT64 Timeout,
|
||||
OUT UINTN *TransferLengthOut
|
||||
);
|
||||
|
||||
/**
|
||||
@ -662,9 +662,9 @@ NextDevicePathNode (
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetDevicePathInstanceSize (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINTN *InstanceSize,
|
||||
OUT BOOLEAN *EntireDevicePathEnd
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINTN *InstanceSize,
|
||||
OUT BOOLEAN *EntireDevicePathEnd
|
||||
);
|
||||
|
||||
/**
|
||||
@ -680,8 +680,8 @@ GetDevicePathInstanceSize (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciIsHcDevicePathValid (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN UINTN DevicePathLength
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN UINTN DevicePathLength
|
||||
);
|
||||
|
||||
/**
|
||||
@ -702,11 +702,11 @@ AhciIsHcDevicePathValid (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciBuildDevicePath (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -723,9 +723,9 @@ AhciBuildDevicePath (
|
||||
**/
|
||||
UINT8
|
||||
AhciS3GetEumeratePorts (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath,
|
||||
IN UINTN HcDevicePathLength,
|
||||
OUT UINT32 *PortBitMap
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath,
|
||||
IN UINTN HcDevicePathLength,
|
||||
OUT UINT32 *PortBitMap
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -23,12 +23,12 @@
|
||||
**/
|
||||
PEI_AHCI_ATA_DEVICE_DATA *
|
||||
SearchDeviceByIndex (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINTN DeviceIndex
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINTN DeviceIndex
|
||||
)
|
||||
{
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
|
||||
if ((DeviceIndex == 0) || (DeviceIndex > Private->ActiveDevices)) {
|
||||
return NULL;
|
||||
@ -66,26 +66,26 @@ SearchDeviceByIndex (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AccessAtaDevice (
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
IN OUT UINT8 *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
IN OUT UINT8 *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN MaxTransferBlockNumber;
|
||||
UINTN TransferBlockNumber;
|
||||
UINTN BlockSize;
|
||||
EFI_STATUS Status;
|
||||
UINTN MaxTransferBlockNumber;
|
||||
UINTN TransferBlockNumber;
|
||||
UINTN BlockSize;
|
||||
|
||||
//
|
||||
// Ensure Lba48Bit is a valid boolean value
|
||||
//
|
||||
ASSERT ((UINTN) DeviceData->Lba48Bit < 2);
|
||||
if ((UINTN) DeviceData->Lba48Bit >= 2) {
|
||||
ASSERT ((UINTN)DeviceData->Lba48Bit < 2);
|
||||
if ((UINTN)DeviceData->Lba48Bit >= 2) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
MaxTransferBlockNumber = mMaxTransferBlockNumber[DeviceData->Lba48Bit];
|
||||
BlockSize = DeviceData->Media.BlockSize;
|
||||
|
||||
@ -93,20 +93,24 @@ AccessAtaDevice (
|
||||
if (NumberOfBlocks > MaxTransferBlockNumber) {
|
||||
TransferBlockNumber = MaxTransferBlockNumber;
|
||||
NumberOfBlocks -= MaxTransferBlockNumber;
|
||||
} else {
|
||||
} else {
|
||||
TransferBlockNumber = NumberOfBlocks;
|
||||
NumberOfBlocks = 0;
|
||||
}
|
||||
|
||||
DEBUG ((
|
||||
DEBUG_BLKIO, "%a: Blocking AccessAtaDevice, TransferBlockNumber = %x; StartLba = %x\n",
|
||||
__FUNCTION__, TransferBlockNumber, StartLba
|
||||
DEBUG_BLKIO,
|
||||
"%a: Blocking AccessAtaDevice, TransferBlockNumber = %x; StartLba = %x\n",
|
||||
__FUNCTION__,
|
||||
TransferBlockNumber,
|
||||
StartLba
|
||||
));
|
||||
|
||||
Status = TransferAtaDevice (
|
||||
DeviceData,
|
||||
Buffer,
|
||||
StartLba,
|
||||
(UINT32) TransferBlockNumber,
|
||||
(UINT32)TransferBlockNumber,
|
||||
FALSE // Read
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -134,15 +138,15 @@ AccessAtaDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciRead (
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
OUT VOID *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN BufferSize
|
||||
IN PEI_AHCI_ATA_DEVICE_DATA *DeviceData,
|
||||
OUT VOID *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN BufferSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
EFI_STATUS Status;
|
||||
UINTN BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
|
||||
//
|
||||
// Check parameters.
|
||||
@ -163,7 +167,8 @@ AhciRead (
|
||||
if (StartLba > DeviceData->Media.LastBlock) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
NumberOfBlocks = BufferSize / BlockSize;
|
||||
|
||||
NumberOfBlocks = BufferSize / BlockSize;
|
||||
if (NumberOfBlocks - 1 > DeviceData->Media.LastBlock - StartLba) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@ -176,7 +181,6 @@ AhciRead (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Gets the count of block I/O devices that one specific block driver detects.
|
||||
|
||||
@ -201,13 +205,13 @@ AhciBlockIoGetDeviceNo (
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -263,10 +267,10 @@ AhciBlockIoGetMediaInfo (
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
|
||||
if (This == NULL || MediaInfo == NULL) {
|
||||
if ((This == NULL) || (MediaInfo == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -276,9 +280,9 @@ AhciBlockIoGetMediaInfo (
|
||||
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->LastBlock = (UINTN) DeviceData->Media.LastBlock;
|
||||
MediaInfo->LastBlock = (UINTN)DeviceData->Media.LastBlock;
|
||||
MediaInfo->BlockSize = DeviceData->Media.BlockSize;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -329,8 +333,8 @@ AhciBlockIoReadBlocks (
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
|
||||
if (This == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -369,13 +373,13 @@ AhciBlockIoGetDeviceNo2 (
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -431,10 +435,10 @@ AhciBlockIoGetMediaInfo2 (
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
|
||||
if (This == NULL || MediaInfo == NULL) {
|
||||
if ((This == NULL) || (MediaInfo == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -498,7 +502,7 @@ AhciBlockIoReadBlocks2 (
|
||||
OUT VOID *Buffer
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
|
||||
if (This == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
@ -14,7 +14,7 @@
|
||||
//
|
||||
// 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.
|
||||
|
@ -25,20 +25,21 @@
|
||||
**/
|
||||
PEI_AHCI_ATA_DEVICE_DATA *
|
||||
SearchDeviceByPort (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort
|
||||
)
|
||||
{
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
|
||||
Node = GetFirstNode (&Private->DeviceList);
|
||||
while (!IsNull (&Private->DeviceList, Node)) {
|
||||
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
|
||||
|
||||
if ((DeviceData->Port == Port) &&
|
||||
(DeviceData->PortMultiplier == PortMultiplierPort)) {
|
||||
(DeviceData->PortMultiplier == PortMultiplierPort))
|
||||
{
|
||||
return DeviceData;
|
||||
}
|
||||
|
||||
@ -82,21 +83,21 @@ SearchDeviceByPort (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciPassThruExecute (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN UINT8 FisIndex,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN UINT8 FisIndex,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
switch (Packet->Protocol) {
|
||||
case EFI_ATA_PASS_THRU_PROTOCOL_ATA_NON_DATA:
|
||||
Status = AhciNonDataTransfer (
|
||||
Private,
|
||||
(UINT8) Port,
|
||||
(UINT8) PortMultiplierPort,
|
||||
(UINT8)Port,
|
||||
(UINT8)PortMultiplierPort,
|
||||
FisIndex,
|
||||
Packet->Acb,
|
||||
Packet->Asb,
|
||||
@ -106,8 +107,8 @@ AhciPassThruExecute (
|
||||
case EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_IN:
|
||||
Status = AhciPioTransfer (
|
||||
Private,
|
||||
(UINT8) Port,
|
||||
(UINT8) PortMultiplierPort,
|
||||
(UINT8)Port,
|
||||
(UINT8)PortMultiplierPort,
|
||||
FisIndex,
|
||||
TRUE,
|
||||
Packet->Acb,
|
||||
@ -120,8 +121,8 @@ AhciPassThruExecute (
|
||||
case EFI_ATA_PASS_THRU_PROTOCOL_PIO_DATA_OUT:
|
||||
Status = AhciPioTransfer (
|
||||
Private,
|
||||
(UINT8) Port,
|
||||
(UINT8) PortMultiplierPort,
|
||||
(UINT8)Port,
|
||||
(UINT8)PortMultiplierPort,
|
||||
FisIndex,
|
||||
FALSE,
|
||||
Packet->Acb,
|
||||
@ -176,19 +177,19 @@ AhciPassThruExecute (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruPassThru (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
|
||||
)
|
||||
{
|
||||
UINT32 IoAlign;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
UINT32 MaxSectorCount;
|
||||
UINT32 BlockSize;
|
||||
UINT32 IoAlign;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
UINT32 MaxSectorCount;
|
||||
UINT32 BlockSize;
|
||||
|
||||
if (This == NULL || Packet == NULL) {
|
||||
if ((This == NULL) || (Packet == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -205,7 +206,7 @@ AhciAtaPassThruPassThru (
|
||||
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);
|
||||
if (DeviceData == NULL) {
|
||||
return EFI_NOT_FOUND;
|
||||
@ -218,7 +219,8 @@ AhciAtaPassThruPassThru (
|
||||
// Convert the transfer length from sector count to byte.
|
||||
//
|
||||
if (((Packet->Length & EFI_ATA_PASS_THRU_LENGTH_BYTES) == 0) &&
|
||||
(Packet->InTransferLength != 0)) {
|
||||
(Packet->InTransferLength != 0))
|
||||
{
|
||||
Packet->InTransferLength = Packet->InTransferLength * BlockSize;
|
||||
}
|
||||
|
||||
@ -226,7 +228,8 @@ AhciAtaPassThruPassThru (
|
||||
// Convert the transfer length from sector count to byte.
|
||||
//
|
||||
if (((Packet->Length & EFI_ATA_PASS_THRU_LENGTH_BYTES) == 0) &&
|
||||
(Packet->OutTransferLength != 0)) {
|
||||
(Packet->OutTransferLength != 0))
|
||||
{
|
||||
Packet->OutTransferLength = Packet->OutTransferLength * BlockSize;
|
||||
}
|
||||
|
||||
@ -236,7 +239,8 @@ AhciAtaPassThruPassThru (
|
||||
// command, then no data is transferred and EFI_BAD_BUFFER_SIZE is returned.
|
||||
//
|
||||
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;
|
||||
}
|
||||
|
||||
@ -284,15 +288,15 @@ AhciAtaPassThruPassThru (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruGetNextPort (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN OUT UINT16 *Port
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN OUT UINT16 *Port
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
|
||||
if (This == NULL || Port == NULL) {
|
||||
if ((This == NULL) || (Port == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -318,7 +322,7 @@ AhciAtaPassThruGetNextPort (
|
||||
while (!IsNull (&Private->DeviceList, Node)) {
|
||||
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
|
||||
|
||||
if (DeviceData->Port > *Port){
|
||||
if (DeviceData->Port > *Port) {
|
||||
*Port = DeviceData->Port;
|
||||
goto Exit;
|
||||
}
|
||||
@ -393,16 +397,16 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruGetNextDevice (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN OUT UINT16 *PortMultiplierPort
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN OUT UINT16 *PortMultiplierPort
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
|
||||
if (This == NULL || PortMultiplierPort == NULL) {
|
||||
if ((This == NULL) || (PortMultiplierPort == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -425,7 +429,8 @@ AhciAtaPassThruGetNextDevice (
|
||||
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
|
||||
|
||||
if ((DeviceData->Port == Port) &&
|
||||
(DeviceData->PortMultiplier > *PortMultiplierPort)){
|
||||
(DeviceData->PortMultiplier > *PortMultiplierPort))
|
||||
{
|
||||
*PortMultiplierPort = DeviceData->PortMultiplier;
|
||||
goto Exit;
|
||||
}
|
||||
@ -444,7 +449,7 @@ AhciAtaPassThruGetNextDevice (
|
||||
while (!IsNull (&Private->DeviceList, Node)) {
|
||||
DeviceData = AHCI_PEI_ATA_DEVICE_INFO_FROM_THIS (Node);
|
||||
|
||||
if (DeviceData->Port == Port){
|
||||
if (DeviceData->Port == Port) {
|
||||
*PortMultiplierPort = DeviceData->PortMultiplier;
|
||||
goto Exit;
|
||||
}
|
||||
@ -490,14 +495,14 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruGetDevicePath (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
OUT UINTN *DevicePathLength,
|
||||
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;
|
||||
}
|
||||
|
||||
|
@ -49,10 +49,10 @@
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruPassThru (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@ -90,8 +90,8 @@ AhciAtaPassThruPassThru (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruGetNextPort (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN OUT UINT16 *Port
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN OUT UINT16 *Port
|
||||
);
|
||||
|
||||
/**
|
||||
@ -144,9 +144,9 @@ AhciAtaPassThruGetNextPort (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruGetNextDevice (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN OUT UINT16 *PortMultiplierPort
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
IN UINT16 Port,
|
||||
IN OUT UINT16 *PortMultiplierPort
|
||||
);
|
||||
|
||||
/**
|
||||
@ -169,9 +169,9 @@ AhciAtaPassThruGetNextDevice (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciAtaPassThruGetDevicePath (
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EDKII_PEI_ATA_PASS_THRU_PPI *This,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -28,19 +28,19 @@
|
||||
**/
|
||||
UINT8
|
||||
AhciS3GetEumeratePorts (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath,
|
||||
IN UINTN HcDevicePathLength,
|
||||
OUT UINT32 *PortBitMap
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *HcDevicePath,
|
||||
IN UINTN HcDevicePathLength,
|
||||
OUT UINT32 *PortBitMap
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT8 DummyData;
|
||||
UINTN S3InitDevicesLength;
|
||||
EFI_DEVICE_PATH_PROTOCOL *S3InitDevices;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;
|
||||
UINTN DevicePathInstLength;
|
||||
BOOLEAN EntireEnd;
|
||||
SATA_DEVICE_PATH *SataDeviceNode;
|
||||
EFI_STATUS Status;
|
||||
UINT8 DummyData;
|
||||
UINTN S3InitDevicesLength;
|
||||
EFI_DEVICE_PATH_PROTOCOL *S3InitDevices;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePathInst;
|
||||
UINTN DevicePathInstLength;
|
||||
BOOLEAN EntireEnd;
|
||||
SATA_DEVICE_PATH *SataDeviceNode;
|
||||
|
||||
*PortBitMap = 0;
|
||||
|
||||
@ -51,7 +51,7 @@ AhciS3GetEumeratePorts (
|
||||
S3InitDevices = NULL;
|
||||
S3InitDevicesLength = sizeof (DummyData);
|
||||
EntireEnd = FALSE;
|
||||
Status = RestoreLockBox (&gS3StorageDeviceInitListGuid, &DummyData, &S3InitDevicesLength);
|
||||
Status = RestoreLockBox (&gS3StorageDeviceInitListGuid, &DummyData, &S3InitDevicesLength);
|
||||
if (Status != EFI_BUFFER_TOO_SMALL) {
|
||||
return 0;
|
||||
} else {
|
||||
@ -87,7 +87,7 @@ AhciS3GetEumeratePorts (
|
||||
}
|
||||
|
||||
DevicePathInst = S3InitDevices;
|
||||
S3InitDevices = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN) S3InitDevices + DevicePathInstLength);
|
||||
S3InitDevices = (EFI_DEVICE_PATH_PROTOCOL *)((UINTN)S3InitDevices + DevicePathInstLength);
|
||||
|
||||
if (HcDevicePathLength >= DevicePathInstLength) {
|
||||
continue;
|
||||
@ -101,25 +101,30 @@ AhciS3GetEumeratePorts (
|
||||
DevicePathInst,
|
||||
HcDevicePath,
|
||||
HcDevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)
|
||||
) == 0) {
|
||||
) == 0)
|
||||
{
|
||||
//
|
||||
// Get the port number.
|
||||
//
|
||||
while (DevicePathInst->Type != END_DEVICE_PATH_TYPE) {
|
||||
if ((DevicePathInst->Type == MESSAGING_DEVICE_PATH) &&
|
||||
(DevicePathInst->SubType == MSG_SATA_DP)) {
|
||||
SataDeviceNode = (SATA_DEVICE_PATH *) DevicePathInst;
|
||||
(DevicePathInst->SubType == MSG_SATA_DP))
|
||||
{
|
||||
SataDeviceNode = (SATA_DEVICE_PATH *)DevicePathInst;
|
||||
//
|
||||
// For now, the driver only support upto AHCI_MAX_PORTS ports and
|
||||
// devices directly connected to a HBA.
|
||||
//
|
||||
if ((SataDeviceNode->HBAPortNumber >= AHCI_MAX_PORTS) ||
|
||||
(SataDeviceNode->PortMultiplierPortNumber != 0xFFFF)) {
|
||||
(SataDeviceNode->PortMultiplierPortNumber != 0xFFFF))
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
*PortBitMap |= (UINT32)BIT0 << SataDeviceNode->HBAPortNumber;
|
||||
break;
|
||||
}
|
||||
|
||||
DevicePathInst = NextDevicePathNode (DevicePathInst);
|
||||
}
|
||||
}
|
||||
|
@ -24,12 +24,12 @@
|
||||
**/
|
||||
PEI_AHCI_ATA_DEVICE_DATA *
|
||||
SearchTrustComputingDeviceByIndex (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINTN TrustComputingDeviceIndex
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINTN TrustComputingDeviceIndex
|
||||
)
|
||||
{
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
LIST_ENTRY *Node;
|
||||
|
||||
Node = GetFirstNode (&Private->DeviceList);
|
||||
while (!IsNull (&Private->DeviceList, Node)) {
|
||||
@ -58,17 +58,17 @@ SearchTrustComputingDeviceByIndex (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStorageSecurityGetDeviceNo (
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
OUT UINTN *NumberofDevices
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
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;
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -102,17 +102,17 @@ AhciStorageSecurityGetDeviceNo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStorageSecurityGetDevicePath (
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
EFI_STATUS Status;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (This == NULL || DevicePathLength == NULL || DevicePath == NULL) {
|
||||
if ((This == NULL) || (DevicePathLength == NULL) || (DevicePath == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -229,18 +229,18 @@ AhciStorageSecurityGetDevicePath (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStorageSecurityReceiveData (
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
|
||||
if ((PayloadBuffer == NULL) || (PayloadTransferSize == NULL) || (PayloadBufferSize == 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -349,8 +349,8 @@ AhciStorageSecuritySendData (
|
||||
IN VOID *PayloadBuffer
|
||||
)
|
||||
{
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private;
|
||||
PEI_AHCI_ATA_DEVICE_DATA *DeviceData;
|
||||
|
||||
if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
|
@ -24,8 +24,8 @@
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStorageSecurityGetDeviceNo (
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
OUT UINTN *NumberofDevices
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
OUT UINTN *NumberofDevices
|
||||
);
|
||||
|
||||
/**
|
||||
@ -56,10 +56,10 @@ AhciStorageSecurityGetDeviceNo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStorageSecurityGetDevicePath (
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -151,14 +151,14 @@ AhciStorageSecurityGetDevicePath (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStorageSecurityReceiveData (
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EDKII_PEI_STORAGE_SECURITY_CMD_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
);
|
||||
|
||||
/**
|
||||
|
@ -17,8 +17,8 @@ SATA_DEVICE_PATH mAhciSataDevicePathNodeTemplate = {
|
||||
MESSAGING_DEVICE_PATH,
|
||||
MSG_SATA_DP,
|
||||
{
|
||||
(UINT8) (sizeof (SATA_DEVICE_PATH)),
|
||||
(UINT8) ((sizeof (SATA_DEVICE_PATH)) >> 8)
|
||||
(UINT8)(sizeof (SATA_DEVICE_PATH)),
|
||||
(UINT8)((sizeof (SATA_DEVICE_PATH)) >> 8)
|
||||
}
|
||||
},
|
||||
0x0, // HBAPortNumber
|
||||
@ -33,8 +33,8 @@ EFI_DEVICE_PATH_PROTOCOL mAhciEndDevicePathNodeTemplate = {
|
||||
END_DEVICE_PATH_TYPE,
|
||||
END_ENTIRE_DEVICE_PATH_SUBTYPE,
|
||||
{
|
||||
(UINT8) (sizeof (EFI_DEVICE_PATH_PROTOCOL)),
|
||||
(UINT8) ((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
|
||||
(UINT8)(sizeof (EFI_DEVICE_PATH_PROTOCOL)),
|
||||
(UINT8)((sizeof (EFI_DEVICE_PATH_PROTOCOL)) >> 8)
|
||||
}
|
||||
};
|
||||
|
||||
@ -79,7 +79,7 @@ NextDevicePathNode (
|
||||
)
|
||||
{
|
||||
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
|
||||
GetDevicePathInstanceSize (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINTN *InstanceSize,
|
||||
OUT BOOLEAN *EntireDevicePathEnd
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINTN *InstanceSize,
|
||||
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;
|
||||
}
|
||||
|
||||
@ -130,7 +130,7 @@ GetDevicePathInstanceSize (
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
@ -148,12 +148,12 @@ GetDevicePathInstanceSize (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciIsHcDevicePathValid (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN UINTN DevicePathLength
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN UINTN DevicePathLength
|
||||
)
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *Start;
|
||||
UINTN Size;
|
||||
EFI_DEVICE_PATH_PROTOCOL *Start;
|
||||
UINTN Size;
|
||||
|
||||
if (DevicePath == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -168,22 +168,24 @@ AhciIsHcDevicePathValid (
|
||||
|
||||
Start = DevicePath;
|
||||
while (!(DevicePath->Type == END_DEVICE_PATH_TYPE &&
|
||||
DevicePath->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE)) {
|
||||
DevicePath->SubType == END_ENTIRE_DEVICE_PATH_SUBTYPE))
|
||||
{
|
||||
DevicePath = NextDevicePathNode (DevicePath);
|
||||
|
||||
//
|
||||
// Prevent overflow and invalid zero in the 'Length' field of a device path
|
||||
// node.
|
||||
//
|
||||
if ((UINTN) DevicePath <= (UINTN) Start) {
|
||||
if ((UINTN)DevicePath <= (UINTN)Start) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Prevent touching memory beyond given DevicePathLength.
|
||||
//
|
||||
if ((UINTN) DevicePath - (UINTN) Start >
|
||||
DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)) {
|
||||
if ((UINTN)DevicePath - (UINTN)Start >
|
||||
DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
@ -191,7 +193,7 @@ AhciIsHcDevicePathValid (
|
||||
//
|
||||
// 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) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
@ -217,17 +219,17 @@ AhciIsHcDevicePathValid (
|
||||
**/
|
||||
EFI_STATUS
|
||||
AhciBuildDevicePath (
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN PEI_AHCI_CONTROLLER_PRIVATE_DATA *Private,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
OUT UINTN *DevicePathLength,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
)
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker;
|
||||
SATA_DEVICE_PATH *SataDeviceNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePathWalker;
|
||||
SATA_DEVICE_PATH *SataDeviceNode;
|
||||
|
||||
if (DevicePathLength == NULL || DevicePath == NULL) {
|
||||
if ((DevicePathLength == NULL) || (DevicePath == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -251,8 +253,8 @@ AhciBuildDevicePath (
|
||||
//
|
||||
// Construct the SATA device node
|
||||
//
|
||||
DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *) ((UINT8 *)DevicePathWalker +
|
||||
(Private->DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)));
|
||||
DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)DevicePathWalker +
|
||||
(Private->DevicePathLength - sizeof (EFI_DEVICE_PATH_PROTOCOL)));
|
||||
CopyMem (
|
||||
DevicePathWalker,
|
||||
&mAhciSataDevicePathNodeTemplate,
|
||||
@ -265,8 +267,8 @@ AhciBuildDevicePath (
|
||||
//
|
||||
// Construct the end device node
|
||||
//
|
||||
DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *) ((UINT8 *)DevicePathWalker +
|
||||
sizeof (SATA_DEVICE_PATH));
|
||||
DevicePathWalker = (EFI_DEVICE_PATH_PROTOCOL *)((UINT8 *)DevicePathWalker +
|
||||
sizeof (SATA_DEVICE_PATH));
|
||||
CopyMem (
|
||||
DevicePathWalker,
|
||||
&mAhciEndDevicePathNodeTemplate,
|
||||
|
@ -20,15 +20,15 @@ GetIoMmu (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
EFI_STATUS Status;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
|
||||
IoMmu = NULL;
|
||||
Status = PeiServicesLocatePpi (
|
||||
&gEdkiiIoMmuPpiGuid,
|
||||
0,
|
||||
NULL,
|
||||
(VOID **) &IoMmu
|
||||
(VOID **)&IoMmu
|
||||
);
|
||||
if (!EFI_ERROR (Status) && (IoMmu != NULL)) {
|
||||
return IoMmu;
|
||||
@ -58,48 +58,50 @@ GetIoMmu (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuMap (
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
IN EDKII_IOMMU_OPERATION Operation,
|
||||
IN VOID *HostAddress,
|
||||
IN OUT UINTN *NumberOfBytes,
|
||||
OUT EFI_PHYSICAL_ADDRESS *DeviceAddress,
|
||||
OUT VOID **Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 Attribute;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Attribute;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
|
||||
IoMmu = GetIoMmu ();
|
||||
|
||||
if (IoMmu != NULL) {
|
||||
Status = IoMmu->Map (
|
||||
IoMmu,
|
||||
Operation,
|
||||
HostAddress,
|
||||
NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
IoMmu,
|
||||
Operation,
|
||||
HostAddress,
|
||||
NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
switch (Operation) {
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT(FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT (FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = IoMmu->SetAttribute (
|
||||
IoMmu,
|
||||
*Mapping,
|
||||
@ -110,9 +112,10 @@ IoMmuMap (
|
||||
}
|
||||
} else {
|
||||
*DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -127,11 +130,11 @@ IoMmuMap (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuUnmap (
|
||||
IN VOID *Mapping
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
EFI_STATUS Status;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
|
||||
IoMmu = GetIoMmu ();
|
||||
|
||||
@ -141,6 +144,7 @@ IoMmuUnmap (
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -175,7 +179,7 @@ IoMmuAllocateBuffer (
|
||||
EFI_PHYSICAL_ADDRESS HostPhyAddress;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
|
||||
*HostAddress = NULL;
|
||||
*HostAddress = NULL;
|
||||
*DeviceAddress = 0;
|
||||
|
||||
IoMmu = GetIoMmu ();
|
||||
@ -192,18 +196,19 @@ IoMmuAllocateBuffer (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE(Pages);
|
||||
Status = IoMmu->Map (
|
||||
IoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE (Pages);
|
||||
Status = IoMmu->Map (
|
||||
IoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = IoMmu->SetAttribute (
|
||||
IoMmu,
|
||||
*Mapping,
|
||||
@ -221,10 +226,12 @@ IoMmuAllocateBuffer (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
*DeviceAddress = HostPhyAddress;
|
||||
*Mapping = NULL;
|
||||
*Mapping = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -242,13 +249,13 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IoMmuFreeBuffer (
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
EFI_STATUS Status;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
|
||||
IoMmu = GetIoMmu ();
|
||||
|
||||
@ -259,5 +266,6 @@ IoMmuFreeBuffer (
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5,192 +5,193 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __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_CAP_SAM BIT18
|
||||
#define EFI_AHCI_CAP_SSS BIT27
|
||||
#define EFI_AHCI_CAP_S64A BIT31
|
||||
#define EFI_AHCI_GHC_OFFSET 0x0004
|
||||
#define EFI_AHCI_GHC_RESET BIT0
|
||||
#define EFI_AHCI_GHC_IE BIT1
|
||||
#define EFI_AHCI_GHC_ENABLE BIT31
|
||||
#define EFI_AHCI_IS_OFFSET 0x0008
|
||||
#define EFI_AHCI_PI_OFFSET 0x000C
|
||||
#define EFI_AHCI_CAPABILITY_OFFSET 0x0000
|
||||
#define EFI_AHCI_CAP_SAM BIT18
|
||||
#define EFI_AHCI_CAP_SSS BIT27
|
||||
#define EFI_AHCI_CAP_S64A BIT31
|
||||
#define EFI_AHCI_GHC_OFFSET 0x0004
|
||||
#define EFI_AHCI_GHC_RESET BIT0
|
||||
#define EFI_AHCI_GHC_IE BIT1
|
||||
#define EFI_AHCI_GHC_ENABLE BIT31
|
||||
#define EFI_AHCI_IS_OFFSET 0x0008
|
||||
#define EFI_AHCI_PI_OFFSET 0x000C
|
||||
|
||||
#define EFI_AHCI_MAX_PORTS 32
|
||||
#define EFI_AHCI_MAX_PORTS 32
|
||||
|
||||
#define AHCI_CAPABILITY2_OFFSET 0x0024
|
||||
#define AHCI_CAP2_SDS BIT3
|
||||
#define AHCI_CAP2_SADM BIT4
|
||||
#define AHCI_CAPABILITY2_OFFSET 0x0024
|
||||
#define AHCI_CAP2_SDS BIT3
|
||||
#define AHCI_CAP2_SADM BIT4
|
||||
|
||||
typedef struct {
|
||||
UINT32 Lower32;
|
||||
UINT32 Upper32;
|
||||
UINT32 Lower32;
|
||||
UINT32 Upper32;
|
||||
} DATA_32;
|
||||
|
||||
typedef union {
|
||||
DATA_32 Uint32;
|
||||
UINT64 Uint64;
|
||||
DATA_32 Uint32;
|
||||
UINT64 Uint64;
|
||||
} DATA_64;
|
||||
|
||||
//
|
||||
// Refer SATA1.0a spec section 5.2, the Phy detection time should be less than 10ms.
|
||||
// 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.
|
||||
//
|
||||
#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.
|
||||
//
|
||||
#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_ATA_DEVICE_SIG 0x00000000
|
||||
#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000
|
||||
#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000
|
||||
#define EFI_AHCI_ATAPI_DEVICE_SIG 0xEB140000
|
||||
#define EFI_AHCI_ATA_DEVICE_SIG 0x00000000
|
||||
#define EFI_AHCI_PORT_MULTIPLIER_SIG 0x96690000
|
||||
#define EFI_AHCI_ATAPI_SIG_MASK 0xFFFF0000
|
||||
|
||||
//
|
||||
// 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_LENGTH 20
|
||||
#define EFI_AHCI_FIS_REGISTER_D2H 0x34 //Register FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20
|
||||
#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 //DMA Activate FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4
|
||||
#define EFI_AHCI_FIS_DMA_SETUP 0x41 //DMA Setup FIS - Bi-directional
|
||||
#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28
|
||||
#define EFI_AHCI_FIS_DATA 0x46 //Data FIS - Bi-directional
|
||||
#define EFI_AHCI_FIS_BIST 0x58 //BIST Activate FIS - Bi-directional
|
||||
#define EFI_AHCI_FIS_BIST_LENGTH 12
|
||||
#define EFI_AHCI_FIS_PIO_SETUP 0x5F //PIO Setup FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20
|
||||
#define EFI_AHCI_FIS_SET_DEVICE 0xA1 //Set Device Bits FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
|
||||
#define EFI_AHCI_FIS_REGISTER_H2D 0x27 // Register FIS - Host to Device
|
||||
#define EFI_AHCI_FIS_REGISTER_H2D_LENGTH 20
|
||||
#define EFI_AHCI_FIS_REGISTER_D2H 0x34 // Register FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_REGISTER_D2H_LENGTH 20
|
||||
#define EFI_AHCI_FIS_DMA_ACTIVATE 0x39 // DMA Activate FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_DMA_ACTIVATE_LENGTH 4
|
||||
#define EFI_AHCI_FIS_DMA_SETUP 0x41 // DMA Setup FIS - Bi-directional
|
||||
#define EFI_AHCI_FIS_DMA_SETUP_LENGTH 28
|
||||
#define EFI_AHCI_FIS_DATA 0x46 // Data FIS - Bi-directional
|
||||
#define EFI_AHCI_FIS_BIST 0x58 // BIST Activate FIS - Bi-directional
|
||||
#define EFI_AHCI_FIS_BIST_LENGTH 12
|
||||
#define EFI_AHCI_FIS_PIO_SETUP 0x5F // PIO Setup FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_PIO_SETUP_LENGTH 20
|
||||
#define EFI_AHCI_FIS_SET_DEVICE 0xA1 // Set Device Bits FIS - Device to Host
|
||||
#define EFI_AHCI_FIS_SET_DEVICE_LENGTH 8
|
||||
|
||||
#define EFI_AHCI_D2H_FIS_OFFSET 0x40
|
||||
#define EFI_AHCI_DMA_FIS_OFFSET 0x00
|
||||
#define EFI_AHCI_PIO_FIS_OFFSET 0x20
|
||||
#define EFI_AHCI_SDB_FIS_OFFSET 0x58
|
||||
#define EFI_AHCI_FIS_TYPE_MASK 0xFF
|
||||
#define EFI_AHCI_U_FIS_OFFSET 0x60
|
||||
#define EFI_AHCI_D2H_FIS_OFFSET 0x40
|
||||
#define EFI_AHCI_DMA_FIS_OFFSET 0x00
|
||||
#define EFI_AHCI_PIO_FIS_OFFSET 0x20
|
||||
#define EFI_AHCI_SDB_FIS_OFFSET 0x58
|
||||
#define EFI_AHCI_FIS_TYPE_MASK 0xFF
|
||||
#define EFI_AHCI_U_FIS_OFFSET 0x60
|
||||
|
||||
//
|
||||
// Port register
|
||||
//
|
||||
#define EFI_AHCI_PORT_START 0x0100
|
||||
#define EFI_AHCI_PORT_REG_WIDTH 0x0080
|
||||
#define EFI_AHCI_PORT_CLB 0x0000
|
||||
#define EFI_AHCI_PORT_CLBU 0x0004
|
||||
#define EFI_AHCI_PORT_FB 0x0008
|
||||
#define EFI_AHCI_PORT_FBU 0x000C
|
||||
#define EFI_AHCI_PORT_IS 0x0010
|
||||
#define EFI_AHCI_PORT_IS_DHRS BIT0
|
||||
#define EFI_AHCI_PORT_IS_PSS BIT1
|
||||
#define EFI_AHCI_PORT_IS_DSS BIT2
|
||||
#define EFI_AHCI_PORT_IS_SDBS BIT3
|
||||
#define EFI_AHCI_PORT_IS_UFS BIT4
|
||||
#define EFI_AHCI_PORT_IS_DPS BIT5
|
||||
#define EFI_AHCI_PORT_IS_PCS BIT6
|
||||
#define EFI_AHCI_PORT_IS_DIS BIT7
|
||||
#define EFI_AHCI_PORT_IS_PRCS BIT22
|
||||
#define EFI_AHCI_PORT_IS_IPMS BIT23
|
||||
#define EFI_AHCI_PORT_IS_OFS BIT24
|
||||
#define EFI_AHCI_PORT_IS_INFS BIT26
|
||||
#define EFI_AHCI_PORT_IS_IFS BIT27
|
||||
#define EFI_AHCI_PORT_IS_HBDS BIT28
|
||||
#define EFI_AHCI_PORT_IS_HBFS BIT29
|
||||
#define EFI_AHCI_PORT_IS_TFES BIT30
|
||||
#define EFI_AHCI_PORT_IS_CPDS BIT31
|
||||
#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF
|
||||
#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
|
||||
#define EFI_AHCI_PORT_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_START 0x0100
|
||||
#define EFI_AHCI_PORT_REG_WIDTH 0x0080
|
||||
#define EFI_AHCI_PORT_CLB 0x0000
|
||||
#define EFI_AHCI_PORT_CLBU 0x0004
|
||||
#define EFI_AHCI_PORT_FB 0x0008
|
||||
#define EFI_AHCI_PORT_FBU 0x000C
|
||||
#define EFI_AHCI_PORT_IS 0x0010
|
||||
#define EFI_AHCI_PORT_IS_DHRS BIT0
|
||||
#define EFI_AHCI_PORT_IS_PSS BIT1
|
||||
#define EFI_AHCI_PORT_IS_DSS BIT2
|
||||
#define EFI_AHCI_PORT_IS_SDBS BIT3
|
||||
#define EFI_AHCI_PORT_IS_UFS BIT4
|
||||
#define EFI_AHCI_PORT_IS_DPS BIT5
|
||||
#define EFI_AHCI_PORT_IS_PCS BIT6
|
||||
#define EFI_AHCI_PORT_IS_DIS BIT7
|
||||
#define EFI_AHCI_PORT_IS_PRCS BIT22
|
||||
#define EFI_AHCI_PORT_IS_IPMS BIT23
|
||||
#define EFI_AHCI_PORT_IS_OFS BIT24
|
||||
#define EFI_AHCI_PORT_IS_INFS BIT26
|
||||
#define EFI_AHCI_PORT_IS_IFS BIT27
|
||||
#define EFI_AHCI_PORT_IS_HBDS BIT28
|
||||
#define EFI_AHCI_PORT_IS_HBFS BIT29
|
||||
#define EFI_AHCI_PORT_IS_TFES BIT30
|
||||
#define EFI_AHCI_PORT_IS_CPDS BIT31
|
||||
#define EFI_AHCI_PORT_IS_CLEAR 0xFFFFFFFF
|
||||
#define EFI_AHCI_PORT_IS_FIS_CLEAR 0x0000000F
|
||||
#define EFI_AHCI_PORT_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_IE 0x0014
|
||||
#define EFI_AHCI_PORT_CMD 0x0018
|
||||
#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE
|
||||
#define EFI_AHCI_PORT_CMD_ST BIT0
|
||||
#define EFI_AHCI_PORT_CMD_SUD BIT1
|
||||
#define EFI_AHCI_PORT_CMD_POD BIT2
|
||||
#define EFI_AHCI_PORT_CMD_CLO BIT3
|
||||
#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_SHIFT 8
|
||||
#define EFI_AHCI_PORT_CMD_FR BIT14
|
||||
#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_PMA BIT17
|
||||
#define EFI_AHCI_PORT_CMD_HPCP BIT18
|
||||
#define EFI_AHCI_PORT_CMD_MPSP BIT19
|
||||
#define EFI_AHCI_PORT_CMD_CPD BIT20
|
||||
#define EFI_AHCI_PORT_CMD_ESP BIT21
|
||||
#define EFI_AHCI_PORT_CMD_ATAPI BIT24
|
||||
#define EFI_AHCI_PORT_CMD_DLAE BIT25
|
||||
#define EFI_AHCI_PORT_CMD_ALPE BIT26
|
||||
#define EFI_AHCI_PORT_CMD_ASP BIT27
|
||||
#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
|
||||
#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 )
|
||||
#define EFI_AHCI_PORT_TFD 0x0020
|
||||
#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
|
||||
#define EFI_AHCI_PORT_TFD_BSY BIT7
|
||||
#define EFI_AHCI_PORT_TFD_DRQ BIT3
|
||||
#define EFI_AHCI_PORT_TFD_ERR BIT0
|
||||
#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00
|
||||
#define EFI_AHCI_PORT_SIG 0x0024
|
||||
#define EFI_AHCI_PORT_SSTS 0x0028
|
||||
#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F
|
||||
#define EFI_AHCI_PORT_SSTS_DET 0x0001
|
||||
#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003
|
||||
#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0
|
||||
#define EFI_AHCI_PORT_SCTL 0x002C
|
||||
#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F
|
||||
#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK)
|
||||
#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001
|
||||
#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003
|
||||
#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200
|
||||
#define EFI_AHCI_PORT_SERR 0x0030
|
||||
#define EFI_AHCI_PORT_SERR_RDIE BIT0
|
||||
#define EFI_AHCI_PORT_SERR_RCE BIT1
|
||||
#define EFI_AHCI_PORT_SERR_TDIE BIT8
|
||||
#define EFI_AHCI_PORT_SERR_PCDIE BIT9
|
||||
#define EFI_AHCI_PORT_SERR_PE BIT10
|
||||
#define EFI_AHCI_PORT_SERR_IE BIT11
|
||||
#define EFI_AHCI_PORT_SERR_PRC BIT16
|
||||
#define EFI_AHCI_PORT_SERR_PIE BIT17
|
||||
#define EFI_AHCI_PORT_SERR_CW BIT18
|
||||
#define EFI_AHCI_PORT_SERR_BDE BIT19
|
||||
#define EFI_AHCI_PORT_SERR_DE BIT20
|
||||
#define EFI_AHCI_PORT_SERR_CRCE BIT21
|
||||
#define EFI_AHCI_PORT_SERR_HE BIT22
|
||||
#define EFI_AHCI_PORT_SERR_LSE BIT23
|
||||
#define EFI_AHCI_PORT_SERR_TSTE BIT24
|
||||
#define EFI_AHCI_PORT_SERR_UFT BIT25
|
||||
#define EFI_AHCI_PORT_SERR_EX BIT26
|
||||
#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF
|
||||
#define EFI_AHCI_PORT_SACT 0x0034
|
||||
#define EFI_AHCI_PORT_CI 0x0038
|
||||
#define EFI_AHCI_PORT_SNTF 0x003C
|
||||
#define AHCI_PORT_DEVSLP 0x0044
|
||||
#define AHCI_PORT_DEVSLP_ADSE BIT0
|
||||
#define AHCI_PORT_DEVSLP_DSP BIT1
|
||||
#define AHCI_PORT_DEVSLP_DETO_MASK 0x000003FC
|
||||
#define AHCI_PORT_DEVSLP_MDAT_MASK 0x00007C00
|
||||
#define AHCI_PORT_DEVSLP_DITO_MASK 0x01FF8000
|
||||
#define AHCI_PORT_DEVSLP_DM_MASK 0x1E000000
|
||||
#define EFI_AHCI_PORT_IE 0x0014
|
||||
#define EFI_AHCI_PORT_CMD 0x0018
|
||||
#define EFI_AHCI_PORT_CMD_ST_MASK 0xFFFFFFFE
|
||||
#define EFI_AHCI_PORT_CMD_ST BIT0
|
||||
#define EFI_AHCI_PORT_CMD_SUD BIT1
|
||||
#define EFI_AHCI_PORT_CMD_POD BIT2
|
||||
#define EFI_AHCI_PORT_CMD_CLO BIT3
|
||||
#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_SHIFT 8
|
||||
#define EFI_AHCI_PORT_CMD_FR BIT14
|
||||
#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_PMA BIT17
|
||||
#define EFI_AHCI_PORT_CMD_HPCP BIT18
|
||||
#define EFI_AHCI_PORT_CMD_MPSP BIT19
|
||||
#define EFI_AHCI_PORT_CMD_CPD BIT20
|
||||
#define EFI_AHCI_PORT_CMD_ESP BIT21
|
||||
#define EFI_AHCI_PORT_CMD_ATAPI BIT24
|
||||
#define EFI_AHCI_PORT_CMD_DLAE BIT25
|
||||
#define EFI_AHCI_PORT_CMD_ALPE BIT26
|
||||
#define EFI_AHCI_PORT_CMD_ASP BIT27
|
||||
#define EFI_AHCI_PORT_CMD_ICC_MASK (BIT28 | BIT29 | BIT30 | BIT31)
|
||||
#define EFI_AHCI_PORT_CMD_ACTIVE (1 << 28 )
|
||||
#define EFI_AHCI_PORT_TFD 0x0020
|
||||
#define EFI_AHCI_PORT_TFD_MASK (BIT7 | BIT3 | BIT0)
|
||||
#define EFI_AHCI_PORT_TFD_BSY BIT7
|
||||
#define EFI_AHCI_PORT_TFD_DRQ BIT3
|
||||
#define EFI_AHCI_PORT_TFD_ERR BIT0
|
||||
#define EFI_AHCI_PORT_TFD_ERR_MASK 0x00FF00
|
||||
#define EFI_AHCI_PORT_SIG 0x0024
|
||||
#define EFI_AHCI_PORT_SSTS 0x0028
|
||||
#define EFI_AHCI_PORT_SSTS_DET_MASK 0x000F
|
||||
#define EFI_AHCI_PORT_SSTS_DET 0x0001
|
||||
#define EFI_AHCI_PORT_SSTS_DET_PCE 0x0003
|
||||
#define EFI_AHCI_PORT_SSTS_SPD_MASK 0x00F0
|
||||
#define EFI_AHCI_PORT_SCTL 0x002C
|
||||
#define EFI_AHCI_PORT_SCTL_DET_MASK 0x000F
|
||||
#define EFI_AHCI_PORT_SCTL_MASK (~EFI_AHCI_PORT_SCTL_DET_MASK)
|
||||
#define EFI_AHCI_PORT_SCTL_DET_INIT 0x0001
|
||||
#define EFI_AHCI_PORT_SCTL_DET_PHYCOMM 0x0003
|
||||
#define EFI_AHCI_PORT_SCTL_SPD_MASK 0x00F0
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_MASK 0x0F00
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_INIT 0x0300
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_PSD 0x0100
|
||||
#define EFI_AHCI_PORT_SCTL_IPM_SSD 0x0200
|
||||
#define EFI_AHCI_PORT_SERR 0x0030
|
||||
#define EFI_AHCI_PORT_SERR_RDIE BIT0
|
||||
#define EFI_AHCI_PORT_SERR_RCE BIT1
|
||||
#define EFI_AHCI_PORT_SERR_TDIE BIT8
|
||||
#define EFI_AHCI_PORT_SERR_PCDIE BIT9
|
||||
#define EFI_AHCI_PORT_SERR_PE BIT10
|
||||
#define EFI_AHCI_PORT_SERR_IE BIT11
|
||||
#define EFI_AHCI_PORT_SERR_PRC BIT16
|
||||
#define EFI_AHCI_PORT_SERR_PIE BIT17
|
||||
#define EFI_AHCI_PORT_SERR_CW BIT18
|
||||
#define EFI_AHCI_PORT_SERR_BDE BIT19
|
||||
#define EFI_AHCI_PORT_SERR_DE BIT20
|
||||
#define EFI_AHCI_PORT_SERR_CRCE BIT21
|
||||
#define EFI_AHCI_PORT_SERR_HE BIT22
|
||||
#define EFI_AHCI_PORT_SERR_LSE BIT23
|
||||
#define EFI_AHCI_PORT_SERR_TSTE BIT24
|
||||
#define EFI_AHCI_PORT_SERR_UFT BIT25
|
||||
#define EFI_AHCI_PORT_SERR_EX BIT26
|
||||
#define EFI_AHCI_PORT_ERR_CLEAR 0xFFFFFFFF
|
||||
#define EFI_AHCI_PORT_SACT 0x0034
|
||||
#define EFI_AHCI_PORT_CI 0x0038
|
||||
#define EFI_AHCI_PORT_SNTF 0x003C
|
||||
#define AHCI_PORT_DEVSLP 0x0044
|
||||
#define AHCI_PORT_DEVSLP_ADSE BIT0
|
||||
#define AHCI_PORT_DEVSLP_DSP BIT1
|
||||
#define AHCI_PORT_DEVSLP_DETO_MASK 0x000003FC
|
||||
#define AHCI_PORT_DEVSLP_MDAT_MASK 0x00007C00
|
||||
#define AHCI_PORT_DEVSLP_DITO_MASK 0x01FF8000
|
||||
#define AHCI_PORT_DEVSLP_DM_MASK 0x1E000000
|
||||
|
||||
#define AHCI_COMMAND_RETRIES 5
|
||||
|
||||
@ -200,20 +201,20 @@ typedef union {
|
||||
// The entry data structure is listed at the following.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 AhciCmdCfl:5; //Command FIS Length
|
||||
UINT32 AhciCmdA:1; //ATAPI
|
||||
UINT32 AhciCmdW:1; //Write
|
||||
UINT32 AhciCmdP:1; //Prefetchable
|
||||
UINT32 AhciCmdR:1; //Reset
|
||||
UINT32 AhciCmdB:1; //BIST
|
||||
UINT32 AhciCmdC:1; //Clear Busy upon R_OK
|
||||
UINT32 AhciCmdRsvd:1;
|
||||
UINT32 AhciCmdPmp:4; //Port Multiplier Port
|
||||
UINT32 AhciCmdPrdtl:16; //Physical Region Descriptor Table Length
|
||||
UINT32 AhciCmdPrdbc; //Physical Region Descriptor Byte Count
|
||||
UINT32 AhciCmdCtba; //Command Table Descriptor Base Address
|
||||
UINT32 AhciCmdCtbau; //Command Table Descriptor Base Address Upper 32-BITs
|
||||
UINT32 AhciCmdRsvd1[4];
|
||||
UINT32 AhciCmdCfl : 5; // Command FIS Length
|
||||
UINT32 AhciCmdA : 1; // ATAPI
|
||||
UINT32 AhciCmdW : 1; // Write
|
||||
UINT32 AhciCmdP : 1; // Prefetchable
|
||||
UINT32 AhciCmdR : 1; // Reset
|
||||
UINT32 AhciCmdB : 1; // BIST
|
||||
UINT32 AhciCmdC : 1; // Clear Busy upon R_OK
|
||||
UINT32 AhciCmdRsvd : 1;
|
||||
UINT32 AhciCmdPmp : 4; // Port Multiplier Port
|
||||
UINT32 AhciCmdPrdtl : 16; // Physical Region Descriptor Table Length
|
||||
UINT32 AhciCmdPrdbc; // Physical Region Descriptor Byte Count
|
||||
UINT32 AhciCmdCtba; // Command Table Descriptor Base Address
|
||||
UINT32 AhciCmdCtbau; // Command Table Descriptor Base Address Upper 32-BITs
|
||||
UINT32 AhciCmdRsvd1[4];
|
||||
} EFI_AHCI_COMMAND_LIST;
|
||||
|
||||
//
|
||||
@ -223,11 +224,11 @@ typedef struct {
|
||||
//
|
||||
typedef struct {
|
||||
UINT8 AhciCFisType;
|
||||
UINT8 AhciCFisPmNum:4;
|
||||
UINT8 AhciCFisRsvd:1;
|
||||
UINT8 AhciCFisRsvd1:1;
|
||||
UINT8 AhciCFisRsvd2:1;
|
||||
UINT8 AhciCFisCmdInd:1;
|
||||
UINT8 AhciCFisPmNum : 4;
|
||||
UINT8 AhciCFisRsvd : 1;
|
||||
UINT8 AhciCFisRsvd1 : 1;
|
||||
UINT8 AhciCFisRsvd2 : 1;
|
||||
UINT8 AhciCFisCmdInd : 1;
|
||||
UINT8 AhciCFisCmd;
|
||||
UINT8 AhciCFisFeature;
|
||||
UINT8 AhciCFisSecNum;
|
||||
@ -266,12 +267,12 @@ typedef struct {
|
||||
// list entry for this command slot.
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 AhciPrdtDba; //Data Base Address
|
||||
UINT32 AhciPrdtDbau; //Data Base Address Upper 32-BITs
|
||||
UINT32 AhciPrdtRsvd;
|
||||
UINT32 AhciPrdtDbc:22; //Data Byte Count
|
||||
UINT32 AhciPrdtRsvd1:9;
|
||||
UINT32 AhciPrdtIoc:1; //Interrupt on Completion
|
||||
UINT32 AhciPrdtDba; // Data Base Address
|
||||
UINT32 AhciPrdtDbau; // Data Base Address Upper 32-BITs
|
||||
UINT32 AhciPrdtRsvd;
|
||||
UINT32 AhciPrdtDbc : 22; // Data Byte Count
|
||||
UINT32 AhciPrdtRsvd1 : 9;
|
||||
UINT32 AhciPrdtIoc : 1; // Interrupt on Completion
|
||||
} EFI_AHCI_COMMAND_PRDT;
|
||||
|
||||
//
|
||||
@ -288,24 +289,24 @@ typedef struct {
|
||||
// Received FIS structure
|
||||
//
|
||||
typedef struct {
|
||||
UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00
|
||||
UINT8 AhciDmaSetupFisRsvd[0x04];
|
||||
UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20
|
||||
UINT8 AhciPioSetupFisRsvd[0x0C];
|
||||
UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40
|
||||
UINT8 AhciD2HRegisterFisRsvd[0x04];
|
||||
UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58
|
||||
UINT8 AhciUnknownFis[0x40]; // Unknown Fis: offset 0x60
|
||||
UINT8 AhciUnknownFisRsvd[0x60];
|
||||
UINT8 AhciDmaSetupFis[0x1C]; // Dma Setup Fis: offset 0x00
|
||||
UINT8 AhciDmaSetupFisRsvd[0x04];
|
||||
UINT8 AhciPioSetupFis[0x14]; // Pio Setup Fis: offset 0x20
|
||||
UINT8 AhciPioSetupFisRsvd[0x0C];
|
||||
UINT8 AhciD2HRegisterFis[0x14]; // D2H Register Fis: offset 0x40
|
||||
UINT8 AhciD2HRegisterFisRsvd[0x04];
|
||||
UINT64 AhciSetDeviceBitsFis; // Set Device Bits Fix: offset 0x58
|
||||
UINT8 AhciUnknownFis[0x40]; // Unknown Fis: offset 0x60
|
||||
UINT8 AhciUnknownFisRsvd[0x60];
|
||||
} EFI_AHCI_RECEIVED_FIS;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Madt : 5;
|
||||
UINT8 Reserved_5 : 3;
|
||||
UINT8 Deto;
|
||||
UINT16 Reserved_16;
|
||||
UINT32 Reserved_32 : 31;
|
||||
UINT32 Supported : 1;
|
||||
UINT8 Madt : 5;
|
||||
UINT8 Reserved_5 : 3;
|
||||
UINT8 Deto;
|
||||
UINT16 Reserved_16;
|
||||
UINT32 Reserved_32 : 31;
|
||||
UINT32 Supported : 1;
|
||||
} DEVSLP_TIMING_VARIABLES;
|
||||
|
||||
#pragma pack()
|
||||
@ -343,11 +344,11 @@ typedef struct {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciPacketCommandExecute (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
|
||||
);
|
||||
|
||||
/**
|
||||
@ -366,10 +367,10 @@ AhciPacketCommandExecute (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStartCommand (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 CommandSlot,
|
||||
IN UINT64 Timeout
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 CommandSlot,
|
||||
IN UINT64 Timeout
|
||||
);
|
||||
|
||||
/**
|
||||
@ -387,10 +388,9 @@ AhciStartCommand (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciStopCommand (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN UINT8 Port,
|
||||
IN UINT64 Timeout
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN UINT8 Port,
|
||||
IN UINT64 Timeout
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,7 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __ATA_ATAPI_PASS_THRU_H__
|
||||
#define __ATA_ATAPI_PASS_THRU_H__
|
||||
|
||||
@ -36,14 +37,14 @@
|
||||
#include "IdeMode.h"
|
||||
#include "AhciMode.h"
|
||||
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gAtaAtapiPassThruDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gAtaAtapiPassThruDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComponentName;
|
||||
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_DEVICE_SIGNATURE SIGNATURE_32 ('a', 'd', 'e', 'v')
|
||||
#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_NONBLOCKING_TASK_SIGNATURE SIGNATURE_32 ('a', 't', 's', 'k')
|
||||
|
||||
typedef struct _ATA_NONBLOCK_TASK ATA_NONBLOCK_TASK;
|
||||
@ -66,88 +67,88 @@ typedef enum {
|
||||
// Ahci mode device info
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplier;
|
||||
EFI_ATA_DEVICE_TYPE Type;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplier;
|
||||
EFI_ATA_DEVICE_TYPE Type;
|
||||
|
||||
EFI_IDENTIFY_DATA *IdentifyData;
|
||||
EFI_IDENTIFY_DATA *IdentifyData;
|
||||
} EFI_ATA_DEVICE_INFO;
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeControllerInit;
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_IDE_CONTROLLER_INIT_PROTOCOL *IdeControllerInit;
|
||||
|
||||
EFI_ATA_PASS_THRU_MODE AtaPassThruMode;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL AtaPassThru;
|
||||
EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
|
||||
EFI_EXT_SCSI_PASS_THRU_PROTOCOL ExtScsiPassThru;
|
||||
EFI_ATA_PASS_THRU_MODE AtaPassThruMode;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL AtaPassThru;
|
||||
EFI_EXT_SCSI_PASS_THRU_MODE ExtScsiPassThruMode;
|
||||
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_AHCI_REGISTERS AhciRegisters;
|
||||
EFI_IDE_REGISTERS IdeRegisters[EfiIdeMaxChannel];
|
||||
EFI_AHCI_REGISTERS AhciRegisters;
|
||||
|
||||
//
|
||||
// The attached device list
|
||||
//
|
||||
LIST_ENTRY DeviceList;
|
||||
UINT64 EnabledPciAttributes;
|
||||
UINT64 OriginalPciAttributes;
|
||||
LIST_ENTRY DeviceList;
|
||||
UINT64 EnabledPciAttributes;
|
||||
UINT64 OriginalPciAttributes;
|
||||
|
||||
//
|
||||
// For AtaPassThru protocol, using the following bytes to record the previous call in
|
||||
// GetNextPort()/GetNextDevice().
|
||||
//
|
||||
UINT16 PreviousPort;
|
||||
UINT16 PreviousPortMultiplier;
|
||||
UINT16 PreviousPort;
|
||||
UINT16 PreviousPortMultiplier;
|
||||
//
|
||||
// For ExtScsiPassThru protocol, using the following bytes to record the previous call in
|
||||
// GetNextTarget()/GetNextTargetLun().
|
||||
//
|
||||
UINT16 PreviousTargetId;
|
||||
UINT64 PreviousLun;
|
||||
UINT16 PreviousTargetId;
|
||||
UINT64 PreviousLun;
|
||||
|
||||
//
|
||||
// For Non-blocking.
|
||||
//
|
||||
EFI_EVENT TimerEvent;
|
||||
LIST_ENTRY NonBlockingTaskList;
|
||||
EFI_EVENT TimerEvent;
|
||||
LIST_ENTRY NonBlockingTaskList;
|
||||
} ATA_ATAPI_PASS_THRU_INSTANCE;
|
||||
|
||||
//
|
||||
// Task for Non-blocking mode.
|
||||
//
|
||||
struct _ATA_NONBLOCK_TASK {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplier;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
BOOLEAN IsStart;
|
||||
EFI_EVENT Event;
|
||||
UINT64 RetryTimes;
|
||||
BOOLEAN InfiniteWait;
|
||||
VOID *Map; // Pointer to map.
|
||||
VOID *TableMap; // Pointer to PRD table map.
|
||||
EFI_ATA_DMA_PRD *MapBaseAddress; // Pointer to range Base address for Map.
|
||||
UINTN PageCount; // The page numbers used by PCIO freebuffer.
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplier;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
BOOLEAN IsStart;
|
||||
EFI_EVENT Event;
|
||||
UINT64 RetryTimes;
|
||||
BOOLEAN InfiniteWait;
|
||||
VOID *Map; // Pointer to map.
|
||||
VOID *TableMap; // Pointer to PRD table map.
|
||||
EFI_ATA_DMA_PRD *MapBaseAddress; // Pointer to range Base address for Map.
|
||||
UINTN PageCount; // The page numbers used by PCIO freebuffer.
|
||||
};
|
||||
|
||||
//
|
||||
// Timeout value which uses 100ns as a unit.
|
||||
// It means 3 second span.
|
||||
//
|
||||
#define ATA_ATAPI_TIMEOUT EFI_TIMER_PERIOD_SECONDS(3)
|
||||
#define ATA_SPINUP_TIMEOUT EFI_TIMER_PERIOD_SECONDS(10)
|
||||
#define ATA_ATAPI_TIMEOUT EFI_TIMER_PERIOD_SECONDS(3)
|
||||
#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) \
|
||||
CR (a, \
|
||||
@ -295,11 +296,11 @@ AtaAtapiPassThruComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaAtapiPassThruComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -347,9 +348,9 @@ AtaAtapiPassThruComponentNameGetControllerName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaAtapiPassThruSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -390,9 +391,9 @@ AtaAtapiPassThruSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaAtapiPassThruStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -424,10 +425,10 @@ AtaAtapiPassThruStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaAtapiPassThruStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -446,9 +447,9 @@ LIST_ENTRY *
|
||||
EFIAPI
|
||||
SearchDeviceInfoList (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplier,
|
||||
IN EFI_ATA_DEVICE_TYPE DeviceType
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplier,
|
||||
IN EFI_ATA_DEVICE_TYPE DeviceType
|
||||
);
|
||||
|
||||
/**
|
||||
@ -470,10 +471,10 @@ EFI_STATUS
|
||||
EFIAPI
|
||||
CreateNewDeviceInfo (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplier,
|
||||
IN EFI_ATA_DEVICE_TYPE DeviceType,
|
||||
IN EFI_IDENTIFY_DATA *IdentifyData
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplier,
|
||||
IN EFI_ATA_DEVICE_TYPE DeviceType,
|
||||
IN EFI_IDENTIFY_DATA *IdentifyData
|
||||
);
|
||||
|
||||
/**
|
||||
@ -499,7 +500,7 @@ DestroyDeviceInfoList (
|
||||
VOID
|
||||
EFIAPI
|
||||
DestroyAsynTaskList (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
|
||||
IN BOOLEAN IsSigEvent
|
||||
);
|
||||
|
||||
@ -517,7 +518,7 @@ DestroyAsynTaskList (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EnumerateAttachedDevice (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
|
||||
);
|
||||
|
||||
/**
|
||||
@ -532,7 +533,7 @@ VOID
|
||||
EFIAPI
|
||||
AsyncNonBlockingTransferRoutine (
|
||||
EFI_EVENT Event,
|
||||
VOID* Context
|
||||
VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -567,11 +568,11 @@ AsyncNonBlockingTransferRoutine (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruPassThru (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@ -608,8 +609,8 @@ AtaPassThruPassThru (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruGetNextPort (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT16 *Port
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT16 *Port
|
||||
);
|
||||
|
||||
/**
|
||||
@ -657,9 +658,9 @@ AtaPassThruGetNextPort (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruGetNextDevice (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN OUT UINT16 *PortMultiplierPort
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN OUT UINT16 *PortMultiplierPort
|
||||
);
|
||||
|
||||
/**
|
||||
@ -697,10 +698,10 @@ AtaPassThruGetNextDevice (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruBuildDevicePath (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -743,10 +744,10 @@ AtaPassThruBuildDevicePath (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruGetDevice (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT16 *Port,
|
||||
OUT UINT16 *PortMultiplierPort
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT16 *Port,
|
||||
OUT UINT16 *PortMultiplierPort
|
||||
);
|
||||
|
||||
/**
|
||||
@ -776,8 +777,8 @@ AtaPassThruGetDevice (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruResetPort (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port
|
||||
);
|
||||
|
||||
/**
|
||||
@ -814,9 +815,9 @@ AtaPassThruResetPort (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPassThruResetDevice (
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort
|
||||
IN EFI_ATA_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort
|
||||
);
|
||||
|
||||
/**
|
||||
@ -863,11 +864,11 @@ AtaPassThruResetDevice (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruPassThru (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun,
|
||||
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun,
|
||||
IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@ -899,9 +900,9 @@ ExtScsiPassThruPassThru (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruGetNextTargetLun (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT8 **Target,
|
||||
IN OUT UINT64 *Lun
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT8 **Target,
|
||||
IN OUT UINT64 *Lun
|
||||
);
|
||||
|
||||
/**
|
||||
@ -934,10 +935,10 @@ ExtScsiPassThruGetNextTargetLun (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruBuildDevicePath (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -962,10 +963,10 @@ ExtScsiPassThruBuildDevicePath (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruGetTargetLun (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT8 **Target,
|
||||
OUT UINT64 *Lun
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT8 **Target,
|
||||
OUT UINT64 *Lun
|
||||
);
|
||||
|
||||
/**
|
||||
@ -982,7 +983,7 @@ ExtScsiPassThruGetTargetLun (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruResetChannel (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1007,9 +1008,9 @@ ExtScsiPassThruResetChannel (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruResetTargetLun (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT8 *Target,
|
||||
IN UINT64 Lun
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1037,8 +1038,8 @@ ExtScsiPassThruResetTargetLun (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ExtScsiPassThruGetNextTarget (
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT8 **Target
|
||||
IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT8 **Target
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1052,7 +1053,7 @@ ExtScsiPassThruGetNextTarget (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IdeModeInitialization (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1066,7 +1067,7 @@ IdeModeInitialization (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciModeInitialization (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1094,16 +1095,16 @@ AhciModeInitialization (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciNonDataTransfer (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||
IN UINT8 AtapiCommandLength,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||
IN UINT8 AtapiCommandLength,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1134,19 +1135,19 @@ AhciNonDataTransfer (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciDmaTransfer (
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||
IN UINT8 AtapiCommandLength,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN OUT VOID *MemoryAddr,
|
||||
IN UINT32 DataCount,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
IN ATA_ATAPI_PASS_THRU_INSTANCE *Instance,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||
IN UINT8 AtapiCommandLength,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN OUT VOID *MemoryAddr,
|
||||
IN UINT32 DataCount,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1177,19 +1178,19 @@ AhciDmaTransfer (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AhciPioTransfer (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||
IN UINT8 AtapiCommandLength,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN OUT VOID *MemoryAddr,
|
||||
IN UINT32 DataCount,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_AHCI_REGISTERS *AhciRegisters,
|
||||
IN UINT8 Port,
|
||||
IN UINT8 PortMultiplier,
|
||||
IN EFI_AHCI_ATAPI_COMMAND *AtapiCommand OPTIONAL,
|
||||
IN UINT8 AtapiCommandLength,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN OUT VOID *MemoryAddr,
|
||||
IN UINT32 DataCount,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1213,12 +1214,12 @@ AhciPioTransfer (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaNonDataCommandIn (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1284,16 +1285,15 @@ AtaUdmaInOut (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPioDataInOut (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT64 ByteCount,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT64 ByteCount,
|
||||
IN BOOLEAN Read,
|
||||
IN EFI_ATA_COMMAND_BLOCK *AtaCommandBlock,
|
||||
IN OUT EFI_ATA_STATUS_BLOCK *AtaStatusBlock,
|
||||
IN UINT64 Timeout,
|
||||
IN ATA_NONBLOCK_TASK *Task
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -11,22 +11,22 @@
|
||||
//
|
||||
// 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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
// 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" },
|
||||
{ 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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
@ -41,9 +41,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gAtaAtapiPassThruComp
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) AtaAtapiPassThruComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) AtaAtapiPassThruComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaAtapiPassThruComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)AtaAtapiPassThruComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)AtaAtapiPassThruComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
@ -103,7 +103,6 @@ AtaAtapiPassThruComponentNameGetDriverName (
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -175,11 +174,11 @@ AtaAtapiPassThruComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaAtapiPassThruComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -187,7 +186,7 @@ AtaAtapiPassThruComponentNameGetControllerName (
|
||||
VOID *Interface;
|
||||
ATA_ATAPI_PASS_THRU_INSTANCE *Instance;
|
||||
|
||||
if (Language == NULL || ControllerName == NULL) {
|
||||
if ((Language == NULL) || (ControllerName == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -5,6 +5,7 @@
|
||||
SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __ATA_HC_IDE_MODE_H__
|
||||
#define __ATA_HC_IDE_MODE_H__
|
||||
|
||||
@ -59,50 +60,50 @@ typedef enum {
|
||||
#define BMIS_INTERRUPT BIT2
|
||||
#define BMIS_ERROR BIT1
|
||||
|
||||
#define BMIC_OFFSET 0x00
|
||||
#define BMIS_OFFSET 0x02
|
||||
#define BMID_OFFSET 0x04
|
||||
#define BMIC_OFFSET 0x00
|
||||
#define BMIS_OFFSET 0x02
|
||||
#define BMID_OFFSET 0x04
|
||||
|
||||
//
|
||||
// IDE transfer mode
|
||||
//
|
||||
#define EFI_ATA_MODE_DEFAULT_PIO 0x00
|
||||
#define EFI_ATA_MODE_FLOW_PIO 0x01
|
||||
#define EFI_ATA_MODE_MDMA 0x04
|
||||
#define EFI_ATA_MODE_UDMA 0x08
|
||||
#define EFI_ATA_MODE_DEFAULT_PIO 0x00
|
||||
#define EFI_ATA_MODE_FLOW_PIO 0x01
|
||||
#define EFI_ATA_MODE_MDMA 0x04
|
||||
#define EFI_ATA_MODE_UDMA 0x08
|
||||
|
||||
typedef struct {
|
||||
UINT32 RegionBaseAddr;
|
||||
UINT16 ByteCount;
|
||||
UINT16 EndOfTable;
|
||||
UINT32 RegionBaseAddr;
|
||||
UINT16 ByteCount;
|
||||
UINT16 EndOfTable;
|
||||
} EFI_ATA_DMA_PRD;
|
||||
|
||||
typedef struct {
|
||||
UINT8 ModeNumber : 3;
|
||||
UINT8 ModeCategory : 5;
|
||||
UINT8 ModeNumber : 3;
|
||||
UINT8 ModeCategory : 5;
|
||||
} EFI_ATA_TRANSFER_MODE;
|
||||
|
||||
typedef struct {
|
||||
UINT8 Sector;
|
||||
UINT8 Heads;
|
||||
UINT8 MultipleSector;
|
||||
UINT8 Sector;
|
||||
UINT8 Heads;
|
||||
UINT8 MultipleSector;
|
||||
} EFI_ATA_DRIVE_PARMS;
|
||||
|
||||
//
|
||||
// IDE registers set
|
||||
//
|
||||
typedef struct {
|
||||
UINT16 Data;
|
||||
UINT16 ErrOrFeature;
|
||||
UINT16 SectorCount;
|
||||
UINT16 SectorNumber;
|
||||
UINT16 CylinderLsb;
|
||||
UINT16 CylinderMsb;
|
||||
UINT16 Head;
|
||||
UINT16 CmdOrStatus;
|
||||
UINT16 AltOrDev;
|
||||
UINT16 Data;
|
||||
UINT16 ErrOrFeature;
|
||||
UINT16 SectorCount;
|
||||
UINT16 SectorNumber;
|
||||
UINT16 CylinderLsb;
|
||||
UINT16 CylinderMsb;
|
||||
UINT16 Head;
|
||||
UINT16 CmdOrStatus;
|
||||
UINT16 AltOrDev;
|
||||
|
||||
UINT16 BusMasterBaseAddr;
|
||||
UINT16 BusMasterBaseAddr;
|
||||
} EFI_IDE_REGISTERS;
|
||||
|
||||
//
|
||||
@ -164,8 +165,8 @@ typedef struct {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
GetIdeRegisterIoAddr (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN OUT EFI_IDE_REGISTERS *IdeRegisters
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN OUT EFI_IDE_REGISTERS *IdeRegisters
|
||||
);
|
||||
|
||||
/**
|
||||
@ -187,12 +188,11 @@ GetIdeRegisterIoAddr (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaPacketCommandExecute (
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||
IN UINT8 Channel,
|
||||
IN UINT8 Device,
|
||||
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
|
||||
IN EFI_PCI_IO_PROTOCOL *PciIo,
|
||||
IN EFI_IDE_REGISTERS *IdeRegisters,
|
||||
IN UINT8 Channel,
|
||||
IN UINT8 Device,
|
||||
IN EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -15,7 +15,7 @@
|
||||
//
|
||||
// ATA Bus Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding = {
|
||||
AtaBusDriverBindingSupported,
|
||||
AtaBusDriverBindingStart,
|
||||
AtaBusDriverBindingStop,
|
||||
@ -27,9 +27,9 @@ EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding = {
|
||||
//
|
||||
// Template for ATA Child Device.
|
||||
//
|
||||
ATA_DEVICE gAtaDeviceTemplate = {
|
||||
ATA_DEVICE_SIGNATURE, // Signature
|
||||
NULL, // Handle
|
||||
ATA_DEVICE gAtaDeviceTemplate = {
|
||||
ATA_DEVICE_SIGNATURE, // Signature
|
||||
NULL, // Handle
|
||||
{ // BlockIo
|
||||
EFI_BLOCK_IO_PROTOCOL_REVISION,
|
||||
NULL,
|
||||
@ -65,25 +65,27 @@ ATA_DEVICE gAtaDeviceTemplate = {
|
||||
AtaDiskInfoSenseData,
|
||||
AtaDiskInfoWhichIde
|
||||
},
|
||||
NULL, // DevicePath
|
||||
NULL, // DevicePath
|
||||
{
|
||||
AtaStorageSecurityReceiveData,
|
||||
AtaStorageSecuritySendData
|
||||
},
|
||||
NULL, // AtaBusDriverData
|
||||
0, // Port
|
||||
0, // PortMultiplierPort
|
||||
{ 0, }, // Packet
|
||||
{{ 0}, }, // Acb
|
||||
NULL, // Asb
|
||||
FALSE, // UdmaValid
|
||||
FALSE, // Lba48Bit
|
||||
NULL, // IdentifyData
|
||||
NULL, // ControllerNameTable
|
||||
{L'\0', }, // ModelName
|
||||
{NULL, NULL}, // AtaTaskList
|
||||
{NULL, NULL}, // AtaSubTaskList
|
||||
FALSE // Abort
|
||||
NULL, // AtaBusDriverData
|
||||
0, // Port
|
||||
0, // PortMultiplierPort
|
||||
{ 0, }, // Packet
|
||||
{
|
||||
{ 0 },
|
||||
}, // Acb
|
||||
NULL, // Asb
|
||||
FALSE, // UdmaValid
|
||||
FALSE, // Lba48Bit
|
||||
NULL, // IdentifyData
|
||||
NULL, // ControllerNameTable
|
||||
{ L'\0', }, // ModelName
|
||||
{ NULL, NULL }, // AtaTaskList
|
||||
{ NULL, NULL }, // AtaSubTaskList
|
||||
FALSE // Abort
|
||||
};
|
||||
|
||||
/**
|
||||
@ -101,8 +103,8 @@ ATA_DEVICE gAtaDeviceTemplate = {
|
||||
**/
|
||||
VOID *
|
||||
AllocateAlignedBuffer (
|
||||
IN ATA_DEVICE *AtaDevice,
|
||||
IN UINTN BufferSize
|
||||
IN ATA_DEVICE *AtaDevice,
|
||||
IN UINTN BufferSize
|
||||
)
|
||||
{
|
||||
return AllocateAlignedPages (EFI_SIZE_TO_PAGES (BufferSize), AtaDevice->AtaBusDriverData->AtaPassThru->Mode->IoAlign);
|
||||
@ -120,8 +122,8 @@ AllocateAlignedBuffer (
|
||||
**/
|
||||
VOID
|
||||
FreeAlignedBuffer (
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
)
|
||||
{
|
||||
if (Buffer != NULL) {
|
||||
@ -129,7 +131,6 @@ FreeAlignedBuffer (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Release all the resources allocated for the ATA device.
|
||||
|
||||
@ -143,11 +144,11 @@ ReleaseAtaResources (
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
)
|
||||
{
|
||||
ATA_BUS_ASYN_SUB_TASK *SubTask;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *DelEntry;
|
||||
EFI_TPL OldTpl;
|
||||
ATA_BUS_ASYN_SUB_TASK *SubTask;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *DelEntry;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
FreeUnicodeStringTable (AtaDevice->ControllerNameTable);
|
||||
FreeAlignedBuffer (AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));
|
||||
@ -155,14 +156,16 @@ ReleaseAtaResources (
|
||||
if (AtaDevice->DevicePath != NULL) {
|
||||
FreePool (AtaDevice->DevicePath);
|
||||
}
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
if (!IsListEmpty (&AtaDevice->AtaSubTaskList)) {
|
||||
//
|
||||
// Free the Subtask list.
|
||||
//
|
||||
for(Entry = AtaDevice->AtaSubTaskList.ForwardLink;
|
||||
Entry != (&AtaDevice->AtaSubTaskList);
|
||||
) {
|
||||
for (Entry = AtaDevice->AtaSubTaskList.ForwardLink;
|
||||
Entry != (&AtaDevice->AtaSubTaskList);
|
||||
)
|
||||
{
|
||||
DelEntry = Entry;
|
||||
Entry = Entry->ForwardLink;
|
||||
SubTask = ATA_ASYN_SUB_TASK_FROM_ENTRY (DelEntry);
|
||||
@ -171,13 +174,15 @@ ReleaseAtaResources (
|
||||
FreeAtaSubTask (SubTask);
|
||||
}
|
||||
}
|
||||
|
||||
if (!IsListEmpty (&AtaDevice->AtaTaskList)) {
|
||||
//
|
||||
// Free the Subtask list.
|
||||
//
|
||||
for(Entry = AtaDevice->AtaTaskList.ForwardLink;
|
||||
Entry != (&AtaDevice->AtaTaskList);
|
||||
) {
|
||||
for (Entry = AtaDevice->AtaTaskList.ForwardLink;
|
||||
Entry != (&AtaDevice->AtaTaskList);
|
||||
)
|
||||
{
|
||||
DelEntry = Entry;
|
||||
Entry = Entry->ForwardLink;
|
||||
AtaTask = ATA_ASYN_TASK_FROM_ENTRY (DelEntry);
|
||||
@ -186,11 +191,11 @@ ReleaseAtaResources (
|
||||
FreePool (AtaTask);
|
||||
}
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
FreePool (AtaDevice);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Registers an ATA device.
|
||||
|
||||
@ -210,29 +215,29 @@ ReleaseAtaResources (
|
||||
**/
|
||||
EFI_STATUS
|
||||
RegisterAtaDevice (
|
||||
IN OUT ATA_BUS_DRIVER_DATA *AtaBusDriverData,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort
|
||||
IN OUT ATA_BUS_DRIVER_DATA *AtaBusDriverData,
|
||||
IN UINT16 Port,
|
||||
IN UINT16 PortMultiplierPort
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
|
||||
AtaDevice = NULL;
|
||||
NewDevicePathNode = NULL;
|
||||
DevicePath = NULL;
|
||||
AtaDevice = NULL;
|
||||
NewDevicePathNode = NULL;
|
||||
DevicePath = NULL;
|
||||
RemainingDevicePath = NULL;
|
||||
|
||||
//
|
||||
// Build device path
|
||||
//
|
||||
AtaPassThru = AtaBusDriverData->AtaPassThru;
|
||||
Status = AtaPassThru->BuildDevicePath (AtaPassThru, Port, PortMultiplierPort, &NewDevicePathNode);
|
||||
Status = AtaPassThru->BuildDevicePath (AtaPassThru, Port, PortMultiplierPort, &NewDevicePathNode);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
@ -243,10 +248,10 @@ RegisterAtaDevice (
|
||||
goto Done;
|
||||
}
|
||||
|
||||
DeviceHandle = NULL;
|
||||
DeviceHandle = NULL;
|
||||
RemainingDevicePath = DevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) {
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
|
||||
Status = EFI_ALREADY_STARTED;
|
||||
FreePool (DevicePath);
|
||||
goto Done;
|
||||
@ -270,11 +275,12 @@ RegisterAtaDevice (
|
||||
AtaDevice->DevicePath = DevicePath;
|
||||
AtaDevice->Port = Port;
|
||||
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) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Done;
|
||||
}
|
||||
|
||||
AtaDevice->IdentifyData = AllocateAlignedBuffer (AtaDevice, sizeof (ATA_IDENTIFY_DATA));
|
||||
if (AtaDevice->IdentifyData == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
@ -368,13 +374,14 @@ RegisterAtaDevice (
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Done;
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_INFO, "Successfully Install Storage Security Protocol on the ATA device\n"));
|
||||
}
|
||||
|
||||
gBS->OpenProtocol (
|
||||
AtaBusDriverData->Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **) &AtaPassThru,
|
||||
(VOID **)&AtaPassThru,
|
||||
AtaBusDriverData->DriverBindingHandle,
|
||||
AtaDevice->Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@ -389,10 +396,10 @@ Done:
|
||||
ReleaseAtaResources (AtaDevice);
|
||||
DEBUG ((DEBUG_ERROR | DEBUG_INIT, "Failed to initialize Port %x PortMultiplierPort %x, status = %r\n", Port, PortMultiplierPort, Status));
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Unregisters an ATA device.
|
||||
|
||||
@ -409,25 +416,25 @@ Done:
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnregisterAtaDevice (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL *BlockIo2;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
|
||||
|
||||
BlockIo2 = NULL;
|
||||
BlockIo = NULL;
|
||||
BlockIo2 = NULL;
|
||||
BlockIo = NULL;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -439,7 +446,7 @@ UnregisterAtaDevice (
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiBlockIo2ProtocolGuid,
|
||||
(VOID **) &BlockIo2,
|
||||
(VOID **)&BlockIo2,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -488,13 +495,13 @@ UnregisterAtaDevice (
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **) &AtaPassThru,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **)&AtaPassThru,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -504,7 +511,7 @@ UnregisterAtaDevice (
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiStorageSecurityCommandProtocolGuid,
|
||||
(VOID **) &StorageSecurity,
|
||||
(VOID **)&StorageSecurity,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -518,13 +525,13 @@ UnregisterAtaDevice (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **) &AtaPassThru,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **)&AtaPassThru,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
@ -533,8 +540,6 @@ UnregisterAtaDevice (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -585,11 +590,11 @@ AtaBusDriverBindingSupported (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplierPort;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplierPort;
|
||||
|
||||
//
|
||||
// Test EFI_ATA_PASS_THRU_PROTOCOL on controller handle.
|
||||
@ -597,7 +602,7 @@ AtaBusDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **) &AtaPassThru,
|
||||
(VOID **)&AtaPassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -619,11 +624,11 @@ AtaBusDriverBindingSupported (
|
||||
// Close the I/O Abstraction(s) used to perform the supported test
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@ -637,11 +642,11 @@ AtaBusDriverBindingSupported (
|
||||
// Close the I/O Abstraction(s) used to perform the supported test
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
@ -650,11 +655,11 @@ AtaBusDriverBindingSupported (
|
||||
// Close the I/O Abstraction(s) used to perform the supported test
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
//
|
||||
// Open the EFI Device Path protocol needed to perform the supported test
|
||||
@ -662,7 +667,7 @@ AtaBusDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -670,7 +675,6 @@ AtaBusDriverBindingSupported (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Starts a device controller or a bus controller.
|
||||
|
||||
@ -714,19 +718,19 @@ AtaBusDriverBindingStart (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
ATA_BUS_DRIVER_DATA *AtaBusDriverData;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplierPort;
|
||||
EFI_STATUS Status;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
ATA_BUS_DRIVER_DATA *AtaBusDriverData;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplierPort;
|
||||
|
||||
AtaBusDriverData = NULL;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -747,7 +751,7 @@ AtaBusDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
(VOID **) &AtaPassThru,
|
||||
(VOID **)&AtaPassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -766,9 +770,9 @@ AtaBusDriverBindingStart (
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
AtaBusDriverData->AtaPassThru = AtaPassThru;
|
||||
AtaBusDriverData->Controller = Controller;
|
||||
AtaBusDriverData->ParentDevicePath = ParentDevicePath;
|
||||
AtaBusDriverData->AtaPassThru = AtaPassThru;
|
||||
AtaBusDriverData->Controller = Controller;
|
||||
AtaBusDriverData->ParentDevicePath = ParentDevicePath;
|
||||
AtaBusDriverData->DriverBindingHandle = This->DriverBindingHandle;
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
@ -780,12 +784,11 @@ AtaBusDriverBindingStart (
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
} else {
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &AtaBusDriverData,
|
||||
(VOID **)&AtaBusDriverData,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -826,14 +829,16 @@ AtaBusDriverBindingStart (
|
||||
//
|
||||
break;
|
||||
}
|
||||
|
||||
RegisterAtaDevice (AtaBusDriverData, Port, PortMultiplierPort);
|
||||
}
|
||||
}
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
} else if (!IsDevicePathEnd (RemainingDevicePath)) {
|
||||
Status = AtaPassThru->GetDevice (AtaPassThru, RemainingDevicePath, &Port, &PortMultiplierPort);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = RegisterAtaDevice (AtaBusDriverData,Port, PortMultiplierPort);
|
||||
Status = RegisterAtaDevice (AtaBusDriverData, Port, PortMultiplierPort);
|
||||
}
|
||||
}
|
||||
|
||||
@ -852,17 +857,15 @@ ErrorExit:
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
return Status;
|
||||
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Stops a device controller or a bus controller.
|
||||
|
||||
@ -892,42 +895,42 @@ ErrorExit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBusDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
ATA_BUS_DRIVER_DATA *AtaBusDriverData;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
ATA_BUS_DRIVER_DATA *AtaBusDriverData;
|
||||
|
||||
if (NumberOfChildren == 0) {
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &AtaBusDriverData,
|
||||
(VOID **)&AtaBusDriverData,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
AtaBusDriverData,
|
||||
NULL
|
||||
);
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
AtaBusDriverData,
|
||||
NULL
|
||||
);
|
||||
FreePool (AtaBusDriverData);
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiAtaPassThruProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -935,7 +938,6 @@ AtaBusDriverBindingStop (
|
||||
AllChildrenStopped = TRUE;
|
||||
|
||||
for (Index = 0; Index < NumberOfChildren; Index++) {
|
||||
|
||||
Status = UnregisterAtaDevice (This, Controller, ChildHandleBuffer[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
AllChildrenStopped = FALSE;
|
||||
@ -949,7 +951,6 @@ AtaBusDriverBindingStop (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reset the Block Device.
|
||||
|
||||
@ -964,13 +965,13 @@ AtaBusDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
|
||||
@ -986,7 +987,6 @@ AtaBlockIoReset (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Read/Write BufferSize bytes from Lba from/into Buffer.
|
||||
|
||||
@ -1015,30 +1015,30 @@ AtaBlockIoReset (
|
||||
**/
|
||||
EFI_STATUS
|
||||
BlockIoReadWrite (
|
||||
IN VOID *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
IN BOOLEAN IsBlockIo2,
|
||||
IN BOOLEAN IsWrite
|
||||
IN VOID *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer,
|
||||
IN BOOLEAN IsBlockIo2,
|
||||
IN BOOLEAN IsWrite
|
||||
)
|
||||
{
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINTN BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
UINTN IoAlign;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_BLOCK_IO_MEDIA *Media;
|
||||
UINTN BlockSize;
|
||||
UINTN NumberOfBlocks;
|
||||
UINTN IoAlign;
|
||||
|
||||
if (IsBlockIo2) {
|
||||
Media = ((EFI_BLOCK_IO2_PROTOCOL *) This)->Media;
|
||||
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO2 (This);
|
||||
Media = ((EFI_BLOCK_IO2_PROTOCOL *)This)->Media;
|
||||
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO2 (This);
|
||||
} else {
|
||||
Media = ((EFI_BLOCK_IO_PROTOCOL *) This)->Media;
|
||||
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO (This);
|
||||
Media = ((EFI_BLOCK_IO_PROTOCOL *)This)->Media;
|
||||
AtaDevice = ATA_DEVICE_FROM_BLOCK_IO (This);
|
||||
}
|
||||
|
||||
if (MediaId != Media->MediaId) {
|
||||
@ -1057,6 +1057,7 @@ BlockIoReadWrite (
|
||||
Token->TransactionStatus = EFI_SUCCESS;
|
||||
gBS->SignalEvent (Token->Event);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -1065,13 +1066,13 @@ BlockIoReadWrite (
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
NumberOfBlocks = BufferSize / BlockSize;
|
||||
NumberOfBlocks = BufferSize / BlockSize;
|
||||
if ((Lba + NumberOfBlocks - 1) > Media->LastBlock) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
IoAlign = Media->IoAlign;
|
||||
if (IoAlign > 0 && (((UINTN) Buffer & (IoAlign - 1)) != 0)) {
|
||||
if ((IoAlign > 0) && (((UINTN)Buffer & (IoAlign - 1)) != 0)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -1087,7 +1088,6 @@ BlockIoReadWrite (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@ -1110,17 +1110,16 @@ BlockIoReadWrite (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoReadBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
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.
|
||||
|
||||
@ -1144,17 +1143,16 @@ AtaBlockIoReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
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.
|
||||
|
||||
@ -1168,7 +1166,7 @@ AtaBlockIoWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
)
|
||||
{
|
||||
//
|
||||
@ -1195,9 +1193,9 @@ AtaBlockIoResetEx (
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_CALLBACK);
|
||||
|
||||
@ -1252,10 +1250,9 @@ AtaBlockIoReadBlocksEx (
|
||||
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.
|
||||
|
||||
@ -1289,10 +1286,9 @@ AtaBlockIoWriteBlocksEx (
|
||||
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.
|
||||
|
||||
@ -1314,12 +1310,14 @@ AtaBlockIoFlushBlocksEx (
|
||||
//
|
||||
// Signal event and return directly.
|
||||
//
|
||||
if (Token != NULL && Token->Event != NULL) {
|
||||
if ((Token != NULL) && (Token->Event != NULL)) {
|
||||
Token->TransactionStatus = EFI_SUCCESS;
|
||||
gBS->SignalEvent (Token->Event);
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
Provides inquiry information for the controller type.
|
||||
|
||||
@ -1339,15 +1337,14 @@ AtaBlockIoFlushBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoInquiry (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Provides identify information for the controller type.
|
||||
|
||||
@ -1369,13 +1366,13 @@ AtaDiskInfoInquiry (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoIdentify (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
|
||||
AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This);
|
||||
|
||||
@ -1384,12 +1381,12 @@ AtaDiskInfoIdentify (
|
||||
Status = EFI_SUCCESS;
|
||||
CopyMem (IdentifyData, AtaDevice->IdentifyData, sizeof (ATA_IDENTIFY_DATA));
|
||||
}
|
||||
|
||||
*IdentifyDataSize = sizeof (ATA_IDENTIFY_DATA);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Provides sense data information for the controller type.
|
||||
|
||||
@ -1410,16 +1407,15 @@ AtaDiskInfoIdentify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoSenseData (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function is used by the IDE bus driver to get controller information.
|
||||
|
||||
@ -1434,16 +1430,16 @@ AtaDiskInfoSenseData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoWhichIde (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
)
|
||||
{
|
||||
ATA_DEVICE *AtaDevice;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
|
||||
AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This);
|
||||
*IdeChannel = AtaDevice->Port;
|
||||
*IdeDevice = AtaDevice->PortMultiplierPort;
|
||||
AtaDevice = ATA_DEVICE_FROM_DISK_INFO (This);
|
||||
*IdeChannel = AtaDevice->Port;
|
||||
*IdeDevice = AtaDevice->PortMultiplierPort;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -1523,22 +1519,22 @@ AtaDiskInfoWhichIde (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaStorageSecurityReceiveData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *Private;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *Private;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
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;
|
||||
}
|
||||
|
||||
@ -1634,18 +1630,18 @@ AtaStorageSecurityReceiveData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaStorageSecuritySendData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *Private;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
ATA_DEVICE *Private;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
DEBUG ((DEBUG_INFO, "EFI Storage Security Protocol - Send\n"));
|
||||
if ((PayloadBuffer == NULL) && (PayloadBufferSize != 0)) {
|
||||
@ -1687,12 +1683,12 @@ AtaStorageSecuritySendData (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeAtaBus(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializeAtaBus (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
|
@ -38,27 +38,27 @@
|
||||
//
|
||||
// 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
|
||||
//
|
||||
#define MAX_RETRY_TIMES 3
|
||||
#define MAX_RETRY_TIMES 3
|
||||
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
#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.
|
||||
//
|
||||
//#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),
|
||||
@ -66,109 +66,109 @@
|
||||
// seems not ready. Change the Maximum Sector Numbers to 0xFFFF to work round
|
||||
// this issue.
|
||||
//
|
||||
#define MAX_48BIT_TRANSFER_BLOCK_NUM 0xFFFF
|
||||
#define MAX_48BIT_TRANSFER_BLOCK_NUM 0xFFFF
|
||||
|
||||
//
|
||||
// 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_DEVICE_SIGNATURE SIGNATURE_32 ('A', 'B', 'I', 'D')
|
||||
#define ATA_SUB_TASK_SIGNATURE SIGNATURE_32 ('A', 'S', 'T', 'S')
|
||||
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
|
||||
#define ATA_TASK_SIGNATURE SIGNATURE_32 ('A', 'T', 'S', 'K')
|
||||
#define ATA_DEVICE_SIGNATURE SIGNATURE_32 ('A', 'B', 'I', 'D')
|
||||
#define ATA_SUB_TASK_SIGNATURE SIGNATURE_32 ('A', 'S', 'T', 'S')
|
||||
#define IS_ALIGNED(addr, size) (((UINTN) (addr) & (size - 1)) == 0)
|
||||
|
||||
//
|
||||
// ATA bus data structure for ATA controller
|
||||
//
|
||||
typedef struct {
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
} ATA_BUS_DRIVER_DATA;
|
||||
|
||||
//
|
||||
// ATA device data structure for each child device
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
EFI_HANDLE Handle;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL BlockIo2;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_BLOCK_IO_PROTOCOL BlockIo;
|
||||
EFI_BLOCK_IO2_PROTOCOL BlockIo2;
|
||||
EFI_BLOCK_IO_MEDIA BlockMedia;
|
||||
EFI_DISK_INFO_PROTOCOL DiskInfo;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL StorageSecurity;
|
||||
|
||||
ATA_BUS_DRIVER_DATA *AtaBusDriverData;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplierPort;
|
||||
ATA_BUS_DRIVER_DATA *AtaBusDriverData;
|
||||
UINT16 Port;
|
||||
UINT16 PortMultiplierPort;
|
||||
|
||||
//
|
||||
// Buffer for the execution of ATA pass through protocol
|
||||
//
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
|
||||
EFI_ATA_COMMAND_BLOCK Acb;
|
||||
EFI_ATA_STATUS_BLOCK *Asb;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
|
||||
EFI_ATA_COMMAND_BLOCK Acb;
|
||||
EFI_ATA_STATUS_BLOCK *Asb;
|
||||
|
||||
BOOLEAN UdmaValid;
|
||||
BOOLEAN Lba48Bit;
|
||||
BOOLEAN UdmaValid;
|
||||
BOOLEAN Lba48Bit;
|
||||
|
||||
//
|
||||
// Cached data for ATA identify data
|
||||
//
|
||||
ATA_IDENTIFY_DATA *IdentifyData;
|
||||
ATA_IDENTIFY_DATA *IdentifyData;
|
||||
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
CHAR16 ModelName[MAX_MODEL_NAME_LEN + 1];
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
CHAR16 ModelName[MAX_MODEL_NAME_LEN + 1];
|
||||
|
||||
LIST_ENTRY AtaTaskList;
|
||||
LIST_ENTRY AtaSubTaskList;
|
||||
BOOLEAN Abort;
|
||||
LIST_ENTRY AtaTaskList;
|
||||
LIST_ENTRY AtaSubTaskList;
|
||||
BOOLEAN Abort;
|
||||
} ATA_DEVICE;
|
||||
|
||||
//
|
||||
// Sub-Task for the non blocking I/O
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
UINTN *UnsignalledEventCount;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
|
||||
BOOLEAN *IsError;// Indicate whether meeting error during source allocation for new task.
|
||||
LIST_ENTRY TaskEntry;
|
||||
UINT32 Signature;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
UINTN *UnsignalledEventCount;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET Packet;
|
||||
BOOLEAN *IsError;// Indicate whether meeting error during source allocation for new task.
|
||||
LIST_ENTRY TaskEntry;
|
||||
} ATA_BUS_ASYN_SUB_TASK;
|
||||
|
||||
//
|
||||
// Task for the non blocking I/O
|
||||
//
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
UINT8 *Buffer;
|
||||
EFI_LBA StartLba;
|
||||
UINTN NumberOfBlocks;
|
||||
BOOLEAN IsWrite;
|
||||
LIST_ENTRY TaskEntry;
|
||||
UINT32 Signature;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
UINT8 *Buffer;
|
||||
EFI_LBA StartLba;
|
||||
UINTN NumberOfBlocks;
|
||||
BOOLEAN IsWrite;
|
||||
LIST_ENTRY TaskEntry;
|
||||
} ATA_BUS_ASYN_TASK;
|
||||
|
||||
#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_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_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_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_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_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)
|
||||
|
||||
//
|
||||
// Global Variables
|
||||
//
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gAtaBusComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gAtaBusDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gAtaBusComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2;
|
||||
|
||||
/**
|
||||
Allocates an aligned buffer for ATA device.
|
||||
@ -185,8 +185,8 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2;
|
||||
**/
|
||||
VOID *
|
||||
AllocateAlignedBuffer (
|
||||
IN ATA_DEVICE *AtaDevice,
|
||||
IN UINTN BufferSize
|
||||
IN ATA_DEVICE *AtaDevice,
|
||||
IN UINTN BufferSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -201,8 +201,8 @@ AllocateAlignedBuffer (
|
||||
**/
|
||||
VOID
|
||||
FreeAlignedBuffer (
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
IN VOID *Buffer,
|
||||
IN UINTN BufferSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -230,10 +230,9 @@ FreeAtaSubTask (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ResetAtaDevice (
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Discovers whether it is a valid ATA device.
|
||||
|
||||
@ -250,7 +249,7 @@ ResetAtaDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DiscoverAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice
|
||||
IN OUT ATA_DEVICE *AtaDevice
|
||||
);
|
||||
|
||||
/**
|
||||
@ -272,13 +271,13 @@ DiscoverAtaDevice (
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
AccessAtaDevice(
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT UINT8 *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks,
|
||||
IN BOOLEAN IsWrite,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
AccessAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT UINT8 *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks,
|
||||
IN BOOLEAN IsWrite,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
);
|
||||
|
||||
/**
|
||||
@ -313,19 +312,20 @@ AccessAtaDevice(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TrustTransferAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN TransferLength,
|
||||
IN BOOLEAN IsTrustSend,
|
||||
IN UINT64 Timeout,
|
||||
OUT UINTN *TransferLengthOut
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN TransferLength,
|
||||
IN BOOLEAN IsTrustSend,
|
||||
IN UINT64 Timeout,
|
||||
OUT UINTN *TransferLengthOut
|
||||
);
|
||||
|
||||
//
|
||||
// Protocol interface prototypes
|
||||
//
|
||||
|
||||
/**
|
||||
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.
|
||||
@ -448,13 +448,12 @@ AtaBusDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBusDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@ -502,7 +501,6 @@ AtaBusComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -574,14 +572,13 @@ AtaBusComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBusComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Reset the Block Device.
|
||||
|
||||
@ -596,11 +593,10 @@ AtaBusComponentNameGetControllerName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Read BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@ -623,14 +619,13 @@ AtaBlockIoReset (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoReadBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Write BufferSize bytes from Lba into Buffer.
|
||||
|
||||
@ -654,14 +649,13 @@ AtaBlockIoReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Flush the Block Device.
|
||||
|
||||
@ -675,7 +669,7 @@ AtaBlockIoWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBlockIoFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
@ -797,7 +791,7 @@ AtaBlockIoFlushBlocksEx (
|
||||
VOID
|
||||
EFIAPI
|
||||
AtaTerminateNonBlockingTask (
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
);
|
||||
|
||||
/**
|
||||
@ -819,12 +813,11 @@ AtaTerminateNonBlockingTask (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoInquiry (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Provides identify information for the controller type.
|
||||
|
||||
@ -846,12 +839,11 @@ AtaDiskInfoInquiry (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoIdentify (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Provides sense data information for the controller type.
|
||||
|
||||
@ -872,13 +864,12 @@ AtaDiskInfoIdentify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoSenseData (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function is used by the IDE bus driver to get controller information.
|
||||
|
||||
@ -893,9 +884,9 @@ AtaDiskInfoSenseData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaDiskInfoWhichIde (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
);
|
||||
|
||||
/**
|
||||
@ -973,14 +964,14 @@ AtaDiskInfoWhichIde (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaStorageSecurityReceiveData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1047,13 +1038,13 @@ AtaStorageSecurityReceiveData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaStorageSecuritySendData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1069,7 +1060,7 @@ AtaStorageSecuritySendData (
|
||||
**/
|
||||
VOID
|
||||
InitiateTPerReset (
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -19,16 +19,16 @@
|
||||
|
||||
#include "AtaBus.h"
|
||||
|
||||
#define ATA_CMD_TRUST_NON_DATA 0x5B
|
||||
#define ATA_CMD_TRUST_RECEIVE 0x5C
|
||||
#define ATA_CMD_TRUST_RECEIVE_DMA 0x5D
|
||||
#define ATA_CMD_TRUST_SEND 0x5E
|
||||
#define ATA_CMD_TRUST_SEND_DMA 0x5F
|
||||
#define ATA_CMD_TRUST_NON_DATA 0x5B
|
||||
#define ATA_CMD_TRUST_RECEIVE 0x5C
|
||||
#define ATA_CMD_TRUST_RECEIVE_DMA 0x5D
|
||||
#define ATA_CMD_TRUST_SEND 0x5E
|
||||
#define ATA_CMD_TRUST_SEND_DMA 0x5F
|
||||
|
||||
//
|
||||
// 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_OUT
|
||||
@ -42,7 +42,7 @@ EFI_ATA_PASS_THRU_CMD_PROTOCOL mAtaPassThruCmdProtocols[][2] = {
|
||||
//
|
||||
// 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
|
||||
@ -68,7 +68,7 @@ UINT8 mAtaCommands[][2][2] = {
|
||||
//
|
||||
// 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_SEND // PIO write
|
||||
@ -79,16 +79,14 @@ UINT8 mAtaTrustCommands[2][2] = {
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// Look up table (Lba48Bit) for maximum transfer block number
|
||||
//
|
||||
UINTN mMaxTransferBlockNumber[] = {
|
||||
UINTN mMaxTransferBlockNumber[] = {
|
||||
MAX_28BIT_TRANSFER_BLOCK_NUM,
|
||||
MAX_48BIT_TRANSFER_BLOCK_NUM
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.PassThru().
|
||||
|
||||
@ -112,21 +110,21 @@ UINTN mMaxTransferBlockNumber[] = {
|
||||
**/
|
||||
EFI_STATUS
|
||||
AtaDevicePassThru (
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL,
|
||||
IN OUT EFI_EVENT Event OPTIONAL
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL,
|
||||
IN OUT EFI_EVENT Event OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
EFI_STATUS Status;
|
||||
EFI_ATA_PASS_THRU_PROTOCOL *AtaPassThru;
|
||||
EFI_ATA_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
|
||||
//
|
||||
// Assemble packet. If it is non blocking mode, the Ata driver should keep each
|
||||
// subtask and clean them when the event is signaled.
|
||||
//
|
||||
if (TaskPacket != NULL) {
|
||||
Packet = TaskPacket;
|
||||
Packet = TaskPacket;
|
||||
Packet->Asb = AllocateAlignedBuffer (AtaDevice, sizeof (EFI_ATA_STATUS_BLOCK));
|
||||
if (Packet->Asb == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -135,7 +133,7 @@ AtaDevicePassThru (
|
||||
CopyMem (Packet->Asb, AtaDevice->Asb, sizeof (EFI_ATA_STATUS_BLOCK));
|
||||
Packet->Acb = AllocateCopyPool (sizeof (EFI_ATA_COMMAND_BLOCK), &AtaDevice->Acb);
|
||||
} else {
|
||||
Packet = &AtaDevice->Packet;
|
||||
Packet = &AtaDevice->Packet;
|
||||
Packet->Asb = AtaDevice->Asb;
|
||||
Packet->Acb = &AtaDevice->Acb;
|
||||
}
|
||||
@ -159,7 +157,6 @@ AtaDevicePassThru (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Wrapper for EFI_ATA_PASS_THRU_PROTOCOL.ResetDevice().
|
||||
|
||||
@ -173,10 +170,10 @@ AtaDevicePassThru (
|
||||
**/
|
||||
EFI_STATUS
|
||||
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;
|
||||
|
||||
@ -196,7 +193,6 @@ ResetAtaDevice (
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Prints ATA model name to ATA device structure.
|
||||
|
||||
@ -216,20 +212,20 @@ PrintAtaModelName (
|
||||
CHAR8 *Source;
|
||||
CHAR16 *Destination;
|
||||
|
||||
Source = AtaDevice->IdentifyData->ModelName;
|
||||
Source = AtaDevice->IdentifyData->ModelName;
|
||||
Destination = AtaDevice->ModelName;
|
||||
|
||||
//
|
||||
// Swap the byte order in the original module name.
|
||||
//
|
||||
for (Index = 0; Index < MAX_MODEL_NAME_LEN; Index += 2) {
|
||||
Destination[Index] = Source[Index + 1];
|
||||
Destination[Index + 1] = Source[Index];
|
||||
Destination[Index] = Source[Index + 1];
|
||||
Destination[Index + 1] = Source[Index];
|
||||
}
|
||||
|
||||
AtaDevice->ModelName[MAX_MODEL_NAME_LEN] = L'\0';
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Gets ATA device Capacity according to ATA 6.
|
||||
|
||||
@ -244,13 +240,13 @@ PrintAtaModelName (
|
||||
**/
|
||||
EFI_LBA
|
||||
GetAtapi6Capacity (
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
)
|
||||
{
|
||||
EFI_LBA Capacity;
|
||||
EFI_LBA TmpLba;
|
||||
UINTN Index;
|
||||
ATA_IDENTIFY_DATA *IdentifyData;
|
||||
EFI_LBA Capacity;
|
||||
EFI_LBA TmpLba;
|
||||
UINTN Index;
|
||||
ATA_IDENTIFY_DATA *IdentifyData;
|
||||
|
||||
IdentifyData = AtaDevice->IdentifyData;
|
||||
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
|
||||
//
|
||||
TmpLba = IdentifyData->maximum_lba_for_48bit_addressing[Index];
|
||||
TmpLba = IdentifyData->maximum_lba_for_48bit_addressing[Index];
|
||||
Capacity |= LShiftU64 (TmpLba, 16 * Index);
|
||||
}
|
||||
|
||||
return Capacity;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Identifies ATA device via the Identify data.
|
||||
|
||||
@ -291,14 +286,14 @@ GetAtapi6Capacity (
|
||||
**/
|
||||
EFI_STATUS
|
||||
IdentifyAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice
|
||||
IN OUT ATA_DEVICE *AtaDevice
|
||||
)
|
||||
{
|
||||
ATA_IDENTIFY_DATA *IdentifyData;
|
||||
EFI_BLOCK_IO_MEDIA *BlockMedia;
|
||||
EFI_LBA Capacity;
|
||||
UINT16 PhyLogicSectorSupport;
|
||||
UINT16 UdmaMode;
|
||||
ATA_IDENTIFY_DATA *IdentifyData;
|
||||
EFI_BLOCK_IO_MEDIA *BlockMedia;
|
||||
EFI_LBA Capacity;
|
||||
UINT16 PhyLogicSectorSupport;
|
||||
UINT16 UdmaMode;
|
||||
|
||||
IdentifyData = AtaDevice->IdentifyData;
|
||||
|
||||
@ -334,16 +329,16 @@ IdentifyAtaDevice (
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
||||
//
|
||||
// Block Media Information:
|
||||
//
|
||||
BlockMedia = &AtaDevice->BlockMedia;
|
||||
BlockMedia = &AtaDevice->BlockMedia;
|
||||
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
|
||||
//
|
||||
@ -353,23 +348,26 @@ IdentifyAtaDevice (
|
||||
// Check whether one physical block contains multiple physical blocks
|
||||
//
|
||||
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
|
||||
//
|
||||
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->LogicalBlocksPerPhysicalBlock);
|
||||
BlockMedia->LowestAlignedLba = (EFI_LBA)((BlockMedia->LogicalBlocksPerPhysicalBlock - ((UINT32)IdentifyData->alignment_logic_in_phy_blocks & 0x3fff)) %
|
||||
BlockMedia->LogicalBlocksPerPhysicalBlock);
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Check logical block size
|
||||
//
|
||||
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;
|
||||
}
|
||||
|
||||
//
|
||||
// Get ATA model name from identify data structure.
|
||||
//
|
||||
@ -378,7 +376,6 @@ IdentifyAtaDevice (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Discovers whether it is a valid ATA device.
|
||||
|
||||
@ -395,7 +392,7 @@ IdentifyAtaDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DiscoverAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice
|
||||
IN OUT ATA_DEVICE *AtaDevice
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -406,19 +403,19 @@ DiscoverAtaDevice (
|
||||
//
|
||||
// Prepare for ATA command block.
|
||||
//
|
||||
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
|
||||
Acb->AtaCommand = ATA_CMD_IDENTIFY_DRIVE;
|
||||
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
|
||||
Acb->AtaCommand = ATA_CMD_IDENTIFY_DRIVE;
|
||||
Acb->AtaDeviceHead = (UINT8)(BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||
|
||||
//
|
||||
// Prepare for ATA pass through packet.
|
||||
//
|
||||
Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
|
||||
Packet->InDataBuffer = AtaDevice->IdentifyData;
|
||||
Packet = ZeroMem (&AtaDevice->Packet, sizeof (EFI_ATA_PASS_THRU_COMMAND_PACKET));
|
||||
Packet->InDataBuffer = AtaDevice->IdentifyData;
|
||||
Packet->InTransferLength = sizeof (ATA_IDENTIFY_DATA);
|
||||
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->Timeout = ATA_TIMEOUT;
|
||||
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->Timeout = ATA_TIMEOUT;
|
||||
|
||||
Retry = MAX_RETRY_TIMES;
|
||||
do {
|
||||
@ -463,13 +460,13 @@ DiscoverAtaDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
TransferAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL,
|
||||
IN OUT VOID *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINT32 TransferLength,
|
||||
IN BOOLEAN IsWrite,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT EFI_ATA_PASS_THRU_COMMAND_PACKET *TaskPacket OPTIONAL,
|
||||
IN OUT VOID *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINT32 TransferLength,
|
||||
IN BOOLEAN IsWrite,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_ATA_COMMAND_BLOCK *Acb;
|
||||
@ -478,26 +475,26 @@ TransferAtaDevice (
|
||||
//
|
||||
// Ensure AtaDevice->UdmaValid, AtaDevice->Lba48Bit and IsWrite are valid boolean values
|
||||
//
|
||||
ASSERT ((UINTN) AtaDevice->UdmaValid < 2);
|
||||
ASSERT ((UINTN) AtaDevice->Lba48Bit < 2);
|
||||
ASSERT ((UINTN) IsWrite < 2);
|
||||
ASSERT ((UINTN)AtaDevice->UdmaValid < 2);
|
||||
ASSERT ((UINTN)AtaDevice->Lba48Bit < 2);
|
||||
ASSERT ((UINTN)IsWrite < 2);
|
||||
//
|
||||
// Prepare for ATA command block.
|
||||
//
|
||||
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
|
||||
Acb->AtaCommand = mAtaCommands[AtaDevice->UdmaValid][AtaDevice->Lba48Bit][IsWrite];
|
||||
Acb->AtaSectorNumber = (UINT8) StartLba;
|
||||
Acb->AtaCylinderLow = (UINT8) RShiftU64 (StartLba, 8);
|
||||
Acb->AtaCylinderHigh = (UINT8) RShiftU64 (StartLba, 16);
|
||||
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||
Acb->AtaSectorCount = (UINT8) TransferLength;
|
||||
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
|
||||
Acb->AtaCommand = mAtaCommands[AtaDevice->UdmaValid][AtaDevice->Lba48Bit][IsWrite];
|
||||
Acb->AtaSectorNumber = (UINT8)StartLba;
|
||||
Acb->AtaCylinderLow = (UINT8)RShiftU64 (StartLba, 8);
|
||||
Acb->AtaCylinderHigh = (UINT8)RShiftU64 (StartLba, 16);
|
||||
Acb->AtaDeviceHead = (UINT8)(BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||
Acb->AtaSectorCount = (UINT8)TransferLength;
|
||||
if (AtaDevice->Lba48Bit) {
|
||||
Acb->AtaSectorNumberExp = (UINT8) RShiftU64 (StartLba, 24);
|
||||
Acb->AtaCylinderLowExp = (UINT8) RShiftU64 (StartLba, 32);
|
||||
Acb->AtaCylinderHighExp = (UINT8) RShiftU64 (StartLba, 40);
|
||||
Acb->AtaSectorCountExp = (UINT8) (TransferLength >> 8);
|
||||
Acb->AtaSectorNumberExp = (UINT8)RShiftU64 (StartLba, 24);
|
||||
Acb->AtaCylinderLowExp = (UINT8)RShiftU64 (StartLba, 32);
|
||||
Acb->AtaCylinderHighExp = (UINT8)RShiftU64 (StartLba, 40);
|
||||
Acb->AtaSectorCountExp = (UINT8)(TransferLength >> 8);
|
||||
} else {
|
||||
Acb->AtaDeviceHead = (UINT8) (Acb->AtaDeviceHead | RShiftU64 (StartLba, 24));
|
||||
Acb->AtaDeviceHead = (UINT8)(Acb->AtaDeviceHead | RShiftU64 (StartLba, 24));
|
||||
}
|
||||
|
||||
//
|
||||
@ -510,15 +507,15 @@ TransferAtaDevice (
|
||||
}
|
||||
|
||||
if (IsWrite) {
|
||||
Packet->OutDataBuffer = Buffer;
|
||||
Packet->OutDataBuffer = Buffer;
|
||||
Packet->OutTransferLength = TransferLength;
|
||||
} else {
|
||||
Packet->InDataBuffer = Buffer;
|
||||
Packet->InDataBuffer = Buffer;
|
||||
Packet->InTransferLength = TransferLength;
|
||||
}
|
||||
|
||||
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 |
|
||||
@ -544,12 +541,12 @@ TransferAtaDevice (
|
||||
//
|
||||
// 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 {
|
||||
//
|
||||
// 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);
|
||||
@ -570,6 +567,7 @@ FreeAtaSubTask (
|
||||
if (Task->Packet.Asb != NULL) {
|
||||
FreeAlignedBuffer (Task->Packet.Asb, sizeof (EFI_ATA_STATUS_BLOCK));
|
||||
}
|
||||
|
||||
if (Task->Packet.Acb != NULL) {
|
||||
FreePool (Task->Packet.Acb);
|
||||
}
|
||||
@ -590,14 +588,14 @@ FreeAtaSubTask (
|
||||
VOID
|
||||
EFIAPI
|
||||
AtaTerminateNonBlockingTask (
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
IN ATA_DEVICE *AtaDevice
|
||||
)
|
||||
{
|
||||
BOOLEAN SubTaskEmpty;
|
||||
EFI_TPL OldTpl;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *List;
|
||||
BOOLEAN SubTaskEmpty;
|
||||
EFI_TPL OldTpl;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *List;
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
//
|
||||
@ -607,13 +605,14 @@ AtaTerminateNonBlockingTask (
|
||||
|
||||
List = &AtaDevice->AtaTaskList;
|
||||
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;
|
||||
gBS->SignalEvent (AtaTask->Token->Event);
|
||||
|
||||
Entry = RemoveEntryList (Entry);
|
||||
FreePool (AtaTask);
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
do {
|
||||
@ -628,7 +627,7 @@ AtaTerminateNonBlockingTask (
|
||||
//
|
||||
// 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;
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
}
|
||||
@ -644,17 +643,17 @@ AtaTerminateNonBlockingTask (
|
||||
VOID
|
||||
EFIAPI
|
||||
AtaNonBlockingCallBack (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
ATA_BUS_ASYN_SUB_TASK *Task;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
LIST_ENTRY *Entry;
|
||||
EFI_STATUS Status;
|
||||
ATA_BUS_ASYN_SUB_TASK *Task;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
ATA_DEVICE *AtaDevice;
|
||||
LIST_ENTRY *Entry;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Task = (ATA_BUS_ASYN_SUB_TASK *) Context;
|
||||
Task = (ATA_BUS_ASYN_SUB_TASK *)Context;
|
||||
gBS->CloseEvent (Event);
|
||||
|
||||
AtaDevice = Task->AtaDevice;
|
||||
@ -682,7 +681,7 @@ AtaNonBlockingCallBack (
|
||||
//
|
||||
// Reduce the SubEventCount, till it comes to zero.
|
||||
//
|
||||
(*Task->UnsignalledEventCount) --;
|
||||
(*Task->UnsignalledEventCount)--;
|
||||
DEBUG ((DEBUG_BLKIO, "UnsignalledEventCount = %d\n", *Task->UnsignalledEventCount));
|
||||
|
||||
//
|
||||
@ -702,7 +701,6 @@ AtaNonBlockingCallBack (
|
||||
FreePool (Task->UnsignalledEventCount);
|
||||
FreePool (Task->IsError);
|
||||
|
||||
|
||||
//
|
||||
// Finish all subtasks and move to the next task in AtaTaskList.
|
||||
//
|
||||
@ -723,6 +721,7 @@ AtaNonBlockingCallBack (
|
||||
AtaTask->Token->TransactionStatus = Status;
|
||||
gBS->SignalEvent (AtaTask->Token->Event);
|
||||
}
|
||||
|
||||
RemoveEntryList (Entry);
|
||||
FreePool (AtaTask);
|
||||
}
|
||||
@ -763,27 +762,27 @@ AtaNonBlockingCallBack (
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
AccessAtaDevice(
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT UINT8 *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks,
|
||||
IN BOOLEAN IsWrite,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
AccessAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT UINT8 *Buffer,
|
||||
IN EFI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks,
|
||||
IN BOOLEAN IsWrite,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN MaxTransferBlockNumber;
|
||||
UINTN TransferBlockNumber;
|
||||
UINTN BlockSize;
|
||||
ATA_BUS_ASYN_SUB_TASK *SubTask;
|
||||
UINTN *EventCount;
|
||||
UINTN TempCount;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
EFI_EVENT SubEvent;
|
||||
UINTN Index;
|
||||
BOOLEAN *IsError;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
UINTN MaxTransferBlockNumber;
|
||||
UINTN TransferBlockNumber;
|
||||
UINTN BlockSize;
|
||||
ATA_BUS_ASYN_SUB_TASK *SubTask;
|
||||
UINTN *EventCount;
|
||||
UINTN TempCount;
|
||||
ATA_BUS_ASYN_TASK *AtaTask;
|
||||
EFI_EVENT SubEvent;
|
||||
UINTN Index;
|
||||
BOOLEAN *IsError;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
TempCount = 0;
|
||||
Status = EFI_SUCCESS;
|
||||
@ -797,7 +796,7 @@ AccessAtaDevice(
|
||||
//
|
||||
// Ensure AtaDevice->Lba48Bit is a valid boolean value
|
||||
//
|
||||
ASSERT ((UINTN) AtaDevice->Lba48Bit < 2);
|
||||
ASSERT ((UINTN)AtaDevice->Lba48Bit < 2);
|
||||
MaxTransferBlockNumber = mMaxTransferBlockNumber[AtaDevice->Lba48Bit];
|
||||
BlockSize = AtaDevice->BlockMedia.BlockSize;
|
||||
|
||||
@ -813,6 +812,7 @@ AccessAtaDevice(
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
AtaTask->AtaDevice = AtaDevice;
|
||||
AtaTask->Buffer = Buffer;
|
||||
AtaTask->IsWrite = IsWrite;
|
||||
@ -825,10 +825,11 @@ AccessAtaDevice(
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
Token->TransactionStatus = EFI_SUCCESS;
|
||||
EventCount = AllocateZeroPool (sizeof (UINTN));
|
||||
EventCount = AllocateZeroPool (sizeof (UINTN));
|
||||
if (EventCount == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
@ -838,8 +839,9 @@ AccessAtaDevice(
|
||||
FreePool (EventCount);
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_BLKIO, "Allocation IsError Addr=%x\n", IsError));
|
||||
*IsError = FALSE;
|
||||
*IsError = FALSE;
|
||||
TempCount = (NumberOfBlocks + MaxTransferBlockNumber - 1) / MaxTransferBlockNumber;
|
||||
*EventCount = TempCount;
|
||||
DEBUG ((DEBUG_BLKIO, "AccessAtaDevice, NumberOfBlocks=%x\n", NumberOfBlocks));
|
||||
@ -858,7 +860,7 @@ AccessAtaDevice(
|
||||
if (NumberOfBlocks > MaxTransferBlockNumber) {
|
||||
TransferBlockNumber = MaxTransferBlockNumber;
|
||||
NumberOfBlocks -= MaxTransferBlockNumber;
|
||||
} else {
|
||||
} else {
|
||||
TransferBlockNumber = NumberOfBlocks;
|
||||
NumberOfBlocks = 0;
|
||||
}
|
||||
@ -876,7 +878,7 @@ AccessAtaDevice(
|
||||
goto EXIT;
|
||||
}
|
||||
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
SubTask->UnsignalledEventCount = EventCount;
|
||||
SubTask->Signature = ATA_SUB_TASK_SIGNATURE;
|
||||
SubTask->AtaDevice = AtaDevice;
|
||||
@ -901,13 +903,13 @@ AccessAtaDevice(
|
||||
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 {
|
||||
//
|
||||
// Blocking Mode.
|
||||
//
|
||||
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)) {
|
||||
@ -925,10 +927,10 @@ EXIT:
|
||||
// Release resource at non-blocking mode.
|
||||
//
|
||||
if (EFI_ERROR (Status)) {
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
OldTpl = gBS->RaiseTPL (TPL_NOTIFY);
|
||||
Token->TransactionStatus = Status;
|
||||
*EventCount = (*EventCount) - (TempCount - Index);
|
||||
*IsError = TRUE;
|
||||
*EventCount = (*EventCount) - (TempCount - Index);
|
||||
*IsError = TRUE;
|
||||
|
||||
if (*EventCount == 0) {
|
||||
FreePool (EventCount);
|
||||
@ -943,6 +945,7 @@ EXIT:
|
||||
if (SubEvent != NULL) {
|
||||
gBS->CloseEvent (SubEvent);
|
||||
}
|
||||
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
}
|
||||
}
|
||||
@ -982,14 +985,14 @@ EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
TrustTransferAtaDevice (
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN TransferLength,
|
||||
IN BOOLEAN IsTrustSend,
|
||||
IN UINT64 Timeout,
|
||||
OUT UINTN *TransferLengthOut
|
||||
IN OUT ATA_DEVICE *AtaDevice,
|
||||
IN OUT VOID *Buffer,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN TransferLength,
|
||||
IN BOOLEAN IsTrustSend,
|
||||
IN UINT64 Timeout,
|
||||
OUT UINTN *TransferLengthOut
|
||||
)
|
||||
{
|
||||
EFI_ATA_COMMAND_BLOCK *Acb;
|
||||
@ -1001,27 +1004,28 @@ TrustTransferAtaDevice (
|
||||
//
|
||||
// Ensure AtaDevice->UdmaValid and IsTrustSend are valid boolean values
|
||||
//
|
||||
ASSERT ((UINTN) AtaDevice->UdmaValid < 2);
|
||||
ASSERT ((UINTN) IsTrustSend < 2);
|
||||
ASSERT ((UINTN)AtaDevice->UdmaValid < 2);
|
||||
ASSERT ((UINTN)IsTrustSend < 2);
|
||||
//
|
||||
// Prepare for ATA command block.
|
||||
//
|
||||
Acb = ZeroMem (&AtaDevice->Acb, sizeof (EFI_ATA_COMMAND_BLOCK));
|
||||
if (TransferLength == 0) {
|
||||
Acb->AtaCommand = ATA_CMD_TRUST_NON_DATA;
|
||||
Acb->AtaCommand = ATA_CMD_TRUST_NON_DATA;
|
||||
} else {
|
||||
Acb->AtaCommand = mAtaTrustCommands[AtaDevice->UdmaValid][IsTrustSend];
|
||||
Acb->AtaCommand = mAtaTrustCommands[AtaDevice->UdmaValid][IsTrustSend];
|
||||
}
|
||||
Acb->AtaFeatures = SecurityProtocolId;
|
||||
Acb->AtaSectorCount = (UINT8) (TransferLength / 512);
|
||||
Acb->AtaSectorNumber = (UINT8) ((TransferLength / 512) >> 8);
|
||||
|
||||
Acb->AtaFeatures = SecurityProtocolId;
|
||||
Acb->AtaSectorCount = (UINT8)(TransferLength / 512);
|
||||
Acb->AtaSectorNumber = (UINT8)((TransferLength / 512) >> 8);
|
||||
//
|
||||
// NOTE: ATA Spec has no explicitly definition for Security Protocol Specific layout.
|
||||
// Here use big endian for Cylinder register.
|
||||
//
|
||||
Acb->AtaCylinderHigh = (UINT8) SecurityProtocolSpecificData;
|
||||
Acb->AtaCylinderLow = (UINT8) (SecurityProtocolSpecificData >> 8);
|
||||
Acb->AtaDeviceHead = (UINT8) (BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||
Acb->AtaCylinderHigh = (UINT8)SecurityProtocolSpecificData;
|
||||
Acb->AtaCylinderLow = (UINT8)(SecurityProtocolSpecificData >> 8);
|
||||
Acb->AtaDeviceHead = (UINT8)(BIT7 | BIT6 | BIT5 | (AtaDevice->PortMultiplierPort == 0xFFFF ? 0 : (AtaDevice->PortMultiplierPort << 4)));
|
||||
|
||||
//
|
||||
// Prepare for ATA pass through packet.
|
||||
@ -1030,7 +1034,7 @@ TrustTransferAtaDevice (
|
||||
if (TransferLength == 0) {
|
||||
Packet->InTransferLength = 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) {
|
||||
//
|
||||
// Check the alignment of the incoming buffer prior to invoking underlying ATA PassThru
|
||||
@ -1046,22 +1050,25 @@ TrustTransferAtaDevice (
|
||||
FreePool (Buffer);
|
||||
Buffer = NewBuffer;
|
||||
}
|
||||
Packet->OutDataBuffer = Buffer;
|
||||
Packet->OutTransferLength = (UINT32) TransferLength;
|
||||
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
|
||||
|
||||
Packet->OutDataBuffer = Buffer;
|
||||
Packet->OutTransferLength = (UINT32)TransferLength;
|
||||
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
|
||||
} else {
|
||||
Packet->InDataBuffer = Buffer;
|
||||
Packet->InTransferLength = (UINT32) TransferLength;
|
||||
Packet->Protocol = mAtaPassThruCmdProtocols[AtaDevice->UdmaValid][IsTrustSend];
|
||||
Packet->InDataBuffer = Buffer;
|
||||
Packet->InTransferLength = (UINT32)TransferLength;
|
||||
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);
|
||||
if (TransferLengthOut != NULL) {
|
||||
if (! IsTrustSend) {
|
||||
if (!IsTrustSend) {
|
||||
*TransferLengthOut = Packet->InTransferLength;
|
||||
}
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
@ -11,20 +11,19 @@
|
||||
//
|
||||
// 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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
// 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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
@ -37,9 +36,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gAtaBusComponentName
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) AtaBusComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) AtaBusComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gAtaBusComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)AtaBusComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)AtaBusComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
@ -99,7 +98,6 @@ AtaBusComponentNameGetDriverName (
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -171,11 +169,11 @@ AtaBusComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtaBusComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -205,13 +203,14 @@ AtaBusComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the child context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
gAtaBusDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -219,9 +218,11 @@ AtaBusComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
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 (
|
||||
Language,
|
||||
This->SupportedLanguages,
|
||||
|
@ -12,7 +12,7 @@
|
||||
//
|
||||
// EFI_DRIVER_BINDING_PROTOCOL instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {
|
||||
I2cBusDriverSupported,
|
||||
I2cBusDriverStart,
|
||||
I2cBusDriverStop,
|
||||
@ -24,7 +24,7 @@ EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding = {
|
||||
//
|
||||
// Template for I2C Bus Child Device.
|
||||
//
|
||||
I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {
|
||||
I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {
|
||||
I2C_DEVICE_SIGNATURE,
|
||||
NULL,
|
||||
{ // I2cIo Protocol
|
||||
@ -42,13 +42,13 @@ I2C_DEVICE_CONTEXT gI2cDeviceContextTemplate = {
|
||||
//
|
||||
// Template for controller device path node.
|
||||
//
|
||||
CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {
|
||||
CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {
|
||||
{
|
||||
HARDWARE_DEVICE_PATH,
|
||||
HW_CONTROLLER_DP,
|
||||
{
|
||||
(UINT8) (sizeof (CONTROLLER_DEVICE_PATH)),
|
||||
(UINT8) ((sizeof (CONTROLLER_DEVICE_PATH)) >> 8)
|
||||
(UINT8)(sizeof (CONTROLLER_DEVICE_PATH)),
|
||||
(UINT8)((sizeof (CONTROLLER_DEVICE_PATH)) >> 8)
|
||||
}
|
||||
},
|
||||
0
|
||||
@ -57,39 +57,40 @@ CONTROLLER_DEVICE_PATH gControllerDevicePathTemplate = {
|
||||
//
|
||||
// Template for vendor device path node.
|
||||
//
|
||||
VENDOR_DEVICE_PATH gVendorDevicePathTemplate = {
|
||||
VENDOR_DEVICE_PATH gVendorDevicePathTemplate = {
|
||||
{
|
||||
HARDWARE_DEVICE_PATH,
|
||||
HW_VENDOR_DP,
|
||||
{
|
||||
(UINT8) (sizeof (VENDOR_DEVICE_PATH)),
|
||||
(UINT8) ((sizeof (VENDOR_DEVICE_PATH)) >> 8)
|
||||
(UINT8)(sizeof (VENDOR_DEVICE_PATH)),
|
||||
(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
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cBusDriverNameTable[] = {
|
||||
{ "eng;en", (CHAR16 *) L"I2C Bus Driver" },
|
||||
{ NULL , NULL }
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mI2cBusDriverNameTable[] = {
|
||||
{ "eng;en", (CHAR16 *)L"I2C Bus Driver" },
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName = {
|
||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) I2cBusComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) I2cBusComponentNameGetControllerName,
|
||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME)I2cBusComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)I2cBusComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2 = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2 = {
|
||||
I2cBusComponentNameGetDriverName,
|
||||
I2cBusComponentNameGetControllerName,
|
||||
"en"
|
||||
@ -138,8 +139,8 @@ EFI_STATUS
|
||||
EFIAPI
|
||||
I2cBusComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
@ -222,11 +223,11 @@ I2cBusComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cBusComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
@ -254,16 +255,16 @@ CheckRemainingDevicePath (
|
||||
IN UINT32 RemainingControllerNumber
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *SystemDevicePath;
|
||||
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
|
||||
UINTN EntryCount;
|
||||
UINTN Index;
|
||||
BOOLEAN SystemHasControllerNode;
|
||||
UINT32 SystemControllerNumber;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *SystemDevicePath;
|
||||
EFI_OPEN_PROTOCOL_INFORMATION_ENTRY *OpenInfoBuffer;
|
||||
UINTN EntryCount;
|
||||
UINTN Index;
|
||||
BOOLEAN SystemHasControllerNode;
|
||||
UINT32 SystemControllerNumber;
|
||||
|
||||
SystemHasControllerNode = FALSE;
|
||||
SystemControllerNumber = 0;
|
||||
SystemControllerNumber = 0;
|
||||
|
||||
Status = gBS->OpenProtocolInformation (
|
||||
Controller,
|
||||
@ -280,7 +281,7 @@ CheckRemainingDevicePath (
|
||||
Status = gBS->OpenProtocol (
|
||||
OpenInfoBuffer[Index].ControllerHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &SystemDevicePath,
|
||||
(VOID **)&SystemDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -291,7 +292,8 @@ CheckRemainingDevicePath (
|
||||
//
|
||||
while (!IsDevicePathEnd (SystemDevicePath)) {
|
||||
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
|
||||
//
|
||||
@ -301,31 +303,37 @@ CheckRemainingDevicePath (
|
||||
//
|
||||
SystemDevicePath = NextDevicePathNode (SystemDevicePath);
|
||||
if ((DevicePathType (SystemDevicePath) == HARDWARE_DEVICE_PATH) &&
|
||||
(DevicePathSubType (SystemDevicePath) == HW_CONTROLLER_DP)) {
|
||||
(DevicePathSubType (SystemDevicePath) == HW_CONTROLLER_DP))
|
||||
{
|
||||
SystemHasControllerNode = TRUE;
|
||||
SystemControllerNumber = ((CONTROLLER_DEVICE_PATH *) SystemDevicePath)->ControllerNumber;
|
||||
SystemControllerNumber = ((CONTROLLER_DEVICE_PATH *)SystemDevicePath)->ControllerNumber;
|
||||
} else {
|
||||
SystemHasControllerNode = FALSE;
|
||||
SystemControllerNumber = 0;
|
||||
SystemControllerNumber = 0;
|
||||
}
|
||||
|
||||
if (((SystemHasControllerNode) && (!RemainingHasControllerNode) && (SystemControllerNumber == 0)) ||
|
||||
((!SystemHasControllerNode) && (RemainingHasControllerNode) && (RemainingControllerNumber == 0)) ||
|
||||
((SystemHasControllerNode) && (RemainingHasControllerNode) && (SystemControllerNumber == RemainingControllerNumber)) ||
|
||||
((!SystemHasControllerNode) && (!RemainingHasControllerNode))) {
|
||||
DEBUG ((DEBUG_ERROR, "This I2C device has been already started.\n"));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
break;
|
||||
((!SystemHasControllerNode) && (!RemainingHasControllerNode)))
|
||||
{
|
||||
DEBUG ((DEBUG_ERROR, "This I2C device has been already started.\n"));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
SystemDevicePath = NextDevicePathNode (SystemDevicePath);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
FreePool (OpenInfoBuffer);
|
||||
return Status;
|
||||
}
|
||||
@ -380,16 +388,16 @@ I2cBusDriverSupported (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
|
||||
BOOLEAN RemainingHasControllerNode;
|
||||
UINT32 RemainingControllerNumber;
|
||||
EFI_STATUS Status;
|
||||
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
|
||||
BOOLEAN RemainingHasControllerNode;
|
||||
UINT32 RemainingControllerNumber;
|
||||
|
||||
RemainingHasControllerNode = FALSE;
|
||||
RemainingControllerNumber = 0;
|
||||
RemainingControllerNumber = 0;
|
||||
|
||||
//
|
||||
// Determine if the I2c Enumerate Protocol is available
|
||||
@ -397,7 +405,7 @@ I2cBusDriverSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
(VOID **) &I2cEnumerate,
|
||||
(VOID **)&I2cEnumerate,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -408,17 +416,17 @@ I2cBusDriverSupported (
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -430,11 +438,11 @@ I2cBusDriverSupported (
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
if ((RemainingDevicePath != NULL) && !IsDevicePathEnd (RemainingDevicePath)) {
|
||||
@ -442,20 +450,23 @@ I2cBusDriverSupported (
|
||||
// Check if the first node of RemainingDevicePath is a hardware vendor device path
|
||||
//
|
||||
if ((DevicePathType (RemainingDevicePath) != HARDWARE_DEVICE_PATH) ||
|
||||
(DevicePathSubType (RemainingDevicePath) != HW_VENDOR_DP)) {
|
||||
(DevicePathSubType (RemainingDevicePath) != HW_VENDOR_DP))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Check if the second node of RemainingDevicePath is a controller node
|
||||
//
|
||||
DevPathNode = NextDevicePathNode (RemainingDevicePath);
|
||||
if (!IsDevicePathEnd (DevPathNode)) {
|
||||
if ((DevicePathType (DevPathNode) != HARDWARE_DEVICE_PATH) ||
|
||||
(DevicePathSubType (DevPathNode) != HW_CONTROLLER_DP)) {
|
||||
(DevicePathSubType (DevPathNode) != HW_CONTROLLER_DP))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
} else {
|
||||
RemainingHasControllerNode = TRUE;
|
||||
RemainingControllerNumber = ((CONTROLLER_DEVICE_PATH *) DevPathNode)->ControllerNumber;
|
||||
RemainingControllerNumber = ((CONTROLLER_DEVICE_PATH *)DevPathNode)->ControllerNumber;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -466,7 +477,7 @@ I2cBusDriverSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
(VOID **) &I2cHost,
|
||||
(VOID **)&I2cHost,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -474,17 +485,17 @@ I2cBusDriverSupported (
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
if (Status == EFI_ALREADY_STARTED) {
|
||||
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.
|
||||
//
|
||||
@ -549,16 +560,16 @@ I2cBusDriverStart (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
|
||||
I2cBusContext = NULL;
|
||||
ParentDevicePath = NULL;
|
||||
I2cEnumerate = NULL;
|
||||
I2cHost = NULL;
|
||||
I2cBusContext = NULL;
|
||||
ParentDevicePath = NULL;
|
||||
I2cEnumerate = NULL;
|
||||
I2cHost = NULL;
|
||||
|
||||
//
|
||||
// Determine if the I2C controller is available
|
||||
@ -566,7 +577,7 @@ I2cBusDriverStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
(VOID**)&I2cHost,
|
||||
(VOID **)&I2cHost,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -580,7 +591,7 @@ I2cBusDriverStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &I2cBusContext,
|
||||
(VOID **)&I2cBusContext,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -597,7 +608,7 @@ I2cBusDriverStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
(VOID**)&I2cEnumerate,
|
||||
(VOID **)&I2cEnumerate,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -608,13 +619,13 @@ I2cBusDriverStart (
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (EFI_ERROR (Status) && (Status != EFI_ALREADY_STARTED)) {
|
||||
DEBUG ((DEBUG_ERROR, "I2cBus: open device path error, Status = %r\n", Status));
|
||||
goto Error;
|
||||
@ -661,7 +672,7 @@ I2cBusDriverStart (
|
||||
//
|
||||
// Parent controller used to create children
|
||||
//
|
||||
I2cBusContext->Controller = Controller;
|
||||
I2cBusContext->Controller = Controller;
|
||||
//
|
||||
// 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));
|
||||
if (ParentDevicePath != NULL) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
if (I2cHost != NULL) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
if (I2cEnumerate != NULL) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
if (I2cBusContext != NULL) {
|
||||
@ -735,7 +746,6 @@ Error:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Stops a device controller or a bus controller.
|
||||
|
||||
@ -771,60 +781,60 @@ I2cBusDriverStop (
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
EFI_STATUS Status;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
UINTN Index;
|
||||
|
||||
if (NumberOfChildren == 0) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cEnumerateProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &I2cBusContext,
|
||||
(VOID **)&I2cBusContext,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
I2cBusContext,
|
||||
NULL
|
||||
);
|
||||
Controller,
|
||||
&gEfiCallerIdGuid,
|
||||
I2cBusContext,
|
||||
NULL
|
||||
);
|
||||
//
|
||||
// No more child now, free bus context data.
|
||||
//
|
||||
FreePool (I2cBusContext);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
AllChildrenStopped = TRUE;
|
||||
|
||||
for (Index = 0; Index < NumberOfChildren; Index++) {
|
||||
|
||||
Status = UnRegisterI2cDevice (This, Controller, ChildHandleBuffer[Index]);
|
||||
if (EFI_ERROR (Status)) {
|
||||
AllChildrenStopped = FALSE;
|
||||
@ -834,6 +844,7 @@ I2cBusDriverStop (
|
||||
if (!AllChildrenStopped) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
@ -853,22 +864,22 @@ I2cBusDriverStop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
RegisterI2cDevice (
|
||||
IN I2C_BUS_CONTEXT *I2cBusContext,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN I2C_BUS_CONTEXT *I2cBusContext,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
I2C_DEVICE_CONTEXT *I2cDeviceContext;
|
||||
EFI_STATUS Status;
|
||||
CONST EFI_I2C_DEVICE *Device;
|
||||
CONST EFI_I2C_DEVICE *TempDevice;
|
||||
UINT32 RemainingPathDeviceIndex;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
|
||||
BOOLEAN BuildControllerNode;
|
||||
UINTN Count;
|
||||
I2C_DEVICE_CONTEXT *I2cDeviceContext;
|
||||
EFI_STATUS Status;
|
||||
CONST EFI_I2C_DEVICE *Device;
|
||||
CONST EFI_I2C_DEVICE *TempDevice;
|
||||
UINT32 RemainingPathDeviceIndex;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevPathNode;
|
||||
BOOLEAN BuildControllerNode;
|
||||
UINTN Count;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
BuildControllerNode = TRUE;
|
||||
Status = EFI_SUCCESS;
|
||||
BuildControllerNode = TRUE;
|
||||
|
||||
//
|
||||
// Default DeviceIndex
|
||||
@ -884,12 +895,13 @@ RegisterI2cDevice (
|
||||
//
|
||||
DevPathNode = NextDevicePathNode (RemainingDevicePath);
|
||||
if ((DevicePathType (DevPathNode) == HARDWARE_DEVICE_PATH) &&
|
||||
(DevicePathSubType(DevPathNode) == HW_CONTROLLER_DP)) {
|
||||
(DevicePathSubType (DevPathNode) == HW_CONTROLLER_DP))
|
||||
{
|
||||
//
|
||||
// RemainingDevicePath != NULL and RemainingDevicePath contains Controller Node,
|
||||
// add Controller Node to Device Path on child handle.
|
||||
//
|
||||
RemainingPathDeviceIndex = ((CONTROLLER_DEVICE_PATH *) DevPathNode)->ControllerNumber;
|
||||
RemainingPathDeviceIndex = ((CONTROLLER_DEVICE_PATH *)DevPathNode)->ControllerNumber;
|
||||
} else {
|
||||
//
|
||||
// RemainingDevicePath != NULL and RemainingDevicePath does not contain Controller Node,
|
||||
@ -908,12 +920,13 @@ RegisterI2cDevice (
|
||||
// Get the next I2C device
|
||||
//
|
||||
Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &Device);
|
||||
if (EFI_ERROR (Status) || Device == NULL) {
|
||||
if (EFI_ERROR (Status) || (Device == NULL)) {
|
||||
if (RemainingDevicePath != NULL) {
|
||||
Status = EFI_NOT_FOUND;
|
||||
} else {
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
@ -937,14 +950,16 @@ RegisterI2cDevice (
|
||||
// Get the next I2C device
|
||||
//
|
||||
Status = I2cBusContext->I2cEnumerate->Enumerate (I2cBusContext->I2cEnumerate, &TempDevice);
|
||||
if (EFI_ERROR (Status) || TempDevice == NULL) {
|
||||
if (EFI_ERROR (Status) || (TempDevice == NULL)) {
|
||||
Status = EFI_SUCCESS;
|
||||
break;
|
||||
}
|
||||
|
||||
if (CompareGuid (Device->DeviceGuid, TempDevice->DeviceGuid)) {
|
||||
Count++;
|
||||
}
|
||||
}
|
||||
|
||||
if (Count == 1) {
|
||||
//
|
||||
// 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
|
||||
//
|
||||
if ((!CompareGuid (&((VENDOR_DEVICE_PATH *)RemainingDevicePath)->Guid, Device->DeviceGuid)) ||
|
||||
(RemainingPathDeviceIndex != Device->DeviceIndex)) {
|
||||
(RemainingPathDeviceIndex != Device->DeviceIndex))
|
||||
{
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -976,11 +992,11 @@ RegisterI2cDevice (
|
||||
//
|
||||
// Initialize the specific device context
|
||||
//
|
||||
I2cDeviceContext->I2cBusContext = I2cBusContext;
|
||||
I2cDeviceContext->I2cDevice = Device;
|
||||
I2cDeviceContext->I2cIo.DeviceGuid = Device->DeviceGuid;
|
||||
I2cDeviceContext->I2cIo.DeviceIndex = Device->DeviceIndex;
|
||||
I2cDeviceContext->I2cIo.HardwareRevision = Device->HardwareRevision;
|
||||
I2cDeviceContext->I2cBusContext = I2cBusContext;
|
||||
I2cDeviceContext->I2cDevice = Device;
|
||||
I2cDeviceContext->I2cIo.DeviceGuid = Device->DeviceGuid;
|
||||
I2cDeviceContext->I2cIo.DeviceIndex = Device->DeviceIndex;
|
||||
I2cDeviceContext->I2cIo.HardwareRevision = Device->HardwareRevision;
|
||||
I2cDeviceContext->I2cIo.I2cControllerCapabilities = I2cBusContext->I2cHost->I2cControllerCapabilities;
|
||||
|
||||
//
|
||||
@ -996,12 +1012,13 @@ RegisterI2cDevice (
|
||||
// Install the protocol
|
||||
//
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&I2cDeviceContext->Handle,
|
||||
&gEfiI2cIoProtocolGuid,
|
||||
&I2cDeviceContext->I2cIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
I2cDeviceContext->DevicePath,
|
||||
NULL );
|
||||
&I2cDeviceContext->Handle,
|
||||
&gEfiI2cIoProtocolGuid,
|
||||
&I2cDeviceContext->I2cIo,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
I2cDeviceContext->DevicePath,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// Free resources for this I2C device
|
||||
@ -1016,7 +1033,7 @@ RegisterI2cDevice (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
(VOID **) &I2cBusContext->I2cHost,
|
||||
(VOID **)&I2cBusContext->I2cHost,
|
||||
I2cBusContext->DriverBindingHandle,
|
||||
I2cDeviceContext->Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@ -1048,7 +1065,6 @@ RegisterI2cDevice (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Queue an I2C transaction for execution on the I2C device.
|
||||
|
||||
@ -1130,11 +1146,11 @@ I2cBusQueueRequest (
|
||||
OUT EFI_STATUS *I2cStatus OPTIONAL
|
||||
)
|
||||
{
|
||||
CONST EFI_I2C_DEVICE *I2cDevice;
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
CONST EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
I2C_DEVICE_CONTEXT *I2cDeviceContext;
|
||||
EFI_STATUS Status;
|
||||
CONST EFI_I2C_DEVICE *I2cDevice;
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
CONST EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
I2C_DEVICE_CONTEXT *I2cDeviceContext;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (RequestPacket == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -1161,7 +1177,7 @@ I2cBusQueueRequest (
|
||||
Status = I2cHost->QueueRequest (
|
||||
I2cHost,
|
||||
I2cDevice->I2cBusConfiguration,
|
||||
I2cDevice->SlaveAddressArray [SlaveAddressIndex],
|
||||
I2cDevice->SlaveAddressArray[SlaveAddressIndex],
|
||||
Event,
|
||||
RequestPacket,
|
||||
I2cStatus
|
||||
@ -1180,7 +1196,7 @@ I2cBusQueueRequest (
|
||||
**/
|
||||
VOID
|
||||
ReleaseI2cDeviceContext (
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext
|
||||
)
|
||||
{
|
||||
if (I2cDeviceContext == NULL) {
|
||||
@ -1210,22 +1226,22 @@ ReleaseI2cDeviceContext (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnRegisterI2cDevice (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
I2C_DEVICE_CONTEXT *I2cDeviceContext;
|
||||
EFI_I2C_IO_PROTOCOL *I2cIo;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_STATUS Status;
|
||||
I2C_DEVICE_CONTEXT *I2cDeviceContext;
|
||||
EFI_I2C_IO_PROTOCOL *I2cIo;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
|
||||
I2cIo = NULL;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiI2cIoProtocolGuid,
|
||||
(VOID **) &I2cIo,
|
||||
(VOID **)&I2cIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -1267,13 +1283,13 @@ UnRegisterI2cDevice (
|
||||
// Keep parent and child relationship
|
||||
//
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
(VOID **) &I2cHost,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
(VOID **)&I2cHost,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -1299,8 +1315,8 @@ UnRegisterI2cDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
I2cBusDevicePathAppend (
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext,
|
||||
IN BOOLEAN BuildControllerNode
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext,
|
||||
IN BOOLEAN BuildControllerNode
|
||||
)
|
||||
{
|
||||
EFI_DEVICE_PATH_PROTOCOL *PreviousDevicePath;
|
||||
@ -1311,10 +1327,10 @@ I2cBusDevicePathAppend (
|
||||
// Build vendor device path
|
||||
//
|
||||
CopyMem (&gVendorDevicePathTemplate.Guid, I2cDeviceContext->I2cDevice->DeviceGuid, sizeof (EFI_GUID));
|
||||
I2cDeviceContext->DevicePath = AppendDevicePathNode (
|
||||
I2cDeviceContext->I2cBusContext->ParentDevicePath,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *) &gVendorDevicePathTemplate
|
||||
);
|
||||
I2cDeviceContext->DevicePath = AppendDevicePathNode (
|
||||
I2cDeviceContext->I2cBusContext->ParentDevicePath,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *)&gVendorDevicePathTemplate
|
||||
);
|
||||
ASSERT (I2cDeviceContext->DevicePath != NULL);
|
||||
if (I2cDeviceContext->DevicePath == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -1324,12 +1340,12 @@ I2cBusDevicePathAppend (
|
||||
//
|
||||
// Build the final I2C device path with controller node
|
||||
//
|
||||
PreviousDevicePath = I2cDeviceContext->DevicePath;
|
||||
PreviousDevicePath = I2cDeviceContext->DevicePath;
|
||||
gControllerDevicePathTemplate.ControllerNumber = I2cDeviceContext->I2cDevice->DeviceIndex;
|
||||
I2cDeviceContext->DevicePath = AppendDevicePathNode (
|
||||
I2cDeviceContext->DevicePath,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *) &gControllerDevicePathTemplate
|
||||
);
|
||||
I2cDeviceContext->DevicePath = AppendDevicePathNode (
|
||||
I2cDeviceContext->DevicePath,
|
||||
(EFI_DEVICE_PATH_PROTOCOL *)&gControllerDevicePathTemplate
|
||||
);
|
||||
gBS->FreePool (PreviousDevicePath);
|
||||
ASSERT (I2cDeviceContext->DevicePath != NULL);
|
||||
if (I2cDeviceContext->DevicePath == NULL) {
|
||||
@ -1353,12 +1369,12 @@ I2cBusDevicePathAppend (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeI2cBus(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializeI2cBus (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
@ -1373,7 +1389,6 @@ InitializeI2cBus(
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -1392,15 +1407,15 @@ InitializeI2cBus(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cBusUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
|
||||
//
|
||||
// Get the list of all I2C Controller handles in the handle database.
|
||||
@ -1455,7 +1470,7 @@ I2cBusUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
gI2cBusDriverBinding.DriverBindingHandle,
|
||||
&gEfiComponentNameProtocolGuid,
|
||||
(VOID **) &ComponentName
|
||||
(VOID **)&ComponentName
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
@ -1468,7 +1483,7 @@ I2cBusUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
gI2cBusDriverBinding.DriverBindingHandle,
|
||||
&gEfiComponentName2ProtocolGuid,
|
||||
(VOID **) &ComponentName2
|
||||
(VOID **)&ComponentName2
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
|
@ -20,21 +20,21 @@
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeI2c(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializeI2c (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
//
|
||||
Status = InitializeI2cHost ( ImageHandle, SystemTable );
|
||||
if ( !EFI_ERROR ( Status ))
|
||||
{
|
||||
Status = InitializeI2cBus ( ImageHandle, SystemTable );
|
||||
Status = InitializeI2cHost (ImageHandle, SystemTable);
|
||||
if ( !EFI_ERROR (Status)) {
|
||||
Status = InitializeI2cBus (ImageHandle, SystemTable);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -53,17 +53,18 @@ InitializeI2c(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Disconnect the drivers
|
||||
//
|
||||
Status = I2cBusUnload ( ImageHandle );
|
||||
if ( !EFI_ERROR ( Status )) {
|
||||
Status = I2cHostUnload ( ImageHandle );
|
||||
Status = I2cBusUnload (ImageHandle);
|
||||
if ( !EFI_ERROR (Status)) {
|
||||
Status = I2cHostUnload (ImageHandle);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
@ -30,24 +30,24 @@
|
||||
#include <Protocol/I2cBusConfigurationManagement.h>
|
||||
#include <Protocol/LoadedImage.h>
|
||||
|
||||
#define I2C_DEVICE_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'D')
|
||||
#define I2C_HOST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'H')
|
||||
#define I2C_REQUEST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'R')
|
||||
#define I2C_DEVICE_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'D')
|
||||
#define I2C_HOST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'H')
|
||||
#define I2C_REQUEST_SIGNATURE SIGNATURE_32 ('I', '2', 'C', 'R')
|
||||
|
||||
//
|
||||
// Synchronize access to the list of requests
|
||||
//
|
||||
#define TPL_I2C_SYNC TPL_NOTIFY
|
||||
#define TPL_I2C_SYNC TPL_NOTIFY
|
||||
|
||||
//
|
||||
// I2C bus context
|
||||
//
|
||||
typedef struct {
|
||||
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
EFI_I2C_ENUMERATE_PROTOCOL *I2cEnumerate;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_HANDLE Controller;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
} I2C_BUS_CONTEXT;
|
||||
|
||||
//
|
||||
@ -57,36 +57,36 @@ typedef struct {
|
||||
//
|
||||
// Structure identification
|
||||
//
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
//
|
||||
// I2c device handle
|
||||
//
|
||||
EFI_HANDLE Handle;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
//
|
||||
// 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
|
||||
//
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
|
||||
//
|
||||
// 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
|
||||
// lower level API to the host controller.
|
||||
//
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
I2C_BUS_CONTEXT *I2cBusContext;
|
||||
} 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
|
||||
@ -95,41 +95,41 @@ typedef struct {
|
||||
//
|
||||
// Signature
|
||||
//
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
//
|
||||
// Next request in the pending request list
|
||||
//
|
||||
LIST_ENTRY Link;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
//
|
||||
// I2C bus configuration for the operation
|
||||
//
|
||||
UINTN I2cBusConfiguration;
|
||||
UINTN I2cBusConfiguration;
|
||||
|
||||
//
|
||||
// I2C slave address for the operation
|
||||
//
|
||||
UINTN SlaveAddress;
|
||||
UINTN SlaveAddress;
|
||||
|
||||
//
|
||||
// Event to set for asynchronous operations, NULL for
|
||||
// synchronous operations
|
||||
//
|
||||
EFI_EVENT Event;
|
||||
EFI_EVENT Event;
|
||||
|
||||
//
|
||||
// I2C operation description
|
||||
//
|
||||
EFI_I2C_REQUEST_PACKET *RequestPacket;
|
||||
EFI_I2C_REQUEST_PACKET *RequestPacket;
|
||||
|
||||
//
|
||||
// Optional buffer to receive the I2C operation completion status
|
||||
//
|
||||
EFI_STATUS *Status;
|
||||
EFI_STATUS *Status;
|
||||
} 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
|
||||
@ -138,66 +138,66 @@ typedef struct {
|
||||
//
|
||||
// Structure identification
|
||||
//
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
//
|
||||
// Current I2C bus configuration
|
||||
//
|
||||
UINTN I2cBusConfiguration;
|
||||
UINTN I2cBusConfiguration;
|
||||
|
||||
//
|
||||
// I2C bus configuration management event
|
||||
//
|
||||
EFI_EVENT I2cBusConfigurationEvent;
|
||||
EFI_EVENT I2cBusConfigurationEvent;
|
||||
|
||||
//
|
||||
// I2C operation completion event
|
||||
//
|
||||
EFI_EVENT I2cEvent;
|
||||
EFI_EVENT I2cEvent;
|
||||
|
||||
//
|
||||
// I2C operation and I2C bus configuration management status
|
||||
//
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// I2C bus configuration management operation pending
|
||||
//
|
||||
BOOLEAN I2cBusConfigurationManagementPending;
|
||||
BOOLEAN I2cBusConfigurationManagementPending;
|
||||
|
||||
//
|
||||
// I2C request list maintained by I2C Host
|
||||
//
|
||||
LIST_ENTRY RequestList;
|
||||
LIST_ENTRY RequestList;
|
||||
|
||||
//
|
||||
// Upper level API
|
||||
//
|
||||
EFI_I2C_HOST_PROTOCOL I2cHost;
|
||||
EFI_I2C_HOST_PROTOCOL I2cHost;
|
||||
|
||||
//
|
||||
// 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)
|
||||
//
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
} 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
|
||||
//
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gI2cBusComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gI2cBusComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gI2cBusDriverBinding;
|
||||
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding;
|
||||
|
||||
/**
|
||||
Start the I2C driver
|
||||
@ -217,7 +217,7 @@ extern EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding;
|
||||
EFI_STATUS
|
||||
RegisterI2cDevice (
|
||||
IN I2C_BUS_CONTEXT *I2cBus,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
@ -237,9 +237,9 @@ RegisterI2cDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnRegisterI2cDevice (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -256,8 +256,8 @@ UnRegisterI2cDevice (
|
||||
**/
|
||||
EFI_STATUS
|
||||
I2cBusDevicePathAppend (
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext,
|
||||
IN BOOLEAN BuildControllerNode
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext,
|
||||
IN BOOLEAN BuildControllerNode
|
||||
);
|
||||
|
||||
/**
|
||||
@ -514,9 +514,9 @@ I2cBusDriverStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cBusComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -590,11 +590,11 @@ I2cBusComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cBusComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -610,9 +610,9 @@ I2cBusComponentNameGetControllerName (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeI2cBus(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializeI2cBus (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
);
|
||||
|
||||
/**
|
||||
@ -630,7 +630,7 @@ InitializeI2cBus(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cBusUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
);
|
||||
|
||||
/**
|
||||
@ -643,7 +643,7 @@ I2cBusUnload (
|
||||
**/
|
||||
VOID
|
||||
ReleaseI2cDeviceContext (
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext
|
||||
IN I2C_DEVICE_CONTEXT *I2cDeviceContext
|
||||
);
|
||||
|
||||
/**
|
||||
@ -657,8 +657,8 @@ ReleaseI2cDeviceContext (
|
||||
**/
|
||||
EFI_STATUS
|
||||
I2cHostRequestComplete (
|
||||
I2C_HOST_CONTEXT *I2cHost,
|
||||
EFI_STATUS Status
|
||||
I2C_HOST_CONTEXT *I2cHost,
|
||||
EFI_STATUS Status
|
||||
);
|
||||
|
||||
/**
|
||||
@ -688,7 +688,7 @@ I2cHostRequestComplete (
|
||||
**/
|
||||
EFI_STATUS
|
||||
I2cHostRequestEnable (
|
||||
I2C_HOST_CONTEXT *I2cHost
|
||||
I2C_HOST_CONTEXT *I2cHost
|
||||
);
|
||||
|
||||
/**
|
||||
@ -779,9 +779,9 @@ I2cHostDriverSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostDriverStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -813,10 +813,10 @@ I2cHostDriverStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostDriverStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -861,9 +861,9 @@ I2cHostDriverStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -937,11 +937,11 @@ I2cHostComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -956,8 +956,8 @@ I2cHostComponentNameGetControllerName (
|
||||
VOID
|
||||
EFIAPI
|
||||
I2cHostRequestCompleteEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -972,8 +972,8 @@ I2cHostRequestCompleteEvent (
|
||||
VOID
|
||||
EFIAPI
|
||||
I2cHostI2cBusConfigurationAvailable (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1065,9 +1065,9 @@ I2cHostQueueRequest (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeI2cHost(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializeI2cHost (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
);
|
||||
|
||||
/**
|
||||
@ -1085,7 +1085,7 @@ InitializeI2cHost(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
);
|
||||
|
||||
#endif // __I2C_DXE_H__
|
||||
#endif // __I2C_DXE_H__
|
||||
|
@ -10,7 +10,7 @@
|
||||
|
||||
#include "I2cDxe.h"
|
||||
|
||||
EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {
|
||||
I2cHostDriverSupported,
|
||||
I2cHostDriverStart,
|
||||
I2cHostDriverStop,
|
||||
@ -22,24 +22,24 @@ EFI_DRIVER_BINDING_PROTOCOL gI2cHostDriverBinding = {
|
||||
//
|
||||
// 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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gI2cHostComponentName = {
|
||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME) I2cHostComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME) I2cHostComponentNameGetControllerName,
|
||||
(EFI_COMPONENT_NAME_GET_DRIVER_NAME)I2cHostComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME_GET_CONTROLLER_NAME)I2cHostComponentNameGetControllerName,
|
||||
"eng"
|
||||
};
|
||||
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2 = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gI2cHostComponentName2 = {
|
||||
I2cHostComponentNameGetDriverName,
|
||||
I2cHostComponentNameGetControllerName,
|
||||
"en"
|
||||
@ -88,8 +88,8 @@ EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
@ -172,11 +172,11 @@ I2cHostComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME2_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
@ -232,9 +232,9 @@ I2cHostDriverSupported (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
|
||||
EFI_STATUS Status;
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Locate I2C Bus Configuration Management Protocol
|
||||
@ -255,11 +255,11 @@ I2cHostDriverSupported (
|
||||
// Close the protocol because we don't use it here
|
||||
//
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cBusConfigurationManagementProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cBusConfigurationManagementProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
//
|
||||
// Locate I2C Master Protocol
|
||||
@ -317,15 +317,15 @@ I2cHostDriverSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostDriverStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
EFI_STATUS Status;
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
|
||||
I2cMaster = NULL;
|
||||
I2cHostContext = NULL;
|
||||
@ -379,8 +379,8 @@ I2cHostDriverStart (
|
||||
I2cHostContext->Signature = I2C_HOST_SIGNATURE;
|
||||
I2cHostContext->I2cMaster = I2cMaster;
|
||||
I2cHostContext->I2cBusConfigurationManagement = I2cBusConfigurationManagement;
|
||||
I2cHostContext->I2cBusConfiguration = (UINTN) -1;
|
||||
InitializeListHead(&I2cHostContext->RequestList);
|
||||
I2cHostContext->I2cBusConfiguration = (UINTN)-1;
|
||||
InitializeListHead (&I2cHostContext->RequestList);
|
||||
|
||||
//
|
||||
// Reset the controller
|
||||
@ -441,11 +441,11 @@ Exit:
|
||||
DEBUG ((DEBUG_ERROR, "I2cHost: Start() function failed, Status = %r\n", Status));
|
||||
if (I2cBusConfigurationManagement != NULL) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiI2cBusConfigurationManagementProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiI2cBusConfigurationManagementProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
if ((I2cHostContext != NULL) && (I2cHostContext->I2cEvent != NULL)) {
|
||||
@ -501,16 +501,16 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostDriverStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_TPL TplPrevious;
|
||||
EFI_STATUS Status;
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
EFI_I2C_HOST_PROTOCOL *I2cHost;
|
||||
EFI_TPL TplPrevious;
|
||||
|
||||
TplPrevious = EfiGetCurrentTpl ();
|
||||
if (TplPrevious > TPL_I2C_SYNC) {
|
||||
@ -521,7 +521,7 @@ I2cHostDriverStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiI2cHostProtocolGuid,
|
||||
(VOID **) &I2cHost,
|
||||
(VOID **)&I2cHost,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -542,9 +542,9 @@ I2cHostDriverStop (
|
||||
// If there is pending request or pending bus configuration, do not stop
|
||||
//
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
if (( !I2cHostContext->I2cBusConfigurationManagementPending )
|
||||
&& IsListEmpty (&I2cHostContext->RequestList)) {
|
||||
|
||||
if ( (!I2cHostContext->I2cBusConfigurationManagementPending)
|
||||
&& IsListEmpty (&I2cHostContext->RequestList))
|
||||
{
|
||||
//
|
||||
// Remove the I2C host protocol
|
||||
//
|
||||
@ -602,16 +602,16 @@ I2cHostDriverStop (
|
||||
VOID
|
||||
EFIAPI
|
||||
I2cHostI2cBusConfigurationAvailable (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
I2C_REQUEST *I2cRequest;
|
||||
LIST_ENTRY *EntryHeader;
|
||||
LIST_ENTRY *Entry;
|
||||
EFI_STATUS Status;
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
EFI_I2C_MASTER_PROTOCOL *I2cMaster;
|
||||
I2C_REQUEST *I2cRequest;
|
||||
LIST_ENTRY *EntryHeader;
|
||||
LIST_ENTRY *Entry;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Mark this I2C bus configuration management operation as complete
|
||||
@ -637,7 +637,7 @@ I2cHostI2cBusConfigurationAvailable (
|
||||
// Unknown 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
|
||||
@ -649,8 +649,8 @@ I2cHostI2cBusConfigurationAvailable (
|
||||
// Get the first request in the link with FIFO order
|
||||
//
|
||||
EntryHeader = &I2cHostContext->RequestList;
|
||||
Entry = GetFirstNode (EntryHeader);
|
||||
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
|
||||
Entry = GetFirstNode (EntryHeader);
|
||||
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
|
||||
|
||||
//
|
||||
// Update the I2C bus configuration of the current I2C request
|
||||
@ -669,7 +669,7 @@ I2cHostI2cBusConfigurationAvailable (
|
||||
);
|
||||
|
||||
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
|
||||
I2cHostRequestComplete (
|
||||
I2C_HOST_CONTEXT *I2cHostContext,
|
||||
EFI_STATUS Status
|
||||
I2C_HOST_CONTEXT *I2cHostContext,
|
||||
EFI_STATUS Status
|
||||
)
|
||||
{
|
||||
I2C_REQUEST *I2cRequest;
|
||||
LIST_ENTRY *EntryHeader;
|
||||
LIST_ENTRY *Entry;
|
||||
I2C_REQUEST *I2cRequest;
|
||||
LIST_ENTRY *EntryHeader;
|
||||
LIST_ENTRY *Entry;
|
||||
|
||||
//
|
||||
// Remove the current I2C request from the list
|
||||
//
|
||||
EntryHeader = &I2cHostContext->RequestList;
|
||||
Entry = GetFirstNode (EntryHeader);
|
||||
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
|
||||
Entry = GetFirstNode (EntryHeader);
|
||||
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
|
||||
|
||||
//
|
||||
// Save the status for QueueRequest
|
||||
@ -725,7 +725,7 @@ I2cHostRequestComplete (
|
||||
//
|
||||
// If there is more I2C request, start next one
|
||||
//
|
||||
if(!IsListEmpty (EntryHeader)) {
|
||||
if (!IsListEmpty (EntryHeader)) {
|
||||
I2cHostRequestEnable (I2cHostContext);
|
||||
}
|
||||
|
||||
@ -744,11 +744,11 @@ I2cHostRequestComplete (
|
||||
VOID
|
||||
EFIAPI
|
||||
I2cHostRequestCompleteEvent (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
I2C_HOST_CONTEXT *I2cHostContext;
|
||||
|
||||
//
|
||||
// Handle the completion event
|
||||
@ -784,16 +784,16 @@ I2cHostRequestCompleteEvent (
|
||||
**/
|
||||
EFI_STATUS
|
||||
I2cHostRequestEnable (
|
||||
I2C_HOST_CONTEXT *I2cHostContext
|
||||
I2C_HOST_CONTEXT *I2cHostContext
|
||||
)
|
||||
{
|
||||
UINTN I2cBusConfiguration;
|
||||
CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
|
||||
I2C_REQUEST *I2cRequest;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL TplPrevious;
|
||||
LIST_ENTRY *EntryHeader;
|
||||
LIST_ENTRY *Entry;
|
||||
UINTN I2cBusConfiguration;
|
||||
CONST EFI_I2C_BUS_CONFIGURATION_MANAGEMENT_PROTOCOL *I2cBusConfigurationManagement;
|
||||
I2C_REQUEST *I2cRequest;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL TplPrevious;
|
||||
LIST_ENTRY *EntryHeader;
|
||||
LIST_ENTRY *Entry;
|
||||
|
||||
//
|
||||
// Assume pending request
|
||||
@ -807,7 +807,7 @@ I2cHostRequestEnable (
|
||||
//
|
||||
EntryHeader = &I2cHostContext->RequestList;
|
||||
Entry = GetFirstNode (EntryHeader);
|
||||
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
|
||||
I2cRequest = I2C_REQUEST_FROM_ENTRY (Entry);
|
||||
|
||||
I2cBusConfiguration = I2cRequest->I2cBusConfiguration;
|
||||
|
||||
@ -820,16 +820,16 @@ I2cHostRequestEnable (
|
||||
// Update bus configuration for this device's requesting bus configuration
|
||||
//
|
||||
Status = I2cBusConfigurationManagement->EnableI2cBusConfiguration (
|
||||
I2cBusConfigurationManagement,
|
||||
I2cBusConfiguration,
|
||||
I2cHostContext->I2cBusConfigurationEvent,
|
||||
&I2cHostContext->Status
|
||||
);
|
||||
I2cBusConfigurationManagement,
|
||||
I2cBusConfiguration,
|
||||
I2cHostContext->I2cBusConfigurationEvent,
|
||||
&I2cHostContext->Status
|
||||
);
|
||||
} else {
|
||||
//
|
||||
// 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
|
||||
@ -840,8 +840,9 @@ I2cHostRequestEnable (
|
||||
//
|
||||
// Release the thread synchronization
|
||||
//
|
||||
gBS->RestoreTPL ( TplPrevious );
|
||||
gBS->RestoreTPL (TplPrevious);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -965,12 +966,12 @@ I2cHostQueueRequest (
|
||||
// For synchronous transaction, register an event used to wait for finishing synchronous transaction
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
0,
|
||||
TPL_I2C_SYNC,
|
||||
NULL,
|
||||
NULL,
|
||||
&SyncEvent
|
||||
);
|
||||
0,
|
||||
TPL_I2C_SYNC,
|
||||
NULL,
|
||||
NULL,
|
||||
&SyncEvent
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -1007,7 +1008,7 @@ I2cHostQueueRequest (
|
||||
//
|
||||
// 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);
|
||||
ASSERT (I2cRequest->RequestPacket != NULL);
|
||||
CopyMem (I2cRequest->RequestPacket, RequestPacket, RequestPacketSize);
|
||||
@ -1015,7 +1016,7 @@ I2cHostQueueRequest (
|
||||
//
|
||||
// Synchronize with the other threads
|
||||
//
|
||||
gBS->RaiseTPL ( TPL_I2C_SYNC );
|
||||
gBS->RaiseTPL (TPL_I2C_SYNC);
|
||||
|
||||
FirstRequest = IsListEmpty (&I2cHostContext->RequestList);
|
||||
|
||||
@ -1085,12 +1086,12 @@ I2cHostQueueRequest (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializeI2cHost(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializeI2cHost (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
@ -1122,15 +1123,15 @@ InitializeI2cHost(
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
I2cHostUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
|
||||
//
|
||||
// Get the list of all I2C Controller handles in the handle database.
|
||||
@ -1185,7 +1186,7 @@ I2cHostUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
gI2cHostDriverBinding.DriverBindingHandle,
|
||||
&gEfiComponentNameProtocolGuid,
|
||||
(VOID **) &ComponentName
|
||||
(VOID **)&ComponentName
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
@ -1198,7 +1199,7 @@ I2cHostUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
gI2cHostDriverBinding.DriverBindingHandle,
|
||||
&gEfiComponentName2ProtocolGuid,
|
||||
(VOID **) &ComponentName2
|
||||
(VOID **)&ComponentName2
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
|
@ -12,9 +12,9 @@
|
||||
//
|
||||
// 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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
//
|
||||
@ -29,9 +29,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gIsaBusComponentName
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) IsaBusComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) IsaBusComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)IsaBusComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)IsaBusComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
@ -91,7 +91,6 @@ IsaBusComponentNameGetDriverName (
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -163,11 +162,11 @@ IsaBusComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IsaBusComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
|
@ -13,8 +13,8 @@
|
||||
#include <Protocol/ComponentName.h>
|
||||
#include <Protocol/ComponentName2.h>
|
||||
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gIsaBusComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gIsaBusComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gIsaBusComponentName2;
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
@ -63,7 +63,6 @@ IsaBusComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -135,11 +134,11 @@ IsaBusComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IsaBusComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -43,13 +43,13 @@
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IsaBusDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
VOID *Instance;
|
||||
EFI_STATUS Status;
|
||||
VOID *Instance;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
@ -61,11 +61,11 @@ IsaBusDriverBindingSupported (
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -82,17 +82,17 @@ IsaBusDriverBindingSupported (
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
ISA_BUS_CHILD_PRIVATE_DATA mIsaBusChildPrivateTemplate = {
|
||||
ISA_BUS_CHILD_PRIVATE_DATA mIsaBusChildPrivateTemplate = {
|
||||
ISA_BUS_CHILD_PRIVATE_DATA_SIGNATURE,
|
||||
FALSE
|
||||
};
|
||||
@ -123,10 +123,10 @@ IsaBusCreateChild (
|
||||
IN OUT EFI_HANDLE *ChildHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
EFI_ISA_HC_PROTOCOL *IsaHc;
|
||||
ISA_BUS_CHILD_PRIVATE_DATA *Child;
|
||||
EFI_STATUS Status;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
EFI_ISA_HC_PROTOCOL *IsaHc;
|
||||
ISA_BUS_CHILD_PRIVATE_DATA *Child;
|
||||
|
||||
Private = ISA_BUS_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
@ -137,8 +137,10 @@ IsaBusCreateChild (
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
ChildHandle,
|
||||
&gEfiIsaHcProtocolGuid, Private->IsaHc,
|
||||
&gEfiCallerIdGuid, Child,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
Private->IsaHc,
|
||||
&gEfiCallerIdGuid,
|
||||
Child,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -149,7 +151,7 @@ IsaBusCreateChild (
|
||||
return gBS->OpenProtocol (
|
||||
Private->IsaHcHandle,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
(VOID **) &IsaHc,
|
||||
(VOID **)&IsaHc,
|
||||
gIsaBusDriverBinding.DriverBindingHandle,
|
||||
*ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@ -177,21 +179,21 @@ IsaBusCreateChild (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IsaBusDestroyChild (
|
||||
IN EFI_SERVICE_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ChildHandle
|
||||
IN EFI_SERVICE_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE ChildHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
EFI_ISA_HC_PROTOCOL *IsaHc;
|
||||
ISA_BUS_CHILD_PRIVATE_DATA *Child;
|
||||
EFI_STATUS Status;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
EFI_ISA_HC_PROTOCOL *IsaHc;
|
||||
ISA_BUS_CHILD_PRIVATE_DATA *Child;
|
||||
|
||||
Private = ISA_BUS_PRIVATE_DATA_FROM_THIS (This);
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiCallerIdGuid,
|
||||
(VOID **) &Child,
|
||||
(VOID **)&Child,
|
||||
gIsaBusDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -207,25 +209,27 @@ IsaBusDestroyChild (
|
||||
}
|
||||
|
||||
Child->InDestroying = TRUE;
|
||||
Status = gBS->CloseProtocol (
|
||||
Private->IsaHcHandle,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
gIsaBusDriverBinding.DriverBindingHandle,
|
||||
ChildHandle
|
||||
);
|
||||
Status = gBS->CloseProtocol (
|
||||
Private->IsaHcHandle,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
gIsaBusDriverBinding.DriverBindingHandle,
|
||||
ChildHandle
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
ChildHandle,
|
||||
&gEfiIsaHcProtocolGuid, Private->IsaHc,
|
||||
&gEfiCallerIdGuid, Child,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
Private->IsaHc,
|
||||
&gEfiCallerIdGuid,
|
||||
Child,
|
||||
NULL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->OpenProtocol (
|
||||
Private->IsaHcHandle,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
(VOID **) &IsaHc,
|
||||
(VOID **)&IsaHc,
|
||||
gIsaBusDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@ -242,7 +246,7 @@ IsaBusDestroyChild (
|
||||
return Status;
|
||||
}
|
||||
|
||||
ISA_BUS_PRIVATE_DATA mIsaBusPrivateTemplate = {
|
||||
ISA_BUS_PRIVATE_DATA mIsaBusPrivateTemplate = {
|
||||
ISA_BUS_PRIVATE_DATA_SIGNATURE,
|
||||
{
|
||||
IsaBusCreateChild,
|
||||
@ -278,19 +282,19 @@ ISA_BUS_PRIVATE_DATA mIsaBusPrivateTemplate = {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IsaBusDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
EFI_STATUS Status;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiIsaHcProtocolGuid,
|
||||
(VOID **) &mIsaBusPrivateTemplate.IsaHc,
|
||||
(VOID **)&mIsaBusPrivateTemplate.IsaHc,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -302,7 +306,7 @@ IsaBusDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
(VOID **)&DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -324,7 +328,8 @@ IsaBusDriverBindingStart (
|
||||
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&Controller,
|
||||
&gEfiIsaHcServiceBindingProtocolGuid, &Private->ServiceBinding,
|
||||
&gEfiIsaHcServiceBindingProtocolGuid,
|
||||
&Private->ServiceBinding,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
@ -350,22 +355,22 @@ IsaBusDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IsaBusDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
UINTN Index;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
EFI_STATUS Status;
|
||||
EFI_SERVICE_BINDING_PROTOCOL *ServiceBinding;
|
||||
ISA_BUS_PRIVATE_DATA *Private;
|
||||
UINTN Index;
|
||||
BOOLEAN AllChildrenStopped;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiIsaHcServiceBindingProtocolGuid,
|
||||
(VOID **) &ServiceBinding,
|
||||
(VOID **)&ServiceBinding,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -379,7 +384,8 @@ IsaBusDriverBindingStop (
|
||||
if (NumberOfChildren == 0) {
|
||||
Status = gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiIsaHcServiceBindingProtocolGuid, &Private->ServiceBinding,
|
||||
&gEfiIsaHcServiceBindingProtocolGuid,
|
||||
&Private->ServiceBinding,
|
||||
NULL
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
@ -415,7 +421,7 @@ IsaBusDriverBindingStop (
|
||||
//
|
||||
// ISA Bus Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gIsaBusDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gIsaBusDriverBinding = {
|
||||
IsaBusDriverBindingSupported,
|
||||
IsaBusDriverBindingStart,
|
||||
IsaBusDriverBindingStop,
|
||||
@ -440,7 +446,7 @@ InitializeIsaBus (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
|
@ -26,15 +26,15 @@ typedef struct {
|
||||
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
|
||||
} ISA_BUS_PRIVATE_DATA;
|
||||
#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_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)
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
BOOLEAN InDestroying; ///< Flag to avoid DestroyChild() re-entry.
|
||||
UINT32 Signature;
|
||||
BOOLEAN InDestroying; ///< Flag to avoid DestroyChild() re-entry.
|
||||
} 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
|
||||
|
@ -11,6 +11,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
// EFI Component Name Functions
|
||||
//
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@ -58,7 +59,6 @@ Ps2KeyboardComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -130,14 +130,13 @@ Ps2KeyboardComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ps2KeyboardComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
@ -150,14 +149,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPs2KeyboardComponent
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2KeyboardComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ps2KeyboardComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ps2KeyboardComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2KeyboardComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)Ps2KeyboardComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)Ps2KeyboardComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2KeyboardDriverNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2KeyboardDriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"PS/2 Keyboard Driver"
|
||||
@ -295,16 +293,17 @@ Ps2KeyboardComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ps2KeyboardComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
|
||||
//
|
||||
// This is a device driver, so ChildHandle must be NULL.
|
||||
//
|
||||
@ -319,13 +318,14 @@ Ps2KeyboardComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the device context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiSimpleTextInProtocolGuid,
|
||||
(VOID **) &ConIn,
|
||||
(VOID **)&ConIn,
|
||||
gKeyboardControllerDriver.DriverBindingHandle,
|
||||
ControllerHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -7,7 +7,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Ps2Keyboard.h"
|
||||
|
||||
/**
|
||||
@ -20,10 +19,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
BOOLEAN
|
||||
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
|
||||
PopEfikeyBufHead (
|
||||
IN EFI_KEY_QUEUE *Queue,
|
||||
OUT EFI_KEY_DATA *KeyData OPTIONAL
|
||||
IN EFI_KEY_QUEUE *Queue,
|
||||
OUT EFI_KEY_DATA *KeyData OPTIONAL
|
||||
)
|
||||
{
|
||||
if (IsEfikeyBufEmpty (Queue)) {
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
|
||||
//
|
||||
// Retrieve and remove the values
|
||||
//
|
||||
if (KeyData != NULL) {
|
||||
CopyMem (KeyData, &Queue->Buffer[Queue->Head], sizeof (EFI_KEY_DATA));
|
||||
}
|
||||
|
||||
Queue->Head = (Queue->Head + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -62,8 +63,8 @@ PopEfikeyBufHead (
|
||||
**/
|
||||
VOID
|
||||
PushEfikeyBufTail (
|
||||
IN EFI_KEY_QUEUE *Queue,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
IN EFI_KEY_QUEUE *Queue,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
)
|
||||
{
|
||||
if ((Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT == Queue->Head) {
|
||||
@ -72,6 +73,7 @@ PushEfikeyBufTail (
|
||||
//
|
||||
PopEfikeyBufHead (Queue, NULL);
|
||||
}
|
||||
|
||||
CopyMem (&Queue->Buffer[Queue->Tail], KeyData, sizeof (EFI_KEY_DATA));
|
||||
Queue->Tail = (Queue->Tail + 1) % KEYBOARD_EFI_KEY_MAX_COUNT;
|
||||
}
|
||||
@ -98,24 +100,27 @@ IsKeyRegistered (
|
||||
ASSERT (RegsiteredData != NULL && InputData != NULL);
|
||||
|
||||
if ((RegsiteredData->Key.ScanCode != InputData->Key.ScanCode) ||
|
||||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar)) {
|
||||
(RegsiteredData->Key.UnicodeChar != InputData->Key.UnicodeChar))
|
||||
{
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
//
|
||||
// Assume KeyShiftState/KeyToggleState = 0 in Registered key data means these state could be ignored.
|
||||
//
|
||||
if (RegsiteredData->KeyState.KeyShiftState != 0 &&
|
||||
RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState) {
|
||||
if ((RegsiteredData->KeyState.KeyShiftState != 0) &&
|
||||
(RegsiteredData->KeyState.KeyShiftState != InputData->KeyState.KeyShiftState))
|
||||
{
|
||||
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 TRUE;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -136,13 +141,13 @@ IsKeyRegistered (
|
||||
**/
|
||||
EFI_STATUS
|
||||
KeyboardReadKeyStrokeWorker (
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
)
|
||||
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (KeyData == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -185,9 +190,9 @@ KeyboardEfiReset (
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);
|
||||
if (ConsoleIn->KeyboardErr) {
|
||||
@ -232,6 +237,7 @@ KeyboardEfiReset (
|
||||
ConsoleIn->DevicePath
|
||||
);
|
||||
}
|
||||
|
||||
//
|
||||
// Report the status If keyboard is locked
|
||||
//
|
||||
@ -261,9 +267,9 @@ KeyboardReadKeyStroke (
|
||||
OUT EFI_INPUT_KEY *Key
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_KEY_DATA KeyData;
|
||||
|
||||
ConsoleIn = KEYBOARD_CONSOLE_IN_DEV_FROM_THIS (This);
|
||||
|
||||
@ -280,21 +286,23 @@ KeyboardReadKeyStroke (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
||||
//
|
||||
// Translate the CTRL-Alpha characters to their corresponding control value
|
||||
// (ctrl-a = 0x0001 through ctrl-Z = 0x001A)
|
||||
//
|
||||
if ((KeyData.KeyState.KeyShiftState & (EFI_LEFT_CONTROL_PRESSED | EFI_RIGHT_CONTROL_PRESSED)) != 0) {
|
||||
if (KeyData.Key.UnicodeChar >= L'a' && KeyData.Key.UnicodeChar <= L'z') {
|
||||
KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'a' + 1);
|
||||
} else if (KeyData.Key.UnicodeChar >= L'A' && KeyData.Key.UnicodeChar <= L'Z') {
|
||||
KeyData.Key.UnicodeChar = (CHAR16) (KeyData.Key.UnicodeChar - L'A' + 1);
|
||||
if ((KeyData.Key.UnicodeChar >= L'a') && (KeyData.Key.UnicodeChar <= L'z')) {
|
||||
KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'a' + 1);
|
||||
} else if ((KeyData.Key.UnicodeChar >= L'A') && (KeyData.Key.UnicodeChar <= L'Z')) {
|
||||
KeyData.Key.UnicodeChar = (CHAR16)(KeyData.Key.UnicodeChar - L'A' + 1);
|
||||
}
|
||||
}
|
||||
|
||||
@ -314,15 +322,15 @@ KeyboardReadKeyStroke (
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyboardWaitForKey (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_TPL OldTpl;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_TPL OldTpl;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_KEY_DATA KeyData;
|
||||
|
||||
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context;
|
||||
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *)Context;
|
||||
|
||||
//
|
||||
// Enter critical section
|
||||
@ -344,10 +352,11 @@ KeyboardWaitForKey (
|
||||
&(ConsoleIn->EfiKeyQueue.Buffer[ConsoleIn->EfiKeyQueue.Head]),
|
||||
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);
|
||||
continue;
|
||||
}
|
||||
|
||||
//
|
||||
// if there is pending value key, signal the event.
|
||||
//
|
||||
@ -355,6 +364,7 @@ KeyboardWaitForKey (
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Leave critical section and return
|
||||
//
|
||||
@ -372,8 +382,8 @@ KeyboardWaitForKey (
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyboardWaitForKeyEx (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
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);
|
||||
|
||||
@ -428,12 +438,12 @@ KeyboardEfiResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KeyboardReadKeyStrokeEx (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
)
|
||||
|
||||
{
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
|
||||
if (KeyData == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -465,9 +475,9 @@ KeyboardSetState (
|
||||
)
|
||||
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
if (KeyToggleState == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -501,12 +511,15 @@ KeyboardSetState (
|
||||
if ((*KeyToggleState & EFI_SCROLL_LOCK_ACTIVE) == EFI_SCROLL_LOCK_ACTIVE) {
|
||||
ConsoleInDev->ScrollLock = TRUE;
|
||||
}
|
||||
|
||||
if ((*KeyToggleState & EFI_NUM_LOCK_ACTIVE) == EFI_NUM_LOCK_ACTIVE) {
|
||||
ConsoleInDev->NumLock = TRUE;
|
||||
}
|
||||
|
||||
if ((*KeyToggleState & EFI_CAPS_LOCK_ACTIVE) == EFI_CAPS_LOCK_ACTIVE) {
|
||||
ConsoleInDev->CapsLock = TRUE;
|
||||
}
|
||||
|
||||
if ((*KeyToggleState & EFI_KEY_STATE_EXPOSED) == EFI_KEY_STATE_EXPOSED) {
|
||||
ConsoleInDev->IsSupportPartialKey = TRUE;
|
||||
}
|
||||
@ -523,7 +536,6 @@ Exit:
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
return Status;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -553,14 +565,14 @@ KeyboardRegisterKeyNotify (
|
||||
OUT VOID **NotifyHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
EFI_TPL OldTpl;
|
||||
LIST_ENTRY *Link;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify;
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
EFI_TPL OldTpl;
|
||||
LIST_ENTRY *Link;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *NewNotify;
|
||||
|
||||
if (KeyData == NULL || NotifyHandle == NULL || KeyNotificationFunction == NULL) {
|
||||
if ((KeyData == NULL) || (NotifyHandle == NULL) || (KeyNotificationFunction == NULL)) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -584,7 +596,7 @@ KeyboardRegisterKeyNotify (
|
||||
if (IsKeyRegistered (&CurrentNotify->KeyData, KeyData)) {
|
||||
if (CurrentNotify->KeyNotificationFn == KeyNotificationFunction) {
|
||||
*NotifyHandle = CurrentNotify;
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
@ -593,7 +605,7 @@ KeyboardRegisterKeyNotify (
|
||||
//
|
||||
// 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) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Exit;
|
||||
@ -604,8 +616,8 @@ KeyboardRegisterKeyNotify (
|
||||
CopyMem (&NewNotify->KeyData, KeyData, sizeof (EFI_KEY_DATA));
|
||||
InsertTailList (&ConsoleInDev->NotifyList, &NewNotify->NotifyEntry);
|
||||
|
||||
*NotifyHandle = NewNotify;
|
||||
Status = EFI_SUCCESS;
|
||||
*NotifyHandle = NewNotify;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
Exit:
|
||||
//
|
||||
@ -613,7 +625,6 @@ Exit:
|
||||
//
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
return Status;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -634,11 +645,11 @@ KeyboardUnregisterKeyNotify (
|
||||
IN VOID *NotificationHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
EFI_TPL OldTpl;
|
||||
LIST_ENTRY *Link;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleInDev;
|
||||
EFI_TPL OldTpl;
|
||||
LIST_ENTRY *Link;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
|
||||
if (NotificationHandle == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
@ -691,19 +702,19 @@ Exit:
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyNotifyProcessHandler (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_KEY_DATA KeyData;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NotifyList;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS Status;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
EFI_KEY_DATA KeyData;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NotifyList;
|
||||
KEYBOARD_CONSOLE_IN_EX_NOTIFY *CurrentNotify;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *) Context;
|
||||
ConsoleIn = (KEYBOARD_CONSOLE_IN_DEV *)Context;
|
||||
|
||||
//
|
||||
// Invoke notification functions.
|
||||
@ -722,6 +733,7 @@ KeyNotifyProcessHandler (
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
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);
|
||||
if (IsKeyRegistered (&CurrentNotify->KeyData, &KeyData)) {
|
||||
@ -730,4 +742,3 @@ KeyNotifyProcessHandler (
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -13,6 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
//
|
||||
// Function prototypes
|
||||
//
|
||||
|
||||
/**
|
||||
Test controller is a keyboard Controller.
|
||||
|
||||
@ -26,9 +27,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KbdControllerDriverSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -43,9 +44,9 @@ KbdControllerDriverSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KbdControllerDriverStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -65,10 +66,10 @@ KbdControllerDriverStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KbdControllerDriverStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -81,13 +82,13 @@ KbdControllerDriverStop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
KbdFreeNotifyList (
|
||||
IN OUT LIST_ENTRY *ListHead
|
||||
IN OUT LIST_ENTRY *ListHead
|
||||
);
|
||||
|
||||
//
|
||||
// DriverBinding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {
|
||||
KbdControllerDriverSupported,
|
||||
KbdControllerDriverStart,
|
||||
KbdControllerDriverStop,
|
||||
@ -109,15 +110,15 @@ EFI_DRIVER_BINDING_PROTOCOL gKeyboardControllerDriver = {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KbdControllerDriverSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
ACPI_HID_DEVICE_PATH *Acpi;
|
||||
EFI_STATUS Status;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
ACPI_HID_DEVICE_PATH *Acpi;
|
||||
|
||||
//
|
||||
// Check whether the controller is keyboard.
|
||||
@ -125,7 +126,7 @@ KbdControllerDriverSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
(VOID **)&DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -135,16 +136,17 @@ KbdControllerDriverSupported (
|
||||
}
|
||||
|
||||
do {
|
||||
Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;
|
||||
Acpi = (ACPI_HID_DEVICE_PATH *)DevicePath;
|
||||
DevicePath = NextDevicePathNode (DevicePath);
|
||||
} while (!IsDevicePathEnd (DevicePath));
|
||||
|
||||
if (DevicePathType (Acpi) != ACPI_DEVICE_PATH ||
|
||||
(DevicePathSubType (Acpi) != ACPI_DP && DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)) {
|
||||
if ((DevicePathType (Acpi) != ACPI_DEVICE_PATH) ||
|
||||
((DevicePathSubType (Acpi) != ACPI_DP) && (DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)))
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
@ -154,7 +156,7 @@ KbdControllerDriverSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSioProtocolGuid,
|
||||
(VOID **) &Sio,
|
||||
(VOID **)&Sio,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -188,25 +190,25 @@ KbdControllerDriverSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KbdControllerDriverStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status1;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
UINT8 Data;
|
||||
EFI_STATUS_CODE_VALUE StatusCode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status1;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
UINT8 Data;
|
||||
EFI_STATUS_CODE_VALUE StatusCode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
|
||||
StatusCode = 0;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
(VOID **)&DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -214,6 +216,7 @@ KbdControllerDriverStart (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Report that the keyboard is being enabled
|
||||
//
|
||||
@ -229,7 +232,7 @@ KbdControllerDriverStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSioProtocolGuid,
|
||||
(VOID **) &Sio,
|
||||
(VOID **)&Sio,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -237,15 +240,17 @@ KbdControllerDriverStart (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Allocate private data
|
||||
//
|
||||
ConsoleIn = AllocateZeroPool (sizeof (KEYBOARD_CONSOLE_IN_DEV));
|
||||
if (ConsoleIn == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
//
|
||||
// Setup the device instance
|
||||
//
|
||||
@ -283,8 +288,8 @@ KbdControllerDriverStart (
|
||||
// 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
|
||||
//
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
|
||||
goto ErrorExit;
|
||||
}
|
||||
}
|
||||
@ -300,10 +305,11 @@ KbdControllerDriverStart (
|
||||
&((ConsoleIn->ConIn).WaitForKey)
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
//
|
||||
// Setup the WaitForKeyEx event
|
||||
//
|
||||
@ -315,10 +321,11 @@ KbdControllerDriverStart (
|
||||
&(ConsoleIn->ConInEx.WaitForKeyEx)
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
// Setup a periodic timer, used for reading keystrokes at a fixed interval
|
||||
//
|
||||
Status = gBS->CreateEvent (
|
||||
@ -329,8 +336,8 @@ KbdControllerDriverStart (
|
||||
&ConsoleIn->TimerEvent
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
@ -340,8 +347,8 @@ KbdControllerDriverStart (
|
||||
KEYBOARD_TIMER_INTERVAL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
@ -353,8 +360,8 @@ KbdControllerDriverStart (
|
||||
&ConsoleIn->KeyNotifyProcessEvent
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_CONTROLLER_ERROR;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
@ -369,8 +376,8 @@ KbdControllerDriverStart (
|
||||
//
|
||||
Status = ConsoleIn->ConInEx.Reset (&ConsoleIn->ConInEx, FeaturePcdGet (PcdPs2KbdExtendedVerification));
|
||||
if (EFI_ERROR (Status)) {
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
StatusCode = EFI_PERIPHERAL_KEYBOARD | EFI_P_EC_NOT_DETECTED;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
@ -396,7 +403,6 @@ KbdControllerDriverStart (
|
||||
FALSE
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// Install protocol interfaces for the keyboard device.
|
||||
//
|
||||
@ -434,16 +440,20 @@ ErrorExit:
|
||||
if ((ConsoleIn != NULL) && (ConsoleIn->TimerEvent != NULL)) {
|
||||
gBS->CloseEvent (ConsoleIn->TimerEvent);
|
||||
}
|
||||
|
||||
if ((ConsoleIn != NULL) && (ConsoleIn->ConInEx.WaitForKeyEx != NULL)) {
|
||||
gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);
|
||||
}
|
||||
|
||||
if ((ConsoleIn != NULL) && (ConsoleIn->KeyNotifyProcessEvent != NULL)) {
|
||||
gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);
|
||||
}
|
||||
|
||||
KbdFreeNotifyList (&ConsoleIn->NotifyList);
|
||||
if ((ConsoleIn != NULL) && (ConsoleIn->ControllerNameTable != NULL)) {
|
||||
FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);
|
||||
}
|
||||
|
||||
//
|
||||
// Since there will be no timer handler for keyboard input any more,
|
||||
// exhaust input data just in case there is still keyboard data left
|
||||
@ -451,7 +461,7 @@ ErrorExit:
|
||||
if (ConsoleIn != NULL) {
|
||||
Status1 = EFI_SUCCESS;
|
||||
while (!EFI_ERROR (Status1) && (Status != EFI_DEVICE_ERROR)) {
|
||||
Status1 = KeyboardRead (ConsoleIn, &Data);;
|
||||
Status1 = KeyboardRead (ConsoleIn, &Data);
|
||||
}
|
||||
}
|
||||
|
||||
@ -486,16 +496,16 @@ ErrorExit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KbdControllerDriverStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
UINT8 Data;
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL *ConIn;
|
||||
KEYBOARD_CONSOLE_IN_DEV *ConsoleIn;
|
||||
UINT8 Data;
|
||||
|
||||
//
|
||||
// Disable Keyboard
|
||||
@ -503,7 +513,7 @@ KbdControllerDriverStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSimpleTextInProtocolGuid,
|
||||
(VOID **) &ConIn,
|
||||
(VOID **)&ConIn,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -511,6 +521,7 @@ KbdControllerDriverStop (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSimpleTextInputExProtocolGuid,
|
||||
@ -545,8 +556,9 @@ KbdControllerDriverStop (
|
||||
//
|
||||
Status = EFI_SUCCESS;
|
||||
while (!EFI_ERROR (Status)) {
|
||||
Status = KeyboardRead (ConsoleIn, &Data);;
|
||||
Status = KeyboardRead (ConsoleIn, &Data);
|
||||
}
|
||||
|
||||
//
|
||||
// Uninstall the SimpleTextIn and SimpleTextInEx protocols
|
||||
//
|
||||
@ -576,14 +588,17 @@ KbdControllerDriverStop (
|
||||
gBS->CloseEvent ((ConsoleIn->ConIn).WaitForKey);
|
||||
(ConsoleIn->ConIn).WaitForKey = NULL;
|
||||
}
|
||||
|
||||
if (ConsoleIn->ConInEx.WaitForKeyEx != NULL) {
|
||||
gBS->CloseEvent (ConsoleIn->ConInEx.WaitForKeyEx);
|
||||
ConsoleIn->ConInEx.WaitForKeyEx = NULL;
|
||||
}
|
||||
|
||||
if (ConsoleIn->KeyNotifyProcessEvent != NULL) {
|
||||
gBS->CloseEvent (ConsoleIn->KeyNotifyProcessEvent);
|
||||
ConsoleIn->KeyNotifyProcessEvent = NULL;
|
||||
}
|
||||
|
||||
KbdFreeNotifyList (&ConsoleIn->NotifyList);
|
||||
FreeUnicodeStringTable (ConsoleIn->ControllerNameTable);
|
||||
gBS->FreePool (ConsoleIn);
|
||||
@ -601,14 +616,15 @@ KbdControllerDriverStop (
|
||||
**/
|
||||
EFI_STATUS
|
||||
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) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
while (!IsListEmpty (ListHead)) {
|
||||
NotifyNode = CR (
|
||||
ListHead->ForwardLink,
|
||||
@ -635,12 +651,12 @@ KbdFreeNotifyList (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializePs2Keyboard(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializePs2Keyboard (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
@ -655,7 +671,5 @@ InitializePs2Keyboard(
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -41,79 +41,79 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gPs2KeyboardComponentName2;
|
||||
//
|
||||
// Driver Private Data
|
||||
//
|
||||
#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_DEV_SIGNATURE SIGNATURE_32 ('k', 'k', 'e', 'y')
|
||||
#define KEYBOARD_CONSOLE_IN_EX_NOTIFY_SIGNATURE SIGNATURE_32 ('k', 'c', 'e', 'n')
|
||||
|
||||
typedef struct _KEYBOARD_CONSOLE_IN_EX_NOTIFY {
|
||||
UINTN Signature;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||
LIST_ENTRY NotifyEntry;
|
||||
UINTN Signature;
|
||||
EFI_KEY_DATA KeyData;
|
||||
EFI_KEY_NOTIFY_FUNCTION KeyNotificationFn;
|
||||
LIST_ENTRY NotifyEntry;
|
||||
} KEYBOARD_CONSOLE_IN_EX_NOTIFY;
|
||||
|
||||
#define KEYBOARD_SCAN_CODE_MAX_COUNT 32
|
||||
typedef struct {
|
||||
UINT8 Buffer[KEYBOARD_SCAN_CODE_MAX_COUNT];
|
||||
UINTN Head;
|
||||
UINTN Tail;
|
||||
UINT8 Buffer[KEYBOARD_SCAN_CODE_MAX_COUNT];
|
||||
UINTN Head;
|
||||
UINTN Tail;
|
||||
} SCAN_CODE_QUEUE;
|
||||
|
||||
#define KEYBOARD_EFI_KEY_MAX_COUNT 256
|
||||
#define KEYBOARD_EFI_KEY_MAX_COUNT 256
|
||||
typedef struct {
|
||||
EFI_KEY_DATA Buffer[KEYBOARD_EFI_KEY_MAX_COUNT];
|
||||
UINTN Head;
|
||||
UINTN Tail;
|
||||
EFI_KEY_DATA Buffer[KEYBOARD_EFI_KEY_MAX_COUNT];
|
||||
UINTN Head;
|
||||
UINTN Tail;
|
||||
} EFI_KEY_QUEUE;
|
||||
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
EFI_HANDLE Handle;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL ConIn;
|
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL ConInEx;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_SIMPLE_TEXT_INPUT_PROTOCOL ConIn;
|
||||
EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL ConInEx;
|
||||
|
||||
EFI_EVENT TimerEvent;
|
||||
EFI_EVENT TimerEvent;
|
||||
|
||||
UINT32 DataRegisterAddress;
|
||||
UINT32 StatusRegisterAddress;
|
||||
UINT32 CommandRegisterAddress;
|
||||
UINT32 DataRegisterAddress;
|
||||
UINT32 StatusRegisterAddress;
|
||||
UINT32 CommandRegisterAddress;
|
||||
|
||||
BOOLEAN LeftCtrl;
|
||||
BOOLEAN RightCtrl;
|
||||
BOOLEAN LeftAlt;
|
||||
BOOLEAN RightAlt;
|
||||
BOOLEAN LeftShift;
|
||||
BOOLEAN RightShift;
|
||||
BOOLEAN LeftLogo;
|
||||
BOOLEAN RightLogo;
|
||||
BOOLEAN Menu;
|
||||
BOOLEAN SysReq;
|
||||
BOOLEAN LeftCtrl;
|
||||
BOOLEAN RightCtrl;
|
||||
BOOLEAN LeftAlt;
|
||||
BOOLEAN RightAlt;
|
||||
BOOLEAN LeftShift;
|
||||
BOOLEAN RightShift;
|
||||
BOOLEAN LeftLogo;
|
||||
BOOLEAN RightLogo;
|
||||
BOOLEAN Menu;
|
||||
BOOLEAN SysReq;
|
||||
|
||||
BOOLEAN CapsLock;
|
||||
BOOLEAN NumLock;
|
||||
BOOLEAN ScrollLock;
|
||||
BOOLEAN CapsLock;
|
||||
BOOLEAN NumLock;
|
||||
BOOLEAN ScrollLock;
|
||||
|
||||
BOOLEAN IsSupportPartialKey;
|
||||
BOOLEAN IsSupportPartialKey;
|
||||
//
|
||||
// Queue storing key scancodes
|
||||
//
|
||||
SCAN_CODE_QUEUE ScancodeQueue;
|
||||
EFI_KEY_QUEUE EfiKeyQueue;
|
||||
EFI_KEY_QUEUE EfiKeyQueueForNotify;
|
||||
SCAN_CODE_QUEUE ScancodeQueue;
|
||||
EFI_KEY_QUEUE EfiKeyQueue;
|
||||
EFI_KEY_QUEUE EfiKeyQueueForNotify;
|
||||
|
||||
//
|
||||
// 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
|
||||
//
|
||||
LIST_ENTRY NotifyList;
|
||||
EFI_EVENT KeyNotifyProcessEvent;
|
||||
LIST_ENTRY NotifyList;
|
||||
EFI_EVENT KeyNotifyProcessEvent;
|
||||
} KEYBOARD_CONSOLE_IN_DEV;
|
||||
|
||||
#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 \
|
||||
)
|
||||
|
||||
#define TABLE_END 0x0
|
||||
#define TABLE_END 0x0
|
||||
|
||||
//
|
||||
// Driver entry point
|
||||
//
|
||||
|
||||
/**
|
||||
The user Entry Point for module Ps2Keyboard. The user code starts with this function.
|
||||
|
||||
@ -142,58 +143,57 @@ typedef struct {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InstallPs2KeyboardDriver (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
);
|
||||
|
||||
#define KEYBOARD_8042_DATA_REGISTER 0x60
|
||||
#define KEYBOARD_8042_STATUS_REGISTER 0x64
|
||||
#define KEYBOARD_8042_COMMAND_REGISTER 0x64
|
||||
|
||||
#define KEYBOARD_KBEN 0xF4
|
||||
#define KEYBOARD_CMDECHO_ACK 0xFA
|
||||
#define KEYBOARD_KBEN 0xF4
|
||||
#define KEYBOARD_CMDECHO_ACK 0xFA
|
||||
|
||||
#define KEYBOARD_MAX_TRY 256 // 256
|
||||
#define KEYBOARD_TIMEOUT 65536 // 0.07s
|
||||
#define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s
|
||||
#define KEYBOARD_BAT_TIMEOUT 4000000 // 4s
|
||||
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
|
||||
#define SCANCODE_EXTENDED0 0xE0
|
||||
#define SCANCODE_EXTENDED1 0xE1
|
||||
#define SCANCODE_CTRL_MAKE 0x1D
|
||||
#define SCANCODE_CTRL_BREAK 0x9D
|
||||
#define SCANCODE_ALT_MAKE 0x38
|
||||
#define SCANCODE_ALT_BREAK 0xB8
|
||||
#define SCANCODE_LEFT_SHIFT_MAKE 0x2A
|
||||
#define SCANCODE_LEFT_SHIFT_BREAK 0xAA
|
||||
#define SCANCODE_RIGHT_SHIFT_MAKE 0x36
|
||||
#define SCANCODE_RIGHT_SHIFT_BREAK 0xB6
|
||||
#define SCANCODE_CAPS_LOCK_MAKE 0x3A
|
||||
#define SCANCODE_NUM_LOCK_MAKE 0x45
|
||||
#define SCANCODE_SCROLL_LOCK_MAKE 0x46
|
||||
#define SCANCODE_DELETE_MAKE 0x53
|
||||
#define SCANCODE_LEFT_LOGO_MAKE 0x5B //GUI key defined in Keyboard scan code
|
||||
#define SCANCODE_LEFT_LOGO_BREAK 0xDB
|
||||
#define SCANCODE_RIGHT_LOGO_MAKE 0x5C
|
||||
#define SCANCODE_RIGHT_LOGO_BREAK 0xDC
|
||||
#define SCANCODE_MENU_MAKE 0x5D //APPS key defined in Keyboard scan code
|
||||
#define SCANCODE_MENU_BREAK 0xDD
|
||||
#define SCANCODE_SYS_REQ_MAKE 0x37
|
||||
#define SCANCODE_SYS_REQ_BREAK 0xB7
|
||||
#define SCANCODE_SYS_REQ_MAKE_WITH_ALT 0x54
|
||||
#define SCANCODE_SYS_REQ_BREAK_WITH_ALT 0xD4
|
||||
#define KEYBOARD_MAX_TRY 256 // 256
|
||||
#define KEYBOARD_TIMEOUT 65536 // 0.07s
|
||||
#define KEYBOARD_WAITFORVALUE_TIMEOUT 1000000 // 1s
|
||||
#define KEYBOARD_BAT_TIMEOUT 4000000 // 4s
|
||||
#define KEYBOARD_TIMER_INTERVAL 200000 // 0.02s
|
||||
#define SCANCODE_EXTENDED0 0xE0
|
||||
#define SCANCODE_EXTENDED1 0xE1
|
||||
#define SCANCODE_CTRL_MAKE 0x1D
|
||||
#define SCANCODE_CTRL_BREAK 0x9D
|
||||
#define SCANCODE_ALT_MAKE 0x38
|
||||
#define SCANCODE_ALT_BREAK 0xB8
|
||||
#define SCANCODE_LEFT_SHIFT_MAKE 0x2A
|
||||
#define SCANCODE_LEFT_SHIFT_BREAK 0xAA
|
||||
#define SCANCODE_RIGHT_SHIFT_MAKE 0x36
|
||||
#define SCANCODE_RIGHT_SHIFT_BREAK 0xB6
|
||||
#define SCANCODE_CAPS_LOCK_MAKE 0x3A
|
||||
#define SCANCODE_NUM_LOCK_MAKE 0x45
|
||||
#define SCANCODE_SCROLL_LOCK_MAKE 0x46
|
||||
#define SCANCODE_DELETE_MAKE 0x53
|
||||
#define SCANCODE_LEFT_LOGO_MAKE 0x5B// GUI key defined in Keyboard scan code
|
||||
#define SCANCODE_LEFT_LOGO_BREAK 0xDB
|
||||
#define SCANCODE_RIGHT_LOGO_MAKE 0x5C
|
||||
#define SCANCODE_RIGHT_LOGO_BREAK 0xDC
|
||||
#define SCANCODE_MENU_MAKE 0x5D// APPS key defined in Keyboard scan code
|
||||
#define SCANCODE_MENU_BREAK 0xDD
|
||||
#define SCANCODE_SYS_REQ_MAKE 0x37
|
||||
#define SCANCODE_SYS_REQ_BREAK 0xB7
|
||||
#define SCANCODE_SYS_REQ_MAKE_WITH_ALT 0x54
|
||||
#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_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_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_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_PARITY BIT7 ///< 0 - Odd parity; 1 - Even parity
|
||||
#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_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_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_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_8042_COMMAND_READ 0x20
|
||||
#define KEYBOARD_8042_COMMAND_WRITE 0x60
|
||||
@ -203,14 +203,13 @@ InstallPs2KeyboardDriver (
|
||||
#define KEYBOARD_8042_COMMAND_KEYBOARD_INTERFACE_SELF_TEST 0xAB
|
||||
#define KEYBOARD_8042_COMMAND_DISABLE_KEYBOARD_INTERFACE 0xAD
|
||||
|
||||
#define KEYBOARD_8048_COMMAND_CLEAR_OUTPUT_DATA 0xF4
|
||||
#define KEYBOARD_8048_COMMAND_RESET 0xFF
|
||||
#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_COMMAND_CLEAR_OUTPUT_DATA 0xF4
|
||||
#define KEYBOARD_8048_COMMAND_RESET 0xFF
|
||||
#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
|
||||
|
||||
//
|
||||
// Keyboard Controller Status
|
||||
@ -221,6 +220,7 @@ InstallPs2KeyboardDriver (
|
||||
//
|
||||
// Other functions that are used among .c files
|
||||
//
|
||||
|
||||
/**
|
||||
Show keyboard status lights according to
|
||||
indicators in ConsoleIn.
|
||||
@ -232,7 +232,7 @@ InstallPs2KeyboardDriver (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UpdateStatusLights (
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
);
|
||||
|
||||
/**
|
||||
@ -261,7 +261,7 @@ KeyboardRead (
|
||||
**/
|
||||
VOID
|
||||
KeyGetchar (
|
||||
IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
);
|
||||
|
||||
/**
|
||||
@ -273,8 +273,8 @@ KeyGetchar (
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyNotifyProcessHandler (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -290,11 +290,10 @@ KeyNotifyProcessHandler (
|
||||
**/
|
||||
EFI_STATUS
|
||||
InitKeyboard (
|
||||
IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN OUT KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Timer event handler: read a series of scancodes from 8042
|
||||
and put them into memory scancode buffer.
|
||||
@ -309,8 +308,8 @@ InitKeyboard (
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyboardTimerHandler (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -358,8 +357,8 @@ KeyboardReadKeyStroke (
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyboardWaitForKey (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -372,7 +371,7 @@ KeyboardWaitForKey (
|
||||
**/
|
||||
UINT8
|
||||
KeyReadStatusRegister (
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
);
|
||||
|
||||
/**
|
||||
@ -388,7 +387,7 @@ KeyReadStatusRegister (
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
CheckKeyboardConnect (
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn
|
||||
);
|
||||
|
||||
/**
|
||||
@ -402,8 +401,8 @@ CheckKeyboardConnect (
|
||||
VOID
|
||||
EFIAPI
|
||||
KeyboardWaitForKeyEx (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
//
|
||||
@ -447,8 +446,8 @@ KeyboardEfiResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
KeyboardReadKeyStrokeEx (
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
IN EFI_SIMPLE_TEXT_INPUT_EX_PROTOCOL *This,
|
||||
OUT EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
/**
|
||||
@ -526,8 +525,8 @@ KeyboardUnregisterKeyNotify (
|
||||
**/
|
||||
VOID
|
||||
PushEfikeyBufTail (
|
||||
IN EFI_KEY_QUEUE *Queue,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
IN EFI_KEY_QUEUE *Queue,
|
||||
IN EFI_KEY_DATA *KeyData
|
||||
);
|
||||
|
||||
/**
|
||||
@ -556,8 +555,8 @@ IsKeyRegistered (
|
||||
**/
|
||||
VOID
|
||||
InitializeKeyState (
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,
|
||||
OUT EFI_KEY_STATE *KeyState
|
||||
IN KEYBOARD_CONSOLE_IN_DEV *ConsoleIn,
|
||||
OUT EFI_KEY_STATE *KeyState
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -9,9 +9,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include "Ps2Mouse.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.
|
||||
@ -34,6 +34,7 @@ KbcSelfTest (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Read return code
|
||||
//
|
||||
@ -45,6 +46,7 @@ KbcSelfTest (
|
||||
if (Data != 0x55) {
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
//
|
||||
// Set system flag
|
||||
//
|
||||
@ -63,7 +65,7 @@ KbcSelfTest (
|
||||
return Status;
|
||||
}
|
||||
|
||||
Data |= CMD_SYS_FLAG;
|
||||
Data |= CMD_SYS_FLAG;
|
||||
Status = Out8042Data (Data);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
@ -149,7 +151,7 @@ KbcDisableKb (
|
||||
**/
|
||||
EFI_STATUS
|
||||
CheckKbStatus (
|
||||
OUT BOOLEAN *KeyboardEnable
|
||||
OUT BOOLEAN *KeyboardEnable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -167,6 +169,7 @@ CheckKbStatus (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Check keyboard enable or not
|
||||
//
|
||||
@ -201,6 +204,7 @@ PS2MouseReset (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Check BAT Complete Code
|
||||
//
|
||||
@ -212,6 +216,7 @@ PS2MouseReset (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Check BAT Complete Code
|
||||
//
|
||||
@ -231,7 +236,7 @@ PS2MouseReset (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseSetSampleRate (
|
||||
IN MOUSE_SR SampleRate
|
||||
IN MOUSE_SR SampleRate
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -258,7 +263,7 @@ PS2MouseSetSampleRate (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseSetResolution (
|
||||
IN MOUSE_RE Resolution
|
||||
IN MOUSE_RE Resolution
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -285,7 +290,7 @@ PS2MouseSetResolution (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseSetScaling (
|
||||
IN MOUSE_SF Scaling
|
||||
IN MOUSE_SF Scaling
|
||||
)
|
||||
{
|
||||
//
|
||||
@ -321,7 +326,7 @@ PS2MouseEnable (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseGetPacket (
|
||||
PS2_MOUSE_DEV *MouseDev
|
||||
PS2_MOUSE_DEV *MouseDev
|
||||
)
|
||||
|
||||
{
|
||||
@ -336,111 +341,112 @@ PS2MouseGetPacket (
|
||||
BOOLEAN LButton;
|
||||
BOOLEAN RButton;
|
||||
|
||||
KeyboardEnable = FALSE;
|
||||
State = PS2_READ_BYTE_ONE;
|
||||
KeyboardEnable = FALSE;
|
||||
State = PS2_READ_BYTE_ONE;
|
||||
|
||||
//
|
||||
// State machine to get mouse packet
|
||||
//
|
||||
while (1) {
|
||||
|
||||
switch (State) {
|
||||
case PS2_READ_BYTE_ONE:
|
||||
//
|
||||
// Read mouse first byte data, if failed, immediately return
|
||||
//
|
||||
KbcDisableAux ();
|
||||
Count = 1;
|
||||
Status = PS2MouseRead (&Data, &Count, State);
|
||||
if (EFI_ERROR (Status)) {
|
||||
KbcEnableAux ();
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
case PS2_READ_BYTE_ONE:
|
||||
//
|
||||
// Read mouse first byte data, if failed, immediately return
|
||||
//
|
||||
KbcDisableAux ();
|
||||
Count = 1;
|
||||
Status = PS2MouseRead (&Data, &Count, State);
|
||||
if (EFI_ERROR (Status)) {
|
||||
KbcEnableAux ();
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
|
||||
if (Count != 1) {
|
||||
KbcEnableAux ();
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
if (Count != 1) {
|
||||
KbcEnableAux ();
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
|
||||
if (IS_PS2_SYNC_BYTE (Data)) {
|
||||
Packet[0] = Data;
|
||||
State = PS2_READ_DATA_BYTE;
|
||||
if (IS_PS2_SYNC_BYTE (Data)) {
|
||||
Packet[0] = Data;
|
||||
State = PS2_READ_DATA_BYTE;
|
||||
|
||||
CheckKbStatus (&KeyboardEnable);
|
||||
KbcDisableKb ();
|
||||
KbcEnableAux ();
|
||||
}
|
||||
break;
|
||||
CheckKbStatus (&KeyboardEnable);
|
||||
KbcDisableKb ();
|
||||
KbcEnableAux ();
|
||||
}
|
||||
|
||||
case PS2_READ_DATA_BYTE:
|
||||
Count = 2;
|
||||
Status = PS2MouseRead ((Packet + 1), &Count, State);
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
|
||||
case PS2_READ_DATA_BYTE:
|
||||
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) {
|
||||
KbcEnableKb ();
|
||||
}
|
||||
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
|
||||
if (Count != 2) {
|
||||
if (KeyboardEnable) {
|
||||
KbcEnableKb ();
|
||||
//
|
||||
// Decode the packet
|
||||
//
|
||||
RelativeMovementX = Packet[1];
|
||||
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);
|
||||
}
|
||||
|
||||
return EFI_NOT_READY;
|
||||
}
|
||||
if ((Packet[0] & 0x20) != 0) {
|
||||
RelativeMovementY = (INT16)(RelativeMovementY | 0xFF00);
|
||||
}
|
||||
|
||||
State = PS2_PROCESS_PACKET;
|
||||
break;
|
||||
RButton = (UINT8)(Packet[0] & 0x2);
|
||||
LButton = (UINT8)(Packet[0] & 0x1);
|
||||
|
||||
case PS2_PROCESS_PACKET:
|
||||
if (KeyboardEnable) {
|
||||
KbcEnableKb ();
|
||||
}
|
||||
//
|
||||
// Decode the packet
|
||||
//
|
||||
RelativeMovementX = Packet[1];
|
||||
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);
|
||||
}
|
||||
//
|
||||
// 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;
|
||||
|
||||
|
||||
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;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -456,15 +462,15 @@ PS2MouseGetPacket (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseRead (
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufSize,
|
||||
IN UINTN State
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufSize,
|
||||
IN UINTN State
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN BytesRead;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
if (State == PS2_READ_BYTE_ONE) {
|
||||
//
|
||||
@ -478,17 +484,18 @@ PS2MouseRead (
|
||||
}
|
||||
|
||||
for (BytesRead = 0; BytesRead < *BufSize; BytesRead++) {
|
||||
|
||||
Status = WaitOutputFull (TIMEOUT);
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
|
||||
Buffer[BytesRead] = IoRead8 (KBC_DATA_PORT);
|
||||
}
|
||||
|
||||
//
|
||||
// Verify the correct number of bytes read
|
||||
//
|
||||
if (BytesRead == 0 || BytesRead != *BufSize) {
|
||||
if ((BytesRead == 0) || (BytesRead != *BufSize)) {
|
||||
Status = EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
@ -499,6 +506,7 @@ PS2MouseRead (
|
||||
//
|
||||
// 8042 I/O function
|
||||
//
|
||||
|
||||
/**
|
||||
I/O work flow of outing 8042 command.
|
||||
|
||||
@ -509,7 +517,7 @@ PS2MouseRead (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042Command (
|
||||
IN UINT8 Command
|
||||
IN UINT8 Command
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -521,6 +529,7 @@ Out8042Command (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Send command
|
||||
//
|
||||
@ -544,10 +553,11 @@ Out8042Command (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042Data (
|
||||
IN UINT8 Data
|
||||
IN UINT8 Data
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Wait keyboard controller input buffer empty
|
||||
//
|
||||
@ -570,10 +580,10 @@ Out8042Data (
|
||||
**/
|
||||
EFI_STATUS
|
||||
In8042Data (
|
||||
IN OUT UINT8 *Data
|
||||
IN OUT UINT8 *Data
|
||||
)
|
||||
{
|
||||
UINTN Delay;
|
||||
UINTN Delay;
|
||||
|
||||
Delay = TIMEOUT / 50;
|
||||
|
||||
@ -609,8 +619,8 @@ In8042Data (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042AuxCommand (
|
||||
IN UINT8 Command,
|
||||
IN BOOLEAN Resend
|
||||
IN UINT8 Command,
|
||||
IN BOOLEAN Resend
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -623,6 +633,7 @@ Out8042AuxCommand (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Send write to auxiliary device command
|
||||
//
|
||||
@ -632,6 +643,7 @@ Out8042AuxCommand (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Send auxiliary device command
|
||||
//
|
||||
@ -650,13 +662,11 @@ Out8042AuxCommand (
|
||||
// Receive mouse acknowledge, command send success
|
||||
//
|
||||
return EFI_SUCCESS;
|
||||
|
||||
} else if (Resend) {
|
||||
//
|
||||
// Resend fail
|
||||
//
|
||||
return EFI_DEVICE_ERROR;
|
||||
|
||||
} else if (Data == PS2_RESEND) {
|
||||
//
|
||||
// Resend command
|
||||
@ -665,13 +675,11 @@ Out8042AuxCommand (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
} else {
|
||||
//
|
||||
// Invalid return code
|
||||
//
|
||||
return EFI_DEVICE_ERROR;
|
||||
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
@ -687,10 +695,11 @@ Out8042AuxCommand (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042AuxData (
|
||||
IN UINT8 Data
|
||||
IN UINT8 Data
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Wait keyboard controller input buffer empty
|
||||
//
|
||||
@ -698,6 +707,7 @@ Out8042AuxData (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Send write to auxiliary device command
|
||||
//
|
||||
@ -728,7 +738,7 @@ Out8042AuxData (
|
||||
**/
|
||||
EFI_STATUS
|
||||
In8042AuxData (
|
||||
IN OUT UINT8 *Data
|
||||
IN OUT UINT8 *Data
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -746,7 +756,6 @@ In8042AuxData (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check keyboard controller status, if it is output buffer full and for auxiliary device.
|
||||
|
||||
@ -758,7 +767,7 @@ CheckForInput (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
UINT8 Data;
|
||||
UINT8 Data;
|
||||
|
||||
Data = IoRead8 (KBC_CMD_STS_PORT);
|
||||
|
||||
@ -782,11 +791,11 @@ CheckForInput (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WaitInputEmpty (
|
||||
IN UINTN Timeout
|
||||
IN UINTN Timeout
|
||||
)
|
||||
{
|
||||
UINTN Delay;
|
||||
UINT8 Data;
|
||||
UINTN Delay;
|
||||
UINT8 Data;
|
||||
|
||||
Delay = Timeout / 50;
|
||||
|
||||
@ -821,11 +830,11 @@ WaitInputEmpty (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WaitOutputFull (
|
||||
IN UINTN Timeout
|
||||
IN UINTN Timeout
|
||||
)
|
||||
{
|
||||
UINTN Delay;
|
||||
UINT8 Data;
|
||||
UINTN Delay;
|
||||
UINT8 Data;
|
||||
|
||||
Delay = Timeout / 50;
|
||||
|
||||
|
@ -11,18 +11,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include "Ps2Mouse.h"
|
||||
|
||||
#define PS2_PACKET_LENGTH 3
|
||||
#define PS2_SYNC_MASK 0xc
|
||||
#define PS2_SYNC_BYTE 0x8
|
||||
#define PS2_PACKET_LENGTH 3
|
||||
#define PS2_SYNC_MASK 0xc
|
||||
#define PS2_SYNC_BYTE 0x8
|
||||
|
||||
#define IS_PS2_SYNC_BYTE(byte) ((byte & PS2_SYNC_MASK) == PS2_SYNC_BYTE)
|
||||
|
||||
#define PS2_READ_BYTE_ONE 0
|
||||
#define PS2_READ_DATA_BYTE 1
|
||||
#define PS2_PROCESS_PACKET 2
|
||||
#define PS2_READ_BYTE_ONE 0
|
||||
#define PS2_READ_DATA_BYTE 1
|
||||
#define PS2_PROCESS_PACKET 2
|
||||
|
||||
#define TIMEOUT 50000
|
||||
#define BAT_TIMEOUT 500000
|
||||
#define TIMEOUT 50000
|
||||
#define BAT_TIMEOUT 500000
|
||||
|
||||
//
|
||||
// 8042 I/O Port
|
||||
@ -42,31 +42,31 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#define ENABLE_KB 0xae
|
||||
#define WRITE_AUX_DEV 0xd4
|
||||
|
||||
#define CMD_SYS_FLAG 0x04
|
||||
#define CMD_KB_STS 0x10
|
||||
#define CMD_KB_DIS 0x10
|
||||
#define CMD_KB_EN 0x0
|
||||
#define CMD_SYS_FLAG 0x04
|
||||
#define CMD_KB_STS 0x10
|
||||
#define CMD_KB_DIS 0x10
|
||||
#define CMD_KB_EN 0x0
|
||||
|
||||
//
|
||||
// 8042 Auxiliary Device Command
|
||||
//
|
||||
#define SETSF1_CMD 0xe6
|
||||
#define SETSF2_CMD 0xe7
|
||||
#define SETRE_CMD 0xe8
|
||||
#define READ_CMD 0xeb
|
||||
#define SETRM_CMD 0xf0
|
||||
#define SETSR_CMD 0xf3
|
||||
#define ENABLE_CMD 0xf4
|
||||
#define DISABLE_CMD 0xf5
|
||||
#define RESET_CMD 0xff
|
||||
#define SETSF1_CMD 0xe6
|
||||
#define SETSF2_CMD 0xe7
|
||||
#define SETRE_CMD 0xe8
|
||||
#define READ_CMD 0xeb
|
||||
#define SETRM_CMD 0xf0
|
||||
#define SETSR_CMD 0xf3
|
||||
#define ENABLE_CMD 0xf4
|
||||
#define DISABLE_CMD 0xf5
|
||||
#define RESET_CMD 0xff
|
||||
|
||||
//
|
||||
// return code
|
||||
//
|
||||
#define PS2_ACK 0xfa
|
||||
#define PS2_RESEND 0xfe
|
||||
#define PS2MOUSE_BAT1 0xaa
|
||||
#define PS2MOUSE_BAT2 0x0
|
||||
#define PS2_ACK 0xfa
|
||||
#define PS2_RESEND 0xfe
|
||||
#define PS2MOUSE_BAT1 0xaa
|
||||
#define PS2MOUSE_BAT2 0x0
|
||||
|
||||
//
|
||||
// Keyboard Controller Status
|
||||
@ -78,7 +78,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
///
|
||||
/// General Time Out
|
||||
///
|
||||
#define KBC_TIM 0x40
|
||||
#define KBC_TIM 0x40
|
||||
///
|
||||
/// Output buffer for auxiliary device (PS/2):
|
||||
/// 0 - Holds keyboard data
|
||||
@ -176,7 +176,7 @@ KbcDisableKb (
|
||||
**/
|
||||
EFI_STATUS
|
||||
CheckKbStatus (
|
||||
OUT BOOLEAN *KeyboardEnable
|
||||
OUT BOOLEAN *KeyboardEnable
|
||||
);
|
||||
|
||||
/**
|
||||
@ -198,7 +198,7 @@ PS2MouseReset (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseSetSampleRate (
|
||||
IN MOUSE_SR SampleRate
|
||||
IN MOUSE_SR SampleRate
|
||||
);
|
||||
|
||||
/**
|
||||
@ -210,7 +210,7 @@ PS2MouseSetSampleRate (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseSetResolution (
|
||||
IN MOUSE_RE Resolution
|
||||
IN MOUSE_RE Resolution
|
||||
);
|
||||
|
||||
/**
|
||||
@ -222,7 +222,7 @@ PS2MouseSetResolution (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseSetScaling (
|
||||
IN MOUSE_SF Scaling
|
||||
IN MOUSE_SF Scaling
|
||||
);
|
||||
|
||||
/**
|
||||
@ -246,7 +246,7 @@ PS2MouseEnable (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseGetPacket (
|
||||
PS2_MOUSE_DEV *MouseDev
|
||||
PS2_MOUSE_DEV *MouseDev
|
||||
);
|
||||
|
||||
/**
|
||||
@ -260,14 +260,15 @@ PS2MouseGetPacket (
|
||||
**/
|
||||
EFI_STATUS
|
||||
PS2MouseRead (
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufSize,
|
||||
IN UINTN State
|
||||
OUT UINT8 *Buffer,
|
||||
IN OUT UINTN *BufSize,
|
||||
IN UINTN State
|
||||
);
|
||||
|
||||
//
|
||||
// 8042 I/O function
|
||||
//
|
||||
|
||||
/**
|
||||
I/O work flow of outing 8042 command.
|
||||
|
||||
@ -278,7 +279,7 @@ PS2MouseRead (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042Command (
|
||||
IN UINT8 Command
|
||||
IN UINT8 Command
|
||||
);
|
||||
|
||||
/**
|
||||
@ -291,7 +292,7 @@ Out8042Command (
|
||||
**/
|
||||
EFI_STATUS
|
||||
In8042Data (
|
||||
IN OUT UINT8 *Data
|
||||
IN OUT UINT8 *Data
|
||||
);
|
||||
|
||||
/**
|
||||
@ -304,7 +305,7 @@ In8042Data (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042Data (
|
||||
IN UINT8 Data
|
||||
IN UINT8 Data
|
||||
);
|
||||
|
||||
/**
|
||||
@ -318,8 +319,8 @@ Out8042Data (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042AuxCommand (
|
||||
IN UINT8 Command,
|
||||
IN BOOLEAN Resend
|
||||
IN UINT8 Command,
|
||||
IN BOOLEAN Resend
|
||||
);
|
||||
|
||||
/**
|
||||
@ -332,7 +333,7 @@ Out8042AuxCommand (
|
||||
**/
|
||||
EFI_STATUS
|
||||
In8042AuxData (
|
||||
IN OUT UINT8 *Data
|
||||
IN OUT UINT8 *Data
|
||||
);
|
||||
|
||||
/**
|
||||
@ -345,7 +346,7 @@ In8042AuxData (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Out8042AuxData (
|
||||
IN UINT8 Data
|
||||
IN UINT8 Data
|
||||
);
|
||||
|
||||
/**
|
||||
@ -369,7 +370,7 @@ CheckForInput (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WaitInputEmpty (
|
||||
IN UINTN Timeout
|
||||
IN UINTN Timeout
|
||||
);
|
||||
|
||||
/**
|
||||
@ -382,8 +383,7 @@ WaitInputEmpty (
|
||||
**/
|
||||
EFI_STATUS
|
||||
WaitOutputFull (
|
||||
IN UINTN Timeout
|
||||
IN UINTN Timeout
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -20,14 +20,13 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gPs2MouseComponentNam
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2MouseComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) Ps2MouseComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) Ps2MouseComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gPs2MouseComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)Ps2MouseComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)Ps2MouseComponentNameGetControllerName,
|
||||
"en"
|
||||
};
|
||||
|
||||
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2MouseDriverNameTable[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mPs2MouseDriverNameTable[] = {
|
||||
{
|
||||
"eng;en",
|
||||
L"PS/2 Mouse Driver"
|
||||
@ -165,16 +164,16 @@ Ps2MouseComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ps2MouseComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
|
||||
//
|
||||
// This is a device driver, so ChildHandle must be NULL.
|
||||
@ -182,6 +181,7 @@ Ps2MouseComponentNameGetControllerName (
|
||||
if (ChildHandle != NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Check Controller's handle
|
||||
//
|
||||
@ -190,13 +190,14 @@ Ps2MouseComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the device context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiSimplePointerProtocolGuid,
|
||||
(VOID **) &SimplePointerProtocol,
|
||||
(VOID **)&SimplePointerProtocol,
|
||||
gPS2MouseDriver.DriverBindingHandle,
|
||||
ControllerHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
|
@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
///
|
||||
/// DriverBinding Protocol Instance
|
||||
///
|
||||
EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {
|
||||
PS2MouseDriverSupported,
|
||||
PS2MouseDriverStart,
|
||||
PS2MouseDriverStop,
|
||||
@ -39,15 +39,15 @@ EFI_DRIVER_BINDING_PROTOCOL gPS2MouseDriver = {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PS2MouseDriverSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
ACPI_HID_DEVICE_PATH *Acpi;
|
||||
EFI_STATUS Status;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
ACPI_HID_DEVICE_PATH *Acpi;
|
||||
|
||||
//
|
||||
// Check whether the controller is keyboard.
|
||||
@ -55,7 +55,7 @@ PS2MouseDriverSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
(VOID **)&DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -65,37 +65,38 @@ PS2MouseDriverSupported (
|
||||
}
|
||||
|
||||
do {
|
||||
Acpi = (ACPI_HID_DEVICE_PATH *) DevicePath;
|
||||
Acpi = (ACPI_HID_DEVICE_PATH *)DevicePath;
|
||||
DevicePath = NextDevicePathNode (DevicePath);
|
||||
} while (!IsDevicePathEnd (DevicePath));
|
||||
|
||||
if (DevicePathType (Acpi) != ACPI_DEVICE_PATH ||
|
||||
(DevicePathSubType (Acpi) != ACPI_DP && DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)) {
|
||||
if ((DevicePathType (Acpi) != ACPI_DEVICE_PATH) ||
|
||||
((DevicePathSubType (Acpi) != ACPI_DP) && (DevicePathSubType (Acpi) != ACPI_EXTENDED_DP)))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
switch (Acpi->HID) {
|
||||
case EISA_PNP_ID (0xF03):
|
||||
case EISA_PNP_ID (0xF03):
|
||||
//
|
||||
// Microsoft PS/2 style mouse
|
||||
//
|
||||
case EISA_PNP_ID (0xF13):
|
||||
//
|
||||
// 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) {
|
||||
case EISA_PNP_ID (0xF13):
|
||||
//
|
||||
// PS/2 Port for PS/2-style Mice
|
||||
//
|
||||
break;
|
||||
}
|
||||
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
break;
|
||||
case EISA_PNP_ID (0x303):
|
||||
//
|
||||
// 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 (
|
||||
Controller,
|
||||
&gEfiSioProtocolGuid,
|
||||
(VOID **) &Sio,
|
||||
(VOID **)&Sio,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -143,21 +144,21 @@ PS2MouseDriverSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PS2MouseDriverStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS EmptyStatus;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
UINT8 Data;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS_CODE_VALUE StatusCode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS EmptyStatus;
|
||||
EFI_SIO_PROTOCOL *Sio;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
UINT8 Data;
|
||||
EFI_TPL OldTpl;
|
||||
EFI_STATUS_CODE_VALUE StatusCode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
|
||||
StatusCode = 0;
|
||||
StatusCode = 0;
|
||||
|
||||
//
|
||||
// Open the device path protocol
|
||||
@ -165,7 +166,7 @@ PS2MouseDriverStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &DevicePath,
|
||||
(VOID **)&DevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -173,6 +174,7 @@ PS2MouseDriverStart (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Report that the keyboard is being enabled
|
||||
//
|
||||
@ -188,7 +190,7 @@ PS2MouseDriverStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSioProtocolGuid,
|
||||
(VOID **) &Sio,
|
||||
(VOID **)&Sio,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -196,6 +198,7 @@ PS2MouseDriverStart (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Raise TPL to avoid keyboard operation impact
|
||||
//
|
||||
@ -209,6 +212,7 @@ PS2MouseDriverStart (
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
//
|
||||
// Setup the device instance
|
||||
//
|
||||
@ -223,14 +227,14 @@ PS2MouseDriverStart (
|
||||
//
|
||||
// Resolution = 4 counts/mm
|
||||
//
|
||||
MouseDev->Mode.ResolutionX = 4;
|
||||
MouseDev->Mode.ResolutionY = 4;
|
||||
MouseDev->Mode.LeftButton = TRUE;
|
||||
MouseDev->Mode.RightButton = TRUE;
|
||||
MouseDev->Mode.ResolutionX = 4;
|
||||
MouseDev->Mode.ResolutionY = 4;
|
||||
MouseDev->Mode.LeftButton = TRUE;
|
||||
MouseDev->Mode.RightButton = TRUE;
|
||||
|
||||
MouseDev->SimplePointerProtocol.Reset = MouseReset;
|
||||
MouseDev->SimplePointerProtocol.GetState = MouseGetState;
|
||||
MouseDev->SimplePointerProtocol.Mode = &(MouseDev->Mode);
|
||||
MouseDev->SimplePointerProtocol.Reset = MouseReset;
|
||||
MouseDev->SimplePointerProtocol.GetState = MouseGetState;
|
||||
MouseDev->SimplePointerProtocol.Mode = &(MouseDev->Mode);
|
||||
|
||||
//
|
||||
// Initialize keyboard controller if necessary
|
||||
@ -275,15 +279,15 @@ PS2MouseDriverStart (
|
||||
// Reset the mouse
|
||||
//
|
||||
Status = MouseDev->SimplePointerProtocol.Reset (
|
||||
&MouseDev->SimplePointerProtocol,
|
||||
FeaturePcdGet (PcdPs2MouseExtendedVerification)
|
||||
);
|
||||
&MouseDev->SimplePointerProtocol,
|
||||
FeaturePcdGet (PcdPs2MouseExtendedVerification)
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// mouse not connected
|
||||
//
|
||||
Status = EFI_SUCCESS;
|
||||
StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
|
||||
Status = EFI_SUCCESS;
|
||||
StatusCode = EFI_PERIPHERAL_MOUSE | EFI_P_EC_NOT_DETECTED;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
@ -307,6 +311,7 @@ PS2MouseDriverStart (
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
//
|
||||
// Setup a periodic timer, used to poll mouse state
|
||||
//
|
||||
@ -321,6 +326,7 @@ PS2MouseDriverStart (
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto ErrorExit;
|
||||
}
|
||||
|
||||
//
|
||||
// Start timer to poll mouse (100 samples per second)
|
||||
//
|
||||
@ -346,7 +352,6 @@ PS2MouseDriverStart (
|
||||
FALSE
|
||||
);
|
||||
|
||||
|
||||
//
|
||||
// Install protocol interfaces for the mouse device.
|
||||
//
|
||||
@ -441,21 +446,21 @@ ErrorExit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PS2MouseDriverStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
UINT8 Data;
|
||||
EFI_STATUS Status;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL *SimplePointerProtocol;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
UINT8 Data;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiSimplePointerProtocolGuid,
|
||||
(VOID **) &SimplePointerProtocol,
|
||||
(VOID **)&SimplePointerProtocol,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -535,15 +540,15 @@ PS2MouseDriverStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MouseReset (
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
EFI_TPL OldTpl;
|
||||
BOOLEAN KeyboardEnable;
|
||||
UINT8 Data;
|
||||
EFI_STATUS Status;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
EFI_TPL OldTpl;
|
||||
BOOLEAN KeyboardEnable;
|
||||
UINT8 Data;
|
||||
|
||||
MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
|
||||
|
||||
@ -625,6 +630,7 @@ MouseReset (
|
||||
goto Exit;
|
||||
}
|
||||
}
|
||||
|
||||
Exit:
|
||||
gBS->RestoreTPL (OldTpl);
|
||||
|
||||
@ -646,11 +652,11 @@ Exit:
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckMouseConnect (
|
||||
IN PS2_MOUSE_DEV *MouseDev
|
||||
IN PS2_MOUSE_DEV *MouseDev
|
||||
)
|
||||
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = PS2MouseEnable ();
|
||||
if (!EFI_ERROR (Status)) {
|
||||
@ -673,12 +679,12 @@ CheckMouseConnect (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MouseGetState (
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
||||
)
|
||||
{
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
EFI_TPL OldTpl;
|
||||
PS2_MOUSE_DEV *MouseDev;
|
||||
EFI_TPL OldTpl;
|
||||
|
||||
MouseDev = PS2_MOUSE_DEV_FROM_THIS (This);
|
||||
|
||||
@ -717,13 +723,13 @@ MouseGetState (
|
||||
VOID
|
||||
EFIAPI
|
||||
MouseWaitForInput (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
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
|
||||
@ -732,7 +738,6 @@ MouseWaitForInput (
|
||||
if (MouseDev->StateChanged) {
|
||||
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
|
||||
@ -773,12 +778,12 @@ PollMouse (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
InitializePs2Mouse(
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
InitializePs2Mouse (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install driver model protocol(s).
|
||||
@ -793,7 +798,5 @@ InitializePs2Mouse(
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -69,29 +69,29 @@ typedef enum {
|
||||
//
|
||||
// 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 {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
EFI_HANDLE Handle;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL SimplePointerProtocol;
|
||||
EFI_SIMPLE_POINTER_STATE State;
|
||||
EFI_SIMPLE_POINTER_MODE Mode;
|
||||
BOOLEAN StateChanged;
|
||||
EFI_HANDLE Handle;
|
||||
EFI_SIMPLE_POINTER_PROTOCOL SimplePointerProtocol;
|
||||
EFI_SIMPLE_POINTER_STATE State;
|
||||
EFI_SIMPLE_POINTER_MODE Mode;
|
||||
BOOLEAN StateChanged;
|
||||
|
||||
//
|
||||
// PS2 Mouse device specific information
|
||||
//
|
||||
MOUSE_SR SampleRate;
|
||||
MOUSE_RE Resolution;
|
||||
MOUSE_SF Scaling;
|
||||
UINT8 DataPackageSize;
|
||||
MOUSE_SR SampleRate;
|
||||
MOUSE_RE Resolution;
|
||||
MOUSE_SF Scaling;
|
||||
UINT8 DataPackageSize;
|
||||
|
||||
EFI_EVENT TimerEvent;
|
||||
EFI_EVENT TimerEvent;
|
||||
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
} PS2_MOUSE_DEV;
|
||||
|
||||
#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
|
||||
//
|
||||
|
||||
/**
|
||||
Test to see if this driver supports ControllerHandle. Any ControllerHandle
|
||||
than contains a IsaIo protocol can be supported.
|
||||
@ -116,9 +117,9 @@ typedef struct {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PS2MouseDriverSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -139,9 +140,9 @@ PS2MouseDriverSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PS2MouseDriverStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -161,15 +162,16 @@ PS2MouseDriverStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
PS2MouseDriverStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
//
|
||||
// EFI Component Name Functions
|
||||
//
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@ -217,7 +219,6 @@ Ps2MouseComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -289,11 +290,11 @@ Ps2MouseComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
Ps2MouseComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -311,8 +312,8 @@ Ps2MouseComponentNameGetControllerName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MouseReset (
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
@ -328,8 +329,8 @@ MouseReset (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MouseGetState (
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
||||
IN EFI_SIMPLE_POINTER_PROTOCOL *This,
|
||||
IN OUT EFI_SIMPLE_POINTER_STATE *State
|
||||
);
|
||||
|
||||
/**
|
||||
@ -344,8 +345,8 @@ MouseGetState (
|
||||
VOID
|
||||
EFIAPI
|
||||
MouseWaitForInput (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
/**
|
||||
@ -373,7 +374,7 @@ PollMouse (
|
||||
**/
|
||||
EFI_STATUS
|
||||
In8042Data (
|
||||
IN OUT UINT8 *Data
|
||||
IN OUT UINT8 *Data
|
||||
);
|
||||
|
||||
/**
|
||||
@ -387,7 +388,7 @@ In8042Data (
|
||||
**/
|
||||
BOOLEAN
|
||||
CheckMouseConnect (
|
||||
IN PS2_MOUSE_DEV *MouseDev
|
||||
IN PS2_MOUSE_DEV *MouseDev
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -9,7 +9,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include "Ehci.h"
|
||||
|
||||
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
@ -22,19 +21,17 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName =
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) EhciComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) EhciComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)EhciComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)EhciComponentNameGetControllerName,
|
||||
"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" },
|
||||
{ NULL , NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@ -162,16 +159,16 @@ EhciComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhciComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
USB2_HC_DEV *EhciDev;
|
||||
EFI_USB2_HC_PROTOCOL *Usb2Hc;
|
||||
EFI_STATUS Status;
|
||||
USB2_HC_DEV *EhciDev;
|
||||
EFI_USB2_HC_PROTOCOL *Usb2Hc;
|
||||
|
||||
//
|
||||
// This is a device driver, so ChildHandle must be NULL.
|
||||
@ -179,6 +176,7 @@ EhciComponentNameGetControllerName (
|
||||
if (ChildHandle != NULL) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure this driver is currently managing ControllerHandle
|
||||
//
|
||||
@ -190,13 +188,14 @@ EhciComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the device context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ControllerHandle,
|
||||
&gEfiUsb2HcProtocolGuid,
|
||||
(VOID **) &Usb2Hc,
|
||||
(VOID **)&Usb2Hc,
|
||||
gEhciDriverBinding.DriverBindingHandle,
|
||||
ControllerHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -214,5 +213,4 @@ EhciComponentNameGetControllerName (
|
||||
ControllerName,
|
||||
(BOOLEAN)(This == &gEhciComponentName)
|
||||
);
|
||||
|
||||
}
|
||||
|
@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _COMPONENT_NAME_H_
|
||||
#define _COMPONENT_NAME_H_
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the driver.
|
||||
|
||||
@ -58,7 +57,6 @@ EhciComponentNameGetDriverName (
|
||||
OUT CHAR16 **DriverName
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Retrieves a Unicode string that is the user readable name of the controller
|
||||
that is being managed by a driver.
|
||||
@ -130,12 +128,11 @@ EhciComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhciComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EFI_EHCI_H_
|
||||
#define _EFI_EHCI_H_
|
||||
|
||||
|
||||
#include <Uefi.h>
|
||||
|
||||
#include <Protocol/Usb2HostController.h>
|
||||
@ -31,7 +30,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include <IndustryStandard/Pci.h>
|
||||
|
||||
typedef struct _USB2_HC_DEV USB2_HC_DEV;
|
||||
typedef struct _USB2_HC_DEV USB2_HC_DEV;
|
||||
|
||||
#include "UsbHcMem.h"
|
||||
#include "EhciReg.h"
|
||||
@ -44,64 +43,63 @@ typedef struct _USB2_HC_DEV USB2_HC_DEV;
|
||||
// EHC timeout experience values
|
||||
//
|
||||
|
||||
#define EHC_1_MICROSECOND 1
|
||||
#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
|
||||
#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
|
||||
#define EHC_1_MICROSECOND 1
|
||||
#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
|
||||
#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
|
||||
|
||||
//
|
||||
// EHCI register operation timeout, set by experience
|
||||
//
|
||||
#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
|
||||
#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
|
||||
#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
|
||||
#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
|
||||
|
||||
//
|
||||
// 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,
|
||||
// and the unit of Async is 100us, means 1ms as interval.
|
||||
//
|
||||
#define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND)
|
||||
#define EHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1)
|
||||
#define EHC_SYNC_POLL_INTERVAL (1 * EHC_1_MILLISECOND)
|
||||
#define EHC_ASYNC_POLL_INTERVAL EFI_TIMER_PERIOD_MILLISECONDS(1)
|
||||
|
||||
//
|
||||
// EHCI debug port control status register bit definition
|
||||
//
|
||||
#define USB_DEBUG_PORT_IN_USE BIT10
|
||||
#define USB_DEBUG_PORT_ENABLE BIT28
|
||||
#define USB_DEBUG_PORT_OWNER BIT30
|
||||
#define USB_DEBUG_PORT_IN_USE_MASK (USB_DEBUG_PORT_IN_USE | \
|
||||
#define USB_DEBUG_PORT_IN_USE BIT10
|
||||
#define USB_DEBUG_PORT_ENABLE BIT28
|
||||
#define USB_DEBUG_PORT_OWNER BIT30
|
||||
#define USB_DEBUG_PORT_IN_USE_MASK (USB_DEBUG_PORT_IN_USE | \
|
||||
USB_DEBUG_PORT_OWNER)
|
||||
|
||||
//
|
||||
// EHC raises TPL to TPL_NOTIFY to serialize all its operations
|
||||
// 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_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF))
|
||||
#define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
|
||||
#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 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_REG_BIT_IS_SET(Ehc, Offset, Bit) \
|
||||
(EHC_BIT_IS_SET(EhcReadOpReg ((Ehc), (Offset)), (Bit)))
|
||||
|
||||
#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 {
|
||||
UINTN Signature;
|
||||
EFI_USB2_HC_PROTOCOL Usb2Hc;
|
||||
UINTN Signature;
|
||||
EFI_USB2_HC_PROTOCOL Usb2Hc;
|
||||
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT64 OriginalPciAttributes;
|
||||
USBHC_MEM_POOL *MemPool;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
UINT64 OriginalPciAttributes;
|
||||
USBHC_MEM_POOL *MemPool;
|
||||
|
||||
//
|
||||
// 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
|
||||
// status stage.
|
||||
//
|
||||
EHC_QTD *ShortReadStop;
|
||||
EFI_EVENT PollTimer;
|
||||
EHC_QTD *ShortReadStop;
|
||||
EFI_EVENT PollTimer;
|
||||
|
||||
//
|
||||
// ExitBootServicesEvent is used to stop the EHC DMA operation
|
||||
// after exit boot service.
|
||||
//
|
||||
EFI_EVENT ExitBootServiceEvent;
|
||||
EFI_EVENT ExitBootServiceEvent;
|
||||
|
||||
//
|
||||
// Asynchronous(bulk and control) transfer schedule data:
|
||||
// ReclaimHead is used as the head of the asynchronous transfer
|
||||
// list. It acts as the reclamation header.
|
||||
//
|
||||
EHC_QH *ReclaimHead;
|
||||
EHC_QH *ReclaimHead;
|
||||
|
||||
//
|
||||
// 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 *PeriodFrameHost; // the buffer pointed by this pointer is used to store host memory address of the QH descriptor.
|
||||
VOID *PeriodFrameMap;
|
||||
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 *PeriodFrameMap;
|
||||
|
||||
EHC_QH *PeriodOne;
|
||||
LIST_ENTRY AsyncIntTransfers;
|
||||
EHC_QH *PeriodOne;
|
||||
LIST_ENTRY AsyncIntTransfers;
|
||||
|
||||
//
|
||||
// EHCI configuration data
|
||||
//
|
||||
UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
|
||||
UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
|
||||
UINT32 CapLen; // Capability length
|
||||
UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
|
||||
UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
|
||||
UINT32 CapLen; // Capability length
|
||||
|
||||
//
|
||||
// Misc
|
||||
//
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
|
||||
//
|
||||
// EHCI debug port info
|
||||
//
|
||||
UINT16 DebugPortOffset; // The offset of debug port mmio register
|
||||
UINT8 DebugPortBarNum; // The bar number of debug port mmio register
|
||||
UINT8 DebugPortNum; // The port number of usb debug port
|
||||
UINT16 DebugPortOffset; // The offset of debug port mmio register
|
||||
UINT8 DebugPortBarNum; // The bar number of debug port mmio register
|
||||
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_COMPONENT_NAME_PROTOCOL gEhciComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
|
||||
extern EFI_DRIVER_BINDING_PROTOCOL gEhciDriverBinding;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gEhciComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
|
||||
|
||||
/**
|
||||
Test to see if this driver supports ControllerHandle. Any
|
||||
@ -181,9 +178,9 @@ extern EFI_COMPONENT_NAME2_PROTOCOL gEhciComponentName2;
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcDriverBindingSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -202,9 +199,9 @@ EhcDriverBindingSupported (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcDriverBindingStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -223,11 +220,10 @@ EhcDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
#endif
|
||||
|
||||
|
@ -8,7 +8,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Ehci.h"
|
||||
|
||||
/**
|
||||
@ -19,7 +18,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
VOID
|
||||
EhcDumpStatus (
|
||||
IN UINT32 State
|
||||
IN UINT32 State
|
||||
)
|
||||
{
|
||||
if (EHC_BIT_IS_SET (State, QTD_STAT_DO_PING)) {
|
||||
@ -57,7 +56,6 @@ EhcDumpStatus (
|
||||
DEBUG ((DEBUG_VERBOSE, "\n"));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Dump the fields of a QTD.
|
||||
|
||||
@ -67,12 +65,12 @@ EhcDumpStatus (
|
||||
**/
|
||||
VOID
|
||||
EhcDumpQtd (
|
||||
IN EHC_QTD *Qtd,
|
||||
IN CHAR8 *Msg
|
||||
IN EHC_QTD *Qtd,
|
||||
IN CHAR8 *Msg
|
||||
)
|
||||
{
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
|
||||
if (Msg != NULL) {
|
||||
DEBUG ((DEBUG_VERBOSE, Msg));
|
||||
@ -89,13 +87,10 @@ EhcDumpQtd (
|
||||
|
||||
if (QtdHw->Pid == QTD_PID_SETUP) {
|
||||
DEBUG ((DEBUG_VERBOSE, "PID : Setup\n"));
|
||||
|
||||
} else if (QtdHw->Pid == QTD_PID_INPUT) {
|
||||
DEBUG ((DEBUG_VERBOSE, "PID : IN\n"));
|
||||
|
||||
} else if (QtdHw->Pid == QTD_PID_OUTPUT) {
|
||||
DEBUG ((DEBUG_VERBOSE, "PID : OUT\n"));
|
||||
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_VERBOSE, "Error Count : %d\n", QtdHw->ErrCnt));
|
||||
@ -109,7 +104,6 @@ EhcDumpQtd (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Dump the queue head.
|
||||
|
||||
@ -120,22 +114,27 @@ EhcDumpQtd (
|
||||
**/
|
||||
VOID
|
||||
EhcDumpQh (
|
||||
IN EHC_QH *Qh,
|
||||
IN CHAR8 *Msg,
|
||||
IN BOOLEAN DumpBuf
|
||||
IN EHC_QH *Qh,
|
||||
IN CHAR8 *Msg,
|
||||
IN BOOLEAN DumpBuf
|
||||
)
|
||||
{
|
||||
EHC_QTD *Qtd;
|
||||
QH_HW *QhHw;
|
||||
LIST_ENTRY *Entry;
|
||||
UINTN Index;
|
||||
EHC_QTD *Qtd;
|
||||
QH_HW *QhHw;
|
||||
LIST_ENTRY *Entry;
|
||||
UINTN Index;
|
||||
|
||||
if (Msg != NULL) {
|
||||
DEBUG ((DEBUG_VERBOSE, Msg));
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_VERBOSE, "Queue head @ 0x%p, interval %ld, next qh %p\n",
|
||||
Qh, (UINT64)Qh->Interval, Qh->NextQh));
|
||||
DEBUG ((
|
||||
DEBUG_VERBOSE,
|
||||
"Queue head @ 0x%p, interval %ld, next qh %p\n",
|
||||
Qh,
|
||||
(UINT64)Qh->Interval,
|
||||
Qh->NextQh
|
||||
));
|
||||
|
||||
QhHw = &Qh->QhHw;
|
||||
|
||||
@ -166,10 +165,8 @@ EhcDumpQh (
|
||||
|
||||
if (QhHw->Pid == QTD_PID_SETUP) {
|
||||
DEBUG ((DEBUG_VERBOSE, "PID : Setup\n"));
|
||||
|
||||
} else if (QhHw->Pid == QTD_PID_INPUT) {
|
||||
DEBUG ((DEBUG_VERBOSE, "PID : IN\n"));
|
||||
|
||||
} else if (QhHw->Pid == QTD_PID_OUTPUT) {
|
||||
DEBUG ((DEBUG_VERBOSE, "PID : OUT\n"));
|
||||
}
|
||||
@ -196,7 +193,6 @@ EhcDumpQh (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Dump the buffer in the form of hex.
|
||||
|
||||
@ -206,15 +202,15 @@ EhcDumpQh (
|
||||
**/
|
||||
VOID
|
||||
EhcDumpBuf (
|
||||
IN UINT8 *Buf,
|
||||
IN UINTN Len
|
||||
IN UINT8 *Buf,
|
||||
IN UINTN Len
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < Len; Index++) {
|
||||
if (Index % 16 == 0) {
|
||||
DEBUG ((DEBUG_VERBOSE,"\n"));
|
||||
DEBUG ((DEBUG_VERBOSE, "\n"));
|
||||
}
|
||||
|
||||
DEBUG ((DEBUG_VERBOSE, "%02x ", Buf[Index]));
|
||||
|
@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EFI_EHCI_DEBUG_H_
|
||||
#define _EFI_EHCI_DEBUG_H_
|
||||
|
||||
|
||||
/**
|
||||
Dump the fields of a QTD.
|
||||
|
||||
@ -20,11 +19,10 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
VOID
|
||||
EhcDumpQtd (
|
||||
IN EHC_QTD *Qtd,
|
||||
IN CHAR8 *Msg
|
||||
IN EHC_QTD *Qtd,
|
||||
IN CHAR8 *Msg
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Dump the queue head.
|
||||
|
||||
@ -35,12 +33,11 @@ EhcDumpQtd (
|
||||
**/
|
||||
VOID
|
||||
EhcDumpQh (
|
||||
IN EHC_QH *Qh,
|
||||
IN CHAR8 *Msg,
|
||||
IN BOOLEAN DumpBuf
|
||||
IN EHC_QH *Qh,
|
||||
IN CHAR8 *Msg,
|
||||
IN BOOLEAN DumpBuf
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Dump the buffer in the form of hex.
|
||||
|
||||
@ -50,9 +47,8 @@ EhcDumpQh (
|
||||
**/
|
||||
VOID
|
||||
EhcDumpBuf (
|
||||
IN UINT8 *Buf,
|
||||
IN UINTN Len
|
||||
IN UINT8 *Buf,
|
||||
IN UINTN Len
|
||||
);
|
||||
|
||||
|
||||
#endif
|
||||
|
@ -7,10 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Ehci.h"
|
||||
|
||||
|
||||
/**
|
||||
Read EHCI capability register.
|
||||
|
||||
@ -23,18 +21,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
UINT32
|
||||
EhcReadCapRegister (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = Ehc->PciIo->Mem.Read (
|
||||
Ehc->PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
EHC_BAR_INDEX,
|
||||
(UINT64) Offset,
|
||||
(UINT64)Offset,
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
@ -59,12 +57,12 @@ EhcReadCapRegister (
|
||||
**/
|
||||
UINT32
|
||||
EhcReadDbgRegister (
|
||||
IN CONST USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN CONST USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = Ehc->PciIo->Mem.Read (
|
||||
Ehc->PciIo,
|
||||
@ -83,7 +81,6 @@ EhcReadDbgRegister (
|
||||
return Data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check whether the host controller has an in-use debug port.
|
||||
|
||||
@ -105,11 +102,11 @@ EhcReadDbgRegister (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsDebugPortInUse (
|
||||
IN CONST USB2_HC_DEV *Ehc,
|
||||
IN CONST UINT8 *PortNumber OPTIONAL
|
||||
IN CONST USB2_HC_DEV *Ehc,
|
||||
IN CONST UINT8 *PortNumber OPTIONAL
|
||||
)
|
||||
{
|
||||
UINT32 State;
|
||||
UINT32 State;
|
||||
|
||||
if (Ehc->DebugPortNum == 0) {
|
||||
//
|
||||
@ -121,7 +118,7 @@ EhcIsDebugPortInUse (
|
||||
//
|
||||
// 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
|
||||
// controller.
|
||||
@ -132,11 +129,10 @@ EhcIsDebugPortInUse (
|
||||
//
|
||||
// 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;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Read EHCI Operation register.
|
||||
|
||||
@ -149,12 +145,12 @@ EhcIsDebugPortInUse (
|
||||
**/
|
||||
UINT32
|
||||
EhcReadOpReg (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
|
||||
ASSERT (Ehc->CapLen != 0);
|
||||
|
||||
@ -175,7 +171,6 @@ EhcReadOpReg (
|
||||
return Data;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Write the data to the EHCI operation register.
|
||||
|
||||
@ -186,12 +181,12 @@ EhcReadOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcWriteOpReg (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
ASSERT (Ehc->CapLen != 0);
|
||||
|
||||
@ -209,7 +204,6 @@ EhcWriteOpReg (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set one bit of the operational register while keeping other bits.
|
||||
|
||||
@ -220,19 +214,18 @@ EhcWriteOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcSetOpRegBit (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
UINT32 Data;
|
||||
|
||||
Data = EhcReadOpReg (Ehc, Offset);
|
||||
Data |= Bit;
|
||||
EhcWriteOpReg (Ehc, Offset, Data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Clear one bit of the operational register while keeping other bits.
|
||||
|
||||
@ -243,19 +236,18 @@ EhcSetOpRegBit (
|
||||
**/
|
||||
VOID
|
||||
EhcClearOpRegBit (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
UINT32 Data;
|
||||
|
||||
Data = EhcReadOpReg (Ehc, Offset);
|
||||
Data &= ~Bit;
|
||||
EhcWriteOpReg (Ehc, Offset, Data);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Wait the operation register's bit as specified by Bit
|
||||
to become set (or clear).
|
||||
@ -272,14 +264,14 @@ EhcClearOpRegBit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcWaitOpRegBit (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit,
|
||||
IN BOOLEAN WaitToSet,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit,
|
||||
IN BOOLEAN WaitToSet,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) {
|
||||
if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) {
|
||||
@ -292,7 +284,6 @@ EhcWaitOpRegBit (
|
||||
return EFI_TIMEOUT;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Add support for UEFI Over Legacy (UoL) feature, stop
|
||||
the legacy USB SMI support.
|
||||
@ -302,13 +293,13 @@ EhcWaitOpRegBit (
|
||||
**/
|
||||
VOID
|
||||
EhcClearLegacySupport (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
UINT32 ExtendCap;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT32 Value;
|
||||
UINT32 TimeOut;
|
||||
UINT32 ExtendCap;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT32 Value;
|
||||
UINT32 TimeOut;
|
||||
|
||||
DEBUG ((DEBUG_INFO, "EhcClearLegacySupport: called to clear legacy support\n"));
|
||||
|
||||
@ -337,8 +328,6 @@ EhcClearLegacySupport (
|
||||
PciIo->Pci.Read (PciIo, EfiPciIoWidthUint32, ExtendCap + 0x4, 1, &Value);
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Set door bell and wait it to be ACKed by host controller.
|
||||
This function is used to synchronize with the hardware.
|
||||
@ -352,12 +341,12 @@ EhcClearLegacySupport (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcSetAndWaitDoorBell (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD);
|
||||
|
||||
@ -376,7 +365,6 @@ EhcSetAndWaitDoorBell (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Clear all the interrutp status bits, these bits
|
||||
are Write-Clean.
|
||||
@ -386,13 +374,12 @@ EhcSetAndWaitDoorBell (
|
||||
**/
|
||||
VOID
|
||||
EhcAckAllInterrupt (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Enable the periodic schedule then wait EHC to
|
||||
actually enable it.
|
||||
@ -406,11 +393,11 @@ EhcAckAllInterrupt (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcEnablePeriodSchd (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD);
|
||||
|
||||
@ -418,11 +405,6 @@ EhcEnablePeriodSchd (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Enable asynchrounous schedule.
|
||||
|
||||
@ -435,11 +417,11 @@ EhcEnablePeriodSchd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcEnableAsyncSchd (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC);
|
||||
|
||||
@ -447,12 +429,6 @@ EhcEnableAsyncSchd (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Whether Ehc is halted.
|
||||
|
||||
@ -464,13 +440,12 @@ EhcEnableAsyncSchd (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsHalt (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Whether system error occurred.
|
||||
|
||||
@ -482,13 +457,12 @@ EhcIsHalt (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsSysError (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
return EHC_REG_BIT_IS_SET (Ehc, EHC_USBSTS_OFFSET, USBSTS_SYS_ERROR);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Reset the host controller.
|
||||
|
||||
@ -501,11 +475,11 @@ EhcIsSysError (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcResetHC (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Host can only be reset when it is halt. If not so, halt it
|
||||
@ -523,7 +497,6 @@ EhcResetHC (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Halt the host controller.
|
||||
|
||||
@ -536,18 +509,17 @@ EhcResetHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcHaltHC (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
|
||||
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Set the EHCI to run.
|
||||
|
||||
@ -560,18 +532,17 @@ EhcHaltHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcRunHC (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
|
||||
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout);
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize the HC hardware.
|
||||
EHCI spec lists the five things to do to initialize the hardware:
|
||||
@ -589,12 +560,12 @@ EhcRunHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitHC (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
UINT32 RegVal;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Index;
|
||||
UINT32 RegVal;
|
||||
|
||||
// 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
|
||||
@ -629,15 +600,15 @@ EhcInitHC (
|
||||
// 3. Power up all ports if EHCI has Port Power Control (PPC) support
|
||||
//
|
||||
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
|
||||
// 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_POWER;
|
||||
EhcWriteOpReg (Ehc, (UINT32) (EHC_PORT_STAT_OFFSET + (4 * Index)), RegVal);
|
||||
EhcWriteOpReg (Ehc, (UINT32)(EHC_PORT_STAT_OFFSET + (4 * Index)), RegVal);
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -14,20 +14,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
// EHCI register offset
|
||||
//
|
||||
|
||||
|
||||
//
|
||||
// Capability register offset
|
||||
//
|
||||
#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
|
||||
#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
|
||||
#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
|
||||
#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
|
||||
#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
|
||||
#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
|
||||
|
||||
//
|
||||
// Capability register bit definition
|
||||
//
|
||||
#define HCSP_NPORTS 0x0F // Number of root hub port
|
||||
#define HCSP_PPC 0x10 // Port Power Control
|
||||
#define HCCP_64BIT 0x01 // 64-bit addressing capability
|
||||
#define HCSP_NPORTS 0x0F // Number of root hub port
|
||||
#define HCSP_PPC 0x10 // Port Power Control
|
||||
#define HCCP_64BIT 0x01 // 64-bit addressing capability
|
||||
|
||||
//
|
||||
// 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_PORT_STAT_OFFSET 0x44 // Port status/control offset
|
||||
|
||||
#define EHC_FRAME_LEN 1024
|
||||
#define EHC_FRAME_LEN 1024
|
||||
|
||||
//
|
||||
// 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_RESET 0x02 // Start the host controller reset
|
||||
#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
|
||||
#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
|
||||
#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
|
||||
#define USBCMD_RUN 0x01 // Run/stop
|
||||
#define USBCMD_RESET 0x02 // Start the host controller reset
|
||||
#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
|
||||
#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
|
||||
#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
|
||||
|
||||
#define USBSTS_IAA 0x20 // Interrupt on async advance
|
||||
#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
|
||||
#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
|
||||
#define USBSTS_HALT 0x1000 // Host controller halted
|
||||
#define USBSTS_SYS_ERROR 0x10 // Host system error
|
||||
#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
|
||||
#define USBSTS_IAA 0x20 // Interrupt on async advance
|
||||
#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
|
||||
#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
|
||||
#define USBSTS_HALT 0x1000 // Host controller halted
|
||||
#define USBSTS_SYS_ERROR 0x10 // Host system error
|
||||
#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
|
||||
// (write clean) bits in USBSTS register
|
||||
|
||||
#define PORTSC_CONN 0x01 // Current Connect Status
|
||||
#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
|
||||
#define PORTSC_ENABLED 0x04 // Port Enable / Disable
|
||||
#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
|
||||
#define PORTSC_OVERCUR 0x10 // Over current Active
|
||||
#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
|
||||
#define PORSTSC_RESUME 0x40 // Force Port Resume
|
||||
#define PORTSC_SUSPEND 0x80 // Port Suspend State
|
||||
#define PORTSC_RESET 0x100 // Port Reset
|
||||
#define PORTSC_LINESTATE_K 0x400 // Line Status K-state
|
||||
#define PORTSC_LINESTATE_J 0x800 // Line Status J-state
|
||||
#define PORTSC_POWER 0x1000 // Port Power
|
||||
#define PORTSC_OWNER 0x2000 // Port Owner
|
||||
#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
|
||||
#define PORTSC_CONN 0x01 // Current Connect Status
|
||||
#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
|
||||
#define PORTSC_ENABLED 0x04 // Port Enable / Disable
|
||||
#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
|
||||
#define PORTSC_OVERCUR 0x10 // Over current Active
|
||||
#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
|
||||
#define PORSTSC_RESUME 0x40 // Force Port Resume
|
||||
#define PORTSC_SUSPEND 0x80 // Port Suspend State
|
||||
#define PORTSC_RESET 0x100 // Port Reset
|
||||
#define PORTSC_LINESTATE_K 0x400 // Line Status K-state
|
||||
#define PORTSC_LINESTATE_J 0x800 // Line Status J-state
|
||||
#define PORTSC_POWER 0x1000 // Port Power
|
||||
#define PORTSC_OWNER 0x2000 // Port Owner
|
||||
#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
|
||||
// they are WC (write clean)
|
||||
//
|
||||
// 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
|
||||
//
|
||||
#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) \
|
||||
((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
|
||||
// UEFI's port states.
|
||||
//
|
||||
typedef struct {
|
||||
UINT16 HwState;
|
||||
UINT16 UefiState;
|
||||
UINT16 HwState;
|
||||
UINT16 UefiState;
|
||||
} USB_PORT_STATE_MAP;
|
||||
|
||||
//
|
||||
@ -109,9 +108,9 @@ typedef struct {
|
||||
//
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT8 ProgInterface;
|
||||
UINT8 SubClassCode;
|
||||
UINT8 BaseCode;
|
||||
UINT8 ProgInterface;
|
||||
UINT8 SubClassCode;
|
||||
UINT8 BaseCode;
|
||||
} USB_CLASSC;
|
||||
#pragma pack()
|
||||
|
||||
@ -126,8 +125,8 @@ typedef struct {
|
||||
**/
|
||||
UINT32
|
||||
EhcReadCapRegister (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
);
|
||||
|
||||
/**
|
||||
@ -151,8 +150,8 @@ EhcReadCapRegister (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsDebugPortInUse (
|
||||
IN CONST USB2_HC_DEV *Ehc,
|
||||
IN CONST UINT8 *PortNumber OPTIONAL
|
||||
IN CONST USB2_HC_DEV *Ehc,
|
||||
IN CONST UINT8 *PortNumber OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@ -166,11 +165,10 @@ EhcIsDebugPortInUse (
|
||||
**/
|
||||
UINT32
|
||||
EhcReadOpReg (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Write the data to the EHCI operation register.
|
||||
|
||||
@ -181,9 +179,9 @@ EhcReadOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcWriteOpReg (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
);
|
||||
|
||||
/**
|
||||
@ -196,9 +194,9 @@ EhcWriteOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcSetOpRegBit (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
);
|
||||
|
||||
/**
|
||||
@ -211,9 +209,9 @@ EhcSetOpRegBit (
|
||||
**/
|
||||
VOID
|
||||
EhcClearOpRegBit (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
);
|
||||
|
||||
/**
|
||||
@ -225,11 +223,9 @@ EhcClearOpRegBit (
|
||||
**/
|
||||
VOID
|
||||
EhcClearLegacySupport (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Set door bell and wait it to be ACKed by host controller.
|
||||
This function is used to synchronize with the hardware.
|
||||
@ -243,11 +239,10 @@ EhcClearLegacySupport (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcSetAndWaitDoorBell (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Clear all the interrutp status bits, these bits are Write-Clean.
|
||||
|
||||
@ -256,11 +251,9 @@ EhcSetAndWaitDoorBell (
|
||||
**/
|
||||
VOID
|
||||
EhcAckAllInterrupt (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Whether Ehc is halted.
|
||||
|
||||
@ -272,10 +265,9 @@ EhcAckAllInterrupt (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsHalt (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Whether system error occurred.
|
||||
|
||||
@ -287,10 +279,9 @@ EhcIsHalt (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsSysError (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Reset the host controller.
|
||||
|
||||
@ -303,11 +294,10 @@ EhcIsSysError (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcResetHC (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Halt the host controller.
|
||||
|
||||
@ -320,11 +310,10 @@ EhcResetHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcHaltHC (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Set the EHCI to run.
|
||||
|
||||
@ -337,12 +326,10 @@ EhcHaltHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcRunHC (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize the HC hardware.
|
||||
EHCI spec lists the five things to do to initialize the hardware:
|
||||
@ -360,7 +347,7 @@ EhcRunHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitHC (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include "Ehci.h"
|
||||
|
||||
|
||||
/**
|
||||
Create helper QTD/QH for the EHCI device.
|
||||
|
||||
@ -22,14 +21,14 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcCreateHelpQ (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
USB_ENDPOINT Ep;
|
||||
EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
EHC_QTD *Qtd;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
USB_ENDPOINT Ep;
|
||||
EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
EHC_QTD *Qtd;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
|
||||
//
|
||||
// Create an inactive Qtd to terminate the short packet read.
|
||||
@ -40,25 +39,25 @@ EhcCreateHelpQ (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Qtd->QtdHw.Status = QTD_STAT_HALTED;
|
||||
Ehc->ShortReadStop = Qtd;
|
||||
Qtd->QtdHw.Status = QTD_STAT_HALTED;
|
||||
Ehc->ShortReadStop = Qtd;
|
||||
|
||||
//
|
||||
// Create a QH to act as the EHC reclamation header.
|
||||
// Set the header to loopback to itself.
|
||||
//
|
||||
Ep.DevAddr = 0;
|
||||
Ep.EpAddr = 1;
|
||||
Ep.Direction = EfiUsbDataIn;
|
||||
Ep.DevSpeed = EFI_USB_SPEED_HIGH;
|
||||
Ep.MaxPacket = 64;
|
||||
Ep.HubAddr = 0;
|
||||
Ep.HubPort = 0;
|
||||
Ep.Toggle = 0;
|
||||
Ep.Type = EHC_BULK_TRANSFER;
|
||||
Ep.PollRate = 1;
|
||||
Ep.DevAddr = 0;
|
||||
Ep.EpAddr = 1;
|
||||
Ep.Direction = EfiUsbDataIn;
|
||||
Ep.DevSpeed = EFI_USB_SPEED_HIGH;
|
||||
Ep.MaxPacket = 64;
|
||||
Ep.HubAddr = 0;
|
||||
Ep.HubPort = 0;
|
||||
Ep.Toggle = 0;
|
||||
Ep.Type = EHC_BULK_TRANSFER;
|
||||
Ep.PollRate = 1;
|
||||
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
|
||||
if (Qh == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -66,7 +65,7 @@ EhcCreateHelpQ (
|
||||
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
|
||||
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->ReclaimHead = 1;
|
||||
Qh->NextQh = Qh;
|
||||
@ -75,10 +74,10 @@ EhcCreateHelpQ (
|
||||
//
|
||||
// Create a dummy QH to act as the terminator for periodical schedule
|
||||
//
|
||||
Ep.EpAddr = 2;
|
||||
Ep.Type = EHC_INT_TRANSFER_SYNC;
|
||||
Ep.EpAddr = 2;
|
||||
Ep.Type = EHC_INT_TRANSFER_SYNC;
|
||||
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
|
||||
if (Qh == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -90,7 +89,6 @@ EhcCreateHelpQ (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize the schedule data structure such as frame list.
|
||||
|
||||
@ -102,7 +100,7 @@ EhcCreateHelpQ (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitSched (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
@ -154,8 +152,8 @@ EhcInitSched (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Ehc->PeriodFrame = Buf;
|
||||
Ehc->PeriodFrameMap = Map;
|
||||
Ehc->PeriodFrame = Buf;
|
||||
Ehc->PeriodFrameMap = Map;
|
||||
|
||||
//
|
||||
// Program the FRAMELISTBASE register with the low 32 bit addr
|
||||
@ -191,13 +189,13 @@ EhcInitSched (
|
||||
//
|
||||
// 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) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
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++) {
|
||||
//
|
||||
@ -242,7 +240,6 @@ ErrorExit1:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Free the schedule data. It may be partially initialized.
|
||||
|
||||
@ -251,10 +248,10 @@ ErrorExit1:
|
||||
**/
|
||||
VOID
|
||||
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_ASYNC_HEAD_OFFSET, 0);
|
||||
@ -300,7 +297,6 @@ EhcFreeSched (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Link the queue head to the asynchronous schedule list.
|
||||
UEFI only supports one CTRL/BULK transfer at a time
|
||||
@ -314,30 +310,29 @@ EhcFreeSched (
|
||||
**/
|
||||
VOID
|
||||
EhcLinkQhToAsync (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
)
|
||||
{
|
||||
EHC_QH *Head;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
EHC_QH *Head;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
|
||||
//
|
||||
// Append the queue head after the reclaim header, then
|
||||
// fix the hardware visiable parts (EHCI R1.0 page 72).
|
||||
// ReclaimHead is always linked to the EHCI's AsynListAddr.
|
||||
//
|
||||
Head = Ehc->ReclaimHead;
|
||||
Head = Ehc->ReclaimHead;
|
||||
|
||||
Qh->NextQh = Head->NextQh;
|
||||
Head->NextQh = Qh;
|
||||
Qh->NextQh = Head->NextQh;
|
||||
Head->NextQh = Qh;
|
||||
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh->NextQh, sizeof (EHC_QH));
|
||||
Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
|
||||
Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh->NextQh, sizeof (EHC_QH));
|
||||
Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
|
||||
Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Unlink a queue head from the asynchronous schedule list.
|
||||
Need to synchronize with hardware.
|
||||
@ -348,13 +343,13 @@ EhcLinkQhToAsync (
|
||||
**/
|
||||
VOID
|
||||
EhcUnlinkQhFromAsync (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
)
|
||||
{
|
||||
EHC_QH *Head;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
EHC_QH *Head;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
|
||||
ASSERT (Ehc->ReclaimHead->NextQh == Qh);
|
||||
|
||||
@ -363,13 +358,13 @@ EhcUnlinkQhFromAsync (
|
||||
// visiable part: Only need to loopback the ReclaimHead. The Qh
|
||||
// is pointing to ReclaimHead (which is staill in the list).
|
||||
//
|
||||
Head = Ehc->ReclaimHead;
|
||||
Head = Ehc->ReclaimHead;
|
||||
|
||||
Head->NextQh = Qh->NextQh;
|
||||
Qh->NextQh = NULL;
|
||||
Head->NextQh = Qh->NextQh;
|
||||
Qh->NextQh = NULL;
|
||||
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
|
||||
Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Head->NextQh, sizeof (EHC_QH));
|
||||
Head->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
|
||||
//
|
||||
// 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
|
||||
schedule frame list. This code is very much the same as
|
||||
@ -393,23 +387,23 @@ EhcUnlinkQhFromAsync (
|
||||
**/
|
||||
VOID
|
||||
EhcLinkQhToPeriod (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
EHC_QH *Prev;
|
||||
EHC_QH *Next;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
UINTN Index;
|
||||
EHC_QH *Prev;
|
||||
EHC_QH *Next;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
|
||||
for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {
|
||||
//
|
||||
// First QH can't be NULL because we always keep PeriodOne
|
||||
// heads on the frame list
|
||||
//
|
||||
ASSERT (!EHC_LINK_TERMINATED (((UINT32*)Ehc->PeriodFrame)[Index]));
|
||||
Next = (EHC_QH*)((UINTN*)Ehc->PeriodFrameHost)[Index];
|
||||
Prev = NULL;
|
||||
ASSERT (!EHC_LINK_TERMINATED (((UINT32 *)Ehc->PeriodFrame)[Index]));
|
||||
Next = (EHC_QH *)((UINTN *)Ehc->PeriodFrameHost)[Index];
|
||||
Prev = NULL;
|
||||
|
||||
//
|
||||
// Now, insert the queue head (Qh) into this frame:
|
||||
@ -422,8 +416,8 @@ EhcLinkQhToPeriod (
|
||||
// Then, insert the Qh between then
|
||||
//
|
||||
while (Next->Interval > Qh->Interval) {
|
||||
Prev = Next;
|
||||
Next = Next->NextQh;
|
||||
Prev = Next;
|
||||
Next = Next->NextQh;
|
||||
}
|
||||
|
||||
ASSERT (Next != NULL);
|
||||
@ -449,15 +443,15 @@ EhcLinkQhToPeriod (
|
||||
//
|
||||
ASSERT ((Index == 0) && (Qh->NextQh == NULL));
|
||||
|
||||
Prev = Next;
|
||||
Next = Next->NextQh;
|
||||
Prev = Next;
|
||||
Next = Next->NextQh;
|
||||
|
||||
Qh->NextQh = Next;
|
||||
Prev->NextQh = Qh;
|
||||
Qh->NextQh = Next;
|
||||
Prev->NextQh = Qh;
|
||||
|
||||
Qh->QhHw.HorizonLink = Prev->QhHw.HorizonLink;
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
|
||||
Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
Qh->QhHw.HorizonLink = Prev->QhHw.HorizonLink;
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
|
||||
Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
break;
|
||||
}
|
||||
|
||||
@ -467,24 +461,23 @@ EhcLinkQhToPeriod (
|
||||
// guarranted by 2^n polling interval.
|
||||
//
|
||||
if (Qh->NextQh == NULL) {
|
||||
Qh->NextQh = Next;
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Next, sizeof (EHC_QH));
|
||||
Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
Qh->NextQh = Next;
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Next, sizeof (EHC_QH));
|
||||
Qh->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
}
|
||||
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Qh, sizeof (EHC_QH));
|
||||
|
||||
if (Prev == NULL) {
|
||||
((UINT32*)Ehc->PeriodFrame)[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
((UINTN*)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh;
|
||||
((UINT32 *)Ehc->PeriodFrame)[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
((UINTN *)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh;
|
||||
} else {
|
||||
Prev->NextQh = Qh;
|
||||
Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
Prev->NextQh = Qh;
|
||||
Prev->QhHw.HorizonLink = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Unlink an interrupt queue head from the periodic
|
||||
schedule frame list.
|
||||
@ -495,30 +488,30 @@ EhcLinkQhToPeriod (
|
||||
**/
|
||||
VOID
|
||||
EhcUnlinkQhFromPeriod (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
EHC_QH *Prev;
|
||||
EHC_QH *This;
|
||||
UINTN Index;
|
||||
EHC_QH *Prev;
|
||||
EHC_QH *This;
|
||||
|
||||
for (Index = 0; Index < EHC_FRAME_LEN; Index += Qh->Interval) {
|
||||
//
|
||||
// Frame link can't be NULL because we always keep PeroidOne
|
||||
// on the frame list
|
||||
//
|
||||
ASSERT (!EHC_LINK_TERMINATED (((UINT32*)Ehc->PeriodFrame)[Index]));
|
||||
This = (EHC_QH*)((UINTN*)Ehc->PeriodFrameHost)[Index];
|
||||
Prev = NULL;
|
||||
ASSERT (!EHC_LINK_TERMINATED (((UINT32 *)Ehc->PeriodFrame)[Index]));
|
||||
This = (EHC_QH *)((UINTN *)Ehc->PeriodFrameHost)[Index];
|
||||
Prev = NULL;
|
||||
|
||||
//
|
||||
// Walk through the frame's QH list to find the
|
||||
// queue head to remove
|
||||
//
|
||||
while ((This != NULL) && (This != Qh)) {
|
||||
Prev = This;
|
||||
This = This->NextQh;
|
||||
Prev = This;
|
||||
This = This->NextQh;
|
||||
}
|
||||
|
||||
//
|
||||
@ -533,16 +526,15 @@ EhcUnlinkQhFromPeriod (
|
||||
//
|
||||
// Qh is the first entry in the frame
|
||||
//
|
||||
((UINT32*)Ehc->PeriodFrame)[Index] = Qh->QhHw.HorizonLink;
|
||||
((UINTN*)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh->NextQh;
|
||||
((UINT32 *)Ehc->PeriodFrame)[Index] = Qh->QhHw.HorizonLink;
|
||||
((UINTN *)Ehc->PeriodFrameHost)[Index] = (UINTN)Qh->NextQh;
|
||||
} else {
|
||||
Prev->NextQh = Qh->NextQh;
|
||||
Prev->QhHw.HorizonLink = Qh->QhHw.HorizonLink;
|
||||
Prev->NextQh = Qh->NextQh;
|
||||
Prev->QhHw.HorizonLink = Qh->QhHw.HorizonLink;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Check the URB's execution result and update the URB's
|
||||
result accordingly.
|
||||
@ -555,23 +547,23 @@ EhcUnlinkQhFromPeriod (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcCheckUrbResult (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINT8 State;
|
||||
BOOLEAN Finished;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
LIST_ENTRY *Entry;
|
||||
EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINT8 State;
|
||||
BOOLEAN Finished;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
|
||||
ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));
|
||||
|
||||
Finished = TRUE;
|
||||
Urb->Completed = 0;
|
||||
Finished = TRUE;
|
||||
Urb->Completed = 0;
|
||||
|
||||
Urb->Result = EFI_USB_NOERROR;
|
||||
Urb->Result = EFI_USB_NOERROR;
|
||||
|
||||
if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
|
||||
Urb->Result |= EFI_USB_ERR_SYSTEM;
|
||||
@ -581,7 +573,7 @@ EhcCheckUrbResult (
|
||||
BASE_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) {
|
||||
Qtd = EFI_LIST_CONTAINER (Entry, EHC_QTD, QtdList);
|
||||
QtdHw = &Qtd->QtdHw;
|
||||
State = (UINT8) QtdHw->Status;
|
||||
State = (UINT8)QtdHw->Status;
|
||||
|
||||
if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) {
|
||||
//
|
||||
@ -606,7 +598,6 @@ EhcCheckUrbResult (
|
||||
|
||||
Finished = TRUE;
|
||||
goto ON_EXIT;
|
||||
|
||||
} else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) {
|
||||
//
|
||||
// The QTD is still active, no need to check furthur.
|
||||
@ -615,7 +606,6 @@ EhcCheckUrbResult (
|
||||
|
||||
Finished = FALSE;
|
||||
goto ON_EXIT;
|
||||
|
||||
} else {
|
||||
//
|
||||
// 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
|
||||
// a race condition that DT is wrong.
|
||||
//
|
||||
Urb->DataToggle = (UINT8) Urb->Qh->QhHw.DataToggle;
|
||||
Urb->DataToggle = (UINT8)Urb->Qh->QhHw.DataToggle;
|
||||
|
||||
return Finished;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Execute the transfer by polling the URB. This is a synchronous operation.
|
||||
|
||||
@ -677,16 +666,16 @@ ON_EXIT:
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcExecTransfer (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
UINTN Loop;
|
||||
BOOLEAN Finished;
|
||||
BOOLEAN InfiniteLoop;
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
UINTN Loop;
|
||||
BOOLEAN Finished;
|
||||
BOOLEAN InfiniteLoop;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Loop = TimeOut * EHC_1_MILLISECOND;
|
||||
@ -717,7 +706,6 @@ EhcExecTransfer (
|
||||
EhcDumpQh (Urb->Qh, NULL, FALSE);
|
||||
|
||||
Status = EFI_TIMEOUT;
|
||||
|
||||
} else if (Urb->Result != EFI_USB_NOERROR) {
|
||||
DEBUG ((DEBUG_ERROR, "EhcExecTransfer: transfer failed with %x\n", Urb->Result));
|
||||
EhcDumpQh (Urb->Qh, NULL, FALSE);
|
||||
@ -728,7 +716,6 @@ EhcExecTransfer (
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Delete a single asynchronous interrupt transfer for
|
||||
the device and endpoint.
|
||||
@ -744,10 +731,10 @@ EhcExecTransfer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhciDelAsyncIntTransfer (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpNum,
|
||||
OUT UINT8 *DataToggle
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpNum,
|
||||
OUT UINT8 *DataToggle
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
@ -762,7 +749,8 @@ EhciDelAsyncIntTransfer (
|
||||
Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
|
||||
|
||||
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
|
||||
// from the associated queue head.
|
||||
@ -782,7 +770,6 @@ EhciDelAsyncIntTransfer (
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Remove all the asynchronous interrutp transfers.
|
||||
|
||||
@ -791,12 +778,12 @@ EhciDelAsyncIntTransfer (
|
||||
**/
|
||||
VOID
|
||||
EhciDelAllAsyncIntTransfers (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
URB *Urb;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
URB *Urb;
|
||||
|
||||
BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
|
||||
Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
|
||||
@ -830,21 +817,21 @@ EhciDelAllAsyncIntTransfers (
|
||||
**/
|
||||
URB *
|
||||
EhciInsertAsyncIntTransfer (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
)
|
||||
{
|
||||
VOID *Data;
|
||||
URB *Urb;
|
||||
VOID *Data;
|
||||
URB *Urb;
|
||||
|
||||
Data = AllocatePool (DataLen);
|
||||
|
||||
@ -899,16 +886,16 @@ EhciInsertAsyncIntTransfer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcFlushAsyncIntMap (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINTN Len;
|
||||
VOID *Map;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINTN Len;
|
||||
VOID *Map;
|
||||
|
||||
PciIo = Ehc->PciIo;
|
||||
Len = Urb->DataLen;
|
||||
@ -931,15 +918,14 @@ EhcFlushAsyncIntMap (
|
||||
goto ON_ERROR;
|
||||
}
|
||||
|
||||
Urb->DataPhy = (VOID *) ((UINTN) PhyAddr);
|
||||
Urb->DataMap = Map;
|
||||
Urb->DataPhy = (VOID *)((UINTN)PhyAddr);
|
||||
Urb->DataMap = Map;
|
||||
return EFI_SUCCESS;
|
||||
|
||||
ON_ERROR:
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Update the queue head for next round of asynchronous transfer.
|
||||
|
||||
@ -949,17 +935,17 @@ ON_ERROR:
|
||||
**/
|
||||
VOID
|
||||
EhcUpdateAsyncRequest (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
EHC_QTD *FirstQtd;
|
||||
QH_HW *QhHw;
|
||||
EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
LIST_ENTRY *Entry;
|
||||
EHC_QTD *FirstQtd;
|
||||
QH_HW *QhHw;
|
||||
EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
EFI_PHYSICAL_ADDRESS PciAddr;
|
||||
|
||||
Qtd = NULL;
|
||||
|
||||
@ -985,13 +971,13 @@ EhcUpdateAsyncRequest (
|
||||
QtdHw->Status = QTD_STAT_ACTIVE;
|
||||
QtdHw->ErrCnt = QTD_MAX_ERR;
|
||||
QtdHw->CurPage = 0;
|
||||
QtdHw->TotalBytes = (UINT32) Qtd->DataLen;
|
||||
QtdHw->TotalBytes = (UINT32)Qtd->DataLen;
|
||||
//
|
||||
// calculate physical address by offset.
|
||||
//
|
||||
PciAddr = (UINTN)Urb->DataPhy + ((UINTN)Qtd->Data - (UINTN)Urb->Data);
|
||||
QtdHw->Page[0] = EHC_LOW_32BIT (PciAddr);
|
||||
QtdHw->PageHigh[0]= EHC_HIGH_32BIT (PciAddr);
|
||||
PciAddr = (UINTN)Urb->DataPhy + ((UINTN)Qtd->Data - (UINTN)Urb->Data);
|
||||
QtdHw->Page[0] = EHC_LOW_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
|
||||
// QTD. DateToggle bit is left untouched.
|
||||
//
|
||||
QhHw = &Urb->Qh->QhHw;
|
||||
QhHw->CurQtd = QTD_LINK (0, TRUE);
|
||||
QhHw->AltQtd = 0;
|
||||
QhHw = &Urb->Qh->QhHw;
|
||||
QhHw->CurQtd = QTD_LINK (0, TRUE);
|
||||
QhHw->AltQtd = 0;
|
||||
|
||||
QhHw->Status = 0;
|
||||
QhHw->Pid = 0;
|
||||
QhHw->ErrCnt = 0;
|
||||
QhHw->CurPage = 0;
|
||||
QhHw->Ioc = 0;
|
||||
QhHw->TotalBytes = 0;
|
||||
QhHw->Status = 0;
|
||||
QhHw->Pid = 0;
|
||||
QhHw->ErrCnt = 0;
|
||||
QhHw->CurPage = 0;
|
||||
QhHw->Ioc = 0;
|
||||
QhHw->TotalBytes = 0;
|
||||
|
||||
for (Index = 0; Index < 5; Index++) {
|
||||
QhHw->Page[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);
|
||||
}
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Interrupt transfer periodic check handler.
|
||||
|
||||
@ -1034,21 +1019,21 @@ EhcUpdateAsyncRequest (
|
||||
VOID
|
||||
EFIAPI
|
||||
EhcMonitorAsyncRequests (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
USB2_HC_DEV *Ehc;
|
||||
EFI_TPL OldTpl;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
BOOLEAN Finished;
|
||||
UINT8 *ProcBuf;
|
||||
URB *Urb;
|
||||
EFI_STATUS Status;
|
||||
USB2_HC_DEV *Ehc;
|
||||
EFI_TPL OldTpl;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
BOOLEAN Finished;
|
||||
UINT8 *ProcBuf;
|
||||
URB *Urb;
|
||||
EFI_STATUS Status;
|
||||
|
||||
OldTpl = gBS->RaiseTPL (EHC_TPL);
|
||||
Ehc = (USB2_HC_DEV *) Context;
|
||||
OldTpl = gBS->RaiseTPL (EHC_TPL);
|
||||
Ehc = (USB2_HC_DEV *)Context;
|
||||
|
||||
BASE_LIST_FOR_EACH_SAFE (Entry, Next, &Ehc->AsyncIntTransfers) {
|
||||
Urb = EFI_LIST_CONTAINER (Entry, URB, UrbList);
|
||||
@ -1113,7 +1098,7 @@ EhcMonitorAsyncRequests (
|
||||
// his callback. Some drivers may has a lower TPL restriction.
|
||||
//
|
||||
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);
|
||||
}
|
||||
|
||||
|
@ -10,7 +10,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EFI_EHCI_SCHED_H_
|
||||
#define _EFI_EHCI_SCHED_H_
|
||||
|
||||
|
||||
/**
|
||||
Initialize the schedule data structure such as frame list.
|
||||
|
||||
@ -22,10 +21,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitSched (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Free the schedule data. It may be partially initialized.
|
||||
|
||||
@ -34,10 +32,9 @@ EhcInitSched (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeSched (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Link the queue head to the asynchronous schedule list.
|
||||
UEFI only supports one CTRL/BULK transfer at a time
|
||||
@ -51,11 +48,10 @@ EhcFreeSched (
|
||||
**/
|
||||
VOID
|
||||
EhcLinkQhToAsync (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Unlink a queue head from the asynchronous schedule list.
|
||||
Need to synchronize with hardware.
|
||||
@ -66,11 +62,10 @@ EhcLinkQhToAsync (
|
||||
**/
|
||||
VOID
|
||||
EhcUnlinkQhFromAsync (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Link a queue head for interrupt transfer to the periodic
|
||||
schedule frame list. This code is very much the same as
|
||||
@ -82,11 +77,10 @@ EhcUnlinkQhFromAsync (
|
||||
**/
|
||||
VOID
|
||||
EhcLinkQhToPeriod (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Unlink an interrupt queue head from the periodic
|
||||
schedule frame list.
|
||||
@ -97,12 +91,10 @@ EhcLinkQhToPeriod (
|
||||
**/
|
||||
VOID
|
||||
EhcUnlinkQhFromPeriod (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN EHC_QH *Qh
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Execute the transfer by polling the URB. This is a synchronous operation.
|
||||
|
||||
@ -117,12 +109,11 @@ EhcUnlinkQhFromPeriod (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcExecTransfer (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Delete a single asynchronous interrupt transfer for
|
||||
the device and endpoint.
|
||||
@ -138,13 +129,12 @@ EhcExecTransfer (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhciDelAsyncIntTransfer (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpNum,
|
||||
OUT UINT8 *DataToggle
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpNum,
|
||||
OUT UINT8 *DataToggle
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Remove all the asynchronous interrutp transfers.
|
||||
|
||||
@ -153,7 +143,7 @@ EhciDelAsyncIntTransfer (
|
||||
**/
|
||||
VOID
|
||||
EhciDelAllAsyncIntTransfers (
|
||||
IN USB2_HC_DEV *Ehc
|
||||
IN USB2_HC_DEV *Ehc
|
||||
);
|
||||
|
||||
/**
|
||||
@ -177,17 +167,17 @@ EhciDelAllAsyncIntTransfers (
|
||||
**/
|
||||
URB *
|
||||
EhciInsertAsyncIntTransfer (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
);
|
||||
|
||||
/**
|
||||
@ -200,8 +190,8 @@ EhciInsertAsyncIntTransfer (
|
||||
VOID
|
||||
EFIAPI
|
||||
EhcMonitorAsyncRequests (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
#include "Ehci.h"
|
||||
|
||||
|
||||
/**
|
||||
Create a single QTD to hold the data.
|
||||
|
||||
@ -28,20 +27,20 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
EHC_QTD *
|
||||
EhcCreateQtd (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINT8 *DataPhy,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINT8 *DataPhy,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
)
|
||||
{
|
||||
EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
UINTN Len;
|
||||
UINTN ThisBufLen;
|
||||
EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
UINTN Len;
|
||||
UINTN ThisBufLen;
|
||||
|
||||
ASSERT (Ehc != NULL);
|
||||
|
||||
@ -51,9 +50,9 @@ EhcCreateQtd (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Qtd->Signature = EHC_QTD_SIG;
|
||||
Qtd->Data = Data;
|
||||
Qtd->DataLen = 0;
|
||||
Qtd->Signature = EHC_QTD_SIG;
|
||||
Qtd->Data = Data;
|
||||
Qtd->DataLen = 0;
|
||||
|
||||
InitializeListHead (&Qtd->QtdList);
|
||||
|
||||
@ -79,18 +78,18 @@ EhcCreateQtd (
|
||||
// compute the offset and clear Reserved fields. This is already
|
||||
// done in the data point.
|
||||
//
|
||||
QtdHw->Page[Index] = EHC_LOW_32BIT (DataPhy);
|
||||
QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (DataPhy);
|
||||
QtdHw->Page[Index] = EHC_LOW_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) {
|
||||
Len = DataLen;
|
||||
break;
|
||||
}
|
||||
|
||||
Len += ThisBufLen;
|
||||
Data += ThisBufLen;
|
||||
Len += ThisBufLen;
|
||||
Data += ThisBufLen;
|
||||
DataPhy += ThisBufLen;
|
||||
}
|
||||
|
||||
@ -104,15 +103,13 @@ EhcCreateQtd (
|
||||
Len = Len - Len % MaxPacket;
|
||||
}
|
||||
|
||||
QtdHw->TotalBytes = (UINT32) Len;
|
||||
QtdHw->TotalBytes = (UINT32)Len;
|
||||
Qtd->DataLen = Len;
|
||||
}
|
||||
|
||||
return Qtd;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize the queue head for interrupt transfer,
|
||||
that is, initialize the following three fields:
|
||||
@ -126,8 +123,8 @@ EhcCreateQtd (
|
||||
**/
|
||||
VOID
|
||||
EhcInitIntQh (
|
||||
IN USB_ENDPOINT *Ep,
|
||||
IN QH_HW *QhHw
|
||||
IN USB_ENDPOINT *Ep,
|
||||
IN QH_HW *QhHw
|
||||
)
|
||||
{
|
||||
//
|
||||
@ -139,7 +136,7 @@ EhcInitIntQh (
|
||||
//
|
||||
if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) {
|
||||
QhHw->SMask = QH_MICROFRAME_0;
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
@ -157,8 +154,6 @@ EhcInitIntQh (
|
||||
QhHw->CMask = QH_MICROFRAME_3 | QH_MICROFRAME_4 | QH_MICROFRAME_5;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Allocate and initialize a EHCI queue head.
|
||||
|
||||
@ -170,12 +165,12 @@ EhcInitIntQh (
|
||||
**/
|
||||
EHC_QH *
|
||||
EhcCreateQh (
|
||||
IN USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
IN USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
)
|
||||
{
|
||||
EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
|
||||
Qh = UsbHcAllocateMem (Ehci->MemPool, sizeof (EHC_QH));
|
||||
|
||||
@ -183,68 +178,68 @@ EhcCreateQh (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Qh->Signature = EHC_QH_SIG;
|
||||
Qh->NextQh = NULL;
|
||||
Qh->Interval = Ep->PollRate;
|
||||
Qh->Signature = EHC_QH_SIG;
|
||||
Qh->NextQh = NULL;
|
||||
Qh->Interval = Ep->PollRate;
|
||||
|
||||
InitializeListHead (&Qh->Qtds);
|
||||
|
||||
QhHw = &Qh->QhHw;
|
||||
QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
|
||||
QhHw->DeviceAddr = Ep->DevAddr;
|
||||
QhHw->Inactive = 0;
|
||||
QhHw->EpNum = Ep->EpAddr;
|
||||
QhHw->EpSpeed = Ep->DevSpeed;
|
||||
QhHw->DtCtrl = 0;
|
||||
QhHw->ReclaimHead = 0;
|
||||
QhHw->MaxPacketLen = (UINT32) Ep->MaxPacket;
|
||||
QhHw->CtrlEp = 0;
|
||||
QhHw->NakReload = QH_NAK_RELOAD;
|
||||
QhHw->HubAddr = Ep->HubAddr;
|
||||
QhHw->PortNum = Ep->HubPort;
|
||||
QhHw->Multiplier = 1;
|
||||
QhHw->DataToggle = Ep->Toggle;
|
||||
QhHw = &Qh->QhHw;
|
||||
QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
|
||||
QhHw->DeviceAddr = Ep->DevAddr;
|
||||
QhHw->Inactive = 0;
|
||||
QhHw->EpNum = Ep->EpAddr;
|
||||
QhHw->EpSpeed = Ep->DevSpeed;
|
||||
QhHw->DtCtrl = 0;
|
||||
QhHw->ReclaimHead = 0;
|
||||
QhHw->MaxPacketLen = (UINT32)Ep->MaxPacket;
|
||||
QhHw->CtrlEp = 0;
|
||||
QhHw->NakReload = QH_NAK_RELOAD;
|
||||
QhHw->HubAddr = Ep->HubAddr;
|
||||
QhHw->PortNum = Ep->HubPort;
|
||||
QhHw->Multiplier = 1;
|
||||
QhHw->DataToggle = Ep->Toggle;
|
||||
|
||||
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
QhHw->Status |= QTD_STAT_DO_SS;
|
||||
}
|
||||
|
||||
switch (Ep->Type) {
|
||||
case EHC_CTRL_TRANSFER:
|
||||
//
|
||||
// Special initialization for the control transfer:
|
||||
// 1. Control transfer initialize data toggle from each QTD
|
||||
// 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
|
||||
//
|
||||
QhHw->DtCtrl = 1;
|
||||
case EHC_CTRL_TRANSFER:
|
||||
//
|
||||
// Special initialization for the control transfer:
|
||||
// 1. Control transfer initialize data toggle from each QTD
|
||||
// 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
|
||||
//
|
||||
QhHw->DtCtrl = 1;
|
||||
|
||||
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
QhHw->CtrlEp = 1;
|
||||
}
|
||||
break;
|
||||
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
QhHw->CtrlEp = 1;
|
||||
}
|
||||
|
||||
case EHC_INT_TRANSFER_ASYNC:
|
||||
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;
|
||||
break;
|
||||
|
||||
case EHC_BULK_TRANSFER:
|
||||
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
|
||||
QhHw->Status |= QTD_STAT_DO_PING;
|
||||
}
|
||||
case EHC_INT_TRANSFER_ASYNC:
|
||||
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;
|
||||
|
||||
break;
|
||||
case EHC_BULK_TRANSFER:
|
||||
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
|
||||
QhHw->Status |= QTD_STAT_DO_PING;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return Qh;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Convert the poll interval from application to that
|
||||
be used by EHCI interface data structure. Only need
|
||||
@ -260,10 +255,10 @@ EhcCreateQh (
|
||||
**/
|
||||
UINTN
|
||||
EhcConvertPollRate (
|
||||
IN UINTN Interval
|
||||
IN UINTN Interval
|
||||
)
|
||||
{
|
||||
UINTN BitCount;
|
||||
UINTN BitCount;
|
||||
|
||||
if (Interval == 0) {
|
||||
return 1;
|
||||
@ -282,7 +277,6 @@ EhcConvertPollRate (
|
||||
return (UINTN)1 << (BitCount - 1);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Free a list of QTDs.
|
||||
|
||||
@ -292,13 +286,13 @@ EhcConvertPollRate (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeQtds (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN LIST_ENTRY *Qtds
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN LIST_ENTRY *Qtds
|
||||
)
|
||||
{
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
EHC_QTD *Qtd;
|
||||
LIST_ENTRY *Entry;
|
||||
LIST_ENTRY *Next;
|
||||
EHC_QTD *Qtd;
|
||||
|
||||
BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {
|
||||
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.
|
||||
|
||||
@ -318,11 +311,11 @@ EhcFreeQtds (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeUrb (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
|
||||
PciIo = Ehc->PciIo;
|
||||
|
||||
@ -346,7 +339,6 @@ EhcFreeUrb (
|
||||
gBS->FreePool (Urb);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Create a list of QTDs for the URB.
|
||||
|
||||
@ -359,21 +351,21 @@ EhcFreeUrb (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcCreateQtds (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
)
|
||||
{
|
||||
USB_ENDPOINT *Ep;
|
||||
EHC_QH *Qh;
|
||||
EHC_QTD *Qtd;
|
||||
EHC_QTD *StatusQtd;
|
||||
EHC_QTD *NextQtd;
|
||||
LIST_ENTRY *Entry;
|
||||
UINT32 AlterNext;
|
||||
UINT8 Toggle;
|
||||
UINTN Len;
|
||||
UINT8 Pid;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
USB_ENDPOINT *Ep;
|
||||
EHC_QH *Qh;
|
||||
EHC_QTD *Qtd;
|
||||
EHC_QTD *StatusQtd;
|
||||
EHC_QTD *NextQtd;
|
||||
LIST_ENTRY *Entry;
|
||||
UINT32 AlterNext;
|
||||
UINT8 Toggle;
|
||||
UINTN Len;
|
||||
UINT8 Pid;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
|
||||
ASSERT ((Urb != NULL) && (Urb->Qh != NULL));
|
||||
|
||||
@ -389,7 +381,7 @@ EhcCreateQtds (
|
||||
StatusQtd = NULL;
|
||||
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) {
|
||||
AlterNext = QTD_LINK (PhyAddr, FALSE);
|
||||
}
|
||||
@ -448,8 +440,8 @@ EhcCreateQtds (
|
||||
while (Len < Urb->DataLen) {
|
||||
Qtd = EhcCreateQtd (
|
||||
Ehc,
|
||||
(UINT8 *) Urb->Data + Len,
|
||||
(UINT8 *) Urb->DataPhy + Len,
|
||||
(UINT8 *)Urb->Data + Len,
|
||||
(UINT8 *)Urb->DataPhy + Len,
|
||||
Urb->DataLen - Len,
|
||||
Pid,
|
||||
Toggle,
|
||||
@ -467,7 +459,7 @@ EhcCreateQtds (
|
||||
// Switch the Toggle bit if odd number of packets are included in the QTD.
|
||||
//
|
||||
if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) {
|
||||
Toggle = (UINT8) (1 - Toggle);
|
||||
Toggle = (UINT8)(1 - Toggle);
|
||||
}
|
||||
|
||||
Len += Qtd->DataLen;
|
||||
@ -493,17 +485,17 @@ EhcCreateQtds (
|
||||
break;
|
||||
}
|
||||
|
||||
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, EHC_QTD, QtdList);
|
||||
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
|
||||
Qtd->QtdHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
|
||||
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, EHC_QTD, QtdList);
|
||||
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
|
||||
Qtd->QtdHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// Link the QTDs to the queue head
|
||||
//
|
||||
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, EHC_QTD, QtdList);
|
||||
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
|
||||
Qh->QhHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
|
||||
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, EHC_QTD, QtdList);
|
||||
PhyAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, NextQtd, sizeof (EHC_QTD));
|
||||
Qh->QhHw.NextQtd = QTD_LINK (PhyAddr, FALSE);
|
||||
return EFI_SUCCESS;
|
||||
|
||||
ON_ERROR:
|
||||
@ -511,7 +503,6 @@ ON_ERROR:
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Create a new URB and its associated QTD.
|
||||
|
||||
@ -535,30 +526,30 @@ ON_ERROR:
|
||||
**/
|
||||
URB *
|
||||
EhcCreateUrb (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
)
|
||||
{
|
||||
USB_ENDPOINT *Ep;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINTN Len;
|
||||
URB *Urb;
|
||||
VOID *Map;
|
||||
USB_ENDPOINT *Ep;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
EFI_PCI_IO_PROTOCOL_OPERATION MapOp;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_STATUS Status;
|
||||
UINTN Len;
|
||||
URB *Urb;
|
||||
VOID *Map;
|
||||
|
||||
Urb = AllocateZeroPool (sizeof (URB));
|
||||
|
||||
@ -566,38 +557,38 @@ EhcCreateUrb (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Urb->Signature = EHC_URB_SIG;
|
||||
Urb->Signature = EHC_URB_SIG;
|
||||
InitializeListHead (&Urb->UrbList);
|
||||
|
||||
Ep = &Urb->Ep;
|
||||
Ep->DevAddr = DevAddr;
|
||||
Ep->EpAddr = (UINT8) (EpAddr & 0x0F);
|
||||
Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
|
||||
Ep->DevSpeed = DevSpeed;
|
||||
Ep->MaxPacket = MaxPacket;
|
||||
Ep = &Urb->Ep;
|
||||
Ep->DevAddr = DevAddr;
|
||||
Ep->EpAddr = (UINT8)(EpAddr & 0x0F);
|
||||
Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
|
||||
Ep->DevSpeed = DevSpeed;
|
||||
Ep->MaxPacket = MaxPacket;
|
||||
|
||||
Ep->HubAddr = 0;
|
||||
Ep->HubPort = 0;
|
||||
Ep->HubAddr = 0;
|
||||
Ep->HubPort = 0;
|
||||
|
||||
if (DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
ASSERT (Hub != NULL);
|
||||
|
||||
Ep->HubAddr = Hub->TranslatorHubAddress;
|
||||
Ep->HubPort = Hub->TranslatorPortNumber;
|
||||
Ep->HubAddr = Hub->TranslatorHubAddress;
|
||||
Ep->HubPort = Hub->TranslatorPortNumber;
|
||||
}
|
||||
|
||||
Ep->Toggle = Toggle;
|
||||
Ep->Type = Type;
|
||||
Ep->PollRate = EhcConvertPollRate (Interval);
|
||||
Ep->Toggle = Toggle;
|
||||
Ep->Type = Type;
|
||||
Ep->PollRate = EhcConvertPollRate (Interval);
|
||||
|
||||
Urb->Request = Request;
|
||||
Urb->Data = Data;
|
||||
Urb->DataLen = DataLen;
|
||||
Urb->Callback = Callback;
|
||||
Urb->Context = Context;
|
||||
Urb->Request = Request;
|
||||
Urb->Data = Data;
|
||||
Urb->DataLen = DataLen;
|
||||
Urb->Callback = Callback;
|
||||
Urb->Context = Context;
|
||||
|
||||
PciIo = Ehc->PciIo;
|
||||
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
|
||||
PciIo = Ehc->PciIo;
|
||||
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
|
||||
|
||||
if (Urb->Qh == NULL) {
|
||||
goto ON_ERROR;
|
||||
@ -607,20 +598,20 @@ EhcCreateUrb (
|
||||
// Map the request and user data
|
||||
//
|
||||
if (Request != NULL) {
|
||||
Len = sizeof (EFI_USB_DEVICE_REQUEST);
|
||||
MapOp = EfiPciIoOperationBusMasterRead;
|
||||
Status = PciIo->Map (PciIo, MapOp, Request, &Len, &PhyAddr, &Map);
|
||||
Len = sizeof (EFI_USB_DEVICE_REQUEST);
|
||||
MapOp = EfiPciIoOperationBusMasterRead;
|
||||
Status = PciIo->Map (PciIo, MapOp, Request, &Len, &PhyAddr, &Map);
|
||||
|
||||
if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) {
|
||||
goto ON_ERROR;
|
||||
}
|
||||
|
||||
Urb->RequestPhy = (VOID *) ((UINTN) PhyAddr);
|
||||
Urb->RequestPhy = (VOID *)((UINTN)PhyAddr);
|
||||
Urb->RequestMap = Map;
|
||||
}
|
||||
|
||||
if (Data != NULL) {
|
||||
Len = DataLen;
|
||||
Len = DataLen;
|
||||
|
||||
if (Ep->Direction == EfiUsbDataIn) {
|
||||
MapOp = EfiPciIoOperationBusMasterWrite;
|
||||
@ -628,14 +619,14 @@ EhcCreateUrb (
|
||||
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)) {
|
||||
goto ON_ERROR;
|
||||
}
|
||||
|
||||
Urb->DataPhy = (VOID *) ((UINTN) PhyAddr);
|
||||
Urb->DataMap = Map;
|
||||
Urb->DataPhy = (VOID *)((UINTN)PhyAddr);
|
||||
Urb->DataMap = Map;
|
||||
}
|
||||
|
||||
Status = EhcCreateQtds (Ehc, Urb);
|
||||
|
@ -11,7 +11,6 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EFI_EHCI_URB_H_
|
||||
#define _EFI_EHCI_URB_H_
|
||||
|
||||
|
||||
typedef struct _EHC_QTD EHC_QTD;
|
||||
typedef struct _EHC_QH EHC_QH;
|
||||
typedef struct _URB URB;
|
||||
@ -24,51 +23,51 @@ typedef struct _URB URB;
|
||||
#define EHC_INT_TRANSFER_SYNC 0x04
|
||||
#define EHC_INT_TRANSFER_ASYNC 0x08
|
||||
|
||||
#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
|
||||
#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
|
||||
#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
|
||||
#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
|
||||
#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
|
||||
#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
|
||||
|
||||
//
|
||||
// Hardware related bit definitions
|
||||
//
|
||||
#define EHC_TYPE_ITD 0x00
|
||||
#define EHC_TYPE_QH 0x02
|
||||
#define EHC_TYPE_SITD 0x04
|
||||
#define EHC_TYPE_FSTN 0x06
|
||||
#define EHC_TYPE_ITD 0x00
|
||||
#define EHC_TYPE_QH 0x02
|
||||
#define EHC_TYPE_SITD 0x04
|
||||
#define EHC_TYPE_FSTN 0x06
|
||||
|
||||
#define QH_NAK_RELOAD 3
|
||||
#define QH_HSHBW_MULTI 1
|
||||
#define QH_NAK_RELOAD 3
|
||||
#define QH_HSHBW_MULTI 1
|
||||
|
||||
#define QTD_MAX_ERR 3
|
||||
#define QTD_PID_OUTPUT 0x00
|
||||
#define QTD_PID_INPUT 0x01
|
||||
#define QTD_PID_SETUP 0x02
|
||||
#define QTD_MAX_ERR 3
|
||||
#define QTD_PID_OUTPUT 0x00
|
||||
#define QTD_PID_INPUT 0x01
|
||||
#define QTD_PID_SETUP 0x02
|
||||
|
||||
#define QTD_STAT_DO_OUT 0
|
||||
#define QTD_STAT_DO_SS 0
|
||||
#define QTD_STAT_DO_PING 0x01
|
||||
#define QTD_STAT_DO_CS 0x02
|
||||
#define QTD_STAT_TRANS_ERR 0x08
|
||||
#define QTD_STAT_BABBLE_ERR 0x10
|
||||
#define QTD_STAT_BUFF_ERR 0x20
|
||||
#define QTD_STAT_HALTED 0x40
|
||||
#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_DO_OUT 0
|
||||
#define QTD_STAT_DO_SS 0
|
||||
#define QTD_STAT_DO_PING 0x01
|
||||
#define QTD_STAT_DO_CS 0x02
|
||||
#define QTD_STAT_TRANS_ERR 0x08
|
||||
#define QTD_STAT_BABBLE_ERR 0x10
|
||||
#define QTD_STAT_BUFF_ERR 0x20
|
||||
#define QTD_STAT_HALTED 0x40
|
||||
#define QTD_STAT_ACTIVE 0x80
|
||||
#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
|
||||
|
||||
#define QTD_MAX_BUFFER 4
|
||||
#define QTD_BUF_LEN 4096
|
||||
#define QTD_BUF_MASK 0x0FFF
|
||||
#define QTD_MAX_BUFFER 4
|
||||
#define QTD_BUF_LEN 4096
|
||||
#define QTD_BUF_MASK 0x0FFF
|
||||
|
||||
#define QH_MICROFRAME_0 0x01
|
||||
#define QH_MICROFRAME_1 0x02
|
||||
#define QH_MICROFRAME_2 0x04
|
||||
#define QH_MICROFRAME_3 0x08
|
||||
#define QH_MICROFRAME_4 0x10
|
||||
#define QH_MICROFRAME_5 0x20
|
||||
#define QH_MICROFRAME_6 0x40
|
||||
#define QH_MICROFRAME_7 0x80
|
||||
#define QH_MICROFRAME_0 0x01
|
||||
#define QH_MICROFRAME_1 0x02
|
||||
#define QH_MICROFRAME_2 0x04
|
||||
#define QH_MICROFRAME_3 0x08
|
||||
#define QH_MICROFRAME_4 0x10
|
||||
#define QH_MICROFRAME_5 0x20
|
||||
#define QH_MICROFRAME_6 0x40
|
||||
#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
|
||||
@ -77,7 +76,7 @@ typedef struct _URB URB;
|
||||
#define QH_LINK(Addr, Type, Term) \
|
||||
((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
|
||||
@ -87,77 +86,76 @@ typedef struct _URB URB;
|
||||
//
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltNext;
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltNext;
|
||||
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
} QTD_HW;
|
||||
|
||||
typedef struct {
|
||||
UINT32 HorizonLink;
|
||||
UINT32 HorizonLink;
|
||||
//
|
||||
// Endpoint capabilities/Characteristics DWord 1 and DWord 2
|
||||
//
|
||||
UINT32 DeviceAddr : 7;
|
||||
UINT32 Inactive : 1;
|
||||
UINT32 EpNum : 4;
|
||||
UINT32 EpSpeed : 2;
|
||||
UINT32 DtCtrl : 1;
|
||||
UINT32 ReclaimHead : 1;
|
||||
UINT32 MaxPacketLen : 11;
|
||||
UINT32 CtrlEp : 1;
|
||||
UINT32 NakReload : 4;
|
||||
UINT32 DeviceAddr : 7;
|
||||
UINT32 Inactive : 1;
|
||||
UINT32 EpNum : 4;
|
||||
UINT32 EpSpeed : 2;
|
||||
UINT32 DtCtrl : 1;
|
||||
UINT32 ReclaimHead : 1;
|
||||
UINT32 MaxPacketLen : 11;
|
||||
UINT32 CtrlEp : 1;
|
||||
UINT32 NakReload : 4;
|
||||
|
||||
UINT32 SMask : 8;
|
||||
UINT32 CMask : 8;
|
||||
UINT32 HubAddr : 7;
|
||||
UINT32 PortNum : 7;
|
||||
UINT32 Multiplier : 2;
|
||||
UINT32 SMask : 8;
|
||||
UINT32 CMask : 8;
|
||||
UINT32 HubAddr : 7;
|
||||
UINT32 PortNum : 7;
|
||||
UINT32 Multiplier : 2;
|
||||
|
||||
//
|
||||
// Transaction execution overlay area
|
||||
//
|
||||
UINT32 CurQtd;
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltQtd;
|
||||
UINT32 CurQtd;
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltQtd;
|
||||
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
} QH_HW;
|
||||
#pragma pack()
|
||||
|
||||
|
||||
//
|
||||
// Endpoint address and its capabilities
|
||||
//
|
||||
typedef struct _USB_ENDPOINT {
|
||||
UINT8 DevAddr;
|
||||
UINT8 EpAddr; // Endpoint address, no direction encoded in
|
||||
EFI_USB_DATA_DIRECTION Direction;
|
||||
UINT8 DevSpeed;
|
||||
UINTN MaxPacket;
|
||||
UINT8 HubAddr;
|
||||
UINT8 HubPort;
|
||||
UINT8 Toggle; // Data toggle, not used for control transfer
|
||||
UINTN Type;
|
||||
UINTN PollRate; // Polling interval used by EHCI
|
||||
UINT8 DevAddr;
|
||||
UINT8 EpAddr; // Endpoint address, no direction encoded in
|
||||
EFI_USB_DATA_DIRECTION Direction;
|
||||
UINT8 DevSpeed;
|
||||
UINTN MaxPacket;
|
||||
UINT8 HubAddr;
|
||||
UINT8 HubPort;
|
||||
UINT8 Toggle; // Data toggle, not used for control transfer
|
||||
UINTN Type;
|
||||
UINTN PollRate; // Polling interval used by EHCI
|
||||
} USB_ENDPOINT;
|
||||
|
||||
//
|
||||
@ -165,11 +163,11 @@ typedef struct _USB_ENDPOINT {
|
||||
// QTD generated from a URB. Don't add fields before QtdHw.
|
||||
//
|
||||
struct _EHC_QTD {
|
||||
QTD_HW QtdHw;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY QtdList; // The list of QTDs to one end point
|
||||
UINT8 *Data; // Buffer of the original data
|
||||
UINTN DataLen; // Original amount of data in this QTD
|
||||
QTD_HW QtdHw;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY QtdList; // The list of QTDs to one end point
|
||||
UINT8 *Data; // Buffer of the original data
|
||||
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.
|
||||
//
|
||||
struct _EHC_QH {
|
||||
QH_HW QhHw;
|
||||
UINT32 Signature;
|
||||
EHC_QH *NextQh; // The queue head pointed to by horizontal link
|
||||
LIST_ENTRY Qtds; // The list of QTDs to this queue head
|
||||
UINTN Interval;
|
||||
QH_HW QhHw;
|
||||
UINT32 Signature;
|
||||
EHC_QH *NextQh; // The queue head pointed to by horizontal link
|
||||
LIST_ENTRY Qtds; // The list of QTDs to this queue head
|
||||
UINTN Interval;
|
||||
};
|
||||
|
||||
//
|
||||
@ -200,38 +198,36 @@ struct _EHC_QH {
|
||||
// usb requests.
|
||||
//
|
||||
struct _URB {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY UrbList;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY UrbList;
|
||||
|
||||
//
|
||||
// Transaction information
|
||||
//
|
||||
USB_ENDPOINT Ep;
|
||||
EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
|
||||
VOID *RequestPhy; // Address of the mapped request
|
||||
VOID *RequestMap;
|
||||
VOID *Data;
|
||||
UINTN DataLen;
|
||||
VOID *DataPhy; // Address of the mapped user data
|
||||
VOID *DataMap;
|
||||
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
|
||||
VOID *Context;
|
||||
USB_ENDPOINT Ep;
|
||||
EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
|
||||
VOID *RequestPhy; // Address of the mapped request
|
||||
VOID *RequestMap;
|
||||
VOID *Data;
|
||||
UINTN DataLen;
|
||||
VOID *DataPhy; // Address of the mapped user data
|
||||
VOID *DataMap;
|
||||
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
|
||||
VOID *Context;
|
||||
|
||||
//
|
||||
// Schedule data
|
||||
//
|
||||
EHC_QH *Qh;
|
||||
EHC_QH *Qh;
|
||||
|
||||
//
|
||||
// Transaction result
|
||||
//
|
||||
UINT32 Result;
|
||||
UINTN Completed; // completed data length
|
||||
UINT8 DataToggle;
|
||||
UINT32 Result;
|
||||
UINTN Completed; // completed data length
|
||||
UINT8 DataToggle;
|
||||
};
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Create a single QTD to hold the data.
|
||||
|
||||
@ -248,17 +244,15 @@ struct _URB {
|
||||
**/
|
||||
EHC_QTD *
|
||||
EhcCreateQtd (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINT8 *DataPhy,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINT8 *DataPhy,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
);
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Allocate and initialize a EHCI queue head.
|
||||
|
||||
@ -270,11 +264,10 @@ EhcCreateQtd (
|
||||
**/
|
||||
EHC_QH *
|
||||
EhcCreateQh (
|
||||
IN USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
IN USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Free an allocated URB. It is possible for it to be partially inited.
|
||||
|
||||
@ -284,11 +277,10 @@ EhcCreateQh (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeUrb (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN URB *Urb
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Create a new URB and its associated QTD.
|
||||
|
||||
@ -312,19 +304,20 @@ EhcFreeUrb (
|
||||
**/
|
||||
URB *
|
||||
EhcCreateUrb (
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
IN USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -7,10 +7,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
**/
|
||||
|
||||
|
||||
#include "Ehci.h"
|
||||
|
||||
|
||||
/**
|
||||
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 *
|
||||
UsbHcAllocMemBlock (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Pages
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Pages
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
UINTN Bytes;
|
||||
EFI_STATUS Status;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
UINTN Bytes;
|
||||
EFI_STATUS Status;
|
||||
|
||||
PciIo = Pool->PciIo;
|
||||
|
||||
@ -47,9 +45,9 @@ UsbHcAllocMemBlock (
|
||||
//
|
||||
ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
|
||||
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
|
||||
Block->Bits = AllocateZeroPool (Block->BitsLen);
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
|
||||
Block->Bits = AllocateZeroPool (Block->BitsLen);
|
||||
|
||||
if (Block->Bits == NULL) {
|
||||
gBS->FreePool (Block);
|
||||
@ -73,7 +71,7 @@ UsbHcAllocMemBlock (
|
||||
goto FREE_BITARRAY;
|
||||
}
|
||||
|
||||
Bytes = EFI_PAGES_TO_SIZE (Pages);
|
||||
Bytes = EFI_PAGES_TO_SIZE (Pages);
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
EfiPciIoOperationBusMasterCommonBuffer,
|
||||
@ -96,9 +94,9 @@ UsbHcAllocMemBlock (
|
||||
goto FREE_BUFFER;
|
||||
}
|
||||
|
||||
Block->BufHost = BufHost;
|
||||
Block->Buf = (UINT8 *) ((UINTN) MappedAddr);
|
||||
Block->Mapping = Mapping;
|
||||
Block->BufHost = BufHost;
|
||||
Block->Buf = (UINT8 *)((UINTN)MappedAddr);
|
||||
Block->Mapping = Mapping;
|
||||
|
||||
return Block;
|
||||
|
||||
@ -111,7 +109,6 @@ FREE_BITARRAY:
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Free the memory block from the memory pool.
|
||||
|
||||
@ -121,11 +118,11 @@ FREE_BITARRAY:
|
||||
**/
|
||||
VOID
|
||||
UsbHcFreeMemBlock (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
|
||||
ASSERT ((Pool != NULL) && (Block != NULL));
|
||||
|
||||
@ -141,7 +138,6 @@ UsbHcFreeMemBlock (
|
||||
gBS->FreePool (Block);
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Alloc some memory from the block.
|
||||
|
||||
@ -154,22 +150,22 @@ UsbHcFreeMemBlock (
|
||||
**/
|
||||
VOID *
|
||||
UsbHcAllocMemFromBlock (
|
||||
IN USBHC_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
IN USBHC_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
)
|
||||
{
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
|
||||
ASSERT ((Block != 0) && (Units != 0));
|
||||
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
|
||||
for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
|
||||
//
|
||||
@ -185,13 +181,12 @@ UsbHcAllocMemFromBlock (
|
||||
}
|
||||
|
||||
NEXT_BIT (Byte, Bit);
|
||||
|
||||
} else {
|
||||
NEXT_BIT (Byte, Bit);
|
||||
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
}
|
||||
}
|
||||
|
||||
@ -202,13 +197,13 @@ UsbHcAllocMemFromBlock (
|
||||
//
|
||||
// Mark the memory as allocated
|
||||
//
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
|
||||
for (Count = 0; Count < Units; Count++) {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -226,16 +221,16 @@ UsbHcAllocMemFromBlock (
|
||||
**/
|
||||
EFI_PHYSICAL_ADDRESS
|
||||
UsbHcGetPciAddressForHostMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINTN AllocSize;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
UINTN Offset;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINTN AllocSize;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
UINTN Offset;
|
||||
|
||||
Head = Pool->Head;
|
||||
AllocSize = USBHC_MEM_ROUND (Size);
|
||||
@ -249,7 +244,7 @@ UsbHcGetPciAddressForHostMem (
|
||||
// scan the memory block list for the memory block that
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
@ -258,12 +253,11 @@ UsbHcGetPciAddressForHostMem (
|
||||
//
|
||||
// calculate the pci memory address for host memory address.
|
||||
//
|
||||
Offset = (UINT8 *)Mem - Block->BufHost;
|
||||
PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN) (Block->Buf + Offset);
|
||||
Offset = (UINT8 *)Mem - Block->BufHost;
|
||||
PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN)(Block->Buf + Offset);
|
||||
return PhyAddr;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Insert the memory block to the pool's list of the blocks.
|
||||
|
||||
@ -273,8 +267,8 @@ UsbHcGetPciAddressForHostMem (
|
||||
**/
|
||||
VOID
|
||||
UsbHcInsertMemBlockToPool (
|
||||
IN USBHC_MEM_BLOCK *Head,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
IN USBHC_MEM_BLOCK *Head,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Head != NULL) && (Block != NULL));
|
||||
@ -282,7 +276,6 @@ UsbHcInsertMemBlockToPool (
|
||||
Head->Next = Block;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Is the memory block empty?
|
||||
|
||||
@ -294,10 +287,10 @@ UsbHcInsertMemBlockToPool (
|
||||
**/
|
||||
BOOLEAN
|
||||
UsbHcIsMemBlockEmpty (
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < Block->BitsLen; Index++) {
|
||||
if (Block->Bits[Index] != 0) {
|
||||
@ -308,7 +301,6 @@ UsbHcIsMemBlockEmpty (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Unlink the memory block from the pool's list.
|
||||
|
||||
@ -318,11 +310,11 @@ UsbHcIsMemBlockEmpty (
|
||||
**/
|
||||
VOID
|
||||
UsbHcUnlinkMemBlock (
|
||||
IN USBHC_MEM_BLOCK *Head,
|
||||
IN USBHC_MEM_BLOCK *BlockToUnlink
|
||||
IN USBHC_MEM_BLOCK *Head,
|
||||
IN USBHC_MEM_BLOCK *BlockToUnlink
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
|
||||
ASSERT ((Head != NULL) && (BlockToUnlink != NULL));
|
||||
|
||||
@ -335,7 +327,6 @@ UsbHcUnlinkMemBlock (
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize the memory management pool for the host controller.
|
||||
|
||||
@ -355,7 +346,7 @@ UsbHcInitMemPool (
|
||||
IN UINT32 Which4G
|
||||
)
|
||||
{
|
||||
USBHC_MEM_POOL *Pool;
|
||||
USBHC_MEM_POOL *Pool;
|
||||
|
||||
Pool = AllocatePool (sizeof (USBHC_MEM_POOL));
|
||||
|
||||
@ -376,7 +367,6 @@ UsbHcInitMemPool (
|
||||
return Pool;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Release the memory management pool.
|
||||
|
||||
@ -388,10 +378,10 @@ UsbHcInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UsbHcFreeMemPool (
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
|
||||
ASSERT (Pool->Head != NULL);
|
||||
|
||||
@ -410,7 +400,6 @@ UsbHcFreeMemPool (
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Allocate some memory from the host controller's memory pool
|
||||
which can be used to communicate with host controller.
|
||||
@ -423,16 +412,16 @@ UsbHcFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
UsbHcAllocateMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
|
||||
Mem = NULL;
|
||||
AllocSize = USBHC_MEM_ROUND (Size);
|
||||
@ -487,7 +476,6 @@ UsbHcAllocateMem (
|
||||
return Mem;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Free the allocated memory back to the memory pool.
|
||||
|
||||
@ -498,22 +486,22 @@ UsbHcAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
UsbHcFreeMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
|
||||
Head = Pool->Head;
|
||||
AllocSize = USBHC_MEM_ROUND (Size);
|
||||
ToFree = (UINT8 *) Mem;
|
||||
ToFree = (UINT8 *)Mem;
|
||||
|
||||
for (Block = Head; Block != NULL; Block = Block->Next) {
|
||||
//
|
||||
@ -524,8 +512,8 @@ UsbHcFreeMem (
|
||||
//
|
||||
// compute the start byte and bit in the bit array
|
||||
//
|
||||
Byte = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) % 8;
|
||||
Byte = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->BufHost) / USBHC_MEM_UNIT) % 8;
|
||||
|
||||
//
|
||||
// reset associated bits in bit array
|
||||
@ -533,7 +521,7 @@ UsbHcFreeMem (
|
||||
for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -556,5 +544,5 @@ UsbHcFreeMem (
|
||||
UsbHcFreeMemBlock (Pool, Block);
|
||||
}
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
@ -10,7 +10,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _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) \
|
||||
((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;
|
||||
struct _USBHC_MEM_BLOCK {
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
USBHC_MEM_BLOCK *Next;
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
USBHC_MEM_BLOCK *Next;
|
||||
};
|
||||
|
||||
//
|
||||
@ -35,16 +35,16 @@ struct _USBHC_MEM_BLOCK {
|
||||
// data to be on the same 4G memory.
|
||||
//
|
||||
typedef struct _USBHC_MEM_POOL {
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
BOOLEAN Check4G;
|
||||
UINT32 Which4G;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
BOOLEAN Check4G;
|
||||
UINT32 Which4G;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
} USBHC_MEM_POOL;
|
||||
|
||||
//
|
||||
// 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_DEFAULT_PAGES 16
|
||||
@ -63,8 +63,6 @@ typedef struct _USBHC_MEM_POOL {
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
|
||||
/**
|
||||
Initialize the memory management pool for the host controller.
|
||||
|
||||
@ -84,7 +82,6 @@ UsbHcInitMemPool (
|
||||
IN UINT32 Which4G
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Release the memory management pool.
|
||||
|
||||
@ -96,10 +93,9 @@ UsbHcInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UsbHcFreeMemPool (
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Allocate some memory from the host controller's memory pool
|
||||
which can be used to communicate with host controller.
|
||||
@ -112,11 +108,10 @@ UsbHcFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
UsbHcAllocateMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Free the allocated memory back to the memory pool.
|
||||
|
||||
@ -127,9 +122,9 @@ UsbHcAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
UsbHcFreeMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
/**
|
||||
@ -143,9 +138,9 @@ UsbHcFreeMem (
|
||||
**/
|
||||
EFI_PHYSICAL_ADDRESS
|
||||
UsbHcGetPciAddressForHostMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -39,8 +39,8 @@ IoMmuMap (
|
||||
OUT VOID **Mapping
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT64 Attribute;
|
||||
EFI_STATUS Status;
|
||||
UINT64 Attribute;
|
||||
|
||||
if (IoMmu != NULL) {
|
||||
Status = IoMmu->Map (
|
||||
@ -54,23 +54,25 @@ IoMmuMap (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
switch (Operation) {
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT(FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
case EdkiiIoMmuOperationBusMasterRead:
|
||||
case EdkiiIoMmuOperationBusMasterRead64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterWrite:
|
||||
case EdkiiIoMmuOperationBusMasterWrite64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer:
|
||||
case EdkiiIoMmuOperationBusMasterCommonBuffer64:
|
||||
Attribute = EDKII_IOMMU_ACCESS_READ | EDKII_IOMMU_ACCESS_WRITE;
|
||||
break;
|
||||
default:
|
||||
ASSERT (FALSE);
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Status = IoMmu->SetAttribute (
|
||||
IoMmu,
|
||||
*Mapping,
|
||||
@ -82,10 +84,11 @@ IoMmuMap (
|
||||
return Status;
|
||||
}
|
||||
} else {
|
||||
*DeviceAddress = (EFI_PHYSICAL_ADDRESS) (UINTN) HostAddress;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
*DeviceAddress = (EFI_PHYSICAL_ADDRESS)(UINTN)HostAddress;
|
||||
*Mapping = NULL;
|
||||
Status = EFI_SUCCESS;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -98,8 +101,8 @@ IoMmuMap (
|
||||
**/
|
||||
VOID
|
||||
IoMmuUnmap (
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN VOID *Mapping
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
if (IoMmu != NULL) {
|
||||
@ -140,9 +143,9 @@ IoMmuAllocateBuffer (
|
||||
UINTN NumberOfBytes;
|
||||
EFI_PHYSICAL_ADDRESS HostPhyAddress;
|
||||
|
||||
*HostAddress = NULL;
|
||||
*HostAddress = NULL;
|
||||
*DeviceAddress = 0;
|
||||
*Mapping = NULL;
|
||||
*Mapping = NULL;
|
||||
|
||||
if (IoMmu != NULL) {
|
||||
Status = IoMmu->AllocateBuffer (
|
||||
@ -157,19 +160,20 @@ IoMmuAllocateBuffer (
|
||||
}
|
||||
|
||||
NumberOfBytes = EFI_PAGES_TO_SIZE (Pages);
|
||||
Status = IoMmu->Map (
|
||||
IoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
Status = IoMmu->Map (
|
||||
IoMmu,
|
||||
EdkiiIoMmuOperationBusMasterCommonBuffer,
|
||||
*HostAddress,
|
||||
&NumberOfBytes,
|
||||
DeviceAddress,
|
||||
Mapping
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress);
|
||||
*HostAddress = NULL;
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Status = IoMmu->SetAttribute (
|
||||
IoMmu,
|
||||
*Mapping,
|
||||
@ -178,7 +182,7 @@ IoMmuAllocateBuffer (
|
||||
if (EFI_ERROR (Status)) {
|
||||
IoMmu->Unmap (IoMmu, *Mapping);
|
||||
IoMmu->FreeBuffer (IoMmu, Pages, *HostAddress);
|
||||
*Mapping = NULL;
|
||||
*Mapping = NULL;
|
||||
*HostAddress = NULL;
|
||||
return Status;
|
||||
}
|
||||
@ -191,10 +195,12 @@ IoMmuAllocateBuffer (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
*HostAddress = (VOID *) (UINTN) HostPhyAddress;
|
||||
|
||||
*HostAddress = (VOID *)(UINTN)HostPhyAddress;
|
||||
*DeviceAddress = HostPhyAddress;
|
||||
*Mapping = NULL;
|
||||
*Mapping = NULL;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -209,10 +215,10 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
VOID
|
||||
IoMmuFreeBuffer (
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
)
|
||||
{
|
||||
if (IoMmu != NULL) {
|
||||
@ -230,14 +236,13 @@ IoMmuFreeBuffer (
|
||||
**/
|
||||
VOID
|
||||
IoMmuInit (
|
||||
OUT EDKII_IOMMU_PPI **IoMmu
|
||||
OUT EDKII_IOMMU_PPI **IoMmu
|
||||
)
|
||||
{
|
||||
PeiServicesLocatePpi (
|
||||
&gEdkiiIoMmuPpiGuid,
|
||||
0,
|
||||
NULL,
|
||||
(VOID **) IoMmu
|
||||
(VOID **)IoMmu
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -15,19 +15,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
// to the UEFI protocol's port state (change).
|
||||
//
|
||||
USB_PORT_STATE_MAP mUsbPortStateMap[] = {
|
||||
{PORTSC_CONN, USB_PORT_STAT_CONNECTION},
|
||||
{PORTSC_ENABLED, USB_PORT_STAT_ENABLE},
|
||||
{PORTSC_SUSPEND, USB_PORT_STAT_SUSPEND},
|
||||
{PORTSC_OVERCUR, USB_PORT_STAT_OVERCURRENT},
|
||||
{PORTSC_RESET, USB_PORT_STAT_RESET},
|
||||
{PORTSC_POWER, USB_PORT_STAT_POWER},
|
||||
{PORTSC_OWNER, USB_PORT_STAT_OWNER}
|
||||
{ PORTSC_CONN, USB_PORT_STAT_CONNECTION },
|
||||
{ PORTSC_ENABLED, USB_PORT_STAT_ENABLE },
|
||||
{ PORTSC_SUSPEND, USB_PORT_STAT_SUSPEND },
|
||||
{ PORTSC_OVERCUR, USB_PORT_STAT_OVERCURRENT },
|
||||
{ PORTSC_RESET, USB_PORT_STAT_RESET },
|
||||
{ PORTSC_POWER, USB_PORT_STAT_POWER },
|
||||
{ PORTSC_OWNER, USB_PORT_STAT_OWNER }
|
||||
};
|
||||
|
||||
USB_PORT_STATE_MAP mUsbPortChangeMap[] = {
|
||||
{PORTSC_CONN_CHANGE, USB_PORT_STAT_C_CONNECTION},
|
||||
{PORTSC_ENABLE_CHANGE, USB_PORT_STAT_C_ENABLE},
|
||||
{PORTSC_OVERCUR_CHANGE, USB_PORT_STAT_C_OVERCURRENT}
|
||||
{ PORTSC_CONN_CHANGE, USB_PORT_STAT_C_CONNECTION },
|
||||
{ PORTSC_ENABLE_CHANGE, USB_PORT_STAT_C_ENABLE },
|
||||
{ PORTSC_OVERCUR_CHANGE, USB_PORT_STAT_C_OVERCURRENT }
|
||||
};
|
||||
|
||||
/**
|
||||
@ -41,11 +41,11 @@ USB_PORT_STATE_MAP mUsbPortChangeMap[] = {
|
||||
**/
|
||||
UINT32
|
||||
EhcReadOpReg (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
UINT32 Data;
|
||||
|
||||
ASSERT (Ehc->CapLen != 0);
|
||||
|
||||
@ -64,16 +64,14 @@ EhcReadOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcWriteOpReg (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
)
|
||||
{
|
||||
|
||||
ASSERT (Ehc->CapLen != 0);
|
||||
|
||||
MmioWrite32(Ehc->UsbHostControllerBaseAddress + Ehc->CapLen + Offset, Data);
|
||||
|
||||
MmioWrite32 (Ehc->UsbHostControllerBaseAddress + Ehc->CapLen + Offset, Data);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -86,12 +84,12 @@ EhcWriteOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcSetOpRegBit (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
UINT32 Data;
|
||||
|
||||
Data = EhcReadOpReg (Ehc, Offset);
|
||||
Data |= Bit;
|
||||
@ -108,12 +106,12 @@ EhcSetOpRegBit (
|
||||
**/
|
||||
VOID
|
||||
EhcClearOpRegBit (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
UINT32 Data;
|
||||
|
||||
Data = EhcReadOpReg (Ehc, Offset);
|
||||
Data &= ~Bit;
|
||||
@ -136,14 +134,14 @@ EhcClearOpRegBit (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcWaitOpRegBit (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit,
|
||||
IN BOOLEAN WaitToSet,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Bit,
|
||||
IN BOOLEAN WaitToSet,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
UINT32 Index;
|
||||
UINT32 Index;
|
||||
|
||||
for (Index = 0; Index < Timeout / EHC_SYNC_POLL_INTERVAL + 1; Index++) {
|
||||
if (EHC_REG_BIT_IS_SET (Ehc, Offset, Bit) == WaitToSet) {
|
||||
@ -167,13 +165,13 @@ EhcWaitOpRegBit (
|
||||
**/
|
||||
UINT32
|
||||
EhcReadCapRegister (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
{
|
||||
UINT32 Data;
|
||||
UINT32 Data;
|
||||
|
||||
Data = MmioRead32(Ehc->UsbHostControllerBaseAddress + Offset);
|
||||
Data = MmioRead32 (Ehc->UsbHostControllerBaseAddress + Offset);
|
||||
|
||||
return Data;
|
||||
}
|
||||
@ -191,12 +189,12 @@ EhcReadCapRegister (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcSetAndWaitDoorBell (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Data;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_IAAD);
|
||||
|
||||
@ -224,7 +222,7 @@ EhcSetAndWaitDoorBell (
|
||||
**/
|
||||
VOID
|
||||
EhcAckAllInterrupt (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
EhcWriteOpReg (Ehc, EHC_USBSTS_OFFSET, USBSTS_INTACK_MASK);
|
||||
@ -243,11 +241,11 @@ EhcAckAllInterrupt (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcEnablePeriodSchd (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_PERIOD);
|
||||
|
||||
@ -267,11 +265,11 @@ EhcEnablePeriodSchd (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcEnableAsyncSchd (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_ENABLE_ASYNC);
|
||||
|
||||
@ -290,7 +288,7 @@ EhcEnableAsyncSchd (
|
||||
**/
|
||||
BOOLEAN
|
||||
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);
|
||||
@ -307,7 +305,7 @@ EhcIsHalt (
|
||||
**/
|
||||
BOOLEAN
|
||||
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);
|
||||
@ -325,11 +323,11 @@ EhcIsSysError (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcResetHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Host can only be reset when it is halt. If not so, halt it
|
||||
@ -359,11 +357,11 @@ EhcResetHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcHaltHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcClearOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
|
||||
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, TRUE, Timeout);
|
||||
@ -382,11 +380,11 @@ EhcHaltHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcRunHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
EhcSetOpRegBit (Ehc, EHC_USBCMD_OFFSET, USBCMD_RUN);
|
||||
Status = EhcWaitOpRegBit (Ehc, EHC_USBSTS_OFFSET, USBSTS_HALT, FALSE, Timeout);
|
||||
@ -401,12 +399,12 @@ EhcRunHC (
|
||||
**/
|
||||
VOID
|
||||
EhcPowerOnAllPorts (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
UINT8 PortNumber;
|
||||
UINT8 Index;
|
||||
UINT32 RegVal;
|
||||
UINT8 PortNumber;
|
||||
UINT8 Index;
|
||||
UINT32 RegVal;
|
||||
|
||||
PortNumber = (UINT8)(Ehc->HcStructParams & HCSP_NPORTS);
|
||||
for (Index = 0; Index < PortNumber; Index++) {
|
||||
@ -414,7 +412,7 @@ EhcPowerOnAllPorts (
|
||||
// Do not clear port status bits on initialization. Otherwise devices will
|
||||
// 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_POWER;
|
||||
EhcWriteOpReg (Ehc, EHC_PORT_STAT_OFFSET + 4 * Index, RegVal);
|
||||
@ -438,12 +436,12 @@ EhcPowerOnAllPorts (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
UINTN PageNumber;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
UINTN PageNumber;
|
||||
|
||||
ASSERT (EhcIsHalt (Ehc));
|
||||
|
||||
@ -454,13 +452,14 @@ EhcInitHC (
|
||||
if (Ehc->PeriodFrame != NULL) {
|
||||
EhcFreeSched (Ehc);
|
||||
}
|
||||
PageNumber = sizeof(PEI_URB)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
Ehc->Urb = (PEI_URB *) ((UINTN) TempPtr);
|
||||
|
||||
PageNumber = sizeof (PEI_URB)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
Ehc->Urb = (PEI_URB *)((UINTN)TempPtr);
|
||||
if (Ehc->Urb == NULL) {
|
||||
return Status;
|
||||
}
|
||||
@ -473,6 +472,7 @@ EhcInitHC (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// 1. Program the CTRLDSSEGMENT register with the high 32 bit addr
|
||||
//
|
||||
@ -563,15 +563,16 @@ EhcBulkTransfer (
|
||||
OUT UINT32 *TransferResult
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
PEI_URB *Urb;
|
||||
EFI_STATUS Status;
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
PEI_URB *Urb;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Validate the parameters
|
||||
//
|
||||
if ((DataLength == NULL) || (*DataLength == 0) ||
|
||||
(Data == NULL) || (Data[0] == NULL) || (TransferResult == NULL)) {
|
||||
(Data == NULL) || (Data[0] == NULL) || (TransferResult == NULL))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
@ -581,11 +582,12 @@ EhcBulkTransfer (
|
||||
|
||||
if ((DeviceSpeed == EFI_USB_SPEED_LOW) ||
|
||||
((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;
|
||||
}
|
||||
|
||||
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;
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
|
||||
@ -656,13 +658,13 @@ ON_EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcGetRootHubPortNumber (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
OUT UINT8 *PortNumber
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
OUT UINT8 *PortNumber
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *EhcDev;
|
||||
|
||||
PEI_USB2_HC_DEV *EhcDev;
|
||||
EhcDev = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
|
||||
if (PortNumber == NULL) {
|
||||
@ -671,7 +673,6 @@ EhcGetRootHubPortNumber (
|
||||
|
||||
*PortNumber = (UINT8)(EhcDev->HcStructParams & HCSP_NPORTS);
|
||||
return EFI_SUCCESS;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -692,20 +693,20 @@ EhcGetRootHubPortNumber (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcClearRootHubPortFeature (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
IN UINT8 PortNumber,
|
||||
IN EFI_USB_PORT_FEATURE PortFeature
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
IN UINT8 PortNumber,
|
||||
IN EFI_USB_PORT_FEATURE PortFeature
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
UINT32 Offset;
|
||||
UINT32 State;
|
||||
UINT32 TotalPort;
|
||||
EFI_STATUS Status;
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
UINT32 Offset;
|
||||
UINT32 State;
|
||||
UINT32 TotalPort;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
Status = EFI_SUCCESS;
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
|
||||
|
||||
@ -714,82 +715,82 @@ EhcClearRootHubPortFeature (
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
Offset = EHC_PORT_STAT_OFFSET + (4 * PortNumber);
|
||||
State = EhcReadOpReg (Ehc, Offset);
|
||||
Offset = EHC_PORT_STAT_OFFSET + (4 * PortNumber);
|
||||
State = EhcReadOpReg (Ehc, Offset);
|
||||
State &= ~PORTSC_CHANGE_MASK;
|
||||
|
||||
switch (PortFeature) {
|
||||
case EfiUsbPortEnable:
|
||||
//
|
||||
// Clear PORT_ENABLE feature means disable port.
|
||||
//
|
||||
State &= ~PORTSC_ENABLED;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortEnable:
|
||||
//
|
||||
// Clear PORT_ENABLE feature means disable port.
|
||||
//
|
||||
State &= ~PORTSC_ENABLED;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortSuspend:
|
||||
//
|
||||
// A write of zero to this bit is ignored by the host
|
||||
// controller. The host controller will unconditionally
|
||||
// set this bit to a zero when:
|
||||
// 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.
|
||||
//
|
||||
State &= ~PORSTSC_RESUME;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortSuspend:
|
||||
//
|
||||
// A write of zero to this bit is ignored by the host
|
||||
// controller. The host controller will unconditionally
|
||||
// set this bit to a zero when:
|
||||
// 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.
|
||||
//
|
||||
State &= ~PORSTSC_RESUME;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortReset:
|
||||
//
|
||||
// Clear PORT_RESET means clear the reset signal.
|
||||
//
|
||||
State &= ~PORTSC_RESET;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortReset:
|
||||
//
|
||||
// Clear PORT_RESET means clear the reset signal.
|
||||
//
|
||||
State &= ~PORTSC_RESET;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortOwner:
|
||||
//
|
||||
// Clear port owner means this port owned by EHC
|
||||
//
|
||||
State &= ~PORTSC_OWNER;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortOwner:
|
||||
//
|
||||
// Clear port owner means this port owned by EHC
|
||||
//
|
||||
State &= ~PORTSC_OWNER;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortConnectChange:
|
||||
//
|
||||
// Clear connect status change
|
||||
//
|
||||
State |= PORTSC_CONN_CHANGE;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortConnectChange:
|
||||
//
|
||||
// Clear connect status change
|
||||
//
|
||||
State |= PORTSC_CONN_CHANGE;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortEnableChange:
|
||||
//
|
||||
// Clear enable status change
|
||||
//
|
||||
State |= PORTSC_ENABLE_CHANGE;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortEnableChange:
|
||||
//
|
||||
// Clear enable status change
|
||||
//
|
||||
State |= PORTSC_ENABLE_CHANGE;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortOverCurrentChange:
|
||||
//
|
||||
// Clear PortOverCurrent change
|
||||
//
|
||||
State |= PORTSC_OVERCUR_CHANGE;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortOverCurrentChange:
|
||||
//
|
||||
// Clear PortOverCurrent change
|
||||
//
|
||||
State |= PORTSC_OVERCUR_CHANGE;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortPower:
|
||||
case EfiUsbPortSuspendChange:
|
||||
case EfiUsbPortResetChange:
|
||||
//
|
||||
// Not supported or not related operation
|
||||
//
|
||||
break;
|
||||
case EfiUsbPortPower:
|
||||
case EfiUsbPortSuspendChange:
|
||||
case EfiUsbPortResetChange:
|
||||
//
|
||||
// Not supported or not related operation
|
||||
//
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
}
|
||||
|
||||
ON_EXIT:
|
||||
@ -812,20 +813,20 @@ ON_EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcSetRootHubPortFeature (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
IN UINT8 PortNumber,
|
||||
IN EFI_USB_PORT_FEATURE PortFeature
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
IN UINT8 PortNumber,
|
||||
IN EFI_USB_PORT_FEATURE PortFeature
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
UINT32 Offset;
|
||||
UINT32 State;
|
||||
UINT32 TotalPort;
|
||||
EFI_STATUS Status;
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
UINT32 Offset;
|
||||
UINT32 State;
|
||||
UINT32 TotalPort;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
Status = EFI_SUCCESS;
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
|
||||
|
||||
@ -834,8 +835,8 @@ EhcSetRootHubPortFeature (
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
Offset = (UINT32) (EHC_PORT_STAT_OFFSET + (4 * PortNumber));
|
||||
State = EhcReadOpReg (Ehc, Offset);
|
||||
Offset = (UINT32)(EHC_PORT_STAT_OFFSET + (4 * PortNumber));
|
||||
State = EhcReadOpReg (Ehc, Offset);
|
||||
|
||||
//
|
||||
// Mask off the port status change bits, these bits are
|
||||
@ -844,54 +845,54 @@ EhcSetRootHubPortFeature (
|
||||
State &= ~PORTSC_CHANGE_MASK;
|
||||
|
||||
switch (PortFeature) {
|
||||
case EfiUsbPortEnable:
|
||||
//
|
||||
// Sofeware can't set this bit, Port can only be enable by
|
||||
// EHCI as a part of the reset and enable
|
||||
//
|
||||
State |= PORTSC_ENABLED;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortEnable:
|
||||
//
|
||||
// Sofeware can't set this bit, Port can only be enable by
|
||||
// EHCI as a part of the reset and enable
|
||||
//
|
||||
State |= PORTSC_ENABLED;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortSuspend:
|
||||
State |= PORTSC_SUSPEND;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortSuspend:
|
||||
State |= PORTSC_SUSPEND;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortReset:
|
||||
//
|
||||
// Make sure Host Controller not halt before reset it
|
||||
//
|
||||
if (EhcIsHalt (Ehc)) {
|
||||
Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT);
|
||||
case EfiUsbPortReset:
|
||||
//
|
||||
// Make sure Host Controller not halt before reset it
|
||||
//
|
||||
if (EhcIsHalt (Ehc)) {
|
||||
Status = EhcRunHC (Ehc, EHC_GENERIC_TIMEOUT);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
if (EFI_ERROR (Status)) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// Set one to PortReset bit must also set zero to PortEnable bit
|
||||
//
|
||||
State |= PORTSC_RESET;
|
||||
State &= ~PORTSC_ENABLED;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
//
|
||||
// Set one to PortReset bit must also set zero to PortEnable bit
|
||||
//
|
||||
State |= PORTSC_RESET;
|
||||
State &= ~PORTSC_ENABLED;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
case EfiUsbPortPower:
|
||||
//
|
||||
// Not supported, ignore the operation
|
||||
//
|
||||
Status = EFI_SUCCESS;
|
||||
break;
|
||||
case EfiUsbPortPower:
|
||||
//
|
||||
// Not supported, ignore the operation
|
||||
//
|
||||
Status = EFI_SUCCESS;
|
||||
break;
|
||||
|
||||
case EfiUsbPortOwner:
|
||||
State |= PORTSC_OWNER;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
case EfiUsbPortOwner:
|
||||
State |= PORTSC_OWNER;
|
||||
EhcWriteOpReg (Ehc, Offset, State);
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
default:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
ON_EXIT:
|
||||
@ -914,26 +915,26 @@ ON_EXIT:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
EhcGetRootHubPortStatus (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
IN UINT8 PortNumber,
|
||||
OUT EFI_USB_PORT_STATUS *PortStatus
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN PEI_USB2_HOST_CONTROLLER_PPI *This,
|
||||
IN UINT8 PortNumber,
|
||||
OUT EFI_USB_PORT_STATUS *PortStatus
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
UINT32 Offset;
|
||||
UINT32 State;
|
||||
UINT32 TotalPort;
|
||||
UINTN Index;
|
||||
UINTN MapSize;
|
||||
EFI_STATUS Status;
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
UINT32 Offset;
|
||||
UINT32 State;
|
||||
UINT32 TotalPort;
|
||||
UINTN Index;
|
||||
UINTN MapSize;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (PortStatus == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS(This);
|
||||
Status = EFI_SUCCESS;
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
Status = EFI_SUCCESS;
|
||||
|
||||
TotalPort = (Ehc->HcStructParams & HCSP_NPORTS);
|
||||
|
||||
@ -942,11 +943,11 @@ EhcGetRootHubPortStatus (
|
||||
goto ON_EXIT;
|
||||
}
|
||||
|
||||
Offset = (UINT32) (EHC_PORT_STAT_OFFSET + (4 * PortNumber));
|
||||
PortStatus->PortStatus = 0;
|
||||
PortStatus->PortChangeStatus = 0;
|
||||
Offset = (UINT32)(EHC_PORT_STAT_OFFSET + (4 * PortNumber));
|
||||
PortStatus->PortStatus = 0;
|
||||
PortStatus->PortChangeStatus = 0;
|
||||
|
||||
State = EhcReadOpReg (Ehc, Offset);
|
||||
State = EhcReadOpReg (Ehc, Offset);
|
||||
|
||||
//
|
||||
// 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)) {
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_LOW_SPEED;
|
||||
|
||||
} else if (EHC_BIT_IS_SET (State, PORTSC_ENABLED)) {
|
||||
PortStatus->PortStatus |= USB_PORT_STAT_HIGH_SPEED;
|
||||
}
|
||||
@ -968,7 +968,7 @@ EhcGetRootHubPortStatus (
|
||||
|
||||
for (Index = 0; Index < MapSize; Index++) {
|
||||
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++) {
|
||||
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
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
PEI_URB *Urb;
|
||||
UINT8 Endpoint;
|
||||
EFI_STATUS Status;
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
PEI_URB *Urb;
|
||||
UINT8 Endpoint;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Validate parameters
|
||||
@ -1041,33 +1041,37 @@ EhcControlTransfer (
|
||||
|
||||
if ((TransferDirection != EfiUsbDataIn) &&
|
||||
(TransferDirection != EfiUsbDataOut) &&
|
||||
(TransferDirection != EfiUsbNoData)) {
|
||||
(TransferDirection != EfiUsbNoData))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((TransferDirection == EfiUsbNoData) &&
|
||||
((Data != NULL) || (*DataLength != 0))) {
|
||||
((Data != NULL) || (*DataLength != 0)))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((TransferDirection != EfiUsbNoData) &&
|
||||
((Data == NULL) || (*DataLength == 0))) {
|
||||
((Data == NULL) || (*DataLength == 0)))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if ((MaximumPacketLength != 8) && (MaximumPacketLength != 16) &&
|
||||
(MaximumPacketLength != 32) && (MaximumPacketLength != 64)) {
|
||||
(MaximumPacketLength != 32) && (MaximumPacketLength != 64))
|
||||
{
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
|
||||
if ((DeviceSpeed == EFI_USB_SPEED_LOW) ||
|
||||
((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;
|
||||
}
|
||||
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_EHCI_THIS (This);
|
||||
|
||||
Status = EFI_DEVICE_ERROR;
|
||||
*TransferResult = EFI_USB_ERR_SYSTEM;
|
||||
@ -1088,23 +1092,23 @@ EhcControlTransfer (
|
||||
// endpoint is bidirectional. EhcCreateUrb expects this
|
||||
// combination of Ep addr and its direction.
|
||||
//
|
||||
Endpoint = (UINT8) (0 | ((TransferDirection == EfiUsbDataIn) ? 0x80 : 0));
|
||||
Urb = EhcCreateUrb (
|
||||
Ehc,
|
||||
DeviceAddress,
|
||||
Endpoint,
|
||||
DeviceSpeed,
|
||||
0,
|
||||
MaximumPacketLength,
|
||||
Translator,
|
||||
EHC_CTRL_TRANSFER,
|
||||
Request,
|
||||
Data,
|
||||
*DataLength,
|
||||
NULL,
|
||||
NULL,
|
||||
1
|
||||
);
|
||||
Endpoint = (UINT8)(0 | ((TransferDirection == EfiUsbDataIn) ? 0x80 : 0));
|
||||
Urb = EhcCreateUrb (
|
||||
Ehc,
|
||||
DeviceAddress,
|
||||
Endpoint,
|
||||
DeviceSpeed,
|
||||
0,
|
||||
MaximumPacketLength,
|
||||
Translator,
|
||||
EHC_CTRL_TRANSFER,
|
||||
Request,
|
||||
Data,
|
||||
*DataLength,
|
||||
NULL,
|
||||
NULL,
|
||||
1
|
||||
);
|
||||
|
||||
if (Urb == NULL) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
@ -1152,7 +1156,7 @@ EhcEndOfPei (
|
||||
IN VOID *Ppi
|
||||
)
|
||||
{
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
PEI_USB2_HC_DEV *Ehc;
|
||||
|
||||
Ehc = PEI_RECOVERY_USB_EHC_DEV_FROM_THIS_NOTIFY (NotifyDescriptor);
|
||||
|
||||
@ -1177,14 +1181,14 @@ EhcPeimEntry (
|
||||
IN CONST EFI_PEI_SERVICES **PeiServices
|
||||
)
|
||||
{
|
||||
PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi;
|
||||
EFI_STATUS Status;
|
||||
UINT8 Index;
|
||||
UINTN ControllerType;
|
||||
UINTN BaseAddress;
|
||||
UINTN MemPages;
|
||||
PEI_USB2_HC_DEV *EhcDev;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
PEI_USB_CONTROLLER_PPI *ChipSetUsbControllerPpi;
|
||||
EFI_STATUS Status;
|
||||
UINT8 Index;
|
||||
UINTN ControllerType;
|
||||
UINTN BaseAddress;
|
||||
UINTN MemPages;
|
||||
PEI_USB2_HC_DEV *EhcDev;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
|
||||
//
|
||||
// Shadow this PEIM to run from memory
|
||||
@ -1197,7 +1201,7 @@ EhcPeimEntry (
|
||||
&gPeiUsbControllerPpiGuid,
|
||||
0,
|
||||
NULL,
|
||||
(VOID **) &ChipSetUsbControllerPpi
|
||||
(VOID **)&ChipSetUsbControllerPpi
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
@ -1206,7 +1210,7 @@ EhcPeimEntry (
|
||||
Index = 0;
|
||||
while (TRUE) {
|
||||
Status = ChipSetUsbControllerPpi->GetUsbController (
|
||||
(EFI_PEI_SERVICES **) PeiServices,
|
||||
(EFI_PEI_SERVICES **)PeiServices,
|
||||
ChipSetUsbControllerPpi,
|
||||
Index,
|
||||
&ControllerType,
|
||||
@ -1228,24 +1232,23 @@ EhcPeimEntry (
|
||||
}
|
||||
|
||||
MemPages = sizeof (PEI_USB2_HC_DEV) / PAGESIZE + 1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
MemPages,
|
||||
&TempPtr
|
||||
);
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
MemPages,
|
||||
&TempPtr
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
ZeroMem((VOID *)(UINTN)TempPtr, MemPages*PAGESIZE);
|
||||
EhcDev = (PEI_USB2_HC_DEV *) ((UINTN) TempPtr);
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, MemPages*PAGESIZE);
|
||||
EhcDev = (PEI_USB2_HC_DEV *)((UINTN)TempPtr);
|
||||
|
||||
EhcDev->Signature = USB2_HC_DEV_SIGNATURE;
|
||||
|
||||
IoMmuInit (&EhcDev->IoMmu);
|
||||
|
||||
EhcDev->UsbHostControllerBaseAddress = (UINT32) BaseAddress;
|
||||
|
||||
EhcDev->UsbHostControllerBaseAddress = (UINT32)BaseAddress;
|
||||
|
||||
EhcDev->HcStructParams = EhcReadCapRegister (EhcDev, EHC_HCSPARAMS_OFFSET);
|
||||
EhcDev->HcCapParams = EhcReadCapRegister (EhcDev, EHC_HCCPARAMS_OFFSET);
|
||||
@ -1258,16 +1261,16 @@ EhcPeimEntry (
|
||||
return Status;
|
||||
}
|
||||
|
||||
EhcDev->Usb2HostControllerPpi.ControlTransfer = EhcControlTransfer;
|
||||
EhcDev->Usb2HostControllerPpi.BulkTransfer = EhcBulkTransfer;
|
||||
EhcDev->Usb2HostControllerPpi.GetRootHubPortNumber = EhcGetRootHubPortNumber;
|
||||
EhcDev->Usb2HostControllerPpi.GetRootHubPortStatus = EhcGetRootHubPortStatus;
|
||||
EhcDev->Usb2HostControllerPpi.SetRootHubPortFeature = EhcSetRootHubPortFeature;
|
||||
EhcDev->Usb2HostControllerPpi.ClearRootHubPortFeature = EhcClearRootHubPortFeature;
|
||||
EhcDev->Usb2HostControllerPpi.ControlTransfer = EhcControlTransfer;
|
||||
EhcDev->Usb2HostControllerPpi.BulkTransfer = EhcBulkTransfer;
|
||||
EhcDev->Usb2HostControllerPpi.GetRootHubPortNumber = EhcGetRootHubPortNumber;
|
||||
EhcDev->Usb2HostControllerPpi.GetRootHubPortStatus = EhcGetRootHubPortStatus;
|
||||
EhcDev->Usb2HostControllerPpi.SetRootHubPortFeature = EhcSetRootHubPortFeature;
|
||||
EhcDev->Usb2HostControllerPpi.ClearRootHubPortFeature = EhcClearRootHubPortFeature;
|
||||
|
||||
EhcDev->PpiDescriptor.Flags = (EFI_PEI_PPI_DESCRIPTOR_PPI | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
|
||||
EhcDev->PpiDescriptor.Guid = &gPeiUsb2HostControllerPpiGuid;
|
||||
EhcDev->PpiDescriptor.Ppi = &EhcDev->Usb2HostControllerPpi;
|
||||
EhcDev->PpiDescriptor.Guid = &gPeiUsb2HostControllerPpiGuid;
|
||||
EhcDev->PpiDescriptor.Ppi = &EhcDev->Usb2HostControllerPpi;
|
||||
|
||||
Status = PeiServicesInstallPpi (&EhcDev->PpiDescriptor);
|
||||
if (EFI_ERROR (Status)) {
|
||||
@ -1275,8 +1278,8 @@ EhcPeimEntry (
|
||||
continue;
|
||||
}
|
||||
|
||||
EhcDev->EndOfPeiNotifyList.Flags = (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
|
||||
EhcDev->EndOfPeiNotifyList.Guid = &gEfiEndOfPeiSignalPpiGuid;
|
||||
EhcDev->EndOfPeiNotifyList.Flags = (EFI_PEI_PPI_DESCRIPTOR_NOTIFY_CALLBACK | EFI_PEI_PPI_DESCRIPTOR_TERMINATE_LIST);
|
||||
EhcDev->EndOfPeiNotifyList.Guid = &gEfiEndOfPeiSignalPpiGuid;
|
||||
EhcDev->EndOfPeiNotifyList.Notify = EhcEndOfPei;
|
||||
|
||||
PeiServicesNotifyPpi (&EhcDev->EndOfPeiNotifyList);
|
||||
@ -1296,12 +1299,11 @@ EhcPeimEntry (
|
||||
**/
|
||||
EFI_STATUS
|
||||
InitializeUsbHC (
|
||||
IN PEI_USB2_HC_DEV *EhcDev
|
||||
IN PEI_USB2_HC_DEV *EhcDev
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
|
||||
EhcResetHC (EhcDev, EHC_RESET_TIMEOUT);
|
||||
|
||||
Status = EhcInitHC (EhcDev);
|
||||
|
@ -28,46 +28,44 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
|
||||
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 "EhciReg.h"
|
||||
#include "EhciUrb.h"
|
||||
#include "EhciSched.h"
|
||||
|
||||
#define EFI_USB_SPEED_FULL 0x0000
|
||||
#define EFI_USB_SPEED_LOW 0x0001
|
||||
#define EFI_USB_SPEED_HIGH 0x0002
|
||||
#define EFI_USB_SPEED_FULL 0x0000
|
||||
#define EFI_USB_SPEED_LOW 0x0001
|
||||
#define EFI_USB_SPEED_HIGH 0x0002
|
||||
|
||||
#define PAGESIZE 4096
|
||||
#define PAGESIZE 4096
|
||||
|
||||
#define EHC_1_MICROSECOND 1
|
||||
#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
|
||||
#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
|
||||
#define EHC_1_MICROSECOND 1
|
||||
#define EHC_1_MILLISECOND (1000 * EHC_1_MICROSECOND)
|
||||
#define EHC_1_SECOND (1000 * EHC_1_MILLISECOND)
|
||||
|
||||
//
|
||||
// EHCI register operation timeout, set by experience
|
||||
//
|
||||
#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
|
||||
#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
|
||||
|
||||
#define EHC_RESET_TIMEOUT (1 * EHC_1_SECOND)
|
||||
#define EHC_GENERIC_TIMEOUT (10 * EHC_1_MILLISECOND)
|
||||
|
||||
//
|
||||
// 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.
|
||||
//
|
||||
#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_HIGH_32BIT(Addr64) ((UINT32)(RShiftU64((UINTN)(Addr64), 32) & 0XFFFFFFFF))
|
||||
#define EHC_BIT_IS_SET(Data, Bit) ((BOOLEAN)(((Data) & (Bit)) == (Bit)))
|
||||
#define EHC_LOW_32BIT(Addr64) ((UINT32)(((UINTN)(Addr64)) & 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_REG_BIT_IS_SET(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')
|
||||
|
||||
struct _PEI_USB2_HC_DEV {
|
||||
UINTN Signature;
|
||||
PEI_USB2_HOST_CONTROLLER_PPI Usb2HostControllerPpi;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
|
||||
UINTN Signature;
|
||||
PEI_USB2_HOST_CONTROLLER_PPI Usb2HostControllerPpi;
|
||||
EDKII_IOMMU_PPI *IoMmu;
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
|
||||
//
|
||||
// EndOfPei callback is used to stop the EHC DMA operation
|
||||
// after exit PEI phase.
|
||||
//
|
||||
EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;
|
||||
UINT32 UsbHostControllerBaseAddress;
|
||||
PEI_URB *Urb;
|
||||
USBHC_MEM_POOL *MemPool;
|
||||
EFI_PEI_NOTIFY_DESCRIPTOR EndOfPeiNotifyList;
|
||||
UINT32 UsbHostControllerBaseAddress;
|
||||
PEI_URB *Urb;
|
||||
USBHC_MEM_POOL *MemPool;
|
||||
|
||||
//
|
||||
// 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
|
||||
// status stage.
|
||||
//
|
||||
PEI_EHC_QTD *ShortReadStop;
|
||||
EFI_EVENT PollTimer;
|
||||
PEI_EHC_QTD *ShortReadStop;
|
||||
EFI_EVENT PollTimer;
|
||||
|
||||
//
|
||||
// Asynchronous(bulk and control) transfer schedule data:
|
||||
// ReclaimHead is used as the head of the asynchronous transfer
|
||||
// list. It acts as the reclamation header.
|
||||
//
|
||||
PEI_EHC_QH *ReclaimHead;
|
||||
PEI_EHC_QH *ReclaimHead;
|
||||
|
||||
//
|
||||
// Periodic (interrupt) transfer schedule data:
|
||||
//
|
||||
VOID *PeriodFrame; // Mapped as common buffer
|
||||
VOID *PeriodFrameMap;
|
||||
VOID *PeriodFrame; // Mapped as common buffer
|
||||
VOID *PeriodFrameMap;
|
||||
|
||||
PEI_EHC_QH *PeriodOne;
|
||||
EFI_LIST_ENTRY AsyncIntTransfers;
|
||||
PEI_EHC_QH *PeriodOne;
|
||||
EFI_LIST_ENTRY AsyncIntTransfers;
|
||||
|
||||
//
|
||||
// EHCI configuration data
|
||||
//
|
||||
UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
|
||||
UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
|
||||
UINT32 CapLen; // Capability length
|
||||
UINT32 High32bitAddr;
|
||||
UINT32 HcStructParams; // Cache of HC structure parameter, EHC_HCSPARAMS_OFFSET
|
||||
UINT32 HcCapParams; // Cache of HC capability parameter, HCCPARAMS
|
||||
UINT32 CapLen; // Capability length
|
||||
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_THIS_NOTIFY(a) CR (a, PEI_USB2_HC_DEV, EndOfPeiNotifyList, 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)
|
||||
|
||||
/**
|
||||
@param EhcDev EHCI Device.
|
||||
@ -137,7 +135,7 @@ struct _PEI_USB2_HC_DEV {
|
||||
**/
|
||||
EFI_STATUS
|
||||
InitializeUsbHC (
|
||||
IN PEI_USB2_HC_DEV *EhcDev
|
||||
IN PEI_USB2_HC_DEV *EhcDev
|
||||
);
|
||||
|
||||
/**
|
||||
@ -154,9 +152,9 @@ InitializeUsbHC (
|
||||
**/
|
||||
USBHC_MEM_POOL *
|
||||
UsbHcInitMemPool (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN BOOLEAN Check4G,
|
||||
IN UINT32 Which4G
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN BOOLEAN Check4G,
|
||||
IN UINT32 Which4G
|
||||
)
|
||||
;
|
||||
|
||||
@ -172,8 +170,8 @@ UsbHcInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UsbHcFreeMemPool (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
)
|
||||
;
|
||||
|
||||
@ -190,9 +188,9 @@ UsbHcFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
UsbHcAllocateMem (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
)
|
||||
;
|
||||
|
||||
@ -207,10 +205,10 @@ UsbHcAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
UsbHcFreeMem (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
;
|
||||
|
||||
@ -253,8 +251,8 @@ IoMmuMap (
|
||||
**/
|
||||
VOID
|
||||
IoMmuUnmap (
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN VOID *Mapping
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@ -296,10 +294,10 @@ IoMmuAllocateBuffer (
|
||||
**/
|
||||
VOID
|
||||
IoMmuFreeBuffer (
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
IN EDKII_IOMMU_PPI *IoMmu,
|
||||
IN UINTN Pages,
|
||||
IN VOID *HostAddress,
|
||||
IN VOID *Mapping
|
||||
);
|
||||
|
||||
/**
|
||||
@ -310,7 +308,7 @@ IoMmuFreeBuffer (
|
||||
**/
|
||||
VOID
|
||||
IoMmuInit (
|
||||
OUT EDKII_IOMMU_PPI **IoMmu
|
||||
OUT EDKII_IOMMU_PPI **IoMmu
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -10,20 +10,18 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EFI_EHCI_REG_H_
|
||||
#define _EFI_EHCI_REG_H_
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Capability register offset
|
||||
//
|
||||
#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
|
||||
#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
|
||||
#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
|
||||
#define EHC_CAPLENGTH_OFFSET 0 // Capability register length offset
|
||||
#define EHC_HCSPARAMS_OFFSET 0x04 // Structural Parameters 04-07h
|
||||
#define EHC_HCCPARAMS_OFFSET 0x08 // Capability parameters offset
|
||||
|
||||
//
|
||||
// Capability register bit definition
|
||||
//
|
||||
#define HCSP_NPORTS 0x0F // Number of root hub port
|
||||
#define HCCP_64BIT 0x01 // 64-bit addressing capability
|
||||
#define HCSP_NPORTS 0x0F // Number of root hub port
|
||||
#define HCCP_64BIT 0x01 // 64-bit addressing capability
|
||||
|
||||
//
|
||||
// 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_PORT_STAT_OFFSET 0x44 // Port status/control offset
|
||||
|
||||
#define EHC_FRAME_LEN 1024
|
||||
#define EHC_FRAME_LEN 1024
|
||||
|
||||
//
|
||||
// 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_RESET 0x02 // Start the host controller reset
|
||||
#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
|
||||
#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
|
||||
#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
|
||||
#define USBCMD_RUN 0x01 // Run/stop
|
||||
#define USBCMD_RESET 0x02 // Start the host controller reset
|
||||
#define USBCMD_ENABLE_PERIOD 0x10 // Enable periodic schedule
|
||||
#define USBCMD_ENABLE_ASYNC 0x20 // Enable asynchronous schedule
|
||||
#define USBCMD_IAAD 0x40 // Interrupt on async advance doorbell
|
||||
|
||||
#define USBSTS_IAA 0x20 // Interrupt on async advance
|
||||
#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
|
||||
#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
|
||||
#define USBSTS_HALT 0x1000 // Host controller halted
|
||||
#define USBSTS_SYS_ERROR 0x10 // Host system error
|
||||
#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
|
||||
#define USBSTS_IAA 0x20 // Interrupt on async advance
|
||||
#define USBSTS_PERIOD_ENABLED 0x4000 // Periodic schedule status
|
||||
#define USBSTS_ASYNC_ENABLED 0x8000 // Asynchronous schedule status
|
||||
#define USBSTS_HALT 0x1000 // Host controller halted
|
||||
#define USBSTS_SYS_ERROR 0x10 // Host system error
|
||||
#define USBSTS_INTACK_MASK 0x003F // Mask for the interrupt ACK, the WC
|
||||
// (write clean) bits in USBSTS register
|
||||
|
||||
#define PORTSC_CONN 0x01 // Current Connect Status
|
||||
#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
|
||||
#define PORTSC_ENABLED 0x04 // Port Enable / Disable
|
||||
#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
|
||||
#define PORTSC_OVERCUR 0x10 // Over current Active
|
||||
#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
|
||||
#define PORSTSC_RESUME 0x40 // Force Port Resume
|
||||
#define PORTSC_SUSPEND 0x80 // Port Suspend State
|
||||
#define PORTSC_RESET 0x100 // Port Reset
|
||||
#define PORTSC_LINESTATE_K 0x400 // Line Status K-state
|
||||
#define PORTSC_LINESTATE_J 0x800 // Line Status J-state
|
||||
#define PORTSC_POWER 0x1000 // Port Power
|
||||
#define PORTSC_OWNER 0x2000 // Port Owner
|
||||
#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
|
||||
#define PORTSC_CONN 0x01 // Current Connect Status
|
||||
#define PORTSC_CONN_CHANGE 0x02 // Connect Status Change
|
||||
#define PORTSC_ENABLED 0x04 // Port Enable / Disable
|
||||
#define PORTSC_ENABLE_CHANGE 0x08 // Port Enable / Disable Change
|
||||
#define PORTSC_OVERCUR 0x10 // Over current Active
|
||||
#define PORTSC_OVERCUR_CHANGE 0x20 // Over current Change
|
||||
#define PORSTSC_RESUME 0x40 // Force Port Resume
|
||||
#define PORTSC_SUSPEND 0x80 // Port Suspend State
|
||||
#define PORTSC_RESET 0x100 // Port Reset
|
||||
#define PORTSC_LINESTATE_K 0x400 // Line Status K-state
|
||||
#define PORTSC_LINESTATE_J 0x800 // Line Status J-state
|
||||
#define PORTSC_POWER 0x1000 // Port Power
|
||||
#define PORTSC_OWNER 0x2000 // Port Owner
|
||||
#define PORTSC_CHANGE_MASK 0x2A // Mask of the port change bits,
|
||||
// they are WC (write clean)
|
||||
//
|
||||
// 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) \
|
||||
((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
|
||||
// UEFI's port states.
|
||||
//
|
||||
typedef struct {
|
||||
UINT16 HwState;
|
||||
UINT16 UefiState;
|
||||
UINT16 HwState;
|
||||
UINT16 UefiState;
|
||||
} USB_PORT_STATE_MAP;
|
||||
|
||||
//
|
||||
@ -100,13 +98,12 @@ typedef struct {
|
||||
//
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT8 Pi;
|
||||
UINT8 SubClassCode;
|
||||
UINT8 BaseCode;
|
||||
UINT8 Pi;
|
||||
UINT8 SubClassCode;
|
||||
UINT8 BaseCode;
|
||||
} USB_CLASSC;
|
||||
#pragma pack()
|
||||
|
||||
|
||||
/**
|
||||
Read EHCI capability register.
|
||||
|
||||
@ -118,8 +115,8 @@ typedef struct {
|
||||
**/
|
||||
UINT32
|
||||
EhcReadCapRegister (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
;
|
||||
|
||||
@ -134,8 +131,8 @@ EhcReadCapRegister (
|
||||
**/
|
||||
UINT32
|
||||
EhcReadOpReg (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset
|
||||
)
|
||||
;
|
||||
|
||||
@ -149,9 +146,9 @@ EhcReadOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcWriteOpReg (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Offset,
|
||||
IN UINT32 Data
|
||||
)
|
||||
;
|
||||
|
||||
@ -163,7 +160,7 @@ EhcWriteOpReg (
|
||||
**/
|
||||
VOID
|
||||
EhcClearLegacySupport (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
@ -180,8 +177,8 @@ EhcClearLegacySupport (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcSetAndWaitDoorBell (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
;
|
||||
|
||||
@ -194,7 +191,7 @@ EhcSetAndWaitDoorBell (
|
||||
**/
|
||||
VOID
|
||||
EhcAckAllInterrupt (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
@ -209,7 +206,7 @@ EhcAckAllInterrupt (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsHalt (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
@ -224,7 +221,7 @@ EhcIsHalt (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcIsSysError (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
@ -240,8 +237,8 @@ EhcIsSysError (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcResetHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
;
|
||||
|
||||
@ -257,8 +254,8 @@ EhcResetHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcHaltHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
;
|
||||
|
||||
@ -274,8 +271,8 @@ EhcHaltHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcRunHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT32 Timeout
|
||||
)
|
||||
;
|
||||
|
||||
@ -296,7 +293,7 @@ EhcRunHC (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitHC (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
|
@ -22,13 +22,13 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcCreateHelpQ (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
USB_ENDPOINT Ep;
|
||||
PEI_EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
USB_ENDPOINT Ep;
|
||||
PEI_EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
|
||||
//
|
||||
// Create an inactive Qtd to terminate the short packet read.
|
||||
@ -39,25 +39,25 @@ EhcCreateHelpQ (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Qtd->QtdHw.Status = QTD_STAT_HALTED;
|
||||
Ehc->ShortReadStop = Qtd;
|
||||
Qtd->QtdHw.Status = QTD_STAT_HALTED;
|
||||
Ehc->ShortReadStop = Qtd;
|
||||
|
||||
//
|
||||
// Create a QH to act as the EHC reclamation header.
|
||||
// Set the header to loopback to itself.
|
||||
//
|
||||
Ep.DevAddr = 0;
|
||||
Ep.EpAddr = 1;
|
||||
Ep.Direction = EfiUsbDataIn;
|
||||
Ep.DevSpeed = EFI_USB_SPEED_HIGH;
|
||||
Ep.MaxPacket = 64;
|
||||
Ep.HubAddr = 0;
|
||||
Ep.HubPort = 0;
|
||||
Ep.Toggle = 0;
|
||||
Ep.Type = EHC_BULK_TRANSFER;
|
||||
Ep.PollRate = 1;
|
||||
Ep.DevAddr = 0;
|
||||
Ep.EpAddr = 1;
|
||||
Ep.Direction = EfiUsbDataIn;
|
||||
Ep.DevSpeed = EFI_USB_SPEED_HIGH;
|
||||
Ep.MaxPacket = 64;
|
||||
Ep.HubAddr = 0;
|
||||
Ep.HubPort = 0;
|
||||
Ep.Toggle = 0;
|
||||
Ep.Type = EHC_BULK_TRANSFER;
|
||||
Ep.PollRate = 1;
|
||||
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
|
||||
if (Qh == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -72,10 +72,10 @@ EhcCreateHelpQ (
|
||||
//
|
||||
// Create a dummy QH to act as the terminator for periodical schedule
|
||||
//
|
||||
Ep.EpAddr = 2;
|
||||
Ep.Type = EHC_INT_TRANSFER_SYNC;
|
||||
Ep.EpAddr = 2;
|
||||
Ep.Type = EHC_INT_TRANSFER_SYNC;
|
||||
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
Qh = EhcCreateQh (Ehc, &Ep);
|
||||
|
||||
if (Qh == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
@ -98,7 +98,7 @@ EhcCreateHelpQ (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitSched (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
VOID *Buf;
|
||||
@ -132,9 +132,9 @@ EhcInitSched (
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
Ehc->PeriodFrame = Buf;
|
||||
Ehc->PeriodFrameMap = Map;
|
||||
Ehc->High32bitAddr = EHC_HIGH_32BIT (PhyAddr);
|
||||
Ehc->PeriodFrame = Buf;
|
||||
Ehc->PeriodFrameMap = Map;
|
||||
Ehc->High32bitAddr = EHC_HIGH_32BIT (PhyAddr);
|
||||
|
||||
//
|
||||
// Init memory pool management then create the helper
|
||||
@ -160,8 +160,8 @@ EhcInitSched (
|
||||
//
|
||||
// Initialize the frame list entries then set the registers
|
||||
//
|
||||
Desc = (UINT32 *) Ehc->PeriodFrame;
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (PEI_EHC_QH));
|
||||
Desc = (UINT32 *)Ehc->PeriodFrame;
|
||||
PciAddr = UsbHcGetPciAddressForHostMem (Ehc->MemPool, Ehc->PeriodOne, sizeof (PEI_EHC_QH));
|
||||
for (Index = 0; Index < EHC_FRAME_LEN; Index++) {
|
||||
Desc[Index] = QH_LINK (PciAddr, EHC_TYPE_QH, FALSE);
|
||||
}
|
||||
@ -173,7 +173,7 @@ EhcInitSched (
|
||||
// Only need to set the AsynListAddr register to
|
||||
// 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));
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
@ -186,7 +186,7 @@ EhcInitSched (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeSched (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
{
|
||||
EhcWriteOpReg (Ehc, EHC_FRAME_BASE_OFFSET, 0);
|
||||
@ -231,24 +231,24 @@ EhcFreeSched (
|
||||
**/
|
||||
VOID
|
||||
EhcLinkQhToAsync (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
)
|
||||
{
|
||||
PEI_EHC_QH *Head;
|
||||
PEI_EHC_QH *Head;
|
||||
|
||||
//
|
||||
// Append the queue head after the reclaim header, then
|
||||
// fix the hardware visiable parts (EHCI R1.0 page 72).
|
||||
// ReclaimHead is always linked to the EHCI's AsynListAddr.
|
||||
//
|
||||
Head = Ehc->ReclaimHead;
|
||||
Head = Ehc->ReclaimHead;
|
||||
|
||||
Qh->NextQh = Head->NextQh;
|
||||
Head->NextQh = Qh;
|
||||
Qh->NextQh = Head->NextQh;
|
||||
Head->NextQh = Qh;
|
||||
|
||||
Qh->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);;
|
||||
Head->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE);
|
||||
Qh->QhHw.HorizonLink = QH_LINK (Head, EHC_TYPE_QH, FALSE);
|
||||
Head->QhHw.HorizonLink = QH_LINK (Qh, EHC_TYPE_QH, FALSE);
|
||||
}
|
||||
|
||||
/**
|
||||
@ -261,11 +261,11 @@ EhcLinkQhToAsync (
|
||||
**/
|
||||
VOID
|
||||
EhcUnlinkQhFromAsync (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
)
|
||||
{
|
||||
PEI_EHC_QH *Head;
|
||||
PEI_EHC_QH *Head;
|
||||
|
||||
ASSERT (Ehc->ReclaimHead->NextQh == Qh);
|
||||
|
||||
@ -274,12 +274,12 @@ EhcUnlinkQhFromAsync (
|
||||
// visiable part: Only need to loopback the ReclaimHead. The Qh
|
||||
// is pointing to ReclaimHead (which is staill in the list).
|
||||
//
|
||||
Head = Ehc->ReclaimHead;
|
||||
Head = Ehc->ReclaimHead;
|
||||
|
||||
Head->NextQh = Qh->NextQh;
|
||||
Qh->NextQh = NULL;
|
||||
Head->NextQh = Qh->NextQh;
|
||||
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
|
||||
@ -302,22 +302,22 @@ EhcUnlinkQhFromAsync (
|
||||
**/
|
||||
BOOLEAN
|
||||
EhcCheckUrbResult (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
)
|
||||
{
|
||||
EFI_LIST_ENTRY *Entry;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINT8 State;
|
||||
BOOLEAN Finished;
|
||||
EFI_LIST_ENTRY *Entry;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINT8 State;
|
||||
BOOLEAN Finished;
|
||||
|
||||
ASSERT ((Ehc != NULL) && (Urb != NULL) && (Urb->Qh != NULL));
|
||||
|
||||
Finished = TRUE;
|
||||
Urb->Completed = 0;
|
||||
Finished = TRUE;
|
||||
Urb->Completed = 0;
|
||||
|
||||
Urb->Result = EFI_USB_NOERROR;
|
||||
Urb->Result = EFI_USB_NOERROR;
|
||||
|
||||
if (EhcIsHalt (Ehc) || EhcIsSysError (Ehc)) {
|
||||
Urb->Result |= EFI_USB_ERR_SYSTEM;
|
||||
@ -327,7 +327,7 @@ EhcCheckUrbResult (
|
||||
BASE_LIST_FOR_EACH (Entry, &Urb->Qh->Qtds) {
|
||||
Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList);
|
||||
QtdHw = &Qtd->QtdHw;
|
||||
State = (UINT8) QtdHw->Status;
|
||||
State = (UINT8)QtdHw->Status;
|
||||
|
||||
if (EHC_BIT_IS_SET (State, QTD_STAT_HALTED)) {
|
||||
//
|
||||
@ -352,7 +352,6 @@ EhcCheckUrbResult (
|
||||
|
||||
Finished = TRUE;
|
||||
goto ON_EXIT;
|
||||
|
||||
} else if (EHC_BIT_IS_SET (State, QTD_STAT_ACTIVE)) {
|
||||
//
|
||||
// The QTD is still active, no need to check furthur.
|
||||
@ -361,7 +360,6 @@ EhcCheckUrbResult (
|
||||
|
||||
Finished = FALSE;
|
||||
goto ON_EXIT;
|
||||
|
||||
} else {
|
||||
//
|
||||
// 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)) {
|
||||
//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,
|
||||
@ -381,7 +379,6 @@ EhcCheckUrbResult (
|
||||
// Status Stage of the setup transfer to get the finial result
|
||||
//
|
||||
if (QtdHw->AltNext == QTD_LINK (Ehc->ShortReadStop, FALSE)) {
|
||||
|
||||
Finished = TRUE;
|
||||
goto ON_EXIT;
|
||||
}
|
||||
@ -399,7 +396,7 @@ ON_EXIT:
|
||||
// NOTICE: don't move DT update before the loop, otherwise there is
|
||||
// a race condition that DT is wrong.
|
||||
//
|
||||
Urb->DataToggle = (UINT8) Urb->Qh->QhHw.DataToggle;
|
||||
Urb->DataToggle = (UINT8)Urb->Qh->QhHw.DataToggle;
|
||||
|
||||
return Finished;
|
||||
}
|
||||
@ -418,19 +415,19 @@ ON_EXIT:
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcExecTransfer (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
UINTN Loop;
|
||||
BOOLEAN Finished;
|
||||
BOOLEAN InfiniteLoop;
|
||||
EFI_STATUS Status;
|
||||
UINTN Index;
|
||||
UINTN Loop;
|
||||
BOOLEAN Finished;
|
||||
BOOLEAN InfiniteLoop;
|
||||
|
||||
Status = EFI_SUCCESS;
|
||||
Loop = TimeOut * EHC_1_MILLISECOND;
|
||||
Status = EFI_SUCCESS;
|
||||
Loop = TimeOut * EHC_1_MILLISECOND;
|
||||
Finished = FALSE;
|
||||
InfiniteLoop = FALSE;
|
||||
|
||||
@ -460,4 +457,3 @@ EhcExecTransfer (
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
@ -21,7 +21,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcInitSched (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
@ -33,7 +33,7 @@ EhcInitSched (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeSched (
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
IN PEI_USB2_HC_DEV *Ehc
|
||||
)
|
||||
;
|
||||
|
||||
@ -50,8 +50,8 @@ EhcFreeSched (
|
||||
**/
|
||||
VOID
|
||||
EhcLinkQhToAsync (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
)
|
||||
;
|
||||
|
||||
@ -65,8 +65,8 @@ EhcLinkQhToAsync (
|
||||
**/
|
||||
VOID
|
||||
EhcUnlinkQhFromAsync (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_EHC_QH *Qh
|
||||
)
|
||||
;
|
||||
|
||||
@ -84,9 +84,9 @@ EhcUnlinkQhFromAsync (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcExecTransfer (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb,
|
||||
IN UINTN TimeOut
|
||||
)
|
||||
;
|
||||
|
||||
|
@ -27,19 +27,19 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
PEI_EHC_QTD *
|
||||
EhcCreateQtd (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
)
|
||||
{
|
||||
PEI_EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
UINTN Len;
|
||||
UINTN ThisBufLen;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
QTD_HW *QtdHw;
|
||||
UINTN Index;
|
||||
UINTN Len;
|
||||
UINTN ThisBufLen;
|
||||
|
||||
ASSERT (Ehc != NULL);
|
||||
|
||||
@ -49,9 +49,9 @@ EhcCreateQtd (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Qtd->Signature = EHC_QTD_SIG;
|
||||
Qtd->Data = Data;
|
||||
Qtd->DataLen = 0;
|
||||
Qtd->Signature = EHC_QTD_SIG;
|
||||
Qtd->Data = Data;
|
||||
Qtd->DataLen = 0;
|
||||
|
||||
InitializeListHead (&Qtd->QtdList);
|
||||
|
||||
@ -77,17 +77,17 @@ EhcCreateQtd (
|
||||
// compute the offset and clear Reserved fields. This is already
|
||||
// done in the data point.
|
||||
//
|
||||
QtdHw->Page[Index] = EHC_LOW_32BIT (Data);
|
||||
QtdHw->PageHigh[Index] = EHC_HIGH_32BIT (Data);
|
||||
QtdHw->Page[Index] = EHC_LOW_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) {
|
||||
Len = DataLen;
|
||||
break;
|
||||
}
|
||||
|
||||
Len += ThisBufLen;
|
||||
Len += ThisBufLen;
|
||||
Data += ThisBufLen;
|
||||
}
|
||||
|
||||
@ -101,7 +101,7 @@ EhcCreateQtd (
|
||||
Len = Len - Len % MaxPacket;
|
||||
}
|
||||
|
||||
QtdHw->TotalBytes = (UINT32) Len;
|
||||
QtdHw->TotalBytes = (UINT32)Len;
|
||||
Qtd->DataLen = Len;
|
||||
}
|
||||
|
||||
@ -121,8 +121,8 @@ EhcCreateQtd (
|
||||
**/
|
||||
VOID
|
||||
EhcInitIntQh (
|
||||
IN USB_ENDPOINT *Ep,
|
||||
IN QH_HW *QhHw
|
||||
IN USB_ENDPOINT *Ep,
|
||||
IN QH_HW *QhHw
|
||||
)
|
||||
{
|
||||
//
|
||||
@ -134,7 +134,7 @@ EhcInitIntQh (
|
||||
//
|
||||
if (Ep->DevSpeed == EFI_USB_SPEED_HIGH) {
|
||||
QhHw->SMask = QH_MICROFRAME_0;
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
||||
//
|
||||
@ -163,12 +163,12 @@ EhcInitIntQh (
|
||||
**/
|
||||
PEI_EHC_QH *
|
||||
EhcCreateQh (
|
||||
IN PEI_USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
IN PEI_USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
)
|
||||
{
|
||||
PEI_EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
PEI_EHC_QH *Qh;
|
||||
QH_HW *QhHw;
|
||||
|
||||
Qh = UsbHcAllocateMem (Ehci, Ehci->MemPool, sizeof (PEI_EHC_QH));
|
||||
|
||||
@ -176,62 +176,63 @@ EhcCreateQh (
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Qh->Signature = EHC_QH_SIG;
|
||||
Qh->NextQh = NULL;
|
||||
Qh->Interval = Ep->PollRate;
|
||||
Qh->Signature = EHC_QH_SIG;
|
||||
Qh->NextQh = NULL;
|
||||
Qh->Interval = Ep->PollRate;
|
||||
|
||||
InitializeListHead (&Qh->Qtds);
|
||||
|
||||
QhHw = &Qh->QhHw;
|
||||
QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
|
||||
QhHw->DeviceAddr = Ep->DevAddr;
|
||||
QhHw->Inactive = 0;
|
||||
QhHw->EpNum = Ep->EpAddr;
|
||||
QhHw->EpSpeed = Ep->DevSpeed;
|
||||
QhHw->DtCtrl = 0;
|
||||
QhHw->ReclaimHead = 0;
|
||||
QhHw->MaxPacketLen = (UINT32) Ep->MaxPacket;
|
||||
QhHw->CtrlEp = 0;
|
||||
QhHw->NakReload = QH_NAK_RELOAD;
|
||||
QhHw->HubAddr = Ep->HubAddr;
|
||||
QhHw->PortNum = Ep->HubPort;
|
||||
QhHw->Multiplier = 1;
|
||||
QhHw->DataToggle = Ep->Toggle;
|
||||
QhHw = &Qh->QhHw;
|
||||
QhHw->HorizonLink = QH_LINK (NULL, 0, TRUE);
|
||||
QhHw->DeviceAddr = Ep->DevAddr;
|
||||
QhHw->Inactive = 0;
|
||||
QhHw->EpNum = Ep->EpAddr;
|
||||
QhHw->EpSpeed = Ep->DevSpeed;
|
||||
QhHw->DtCtrl = 0;
|
||||
QhHw->ReclaimHead = 0;
|
||||
QhHw->MaxPacketLen = (UINT32)Ep->MaxPacket;
|
||||
QhHw->CtrlEp = 0;
|
||||
QhHw->NakReload = QH_NAK_RELOAD;
|
||||
QhHw->HubAddr = Ep->HubAddr;
|
||||
QhHw->PortNum = Ep->HubPort;
|
||||
QhHw->Multiplier = 1;
|
||||
QhHw->DataToggle = Ep->Toggle;
|
||||
|
||||
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
QhHw->Status |= QTD_STAT_DO_SS;
|
||||
}
|
||||
|
||||
switch (Ep->Type) {
|
||||
case EHC_CTRL_TRANSFER:
|
||||
//
|
||||
// Special initialization for the control transfer:
|
||||
// 1. Control transfer initialize data toggle from each QTD
|
||||
// 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
|
||||
//
|
||||
QhHw->DtCtrl = 1;
|
||||
case EHC_CTRL_TRANSFER:
|
||||
//
|
||||
// Special initialization for the control transfer:
|
||||
// 1. Control transfer initialize data toggle from each QTD
|
||||
// 2. Set the Control Endpoint Flag (C) for low/full speed endpoint.
|
||||
//
|
||||
QhHw->DtCtrl = 1;
|
||||
|
||||
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
QhHw->CtrlEp = 1;
|
||||
}
|
||||
break;
|
||||
if (Ep->DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
QhHw->CtrlEp = 1;
|
||||
}
|
||||
|
||||
case EHC_INT_TRANSFER_ASYNC:
|
||||
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;
|
||||
break;
|
||||
|
||||
case EHC_BULK_TRANSFER:
|
||||
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
|
||||
QhHw->Status |= QTD_STAT_DO_PING;
|
||||
}
|
||||
case EHC_INT_TRANSFER_ASYNC:
|
||||
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;
|
||||
|
||||
break;
|
||||
case EHC_BULK_TRANSFER:
|
||||
if ((Ep->DevSpeed == EFI_USB_SPEED_HIGH) && (Ep->Direction == EfiUsbDataOut)) {
|
||||
QhHw->Status |= QTD_STAT_DO_PING;
|
||||
}
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
return Qh;
|
||||
@ -252,10 +253,10 @@ EhcCreateQh (
|
||||
**/
|
||||
UINTN
|
||||
EhcConvertPollRate (
|
||||
IN UINTN Interval
|
||||
IN UINTN Interval
|
||||
)
|
||||
{
|
||||
UINTN BitCount;
|
||||
UINTN BitCount;
|
||||
|
||||
if (Interval == 0) {
|
||||
return 1;
|
||||
@ -283,13 +284,13 @@ EhcConvertPollRate (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeQtds (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN EFI_LIST_ENTRY *Qtds
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN EFI_LIST_ENTRY *Qtds
|
||||
)
|
||||
{
|
||||
EFI_LIST_ENTRY *Entry;
|
||||
EFI_LIST_ENTRY *Next;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
EFI_LIST_ENTRY *Entry;
|
||||
EFI_LIST_ENTRY *Next;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
|
||||
BASE_LIST_FOR_EACH_SAFE (Entry, Next, Qtds) {
|
||||
Qtd = EFI_LIST_CONTAINER (Entry, PEI_EHC_QTD, QtdList);
|
||||
@ -308,8 +309,8 @@ EhcFreeQtds (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeUrb (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
)
|
||||
{
|
||||
if (Urb->RequestPhy != NULL) {
|
||||
@ -342,20 +343,20 @@ EhcFreeUrb (
|
||||
**/
|
||||
EFI_STATUS
|
||||
EhcCreateQtds (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
)
|
||||
{
|
||||
USB_ENDPOINT *Ep;
|
||||
PEI_EHC_QH *Qh;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
PEI_EHC_QTD *StatusQtd;
|
||||
PEI_EHC_QTD *NextQtd;
|
||||
EFI_LIST_ENTRY *Entry;
|
||||
UINT32 AlterNext;
|
||||
UINT8 Toggle;
|
||||
UINTN Len;
|
||||
UINT8 Pid;
|
||||
USB_ENDPOINT *Ep;
|
||||
PEI_EHC_QH *Qh;
|
||||
PEI_EHC_QTD *Qtd;
|
||||
PEI_EHC_QTD *StatusQtd;
|
||||
PEI_EHC_QTD *NextQtd;
|
||||
EFI_LIST_ENTRY *Entry;
|
||||
UINT32 AlterNext;
|
||||
UINT8 Toggle;
|
||||
UINTN Len;
|
||||
UINT8 Pid;
|
||||
|
||||
ASSERT ((Urb != NULL) && (Urb->Qh != NULL));
|
||||
|
||||
@ -428,7 +429,7 @@ EhcCreateQtds (
|
||||
while (Len < Urb->DataLen) {
|
||||
Qtd = EhcCreateQtd (
|
||||
Ehc,
|
||||
(UINT8 *) Urb->DataPhy + Len,
|
||||
(UINT8 *)Urb->DataPhy + Len,
|
||||
Urb->DataLen - Len,
|
||||
Pid,
|
||||
Toggle,
|
||||
@ -446,7 +447,7 @@ EhcCreateQtds (
|
||||
// Switch the Toggle bit if odd number of packets are included in the QTD.
|
||||
//
|
||||
if (((Qtd->DataLen + Ep->MaxPacket - 1) / Ep->MaxPacket) % 2) {
|
||||
Toggle = (UINT8) (1 - Toggle);
|
||||
Toggle = (UINT8)(1 - Toggle);
|
||||
}
|
||||
|
||||
Len += Qtd->DataLen;
|
||||
@ -472,15 +473,15 @@ EhcCreateQtds (
|
||||
break;
|
||||
}
|
||||
|
||||
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, PEI_EHC_QTD, QtdList);
|
||||
Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE);
|
||||
NextQtd = EFI_LIST_CONTAINER (Entry->ForwardLink, PEI_EHC_QTD, QtdList);
|
||||
Qtd->QtdHw.NextQtd = QTD_LINK (NextQtd, FALSE);
|
||||
}
|
||||
|
||||
//
|
||||
// Link the QTDs to the queue head
|
||||
//
|
||||
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, PEI_EHC_QTD, QtdList);
|
||||
Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE);
|
||||
NextQtd = EFI_LIST_CONTAINER (Qh->Qtds.ForwardLink, PEI_EHC_QTD, QtdList);
|
||||
Qh->QhHw.NextQtd = QTD_LINK (NextQtd, FALSE);
|
||||
return EFI_SUCCESS;
|
||||
|
||||
ON_ERROR:
|
||||
@ -511,63 +512,63 @@ ON_ERROR:
|
||||
**/
|
||||
PEI_URB *
|
||||
EhcCreateUrb (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
)
|
||||
{
|
||||
USB_ENDPOINT *Ep;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
EDKII_IOMMU_OPERATION MapOp;
|
||||
EFI_STATUS Status;
|
||||
UINTN Len;
|
||||
PEI_URB *Urb;
|
||||
VOID *Map;
|
||||
USB_ENDPOINT *Ep;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
EDKII_IOMMU_OPERATION MapOp;
|
||||
EFI_STATUS Status;
|
||||
UINTN Len;
|
||||
PEI_URB *Urb;
|
||||
VOID *Map;
|
||||
|
||||
Map = NULL;
|
||||
|
||||
Urb = Ehc->Urb;
|
||||
Urb->Signature = EHC_URB_SIG;
|
||||
Urb = Ehc->Urb;
|
||||
Urb->Signature = EHC_URB_SIG;
|
||||
InitializeListHead (&Urb->UrbList);
|
||||
|
||||
Ep = &Urb->Ep;
|
||||
Ep->DevAddr = DevAddr;
|
||||
Ep->EpAddr = (UINT8) (EpAddr & 0x0F);
|
||||
Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
|
||||
Ep->DevSpeed = DevSpeed;
|
||||
Ep->MaxPacket = MaxPacket;
|
||||
Ep = &Urb->Ep;
|
||||
Ep->DevAddr = DevAddr;
|
||||
Ep->EpAddr = (UINT8)(EpAddr & 0x0F);
|
||||
Ep->Direction = (((EpAddr & 0x80) != 0) ? EfiUsbDataIn : EfiUsbDataOut);
|
||||
Ep->DevSpeed = DevSpeed;
|
||||
Ep->MaxPacket = MaxPacket;
|
||||
|
||||
Ep->HubAddr = 0;
|
||||
Ep->HubPort = 0;
|
||||
Ep->HubAddr = 0;
|
||||
Ep->HubPort = 0;
|
||||
|
||||
if (DevSpeed != EFI_USB_SPEED_HIGH) {
|
||||
ASSERT (Hub != NULL);
|
||||
|
||||
Ep->HubAddr = Hub->TranslatorHubAddress;
|
||||
Ep->HubPort = Hub->TranslatorPortNumber;
|
||||
Ep->HubAddr = Hub->TranslatorHubAddress;
|
||||
Ep->HubPort = Hub->TranslatorPortNumber;
|
||||
}
|
||||
|
||||
Ep->Toggle = Toggle;
|
||||
Ep->Type = Type;
|
||||
Ep->PollRate = EhcConvertPollRate (Interval);
|
||||
Ep->Toggle = Toggle;
|
||||
Ep->Type = Type;
|
||||
Ep->PollRate = EhcConvertPollRate (Interval);
|
||||
|
||||
Urb->Request = Request;
|
||||
Urb->Data = Data;
|
||||
Urb->DataLen = DataLen;
|
||||
Urb->Callback = Callback;
|
||||
Urb->Context = Context;
|
||||
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
|
||||
Urb->Request = Request;
|
||||
Urb->Data = Data;
|
||||
Urb->DataLen = DataLen;
|
||||
Urb->Callback = Callback;
|
||||
Urb->Context = Context;
|
||||
Urb->Qh = EhcCreateQh (Ehc, &Urb->Ep);
|
||||
|
||||
if (Urb->Qh == NULL) {
|
||||
goto ON_ERROR;
|
||||
@ -575,27 +576,27 @@ EhcCreateUrb (
|
||||
|
||||
Urb->RequestPhy = NULL;
|
||||
Urb->RequestMap = NULL;
|
||||
Urb->DataPhy = NULL;
|
||||
Urb->DataMap = NULL;
|
||||
Urb->DataPhy = NULL;
|
||||
Urb->DataMap = NULL;
|
||||
|
||||
//
|
||||
// Map the request and user data
|
||||
//
|
||||
if (Request != NULL) {
|
||||
Len = sizeof (EFI_USB_DEVICE_REQUEST);
|
||||
MapOp = EdkiiIoMmuOperationBusMasterRead;
|
||||
Status = IoMmuMap (Ehc->IoMmu, MapOp, Request, &Len, &PhyAddr, &Map);
|
||||
Len = sizeof (EFI_USB_DEVICE_REQUEST);
|
||||
MapOp = EdkiiIoMmuOperationBusMasterRead;
|
||||
Status = IoMmuMap (Ehc->IoMmu, MapOp, Request, &Len, &PhyAddr, &Map);
|
||||
|
||||
if (EFI_ERROR (Status) || (Len != sizeof (EFI_USB_DEVICE_REQUEST))) {
|
||||
goto ON_ERROR;
|
||||
}
|
||||
|
||||
Urb->RequestPhy = (VOID *) ((UINTN) PhyAddr);
|
||||
Urb->RequestPhy = (VOID *)((UINTN)PhyAddr);
|
||||
Urb->RequestMap = Map;
|
||||
}
|
||||
|
||||
if (Data != NULL) {
|
||||
Len = DataLen;
|
||||
Len = DataLen;
|
||||
|
||||
if (Ep->Direction == EfiUsbDataIn) {
|
||||
MapOp = EdkiiIoMmuOperationBusMasterWrite;
|
||||
@ -603,14 +604,14 @@ EhcCreateUrb (
|
||||
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)) {
|
||||
goto ON_ERROR;
|
||||
}
|
||||
|
||||
Urb->DataPhy = (VOID *) ((UINTN) PhyAddr);
|
||||
Urb->DataMap = Map;
|
||||
Urb->DataPhy = (VOID *)((UINTN)PhyAddr);
|
||||
Urb->DataMap = Map;
|
||||
}
|
||||
|
||||
Status = EhcCreateQtds (Ehc, Urb);
|
||||
|
@ -10,60 +10,60 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#ifndef _EFI_EHCI_URB_H_
|
||||
#define _EFI_EHCI_URB_H_
|
||||
|
||||
typedef struct _PEI_EHC_QTD PEI_EHC_QTD;
|
||||
typedef struct _PEI_EHC_QH PEI_EHC_QH;
|
||||
typedef struct _PEI_URB PEI_URB;
|
||||
typedef struct _PEI_EHC_QTD PEI_EHC_QTD;
|
||||
typedef struct _PEI_EHC_QH PEI_EHC_QH;
|
||||
typedef struct _PEI_URB PEI_URB;
|
||||
|
||||
#define EHC_CTRL_TRANSFER 0x01
|
||||
#define EHC_BULK_TRANSFER 0x02
|
||||
#define EHC_INT_TRANSFER_SYNC 0x04
|
||||
#define EHC_INT_TRANSFER_ASYNC 0x08
|
||||
|
||||
#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
|
||||
#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
|
||||
#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
|
||||
#define EHC_QTD_SIG SIGNATURE_32 ('U', 'S', 'B', 'T')
|
||||
#define EHC_QH_SIG SIGNATURE_32 ('U', 'S', 'B', 'H')
|
||||
#define EHC_URB_SIG SIGNATURE_32 ('U', 'S', 'B', 'R')
|
||||
|
||||
//
|
||||
// Hardware related bit definitions
|
||||
//
|
||||
#define EHC_TYPE_ITD 0x00
|
||||
#define EHC_TYPE_QH 0x02
|
||||
#define EHC_TYPE_SITD 0x04
|
||||
#define EHC_TYPE_FSTN 0x06
|
||||
#define EHC_TYPE_ITD 0x00
|
||||
#define EHC_TYPE_QH 0x02
|
||||
#define EHC_TYPE_SITD 0x04
|
||||
#define EHC_TYPE_FSTN 0x06
|
||||
|
||||
#define QH_NAK_RELOAD 3
|
||||
#define QH_HSHBW_MULTI 1
|
||||
#define QH_NAK_RELOAD 3
|
||||
#define QH_HSHBW_MULTI 1
|
||||
|
||||
#define QTD_MAX_ERR 3
|
||||
#define QTD_PID_OUTPUT 0x00
|
||||
#define QTD_PID_INPUT 0x01
|
||||
#define QTD_PID_SETUP 0x02
|
||||
#define QTD_MAX_ERR 3
|
||||
#define QTD_PID_OUTPUT 0x00
|
||||
#define QTD_PID_INPUT 0x01
|
||||
#define QTD_PID_SETUP 0x02
|
||||
|
||||
#define QTD_STAT_DO_OUT 0
|
||||
#define QTD_STAT_DO_SS 0
|
||||
#define QTD_STAT_DO_PING 0x01
|
||||
#define QTD_STAT_DO_CS 0x02
|
||||
#define QTD_STAT_TRANS_ERR 0x08
|
||||
#define QTD_STAT_BABBLE_ERR 0x10
|
||||
#define QTD_STAT_BUFF_ERR 0x20
|
||||
#define QTD_STAT_HALTED 0x40
|
||||
#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_DO_OUT 0
|
||||
#define QTD_STAT_DO_SS 0
|
||||
#define QTD_STAT_DO_PING 0x01
|
||||
#define QTD_STAT_DO_CS 0x02
|
||||
#define QTD_STAT_TRANS_ERR 0x08
|
||||
#define QTD_STAT_BABBLE_ERR 0x10
|
||||
#define QTD_STAT_BUFF_ERR 0x20
|
||||
#define QTD_STAT_HALTED 0x40
|
||||
#define QTD_STAT_ACTIVE 0x80
|
||||
#define QTD_STAT_ERR_MASK (QTD_STAT_TRANS_ERR | QTD_STAT_BABBLE_ERR | QTD_STAT_BUFF_ERR)
|
||||
|
||||
#define QTD_MAX_BUFFER 4
|
||||
#define QTD_BUF_LEN 4096
|
||||
#define QTD_BUF_MASK 0x0FFF
|
||||
#define QTD_MAX_BUFFER 4
|
||||
#define QTD_BUF_LEN 4096
|
||||
#define QTD_BUF_MASK 0x0FFF
|
||||
|
||||
#define QH_MICROFRAME_0 0x01
|
||||
#define QH_MICROFRAME_1 0x02
|
||||
#define QH_MICROFRAME_2 0x04
|
||||
#define QH_MICROFRAME_3 0x08
|
||||
#define QH_MICROFRAME_4 0x10
|
||||
#define QH_MICROFRAME_5 0x20
|
||||
#define QH_MICROFRAME_6 0x40
|
||||
#define QH_MICROFRAME_7 0x80
|
||||
#define QH_MICROFRAME_0 0x01
|
||||
#define QH_MICROFRAME_1 0x02
|
||||
#define QH_MICROFRAME_2 0x04
|
||||
#define QH_MICROFRAME_3 0x08
|
||||
#define QH_MICROFRAME_4 0x10
|
||||
#define QH_MICROFRAME_5 0x20
|
||||
#define QH_MICROFRAME_6 0x40
|
||||
#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
|
||||
@ -72,7 +72,7 @@ typedef struct _PEI_URB PEI_URB;
|
||||
#define QH_LINK(Addr, Type, Term) \
|
||||
((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
|
||||
@ -82,77 +82,76 @@ typedef struct _PEI_URB PEI_URB;
|
||||
//
|
||||
#pragma pack(1)
|
||||
typedef struct {
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltNext;
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltNext;
|
||||
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
} QTD_HW;
|
||||
|
||||
typedef struct {
|
||||
UINT32 HorizonLink;
|
||||
UINT32 HorizonLink;
|
||||
//
|
||||
// Endpoint capabilities/Characteristics DWord 1 and DWord 2
|
||||
//
|
||||
UINT32 DeviceAddr : 7;
|
||||
UINT32 Inactive : 1;
|
||||
UINT32 EpNum : 4;
|
||||
UINT32 EpSpeed : 2;
|
||||
UINT32 DtCtrl : 1;
|
||||
UINT32 ReclaimHead : 1;
|
||||
UINT32 MaxPacketLen : 11;
|
||||
UINT32 CtrlEp : 1;
|
||||
UINT32 NakReload : 4;
|
||||
UINT32 DeviceAddr : 7;
|
||||
UINT32 Inactive : 1;
|
||||
UINT32 EpNum : 4;
|
||||
UINT32 EpSpeed : 2;
|
||||
UINT32 DtCtrl : 1;
|
||||
UINT32 ReclaimHead : 1;
|
||||
UINT32 MaxPacketLen : 11;
|
||||
UINT32 CtrlEp : 1;
|
||||
UINT32 NakReload : 4;
|
||||
|
||||
UINT32 SMask : 8;
|
||||
UINT32 CMask : 8;
|
||||
UINT32 HubAddr : 7;
|
||||
UINT32 PortNum : 7;
|
||||
UINT32 Multiplier : 2;
|
||||
UINT32 SMask : 8;
|
||||
UINT32 CMask : 8;
|
||||
UINT32 HubAddr : 7;
|
||||
UINT32 PortNum : 7;
|
||||
UINT32 Multiplier : 2;
|
||||
|
||||
//
|
||||
// Transaction execution overlay area
|
||||
//
|
||||
UINT32 CurQtd;
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltQtd;
|
||||
UINT32 CurQtd;
|
||||
UINT32 NextQtd;
|
||||
UINT32 AltQtd;
|
||||
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
UINT32 Status : 8;
|
||||
UINT32 Pid : 2;
|
||||
UINT32 ErrCnt : 2;
|
||||
UINT32 CurPage : 3;
|
||||
UINT32 Ioc : 1;
|
||||
UINT32 TotalBytes : 15;
|
||||
UINT32 DataToggle : 1;
|
||||
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
UINT32 Page[5];
|
||||
UINT32 PageHigh[5];
|
||||
} QH_HW;
|
||||
#pragma pack()
|
||||
|
||||
|
||||
//
|
||||
// Endpoint address and its capabilities
|
||||
//
|
||||
typedef struct _USB_ENDPOINT {
|
||||
UINT8 DevAddr;
|
||||
UINT8 EpAddr; // Endpoint address, no direction encoded in
|
||||
EFI_USB_DATA_DIRECTION Direction;
|
||||
UINT8 DevSpeed;
|
||||
UINTN MaxPacket;
|
||||
UINT8 HubAddr;
|
||||
UINT8 HubPort;
|
||||
UINT8 Toggle; // Data toggle, not used for control transfer
|
||||
UINTN Type;
|
||||
UINTN PollRate; // Polling interval used by EHCI
|
||||
UINT8 DevAddr;
|
||||
UINT8 EpAddr; // Endpoint address, no direction encoded in
|
||||
EFI_USB_DATA_DIRECTION Direction;
|
||||
UINT8 DevSpeed;
|
||||
UINTN MaxPacket;
|
||||
UINT8 HubAddr;
|
||||
UINT8 HubPort;
|
||||
UINT8 Toggle; // Data toggle, not used for control transfer
|
||||
UINTN Type;
|
||||
UINTN PollRate; // Polling interval used by EHCI
|
||||
} USB_ENDPOINT;
|
||||
|
||||
//
|
||||
@ -160,15 +159,13 @@ typedef struct _USB_ENDPOINT {
|
||||
// QTD generated from a URB. Don't add fields before QtdHw.
|
||||
//
|
||||
struct _PEI_EHC_QTD {
|
||||
QTD_HW QtdHw;
|
||||
UINT32 Signature;
|
||||
EFI_LIST_ENTRY QtdList; // The list of QTDs to one end point
|
||||
UINT8 *Data; // Buffer of the original data
|
||||
UINTN DataLen; // Original amount of data in this QTD
|
||||
QTD_HW QtdHw;
|
||||
UINT32 Signature;
|
||||
EFI_LIST_ENTRY QtdList; // The list of QTDs to one end point
|
||||
UINT8 *Data; // Buffer of the original data
|
||||
UINTN DataLen; // Original amount of data in this QTD
|
||||
};
|
||||
|
||||
|
||||
|
||||
//
|
||||
// Software QH structure. All three different transaction types
|
||||
// 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.
|
||||
//
|
||||
struct _PEI_EHC_QH {
|
||||
QH_HW QhHw;
|
||||
UINT32 Signature;
|
||||
PEI_EHC_QH *NextQh; // The queue head pointed to by horizontal link
|
||||
EFI_LIST_ENTRY Qtds; // The list of QTDs to this queue head
|
||||
UINTN Interval;
|
||||
QH_HW QhHw;
|
||||
UINT32 Signature;
|
||||
PEI_EHC_QH *NextQh; // The queue head pointed to by horizontal link
|
||||
EFI_LIST_ENTRY Qtds; // The list of QTDs to this queue head
|
||||
UINTN Interval;
|
||||
};
|
||||
|
||||
//
|
||||
@ -197,34 +194,34 @@ struct _PEI_EHC_QH {
|
||||
// usb requests.
|
||||
//
|
||||
struct _PEI_URB {
|
||||
UINT32 Signature;
|
||||
EFI_LIST_ENTRY UrbList;
|
||||
UINT32 Signature;
|
||||
EFI_LIST_ENTRY UrbList;
|
||||
|
||||
//
|
||||
// Transaction information
|
||||
//
|
||||
USB_ENDPOINT Ep;
|
||||
EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
|
||||
VOID *RequestPhy; // Address of the mapped request
|
||||
VOID *RequestMap;
|
||||
VOID *Data;
|
||||
UINTN DataLen;
|
||||
VOID *DataPhy; // Address of the mapped user data
|
||||
VOID *DataMap;
|
||||
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
|
||||
VOID *Context;
|
||||
USB_ENDPOINT Ep;
|
||||
EFI_USB_DEVICE_REQUEST *Request; // Control transfer only
|
||||
VOID *RequestPhy; // Address of the mapped request
|
||||
VOID *RequestMap;
|
||||
VOID *Data;
|
||||
UINTN DataLen;
|
||||
VOID *DataPhy; // Address of the mapped user data
|
||||
VOID *DataMap;
|
||||
EFI_ASYNC_USB_TRANSFER_CALLBACK Callback;
|
||||
VOID *Context;
|
||||
|
||||
//
|
||||
// Schedule data
|
||||
//
|
||||
PEI_EHC_QH *Qh;
|
||||
PEI_EHC_QH *Qh;
|
||||
|
||||
//
|
||||
// Transaction result
|
||||
//
|
||||
UINT32 Result;
|
||||
UINTN Completed; // completed data length
|
||||
UINT8 DataToggle;
|
||||
UINT32 Result;
|
||||
UINTN Completed; // completed data length
|
||||
UINT8 DataToggle;
|
||||
};
|
||||
|
||||
/**
|
||||
@ -243,12 +240,12 @@ struct _PEI_URB {
|
||||
**/
|
||||
PEI_EHC_QTD *
|
||||
EhcCreateQtd (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 *Data,
|
||||
IN UINTN DataLen,
|
||||
IN UINT8 PktId,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket
|
||||
)
|
||||
;
|
||||
|
||||
@ -263,8 +260,8 @@ EhcCreateQtd (
|
||||
**/
|
||||
PEI_EHC_QH *
|
||||
EhcCreateQh (
|
||||
IN PEI_USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
IN PEI_USB2_HC_DEV *Ehci,
|
||||
IN USB_ENDPOINT *Ep
|
||||
)
|
||||
;
|
||||
|
||||
@ -277,8 +274,8 @@ EhcCreateQh (
|
||||
**/
|
||||
VOID
|
||||
EhcFreeUrb (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN PEI_URB *Urb
|
||||
)
|
||||
;
|
||||
|
||||
@ -305,20 +302,21 @@ EhcFreeUrb (
|
||||
**/
|
||||
PEI_URB *
|
||||
EhcCreateUrb (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN UINT8 DevAddr,
|
||||
IN UINT8 EpAddr,
|
||||
IN UINT8 DevSpeed,
|
||||
IN UINT8 Toggle,
|
||||
IN UINTN MaxPacket,
|
||||
IN EFI_USB2_HC_TRANSACTION_TRANSLATOR *Hub,
|
||||
IN UINTN Type,
|
||||
IN EFI_USB_DEVICE_REQUEST *Request,
|
||||
IN VOID *Data,
|
||||
IN UINTN DataLen,
|
||||
IN EFI_ASYNC_USB_TRANSFER_CALLBACK Callback,
|
||||
IN VOID *Context,
|
||||
IN UINTN Interval
|
||||
)
|
||||
;
|
||||
|
||||
#endif
|
||||
|
@ -22,30 +22,31 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
USBHC_MEM_BLOCK *
|
||||
UsbHcAllocMemBlock (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Pages
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Pages
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
EFI_STATUS Status;
|
||||
UINTN PageNumber;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
VOID *BufHost;
|
||||
VOID *Mapping;
|
||||
EFI_PHYSICAL_ADDRESS MappedAddr;
|
||||
EFI_STATUS Status;
|
||||
UINTN PageNumber;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
|
||||
Mapping = NULL;
|
||||
PageNumber = sizeof(USBHC_MEM_BLOCK)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
Mapping = NULL;
|
||||
PageNumber = sizeof (USBHC_MEM_BLOCK)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE);
|
||||
|
||||
//
|
||||
@ -54,34 +55,36 @@ UsbHcAllocMemBlock (
|
||||
//
|
||||
ASSERT (USBHC_MEM_UNIT * 8 <= EFI_PAGE_SIZE);
|
||||
|
||||
Block = (USBHC_MEM_BLOCK*)(UINTN)TempPtr;
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
|
||||
Block = (USBHC_MEM_BLOCK *)(UINTN)TempPtr;
|
||||
Block->BufLen = EFI_PAGES_TO_SIZE (Pages);
|
||||
Block->BitsLen = Block->BufLen / (USBHC_MEM_UNIT * 8);
|
||||
|
||||
PageNumber = (Block->BitsLen)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE);
|
||||
|
||||
Block->Bits = (UINT8 *)(UINTN)TempPtr;
|
||||
Block->Bits = (UINT8 *)(UINTN)TempPtr;
|
||||
|
||||
Status = IoMmuAllocateBuffer (
|
||||
Ehc->IoMmu,
|
||||
Pages,
|
||||
(VOID **) &BufHost,
|
||||
(VOID **)&BufHost,
|
||||
&MappedAddr,
|
||||
&Mapping
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
ZeroMem (BufHost, Pages*EFI_PAGE_SIZE);
|
||||
|
||||
//
|
||||
@ -89,16 +92,15 @@ UsbHcAllocMemBlock (
|
||||
// should be restricted into the same 4G
|
||||
//
|
||||
if (Pool->Check4G && (Pool->Which4G != USB_HC_HIGH_32BIT (MappedAddr))) {
|
||||
return NULL;
|
||||
return NULL;
|
||||
}
|
||||
|
||||
Block->BufHost = BufHost;
|
||||
Block->Buf = (UINT8 *) ((UINTN) MappedAddr);
|
||||
Block->Mapping = Mapping;
|
||||
Block->Next = NULL;
|
||||
Block->BufHost = BufHost;
|
||||
Block->Buf = (UINT8 *)((UINTN)MappedAddr);
|
||||
Block->Mapping = Mapping;
|
||||
Block->Next = NULL;
|
||||
|
||||
return Block;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
@ -111,9 +113,9 @@ UsbHcAllocMemBlock (
|
||||
**/
|
||||
VOID
|
||||
UsbHcFreeMemBlock (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Pool != NULL) && (Block != NULL));
|
||||
@ -133,22 +135,22 @@ UsbHcFreeMemBlock (
|
||||
**/
|
||||
VOID *
|
||||
UsbHcAllocMemFromBlock (
|
||||
IN USBHC_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
IN USBHC_MEM_BLOCK *Block,
|
||||
IN UINTN Units
|
||||
)
|
||||
{
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
UINTN Byte;
|
||||
UINT8 Bit;
|
||||
UINTN StartByte;
|
||||
UINT8 StartBit;
|
||||
UINTN Available;
|
||||
UINTN Count;
|
||||
|
||||
ASSERT ((Block != 0) && (Units != 0));
|
||||
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
StartByte = 0;
|
||||
StartBit = 0;
|
||||
Available = 0;
|
||||
|
||||
for (Byte = 0, Bit = 0; Byte < Block->BitsLen;) {
|
||||
//
|
||||
@ -164,13 +166,12 @@ UsbHcAllocMemFromBlock (
|
||||
}
|
||||
|
||||
NEXT_BIT (Byte, Bit);
|
||||
|
||||
} else {
|
||||
NEXT_BIT (Byte, Bit);
|
||||
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
Available = 0;
|
||||
StartByte = Byte;
|
||||
StartBit = Bit;
|
||||
}
|
||||
}
|
||||
|
||||
@ -181,13 +182,13 @@ UsbHcAllocMemFromBlock (
|
||||
//
|
||||
// Mark the memory as allocated
|
||||
//
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
Byte = StartByte;
|
||||
Bit = StartBit;
|
||||
|
||||
for (Count = 0; Count < Units; Count++) {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -205,16 +206,16 @@ UsbHcAllocMemFromBlock (
|
||||
**/
|
||||
EFI_PHYSICAL_ADDRESS
|
||||
UsbHcGetPciAddressForHostMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINTN AllocSize;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
UINTN Offset;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINTN AllocSize;
|
||||
EFI_PHYSICAL_ADDRESS PhyAddr;
|
||||
UINTN Offset;
|
||||
|
||||
Head = Pool->Head;
|
||||
AllocSize = USBHC_MEM_ROUND (Size);
|
||||
@ -228,7 +229,7 @@ UsbHcGetPciAddressForHostMem (
|
||||
// scan the memory block list for the memory block that
|
||||
// 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;
|
||||
}
|
||||
}
|
||||
@ -237,8 +238,8 @@ UsbHcGetPciAddressForHostMem (
|
||||
//
|
||||
// calculate the pci memory address for host memory address.
|
||||
//
|
||||
Offset = (UINT8 *)Mem - Block->BufHost;
|
||||
PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN) (Block->Buf + Offset);
|
||||
Offset = (UINT8 *)Mem - Block->BufHost;
|
||||
PhyAddr = (EFI_PHYSICAL_ADDRESS)(UINTN)(Block->Buf + Offset);
|
||||
return PhyAddr;
|
||||
}
|
||||
|
||||
@ -251,8 +252,8 @@ UsbHcGetPciAddressForHostMem (
|
||||
**/
|
||||
VOID
|
||||
UsbHcInsertMemBlockToPool (
|
||||
IN USBHC_MEM_BLOCK *Head,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
IN USBHC_MEM_BLOCK *Head,
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
ASSERT ((Head != NULL) && (Block != NULL));
|
||||
@ -271,11 +272,10 @@ UsbHcInsertMemBlockToPool (
|
||||
**/
|
||||
BOOLEAN
|
||||
UsbHcIsMemBlockEmpty (
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
IN USBHC_MEM_BLOCK *Block
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
|
||||
UINTN Index;
|
||||
|
||||
for (Index = 0; Index < Block->BitsLen; Index++) {
|
||||
if (Block->Bits[Index] != 0) {
|
||||
@ -286,7 +286,6 @@ UsbHcIsMemBlockEmpty (
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Initialize the memory management pool for the host controller.
|
||||
|
||||
@ -301,29 +300,30 @@ UsbHcIsMemBlockEmpty (
|
||||
**/
|
||||
USBHC_MEM_POOL *
|
||||
UsbHcInitMemPool (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN BOOLEAN Check4G,
|
||||
IN UINT32 Which4G
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN BOOLEAN Check4G,
|
||||
IN UINT32 Which4G
|
||||
)
|
||||
{
|
||||
USBHC_MEM_POOL *Pool;
|
||||
UINTN PageNumber;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
USBHC_MEM_POOL *Pool;
|
||||
UINTN PageNumber;
|
||||
EFI_STATUS Status;
|
||||
EFI_PHYSICAL_ADDRESS TempPtr;
|
||||
|
||||
PageNumber = sizeof(USBHC_MEM_POOL)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
PageNumber = sizeof (USBHC_MEM_POOL)/PAGESIZE +1;
|
||||
Status = PeiServicesAllocatePages (
|
||||
EfiBootServicesCode,
|
||||
PageNumber,
|
||||
&TempPtr
|
||||
);
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
if (EFI_ERROR (Status)) {
|
||||
return NULL;
|
||||
}
|
||||
ZeroMem ((VOID *)(UINTN)TempPtr, PageNumber*EFI_PAGE_SIZE);
|
||||
|
||||
Pool = (USBHC_MEM_POOL *) ((UINTN) TempPtr);
|
||||
Pool = (USBHC_MEM_POOL *)((UINTN)TempPtr);
|
||||
|
||||
Pool->Check4G = Check4G;
|
||||
Pool->Which4G = Which4G;
|
||||
@ -348,11 +348,11 @@ UsbHcInitMemPool (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UsbHcFreeMemPool (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
|
||||
ASSERT (Pool->Head != NULL);
|
||||
|
||||
@ -381,17 +381,17 @@ UsbHcFreeMemPool (
|
||||
**/
|
||||
VOID *
|
||||
UsbHcAllocateMem (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
USBHC_MEM_BLOCK *NewBlock;
|
||||
VOID *Mem;
|
||||
UINTN AllocSize;
|
||||
UINTN Pages;
|
||||
|
||||
Mem = NULL;
|
||||
AllocSize = USBHC_MEM_ROUND (Size);
|
||||
@ -425,7 +425,8 @@ UsbHcAllocateMem (
|
||||
} else {
|
||||
Pages = USBHC_MEM_DEFAULT_PAGES;
|
||||
}
|
||||
NewBlock = UsbHcAllocMemBlock (Ehc,Pool, Pages);
|
||||
|
||||
NewBlock = UsbHcAllocMemBlock (Ehc, Pool, Pages);
|
||||
|
||||
if (NewBlock == NULL) {
|
||||
return NULL;
|
||||
@ -455,23 +456,23 @@ UsbHcAllocateMem (
|
||||
**/
|
||||
VOID
|
||||
UsbHcFreeMem (
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN PEI_USB2_HC_DEV *Ehc,
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
)
|
||||
{
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
USBHC_MEM_BLOCK *Block;
|
||||
UINT8 *ToFree;
|
||||
UINTN AllocSize;
|
||||
UINTN Byte;
|
||||
UINTN Bit;
|
||||
UINTN Count;
|
||||
|
||||
Head = Pool->Head;
|
||||
AllocSize = USBHC_MEM_ROUND (Size);
|
||||
ToFree = (UINT8 *) Mem;
|
||||
ToFree = (UINT8 *)Mem;
|
||||
|
||||
for (Block = Head; Block != NULL; Block = Block->Next) {
|
||||
//
|
||||
@ -482,8 +483,8 @@ UsbHcFreeMem (
|
||||
//
|
||||
// compute the start byte and bit in the bit array
|
||||
//
|
||||
Byte = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) % 8;
|
||||
Byte = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) / 8;
|
||||
Bit = ((ToFree - Block->Buf) / USBHC_MEM_UNIT) % 8;
|
||||
|
||||
//
|
||||
// reset associated bits in bit array
|
||||
@ -491,7 +492,7 @@ UsbHcFreeMem (
|
||||
for (Count = 0; Count < (AllocSize / USBHC_MEM_UNIT); Count++) {
|
||||
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);
|
||||
}
|
||||
|
||||
@ -513,5 +514,5 @@ UsbHcFreeMem (
|
||||
UsbHcFreeMemBlock (Ehc, Pool, Block);
|
||||
}
|
||||
|
||||
return ;
|
||||
return;
|
||||
}
|
||||
|
@ -13,7 +13,7 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <Uefi.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) \
|
||||
((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;
|
||||
|
||||
struct _USBHC_MEM_BLOCK {
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
USBHC_MEM_BLOCK *Next;
|
||||
UINT8 *Bits; // Bit array to record which unit is allocated
|
||||
UINTN BitsLen;
|
||||
UINT8 *Buf;
|
||||
UINT8 *BufHost;
|
||||
UINTN BufLen; // Memory size in bytes
|
||||
VOID *Mapping;
|
||||
USBHC_MEM_BLOCK *Next;
|
||||
};
|
||||
|
||||
//
|
||||
@ -39,15 +39,15 @@ struct _USBHC_MEM_BLOCK {
|
||||
// data to be on the same 4G memory.
|
||||
//
|
||||
typedef struct _USBHC_MEM_POOL {
|
||||
BOOLEAN Check4G;
|
||||
UINT32 Which4G;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
BOOLEAN Check4G;
|
||||
UINT32 Which4G;
|
||||
USBHC_MEM_BLOCK *Head;
|
||||
} USBHC_MEM_POOL;
|
||||
|
||||
//
|
||||
// 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_DEFAULT_PAGES 16
|
||||
@ -66,7 +66,6 @@ typedef struct _USBHC_MEM_POOL {
|
||||
} \
|
||||
} while (0)
|
||||
|
||||
|
||||
/**
|
||||
Calculate the corresponding pci bus address according to the Mem parameter.
|
||||
|
||||
@ -78,9 +77,9 @@ typedef struct _USBHC_MEM_POOL {
|
||||
**/
|
||||
EFI_PHYSICAL_ADDRESS
|
||||
UsbHcGetPciAddressForHostMem (
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
IN USBHC_MEM_POOL *Pool,
|
||||
IN VOID *Mem,
|
||||
IN UINTN Size
|
||||
);
|
||||
|
||||
#endif
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -26,12 +26,11 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
|
||||
#include <IndustryStandard/Atapi.h>
|
||||
|
||||
#define MAX_SENSE_KEY_COUNT 6
|
||||
#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_SENSE_KEY_COUNT 6
|
||||
#define MAX_IDE_CHANNELS 4 // Ide and Sata Primary, Secondary Channel.
|
||||
#define MAX_IDE_DEVICES 8 // Ide, Sata Primary, Secondary and Master, Slave device.
|
||||
|
||||
typedef enum {
|
||||
IdePrimary = 0,
|
||||
@ -40,72 +39,69 @@ typedef enum {
|
||||
} EFI_IDE_CHANNEL;
|
||||
|
||||
typedef enum {
|
||||
IdeMaster = 0,
|
||||
IdeSlave = 1,
|
||||
IdeMaxDevice = 2
|
||||
IdeMaster = 0,
|
||||
IdeSlave = 1,
|
||||
IdeMaxDevice = 2
|
||||
} EFI_IDE_DEVICE;
|
||||
|
||||
//
|
||||
// IDE Registers
|
||||
//
|
||||
typedef union {
|
||||
UINT16 Command; /* when write */
|
||||
UINT16 Status; /* when read */
|
||||
UINT16 Command; /* when write */
|
||||
UINT16 Status; /* when read */
|
||||
} IDE_CMD_OR_STATUS;
|
||||
|
||||
typedef union {
|
||||
UINT16 Error; /* when read */
|
||||
UINT16 Feature; /* when write */
|
||||
UINT16 Error; /* when read */
|
||||
UINT16 Feature; /* when write */
|
||||
} IDE_ERROR_OR_FEATURE;
|
||||
|
||||
typedef union {
|
||||
UINT16 AltStatus; /* when read */
|
||||
UINT16 DeviceControl; /* when write */
|
||||
UINT16 AltStatus; /* when read */
|
||||
UINT16 DeviceControl; /* when write */
|
||||
} IDE_ALTSTATUS_OR_DEVICECONTROL;
|
||||
|
||||
//
|
||||
// IDE registers set
|
||||
//
|
||||
typedef struct {
|
||||
UINT16 Data;
|
||||
IDE_ERROR_OR_FEATURE Reg1;
|
||||
UINT16 SectorCount;
|
||||
UINT16 SectorNumber;
|
||||
UINT16 CylinderLsb;
|
||||
UINT16 CylinderMsb;
|
||||
UINT16 Head;
|
||||
IDE_CMD_OR_STATUS Reg;
|
||||
UINT16 Data;
|
||||
IDE_ERROR_OR_FEATURE Reg1;
|
||||
UINT16 SectorCount;
|
||||
UINT16 SectorNumber;
|
||||
UINT16 CylinderLsb;
|
||||
UINT16 CylinderMsb;
|
||||
UINT16 Head;
|
||||
IDE_CMD_OR_STATUS Reg;
|
||||
|
||||
IDE_ALTSTATUS_OR_DEVICECONTROL Alt;
|
||||
UINT16 DriveAddress;
|
||||
IDE_ALTSTATUS_OR_DEVICECONTROL Alt;
|
||||
UINT16 DriveAddress;
|
||||
} IDE_BASE_REGISTERS;
|
||||
|
||||
typedef struct {
|
||||
|
||||
UINTN DevicePosition;
|
||||
EFI_PEI_BLOCK_IO_MEDIA MediaInfo;
|
||||
EFI_PEI_BLOCK_IO2_MEDIA MediaInfo2;
|
||||
|
||||
UINTN DevicePosition;
|
||||
EFI_PEI_BLOCK_IO_MEDIA MediaInfo;
|
||||
EFI_PEI_BLOCK_IO2_MEDIA MediaInfo2;
|
||||
} PEI_ATAPI_DEVICE_INFO;
|
||||
|
||||
#define ATAPI_BLK_IO_DEV_SIGNATURE SIGNATURE_32 ('a', 'b', 'i', 'o')
|
||||
typedef struct {
|
||||
UINTN Signature;
|
||||
UINTN Signature;
|
||||
|
||||
EFI_PEI_RECOVERY_BLOCK_IO_PPI AtapiBlkIo;
|
||||
EFI_PEI_RECOVERY_BLOCK_IO2_PPI AtapiBlkIo2;
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor2;
|
||||
PEI_ATA_CONTROLLER_PPI *AtaControllerPpi;
|
||||
EFI_PEI_RECOVERY_BLOCK_IO_PPI AtapiBlkIo;
|
||||
EFI_PEI_RECOVERY_BLOCK_IO2_PPI AtapiBlkIo2;
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor;
|
||||
EFI_PEI_PPI_DESCRIPTOR PpiDescriptor2;
|
||||
PEI_ATA_CONTROLLER_PPI *AtaControllerPpi;
|
||||
|
||||
UINTN DeviceCount;
|
||||
PEI_ATAPI_DEVICE_INFO DeviceInfo[MAX_IDE_DEVICES]; //for max 8 device
|
||||
IDE_BASE_REGISTERS IdeIoPortReg[MAX_IDE_CHANNELS]; //for max 4 channel.
|
||||
UINTN DeviceCount;
|
||||
PEI_ATAPI_DEVICE_INFO DeviceInfo[MAX_IDE_DEVICES]; // for max 8 device
|
||||
IDE_BASE_REGISTERS IdeIoPortReg[MAX_IDE_CHANNELS]; // for max 4 channel.
|
||||
} 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_BLKIO2_THIS(a) CR (a, ATAPI_BLK_IO_DEV, AtapiBlkIo2, 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 STALL_1_MILLI_SECOND 1000 // stall 1 ms
|
||||
#define STALL_1_SECONDS 1000 * STALL_1_MILLI_SECOND
|
||||
@ -152,9 +148,9 @@ typedef struct {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtapiGetNumberOfBlockDevices (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
);
|
||||
|
||||
/**
|
||||
@ -188,10 +184,10 @@ AtapiGetNumberOfBlockDevices (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtapiGetBlockDeviceMediaInfo (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@ -231,12 +227,12 @@ AtapiGetBlockDeviceMediaInfo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtapiReadBlocks (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -261,9 +257,9 @@ AtapiReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtapiGetNumberOfBlockDevices2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
OUT UINTN *NumberBlockDevices
|
||||
);
|
||||
|
||||
/**
|
||||
@ -297,10 +293,10 @@ AtapiGetNumberOfBlockDevices2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtapiGetBlockDeviceMediaInfo2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo
|
||||
);
|
||||
|
||||
/**
|
||||
@ -340,12 +336,12 @@ AtapiGetBlockDeviceMediaInfo2 (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
AtapiReadBlocks2 (
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_PEI_SERVICES **PeiServices,
|
||||
IN EFI_PEI_RECOVERY_BLOCK_IO2_PPI *This,
|
||||
IN UINTN DeviceIndex,
|
||||
IN EFI_PEI_LBA StartLBA,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
//
|
||||
@ -379,10 +375,10 @@ AtapiEnumerateDevices (
|
||||
**/
|
||||
BOOLEAN
|
||||
DiscoverAtapiDevice (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
);
|
||||
|
||||
/**
|
||||
@ -397,8 +393,8 @@ DiscoverAtapiDevice (
|
||||
**/
|
||||
BOOLEAN
|
||||
DetectIDEController (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition
|
||||
);
|
||||
|
||||
/**
|
||||
@ -523,8 +519,8 @@ DRQReady2 (
|
||||
**/
|
||||
EFI_STATUS
|
||||
CheckErrorStatus (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINT16 StatusReg
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINT16 StatusReg
|
||||
);
|
||||
|
||||
/**
|
||||
@ -539,8 +535,8 @@ CheckErrorStatus (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ATAPIIdentify (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition
|
||||
);
|
||||
|
||||
/**
|
||||
@ -556,9 +552,9 @@ ATAPIIdentify (
|
||||
**/
|
||||
EFI_STATUS
|
||||
TestUnitReady (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition
|
||||
) ;
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition
|
||||
);
|
||||
|
||||
/**
|
||||
Send out ATAPI commands conforms to the Packet Command with PIO Data In Protocol.
|
||||
@ -600,10 +596,10 @@ AtapiPacketCommandIn (
|
||||
**/
|
||||
EFI_STATUS
|
||||
Inquiry (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
);
|
||||
|
||||
/**
|
||||
@ -623,10 +619,10 @@ Inquiry (
|
||||
**/
|
||||
EFI_STATUS
|
||||
DetectMedia (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
);
|
||||
|
||||
/**
|
||||
@ -683,10 +679,10 @@ RequestSense (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadCapacity (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
IN OUT EFI_PEI_BLOCK_IO_MEDIA *MediaInfo,
|
||||
IN OUT EFI_PEI_BLOCK_IO2_MEDIA *MediaInfo2
|
||||
);
|
||||
|
||||
/**
|
||||
@ -705,12 +701,12 @@ ReadCapacity (
|
||||
**/
|
||||
EFI_STATUS
|
||||
ReadSectors (
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_PEI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks,
|
||||
IN UINTN BlockSize
|
||||
IN ATAPI_BLK_IO_DEV *AtapiBlkIoDev,
|
||||
IN UINTN DevicePosition,
|
||||
IN VOID *Buffer,
|
||||
IN EFI_PEI_LBA StartLba,
|
||||
IN UINTN NumberOfBlocks,
|
||||
IN UINTN BlockSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -725,8 +721,8 @@ ReadSectors (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsNoMedia (
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts
|
||||
);
|
||||
|
||||
/**
|
||||
@ -741,8 +737,8 @@ IsNoMedia (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsDeviceStateUnclear (
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts
|
||||
);
|
||||
|
||||
/**
|
||||
@ -757,8 +753,8 @@ IsDeviceStateUnclear (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsMediaError (
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts
|
||||
);
|
||||
|
||||
/**
|
||||
@ -774,9 +770,9 @@ IsMediaError (
|
||||
**/
|
||||
BOOLEAN
|
||||
IsDriveReady (
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts,
|
||||
OUT BOOLEAN *NeedRetry
|
||||
IN ATAPI_REQUEST_SENSE_DATA *SenseData,
|
||||
IN UINTN SenseCounts,
|
||||
OUT BOOLEAN *NeedRetry
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -21,32 +21,32 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
#include <IndustryStandard/Acpi.h>
|
||||
|
||||
typedef struct {
|
||||
UINT64 VendorId;
|
||||
UINT64 DeviceId;
|
||||
UINT64 RevisionId;
|
||||
UINT64 SubsystemVendorId;
|
||||
UINT64 SubsystemDeviceId;
|
||||
UINT64 VendorId;
|
||||
UINT64 DeviceId;
|
||||
UINT64 RevisionId;
|
||||
UINT64 SubsystemVendorId;
|
||||
UINT64 SubsystemDeviceId;
|
||||
} EFI_PCI_DEVICE_HEADER_INFO;
|
||||
|
||||
typedef struct {
|
||||
UINT64 ResType;
|
||||
UINT64 GenFlag;
|
||||
UINT64 SpecificFlag;
|
||||
UINT64 AddrSpaceGranularity;
|
||||
UINT64 AddrRangeMin;
|
||||
UINT64 AddrRangeMax;
|
||||
UINT64 AddrTranslationOffset;
|
||||
UINT64 AddrLen;
|
||||
UINT64 ResType;
|
||||
UINT64 GenFlag;
|
||||
UINT64 SpecificFlag;
|
||||
UINT64 AddrSpaceGranularity;
|
||||
UINT64 AddrRangeMin;
|
||||
UINT64 AddrRangeMax;
|
||||
UINT64 AddrTranslationOffset;
|
||||
UINT64 AddrLen;
|
||||
} EFI_PCI_RESOUCE_DESCRIPTOR;
|
||||
|
||||
#define PCI_DEVICE_ID(VendorId, DeviceId, Revision, SubVendorId, SubDeviceId) \
|
||||
VendorId, DeviceId, Revision, SubVendorId, SubDeviceId
|
||||
|
||||
#define DEVICE_INF_TAG 0xFFF2
|
||||
#define DEVICE_RES_TAG 0xFFF1
|
||||
#define LIST_END_TAG 0x0000
|
||||
#define DEVICE_INF_TAG 0xFFF2
|
||||
#define DEVICE_RES_TAG 0xFFF1
|
||||
#define LIST_END_TAG 0x0000
|
||||
|
||||
#define EVEN_ALIGN 0xFFFFFFFFFFFFFFFEULL
|
||||
#define EVEN_ALIGN 0xFFFFFFFFFFFFFFFEULL
|
||||
|
||||
/**
|
||||
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
|
||||
//
|
||||
EFI_HANDLE mIncompatiblePciDeviceSupportHandle = NULL;
|
||||
EFI_HANDLE mIncompatiblePciDeviceSupportHandle = NULL;
|
||||
|
||||
//
|
||||
// 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
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
//
|
||||
// DEVICE_INF_TAG,
|
||||
// PCI_DEVICE_ID (VendorID, DeviceID, Revision, SubVendorId, SubDeviceId),
|
||||
@ -106,7 +106,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
// Device Adaptec 9004
|
||||
//
|
||||
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,
|
||||
ACPI_ADDRESS_SPACE_TYPE_IO,
|
||||
0,
|
||||
@ -120,7 +120,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
// Device Adaptec 9005
|
||||
//
|
||||
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,
|
||||
ACPI_ADDRESS_SPACE_TYPE_IO,
|
||||
0,
|
||||
@ -134,7 +134,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
// Device QLogic 1007
|
||||
//
|
||||
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,
|
||||
ACPI_ADDRESS_SPACE_TYPE_IO,
|
||||
0,
|
||||
@ -148,7 +148,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
// Device Agilent 103C
|
||||
//
|
||||
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,
|
||||
ACPI_ADDRESS_SPACE_TYPE_IO,
|
||||
0,
|
||||
@ -162,7 +162,7 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
// Device Agilent 15BC
|
||||
//
|
||||
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,
|
||||
ACPI_ADDRESS_SPACE_TYPE_IO,
|
||||
0,
|
||||
@ -178,7 +178,6 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
LIST_END_TAG
|
||||
};
|
||||
|
||||
|
||||
/**
|
||||
Entry point of the incompatible pci device support code. Setup an incompatible device list template
|
||||
and install EFI Incompatible PCI Device Support protocol.
|
||||
@ -193,11 +192,11 @@ GLOBAL_REMOVE_IF_UNREFERENCED UINT64 mIncompatiblePciDeviceList[] = {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
IncompatiblePciDeviceSupportEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
//
|
||||
// Install EFI Incompatible PCI Device Support Protocol on a new handle
|
||||
@ -244,15 +243,15 @@ PCheckDevice (
|
||||
OUT VOID **Configuration
|
||||
)
|
||||
{
|
||||
UINT64 Tag;
|
||||
UINT64 *ListPtr;
|
||||
UINT64 *TempListPtr;
|
||||
EFI_PCI_DEVICE_HEADER_INFO *Header;
|
||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AcpiPtr;
|
||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *OldAcpiPtr;
|
||||
EFI_PCI_RESOUCE_DESCRIPTOR *Dsc;
|
||||
EFI_ACPI_END_TAG_DESCRIPTOR *PtrEnd;
|
||||
UINTN Index;
|
||||
UINT64 Tag;
|
||||
UINT64 *ListPtr;
|
||||
UINT64 *TempListPtr;
|
||||
EFI_PCI_DEVICE_HEADER_INFO *Header;
|
||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *AcpiPtr;
|
||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *OldAcpiPtr;
|
||||
EFI_PCI_RESOUCE_DESCRIPTOR *Dsc;
|
||||
EFI_ACPI_END_TAG_DESCRIPTOR *PtrEnd;
|
||||
UINTN Index;
|
||||
|
||||
//
|
||||
// Validate the parameters
|
||||
@ -260,120 +259,121 @@ PCheckDevice (
|
||||
if (Configuration == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
//
|
||||
// Initialize the return value to NULL
|
||||
//
|
||||
* (VOID **) Configuration = NULL;
|
||||
*(VOID **)Configuration = NULL;
|
||||
|
||||
ListPtr = mIncompatiblePciDeviceList;
|
||||
ListPtr = mIncompatiblePciDeviceList;
|
||||
while (*ListPtr != LIST_END_TAG) {
|
||||
|
||||
Tag = *ListPtr;
|
||||
|
||||
switch (Tag) {
|
||||
case DEVICE_INF_TAG:
|
||||
Header = (EFI_PCI_DEVICE_HEADER_INFO *) (ListPtr + 1);
|
||||
ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_HEADER_INFO) / sizeof (UINT64);
|
||||
//
|
||||
// See if the Header matches the parameters passed in
|
||||
//
|
||||
if ((Header->VendorId != MAX_UINT64) && (VendorId != MAX_UINTN)) {
|
||||
if (Header->VendorId != VendorId) {
|
||||
continue;
|
||||
case DEVICE_INF_TAG:
|
||||
Header = (EFI_PCI_DEVICE_HEADER_INFO *)(ListPtr + 1);
|
||||
ListPtr = ListPtr + 1 + sizeof (EFI_PCI_DEVICE_HEADER_INFO) / sizeof (UINT64);
|
||||
//
|
||||
// See if the Header matches the parameters passed in
|
||||
//
|
||||
if ((Header->VendorId != MAX_UINT64) && (VendorId != MAX_UINTN)) {
|
||||
if (Header->VendorId != VendorId) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((Header->DeviceId != MAX_UINT64) && (DeviceId != MAX_UINTN)) {
|
||||
if (DeviceId != Header->DeviceId) {
|
||||
continue;
|
||||
if ((Header->DeviceId != MAX_UINT64) && (DeviceId != MAX_UINTN)) {
|
||||
if (DeviceId != Header->DeviceId) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((Header->RevisionId != MAX_UINT64) && (RevisionId != MAX_UINTN)) {
|
||||
if (RevisionId != Header->RevisionId) {
|
||||
continue;
|
||||
if ((Header->RevisionId != MAX_UINT64) && (RevisionId != MAX_UINTN)) {
|
||||
if (RevisionId != Header->RevisionId) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((Header->SubsystemVendorId != MAX_UINT64) && (SubsystemVendorId != MAX_UINTN)) {
|
||||
if (SubsystemVendorId != Header->SubsystemVendorId) {
|
||||
continue;
|
||||
if ((Header->SubsystemVendorId != MAX_UINT64) && (SubsystemVendorId != MAX_UINTN)) {
|
||||
if (SubsystemVendorId != Header->SubsystemVendorId) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ((Header->SubsystemDeviceId != MAX_UINT64) && (SubsystemDeviceId != MAX_UINTN)) {
|
||||
if (SubsystemDeviceId != Header->SubsystemDeviceId) {
|
||||
continue;
|
||||
if ((Header->SubsystemDeviceId != MAX_UINT64) && (SubsystemDeviceId != MAX_UINTN)) {
|
||||
if (SubsystemDeviceId != Header->SubsystemDeviceId) {
|
||||
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) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
//
|
||||
// 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));
|
||||
}
|
||||
|
||||
OldAcpiPtr = AcpiPtr;
|
||||
//
|
||||
// Fill the EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR structure
|
||||
// according to the EFI_PCI_RESOUCE_DESCRIPTOR structure
|
||||
//
|
||||
for (; *ListPtr == DEVICE_RES_TAG;) {
|
||||
//
|
||||
// If there is at least one type of resource request,
|
||||
// allocate an acpi resource node
|
||||
//
|
||||
if (Index == 0) {
|
||||
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;
|
||||
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;
|
||||
OldAcpiPtr = AcpiPtr;
|
||||
//
|
||||
// Fill the EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR structure
|
||||
// according to the EFI_PCI_RESOUCE_DESCRIPTOR structure
|
||||
//
|
||||
for ( ; *ListPtr == DEVICE_RES_TAG;) {
|
||||
Dsc = (EFI_PCI_RESOUCE_DESCRIPTOR *)(ListPtr + 1);
|
||||
|
||||
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));
|
||||
AcpiPtr++;
|
||||
}
|
||||
//
|
||||
// Put the checksum
|
||||
//
|
||||
PtrEnd = (EFI_ACPI_END_TAG_DESCRIPTOR *) (AcpiPtr);
|
||||
PtrEnd->Desc = ACPI_END_TAG_DESCRIPTOR;
|
||||
PtrEnd->Checksum = 0;
|
||||
break;
|
||||
|
||||
*(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));
|
||||
break;
|
||||
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
default:
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
@ -17,12 +17,12 @@
|
||||
//
|
||||
|
||||
STATIC
|
||||
EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {
|
||||
EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {
|
||||
{ "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.
|
||||
@ -49,9 +49,9 @@ STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonDiscoverablePciGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
@ -93,24 +93,24 @@ STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonDiscoverablePciGetDeviceName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_HANDLE ChildHandle,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_HANDLE ChildHandle,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
EFI_COMPONENT_NAME_PROTOCOL gComponentName = {
|
||||
EFI_COMPONENT_NAME_PROTOCOL gComponentName = {
|
||||
&NonDiscoverablePciGetDriverName,
|
||||
&NonDiscoverablePciGetDeviceName,
|
||||
"eng" // SupportedLanguages, ISO 639-2 language codes
|
||||
};
|
||||
|
||||
EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) &NonDiscoverablePciGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) &NonDiscoverablePciGetDeviceName,
|
||||
EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)&NonDiscoverablePciGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)&NonDiscoverablePciGetDeviceName,
|
||||
"en" // SupportedLanguages, RFC 4646 language codes
|
||||
};
|
||||
|
@ -10,16 +10,16 @@
|
||||
|
||||
#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;
|
||||
EFI_CPU_ARCH_PROTOCOL *mCpu;
|
||||
STATIC UINTN mUniqueIdCounter = 0;
|
||||
EFI_CPU_ARCH_PROTOCOL *mCpu;
|
||||
|
||||
//
|
||||
// We only support the following device types
|
||||
//
|
||||
STATIC
|
||||
CONST EFI_GUID * CONST
|
||||
CONST EFI_GUID *CONST
|
||||
SupportedNonDiscoverableDevices[] = {
|
||||
&gEdkiiNonDiscoverableAhciDeviceGuid,
|
||||
&gEdkiiNonDiscoverableEhciDeviceGuid,
|
||||
@ -63,27 +63,31 @@ STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonDiscoverablePciDeviceSupported (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
NON_DISCOVERABLE_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Desc;
|
||||
INTN Idx;
|
||||
NON_DISCOVERABLE_DEVICE *Device;
|
||||
EFI_STATUS Status;
|
||||
EFI_ACPI_ADDRESS_SPACE_DESCRIPTOR *Desc;
|
||||
INTN Idx;
|
||||
|
||||
Status = gBS->OpenProtocol (DeviceHandle,
|
||||
&gEdkiiNonDiscoverableDeviceProtocolGuid, (VOID **)&Device,
|
||||
This->DriverBindingHandle, DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER);
|
||||
Status = gBS->OpenProtocol (
|
||||
DeviceHandle,
|
||||
&gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
(VOID **)&Device,
|
||||
This->DriverBindingHandle,
|
||||
DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = EFI_UNSUPPORTED;
|
||||
for (Idx = 0; Idx < ARRAY_SIZE (SupportedNonDiscoverableDevices); Idx++) {
|
||||
if (CompareGuid (Device->Type, SupportedNonDiscoverableDevices [Idx])) {
|
||||
if (CompareGuid (Device->Type, SupportedNonDiscoverableDevices[Idx])) {
|
||||
Status = EFI_SUCCESS;
|
||||
break;
|
||||
}
|
||||
@ -98,17 +102,23 @@ NonDiscoverablePciDeviceSupported (
|
||||
// that they only describe things that we can handle
|
||||
//
|
||||
for (Desc = Device->Resources; Desc->Desc != ACPI_END_TAG_DESCRIPTOR;
|
||||
Desc = (VOID *)((UINT8 *)Desc + Desc->Len + 3)) {
|
||||
if (Desc->Desc != ACPI_ADDRESS_SPACE_DESCRIPTOR ||
|
||||
Desc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM) {
|
||||
Desc = (VOID *)((UINT8 *)Desc + Desc->Len + 3))
|
||||
{
|
||||
if ((Desc->Desc != ACPI_ADDRESS_SPACE_DESCRIPTOR) ||
|
||||
(Desc->ResType != ACPI_ADDRESS_SPACE_TYPE_MEM))
|
||||
{
|
||||
Status = EFI_UNSUPPORTED;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
CloseProtocol:
|
||||
gBS->CloseProtocol (DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
This->DriverBindingHandle, DeviceHandle);
|
||||
gBS->CloseProtocol (
|
||||
DeviceHandle,
|
||||
&gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
DeviceHandle
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
||||
@ -130,13 +140,13 @@ STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonDiscoverablePciDeviceStart (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath
|
||||
)
|
||||
{
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Dev;
|
||||
EFI_STATUS Status;
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Dev;
|
||||
EFI_STATUS Status;
|
||||
|
||||
ASSERT (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;
|
||||
}
|
||||
|
||||
Status = gBS->OpenProtocol (DeviceHandle,
|
||||
Status = gBS->OpenProtocol (
|
||||
DeviceHandle,
|
||||
&gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
(VOID **)&Dev->Device, This->DriverBindingHandle,
|
||||
DeviceHandle, EFI_OPEN_PROTOCOL_BY_DRIVER);
|
||||
(VOID **)&Dev->Device,
|
||||
This->DriverBindingHandle,
|
||||
DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto FreeDev;
|
||||
}
|
||||
@ -163,8 +177,12 @@ NonDiscoverablePciDeviceStart (
|
||||
// EFI_PCI_IO_PROTOCOL interface.
|
||||
//
|
||||
Dev->Signature = NON_DISCOVERABLE_PCI_DEVICE_SIG;
|
||||
Status = gBS->InstallProtocolInterface (&DeviceHandle, &gEfiPciIoProtocolGuid,
|
||||
EFI_NATIVE_INTERFACE, &Dev->PciIo);
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&DeviceHandle,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
&Dev->PciIo
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto CloseProtocol;
|
||||
}
|
||||
@ -174,8 +192,12 @@ NonDiscoverablePciDeviceStart (
|
||||
return EFI_SUCCESS;
|
||||
|
||||
CloseProtocol:
|
||||
gBS->CloseProtocol (DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
This->DriverBindingHandle, DeviceHandle);
|
||||
gBS->CloseProtocol (
|
||||
DeviceHandle,
|
||||
&gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
DeviceHandle
|
||||
);
|
||||
|
||||
FreeDev:
|
||||
FreePool (Dev);
|
||||
@ -199,19 +221,24 @@ STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonDiscoverablePciDeviceStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE DeviceHandle,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Dev;
|
||||
EFI_STATUS Status;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Dev;
|
||||
|
||||
Status = gBS->OpenProtocol (DeviceHandle, &gEfiPciIoProtocolGuid,
|
||||
(VOID **)&PciIo, This->DriverBindingHandle, DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL);
|
||||
Status = gBS->OpenProtocol (
|
||||
DeviceHandle,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **)&PciIo,
|
||||
This->DriverBindingHandle,
|
||||
DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
@ -221,27 +248,33 @@ NonDiscoverablePciDeviceStop (
|
||||
//
|
||||
// Handle Stop() requests for in-use driver instances gracefully.
|
||||
//
|
||||
Status = gBS->UninstallProtocolInterface (DeviceHandle,
|
||||
&gEfiPciIoProtocolGuid, &Dev->PciIo);
|
||||
Status = gBS->UninstallProtocolInterface (
|
||||
DeviceHandle,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
&Dev->PciIo
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (DeviceHandle, &gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
This->DriverBindingHandle, DeviceHandle);
|
||||
gBS->CloseProtocol (
|
||||
DeviceHandle,
|
||||
&gEdkiiNonDiscoverableDeviceProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
DeviceHandle
|
||||
);
|
||||
|
||||
FreePool (Dev);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// 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
|
||||
// C, 10.1 EFI Driver Binding Protocol.
|
||||
//
|
||||
STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
|
||||
STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
|
||||
&NonDiscoverablePciDeviceSupported,
|
||||
&NonDiscoverablePciDeviceStart,
|
||||
&NonDiscoverablePciDeviceStop,
|
||||
@ -263,14 +296,14 @@ STATIC EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NonDiscoverablePciDeviceDxeEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&mCpu);
|
||||
ASSERT_EFI_ERROR(Status);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
return EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -24,7 +24,7 @@
|
||||
#include <Protocol/Cpu.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) \
|
||||
CR (PciIoPointer, NON_DISCOVERABLE_PCI_DEVICE, PciIo, \
|
||||
@ -33,74 +33,74 @@
|
||||
#define DEV_SUPPORTED_ATTRIBUTES \
|
||||
(EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE)
|
||||
|
||||
#define PCI_ID_VENDOR_UNKNOWN 0xffff
|
||||
#define PCI_ID_DEVICE_DONTCARE 0x0000
|
||||
#define PCI_ID_VENDOR_UNKNOWN 0xffff
|
||||
#define PCI_ID_DEVICE_DONTCARE 0x0000
|
||||
|
||||
extern EFI_CPU_ARCH_PROTOCOL *mCpu;
|
||||
extern EFI_CPU_ARCH_PROTOCOL *mCpu;
|
||||
|
||||
typedef struct {
|
||||
//
|
||||
// The linked-list next pointer
|
||||
//
|
||||
LIST_ENTRY List;
|
||||
LIST_ENTRY List;
|
||||
//
|
||||
// The address of the uncached allocation
|
||||
//
|
||||
VOID *HostAddress;
|
||||
VOID *HostAddress;
|
||||
//
|
||||
// The number of pages in the allocation
|
||||
//
|
||||
UINTN NumPages;
|
||||
UINTN NumPages;
|
||||
//
|
||||
// The attributes of the allocation
|
||||
//
|
||||
UINT64 Attributes;
|
||||
UINT64 Attributes;
|
||||
} NON_DISCOVERABLE_DEVICE_UNCACHED_ALLOCATION;
|
||||
|
||||
typedef struct {
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
//
|
||||
// The bound non-discoverable device protocol instance
|
||||
//
|
||||
NON_DISCOVERABLE_DEVICE *Device;
|
||||
NON_DISCOVERABLE_DEVICE *Device;
|
||||
//
|
||||
// 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
|
||||
// items are assigned.
|
||||
//
|
||||
PCI_TYPE00 ConfigSpace;
|
||||
PCI_TYPE00 ConfigSpace;
|
||||
//
|
||||
// The first virtual BAR to assign based on the resources described
|
||||
// by the non-discoverable device.
|
||||
//
|
||||
UINT32 BarOffset;
|
||||
UINT32 BarOffset;
|
||||
//
|
||||
// The number of virtual BARs we expose based on the number of
|
||||
// resources
|
||||
//
|
||||
UINT32 BarCount;
|
||||
UINT32 BarCount;
|
||||
//
|
||||
// The PCI I/O attributes for this device
|
||||
//
|
||||
UINT64 Attributes;
|
||||
UINT64 Attributes;
|
||||
//
|
||||
// Whether this device has been enabled
|
||||
//
|
||||
BOOLEAN Enabled;
|
||||
BOOLEAN Enabled;
|
||||
//
|
||||
// Linked list to keep track of uncached allocations performed
|
||||
// on behalf of this device
|
||||
//
|
||||
LIST_ENTRY UncachedAllocationList;
|
||||
LIST_ENTRY UncachedAllocationList;
|
||||
//
|
||||
// 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
|
||||
// may change when disconnecting/reconnecting the driver.
|
||||
//
|
||||
UINTN UniqueId;
|
||||
UINTN UniqueId;
|
||||
} NON_DISCOVERABLE_PCI_DEVICE;
|
||||
|
||||
/**
|
||||
@ -111,10 +111,10 @@ typedef struct {
|
||||
**/
|
||||
VOID
|
||||
InitializePciIoProtocol (
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Device
|
||||
NON_DISCOVERABLE_PCI_DEVICE *Device
|
||||
);
|
||||
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2;
|
||||
extern EFI_COMPONENT_NAME_PROTOCOL gComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gComponentName2;
|
||||
|
||||
#endif
|
||||
|
@ -12,7 +12,7 @@
|
||||
//
|
||||
// EFI Component Name Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName = {
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName = {
|
||||
NvmExpressComponentNameGetDriverName,
|
||||
NvmExpressComponentNameGetControllerName,
|
||||
"eng"
|
||||
@ -21,20 +21,20 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentNa
|
||||
//
|
||||
// EFI Component Name 2 Protocol
|
||||
//
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME) NvmExpressComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) NvmExpressComponentNameGetControllerName,
|
||||
GLOBAL_REMOVE_IF_UNREFERENCED EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2 = {
|
||||
(EFI_COMPONENT_NAME2_GET_DRIVER_NAME)NvmExpressComponentNameGetDriverName,
|
||||
(EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME)NvmExpressComponentNameGetControllerName,
|
||||
"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" },
|
||||
{ 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" },
|
||||
{ NULL, NULL }
|
||||
{ NULL, NULL }
|
||||
};
|
||||
|
||||
/**
|
||||
@ -79,9 +79,9 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_UNICODE_STRING_TABLE mNvmExpressControllerName
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressComponentNameGetDriverName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **DriverName
|
||||
)
|
||||
{
|
||||
return LookupUnicodeString2 (
|
||||
@ -164,17 +164,17 @@ NvmExpressComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_UNICODE_STRING_TABLE *ControllerNameTable;
|
||||
|
||||
//
|
||||
// Make sure this driver is currently managing ControllHandle
|
||||
@ -198,13 +198,14 @@ NvmExpressComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// Get the child context
|
||||
//
|
||||
Status = gBS->OpenProtocol (
|
||||
ChildHandle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
gNvmExpressDriverBinding.DriverBindingHandle,
|
||||
ChildHandle,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -212,7 +213,8 @@ NvmExpressComponentNameGetControllerName (
|
||||
if (EFI_ERROR (Status)) {
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
|
||||
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_BLOCK_IO (BlockIo);
|
||||
ControllerNameTable = Device->ControllerNameTable;
|
||||
}
|
||||
|
||||
@ -223,5 +225,4 @@ NvmExpressComponentNameGetControllerName (
|
||||
ControllerName,
|
||||
(BOOLEAN)(This == &gNvmExpressComponentName)
|
||||
);
|
||||
|
||||
}
|
||||
|
@ -12,7 +12,7 @@
|
||||
//
|
||||
// NVM Express Driver Binding Protocol Instance
|
||||
//
|
||||
EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
|
||||
EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
|
||||
NvmExpressDriverBindingSupported,
|
||||
NvmExpressDriverBindingStart,
|
||||
NvmExpressDriverBindingStop,
|
||||
@ -24,7 +24,7 @@ EFI_DRIVER_BINDING_PROTOCOL gNvmExpressDriverBinding = {
|
||||
//
|
||||
// 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.
|
||||
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.
|
||||
//
|
||||
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_LOGICAL |
|
||||
EFI_NVM_EXPRESS_PASS_THRU_ATTRIBUTES_NONBLOCKIO |
|
||||
@ -56,24 +56,24 @@ GLOBAL_REMOVE_IF_UNREFERENCED EFI_NVM_EXPRESS_PASS_THRU_MODE gEfiNvmExpressPassT
|
||||
**/
|
||||
EFI_STATUS
|
||||
EnumerateNvmeDevNamespace (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
UINT32 NamespaceId
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private,
|
||||
UINT32 NamespaceId
|
||||
)
|
||||
{
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Lbads;
|
||||
UINT32 Flbas;
|
||||
UINT32 LbaFmtIdx;
|
||||
UINT8 Sn[21];
|
||||
UINT8 Mn[41];
|
||||
VOID *DummyInterface;
|
||||
NVME_ADMIN_NAMESPACE_DATA *NamespaceData;
|
||||
EFI_DEVICE_PATH_PROTOCOL *NewDevicePathNode;
|
||||
EFI_DEVICE_PATH_PROTOCOL *DevicePath;
|
||||
EFI_HANDLE DeviceHandle;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STATUS Status;
|
||||
UINT32 Lbads;
|
||||
UINT32 Flbas;
|
||||
UINT32 LbaFmtIdx;
|
||||
UINT8 Sn[21];
|
||||
UINT8 Mn[41];
|
||||
VOID *DummyInterface;
|
||||
|
||||
NewDevicePathNode = NULL;
|
||||
DevicePath = NULL;
|
||||
@ -82,8 +82,8 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Allocate a buffer for Identify Namespace data
|
||||
//
|
||||
NamespaceData = AllocateZeroPool(sizeof (NVME_ADMIN_NAMESPACE_DATA));
|
||||
if(NamespaceData == NULL) {
|
||||
NamespaceData = AllocateZeroPool (sizeof (NVME_ADMIN_NAMESPACE_DATA));
|
||||
if (NamespaceData == NULL) {
|
||||
return EFI_OUT_OF_RESOURCES;
|
||||
}
|
||||
|
||||
@ -96,9 +96,10 @@ EnumerateNvmeDevNamespace (
|
||||
NamespaceId,
|
||||
(VOID *)NamespaceData
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
//
|
||||
// Validate Namespace
|
||||
//
|
||||
@ -108,7 +109,7 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// 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) {
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
goto Exit;
|
||||
@ -117,9 +118,9 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Initialize SSD namespace instance data
|
||||
//
|
||||
Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE;
|
||||
Device->NamespaceId = NamespaceId;
|
||||
Device->NamespaceUuid = NamespaceData->Eui64;
|
||||
Device->Signature = NVME_DEVICE_PRIVATE_DATA_SIGNATURE;
|
||||
Device->NamespaceId = NamespaceId;
|
||||
Device->NamespaceUuid = NamespaceData->Eui64;
|
||||
|
||||
Device->ControllerHandle = Private->ControllerHandle;
|
||||
Device->DriverBindingHandle = Private->DriverBindingHandle;
|
||||
@ -128,17 +129,17 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Build BlockIo media structure
|
||||
//
|
||||
Device->Media.MediaId = 0;
|
||||
Device->Media.RemovableMedia = FALSE;
|
||||
Device->Media.MediaPresent = TRUE;
|
||||
Device->Media.MediaId = 0;
|
||||
Device->Media.RemovableMedia = FALSE;
|
||||
Device->Media.MediaPresent = TRUE;
|
||||
Device->Media.LogicalPartition = FALSE;
|
||||
Device->Media.ReadOnly = FALSE;
|
||||
Device->Media.WriteCaching = FALSE;
|
||||
Device->Media.IoAlign = Private->PassThruMode.IoAlign;
|
||||
Device->Media.ReadOnly = FALSE;
|
||||
Device->Media.WriteCaching = FALSE;
|
||||
Device->Media.IoAlign = Private->PassThruMode.IoAlign;
|
||||
|
||||
Flbas = NamespaceData->Flbas;
|
||||
LbaFmtIdx = Flbas & 0xF;
|
||||
Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads;
|
||||
Flbas = NamespaceData->Flbas;
|
||||
LbaFmtIdx = Flbas & 0xF;
|
||||
Lbads = NamespaceData->LbaFormat[LbaFmtIdx].Lbads;
|
||||
Device->Media.BlockSize = (UINT32)1 << Lbads;
|
||||
|
||||
Device->Media.LastBlock = NamespaceData->Nsze - 1;
|
||||
@ -148,21 +149,21 @@ EnumerateNvmeDevNamespace (
|
||||
//
|
||||
// Create BlockIo Protocol instance
|
||||
//
|
||||
Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
|
||||
Device->BlockIo.Media = &Device->Media;
|
||||
Device->BlockIo.Reset = NvmeBlockIoReset;
|
||||
Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks;
|
||||
Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks;
|
||||
Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks;
|
||||
Device->BlockIo.Revision = EFI_BLOCK_IO_PROTOCOL_REVISION2;
|
||||
Device->BlockIo.Media = &Device->Media;
|
||||
Device->BlockIo.Reset = NvmeBlockIoReset;
|
||||
Device->BlockIo.ReadBlocks = NvmeBlockIoReadBlocks;
|
||||
Device->BlockIo.WriteBlocks = NvmeBlockIoWriteBlocks;
|
||||
Device->BlockIo.FlushBlocks = NvmeBlockIoFlushBlocks;
|
||||
|
||||
//
|
||||
// Create BlockIo2 Protocol instance
|
||||
//
|
||||
Device->BlockIo2.Media = &Device->Media;
|
||||
Device->BlockIo2.Reset = NvmeBlockIoResetEx;
|
||||
Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx;
|
||||
Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx;
|
||||
Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx;
|
||||
Device->BlockIo2.Media = &Device->Media;
|
||||
Device->BlockIo2.Reset = NvmeBlockIoResetEx;
|
||||
Device->BlockIo2.ReadBlocksEx = NvmeBlockIoReadBlocksEx;
|
||||
Device->BlockIo2.WriteBlocksEx = NvmeBlockIoWriteBlocksEx;
|
||||
Device->BlockIo2.FlushBlocksEx = NvmeBlockIoFlushBlocksEx;
|
||||
InitializeListHead (&Device->AsyncQueue);
|
||||
|
||||
//
|
||||
@ -186,7 +187,7 @@ EnumerateNvmeDevNamespace (
|
||||
&NewDevicePathNode
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@ -199,10 +200,10 @@ EnumerateNvmeDevNamespace (
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
DeviceHandle = NULL;
|
||||
DeviceHandle = NULL;
|
||||
RemainingDevicePath = DevicePath;
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd(RemainingDevicePath)) {
|
||||
Status = gBS->LocateDevicePath (&gEfiDevicePathProtocolGuid, &RemainingDevicePath, &DeviceHandle);
|
||||
if (!EFI_ERROR (Status) && (DeviceHandle != NULL) && IsDevicePathEnd (RemainingDevicePath)) {
|
||||
Status = EFI_ALREADY_STARTED;
|
||||
FreePool (DevicePath);
|
||||
goto Exit;
|
||||
@ -228,7 +229,7 @@ EnumerateNvmeDevNamespace (
|
||||
NULL
|
||||
);
|
||||
|
||||
if(EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@ -242,7 +243,7 @@ EnumerateNvmeDevNamespace (
|
||||
EFI_NATIVE_INTERFACE,
|
||||
&Device->StorageSecurity
|
||||
);
|
||||
if(EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Device->DeviceHandle,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
@ -262,7 +263,7 @@ EnumerateNvmeDevNamespace (
|
||||
gBS->OpenProtocol (
|
||||
Private->ControllerHandle,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &DummyInterface,
|
||||
(VOID **)&DummyInterface,
|
||||
Private->DriverBindingHandle,
|
||||
Device->DeviceHandle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@ -304,7 +305,7 @@ EnumerateNvmeDevNamespace (
|
||||
}
|
||||
|
||||
Exit:
|
||||
if(NamespaceData != NULL) {
|
||||
if (NamespaceData != NULL) {
|
||||
FreePool (NamespaceData);
|
||||
}
|
||||
|
||||
@ -312,12 +313,14 @@ Exit:
|
||||
FreePool (NewDevicePathNode);
|
||||
}
|
||||
|
||||
if(EFI_ERROR(Status) && (Device != NULL) && (Device->DevicePath != NULL)) {
|
||||
if (EFI_ERROR (Status) && (Device != NULL) && (Device->DevicePath != NULL)) {
|
||||
FreePool (Device->DevicePath);
|
||||
}
|
||||
if(EFI_ERROR(Status) && (Device != NULL)) {
|
||||
|
||||
if (EFI_ERROR (Status) && (Device != NULL)) {
|
||||
FreePool (Device);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -333,15 +336,15 @@ Exit:
|
||||
**/
|
||||
EFI_STATUS
|
||||
DiscoverAllNamespaces (
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
IN NVME_CONTROLLER_PRIVATE_DATA *Private
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 NamespaceId;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *Passthru;
|
||||
EFI_STATUS Status;
|
||||
UINT32 NamespaceId;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *Passthru;
|
||||
|
||||
NamespaceId = 0xFFFFFFFF;
|
||||
Passthru = &Private->Passthru;
|
||||
NamespaceId = 0xFFFFFFFF;
|
||||
Passthru = &Private->Passthru;
|
||||
|
||||
while (TRUE) {
|
||||
Status = Passthru->GetNextNamespace (
|
||||
@ -358,7 +361,7 @@ DiscoverAllNamespaces (
|
||||
NamespaceId
|
||||
);
|
||||
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
continue;
|
||||
}
|
||||
}
|
||||
@ -382,25 +385,25 @@ DiscoverAllNamespaces (
|
||||
**/
|
||||
EFI_STATUS
|
||||
UnregisterNvmeNamespace (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN EFI_HANDLE Handle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
|
||||
BOOLEAN IsEmpty;
|
||||
EFI_TPL OldTpl;
|
||||
VOID *DummyInterface;
|
||||
EFI_STATUS Status;
|
||||
EFI_BLOCK_IO_PROTOCOL *BlockIo;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *StorageSecurity;
|
||||
BOOLEAN IsEmpty;
|
||||
EFI_TPL OldTpl;
|
||||
VOID *DummyInterface;
|
||||
|
||||
BlockIo = NULL;
|
||||
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiBlockIoProtocolGuid,
|
||||
(VOID **) &BlockIo,
|
||||
(VOID **)&BlockIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -409,7 +412,7 @@ UnregisterNvmeNamespace (
|
||||
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.
|
||||
@ -457,7 +460,7 @@ UnregisterNvmeNamespace (
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &DummyInterface,
|
||||
(VOID **)&DummyInterface,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
@ -471,7 +474,7 @@ UnregisterNvmeNamespace (
|
||||
Status = gBS->OpenProtocol (
|
||||
Handle,
|
||||
&gEfiStorageSecurityCommandProtocolGuid,
|
||||
(VOID **) &StorageSecurity,
|
||||
(VOID **)&StorageSecurity,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -485,18 +488,18 @@ UnregisterNvmeNamespace (
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &DummyInterface,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **)&DummyInterface,
|
||||
This->DriverBindingHandle,
|
||||
Handle,
|
||||
EFI_OPEN_PROTOCOL_BY_CHILD_CONTROLLER
|
||||
);
|
||||
return Status;
|
||||
}
|
||||
}
|
||||
|
||||
if(Device->DevicePath != NULL) {
|
||||
if (Device->DevicePath != NULL) {
|
||||
FreePool (Device->DevicePath);
|
||||
}
|
||||
|
||||
@ -520,25 +523,25 @@ UnregisterNvmeNamespace (
|
||||
VOID
|
||||
EFIAPI
|
||||
ProcessAsyncTaskList (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID* Context
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
NVME_CQ *Cq;
|
||||
UINT16 QueueId;
|
||||
UINT32 Data;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
|
||||
NVME_BLKIO2_SUBTASK *Subtask;
|
||||
NVME_BLKIO2_REQUEST *BlkIo2Request;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
BOOLEAN HasNewItem;
|
||||
EFI_STATUS Status;
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Private;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
NVME_CQ *Cq;
|
||||
UINT16 QueueId;
|
||||
UINT32 Data;
|
||||
LIST_ENTRY *Link;
|
||||
LIST_ENTRY *NextLink;
|
||||
NVME_PASS_THRU_ASYNC_REQ *AsyncRequest;
|
||||
NVME_BLKIO2_SUBTASK *Subtask;
|
||||
NVME_BLKIO2_REQUEST *BlkIo2Request;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
BOOLEAN HasNewItem;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Private = (NVME_CONTROLLER_PRIVATE_DATA*)Context;
|
||||
Private = (NVME_CONTROLLER_PRIVATE_DATA *)Context;
|
||||
QueueId = 2;
|
||||
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
|
||||
HasNewItem = FALSE;
|
||||
@ -549,7 +552,8 @@ ProcessAsyncTaskList (
|
||||
//
|
||||
for (Link = GetFirstNode (&Private->UnsubmittedSubtasks);
|
||||
!IsNull (&Private->UnsubmittedSubtasks, Link);
|
||||
Link = NextLink) {
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Private->UnsubmittedSubtasks, Link);
|
||||
Subtask = NVME_BLKIO2_SUBTASK_FROM_LINK (Link);
|
||||
BlkIo2Request = Subtask->BlockIo2Request;
|
||||
@ -563,7 +567,8 @@ ProcessAsyncTaskList (
|
||||
if (Token->TransactionStatus != EFI_SUCCESS) {
|
||||
if (IsListEmpty (&BlkIo2Request->SubtasksQueue) &&
|
||||
BlkIo2Request->LastSubtaskSubmitted &&
|
||||
(BlkIo2Request->UnsubmittedSubtaskNum == 0)) {
|
||||
(BlkIo2Request->UnsubmittedSubtaskNum == 0))
|
||||
{
|
||||
//
|
||||
// Remove the BlockIo2 request from the device asynchronous queue.
|
||||
//
|
||||
@ -594,7 +599,8 @@ ProcessAsyncTaskList (
|
||||
Token->TransactionStatus = EFI_DEVICE_ERROR;
|
||||
|
||||
if (IsListEmpty (&BlkIo2Request->SubtasksQueue) &&
|
||||
Subtask->IsLast) {
|
||||
Subtask->IsLast)
|
||||
{
|
||||
//
|
||||
// Remove the BlockIo2 request from the device asynchronous queue.
|
||||
//
|
||||
@ -625,8 +631,9 @@ ProcessAsyncTaskList (
|
||||
//
|
||||
for (Link = GetFirstNode (&Private->AsyncPassThruQueue);
|
||||
!IsNull (&Private->AsyncPassThruQueue, Link);
|
||||
Link = NextLink) {
|
||||
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
|
||||
Link = NextLink)
|
||||
{
|
||||
NextLink = GetNextNode (&Private->AsyncPassThruQueue, Link);
|
||||
AsyncRequest = NVME_PASS_THRU_ASYNC_REQ_FROM_THIS (Link);
|
||||
if (AsyncRequest->CommandId == Cq->Cid) {
|
||||
//
|
||||
@ -636,7 +643,7 @@ ProcessAsyncTaskList (
|
||||
CopyMem (
|
||||
AsyncRequest->Packet->NvmeCompletion,
|
||||
Cq,
|
||||
sizeof(EFI_NVM_EXPRESS_COMPLETION)
|
||||
sizeof (EFI_NVM_EXPRESS_COMPLETION)
|
||||
);
|
||||
|
||||
//
|
||||
@ -645,12 +652,15 @@ ProcessAsyncTaskList (
|
||||
if (AsyncRequest->MapData != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapData);
|
||||
}
|
||||
|
||||
if (AsyncRequest->MapMeta != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapMeta);
|
||||
}
|
||||
|
||||
if (AsyncRequest->MapPrpList != NULL) {
|
||||
PciIo->Unmap (PciIo, AsyncRequest->MapPrpList);
|
||||
}
|
||||
|
||||
if (AsyncRequest->PrpListHost != NULL) {
|
||||
PciIo->FreeBuffer (
|
||||
PciIo,
|
||||
@ -674,19 +684,19 @@ ProcessAsyncTaskList (
|
||||
Private->CqHdbl[QueueId].Cqh++;
|
||||
if (Private->CqHdbl[QueueId].Cqh > MIN (NVME_ASYNC_CCQ_SIZE, Private->Cap.Mqes)) {
|
||||
Private->CqHdbl[QueueId].Cqh = 0;
|
||||
Private->Pt[QueueId] ^= 1;
|
||||
Private->Pt[QueueId] ^= 1;
|
||||
}
|
||||
|
||||
Cq = Private->CqBuffer[QueueId] + Private->CqHdbl[QueueId].Cqh;
|
||||
}
|
||||
|
||||
if (HasNewItem) {
|
||||
Data = ReadUnaligned32 ((UINT32*)&Private->CqHdbl[QueueId]);
|
||||
Data = ReadUnaligned32 ((UINT32 *)&Private->CqHdbl[QueueId]);
|
||||
PciIo->Mem.Write (
|
||||
PciIo,
|
||||
EfiPciIoWidthUint32,
|
||||
NVME_BAR,
|
||||
NVME_CQHDBL_OFFSET(QueueId, Private->Cap.Dstrd),
|
||||
NVME_CQHDBL_OFFSET (QueueId, Private->Cap.Dstrd),
|
||||
1,
|
||||
&Data
|
||||
);
|
||||
@ -766,8 +776,9 @@ NvmExpressDriverBindingSupported (
|
||||
|
||||
if ((DevicePathNode.DevPath->Type != MESSAGING_DEVICE_PATH) ||
|
||||
(DevicePathNode.DevPath->SubType != MSG_NVME_NAMESPACE_DP) ||
|
||||
(DevicePathNodeLength(DevicePathNode.DevPath) != sizeof(NVME_NAMESPACE_DEVICE_PATH))) {
|
||||
return EFI_UNSUPPORTED;
|
||||
(DevicePathNodeLength (DevicePathNode.DevPath) != sizeof (NVME_NAMESPACE_DEVICE_PATH)))
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -778,7 +789,7 @@ NvmExpressDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -807,7 +818,7 @@ NvmExpressDriverBindingSupported (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo,
|
||||
(VOID **)&PciIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -853,7 +864,6 @@ Done:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Starts a device controller or a bus controller.
|
||||
|
||||
@ -915,7 +925,7 @@ NvmExpressDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
(VOID **) &ParentDevicePath,
|
||||
(VOID **)&ParentDevicePath,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -927,7 +937,7 @@ NvmExpressDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
(VOID **) &PciIo,
|
||||
(VOID **)&PciIo,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_BY_DRIVER
|
||||
@ -965,14 +975,14 @@ NvmExpressDriverBindingStart (
|
||||
AllocateAnyPages,
|
||||
EfiBootServicesData,
|
||||
6,
|
||||
(VOID**)&Private->Buffer,
|
||||
(VOID **)&Private->Buffer,
|
||||
0
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
Bytes = EFI_PAGES_TO_SIZE (6);
|
||||
Bytes = EFI_PAGES_TO_SIZE (6);
|
||||
Status = PciIo->Map (
|
||||
PciIo,
|
||||
EfiPciIoOperationBusMasterCommonBuffer,
|
||||
@ -988,7 +998,7 @@ NvmExpressDriverBindingStart (
|
||||
|
||||
Private->BufferPciAddr = (UINT8 *)(UINTN)MappedAddr;
|
||||
|
||||
Private->Signature = NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE;
|
||||
Private->Signature = NVME_CONTROLLER_PRIVATE_DATA_SIGNATURE;
|
||||
Private->ControllerHandle = Controller;
|
||||
Private->ImageHandle = This->DriverBindingHandle;
|
||||
Private->DriverBindingHandle = This->DriverBindingHandle;
|
||||
@ -1004,7 +1014,7 @@ NvmExpressDriverBindingStart (
|
||||
InitializeListHead (&Private->UnsubmittedSubtasks);
|
||||
|
||||
Status = NvmeControllerInit (Private);
|
||||
if (EFI_ERROR(Status)) {
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto Exit;
|
||||
}
|
||||
|
||||
@ -1046,7 +1056,7 @@ NvmExpressDriverBindingStart (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &Passthru,
|
||||
(VOID **)&Passthru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -1065,7 +1075,6 @@ NvmExpressDriverBindingStart (
|
||||
Status = DiscoverAllNamespaces (
|
||||
Private
|
||||
);
|
||||
|
||||
} else if (!IsDevicePathEnd (RemainingDevicePath)) {
|
||||
//
|
||||
// Enumerate the specified NVME namespace
|
||||
@ -1127,7 +1136,6 @@ Exit:
|
||||
return Status;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Stops a device controller or a bus controller.
|
||||
|
||||
@ -1157,10 +1165,10 @@ Exit:
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
@ -1175,7 +1183,7 @@ NvmExpressDriverBindingStop (
|
||||
Status = gBS->OpenProtocol (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
(VOID **) &PassThru,
|
||||
(VOID **)&PassThru,
|
||||
This->DriverBindingHandle,
|
||||
Controller,
|
||||
EFI_OPEN_PROTOCOL_GET_PROTOCOL
|
||||
@ -1201,11 +1209,11 @@ NvmExpressDriverBindingStop (
|
||||
}
|
||||
|
||||
gBS->UninstallMultipleProtocolInterfaces (
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
PassThru,
|
||||
NULL
|
||||
);
|
||||
Controller,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
PassThru,
|
||||
NULL
|
||||
);
|
||||
|
||||
if (Private->TimerEvent != NULL) {
|
||||
gBS->CloseEvent (Private->TimerEvent);
|
||||
@ -1224,17 +1232,17 @@ NvmExpressDriverBindingStop (
|
||||
}
|
||||
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiPciIoProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
gBS->CloseProtocol (
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
Controller,
|
||||
&gEfiDevicePathProtocolGuid,
|
||||
This->DriverBindingHandle,
|
||||
Controller
|
||||
);
|
||||
|
||||
NvmeUnregisterShutdownNotification ();
|
||||
|
||||
@ -1272,15 +1280,15 @@ NvmExpressDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressUnload (
|
||||
IN EFI_HANDLE ImageHandle
|
||||
IN EFI_HANDLE ImageHandle
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE *DeviceHandleBuffer;
|
||||
UINTN DeviceHandleCount;
|
||||
UINTN Index;
|
||||
EFI_COMPONENT_NAME_PROTOCOL *ComponentName;
|
||||
EFI_COMPONENT_NAME2_PROTOCOL *ComponentName2;
|
||||
|
||||
//
|
||||
// Get the list of the device handles managed by this driver.
|
||||
@ -1289,13 +1297,13 @@ NvmExpressUnload (
|
||||
// those protocols installed at image handle.
|
||||
//
|
||||
DeviceHandleBuffer = NULL;
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
NULL,
|
||||
&DeviceHandleCount,
|
||||
&DeviceHandleBuffer
|
||||
);
|
||||
Status = gBS->LocateHandleBuffer (
|
||||
ByProtocol,
|
||||
&gEfiNvmExpressPassThruProtocolGuid,
|
||||
NULL,
|
||||
&DeviceHandleCount,
|
||||
&DeviceHandleBuffer
|
||||
);
|
||||
|
||||
if (!EFI_ERROR (Status)) {
|
||||
//
|
||||
@ -1342,7 +1350,7 @@ NvmExpressUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiComponentNameProtocolGuid,
|
||||
(VOID **) &ComponentName
|
||||
(VOID **)&ComponentName
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
@ -1355,7 +1363,7 @@ NvmExpressUnload (
|
||||
Status = gBS->HandleProtocol (
|
||||
ImageHandle,
|
||||
&gEfiComponentName2ProtocolGuid,
|
||||
(VOID **) &ComponentName2
|
||||
(VOID **)&ComponentName2
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
gBS->UninstallProtocolInterface (
|
||||
@ -1374,6 +1382,7 @@ EXIT:
|
||||
if (DeviceHandleBuffer != NULL) {
|
||||
gBS->FreePool (DeviceHandleBuffer);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
@ -1394,7 +1403,7 @@ NvmExpressDriverEntry (
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = EfiLibInstallDriverBindingComponentName2 (
|
||||
ImageHandle,
|
||||
@ -1411,12 +1420,12 @@ NvmExpressDriverEntry (
|
||||
// EFI drivers that are on PCI and other plug in cards.
|
||||
//
|
||||
gNvmExpressDriverSupportedEfiVersion.FirmwareVersion = 0x00020028;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEfiDriverSupportedEfiVersionProtocolGuid,
|
||||
&gNvmExpressDriverSupportedEfiVersion,
|
||||
NULL
|
||||
);
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&ImageHandle,
|
||||
&gEfiDriverSupportedEfiVersionProtocolGuid,
|
||||
&gNvmExpressDriverSupportedEfiVersion,
|
||||
NULL
|
||||
);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
return Status;
|
||||
}
|
||||
|
@ -41,8 +41,8 @@
|
||||
#include <Library/UefiDriverEntryPoint.h>
|
||||
#include <Library/ReportStatusCodeLib.h>
|
||||
|
||||
typedef struct _NVME_CONTROLLER_PRIVATE_DATA NVME_CONTROLLER_PRIVATE_DATA;
|
||||
typedef struct _NVME_DEVICE_PRIVATE_DATA NVME_DEVICE_PRIVATE_DATA;
|
||||
typedef struct _NVME_CONTROLLER_PRIVATE_DATA NVME_CONTROLLER_PRIVATE_DATA;
|
||||
typedef struct _NVME_DEVICE_PRIVATE_DATA NVME_DEVICE_PRIVATE_DATA;
|
||||
|
||||
#include "NvmExpressBlockIo.h"
|
||||
#include "NvmExpressDiskInfo.h"
|
||||
@ -53,67 +53,67 @@ extern EFI_COMPONENT_NAME_PROTOCOL gNvmExpressComponentName;
|
||||
extern EFI_COMPONENT_NAME2_PROTOCOL gNvmExpressComponentName2;
|
||||
extern EFI_DRIVER_SUPPORTED_EFI_VERSION_PROTOCOL gNvmExpressDriverSupportedEfiVersion;
|
||||
|
||||
#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_CLASS_MASS_STORAGE_NVM 0x08 // mass storage sub-class non-volatile memory.
|
||||
#define PCI_IF_NVMHCI 0x02 // mass storage programming interface NVMHCI.
|
||||
|
||||
#define NVME_ASQ_SIZE 1 // Number of admin submission queue entries, which is 0-based
|
||||
#define NVME_ACQ_SIZE 1 // Number of admin completion queue entries, which is 0-based
|
||||
#define NVME_ASQ_SIZE 1 // Number of admin submission queue entries, which is 0-based
|
||||
#define NVME_ACQ_SIZE 1 // Number of admin completion queue entries, which is 0-based
|
||||
|
||||
#define NVME_CSQ_SIZE 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_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
|
||||
|
||||
//
|
||||
// Number of asynchronous I/O submission queue entries, which is 0-based.
|
||||
// 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.
|
||||
// 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
|
||||
//
|
||||
#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.
|
||||
//
|
||||
#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.
|
||||
//
|
||||
#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.
|
||||
//
|
||||
struct _NVME_CONTROLLER_PRIVATE_DATA {
|
||||
UINT32 Signature;
|
||||
UINT32 Signature;
|
||||
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_HANDLE ImageHandle;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
EFI_HANDLE ControllerHandle;
|
||||
EFI_HANDLE ImageHandle;
|
||||
EFI_HANDLE DriverBindingHandle;
|
||||
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT64 PciAttributes;
|
||||
EFI_PCI_IO_PROTOCOL *PciIo;
|
||||
UINT64 PciAttributes;
|
||||
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
EFI_DEVICE_PATH_PROTOCOL *ParentDevicePath;
|
||||
|
||||
EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL Passthru;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_MODE PassThruMode;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL Passthru;
|
||||
|
||||
//
|
||||
// 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.
|
||||
@ -124,45 +124,45 @@ struct _NVME_CONTROLLER_PRIVATE_DATA {
|
||||
// 5th 4kB boundary is the start of I/O submission queue #2.
|
||||
// 6th 4kB boundary is the start of I/O completion queue #2.
|
||||
//
|
||||
UINT8 *Buffer;
|
||||
UINT8 *BufferPciAddr;
|
||||
UINT8 *Buffer;
|
||||
UINT8 *BufferPciAddr;
|
||||
|
||||
//
|
||||
// Pointers to 4kB aligned submission & completion queues.
|
||||
//
|
||||
NVME_SQ *SqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_SQ *SqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
NVME_SQ *SqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBuffer[NVME_MAX_QUEUES];
|
||||
NVME_SQ *SqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
NVME_CQ *CqBufferPciAddr[NVME_MAX_QUEUES];
|
||||
|
||||
//
|
||||
// Submission and completion queue indices.
|
||||
//
|
||||
NVME_SQTDBL SqTdbl[NVME_MAX_QUEUES];
|
||||
NVME_CQHDBL CqHdbl[NVME_MAX_QUEUES];
|
||||
UINT16 AsyncSqHead;
|
||||
NVME_SQTDBL SqTdbl[NVME_MAX_QUEUES];
|
||||
NVME_CQHDBL CqHdbl[NVME_MAX_QUEUES];
|
||||
UINT16 AsyncSqHead;
|
||||
|
||||
//
|
||||
// Flag to indicate internal IO queue creation.
|
||||
//
|
||||
BOOLEAN CreateIoQueue;
|
||||
BOOLEAN CreateIoQueue;
|
||||
|
||||
UINT8 Pt[NVME_MAX_QUEUES];
|
||||
UINT16 Cid[NVME_MAX_QUEUES];
|
||||
UINT8 Pt[NVME_MAX_QUEUES];
|
||||
UINT16 Cid[NVME_MAX_QUEUES];
|
||||
|
||||
//
|
||||
// Nvme controller capabilities
|
||||
//
|
||||
NVME_CAP Cap;
|
||||
NVME_CAP Cap;
|
||||
|
||||
VOID *Mapping;
|
||||
VOID *Mapping;
|
||||
|
||||
//
|
||||
// For Non-blocking operations.
|
||||
//
|
||||
EFI_EVENT TimerEvent;
|
||||
LIST_ENTRY AsyncPassThruQueue;
|
||||
LIST_ENTRY UnsubmittedSubtasks;
|
||||
EFI_EVENT TimerEvent;
|
||||
LIST_ENTRY AsyncPassThruQueue;
|
||||
LIST_ENTRY UnsubmittedSubtasks;
|
||||
};
|
||||
|
||||
#define NVME_CONTROLLER_PRIVATE_DATA_FROM_PASS_THRU(a) \
|
||||
@ -175,7 +175,7 @@ struct _NVME_CONTROLLER_PRIVATE_DATA {
|
||||
//
|
||||
// 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
|
||||
@ -208,7 +208,6 @@ struct _NVME_DEVICE_PRIVATE_DATA {
|
||||
NVME_ADMIN_NAMESPACE_DATA NamespaceData;
|
||||
|
||||
NVME_CONTROLLER_PRIVATE_DATA *Controller;
|
||||
|
||||
};
|
||||
|
||||
//
|
||||
@ -235,7 +234,7 @@ struct _NVME_DEVICE_PRIVATE_DATA {
|
||||
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, \
|
||||
NVME_DEVICE_PRIVATE_DATA, \
|
||||
StorageSecurity, \
|
||||
@ -245,38 +244,38 @@ struct _NVME_DEVICE_PRIVATE_DATA {
|
||||
//
|
||||
// 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 {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
UINTN UnsubmittedSubtaskNum;
|
||||
BOOLEAN LastSubtaskSubmitted;
|
||||
EFI_BLOCK_IO2_TOKEN *Token;
|
||||
UINTN UnsubmittedSubtaskNum;
|
||||
BOOLEAN LastSubtaskSubmitted;
|
||||
//
|
||||
// The queue for Nvme read/write sub-tasks of a BlockIo2 request.
|
||||
//
|
||||
LIST_ENTRY SubtasksQueue;
|
||||
LIST_ENTRY SubtasksQueue;
|
||||
} NVME_BLKIO2_REQUEST;
|
||||
|
||||
#define NVME_BLKIO2_REQUEST_FROM_LINK(a) \
|
||||
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 {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
BOOLEAN IsLast;
|
||||
UINT32 NamespaceId;
|
||||
EFI_EVENT Event;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *CommandPacket;
|
||||
BOOLEAN IsLast;
|
||||
UINT32 NamespaceId;
|
||||
EFI_EVENT Event;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *CommandPacket;
|
||||
//
|
||||
// The BlockIo2 request this subtask belongs to
|
||||
//
|
||||
NVME_BLKIO2_REQUEST *BlockIo2Request;
|
||||
NVME_BLKIO2_REQUEST *BlockIo2Request;
|
||||
} NVME_BLKIO2_SUBTASK;
|
||||
|
||||
#define NVME_BLKIO2_SUBTASK_FROM_LINK(a) \
|
||||
@ -285,20 +284,20 @@ typedef struct {
|
||||
//
|
||||
// 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 {
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
UINT32 Signature;
|
||||
LIST_ENTRY Link;
|
||||
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
UINT16 CommandId;
|
||||
VOID *MapPrpList;
|
||||
UINTN PrpListNo;
|
||||
VOID *PrpListHost;
|
||||
VOID *MapData;
|
||||
VOID *MapMeta;
|
||||
EFI_EVENT CallerEvent;
|
||||
EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet;
|
||||
UINT16 CommandId;
|
||||
VOID *MapPrpList;
|
||||
UINTN PrpListNo;
|
||||
VOID *PrpListHost;
|
||||
VOID *MapData;
|
||||
VOID *MapMeta;
|
||||
EFI_EVENT CallerEvent;
|
||||
} NVME_PASS_THRU_ASYNC_REQ;
|
||||
|
||||
#define NVME_PASS_THRU_ASYNC_REQ_FROM_THIS(a) \
|
||||
@ -426,11 +425,11 @@ NvmExpressComponentNameGetDriverName (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressComponentNameGetControllerName (
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
IN EFI_COMPONENT_NAME_PROTOCOL *This,
|
||||
IN EFI_HANDLE ControllerHandle,
|
||||
IN EFI_HANDLE ChildHandle OPTIONAL,
|
||||
IN CHAR8 *Language,
|
||||
OUT CHAR16 **ControllerName
|
||||
);
|
||||
|
||||
/**
|
||||
@ -555,10 +554,10 @@ NvmExpressDriverBindingStart (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDriverBindingStop (
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
IN EFI_DRIVER_BINDING_PROTOCOL *This,
|
||||
IN EFI_HANDLE Controller,
|
||||
IN UINTN NumberOfChildren,
|
||||
IN EFI_HANDLE *ChildHandleBuffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -594,10 +593,10 @@ NvmExpressDriverBindingStop (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressPassThru (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_NVM_EXPRESS_PASS_THRU_COMMAND_PACKET *Packet,
|
||||
IN EFI_EVENT Event OPTIONAL
|
||||
);
|
||||
|
||||
/**
|
||||
@ -636,8 +635,8 @@ NvmExpressPassThru (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressGetNextNamespace (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT32 *NamespaceId
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN OUT UINT32 *NamespaceId
|
||||
);
|
||||
|
||||
/**
|
||||
@ -667,9 +666,9 @@ NvmExpressGetNextNamespace (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressGetNamespace (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT32 *NamespaceId
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
OUT UINT32 *NamespaceId
|
||||
);
|
||||
|
||||
/**
|
||||
@ -706,9 +705,9 @@ NvmExpressGetNamespace (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressBuildDevicePath (
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
IN EFI_NVM_EXPRESS_PASS_THRU_PROTOCOL *This,
|
||||
IN UINT32 NamespaceId,
|
||||
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
@ -719,7 +718,7 @@ NvmExpressBuildDevicePath (
|
||||
**/
|
||||
VOID
|
||||
NvmeDumpStatus (
|
||||
IN NVME_CQ *Cq
|
||||
IN NVME_CQ *Cq
|
||||
);
|
||||
|
||||
/**
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -23,8 +23,8 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoReset (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN BOOLEAN ExtendedVerification
|
||||
);
|
||||
|
||||
/**
|
||||
@ -49,11 +49,11 @@ NvmeBlockIoReset (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoReadBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -79,11 +79,11 @@ NvmeBlockIoReadBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoWriteBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -99,7 +99,7 @@ NvmeBlockIoWriteBlocks (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoFlushBlocks (
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
IN EFI_BLOCK_IO_PROTOCOL *This
|
||||
);
|
||||
|
||||
/**
|
||||
@ -162,12 +162,12 @@ NvmeBlockIoResetEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoReadBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
OUT VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -212,11 +212,11 @@ EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoWriteBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
IN UINT32 MediaId,
|
||||
IN EFI_LBA Lba,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token,
|
||||
IN UINTN BufferSize,
|
||||
IN VOID *Buffer
|
||||
);
|
||||
|
||||
/**
|
||||
@ -246,8 +246,8 @@ NvmeBlockIoWriteBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeBlockIoFlushBlocksEx (
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
IN EFI_BLOCK_IO2_PROTOCOL *This,
|
||||
IN OUT EFI_BLOCK_IO2_TOKEN *Token
|
||||
);
|
||||
|
||||
/**
|
||||
@ -325,14 +325,14 @@ NvmeBlockIoFlushBlocksEx (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeStorageSecurityReceiveData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
OUT VOID *PayloadBuffer,
|
||||
OUT UINTN *PayloadTransferSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -399,13 +399,13 @@ NvmeStorageSecurityReceiveData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmeStorageSecuritySendData (
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
IN EFI_STORAGE_SECURITY_COMMAND_PROTOCOL *This,
|
||||
IN UINT32 MediaId,
|
||||
IN UINT64 Timeout,
|
||||
IN UINT8 SecurityProtocolId,
|
||||
IN UINT16 SecurityProtocolSpecificData,
|
||||
IN UINTN PayloadBufferSize,
|
||||
IN VOID *PayloadBuffer
|
||||
);
|
||||
|
||||
#endif
|
||||
|
@ -8,7 +8,7 @@
|
||||
|
||||
#include "NvmExpress.h"
|
||||
|
||||
EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
|
||||
EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
|
||||
EFI_DISK_INFO_NVME_INTERFACE_GUID,
|
||||
NvmExpressDiskInfoInquiry,
|
||||
NvmExpressDiskInfoIdentify,
|
||||
@ -27,13 +27,12 @@ EFI_DISK_INFO_PROTOCOL gNvmExpressDiskInfoProtocolTemplate = {
|
||||
**/
|
||||
VOID
|
||||
InitializeDiskInfo (
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
)
|
||||
{
|
||||
CopyMem (&Device->DiskInfo, &gNvmExpressDiskInfoProtocolTemplate, sizeof (EFI_DISK_INFO_PROTOCOL));
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Provides inquiry information for the controller type.
|
||||
|
||||
@ -53,15 +52,14 @@ InitializeDiskInfo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoInquiry (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
Provides identify information for the controller type.
|
||||
|
||||
@ -83,13 +81,13 @@ NvmExpressDiskInfoInquiry (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoIdentify (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
EFI_STATUS Status;
|
||||
NVME_DEVICE_PRIVATE_DATA *Device;
|
||||
|
||||
Device = NVME_DEVICE_PRIVATE_DATA_FROM_DISK_INFO (This);
|
||||
|
||||
@ -98,6 +96,7 @@ NvmExpressDiskInfoIdentify (
|
||||
Status = EFI_SUCCESS;
|
||||
CopyMem (IdentifyData, &Device->NamespaceData, sizeof (Device->NamespaceData));
|
||||
}
|
||||
|
||||
*IdentifyDataSize = sizeof (Device->NamespaceData);
|
||||
return Status;
|
||||
}
|
||||
@ -122,16 +121,15 @@ NvmExpressDiskInfoIdentify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoSenseData (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
)
|
||||
{
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
This function is used to get controller information.
|
||||
|
||||
@ -146,11 +144,10 @@ NvmExpressDiskInfoSenseData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoWhichIde (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
|
@ -20,10 +20,9 @@ SPDX-License-Identifier: BSD-2-Clause-Patent
|
||||
**/
|
||||
VOID
|
||||
InitializeDiskInfo (
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
IN NVME_DEVICE_PRIVATE_DATA *Device
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
Provides inquiry information for the controller type.
|
||||
|
||||
@ -43,9 +42,9 @@ InitializeDiskInfo (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoInquiry (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *InquiryData,
|
||||
IN OUT UINT32 *InquiryDataSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -69,9 +68,9 @@ NvmExpressDiskInfoInquiry (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoIdentify (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *IdentifyData,
|
||||
IN OUT UINT32 *IdentifyDataSize
|
||||
);
|
||||
|
||||
/**
|
||||
@ -94,13 +93,12 @@ NvmExpressDiskInfoIdentify (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoSenseData (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
IN OUT VOID *SenseData,
|
||||
IN OUT UINT32 *SenseDataSize,
|
||||
OUT UINT8 *SenseDataNumber
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
This function is used to get controller information.
|
||||
|
||||
@ -115,9 +113,9 @@ NvmExpressDiskInfoSenseData (
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
NvmExpressDiskInfoWhichIde (
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
IN EFI_DISK_INFO_PROTOCOL *This,
|
||||
OUT UINT32 *IdeChannel,
|
||||
OUT UINT32 *IdeDevice
|
||||
);
|
||||
|
||||
#endif
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user