VirtualBox

Changeset 33472 in vbox for trunk/src/VBox


Ignore:
Timestamp:
Oct 26, 2010 3:56:09 PM (14 years ago)
Author:
vboxsync
Message:

PCI: cleanup, fixes

File:
1 edited

Legend:

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

    r33419 r33472  
    9393#endif
    9494
     95    /** PCI bus which is attached to the host-to-PCI bridge. */
     96    PCIBUS              aPciBus;
     97
     98
    9599    /** I/O APIC irq levels */
    96100    volatile uint32_t   uaPciApicIrqLevels[PCI_APIC_IRQ_PINS];
     
    105109#endif
    106110    /* Physical address of PCI config space MMIO region */
    107      uint64_t            u64PciConfigMMioAddress;
     111    uint64_t            u64PciConfigMMioAddress;
    108112    /* Length of PCI config space MMIO region */
    109     uint64_t             u64PciConfigMMioLength;
     113    uint64_t            u64PciConfigMMioLength;
    110114
    111115
    112116    /** Config register. */
    113117    uint32_t            uConfigReg;
    114 
    115     /** PCI bus which is attached to the host-to-PCI bridge. */
    116     PCIBUS              aPciBus;
    117 
    118118} PCIGLOBALS, *PPCIGLOBALS;
    119119
     
    189189DECLINLINE(void) ich9pciPhysToPciAddr(PPCIGLOBALS pGlobals, RTGCPHYS GCPhysAddr, PciAddress* pPciAddr)
    190190{
    191     GCPhysAddr = GCPhysAddr - pGlobals->u64PciConfigMMioAddress;
    192     pPciAddr->iBus          = (GCPhysAddr >> 20) & ((1<<8)       - 1);
     191    pPciAddr->iBus          = (GCPhysAddr >> 20) & ((1<<6)       - 1);
    193192    pPciAddr->iDeviceFunc   = (GCPhysAddr >> 12) & ((1<<(5+3))   - 1); // 5 bits - device, 3 bits - function
    194193    pPciAddr->iRegister     = (GCPhysAddr >>  0) & ((1<<(6+4+2)) - 1); // 6 bits - register, 4 bits - extended register, 2 bits -Byte Enable
     
    290289}
    291290
    292 static int ich9pciDataWriteAddr(PPCIGLOBALS pGlobals, PciAddress* pAddr, uint32_t val, int len)
     291static int ich9pciDataWriteAddr(PPCIGLOBALS pGlobals, PciAddress* pAddr,
     292                                uint32_t val, int len, int rcReschedule)
    293293{
    294294
     
    296296    {
    297297        LogRel(("PCI: attempt to write extended register: %x (%d) <- val\n", pAddr->iRegister, len, val));
    298         return 0;
     298        return VINF_SUCCESS;
    299299    }
    300300
     
    311311            }
    312312#else
    313             return VINF_IOM_HC_IOPORT_WRITE;
     313            return rcReschedule;
    314314#endif
    315315        }
     
    324324            aDev->Int.s.pfnConfigWrite(aDev, pAddr->iRegister, val, len);
    325325#else
    326             return VINF_IOM_HC_IOPORT_WRITE;
     326            return rcReschedule;
    327327#endif
    328328        }
     
    346346    ich9pciStateToPciAddr(pGlobals, addr, &aPciAddr);
    347347
    348     return ich9pciDataWriteAddr(pGlobals, &aPciAddr, val, len);
     348    return ich9pciDataWriteAddr(pGlobals, &aPciAddr, val, len, VINF_IOM_HC_IOPORT_WRITE);
    349349}
    350350
     
    376376}
    377377
    378 static int ich9pciDataReadAddr(PPCIGLOBALS pGlobals, PciAddress* pPciAddr, int len, uint32_t *pu32)
     378static int ich9pciDataReadAddr(PPCIGLOBALS pGlobals, PciAddress* pPciAddr, int len,
     379                               uint32_t *pu32, int rcReschedule)
    379380{
    380381    if (pPciAddr->iRegister > 0xff)
     
    398399            }
    399400#else
    400             return VINF_IOM_HC_IOPORT_READ;
     401            return rcReschedule;
    401402#endif
    402403        }
     
    411412            Log(("ich9pciDataReadAddr: %s: addr=%02x val=%08x len=%d\n", aDev->name, pPciAddr->iRegister, *pu32, len));
    412413#else
    413             return VINF_IOM_HC_IOPORT_READ;
     414            return rcReschedule;
    414415#endif
    415416        }
     
    434435    ich9pciStateToPciAddr(pGlobals, addr, &aPciAddr);
    435436
    436     return ich9pciDataReadAddr(pGlobals, &aPciAddr, len, pu32);
     437    return ich9pciDataReadAddr(pGlobals, &aPciAddr, len, pu32, VINF_IOM_HC_IOPORT_READ);
    437438}
    438439
     
    571572    uint32_t u32 = 0;
    572573
    573     Log2(("ich9pciMcfgMMIOWrite: %p(%d) \n", GCPhysAddr, cb));
    574 
    575     PCI_LOCK(pDevIns, VINF_IOM_HC_IOPORT_WRITE);
     574    Log2(("ich9pciMcfgMMIOWrite: %RGp(%d) \n", GCPhysAddr, cb));
     575
     576    PCI_LOCK(pDevIns, VINF_IOM_HC_MMIO_WRITE);
    576577
    577578    ich9pciPhysToPciAddr(pGlobals, GCPhysAddr, &aDest);
     
    592593            break;
    593594    }
    594     int rc = ich9pciDataWriteAddr(pGlobals, &aDest, u32, cb);
     595    int rc = ich9pciDataWriteAddr(pGlobals, &aDest, u32, cb, VINF_IOM_HC_MMIO_WRITE);
    595596    PCI_UNLOCK(pDevIns);
    596597
     
    604605    uint32_t    rv = 0xffffffff;
    605606
    606     Log2(("ich9pciMcfgMMIORead: %p(%d) \n", GCPhysAddr, cb));
    607 
    608     PCI_LOCK(pDevIns, VINF_IOM_HC_IOPORT_READ);
     607    LogFlow(("ich9pciMcfgMMIORead: %RGp(%d) \n", GCPhysAddr, cb));
     608
     609    PCI_LOCK(pDevIns, VINF_IOM_HC_MMIO_READ);
    609610
    610611    ich9pciPhysToPciAddr(pGlobals, GCPhysAddr, &aDest);
    611612
    612     int rc = ich9pciDataReadAddr(pGlobals, &aDest, cb, &rv);
    613 
    614     switch (cb)
    615     {
    616         case 1:
    617             *(uint8_t*)pv   = (uint8_t)rv;
    618             break;
    619         case 2:
    620             *(uint16_t*)pv  = (uint16_t)rv;
    621             break;
    622         case 4:
    623             *(uint32_t*)pv  = (uint32_t)rv;
    624             break;
    625         default:
    626             Assert(false);
    627             break;
     613    int rc = ich9pciDataReadAddr(pGlobals, &aDest, cb, &rv, VINF_IOM_HC_MMIO_READ);
     614
     615    Log2(("ich9pciMcfgMMIORead: %02x:%02x:%02x reg %x(%d) gave %x %Rrc\n",
     616          aDest.iBus, aDest.iDeviceFunc >> 3, aDest.iDeviceFunc & 0x7, aDest.iRegister,
     617          cb, rv, rc));
     618
     619    if (RT_SUCCESS(rc))
     620    {
     621        switch (cb)
     622        {
     623            case 1:
     624                *(uint8_t*)pv   = (uint8_t)rv;
     625                break;
     626            case 2:
     627                *(uint16_t*)pv  = (uint16_t)rv;
     628                break;
     629            case 4:
     630                *(uint32_t*)pv  = (uint32_t)rv;
     631                break;
     632            default:
     633                Assert(false);
     634                break;
     635        }
    628636    }
    629637    PCI_UNLOCK(pDevIns);
     
    14041412    aPciAddr.iRegister = addr;
    14051413
    1406     int rc = ich9pciDataReadAddr(pGlobals, &aPciAddr, len, &u32Val);
     1414    /* cannot be rescheduled, as already in R3 */
     1415    int rc = ich9pciDataReadAddr(pGlobals, &aPciAddr, len, &u32Val, VERR_INTERNAL_ERROR);
    14071416    AssertRC(rc);
    14081417    switch (len)
     
    14261435    aPciAddr.iRegister = addr;
    14271436
    1428     ich9pciDataWriteAddr(pGlobals, &aPciAddr, val, len);
     1437    /* cannot be rescheduled, as already in R3 */
     1438    int rc = ich9pciDataWriteAddr(pGlobals, &aPciAddr, val, len, VERR_INTERNAL_ERROR);
     1439    AssertRC(rc);
    14291440}
    14301441
     
    23002311        }
    23012312
    2302          if (fGCEnabled)
    2303          {
    2304 
    2305              rc = PDMDevHlpMMIORegisterRC(pDevIns,
    2306                                           pGlobals->u64PciConfigMMioAddress,
    2307                                           pGlobals->u64PciConfigMMioLength,
    2308                                           0,
    2309                                           "ich9pciMcfgMMIOWrite",
    2310                                           "ich9pciMcfgMMIORead",
    2311                                           NULL /* fill */);
    2312              if (RT_FAILURE(rc))
    2313              {
    2314                  AssertMsgRC(rc, ("Cannot register MCFG MMIO (GC): %Rrc\n", rc));
    2315                  return rc;
    2316              }
    2317          }
    2318 
    2319 
    2320          if (fR0Enabled)
    2321          {
    2322 
    2323              rc = PDMDevHlpMMIORegisterR0(pDevIns,
    2324                                           pGlobals->u64PciConfigMMioAddress,
    2325                                           pGlobals->u64PciConfigMMioLength,
    2326                                           0,
    2327                                           "ich9pciMcfgMMIOWrite",
    2328                                           "ich9pciMcfgMMIORead",
    2329                                           NULL /* fill */);
    2330              if (RT_FAILURE(rc))
    2331              {
    2332                  AssertMsgRC(rc, ("Cannot register MCFG MMIO (R0): %Rrc\n", rc));
    2333                  return rc;
    2334              }
    2335          }
     2313        if (fGCEnabled)
     2314        {
     2315           
     2316            rc = PDMDevHlpMMIORegisterRC(pDevIns,
     2317                                         pGlobals->u64PciConfigMMioAddress,
     2318                                         pGlobals->u64PciConfigMMioLength,
     2319                                         0,
     2320                                         "ich9pciMcfgMMIOWrite",
     2321                                         "ich9pciMcfgMMIORead",
     2322                                         NULL /* fill */);
     2323            if (RT_FAILURE(rc))
     2324            {
     2325                AssertMsgRC(rc, ("Cannot register MCFG MMIO (GC): %Rrc\n", rc));
     2326                return rc;
     2327            }
     2328        }
     2329       
     2330       
     2331        if (fR0Enabled)
     2332        {
     2333           
     2334            rc = PDMDevHlpMMIORegisterR0(pDevIns,
     2335                                         pGlobals->u64PciConfigMMioAddress,
     2336                                         pGlobals->u64PciConfigMMioLength,
     2337                                         0,
     2338                                         "ich9pciMcfgMMIOWrite",
     2339                                         "ich9pciMcfgMMIORead",
     2340                                         NULL /* fill */);
     2341            if (RT_FAILURE(rc))
     2342            {
     2343                AssertMsgRC(rc, ("Cannot register MCFG MMIO (R0): %Rrc\n", rc));
     2344                return rc;
     2345            }
     2346        }
    23362347    }
    23372348
     
    23992410    {
    24002411        if (pBus->apDevices[i])
     2412        {
    24012413            pBus->apDevices[i]->Int.s.pBusRC += offDelta;
     2414            if (pBus->apDevices[i]->Int.s.pMsixPageRC)
     2415                pBus->apDevices[i]->Int.s.pMsixPageRC += offDelta;
     2416        }
    24022417    }
    24032418
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