VirtualBox

Changeset 100688 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Jul 25, 2023 7:08:45 AM (17 months ago)
Author:
vboxsync
Message:

Device/EFI/Firmware/VmwSvga3Dxe: Implement enough of the VMware SVGA 3 interface to get a screen output during the UEFI phase, bugref:10490

Location:
trunk/src/VBox/Devices/EFI/Firmware
Files:
1 added
5 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/EFI/Firmware/ArmVirtPkg/ArmVirtQemu.dsc

    r100680 r100688  
    462462!ifdef $(VBOX)
    463463  OvmfPkg/SataControllerDxe/SataControllerDxe.inf
    464   VBoxPkg/VmwSvga3Dxe/VmwSvga3VideoDxe.inf
     464  VBoxPkg/VmwSvga3Dxe/VmwSvga3VideoDxe.inf {
     465    <LibraryClasses>
     466      # Optimized SetMem doesn't work on VGA framebuffer.
     467      BaseMemoryLib|MdePkg/Library/BaseMemoryLib/BaseMemoryLib.inf
     468  }
    465469!endif
    466470
  • trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/VmwSvga3Dxe/Driver.c

    r100681 r100688  
    2121  NULL
    2222};
     23
    2324
    2425/**
     
    204205                             Private->PciIo,
    205206                             EfiPciIoAttributeOperationEnable,
    206                              EFI_PCI_DEVICE_ENABLE | EFI_PCI_IO_ATTRIBUTE_VGA_MEMORY,
     207                             (EFI_PCI_DEVICE_ENABLE |
     208                              EFI_PCI_IO_ATTRIBUTE_BUS_MASTER),
    207209                             NULL
    208210                             );
     
    211213  }
    212214
    213   /** @todo Set up device */
     215  //
     216  // Initialize the device.
     217  //
     218  Status = VmwSvga3DeviceInit(Private);
     219  if (EFI_ERROR (Status)) {
     220    goto RestoreAttributes;
     221  }
    214222
    215223  //
     
    254262  if (EFI_ERROR (Status)) {
    255263    goto FreeGopDevicePath;
    256   }
    257 
    258   //
    259   // Construct video mode buffer
    260   //
    261   /** @todo */
    262 
    263   if (EFI_ERROR (Status)) {
    264     goto UninstallGopDevicePath;
    265264  }
    266265
     
    424423
    425424  //
     425  // Teardown the device.
     426  //
     427  Status = VmwSvga3DeviceUninit (Private);
     428  if (EFI_ERROR (Status)) {
     429    return Status;
     430  }
     431
     432  //
    426433  // Restore original PCI attributes
    427434  //
  • trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/VmwSvga3Dxe/Gop.c

    r100681 r100688  
    6565  Info->PixelInformation.ReservedMask = 0;
    6666  Info->PixelsPerScanLine = Info->HorizontalResolution;
     67}
     68
     69STATIC
     70EFI_STATUS
     71VmwSvga3VideoUpdate (
     72  IN  VMWSVGA3_VIDEO_PRIVATE_DATA        *Private,
     73  IN  UINT32                             Width,
     74  IN  UINT32                             Height
     75  )
     76{
     77    VMWSVGA3_CTX_CMD_UPDATE *CmdUpdate   = (VMWSVGA3_CTX_CMD_UPDATE *)Private->CmdBuf;
     78
     79    CmdUpdate->CmdId     = VMWSVGA3_CMD_UPDATE;
     80    CmdUpdate->x         = 0;
     81    CmdUpdate->y         = 0;
     82    CmdUpdate->Width     = Width;
     83    CmdUpdate->Height    = Height;
     84
     85    return VmwSvga3CmdBufProcess(Private, sizeof(VMWSVGA3_CTX_CMD_UPDATE), VMWSVGA3_CB_CTX_0);
    6786}
    6887
     
    189208  }
    190209
    191   /** @todo */
    192 
    193210  This->Mode->Mode                       = ModeNumber;
    194211  This->Mode->Info->HorizontalResolution = mVmwSvga3ModeInfo[ModeNumber].HorizontalResolution;
     
    198215  VmwSvga3VideoCompleteModeData (Private, This->Mode);
    199216
     217  VmwSvga3WriteReg(Private, VMWSVGA3_REG_ENABLE,      0);
     218  VmwSvga3WriteReg(Private, VMWSVGA3_REG_CONFIG_DONE, 0);
     219
     220  VmwSvga3WriteReg(Private, VMWSVGA3_REG_WIDTH,          mVmwSvga3ModeInfo[ModeNumber].HorizontalResolution);
     221  VmwSvga3WriteReg(Private, VMWSVGA3_REG_HEIGHT,         mVmwSvga3ModeInfo[ModeNumber].VerticalResolution);
     222  VmwSvga3WriteReg(Private, VMWSVGA3_REG_BITS_PER_PIXEL, 32);
     223
     224  VmwSvga3WriteReg(Private, VMWSVGA3_REG_ENABLE,      1);
     225  VmwSvga3WriteReg(Private, VMWSVGA3_REG_CONFIG_DONE, 1);
     226
    200227  //
    201228  // Re-initialize the frame buffer configure when mode changes.
    202229  //
     230  DEBUG ((DEBUG_INFO, "VmwSvga3: Configuring framebuffer\n"));
    203231  Status = FrameBufferBltConfigure (
    204              (VOID *)(UINTN)This->Mode->FrameBufferBase,
     232             (VOID *)This->Mode->FrameBufferBase,
    205233             This->Mode->Info,
    206234             Private->FrameBufferBltConfigure,
     
    223251    //
    224252    Status = FrameBufferBltConfigure (
    225                (VOID *)(UINTN)This->Mode->FrameBufferBase,
     253               (VOID *)This->Mode->FrameBufferBase,
    226254               This->Mode->Info,
    227255               Private->FrameBufferBltConfigure,
     
    250278  ASSERT_RETURN_ERROR (Status);
    251279
    252   return EFI_SUCCESS;
     280  return VmwSvga3VideoUpdate (
     281                              Private,
     282                              This->Mode->Info->HorizontalResolution,
     283                              This->Mode->Info->VerticalResolution
     284                             );
    253285}
    254286
     
    333365  }
    334366
    335   /** @todo Update screen. */
     367  if (!EFI_ERROR(Status))
     368    Status = VmwSvga3VideoUpdate(
     369                                 Private,
     370                                 This->Mode->Info->HorizontalResolution,
     371                                 This->Mode->Info->VerticalResolution
     372                                );
    336373
    337374  gBS->RestoreTPL (OriginalTPL);
     
    379416  Private->FrameBufferBltConfigureSize  = 0;
    380417
    381   //
    382   // Initialize the hardware
    383   //
    384418  Status = GraphicsOutput->SetMode (GraphicsOutput, 0);
    385419  if (EFI_ERROR (Status)) {
  • trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/VmwSvga3Dxe/VmwSvga3.h

    r100681 r100688  
    4242
    4343//
     44// Used commands
     45//
     46#define VMWSVGA3_CMD_UPDATE             1
     47
     48//
     49// Command buffer context definitions
     50//
     51#define VMWSVGA3_CB_CTX_DEVICE          0x3f
     52#define VMWSVGA3_CB_CTX_0               0
     53
     54//
     55// Command buffer status definitions
     56//
     57#define VMWSVGA3_CB_STATUS_NONE         0
     58#define VMWSVGA3_CB_STATUS_COMPLETED    1
     59
     60//
     61// Command buffer flags
     62//
     63#define VMWSVGA3_CB_FLAG_NONE           0
     64#define VMWSVGA3_CB_FLAG_NO_IRQ         (1 << 0)
     65
     66//
     67// Device context commands
     68//
     69#define VMWSVGA3_CMD_DC_START_STOP_CTX  1
     70
     71//
     72// Command buffer header
     73//
     74typedef struct
     75{
     76   volatile UINT32  Status;       // Modified by device
     77   volatile UINT32  ErrorOffset;  // Modified by device
     78   UINT64           Id;
     79   UINT32           Flags;
     80   UINT32           Length;
     81   UINT64           PhysicalAddress;
     82   UINT32           Offset;
     83   UINT32           DxContext;    // Valid if DX_CONTEXT flag set, must be zero otherwise
     84   UINT32           Reserved[6];
     85} VMWSVGA3_CB_HDR;
     86
     87//
     88// Update command definition
     89//
     90typedef struct {
     91   UINT32           CmdId;
     92   UINT32           x;
     93   UINT32           y;
     94   UINT32           Width;
     95   UINT32           Height;
     96} VMWSVGA3_CTX_CMD_UPDATE;
     97
     98//
     99// Start/Stop context command definition
     100//
     101typedef struct {
     102   UINT32           CmdId;
     103   UINT32           Enable;
     104   UINT32           Context;
     105} VMWSVGA3_DC_CMD_START_STOP_CTX;
     106
     107//
    44108// VMware SVGA 3 Video Private Data Structure
    45109//
     
    59123  UINT8                           FrameBufferVramBarIndex;
    60124
     125  VMWSVGA3_CB_HDR                 *CmdBufHdr;
     126  VOID                            *CmdBuf;
     127
     128  EFI_PHYSICAL_ADDRESS            PhysicalAddressCmdBufHdr;
     129  EFI_PHYSICAL_ADDRESS            PhysicalAddressCmdBuf;
     130
     131  VOID                            *CmdBufMapping;
    61132} VMWSVGA3_VIDEO_PRIVATE_DATA;
    62 
    63 ///
    64 /// Card-specific Video Mode structures
    65 ///
    66 typedef struct {
    67   UINT32    Width;
    68   UINT32    Height;
    69   UINT32    ColorDepth;
    70   UINT8     *CrtcSettings;
    71   UINT16    *SeqSettings;
    72   UINT8     MiscSetting;
    73 } QEMU_VIDEO_CIRRUS_MODES;
    74133
    75134#define VMWSVGA3_VIDEO_PRIVATE_DATA_FROM_GRAPHICS_OUTPUT_THIS(a) \
     
    81140extern UINT8                         AttributeController[];
    82141extern UINT8                         GraphicsController[];
    83 extern QEMU_VIDEO_CIRRUS_MODES       VmwSvga3VideoModes[];
    84142extern EFI_DRIVER_BINDING_PROTOCOL   gVmwSvga3VideoDriverBinding;
    85143extern EFI_COMPONENT_NAME_PROTOCOL   gVmwSvga3VideoComponentName;
     
    87145
    88146//
     147// PCI BARs defined by SVGA3
     148//
     149#define VMWSVGA3_MMIO_BAR            0
     150#define VMWSVGA3_VRAM_BAR            2
     151
     152//
    89153// MMIO Registers defined by SVGA3
    90154//
    91 /** @todo */
     155#define VMWSVGA3_REG_ID              0
     156# define VMWSVGA3_REG_ID_SVGA3       0x90000003
     157#define VMWSVGA3_REG_ENABLE          4
     158#define VMWSVGA3_REG_WIDTH           8
     159#define VMWSVGA3_REG_HEIGHT          12
     160#define VMWSVGA3_REG_DEPTH           24
     161#define VMWSVGA3_REG_BITS_PER_PIXEL  28
     162#define VMWSVGA3_REG_CONFIG_DONE     80
     163#define VMWSVGA3_REG_IRQMASK         132
     164#define VMWSVGA3_REG_COMMAND_LOW     192
     165#define VMWSVGA3_REG_COMMAND_HIGH    196
     166#define VMWSVGA3_REG_IRQ_STATUS      328
    92167
    93168//
     
    296371// Local Function Prototypes
    297372//
    298 VOID
    299 VmwSvga3InitializeGraphicsMode (
    300   VMWSVGA3_VIDEO_PRIVATE_DATA  *Private,
    301   QEMU_VIDEO_CIRRUS_MODES  *ModeData
    302   );
    303 
    304373EFI_STATUS
    305374VmwSvga3VideoModeSetup (
     
    307376  );
    308377
     378UINT32
     379VmwSvga3ReadReg (
     380  IN  VMWSVGA3_VIDEO_PRIVATE_DATA  *VmwSvga3,
     381  IN  UINT32                       Offset
     382  );
     383
     384VOID
     385VmwSvga3WriteReg (
     386  IN  VMWSVGA3_VIDEO_PRIVATE_DATA  *VmwSvga3,
     387  IN UINT32                        Offset,
     388  IN UINT32                        Data
     389  );
     390
     391EFI_STATUS
     392VmwSvga3DeviceInit (
     393  IN  VMWSVGA3_VIDEO_PRIVATE_DATA  *This
     394  );
     395
     396EFI_STATUS
     397VmwSvga3DeviceUninit (
     398  IN  VMWSVGA3_VIDEO_PRIVATE_DATA  *This
     399  );
     400
     401EFI_STATUS
     402VmwSvga3CmdBufProcess (
     403  IN  VMWSVGA3_VIDEO_PRIVATE_DATA  *This,
     404  IN  UINTN                        NumberOfBytes,
     405  IN  UINT32                       Context
     406  );
     407
    309408#endif
  • trunk/src/VBox/Devices/EFI/Firmware/VBoxPkg/VmwSvga3Dxe/VmwSvga3VideoDxe.inf

    r100681 r100688  
    3232  Driver.c
    3333  Gop.c
     34  Hardware.c
    3435  VmwSvga3.h
    3536
Note: See TracChangeset for help on using the changeset viewer.

© 2024 Oracle Support Privacy / Do Not Sell My Info Terms of Use Trademark Policy Automated Access Etiquette