#define VGPU_GOP_FROM_GOP(GopPointer) \\r
CR (GopPointer, VGPU_GOP, Gop, VGPU_GOP_SIG)\r
\r
+STATIC\r
+VOID\r
+EFIAPI\r
+GopInitialize (\r
+ IN EFI_GRAPHICS_OUTPUT_PROTOCOL *This\r
+ )\r
+{\r
+ VGPU_GOP *VgpuGop;\r
+\r
+ VgpuGop = VGPU_GOP_FROM_GOP (This);\r
+\r
+ //\r
+ // Set up the Gop -> GopMode -> GopModeInfo pointer chain, and the other\r
+ // (nonzero) constant fields.\r
+ //\r
+ // No direct framebuffer access is supported, only Blt() is.\r
+ //\r
+ VgpuGop->Gop.Mode = &VgpuGop->GopMode;\r
+\r
+ VgpuGop->GopMode.MaxMode = (UINT32)(ARRAY_SIZE (mGopResolutions));\r
+ VgpuGop->GopMode.Info = &VgpuGop->GopModeInfo;\r
+ VgpuGop->GopMode.SizeOfInfo = sizeof VgpuGop->GopModeInfo;\r
+\r
+ VgpuGop->GopModeInfo.PixelFormat = PixelBltOnly;\r
+}\r
+\r
//\r
// EFI_GRAPHICS_OUTPUT_PROTOCOL member functions.\r
//\r
{\r
EFI_GRAPHICS_OUTPUT_MODE_INFORMATION *GopModeInfo;\r
\r
- if (ModeNumber >= ARRAY_SIZE (mGopResolutions)) {\r
+ if (ModeNumber >= This->Mode->MaxMode) {\r
return EFI_INVALID_PARAMETER;\r
}\r
\r
EFI_STATUS Status;\r
EFI_STATUS Status2;\r
\r
+ if (!This->Mode) {\r
+ // SetMode() call in InitVgpuGop() triggers this.\r
+ GopInitialize (This);\r
+ }\r
+\r
Status = GopQueryMode (This, ModeNumber, &SizeOfInfo, &GopModeInfo);\r
if (Status != EFI_SUCCESS) {\r
return Status;\r
// calls.\r
//\r
if (VgpuGop->ResourceId == 0) {\r
- //\r
- // Set up the Gop -> GopMode -> GopModeInfo pointer chain, and the other\r
- // (nonzero) constant fields.\r
- //\r
- // No direct framebuffer access is supported, only Blt() is.\r
- //\r
- VgpuGop->Gop.Mode = &VgpuGop->GopMode;\r
-\r
- VgpuGop->GopMode.MaxMode = (UINT32)(ARRAY_SIZE (mGopResolutions));\r
- VgpuGop->GopMode.Info = &VgpuGop->GopModeInfo;\r
- VgpuGop->GopMode.SizeOfInfo = sizeof VgpuGop->GopModeInfo;\r
-\r
- VgpuGop->GopModeInfo.PixelFormat = PixelBltOnly;\r
-\r
//\r
// This is the first time we create a host side resource.\r
//\r