Provide only necessary framebuffer information to the kernel
All checks were successful
Builds / ExectOS (amd64) (push) Successful in 33s
Builds / ExectOS (i686) (push) Successful in 32s

This commit is contained in:
Rafal Kupiec 2024-03-15 16:46:53 +01:00
parent 945b323606
commit 41ebabcb09
Signed by: belliash
GPG Key ID: 4E829243E0CFE6B4
6 changed files with 70 additions and 58 deletions

View File

@ -121,7 +121,7 @@ typedef EFI_STATUS (*PBL_EXECIMAGE_RELOCATE_IMAGE)(IN PVOID ImagePointer, IN EFI
typedef EFI_STATUS (*PBL_EXECIMAGE_UNLOAD_IMAGE)(IN PVOID ImagePointer);
typedef EFI_STATUS (*PBL_EXECIMAGE_VERIFY_IMAGE)(IN PVOID ImagePointer);
typedef EFI_STATUS (*PBL_FRAMEBUFFER_GET_DISPLAY_DRIVER)(OUT PEFI_GRAPHICS_PROTOCOL Protocol);
typedef EFI_STATUS (*PBL_FRAMEBUFFER_GET_DISPLAY_INFORMATION)(OUT PXTBL_FRAMEBUFFER_INFORMATION FbInfo);
typedef EFI_STATUS (*PBL_FRAMEBUFFER_GET_DISPLAY_INFORMATION)(OUT PEFI_PHYSICAL_ADDRESS FrameBufferBase, OUT PULONG_PTR FrameBufferSize, OUT PXTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo);
typedef EFI_STATUS (*PBL_FRAMEBUFFER_INITIALIZE)();
typedef EFI_STATUS (*PBL_FRAMEBUFFER_SET_SCREEN_RESOLUTION)(IN UINT Width, IN UINT Height);
@ -246,20 +246,8 @@ typedef struct _XTBL_STATUS
CPPORT SerialPort;
} XTBL_STATUS, *PXTBL_STATUS;
/* XT framebuffer information structure definition */
typedef struct _XTBL_FRAMEBUFFER_INFORMATION
{
BOOLEAN Initialized;
EFI_GRAPHICS_PROTOCOL Protocol;
EFI_PHYSICAL_ADDRESS FrameBufferBase;
ULONG_PTR FrameBufferSize;
UINT DefaultMode;
union
{
PEFI_GRAPHICS_OUTPUT_PROTOCOL Gop;
PEFI_UNIVERSAL_GRAPHICS_ADAPTER_PROTOCOL Uga;
} Driver;
struct
/* XT framebuffer video mode information structure definition */
typedef struct _XTBL_FRAMEBUFFER_MODE_INFORMATION
{
UINT Width;
UINT Height;
@ -281,7 +269,22 @@ typedef struct _XTBL_FRAMEBUFFER_INFORMATION
USHORT ReservedMask;
USHORT ReservedShift;
} PixelInformation;
} ModeInfo;
} XTBL_FRAMEBUFFER_MODE_INFORMATION, *PXTBL_FRAMEBUFFER_MODE_INFORMATION;
/* XT framebuffer information structure definition */
typedef struct _XTBL_FRAMEBUFFER_INFORMATION
{
BOOLEAN Initialized;
EFI_GRAPHICS_PROTOCOL Protocol;
EFI_PHYSICAL_ADDRESS FrameBufferBase;
ULONG_PTR FrameBufferSize;
UINT DefaultMode;
union
{
PEFI_GRAPHICS_OUTPUT_PROTOCOL Gop;
PEFI_UNIVERSAL_GRAPHICS_ADAPTER_PROTOCOL Uga;
} Driver;
XTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo;
} XTBL_FRAMEBUFFER_INFORMATION, *PXTBL_FRAMEBUFFER_INFORMATION;
/* XTLDR ACPI protocol structure */

View File

