11#include <Uefi/UefiBaseType.h>
16#include <Library/BaseLib.h>
17#include <Library/BaseOverflowLib.h>
18#include <Library/DebugLib.h>
19#include <Library/MemoryAllocationLib.h>
20#include <Library/MtrrLib.h>
23#include <Library/PrintLib.h>
24#include <Library/UefiBootServicesTableLib.h>
26#define PAT_INDEX_TO_CHANGE 7
30 IN EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode,
31 OUT UINTN *BytesPerPixel
37 || (Mode->Info == NULL))
41 && (Mode->Info != NULL)
43 return EFI_UNSUPPORTED;
50 if (Mode->FrameBufferBase == 0ULL) {
51 return EFI_UNSUPPORTED;
54 switch (Mode->Info->PixelFormat) {
55 case PixelRedGreenBlueReserved8BitPerColor:
56 case PixelBlueGreenRedReserved8BitPerColor:
57 *BytesPerPixel =
sizeof (EFI_GRAPHICS_OUTPUT_BLT_PIXEL);
64 return EFI_UNSUPPORTED;
67 return EFI_INVALID_PARAMETER;
70 MergedMasks = Mode->Info->PixelInformation.RedMask
71 || Mode->Info->PixelInformation.GreenMask
72 || Mode->Info->PixelInformation.BlueMask
73 || Mode->Info->PixelInformation.ReservedMask;
75 if (MergedMasks == 0) {
76 return EFI_INVALID_PARAMETER;
79 *BytesPerPixel = (UINT32)((HighBitSet32 (MergedMasks) + 7) / 8);
86 IN EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode,
87 OUT UINTN *FrameBufferSize
94 || (Mode->Info == NULL))
98 && (Mode->Info != NULL)
100 return EFI_UNSUPPORTED;
105 if (EFI_ERROR (Status)) {
109 if (BaseOverflowTriMulUN (
110 Mode->Info->PixelsPerScanLine,
111 Mode->Info->VerticalResolution,
116 return EFI_INVALID_PARAMETER;
129 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop,
134 MTRR_MEMORY_CACHE_TYPE MtrrCacheType;
136 EFI_VIRTUAL_ADDRESS VirtualAddress;
137 EFI_PHYSICAL_ADDRESS PhysicalAddress;
138 UINTN FrameBufferSize;
144 UINT64 ModifiedPatMsr;
146 BOOLEAN HasDefaultPat;
154 || (Gop->Mode == NULL)
155 || (Gop->Mode->Info == NULL))
159 && (Gop->Mode != NULL)
160 && (Gop->Mode->Info != NULL)
162 return EFI_UNSUPPORTED;
166 if (EFI_ERROR (Status)) {
170 HasMtrr = IsMtrrSupported ();
175 "OCC: MTRR %asupported, PAT %asupported\n",
176 HasMtrr ?
"" :
"not ",
180 if (!HasMtrr || !HasPat) {
181 return EFI_UNSUPPORTED;
193 "OCC: PAT 0x%016LX (%a)\n",
195 HasDefaultPat ?
"default" :
"not default"
198 MtrrCacheType = MtrrGetMemoryAttribute (Gop->Mode->FrameBufferBase);
200 VirtualAddress = Gop->Mode->FrameBufferBase;
214 "OCC: 0x%LX MTRR %u=%a PTE%u bits 0x%016LX PAT@%u->%u=%a - %r\n",
226 if (EFI_ERROR (Status)) {
231 ASSERT (VirtualAddress == PhysicalAddress);
243 if ( (MtrrCacheType == CacheWriteCombining)
247 return EFI_ALREADY_STARTED;
262 DEBUG ((DEBUG_INFO,
"OCC: Writing PAT 0x%016LX\n", ModifiedPatMsr));
278 Status = EFI_UNSUPPORTED;
279 DEBUG ((DEBUG_INFO,
"OCC: Non-default PAT MSR with no WC entry - %r\n", Status));
289 Gop->Mode->FrameBufferBase,
294 if (EFI_ERROR (Status)) {
295 DEBUG ((DEBUG_ERROR,
"OCC: Failed to set PAT index for range - %r\n", Status));
302 }
while (AlreadySet);
313 EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop;
315 Status =
gBS->HandleProtocol (
316 gST->ConsoleOutHandle,
321 if (EFI_ERROR (Status)) {
322 DEBUG ((DEBUG_INFO,
"OCC: No console GOP found for burst mode - %r\n", Status));
327 if (EFI_ERROR (Status)) {
329 (Status == EFI_ALREADY_STARTED) ? DEBUG_INFO : DEBUG_WARN,
330 "OCC: Failed to set burst mode - %r\n",
EFI_STATUS OcSetGopBurstMode(VOID)
EFI_STATUS OcGopModeBytesPerPixel(IN EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode, OUT UINTN *BytesPerPixel)
EFI_STATUS OcGopModeSafeFrameBufferSize(IN EFI_GRAPHICS_OUTPUT_PROTOCOL_MODE *Mode, OUT UINTN *FrameBufferSize)
#define PAT_INDEX_TO_CHANGE
STATIC EFI_STATUS WriteCombineGop(EFI_GRAPHICS_OUTPUT_PROTOCOL *Gop, BOOLEAN SetPatWC)
PAGE_MAP_AND_DIRECTORY_POINTER * OcGetCurrentPageTable(OUT UINTN *Flags OPTIONAL)
EFI_STATUS OcSetPatIndexForAddressRange(IN PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, IN UINT64 Length, IN PAT_INDEX *PatIndex)
BOOLEAN OcIsPatSupported(VOID)
CHAR8 * OcGetPatTypeString(UINT8 PatType)
EFI_STATUS OcGetSetPageTableInfoForAddress(IN PAGE_MAP_AND_DIRECTORY_POINTER *PageTable OPTIONAL, IN EFI_VIRTUAL_ADDRESS VirtualAddr, OUT EFI_PHYSICAL_ADDRESS *PhysicalAddr OPTIONAL, OUT UINT8 *Level OPTIONAL, OUT UINT64 *Bits OPTIONAL, IN OUT PAT_INDEX *PatIndex OPTIONAL, IN BOOLEAN SetPat)
CHAR8 * OcGetMtrrTypeString(UINT8 MtrrType)
#define GET_PAT_N(PatMsr, PatIndex)
@ PatWriteCombining
Special hardware burst mode (not L1-L3) intended for graphics memory (ref. 11.3.1).
#define MODIFY_PAT_MSR(PatMsr, PatIndex, PatType)
EFI_GUID gEfiGraphicsOutputProtocolGuid
UINT64 EFIAPI AsmReadMsr64(IN UINT32 Index)
UINT64 EFIAPI AsmWriteMsr64(IN UINT32 Index, IN UINT64 Value)