VirtualBox

Changeset 41811 in vbox


Ignore:
Timestamp:
Jun 18, 2012 9:50:23 AM (12 years ago)
Author:
vboxsync
Message:

PCI/DevATA: Added bus mastering support.

Location:
trunk
Files:
3 edited

Legend:

Unmodified
Added
Removed
  • trunk/include/VBox/pci.h

    r41699 r41811  
    538538} PCIDEVICE;
    539539
     540#ifdef IN_RING3
     541int PCIDevPhysRead(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead);
     542int PCIDevPhysWrite(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite);
     543#endif
     544
    540545/* @todo: handle extended space access */
    541546DECLINLINE(void)     PCIDevSetByte(PPCIDEVICE pPciDev, uint32_t uOffset, uint8_t u8Value)
     
    643648{
    644649    return PCIDevGetWord(pPciDev, VBOX_PCI_COMMAND);
     650}
     651
     652/**
     653 * Checks if the given PCI device is a bus master.
     654 * @returns true if the device is a bus master, false if not.
     655 * @param   pPciDev         The PCI device.
     656 */
     657DECLINLINE(bool) PCIDevIsBusmaster(PPCIDEVICE pPciDev)
     658{
     659    return (PCIDevGetCommand(pPciDev) & VBOX_PCI_COMMAND_MASTER) != 0;
    645660}
    646661
  • trunk/src/VBox/Devices/Bus/DevPCI.cpp

    r41697 r41811  
    242242
    243243#ifdef IN_RING3
     244/**
     245 * Reads data via bus mastering, if enabled. If no bus mastering is available,
     246 * this function does nothing and returns VINF_SUCCESS.
     247 *
     248 * @return  IPRT status code.
     249 */
     250int PCIDevPhysRead(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, void *pvBuf, size_t cbRead)
     251{
     252    AssertPtrReturn(pPciDev, VERR_INVALID_POINTER);
     253    AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
     254    AssertReturn(cbRead, VERR_INVALID_PARAMETER);
     255
     256    if (!PCIDevIsBusmaster(pPciDev))
     257    {
     258#ifdef DEBUG
     259        Log2(("%s: %RU16:%RU16: No bus master (anymore), skipping read %p (%z)\n", __FUNCTION__,
     260              PCIDevGetVendorId(pPciDev), PCIDevGetDeviceId(pPciDev), pvBuf, cbRead));
     261#endif
     262        return VINF_SUCCESS;
     263    }
     264
     265    return PDMDevHlpPhysRead(pPciDev->pDevIns, GCPhys, pvBuf, cbRead);
     266}
     267
     268/**
     269 * Writes data via bus mastering, if enabled. If no bus mastering is available,
     270 * this function does nothing and returns VINF_SUCCESS.
     271 *
     272 * @return  IPRT status code.
     273 */
     274int PCIDevPhysWrite(PPCIDEVICE pPciDev, RTGCPHYS GCPhys, const void *pvBuf, size_t cbWrite)
     275{
     276    AssertPtrReturn(pPciDev, VERR_INVALID_POINTER);
     277    AssertPtrReturn(pvBuf, VERR_INVALID_POINTER);
     278    AssertReturn(cbWrite, VERR_INVALID_PARAMETER);
     279
     280    if (!PCIDevIsBusmaster(pPciDev))
     281    {
     282#ifdef DEBUG
     283        Log2(("%s: %RU16:%RU16: No bus master (anymore), skipping write %p (%z)\n", __FUNCTION__,
     284              PCIDevGetVendorId(pPciDev), PCIDevGetDeviceId(pPciDev), pvBuf, cbWrite));
     285#endif
     286        return VINF_SUCCESS;
     287    }
     288
     289    return PDMDevHlpPhysWrite(pPciDev->pDevIns, GCPhys, pvBuf, cbWrite);
     290}
    244291
    245292static void pci_update_mappings(PCIDevice *d)
     
    758805
    759806#ifdef IN_RING3
    760 
    761807/**
    762808 * Finds a bridge on the bus which contains the destination bus.
  • trunk/src/VBox/Devices/Storage/DevATA.cpp

    r41099 r41811  
    50135013                Log2(("%s: DMA desc %#010x: addr=%#010x size=%#010x orig_size=%#010x\n", __FUNCTION__,
    50145014                       (int)pDesc, pBuffer, cbBuffer, RT_LE2H_U32(DMADesc.cbBuffer) & 0xfffe));
     5015
     5016                PCIATAState *pATAState = PDMINS_2_DATA(pDevIns, PCIATAState *);
     5017                AssertPtr(pATAState);
    50155018                if (uTxDir == PDMBLOCKTXDIR_FROM_DEVICE)
    5016                     PDMDevHlpPhysWrite(pDevIns, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen);
     5019                    PCIDevPhysWrite(&pATAState->dev, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen);
    50175020                else
    5018                     PDMDevHlpPhysRead(pDevIns, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen);
     5021                    PCIDevPhysRead(&pATAState->dev, pBuffer, s->CTX_SUFF(pbIOBuffer) + iIOBufferCur, dmalen);
     5022
    50195023                iIOBufferCur += dmalen;
    50205024                cbTotalTransfer -= dmalen;
     
    57395743    PCIATAState   *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *);
    57405744    PATACONTROLLER pCtl = &pThis->aCts[i];
    5741     int rc;
    5742 
    5743     rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_READ);
     5745
     5746    bool fBm = PCIDevIsBusmaster(&pThis->dev);
     5747#ifdef DEBUG_andy
     5748    Log2(("%s: Ctl#%d: Bus master = %RTbool\n",
     5749          __FUNCTION__, ATACONTROLLER_IDX(pCtl), fBm));
     5750#endif
     5751    if (!fBm)
     5752        return VINF_SUCCESS; /** @todo Correct? */
     5753
     5754    int rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_READ);
    57445755    if (rc != VINF_SUCCESS)
    57455756        return rc;
     
    57735784    PCIATAState   *pThis = PDMINS_2_DATA(pDevIns, PCIATAState *);
    57745785    PATACONTROLLER pCtl = &pThis->aCts[i];
    5775     int rc;
    5776 
    5777     rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_WRITE);
     5786
     5787    bool fBm = PCIDevIsBusmaster(&pThis->dev);
     5788#ifdef DEBUG_andy
     5789    Log2(("%s: Ctl#%d: Bus master = %RTbool\n",
     5790          __FUNCTION__, ATACONTROLLER_IDX(pCtl), fBm));
     5791#endif
     5792    if (!fBm)
     5793        return VINF_SUCCESS; /** @todo Correct? */
     5794
     5795    int rc = PDMCritSectEnter(&pCtl->lock, VINF_IOM_R3_IOPORT_WRITE);
    57785796    if (rc != VINF_SUCCESS)
    57795797        return rc;
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