VirtualBox

Changeset 76985 in vbox for trunk/src/VBox/Devices


Ignore:
Timestamp:
Jan 25, 2019 11:42:07 AM (6 years ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
128394
Message:

Graphics/VMSVGA: make VBoxSVGA compatibility with old vboxvideo drivers.
bugref:9359: EFI GOP support for VMSVGA.
VBoxSVGA changed the BAR layout with respect to the old vboxvideo, but
remained otherwise compatible. This change makes it work with vboxvideo
drivers on Linux.

Location:
trunk/src/VBox/Devices
Files:
4 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r76553 r76985  
    495495                    goto default_map;
    496496                /* VGA: map frame buffer to default Bochs VBE address */
    497                 int iRegion = devpciR3GetWord(pPciDev, VBOX_PCI_SUBSYSTEM_VENDOR_ID) == 0x15ad ? 1 : 0;
    498                 devpciR3BiosInitSetRegionAddress(pBus, pPciDev, iRegion, 0xe0000000);
     497                devpciR3BiosInitSetRegionAddress(pBus, pPciDev, 0, 0xe0000000);
    499498                /*
    500499                 * Legacy VGA I/O ports are implicitly decoded by a VGA class device. But
  • trunk/src/VBox/Devices/Graphics/DevVGA-SVGA.cpp

    r76951 r76985  
    50225022    if (enmType == PCI_ADDRESS_SPACE_IO)
    50235023    {
    5024         AssertReturn(iRegion == 0, VERR_INTERNAL_ERROR);
     5024        AssertReturn(iRegion == pThis->pciRegions.iIO, VERR_INTERNAL_ERROR);
    50255025        rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, cb, 0,
    50265026                                     vmsvgaIOWrite, vmsvgaIORead, NULL /* OutStr */, NULL /* InStr */, "VMSVGA");
     
    50475047    else
    50485048    {
    5049         AssertReturn(iRegion == 2 && enmType == PCI_ADDRESS_SPACE_MEM, VERR_INTERNAL_ERROR);
     5049        AssertReturn(iRegion == pThis->pciRegions.iFIFO && enmType == PCI_ADDRESS_SPACE_MEM, VERR_INTERNAL_ERROR);
    50505050        if (GCPhysAddress != NIL_RTGCPHYS)
    50515051        {
  • trunk/src/VBox/Devices/Graphics/DevVGA.cpp

    r76553 r76985  
    54695469    Log(("vgaR3IORegionMap: iRegion=%d GCPhysAddress=%RGp cb=%RGp enmType=%d\n", iRegion, GCPhysAddress, cb, enmType));
    54705470#ifdef VBOX_WITH_VMSVGA
    5471     AssertReturn(   iRegion == (pThis->fVMSVGAEnabled ? 1U : 0U)
     5471    AssertReturn(   iRegion == pThis->pciRegions.iVRAM
    54725472                 && enmType == (pThis->fVMSVGAEnabled ? PCI_ADDRESS_SPACE_MEM : PCI_ADDRESS_SPACE_MEM_PREFETCH),
    54735473                 VERR_INTERNAL_ERROR);
    54745474#else
    5475     AssertReturn(iRegion == 0 && enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH, VERR_INTERNAL_ERROR);
     5475    AssertReturn(iRegion == pThis->pciRegions.iVRAM && enmType == PCI_ADDRESS_SPACE_MEM_PREFETCH, VERR_INTERNAL_ERROR);
    54765476#endif
    54775477
     
    55465546    if (pThis->fVMSVGAEnabled)
    55475547    {
    5548         if (iRegion == 2 /*FIFO*/)
     5548        if (iRegion == pThis->pciRegions.iFIFO)
    55495549        {
    55505550            /* Make sure it's still 32-bit memory.  Ignore fluxtuations in the prefetch flag */
     
    55755575        else if (iRegion == UINT32_MAX)
    55765576        {
    5577             int rc = vgaR3PciRegionLoadChangeHook(pDevIns, pPciDev, 2, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM, NULL);
     5577            int rc = vgaR3PciRegionLoadChangeHook(pDevIns, pPciDev, pThis->pciRegions.iFIFO, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM, NULL);
    55785578            if (RT_SUCCESS(rc))
    5579                 rc = pfnOldSetter(pPciDev, 2, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM);
     5579                rc = pfnOldSetter(pPciDev, pThis->pciRegions.iFIFO, VMSVGA_FIFO_SIZE_OLD, PCI_ADDRESS_SPACE_MEM);
    55805580            return rc;
    55815581        }
     
    61906190                                          "VMSVGAEnabled\0"
    61916191                                          "VMSVGAPciId\0"
     6192                                          "VMSVGAPciBarLayout\0"
    61926193                                          "VMSVGAFifoSize\0"
    61936194#endif
     
    62396240    Log(("VMSVGA: VMSVGAPciId   = %d\n", pThis->fVMSVGAPciId));
    62406241
     6242    rc = CFGMR3QueryBoolDef(pCfg, "VMSVGAPciBarLayout", &pThis->fVMSVGAPciBarLayout, false);
     6243    AssertLogRelRCReturn(rc, rc);
     6244    Log(("VMSVGA: VMSVGAPciBarLayout = %d\n", pThis->fVMSVGAPciBarLayout));
     6245
    62416246    rc = CFGMR3QueryU32Def(pCfg, "VMSVGAFifoSize", &pThis->svga.cbFIFO, VMSVGA_FIFO_SIZE);
    62426247    AssertLogRelRCReturn(rc, rc);
     
    62516256    AssertLogRelRCReturn(rc, rc);
    62526257    Log(("VMSVGA: VMSVGA3dEnabled = %d\n", pThis->svga.f3DEnabled));
     6258#endif
     6259
     6260   
     6261#ifdef VBOX_WITH_VMSVGA
     6262    if (pThis->fVMSVGAPciBarLayout)
     6263    {
     6264        pThis->pciRegions.iIO   = 0;
     6265        pThis->pciRegions.iVRAM = 1;
     6266        pThis->pciRegions.iFIFO = 2;
     6267    }
     6268    else
     6269    {
     6270        pThis->pciRegions.iVRAM = 0;
     6271        pThis->pciRegions.iIO   = 1;
     6272        pThis->pciRegions.iFIFO = 2;
     6273    }
     6274#else
     6275    pThis->pciRegions.iVRAM = 0;
    62536276#endif
    62546277
     
    63606383    {
    63616384        /* Register the io command ports. */
    6362         rc = PDMDevHlpPCIIORegionRegister (pDevIns, 0 /* iRegion */, 0x10, PCI_ADDRESS_SPACE_IO, vmsvgaR3IORegionMap);
     6385        rc = PDMDevHlpPCIIORegionRegister (pDevIns, pThis->pciRegions.iIO, 0x10, PCI_ADDRESS_SPACE_IO, vmsvgaR3IORegionMap);
    63636386        if (RT_FAILURE (rc))
    63646387            return rc;
    63656388        /* VMware's MetalKit doesn't like PCI_ADDRESS_SPACE_MEM_PREFETCH */
    6366         rc = PDMDevHlpPCIIORegionRegister(pDevIns, 1 /* iRegion */, pThis->vram_size,
     6389        rc = PDMDevHlpPCIIORegionRegister(pDevIns, pThis->pciRegions.iVRAM, pThis->vram_size,
    63676390                                          PCI_ADDRESS_SPACE_MEM /* PCI_ADDRESS_SPACE_MEM_PREFETCH */, vgaR3IORegionMap);
    63686391        if (RT_FAILURE(rc))
    63696392            return rc;
    6370         rc = PDMDevHlpPCIIORegionRegister(pDevIns, 2 /* iRegion */, pThis->svga.cbFIFO,
     6393        rc = PDMDevHlpPCIIORegionRegister(pDevIns, pThis->pciRegions.iFIFO, pThis->svga.cbFIFO,
    63716394                                          PCI_ADDRESS_SPACE_MEM /* PCI_ADDRESS_SPACE_MEM_PREFETCH */, vmsvgaR3IORegionMap);
    63726395        if (RT_FAILURE(rc))
     
    63776400#endif /* VBOX_WITH_VMSVGA */
    63786401    {
    6379 #ifdef VBOX_WITH_VMSVGA
    6380         int iPCIRegionVRAM = (pThis->fVMSVGAEnabled) ? 1 : 0;
    6381 #else
    6382         int iPCIRegionVRAM = 0;
    6383 #endif
    6384         rc = PDMDevHlpPCIIORegionRegister(pDevIns, iPCIRegionVRAM, pThis->vram_size,
     6402        rc = PDMDevHlpPCIIORegionRegister(pDevIns, pThis->pciRegions.iVRAM, pThis->vram_size,
    63856403                                          PCI_ADDRESS_SPACE_MEM_PREFETCH, vgaR3IORegionMap);
    63866404        if (RT_FAILURE(rc))
     
    63926410     */
    63936411#ifdef VBOX_WITH_VMSVGA
    6394     int iPCIRegionVRAM = (pThis->fVMSVGAEnabled) ? 1 : 0;
    6395 
    63966412    if (pThis->fVMSVGAEnabled)
    63976413    {
     
    63996415         * Allocate and initialize the FIFO MMIO2 memory.
    64006416         */
    6401         rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, 2 /*iRegion*/, pThis->svga.cbFIFO,
     6417        rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, pThis->pciRegions.iFIFO, pThis->svga.cbFIFO,
    64026418                                    0 /*fFlags*/, (void **)&pThis->svga.pFIFOR3, "VMSVGA-FIFO");
    64036419        if (RT_FAILURE(rc))
     
    64066422        pThis->svga.pFIFOR0 = (RTR0PTR)pThis->svga.pFIFOR3;
    64076423    }
    6408 #else
    6409     int iPCIRegionVRAM = 0;
    6410 #endif
    6411     rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, iPCIRegionVRAM, pThis->vram_size, 0, (void **)&pThis->vram_ptrR3, "VRam");
     6424#endif
     6425    rc = PDMDevHlpMMIO2Register(pDevIns, &pThis->Dev, pThis->pciRegions.iVRAM, pThis->vram_size, 0, (void **)&pThis->vram_ptrR3, "VRam");
    64126426    AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMIO2Register(%#x,) -> %Rrc\n", pThis->vram_size, rc), rc);
    64136427    pThis->vram_ptrR0 = (RTR0PTR)pThis->vram_ptrR3; /** @todo @bugref{1865} Map parts into R0 or just use PGM access (Mac only). */
     
    64166430    {
    64176431        RTRCPTR pRCMapping = 0;
    6418         rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, &pThis->Dev, iPCIRegionVRAM, 0 /* off */,  VGA_MAPPING_SIZE,
     6432        rc = PDMDevHlpMMHyperMapMMIO2(pDevIns, &pThis->Dev, pThis->pciRegions.iVRAM, 0 /* off */,  VGA_MAPPING_SIZE,
    64196433                                      "VGA VRam", &pRCMapping);
    64206434        AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMMHyperMapMMIO2(%#x,) -> %Rrc\n", VGA_MAPPING_SIZE, rc), rc);
     
    64366450        {
    64376451            RTR0PTR pR0Mapping = 0;
    6438             rc = PDMDevHlpMMIO2MapKernel(pDevIns, 2 /* iRegion */, 0 /* off */,  pThis->svga.cbFIFO, "VMSVGA-FIFO", &pR0Mapping);
     6452            rc = PDMDevHlpMMIO2MapKernel(pDevIns, pThis->pciRegions.iFIFO, 0 /* off */,  pThis->svga.cbFIFO, "VMSVGA-FIFO", &pR0Mapping);
    64396453            AssertLogRelMsgRCReturn(rc, ("PDMDevHlpMapMMIO2IntoR0(%#x,) -> %Rrc\n", pThis->svga.cbFIFO, rc), rc);
    64406454            pThis->svga.pFIFOR0 = pR0Mapping;
  • trunk/src/VBox/Devices/Graphics/DevVGA.h

    r76565 r76985  
    350350    bool                        fVMSVGAEnabled;
    351351    bool                        fVMSVGAPciId;
    352     bool                        Padding4[0+3];
     352    bool                        fVMSVGAPciBarLayout;
     353    bool                        Padding4[0+2];
    353354# else
    354355    bool                        Padding4[1+4];
    355356# endif
     357
     358    struct {
     359        uint32_t                    u32Padding1;
     360        uint32_t                    iVRAM;
     361# ifdef VBOX_WITH_VMSVGA
     362        uint32_t                    iIO;
     363        uint32_t                    iFIFO;
     364# endif
     365    } pciRegions;
    356366
    357367    /** Physical access type for the linear frame buffer dirty page tracking. */
Note: See TracChangeset for help on using the changeset viewer.

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