VirtualBox

Changeset 33690 in vbox


Ignore:
Timestamp:
Nov 2, 2010 2:02:19 PM (14 years ago)
Author:
vboxsync
Message:

PCI: more slot management bits

Location:
trunk/src/VBox/Main
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Main/BusAssignmentManager.cpp

    r33688 r33690  
    2424
    2525#include <map>
     26#include <vector>
    2627
    2728struct BusAssignmentManager::State
     
    3536            ::strncpy(szDevName, pszName, sizeof(szDevName));
    3637        }
     38
     39        bool operator<(const PciDeviceRecord &a) const
     40        {
     41            return ::strcmp(szDevName, a.szDevName) < 0;
     42        }
     43
     44        bool operator==(const PciDeviceRecord &a) const
     45        {
     46            return ::strcmp(szDevName, a.szDevName) == 0;
     47        }
    3748    };
    3849
    39     typedef std::map <PciBusAddress, PciDeviceRecord > PciMap;
     50    typedef std::map <PciBusAddress,PciDeviceRecord > PciMap;
     51    typedef std::vector<PciBusAddress>                PciAddrList;
     52    typedef std::map <PciDeviceRecord,PciAddrList >   ReversePciMap;
    4053
    4154    volatile int32_t cRefCnt;
    4255    ChipsetType_T    mChipsetType;
    4356    PciMap           mPciMap;
     57    ReversePciMap    mReversePciMap;
    4458
    4559    State()
     
    5468    HRESULT autoAssign(const char* pszName, PciBusAddress& Address);
    5569    bool    checkAvailable(PciBusAddress& Address);
     70    bool    findPciAddress(const char* pszDevName, int iInstance, PciBusAddress& Address);
    5671};
    5772
     
    6580HRESULT BusAssignmentManager::State::record(const char* pszName, PciBusAddress& Address)
    6681{
    67     mPciMap.insert(PciMap::value_type(Address, PciDeviceRecord(pszName)));
    68     return S_OK;
     82    PciDeviceRecord devRec(pszName);
     83
     84    /* Remember address -> device mapping */
     85    mPciMap.insert(PciMap::value_type(Address, devRec));
     86
     87    ReversePciMap::iterator it = mReversePciMap.find(devRec);
     88    if (it == mReversePciMap.end())
     89    {
     90        mReversePciMap.insert(ReversePciMap::value_type(devRec, PciAddrList()));
     91        it = mReversePciMap.find(devRec);
     92    }
     93
     94    /* Remember device name -> addresses mapping */
     95    it->second.push_back(Address);
     96
     97    return S_OK;
     98}
     99
     100bool    BusAssignmentManager::State::findPciAddress(const char* pszDevName, int iInstance, PciBusAddress& Address)
     101{
     102    PciDeviceRecord devRec(pszDevName);
     103
     104    ReversePciMap::iterator it = mReversePciMap.find(devRec);
     105    if (it == mReversePciMap.end())
     106        return false;
     107
     108    if (iInstance >= (int)it->second.size())
     109        return false;
     110
     111    Address = it->second[iInstance];
     112    return true;
    69113}
    70114
     
    176220    return S_OK;
    177221}
     222
     223
     224bool BusAssignmentManager::findPciAddress(const char* pszDevName, int iInstance, PciBusAddress& Address)
     225{
     226    return pState->findPciAddress(pszDevName, iInstance, Address);
     227}
  • trunk/src/VBox/Main/ConsoleImpl2.cpp

    r33687 r33690  
    966966            InsertConfigNode(pDevices, "lpc", &pDev);
    967967            InsertConfigNode(pDev,     "0", &pInst);
     968#if 0
     969            PciAddr = PciBusAddress(0, 31, 0);
     970            hrc = BusMgr->assignPciDevice("lpc", pInst);                               H();
     971#endif
    968972            InsertConfigInteger(pInst, "Trusted",   1); /* boolean */
    969973        }
     
    23072311            if (fOsXGuest && fAudioEnabled)
    23082312            {
    2309                 /** @todo: don't hardcode */
    2310                 uint32_t u32AudioPciAddr = (5 << 16) | 0;
    2311                 InsertConfigInteger(pCfg, "AudioPciAddress",    u32AudioPciAddr);
     2313                PciBusAddress Address;
     2314                if (BusMgr->findPciAddress("hda", 0, Address))
     2315                {
     2316                    uint32_t u32AudioPciAddr = (Address.iDevice << 16) | Address.iFn;
     2317                    InsertConfigInteger(pCfg, "AudioPciAddress",    u32AudioPciAddr);
     2318                }
    23122319            }
    23132320            InsertConfigInteger(pCfg,  "IocPciAddress", u32IocPciAddress);
  • trunk/src/VBox/Main/include/BusAssignmentManager.h

    r33687 r33690  
    4949        if (iBus < a.iBus)
    5050            return true;
    51        
     51
    5252        if (iBus > a.iBus)
    5353            return false;
     
    5555        if (iDevice < a.iDevice)
    5656            return true;
    57        
     57
    5858        if (iDevice > a.iDevice)
    5959            return false;
     
    6161        if (iFn < a.iFn)
    6262            return true;
    63        
     63
    6464        if (iFn > a.iFn)
    6565            return false;
     
    110110        return assignPciDevice(pszDevName, pCfg, Address, false);
    111111    }
     112    virtual bool findPciAddress(const char* pszDevName, int iInstance, PciBusAddress& Address);
    112113};
    113114
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