VirtualBox

Changeset 85478 in vbox for trunk/src


Ignore:
Timestamp:
Jul 27, 2020 6:20:55 PM (4 years ago)
Author:
vboxsync
Message:

DevPCI.cpp: Move special VGA case into generic allocation, to make it flexibly handle VBoxVGA, VMSVGA and VBoxSVGA. Important for 256MB VRAM, since it fits only in the special place.

File:
1 edited

Legend:

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

    r85007 r85478  
    471471                                 PPDMPCIDEV pPciDev, uint8_t cBridgeDepth, uint8_t *paBridgePositions)
    472472{
     473    uint32_t uPciBiosSpecialVRAM = 0xe0000000;
    473474    uint32_t *paddr;
    474475    int pin, pic_irq;
     
    482483    if (vendor_id != 0xffff)
    483484    {
    484         switch(devclass)
     485        switch (devclass)
    485486        {
    486487            case 0x0101:
     
    505506                }
    506507                break;
    507             case 0x0300:
    508             {
    509                 if (vendor_id != 0x80ee)
    510                     goto default_map;
    511                 /* VGA: map frame buffer to default Bochs VBE address */
    512                 devpciR3BiosInitSetRegionAddress(pDevIns, pBus, pPciDev, 0, 0xe0000000);
    513                 /*
    514                  * Legacy VGA I/O ports are implicitly decoded by a VGA class device. But
    515                  * only the framebuffer (i.e., a memory region) is explicitly registered via
    516                  * devpciR3BiosInitSetRegionAddress, so don't forget to enable I/O decoding.
    517                  */
    518                 devpciR3SetWord(pDevIns, pPciDev, PCI_COMMAND,
    519                                   devpciR3GetWord(pPciDev, PCI_COMMAND)
    520                                 | PCI_COMMAND_IOACCESS | PCI_COMMAND_MEMACCESS);
    521                 break;
    522             }
    523508            case 0x0800:
    524509                /* PIC */
     
    639624                {
    640625                    uint32_t u32Size;
    641                     uint8_t  u8RessourceType;
     626                    uint8_t  u8ResourceType;
    642627                    uint32_t u32Address = 0x10 + i * 4;
    643628
    644629                    /* Calculate size. */
    645                     u8RessourceType = devpciR3GetByte(pPciDev, u32Address);
     630                    u8ResourceType = devpciR3GetByte(pPciDev, u32Address);
    646631                    devpciR3SetDWord(pDevIns, pPciDev, u32Address, UINT32_C(0xffffffff));
    647632                    u32Size = devpciR3GetDWord(pPciDev, u32Address);
    648                     bool fIsPio = ((u8RessourceType & PCI_COMMAND_IOACCESS) == PCI_COMMAND_IOACCESS);
     633                    bool fIsPio = ((u8ResourceType & PCI_COMMAND_IOACCESS) == PCI_COMMAND_IOACCESS);
    649634                    /* Clear resource information depending on resource type. */
    650635                    if (fIsPio) /* I/O */
     
    669654                            paddr = &pGlobals->uPciBiosIo;
    670655                        else
     656                        {
    671657                            paddr = &pGlobals->uPciBiosMmio;
     658                            bool fPrefetch =    (u8ResourceType & ((uint8_t)(PCI_ADDRESS_SPACE_MEM_PREFETCH | PCI_ADDRESS_SPACE_IO)))
     659                                             == PCI_ADDRESS_SPACE_MEM_PREFETCH;
     660
     661                            if (devclass == 0x0300 && (vendor_id == 0x80ee || vendor_id == 0x15ad) && fPrefetch)
     662                            {
     663                                /* VGA: map frame buffer to default Bochs VBE address */
     664                                paddr = &uPciBiosSpecialVRAM;
     665                                /*
     666                                 * For VBoxVGA must enable I/O decoding, because legacy
     667                                 * VGA I/O ports are implicitly decoded by a VGA class
     668                                 * device. Not needed for VMSVGA or VBoxSVGA, because
     669                                 * they have an explicit I/O BAR.
     670                                 */
     671                                fActiveIORegion = true;
     672                            }
     673                        }
    672674                        uint32_t uNew = *paddr;
    673675                        uNew = (uNew + u32Size - 1) & ~(u32Size - 1);
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