VirtualBox

Changeset 29326 in vbox


Ignore:
Timestamp:
May 11, 2010 10:08:13 AM (14 years ago)
Author:
vboxsync
Message:

LsiLogic: Make the SAS controller a separate device to make it possible to have both types in one VM

Location:
trunk/src/VBox
Files:
6 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/Builtins.cpp

    r28800 r29326  
    178178    if (RT_FAILURE(rc))
    179179        return rc;
     180    rc = pCallbacks->pfnRegister(pCallbacks, &g_DeviceLsiLogicSAS);
     181    if (RT_FAILURE(rc))
     182        return rc;
    180183#endif
    181184
  • trunk/src/VBox/Devices/Builtins.h

    r28800 r29326  
    7878#ifdef VBOX_WITH_LSILOGIC
    7979extern const PDMDEVREG g_DeviceLsiLogicSCSI;
     80extern const PDMDEVREG g_DeviceLsiLogicSAS;
    8081#endif
    8182#ifdef VBOX_WITH_SMC
  • trunk/src/VBox/Devices/PC/BIOS/scsi.c

    r28800 r29326  
    2020/* The I/O port of the LsiLogic SCSI adapter. */
    2121#define LSILOGIC_ISA_IO_PORT 0x340
     22/* The I/O port of the LsiLogic SAS adapter. */
     23#define LSILOGIC_SAS_ISA_IO_PORT 0x350
    2224
    2325#define VBOXSCSI_REGISTER_STATUS   0
     
    284286
    285287    ebda_seg = read_word(0x0040, 0x000E);
    286 
    287     write_byte(ebda_seg, &EbdaData->scsi.hdcount, 0);
    288288
    289289    /* Go through target devices. */
     
    366366                    cylinders = (uint32_t)(sectors / (heads * sectors_per_track));
    367367                }
    368                 else if (io_base == LSILOGIC_ISA_IO_PORT)
     368                else if (io_base == LSILOGIC_ISA_IO_PORT || io_base == LSILOGIC_SAS_ISA_IO_PORT)
    369369                {
    370370                    /* This is from the BusLogic driver in the Linux kernel. */
     
    442442{
    443443    Bit8u identifier;
     444    Bit16u ebda_seg;
     445
     446
     447    ebda_seg = read_word(0x0040, 0x000E);
     448    write_byte(ebda_seg, &EbdaData->scsi.hdcount, 0);
    444449
    445450    identifier = 0;
     
    476481        VBOXSCSI_DEBUG("scsi_init: LsiLogic SCSI adapter not detected\n");
    477482    }
     483
     484    /* Detect LsiLogic SAS adapter. */
     485    outb(LSILOGIC_SAS_ISA_IO_PORT+VBOXSCSI_REGISTER_IDENTIFY, 0x55);
     486    identifier = inb(LSILOGIC_SAS_ISA_IO_PORT+VBOXSCSI_REGISTER_IDENTIFY);
     487
     488    if (identifier == 0x55)
     489    {
     490        /* Detected - Enumerate attached devices. */
     491        VBOXSCSI_DEBUG("scsi_init: LsiLogic SAS adapter detected\n");
     492        outb(LSILOGIC_SAS_ISA_IO_PORT+VBOXSCSI_REGISTER_RESET, 0);
     493        scsi_enumerate_attached_devices(LSILOGIC_SAS_ISA_IO_PORT);
     494    }
     495    else
     496    {
     497        VBOXSCSI_DEBUG("scsi_init: LsiLogic SAS adapter not detected\n");
     498    }
    478499}
    479500
  • trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.cpp

    r29242 r29326  
    35023502{
    35033503    int rc;
    3504     PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
     3504    PLSILOGICSCSI pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    35053505
    35063506    Assert(cb == 1);
    35073507
    3508     rc = vboxscsiReadRegister(&pLsiLogic->VBoxSCSI, (Port - LSILOGIC_ISA_IO_PORT), pu32);
     3508    uint8_t iRegister =   pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     3509                        ? Port - LSILOGIC_ISA_IO_PORT
     3510                        : Port - LSILOGIC_SAS_ISA_IO_PORT;
     3511    rc = vboxscsiReadRegister(&pThis->VBoxSCSI, iRegister, pu32);
    35093512
    35103513    Log2(("%s: pu32=%p:{%.*Rhxs} iRegister=%d rc=%Rrc\n",
    3511           __FUNCTION__, pu32, 1, pu32, (Port - LSILOGIC_ISA_IO_PORT), rc));
     3514          __FUNCTION__, pu32, 1, pu32, iRegister, rc));
    35123515
    35133516    return rc;
     
    35853588{
    35863589    int rc;
    3587     PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
     3590    PLSILOGICSCSI pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    35883591
    35893592    Log2(("#%d %s: pvUser=%#p cb=%d u32=%#x Port=%#x\n",
     
    35923595    Assert(cb == 1);
    35933596
    3594     rc = vboxscsiWriteRegister(&pLsiLogic->VBoxSCSI, (Port - LSILOGIC_ISA_IO_PORT), (uint8_t)u32);
     3597    uint8_t iRegister =   pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     3598                        ? Port - LSILOGIC_ISA_IO_PORT
     3599                        : Port - LSILOGIC_SAS_ISA_IO_PORT;
     3600    rc = vboxscsiWriteRegister(&pThis->VBoxSCSI, iRegister, (uint8_t)u32);
    35953601    if (rc == VERR_MORE_DATA)
    35963602    {
    3597         rc = lsilogicPrepareBIOSSCSIRequest(pLsiLogic);
     3603        rc = lsilogicPrepareBIOSSCSIRequest(pThis);
    35983604        AssertRC(rc);
    35993605    }
     
    36103616static DECLCALLBACK(int) lsilogicIsaIOPortWriteStr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, RTGCPTR *pGCPtrSrc, PRTGCUINTREG pcTransfer, unsigned cb)
    36113617{
    3612     PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
     3618    PLSILOGICSCSI pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    36133619    int rc;
    36143620
     
    36163622          pDevIns->iInstance, __FUNCTION__, pvUser, cb, Port));
    36173623
    3618     rc = vboxscsiWriteString(pDevIns, &pLsiLogic->VBoxSCSI, (Port - LSILOGIC_ISA_IO_PORT),
     3624    uint8_t iRegister =   pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     3625                        ? Port - LSILOGIC_ISA_IO_PORT
     3626                        : Port - LSILOGIC_SAS_ISA_IO_PORT;
     3627    rc = vboxscsiWriteString(pDevIns, &pThis->VBoxSCSI, iRegister,
    36193628                             pGCPtrSrc, pcTransfer, cb);
    36203629    if (rc == VERR_MORE_DATA)
    36213630    {
    3622         rc = lsilogicPrepareBIOSSCSIRequest(pLsiLogic);
     3631        rc = lsilogicPrepareBIOSSCSIRequest(pThis);
    36233632        AssertRC(rc);
    36243633    }
     
    36353644static DECLCALLBACK(int) lsilogicIsaIOPortReadStr(PPDMDEVINS pDevIns, void *pvUser, RTIOPORT Port, RTGCPTR *pGCPtrDst, PRTGCUINTREG pcTransfer, unsigned cb)
    36363645{
    3637     PLSILOGICSCSI pLsiLogic = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
     3646    PLSILOGICSCSI pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    36383647
    36393648    LogFlowFunc(("#%d %s: pvUser=%#p cb=%d Port=%#x\n",
    36403649                 pDevIns->iInstance, __FUNCTION__, pvUser, cb, Port));
    36413650
    3642     return vboxscsiReadString(pDevIns, &pLsiLogic->VBoxSCSI, (Port - LSILOGIC_ISA_IO_PORT),
     3651    uint8_t iRegister =   pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     3652                        ? Port - LSILOGIC_ISA_IO_PORT
     3653                        : Port - LSILOGIC_SAS_ISA_IO_PORT;
     3654    return vboxscsiReadString(pDevIns, &pThis->VBoxSCSI, iRegister,
    36433655                              pGCPtrDst, pcTransfer, cb);
    36443656}
     
    36513663    PLSILOGICSCSI  pThis = PDMINS_2_DATA(pDevIns, PLSILOGICSCSI);
    36523664    int   rc = VINF_SUCCESS;
     3665    const char *pcszCtrl = pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     3666                           ? "LsiLogic"
     3667                           : "LsiLogicSas";
     3668    const char *pcszDiag = pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     3669                           ? "LsiLogicDiag"
     3670                           : "LsiLogicSasDiag";
    36533671
    36543672    Log2(("%s: registering area at GCPhysAddr=%RGp cb=%u\n", __FUNCTION__, GCPhysAddress, cb));
     
    36623680        /* We use the assigned size here, because we currently only support page aligned MMIO ranges. */
    36633681        rc = PDMDevHlpMMIORegister(pDevIns, GCPhysAddress, cb, NULL,
    3664                                    lsilogicMMIOWrite, lsilogicMMIORead, NULL, "LsiLogic");
     3682                                   lsilogicMMIOWrite, lsilogicMMIORead, NULL, pcszCtrl);
    36653683        if (RT_FAILURE(rc))
    36663684            return rc;
     
    36883706        /* We use the assigned size here, because we currently only support page aligned MMIO ranges. */
    36893707        rc = PDMDevHlpMMIORegister(pDevIns, GCPhysAddress, cb, NULL,
    3690                                    lsilogicDiagnosticWrite, lsilogicDiagnosticRead, NULL, "LsiLogicDiag");
     3708                                   lsilogicDiagnosticWrite, lsilogicDiagnosticRead, NULL, pcszDiag);
    36913709        if (RT_FAILURE(rc))
    36923710            return rc;
     
    37113729    {
    37123730        rc = PDMDevHlpIOPortRegister(pDevIns, (RTIOPORT)GCPhysAddress, LSILOGIC_PCI_SPACE_IO_SIZE,
    3713                                      NULL, lsilogicIOPortWrite, lsilogicIOPortRead, NULL, NULL, "LsiLogic");
     3731                                     NULL, lsilogicIOPortWrite, lsilogicIOPortRead, NULL, NULL, pcszCtrl);
    37143732        if (RT_FAILURE(rc))
    37153733            return rc;
     
    37183736        {
    37193737            rc = PDMDevHlpIOPortRegisterR0(pDevIns, (RTIOPORT)GCPhysAddress, LSILOGIC_PCI_SPACE_IO_SIZE,
    3720                                            0, "lsilogicIOPortWrite", "lsilogicIOPortRead", NULL, NULL, "LsiLogic");
     3738                                           0, "lsilogicIOPortWrite", "lsilogicIOPortRead", NULL, NULL, pcszCtrl);
    37213739            if (RT_FAILURE(rc))
    37223740                return rc;
     
    37263744        {
    37273745            rc = PDMDevHlpIOPortRegisterRC(pDevIns, (RTIOPORT)GCPhysAddress, LSILOGIC_PCI_SPACE_IO_SIZE,
    3728                                            0, "lsilogicIOPortWrite", "lsilogicIOPortRead", NULL, NULL, "LsiLogic");
     3746                                           0, "lsilogicIOPortWrite", "lsilogicIOPortRead", NULL, NULL, pcszCtrl);
    37293747            if (RT_FAILURE(rc))
    37303748                return rc;
     
    45124530    /* Intialize task queue. */
    45134531    rc = PDMDevHlpQueueCreate(pDevIns, sizeof(PDMQUEUEITEMCORE), 2, 0,
    4514                               lsilogicNotifyQueueConsumer, true, "LsiLogic-Task", &pThis->pNotificationQueueR3);
     4532                              lsilogicNotifyQueueConsumer, true,
     4533                              pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     4534                              ? "LsiLogic-Task"
     4535                              : "LsiLogicSAS-Task",
     4536                              &pThis->pNotificationQueueR3);
    45154537    if (RT_FAILURE(rc))
    45164538        return rc;
     
    45494571     * Create critical sections protecting the reply post and free queues.
    45504572     */
    4551     rc = PDMDevHlpCritSectInit(pDevIns, &pThis->ReplyFreeQueueCritSect, RT_SRC_POS, "LsiLogicRFQ");
     4573    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->ReplyFreeQueueCritSect, RT_SRC_POS,
     4574                               pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     4575                               ? "LsiLogicRFQ"
     4576                               : "LsiLogicSasRFQ");
    45524577    if (RT_FAILURE(rc))
    45534578        return PDMDEV_SET_ERROR(pDevIns, rc,
    45544579                                N_("LsiLogic: cannot create critical section for reply free queue"));
    45554580
    4556     rc = PDMDevHlpCritSectInit(pDevIns, &pThis->ReplyPostQueueCritSect, RT_SRC_POS, "LsiLogicRPQ");
     4581    rc = PDMDevHlpCritSectInit(pDevIns, &pThis->ReplyPostQueueCritSect, RT_SRC_POS,
     4582                               pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI
     4583                               ? "LsiLogicRPQ"
     4584                               : "LsiLogicSasRPQ");
    45574585    if (RT_FAILURE(rc))
    45584586        return PDMDEV_SET_ERROR(pDevIns, rc,
     
    46374665
    46384666    /* Register I/O port space in ISA region for BIOS access. */
    4639     rc = PDMDevHlpIOPortRegister(pDevIns, LSILOGIC_ISA_IO_PORT, 3, NULL,
    4640                                  lsilogicIsaIOPortWrite, lsilogicIsaIOPortRead,
    4641                                  lsilogicIsaIOPortWriteStr, lsilogicIsaIOPortReadStr,
    4642                                  "LsiLogic BIOS");
     4667    if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SPI)
     4668        rc = PDMDevHlpIOPortRegister(pDevIns, LSILOGIC_ISA_IO_PORT, 3, NULL,
     4669                                     lsilogicIsaIOPortWrite, lsilogicIsaIOPortRead,
     4670                                     lsilogicIsaIOPortWriteStr, lsilogicIsaIOPortReadStr,
     4671                                     "LsiLogic BIOS");
     4672    else if (pThis->enmCtrlType == LSILOGICCTRLTYPE_SCSI_SAS)
     4673        rc = PDMDevHlpIOPortRegister(pDevIns, LSILOGIC_SAS_ISA_IO_PORT, 3, NULL,
     4674                                     lsilogicIsaIOPortWrite, lsilogicIsaIOPortRead,
     4675                                     lsilogicIsaIOPortWriteStr, lsilogicIsaIOPortReadStr,
     4676                                     "LsiLogic SAS BIOS");
     4677    else
     4678        AssertMsgFailed(("Invalid controller type %d\n", pThis->enmCtrlType));
     4679
    46434680    if (RT_FAILURE(rc))
    46444681        return PDMDEV_SET_ERROR(pDevIns, rc, N_("LsiLogic cannot register legacy I/O handlers"));
     
    46604697
    46614698/**
    4662  * The device registration structure.
     4699 * The device registration structure - SPI SCSI controller.
    46634700 */
    46644701const PDMDEVREG g_DeviceLsiLogicSCSI =
     
    47144751};
    47154752
     4753/**
     4754 * The device registration structure - SAS controller.
     4755 */
     4756const PDMDEVREG g_DeviceLsiLogicSAS =
     4757{
     4758    /* u32Version */
     4759    PDM_DEVREG_VERSION,
     4760    /* szName */
     4761    "lsilogicsas",
     4762    /* szRCMod */
     4763    "VBoxDDGC.gc",
     4764    /* szR0Mod */
     4765    "VBoxDDR0.r0",
     4766    /* pszDescription */
     4767    "LSI Logic SAS1068 controller.\n",
     4768    /* fFlags */
     4769    PDM_DEVREG_FLAGS_DEFAULT_BITS | PDM_DEVREG_FLAGS_RC | PDM_DEVREG_FLAGS_R0,
     4770    /* fClass */
     4771    PDM_DEVREG_CLASS_STORAGE,
     4772    /* cMaxInstances */
     4773    ~0,
     4774    /* cbInstance */
     4775    sizeof(LSILOGICSCSI),
     4776    /* pfnConstruct */
     4777    lsilogicConstruct,
     4778    /* pfnDestruct */
     4779    lsilogicDestruct,
     4780    /* pfnRelocate */
     4781    lsilogicRelocate,
     4782    /* pfnIOCtl */
     4783    NULL,
     4784    /* pfnPowerOn */
     4785    NULL,
     4786    /* pfnReset */
     4787    lsilogicReset,
     4788    /* pfnSuspend */
     4789    NULL,
     4790    /* pfnResume */
     4791    NULL,
     4792    /* pfnAttach */
     4793    lsilogicAttach,
     4794    /* pfnDetach */
     4795    lsilogicDetach,
     4796    /* pfnQueryInterface. */
     4797    NULL,
     4798    /* pfnInitComplete */
     4799    NULL,
     4800    /* pfnPowerOff */
     4801    NULL,
     4802    /* pfnSoftReset */
     4803    NULL,
     4804    /* u32VersionEnd */
     4805    PDM_DEVREG_VERSION
     4806};
     4807
    47164808#endif /* IN_RING3 */
    47174809#endif /* !VBOX_DEVICE_STRUCT_TESTCASE */
  • trunk/src/VBox/Devices/Storage/DevLsiLogicSCSI.h

    r28800 r29326  
    2525 */
    2626#define LSILOGIC_ISA_IO_PORT 0x340
     27#define LSILOGIC_SAS_ISA_IO_PORT 0x350
    2728
    2829#define LSILOGICSCSI_REQUEST_QUEUE_DEPTH_DEFAULT 1024
  • trunk/src/VBox/Main/ConsoleImpl.cpp

    r29292 r29326  
    31063106    {
    31073107        case StorageControllerType_LsiLogic:
    3108         case StorageControllerType_LsiLogicSas:
    31093108            return "lsilogicscsi";
    31103109        case StorageControllerType_BusLogic:
    31113110            return "buslogic";
     3111        case StorageControllerType_LsiLogicSas:
     3112            return "lsilogicsas";
    31123113        case StorageControllerType_IntelAhci:
    31133114            return "ahci";
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