VirtualBox

Changeset 65573 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Feb 1, 2017 4:42:40 PM (8 years ago)
Author:
vboxsync
Message:

ACPI: add a 64-bit prefetchable memory window to the root bus resources if the ICH9 chipset is configured

Location:
trunk/src/VBox/Devices/PC
Files:
2 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevACPI.cpp

    r65101 r65573  
    171171    SYSTEM_INFO_INDEX_SERIAL3_IOBASE    = 7,
    172172    SYSTEM_INFO_INDEX_SERIAL3_IRQ       = 8,
    173     SYSTEM_INFO_INDEX_HIGH_MEMORY_LENGTH= 9,
     173    SYSTEM_INFO_INDEX_PREF64_MEMORY_START = 9,
    174174    SYSTEM_INFO_INDEX_RTC_STATUS        = 10,
    175175    SYSTEM_INFO_INDEX_CPU_LOCKED        = 11, /**< Contains a flag indicating whether the CPU is locked or not */
     
    308308    uint32_t            uSystemInfoIndex;
    309309    uint64_t            u64RamSize;
    310     /** The number of bytes above 4GB. */
    311     uint64_t            cbRamHigh;
     310    /** Offset of the 64-bit prefetchable memory window. */
     311    uint64_t            u64PciPref64;
    312312    /** The number of bytes below 4GB. */
    313313    uint32_t            cbRamLow;
     
    360360    /** If MCFG ACPI table shown to the guest */
    361361    bool                fUseMcfg;
     362    /** if the 64-bit prefetchable memory window is shown to the guest */
     363    bool                fPciPref64Enabled;
    362364    /** Primary NIC PCI address. */
    363365    uint32_t            u32NicPciAddress;
     
    13241326            break;
    13251327
    1326         case SYSTEM_INFO_INDEX_HIGH_MEMORY_LENGTH:
    1327             *pu32 = pThis->cbRamHigh >> 16; /* 64KB units */
    1328             Assert(((uint64_t)*pu32 << 16) == pThis->cbRamHigh);
     1328        case SYSTEM_INFO_INDEX_PREF64_MEMORY_START:
     1329            *pu32 = pThis->u64PciPref64 >> 16; /* 64KB units */
     1330            Assert(((uint64_t)*pu32 << 16) == pThis->u64PciPref64);
    13291331            break;
    13301332
     
    31293131
    31303132    /*
    3131      * Calculate the sizes for the high and low regions.
     3133     * Calculate the sizes for the low region and for the 64-bit prefetchable memory.
    31323134     */
    31333135    const uint64_t offRamHole = _4G - cbRamHole;
    3134     pThis->cbRamHigh = offRamHole < pThis->u64RamSize ? pThis->u64RamSize - offRamHole : 0;
     3136    if (pThis->fPciPref64Enabled)
     3137        pThis->u64PciPref64 = pThis->u64RamSize  < _4G ? _4G : pThis->u64RamSize; /* MEM4 */
    31353138    uint64_t cbRamLow = offRamHole < pThis->u64RamSize ? offRamHole : pThis->u64RamSize;
    31363139    if (cbRamLow > UINT32_C(0xffe00000)) /* See MEM3. */
     
    35583561                              "McfgBase\0"
    35593562                              "McfgLength\0"
     3563                              "PciPref64Enabled\0"
    35603564                              "SmcEnabled\0"
    35613565                              "FdcEnabled\0"
     
    36243628                                N_("Configuration error: Failed to read \"McfgLength\""));
    36253629    pThis->fUseMcfg = (pThis->u64PciConfigMMioAddress != 0) && (pThis->u64PciConfigMMioLength != 0);
     3630
     3631    /* query whether we are supposed to set up the 64-bit prefetchable memory window */
     3632    rc = CFGMR3QueryBoolDef(pCfg, "PciPref64Enabled", &pThis->fPciPref64Enabled, false);
     3633    if (RT_FAILURE(rc))
     3634        return PDMDEV_SET_ERROR(pDevIns, rc,
     3635                                N_("Configuration error: Failed to read \"PciPref64Enabled\""));
    36263636
    36273637    /* query whether we are supposed to present custom table */
  • trunk/src/VBox/Devices/PC/vbox.dsl

    r61677 r65573  
    347347        SL3B,  32, // Serial3 base IO address 
    348348        SL3I,  32, // Serial3 IRQ
    349         MEMH,  32,
     349        PMEM,  32,
    350350        URTC,  32, // if RTC shown in tables
    351351        CPUL,  32, // flag of CPU lock state
     
    389389            DBG ("UFDC: ")
    390390            HEX4 (UFDC)
    391             DBG ("MEMH: ")
    392             HEX4 (MEMH)
     391            DBG ("PMEM: ")
     392            HEX4 (PMEM)
    393393        }
    394394
     
    15671567            })
    15681568
    1569 //            Name (TOM, ResourceTemplate ()      // Memory above 4GB (aka high), appended when needed.
    1570 //            {
    1571 //                QWORDMemory(
    1572 //                    ResourceProducer,           // bit 0 of general flags is 0
    1573 //                    PosDecode,                  // positive Decode
    1574 //                    MinFixed,                   // Range is fixed
    1575 //                    MaxFixed,                   // Range is fixed
    1576 //                    Cacheable,
    1577 //                    ReadWrite,
    1578 //                    0x0000000000000000,         // _GRA: Granularity.
    1579 //                    0 /*0x0000000100000000*/,   // _MIN: Min address, 4GB.
    1580 //                    0 /*0x00000fffffffffff*/,   // _MAX: Max possible address, 16TB.
    1581 //                    0x0000000000000000,         // _TRA: Translation
    1582 //                    0x0000000000000000,         // _LEN: Range length (calculated dynamically)
    1583 //                    ,                           // ResourceSourceIndex: Optional field left blank
    1584 //                    ,                           // ResourceSource:      Optional field left blank
    1585 //                    MEM4                        // Name declaration for this descriptor.
    1586 //                    )
    1587 //            })
     1569            Name (TOM, ResourceTemplate ()
     1570            {
     1571                QwordMemory(
     1572                    ResourceProducer,         // bit 0 of general flags is 0
     1573                    PosDecode,                // positive Decode
     1574                    MinFixed,                 // Range is fixed
     1575                    MaxFixed,                 // Range is fixed
     1576                    Prefetchable,
     1577                    ReadWrite,
     1578                    0x0000000000000000,       // _GRA: Granularity.
     1579                    0x0000000100000000,       // _MIN: Min address, 4GB, will be overwritten.
     1580                    0x00000020ffffffff,       // _MAX: Max possible address, will be overwritten.
     1581                    0x0000000000000000,       // _TRA: Translation
     1582                    0x0000002000000000,       // _LEN: Range length (calculated dynamically)
     1583                    ,                         // ResourceSourceIndex: Optional field left blank
     1584                    ,                         // ResourceSource:      Optional field left blank
     1585                    MEM4                      // Name declaration for this descriptor.
     1586                    )
     1587            })
    15881588
    15891589            Method (_CRS, 0, NotSerialized)
     
    15911591                CreateDwordField (CRS, \_SB.PCI0.MEM3._MIN, RAMT)
    15921592                CreateDwordField (CRS, \_SB.PCI0.MEM3._LEN, RAMR)
    1593 //                CreateQwordField (TOM, \_SB.PCI0.MEM4._LEN, TM4L)
    1594 //                CreateQwordField (TOM, \_SB.PCI0.MEM4._LEN, TM4N)
    1595 //                CreateQwordField (TOM, \_SB.PCI0.MEM4._LEN, TM4X)
     1593                CreateQwordField (TOM, \_SB.PCI0.MEM4._MIN, TM4N)
     1594                CreateQwordField (TOM, \_SB.PCI0.MEM4._MAX, TM4X)
     1595                CreateQwordField (TOM, \_SB.PCI0.MEM4._LEN, TM4L)
    15961596
    15971597                Store (MEML, RAMT)
    15981598                Subtract (0xffe00000, RAMT, RAMR)
    15991599
    1600 //                If (LNotEqual (MEMH, 0x00000000))
    1601 //                {
    1602 //                    //
    1603 //                    // Update the TOM resource template and append it to CRS.
    1604 //                    // This way old < 4GB guest doesn't see anything different.
    1605 //                    // (MEMH is the memory above 4GB specified in 64KB units.)
    1606 //                    //
    1607 //                    // Note: ACPI v2 doesn't do 32-bit integers. IASL may fail on
    1608 //                    //       seeing 64-bit constants and the code probably wont work.
    1609 //                    //
    1610 //                    Store (1, TM4N)
    1611 //                    ShiftLeft (TM4N, 32, TM4N)
    1612 //
    1613 //                    Store (0x00000fff, TM4X)
    1614 //                    ShiftLeft (TM4X, 32, TM4X)
    1615 //                    Or (TM4X, 0xffffffff, TM4X)
    1616 //
    1617 //                    Store (MEMH, TM4L)
    1618 //                    ShiftLeft (TM4L, 16, TM4L)
    1619 //
    1620 //                    ConcatenateResTemplate (CRS, TOM, Local2)
    1621 //                    Return (Local2)
    1622 //                }
     1600                if (LNotEqual (PMEM, 0x00000000))
     1601                {
     1602                    Store (PMEM, TM4N)
     1603                    ShiftLeft (TM4N, 16, TM4N)
     1604
     1605                    Store (PMEM, TM4X)
     1606                    Store (0x10000000, TM4L)      // Size 16TB
     1607                    Add (TM4X, TM4L, TM4X)
     1608                    Subtract (TM4X, 1, TM4X)
     1609                    ShiftLeft (TM4X, 16, TM4X)    // MAX = MIN + LEN - (1 << 16)
     1610//                    Add (TM4X, 0xffff, TM4X)    // For some reason this operation prevents
     1611                                                  // at least Linux from determining this
     1612                                                  // resource!
     1613                    ShiftLeft (TM4L, 16, TM4L)
     1614
     1615                    ConcatenateResTemplate (CRS, TOM, Local2)
     1616
     1617                    Return (Local2)
     1618                }
    16231619
    16241620                Return (CRS)
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