@ -94,7 +94,6 @@ typedef struct _FIRMWARE_INFORMATION_BLOCK
typedef struct _LOADER_GRAPHICS_INFORMATION_BLOCK
{
BOOLEAN Initialized;
EFI_GRAPHICS_PROTOCOL Protocol;
PVOID Address;
ULONG_PTR BufferSize;
UINT Width;

View File

@ -289,6 +289,7 @@ typedef struct _XTBL_CONFIG_SECTION XTBL_CONFIG_SECTION, *PXTBL_CONFIG_SECTION;
typedef struct _XTBL_DIALOG_HANDLE XTBL_DIALOG_HANDLE, *PXTBL_DIALOG_HANDLE;
typedef struct _XTBL_EXECUTABLE_IMAGE_PROTOCOL XTBL_EXECUTABLE_IMAGE_PROTOCOL, *PXTBL_EXECUTABLE_IMAGE_PROTOCOL;
typedef struct _XTBL_FRAMEBUFFER_INFORMATION XTBL_FRAMEBUFFER_INFORMATION, *PXTBL_FRAMEBUFFER_INFORMATION;
typedef struct _XTBL_FRAMEBUFFER_MODE_INFORMATION XTBL_FRAMEBUFFER_MODE_INFORMATION, *PXTBL_FRAMEBUFFER_MODE_INFORMATION;
typedef struct _XTBL_FRAMEBUFFER_PROTOCOL XTBL_FRAMEBUFFER_PROTOCOL, *PXTBL_FRAMEBUFFER_PROTOCOL;
typedef struct _XTBL_KNOWN_BOOT_PROTOCOL XTBL_KNOWN_BOOT_PROTOCOL, *PXTBL_KNOWN_BOOT_PROTOCOL;
typedef struct _XTBL_LOADER_PROTOCOL XTBL_LOADER_PROTOCOL, *PXTBL_LOADER_PROTOCOL;

View File

@ -55,7 +55,9 @@ FbGetDisplayDriver(OUT PEFI_GRAPHICS_PROTOCOL Protocol)
*/
XTCDECL
EFI_STATUS
FbGetDisplayInformation(OUT PXTBL_FRAMEBUFFER_INFORMATION FbInfo)
FbGetDisplayInformation(OUT PEFI_PHYSICAL_ADDRESS FrameBufferBase,
OUT PULONG_PTR FrameBufferSize,
OUT PXTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo)
{
/* Check if framebuffer is initialized */
if(!FbpDisplayInfo.Initialized)
@ -64,19 +66,21 @@ FbGetDisplayInformation(OUT PXTBL_FRAMEBUFFER_INFORMATION FbInfo)
return STATUS_EFI_NOT_READY;
}
/* Copy framebuffer information */
FbInfo->ModeInfo.BitsPerPixel = FbpDisplayInfo.ModeInfo.BitsPerPixel;
FbInfo->ModeInfo.BytesPerPixel = FbpDisplayInfo.ModeInfo.BytesPerPixel;
FbInfo->ModeInfo.PixelFormat = FbpDisplayInfo.ModeInfo.PixelFormat;
FbInfo->ModeInfo.PixelInformation = FbpDisplayInfo.ModeInfo.PixelInformation;
FbInfo->ModeInfo.PixelsPerScanLine = FbpDisplayInfo.ModeInfo.PixelsPerScanLine;
FbInfo->ModeInfo.Width = FbpDisplayInfo.ModeInfo.Width;
FbInfo->ModeInfo.Height = FbpDisplayInfo.ModeInfo.Height;
FbInfo->ModeInfo.Pitch = FbpDisplayInfo.ModeInfo.Pitch;
FbInfo->FrameBufferBase = FbpDisplayInfo.FrameBufferBase;
FbInfo->FrameBufferSize = FbpDisplayInfo.FrameBufferSize;
FbInfo->Protocol = FbpDisplayInfo.Protocol;
FbInfo->Initialized = FbpDisplayInfo.Initialized;
/* Set basic framebuffer information */
*FrameBufferBase = FbpDisplayInfo.FrameBufferBase;
*FrameBufferSize = FbpDisplayInfo.FrameBufferSize;
/* Set framebuffer mode information */
ModeInfo->Width = FbpDisplayInfo.ModeInfo.Width;
ModeInfo->Height = FbpDisplayInfo.ModeInfo.Height;
ModeInfo->Depth = FbpDisplayInfo.ModeInfo.Depth;
ModeInfo->RefreshRate = FbpDisplayInfo.ModeInfo.RefreshRate;
ModeInfo->BitsPerPixel = FbpDisplayInfo.ModeInfo.BitsPerPixel;
ModeInfo->BytesPerPixel = FbpDisplayInfo.ModeInfo.BytesPerPixel;
ModeInfo->PixelsPerScanLine = FbpDisplayInfo.ModeInfo.PixelsPerScanLine;
ModeInfo->Pitch = FbpDisplayInfo.ModeInfo.Pitch;
ModeInfo->PixelFormat = FbpDisplayInfo.ModeInfo.PixelFormat;
ModeInfo->PixelInformation = FbpDisplayInfo.ModeInfo.PixelInformation;
/* Return success */
return STATUS_EFI_SUCCESS;

View File

@ -20,7 +20,9 @@ FbGetDisplayDriver(OUT PEFI_GRAPHICS_PROTOCOL Protocol);
XTCDECL
EFI_STATUS
FbGetDisplayInformation(OUT PXTBL_FRAMEBUFFER_INFORMATION FbInfo);
FbGetDisplayInformation(OUT PEFI_PHYSICAL_ADDRESS FrameBufferBase,
OUT PULONG_PTR FrameBufferSize,
OUT PXTBL_FRAMEBUFFER_MODE_INFORMATION ModeInfo);
XTCDECL
EFI_STATUS

View File

@ -38,17 +38,18 @@ XTBL_BOOT_PROTOCOL XtBootProtocol;
XTCDECL
VOID
XtGetDisplayInformation(OUT PLOADER_GRAPHICS_INFORMATION_BLOCK InformationBlock,
IN PXTBL_FRAMEBUFFER_INFORMATION FrameBufferInfo)
IN PEFI_PHYSICAL_ADDRESS FrameBufferBase,
IN PULONG_PTR FrameBufferSize,
IN PXTBL_FRAMEBUFFER_MODE_INFORMATION FrameBufferModeInfo)
{
InformationBlock->Initialized = FrameBufferInfo->Initialized;
InformationBlock->Protocol = FrameBufferInfo->Protocol;
InformationBlock->Address = (PVOID)FrameBufferInfo->FrameBufferBase;
InformationBlock->BufferSize = FrameBufferInfo->FrameBufferSize;
InformationBlock->Width = FrameBufferInfo->ModeInfo.Width;
InformationBlock->Height = FrameBufferInfo->ModeInfo.Height;
InformationBlock->BitsPerPixel = FrameBufferInfo->ModeInfo.BitsPerPixel;
InformationBlock->PixelsPerScanLine = FrameBufferInfo->ModeInfo.PixelsPerScanLine;
InformationBlock->Pitch = FrameBufferInfo->ModeInfo.Pitch;
InformationBlock->Initialized = TRUE;
InformationBlock->Address = (PVOID)*FrameBufferBase;
InformationBlock->BufferSize = *FrameBufferSize;
InformationBlock->Width = FrameBufferModeInfo->Width;
InformationBlock->Height = FrameBufferModeInfo->Height;
InformationBlock->BitsPerPixel = FrameBufferModeInfo->BitsPerPixel;
InformationBlock->PixelsPerScanLine = FrameBufferModeInfo->PixelsPerScanLine;
InformationBlock->Pitch = FrameBufferModeInfo->Pitch;
}
XTCDECL
@ -417,10 +418,11 @@ XtpInitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
{
EFI_GUID FrameBufGuid = XT_FRAMEBUFFER_PROTOCOL_GUID;
PXTBL_FRAMEBUFFER_PROTOCOL FrameBufProtocol;
PXTBL_FRAMEBUFFER_INFORMATION FrameBufInfo = NULL;
XTBL_FRAMEBUFFER_MODE_INFORMATION FbModeInfo;
PKERNEL_INITIALIZATION_BLOCK LoaderBlock;
EFI_PHYSICAL_ADDRESS Address;
EFI_PHYSICAL_ADDRESS Address, FbAddress;
// PVOID RuntimeServices;
ULONG_PTR FbSize;
EFI_STATUS Status;
EFI_HANDLE ProtocolHandle;
UINT BlockPages, FrameBufferPages;
@ -453,16 +455,17 @@ XtpInitializeLoaderBlock(IN PXTBL_PAGE_MAPPING PageMap,
if(Status == STATUS_EFI_SUCCESS)
{
/* Get FrameBuffer information */
FrameBufProtocol->GetDisplayInformation(FrameBufInfo);
Status = FrameBufProtocol->GetDisplayInformation(&FbAddress, &FbSize, &FbModeInfo);
if(Status == STATUS_EFI_SUCCESS)
{
/* Store information about FrameBuffer device */
XtGetDisplayInformation(&LoaderBlock->LoaderInformation.FrameBuffer, FrameBufInfo);
XtGetDisplayInformation(&LoaderBlock->LoaderInformation.FrameBuffer, &FbAddress, &FbSize, &FbModeInfo);
}
else
}
if(Status != STATUS_EFI_SUCCESS)
{
/* No FrameBuffer available */
LoaderBlock->LoaderInformation.FrameBuffer.Initialized = FALSE;
LoaderBlock->LoaderInformation.FrameBuffer.Protocol = NONE;
}
/* Close FrameBuffer protocol */