VirtualBox

Changeset 101480 in vbox


Ignore:
Timestamp:
Oct 17, 2023 2:39:59 PM (17 months ago)
Author:
vboxsync
svn:sync-xref-src-repo-rev:
159552
Message:

Main/src-all,Main/src-client: Add support for PCI bridges for the Armv8 virtual platform and add interrupt descriptors for all slots in the FDT, bugref:10528

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

Legend:

Unmodified
Added
Removed
  • TabularUnified trunk/src/VBox/Main/src-all/PlatformPropertiesImpl.cpp

    r101478 r101480  
    417417        case StorageBus_PCIe:
    418418        case StorageBus_VirtioSCSI:
    419             cCtrs = aChipset == ChipsetType_ICH9 ? 8 : 1;
    420             /** @todo r=andy How many we want to define explicitly for ARMv8Virtual? */
     419            cCtrs = aChipset == ChipsetType_ICH9 || aChipset == ChipsetType_ARMv8Virtual ? 8 : 1;
    421420            break;
    422421        case StorageBus_USB:
  • TabularUnified trunk/src/VBox/Main/src-client/BusAssignmentManager.cpp

    r101473 r101480  
    287287    {"nic",           0, 15,  0, 1},
    288288
     289    /* to make sure rule never used before rules assigning devices on it */
     290    {"pci-generic-ecam-bridge", 0, 24, 0,  10},
     291    {"pci-generic-ecam-bridge", 0, 25, 0,  10},
     292    {"pci-generic-ecam-bridge", 2, 24, 0,   9}, /* Bridges must be instantiated depth */
     293    {"pci-generic-ecam-bridge", 2, 25, 0,   9}, /* first (assumption in PDM and other */
     294    {"pci-generic-ecam-bridge", 4, 24, 0,   8}, /* places), so make sure that nested */
     295    {"pci-generic-ecam-bridge", 4, 25, 0,   8}, /* bridges are added to the last bridge */
     296    {"pci-generic-ecam-bridge", 6, 24, 0,   7}, /* only, avoiding the need to re-sort */
     297    {"pci-generic-ecam-bridge", 6, 25, 0,   7}, /* everything before starting the VM. */
     298    {"pci-generic-ecam-bridge", 8, 24, 0,   6},
     299    {"pci-generic-ecam-bridge", 8, 25, 0,   6},
     300    {"pci-generic-ecam-bridge", 10, 24, 0,  5},
     301    {"pci-generic-ecam-bridge", 10, 25, 0,  5},
     302
     303    /* Storage controllers */
     304    {"ahci",          1,  0, 0,   0},
     305    {"ahci",          1,  1, 0,   0},
     306    {"ahci",          1,  2, 0,   0},
     307    {"ahci",          1,  3, 0,   0},
     308    {"ahci",          1,  4, 0,   0},
     309    {"ahci",          1,  5, 0,   0},
     310    {"ahci",          1,  6, 0,   0},
     311    {"lsilogic",      1,  7, 0,   0},
     312    {"lsilogic",      1,  8, 0,   0},
     313    {"lsilogic",      1,  9, 0,   0},
     314    {"lsilogic",      1, 10, 0,   0},
     315    {"lsilogic",      1, 11, 0,   0},
     316    {"lsilogic",      1, 12, 0,   0},
     317    {"lsilogic",      1, 13, 0,   0},
     318    {"buslogic",      1, 14, 0,   0},
     319    {"buslogic",      1, 15, 0,   0},
     320    {"buslogic",      1, 16, 0,   0},
     321    {"buslogic",      1, 17, 0,   0},
     322    {"buslogic",      1, 18, 0,   0},
     323    {"buslogic",      1, 19, 0,   0},
     324    {"buslogic",      1, 20, 0,   0},
     325    {"lsilogicsas",   1, 21, 0,   0},
     326    {"lsilogicsas",   1, 26, 0,   0},
     327    {"lsilogicsas",   1, 27, 0,   0},
     328    {"lsilogicsas",   1, 28, 0,   0},
     329    {"lsilogicsas",   1, 29, 0,   0},
     330    {"lsilogicsas",   1, 30, 0,   0},
     331    {"lsilogicsas",   1, 31, 0,   0},
     332
     333    /* NICs */
     334    {"nic",           2,  0, 0,   0},
     335    {"nic",           2,  1, 0,   0},
     336    {"nic",           2,  2, 0,   0},
     337    {"nic",           2,  3, 0,   0},
     338    {"nic",           2,  4, 0,   0},
     339    {"nic",           2,  5, 0,   0},
     340    {"nic",           2,  6, 0,   0},
     341    {"nic",           2,  7, 0,   0},
     342    {"nic",           2,  8, 0,   0},
     343    {"nic",           2,  9, 0,   0},
     344    {"nic",           2, 10, 0,   0},
     345    {"nic",           2, 11, 0,   0},
     346    {"nic",           2, 12, 0,   0},
     347    {"nic",           2, 13, 0,   0},
     348    {"nic",           2, 14, 0,   0},
     349    {"nic",           2, 15, 0,   0},
     350    {"nic",           2, 16, 0,   0},
     351    {"nic",           2, 17, 0,   0},
     352    {"nic",           2, 18, 0,   0},
     353    {"nic",           2, 19, 0,   0},
     354    {"nic",           2, 20, 0,   0},
     355    {"nic",           2, 21, 0,   0},
     356    {"nic",           2, 26, 0,   0},
     357    {"nic",           2, 27, 0,   0},
     358    {"nic",           2, 28, 0,   0},
     359    {"nic",           2, 29, 0,   0},
     360    {"nic",           2, 30, 0,   0},
     361    {"nic",           2, 31, 0,   0},
     362
     363    /* Storage controller #2 (NVMe, virtio-scsi) */
     364    {"nvme",          3,  0, 0,   0},
     365    {"nvme",          3,  1, 0,   0},
     366    {"nvme",          3,  2, 0,   0},
     367    {"nvme",          3,  3, 0,   0},
     368    {"nvme",          3,  4, 0,   0},
     369    {"nvme",          3,  5, 0,   0},
     370    {"nvme",          3,  6, 0,   0},
     371    {"virtio-scsi",   3,  7, 0,   0},
     372    {"virtio-scsi",   3,  8, 0,   0},
     373    {"virtio-scsi",   3,  9, 0,   0},
     374    {"virtio-scsi",   3, 10, 0,   0},
     375    {"virtio-scsi",   3, 11, 0,   0},
     376    {"virtio-scsi",   3, 12, 0,   0},
     377    {"virtio-scsi",   3, 13, 0,   0},
     378
    289379    { NULL,          -1, -1, -1,  0}
    290380};
     
    448538            break;
    449539        case ChipsetType_ICH9:
     540            mpszBridgeName = "ich9pcibridge";
     541            break;
    450542        case ChipsetType_ARMv8Virtual:
    451             mpszBridgeName = "ich9pcibridge";
     543            mpszBridgeName = "pci-generic-ecam-bridge";
    452544            break;
    453545        default:
     
    715807        PCFGMNODE pDevices = pVMM->pfnCFGMR3GetParent(pVMM->pfnCFGMR3GetParent(pCfg));
    716808        AssertLogRelMsgReturn(pDevices, ("BusAssignmentManager: cannot find base device configuration\n"), E_UNEXPECTED);
    717         PCFGMNODE pBridges = pVMM->pfnCFGMR3GetChild(pDevices, "ich9pcibridge");
     809        PCFGMNODE pBridges = pVMM->pfnCFGMR3GetChild(pDevices, pState->mpszBridgeName);
    718810        AssertLogRelMsgReturn(pBridges, ("BusAssignmentManager: cannot find bridge configuration base\n"), E_UNEXPECTED);
    719811
  • TabularUnified trunk/src/VBox/Main/src-client/ConsoleImplConfigArmV8.cpp

    r101477 r101480  
    233233        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
    234234
    235         /* Configure some misc system wide properties. */
    236         vrc = RTFdtNodeAdd(hFdt, "chosen");                                                 VRC();
    237         vrc = RTFdtNodePropertyAddString(hFdt, "stdout-path",      "/pl011@9000000");       VRC();
    238         vrc = RTFdtNodeFinalize(hFdt);
    239 
    240235        /* Configure the timer and clock. */
    241236        vrc = RTFdtNodeAdd(hFdt, "timer");                                                  VRC();
     
    359354
    360355        InsertConfigNode(pRoot, "Devices", &pDevices);
     356
     357        InsertConfigNode(pDevices, "pci-generic-ecam-bridge", NULL);
    361358
    362359        InsertConfigNode(pDevices, "platform",              &pDev);
     
    559556        vrc = RTFdtNodeFinalize(hFdt);                                                      VRC();
    560557
     558        uint32_t aPinIrqs[] = { 3, 4, 5, 6 };
    561559        InsertConfigNode(pDevices, "pci-generic-ecam",  &pDev);
    562560        InsertConfigNode(pDev,     "0",            &pInst);
     
    566564        InsertConfigInteger(pCfg,  "MmioPioBase",    0x3eff0000);
    567565        InsertConfigInteger(pCfg,  "MmioPioSize",    0x0000ffff);
    568         InsertConfigInteger(pCfg,  "IntPinA",        3);
    569         InsertConfigInteger(pCfg,  "IntPinB",        4);
    570         InsertConfigInteger(pCfg,  "IntPinC",        5);
    571         InsertConfigInteger(pCfg,  "IntPinD",        6);
     566        InsertConfigInteger(pCfg,  "IntPinA",        aPinIrqs[0]);
     567        InsertConfigInteger(pCfg,  "IntPinB",        aPinIrqs[1]);
     568        InsertConfigInteger(pCfg,  "IntPinC",        aPinIrqs[2]);
     569        InsertConfigInteger(pCfg,  "IntPinD",        aPinIrqs[3]);
    572570        vrc = RTFdtNodeAddF(hFdt, "pcie@%RX32", 0x10000000);                                VRC();
    573         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupt-map-mask", 4, 0x1800, 0, 0, 7); VRC();
    574         vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupt-map", 16 * 10,
    575                                            0x00,   0x00, 0x00, 0x01, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x03, 0x04,
    576                                            0x00,   0x00, 0x00, 0x02, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x04, 0x04,
    577                                            0x00,   0x00, 0x00, 0x03, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x05, 0x04,
    578                                            0x00,   0x00, 0x00, 0x04, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x06, 0x04,
    579                                            0x800,  0x00, 0x00, 0x01, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x04, 0x04,
    580                                            0x800,  0x00, 0x00, 0x02, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x05, 0x04,
    581                                            0x800,  0x00, 0x00, 0x03, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x06, 0x04,
    582                                            0x800,  0x00, 0x00, 0x04, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x03, 0x04,
    583                                            0x1000, 0x00, 0x00, 0x01, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x05, 0x04,
    584                                            0x1000, 0x00, 0x00, 0x02, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x06, 0x04,
    585                                            0x1000, 0x00, 0x00, 0x03, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x03, 0x04,
    586                                            0x1000, 0x00, 0x00, 0x04, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x04, 0x04,
    587                                            0x1800, 0x00, 0x00, 0x01, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x06, 0x04,
    588                                            0x1800, 0x00, 0x00, 0x02, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x03, 0x04,
    589                                            0x1800, 0x00, 0x00, 0x03, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x04, 0x04,
    590                                            0x1800, 0x00, 0x00, 0x04, idPHandleIntCtrl, 0x00, 0x00, 0x00, 0x05, 0x04); VRC();
     571        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "interrupt-map-mask", 4, 0xf800, 0, 0, 7); VRC();
     572
     573        uint32_t aIrqCells[32 * 4 * 10]; RT_ZERO(aIrqCells); /* Maximum of 32 devices on the root bus, each supporting 4 interrupts (INTA# ... INTD#). */
     574        uint32_t *pau32IrqCell = &aIrqCells[0];
     575        uint32_t iIrqPinSwizzle = 0;
     576
     577        for (uint32_t i = 0; i < 32; i++)
     578        {
     579            for (uint32_t iIrqPin = 0; iIrqPin < 4; iIrqPin++)
     580            {
     581                pau32IrqCell[0] = i << 11; /* The dev part, composed as dev.fn. */
     582                pau32IrqCell[1] = 0;
     583                pau32IrqCell[2] = 0;
     584                pau32IrqCell[3] = iIrqPin + 1;
     585                pau32IrqCell[4] = idPHandleIntCtrl;
     586                pau32IrqCell[5] = 0;
     587                pau32IrqCell[6] = 0;
     588                pau32IrqCell[7] = 0;
     589                pau32IrqCell[8] = aPinIrqs[(iIrqPinSwizzle + iIrqPin) % RT_ELEMENTS(aPinIrqs)];
     590                pau32IrqCell[9] = 0x04;
     591                pau32IrqCell += 10;
     592            }
     593
     594            iIrqPinSwizzle++;
     595        }
     596
     597        vrc = RTFdtNodePropertyAddCellsU32AsArray(hFdt, "interrupt-map", RT_ELEMENTS(aIrqCells), &aIrqCells[0]);
    591598        vrc = RTFdtNodePropertyAddU32(     hFdt, "#interrupt-cells", 1);                    VRC();
    592599        vrc = RTFdtNodePropertyAddCellsU32(hFdt, "ranges", 14,
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