VirtualBox

Changeset 21820 in vbox for trunk/src/VBox/Devices/PC


Ignore:
Timestamp:
Jul 27, 2009 4:18:55 PM (16 years ago)
Author:
vboxsync
Message:

ACPI: implement remappable PM device, better saved states, need some more testing

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/src/VBox/Devices/PC/DevACPI.cpp

    r21782 r21820  
    55
    66/*
    7  * Copyright (C) 2006-2007 Sun Microsystems, Inc.
     7 * Copyright (C) 2006-2009 Sun Microsystems, Inc.
    88 *
    99 * This file is part of VirtualBox Open Source Edition (OSE), as
     
    5555
    5656#define PM_TMR_FREQ     3579545
    57 #define PM1a_EVT_BLK    0x00004000
    58 #define PM1b_EVT_BLK    0x00000000              /**< not supported */
    59 #define PM1a_CTL_BLK    0x00004004
    60 #define PM1b_CTL_BLK    0x00000000              /**< not supported */
    61 #define PM2_CTL_BLK     0x00000000              /**< not supported */
    62 #define PM_TMR_BLK      0x00004008
    63 #define GPE0_BLK        0x00004020
    64 #define GPE1_BLK        0x00000000              /**< not supported */
     57/* Default base for PM PIIX4 device */
     58#define PM_PORT_BASE    0x00004000
     59/* Port offsets in PM device */
     60enum
     61{
     62    PM1a_EVT_OFFSET                     = 0x00,       
     63    PM1b_EVT_OFFSET                     =   -1,   /**<  not supported  */
     64    PM1a_CTL_OFFSET                     = 0x04,
     65    PM1b_CTL_OFFSET                     =   -1,   /**<  not supported  */
     66    PM2_CTL_OFFSET                      =   -1,   /**<  not supported  */
     67    PM_TMR_OFFSET                       = 0x08,
     68    GPE0_OFFSET                         = 0x20,
     69    GPE1_OFFSET                         =   -1   /**<  not supported  */
     70};
     71
    6572#define BAT_INDEX       0x00004040
    6673#define BAT_DATA        0x00004044
     
    217224    /** If Real Time Clock ACPI object to be shown */
    218225    bool                fShowRtc;
     226    /** I/O port address of PM device. */
     227    RTIOPORT            uPmIoPortBase;
     228    /** Flag whether the GC part of the device is enabled. */
     229    bool                fGCEnabled;
     230    /** Flag whether the R0 part of the device is enabled. */
     231    bool                fR0Enabled;
    219232    /** Aligning IBase. */
    220     bool                afAlignment[5];
     233    bool                afAlignment[1];
    221234
    222235    /** ACPI port base interface. */
     
    230243    /** Pointer to the driver connector interface */
    231244    R3PTRTYPE(PPDMIACPICONNECTOR) pDrv;
     245   
     246    /* Pointer to default PCI config read function */
     247    R3PTRTYPE(PFNPCICONFIGREAD)   pfnAcpiPciConfigRead;
     248    /* Pointer to default PCI config write function */
     249    R3PTRTYPE(PFNPCICONFIGWRITE)  pfnAcpiPciConfigWrite;
    232250} ACPIState;
    233251
     
    574592#ifdef IN_RING3
    575593
     594static RTIOPORT acpiPmPort(ACPIState* pAcpi, int32_t offset)
     595{
     596    Assert(pAcpi->uPmIoPortBase != 0);
     597   
     598    if (offset == -1)
     599        return 0;
     600
     601    return RTIOPORT(pAcpi->uPmIoPortBase + offset);
     602}
     603
    576604/* Simple acpiChecksum: all the bytes must add up to 0. */
    577605static uint8_t acpiChecksum(const uint8_t * const data, size_t len)
     
    657685    fadt.u8S4BIOSReq          = 0;
    658686    fadt.u8PStateCnt          = 0;
    659     fadt.u32PM1aEVTBLK        = RT_H2LE_U32(PM1a_EVT_BLK);
    660     fadt.u32PM1bEVTBLK        = RT_H2LE_U32(PM1b_EVT_BLK);
    661     fadt.u32PM1aCTLBLK        = RT_H2LE_U32(PM1a_CTL_BLK);
    662     fadt.u32PM1bCTLBLK        = RT_H2LE_U32(PM1b_CTL_BLK);
    663     fadt.u32PM2CTLBLK         = RT_H2LE_U32(PM2_CTL_BLK);
    664     fadt.u32PMTMRBLK          = RT_H2LE_U32(PM_TMR_BLK);
    665     fadt.u32GPE0BLK           = RT_H2LE_U32(GPE0_BLK);
    666     fadt.u32GPE1BLK           = RT_H2LE_U32(GPE1_BLK);
     687    fadt.u32PM1aEVTBLK        = RT_H2LE_U32(acpiPmPort(s, PM1a_EVT_OFFSET));
     688    fadt.u32PM1bEVTBLK        = RT_H2LE_U32(acpiPmPort(s, PM1b_EVT_OFFSET));
     689    fadt.u32PM1aCTLBLK        = RT_H2LE_U32(acpiPmPort(s, PM1a_CTL_OFFSET));
     690    fadt.u32PM1bCTLBLK        = RT_H2LE_U32(acpiPmPort(s, PM1b_CTL_OFFSET));
     691    fadt.u32PM2CTLBLK         = RT_H2LE_U32(acpiPmPort(s, PM2_CTL_OFFSET));
     692    fadt.u32PMTMRBLK          = RT_H2LE_U32(acpiPmPort(s, PM_TMR_OFFSET));
     693    fadt.u32GPE0BLK           = RT_H2LE_U32(acpiPmPort(s, GPE0_OFFSET));
     694    fadt.u32GPE1BLK           = RT_H2LE_U32(acpiPmPort(s, GPE1_OFFSET));
    667695    fadt.u8PM1EVTLEN          = 4;
    668696    fadt.u8PM1CTLLEN          = 2;
     
    691719    fadt.u64XFACS             = RT_H2LE_U64((uint64_t)facs_addr);
    692720    fadt.u64XDSDT             = RT_H2LE_U64((uint64_t)dsdt_addr);
    693     acpiWriteGenericAddr(&fadt.X_PM1aEVTBLK, 1, 32, 0, 2, PM1a_EVT_BLK);
    694     acpiWriteGenericAddr(&fadt.X_PM1bEVTBLK, 0,  0, 0, 0, PM1b_EVT_BLK);
    695     acpiWriteGenericAddr(&fadt.X_PM1aCTLBLK, 1, 16, 0, 2, PM1a_CTL_BLK);
    696     acpiWriteGenericAddr(&fadt.X_PM1bCTLBLK, 0,  0, 0, 0, PM1b_CTL_BLK);
    697     acpiWriteGenericAddr(&fadt.X_PM2CTLBLK,  0,  0, 0, 0,  PM2_CTL_BLK);
    698     acpiWriteGenericAddr(&fadt.X_PMTMRBLK,   1, 32, 0, 3,   PM_TMR_BLK);
    699     acpiWriteGenericAddr(&fadt.X_GPE0BLK,    1, 16, 0, 1,     GPE0_BLK);
    700     acpiWriteGenericAddr(&fadt.X_GPE1BLK,    0,  0, 0, 0,     GPE1_BLK);
     721    acpiWriteGenericAddr(&fadt.X_PM1aEVTBLK, 1, 32, 0, 2, acpiPmPort(s, PM1a_EVT_OFFSET));
     722    acpiWriteGenericAddr(&fadt.X_PM1bEVTBLK, 0,  0, 0, 0, acpiPmPort(s, PM1b_EVT_OFFSET));
     723    acpiWriteGenericAddr(&fadt.X_PM1aCTLBLK, 1, 16, 0, 2, acpiPmPort(s, PM1a_CTL_OFFSET));
     724    acpiWriteGenericAddr(&fadt.X_PM1bCTLBLK, 0,  0, 0, 0, acpiPmPort(s, PM1b_CTL_OFFSET));
     725    acpiWriteGenericAddr(&fadt.X_PM2CTLBLK,  0,  0, 0, 0, acpiPmPort(s, PM2_CTL_OFFSET));
     726    acpiWriteGenericAddr(&fadt.X_PMTMRBLK,   1, 32, 0, 3, acpiPmPort(s, PM_TMR_OFFSET));
     727    acpiWriteGenericAddr(&fadt.X_GPE0BLK,    1, 16, 0, 1, acpiPmPort(s, GPE0_OFFSET));
     728    acpiWriteGenericAddr(&fadt.X_GPE1BLK,    0,  0, 0, 0, acpiPmPort(s, GPE1_OFFSET));
    701729    fadt.header.u8Checksum    = acpiChecksum((uint8_t *)&fadt, sizeof(fadt));
    702730    acpiPhyscpy(s, addr_acpi2, &fadt, sizeof(fadt));
     
    10721100}
    10731101
    1074 static void acpiPMTimerReset(ACPIState *s)
     1102static int acpiPMTimerReset(ACPIState *s)
    10751103{
    10761104    uint64_t interval, freq;
     
    10801108    Log(("interval = %RU64\n", interval));
    10811109    TMTimerSet(s->CTX_SUFF(ts), TMTimerGet(s->CTX_SUFF(ts)) + interval);
     1110
     1111    return VINF_SUCCESS;
    10821112}
    10831113
     
    10971127 * _BST method.
    10981128 */
    1099 static void acpiFetchBatteryStatus(ACPIState *s)
     1129static int acpiFetchBatteryStatus(ACPIState *s)
    11001130{
    11011131    uint32_t           *p = s->au8BatteryInfo;
     
    11071137
    11081138    if (!s->pDrv)
    1109         return;
     1139        return VINF_SUCCESS;
    11101140    rc = s->pDrv->pfnQueryBatteryStatus(s->pDrv, &fPresent, &hostRemainingCapacity,
    11111141                                        &hostBatteryState, &hostPresentRate);
     
    11241154    if (hostBatteryState == PDM_ACPI_BAT_STATE_CHARGED)
    11251155        p[BAT_STATUS_PRESENT_RATE] = 0; /* mV */
     1156
     1157    return VINF_SUCCESS;
    11261158}
    11271159
     
    11291161 * _BIF method.
    11301162 */
    1131 static void acpiFetchBatteryInfo(ACPIState *s)
     1163static int acpiFetchBatteryInfo(ACPIState *s)
    11321164{
    11331165    uint32_t *p = s->au8BatteryInfo;
     
    11421174    p[BAT_INFO_CAPACITY_GRANULARITY_1]     = 1;     /* mWh */
    11431175    p[BAT_INFO_CAPACITY_GRANULARITY_2]     = 1;     /* mWh */
     1176
     1177    return VINF_SUCCESS;
    11441178}
    11451179
     
    16291663#endif /* DEBUG_ACPI */
    16301664
     1665static int acpiRegisterPmHandlers(ACPIState*  pThis)
     1666{
     1667    int   rc = VINF_SUCCESS;
     1668
     1669#define R(offset, cnt, writer, reader, description) \
     1670    do { \
     1671        rc = PDMDevHlpIOPortRegister(pThis->pDevIns, acpiPmPort(pThis, offset), cnt, pThis, writer, reader, \
     1672                                      NULL, NULL, description); \
     1673        if (RT_FAILURE(rc)) \
     1674            return rc; \
     1675    } while (0)
     1676#define L       (GPE0_BLK_LEN / 2)
     1677
     1678    R(PM1a_EVT_OFFSET+2, 1, acpiPM1aEnWrite,       acpiPm1aEnRead,      "ACPI PM1a Enable");
     1679    R(PM1a_EVT_OFFSET,   1, acpiPM1aStsWrite,      acpiPm1aStsRead,     "ACPI PM1a Status");
     1680    R(PM1a_CTL_OFFSET,   1, acpiPM1aCtlWrite,      acpiPm1aCtlRead,     "ACPI PM1a Control");
     1681    R(PM_TMR_OFFSET,     1, NULL,                  acpiPMTmrRead,       "ACPI PM Timer");
     1682    R(GPE0_OFFSET + L,   L, acpiGpe0EnWrite,       acpiGpe0EnRead,      "ACPI GPE0 Enable");
     1683    R(GPE0_OFFSET,       L, acpiGpe0StsWrite,      acpiGpe0StsRead,     "ACPI GPE0 Status");
     1684#undef L
     1685#undef R
     1686
     1687    /* register GC stuff */
     1688    if (pThis->fGCEnabled)
     1689    {
     1690        rc = PDMDevHlpIOPortRegisterGC(pThis->pDevIns, acpiPmPort(pThis, PM_TMR_OFFSET),
     1691                                       1, 0, NULL, "acpiPMTmrRead",
     1692                                       NULL, NULL, "ACPI PM Timer");
     1693        AssertRCReturn(rc, rc);
     1694    }
     1695
     1696    /* register R0 stuff */
     1697    if (pThis->fR0Enabled)
     1698    {
     1699        rc = PDMDevHlpIOPortRegisterR0(pThis->pDevIns, acpiPmPort(pThis, PM_TMR_OFFSET),
     1700                                       1, 0, NULL, "acpiPMTmrRead",
     1701                                       NULL, NULL, "ACPI PM Timer");
     1702        AssertRCReturn(rc, rc);
     1703    }
     1704
     1705    return rc;
     1706}
     1707
     1708static int acpiUnregisterPmHandlers(ACPIState*  pThis)
     1709{
     1710    int   rc = VINF_SUCCESS;
     1711
     1712#define U(offset, cnt)     \
     1713    do { \
     1714        rc = PDMDevHlpIOPortDeregister(pThis->pDevIns, acpiPmPort(pThis, offset), cnt); \
     1715        if (RT_FAILURE(rc)) \
     1716            return rc; \
     1717    } while (0)
     1718#define L       (GPE0_BLK_LEN / 2)
     1719
     1720    U(PM1a_EVT_OFFSET+2, 1);
     1721    U(PM1a_EVT_OFFSET,   1);
     1722    U(PM1a_CTL_OFFSET,   1);
     1723    U(PM_TMR_OFFSET,     1);
     1724    U(GPE0_OFFSET + L,   L);
     1725    U(GPE0_OFFSET,       L);
     1726#undef L
     1727#undef U
     1728
     1729    /* no need to explicitly unregister R0/GC handlers, as pfnIOPortDeregister() claim to unregister both */
     1730   
     1731    return rc;
     1732}
    16311733
    16321734/**
    1633  * Saved state structure description.
     1735 * Saved state structure description, version 4.
    16341736 */
    1635 static const SSMFIELD g_AcpiSavedStateFields[] =
     1737static const SSMFIELD g_AcpiSavedStateFields4[] =
    16361738{
    16371739    SSMFIELD_ENTRY(ACPIState, pm1a_en),
     
    16501752};
    16511753
     1754/**
     1755 * Saved state structure description, version 5.
     1756 */
     1757static const SSMFIELD g_AcpiSavedStateFields5[] =
     1758{
     1759    SSMFIELD_ENTRY(ACPIState, pm1a_en),
     1760    SSMFIELD_ENTRY(ACPIState, pm1a_sts),
     1761    SSMFIELD_ENTRY(ACPIState, pm1a_ctl),
     1762    SSMFIELD_ENTRY(ACPIState, cCpus),
     1763    SSMFIELD_ENTRY(ACPIState, pm_timer_initial),
     1764    SSMFIELD_ENTRY(ACPIState, gpe0_en),
     1765    SSMFIELD_ENTRY(ACPIState, gpe0_sts),
     1766    SSMFIELD_ENTRY(ACPIState, uBatteryIndex),
     1767    SSMFIELD_ENTRY(ACPIState, uSystemInfoIndex),
     1768    SSMFIELD_ENTRY(ACPIState, u64RamSize),
     1769    SSMFIELD_ENTRY(ACPIState, uSleepState),
     1770    SSMFIELD_ENTRY(ACPIState, u8IndexShift),
     1771    SSMFIELD_ENTRY(ACPIState, u8UseIOApic),
     1772    SSMFIELD_ENTRY(ACPIState, fUseFdc),
     1773    SSMFIELD_ENTRY(ACPIState, fUseHpet),
     1774    SSMFIELD_ENTRY(ACPIState, fUseSmc),
     1775    SSMFIELD_ENTRY(ACPIState, fShowCpu),
     1776    SSMFIELD_ENTRY(ACPIState, fShowRtc),
     1777    SSMFIELD_ENTRY(ACPIState, uPmIoPortBase),
     1778    SSMFIELD_ENTRY(ACPIState, fGCEnabled),
     1779    SSMFIELD_ENTRY(ACPIState, fR0Enabled),
     1780    SSMFIELD_ENTRY_TERM()
     1781};
     1782
     1783
    16521784static DECLCALLBACK(int) acpi_save_state(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle)
    16531785{
    16541786    ACPIState *s = PDMINS_2_DATA(pDevIns, ACPIState *);
    1655     return SSMR3PutStruct(pSSMHandle, s, &g_AcpiSavedStateFields[0]);
     1787    return SSMR3PutStruct(pSSMHandle, s, &g_AcpiSavedStateFields5[0]);
    16561788}
    16571789
     
    16621794    int rc;
    16631795
    1664     if (u32Version != 4)
     1796    if (u32Version != 4 && u32Version != 5)
    16651797        return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION;
    16661798
    1667     rc = SSMR3GetStruct(pSSMHandle, s, &g_AcpiSavedStateFields[0]);
     1799    switch (u32Version)
     1800    {
     1801        case 4:
     1802            rc = SSMR3GetStruct(pSSMHandle, s, &g_AcpiSavedStateFields4[0]);
     1803            /** @todo: provide saner defaults for fields not found in saved state */
     1804            break;
     1805        case 5:
     1806            rc = SSMR3GetStruct(pSSMHandle, s, &g_AcpiSavedStateFields5[0]);
     1807            break;
     1808    }
    16681809    if (RT_SUCCESS(rc))
    16691810    {
    1670         acpiFetchBatteryStatus(s);
    1671         acpiFetchBatteryInfo(s);
    1672         acpiPMTimerReset(s);
     1811        rc = acpiRegisterPmHandlers(s);
     1812        if (RT_FAILURE(rc))
     1813            return rc;
     1814        rc = acpiFetchBatteryStatus(s);
     1815        if (RT_FAILURE(rc))
     1816            return rc;
     1817        rc = acpiFetchBatteryInfo(s);
     1818        if (RT_FAILURE(rc))
     1819            return rc;
     1820        rc = acpiPMTimerReset(s);
     1821        if (RT_FAILURE(rc))
     1822            return rc;
    16731823    }
    16741824    return rc;
     
    18001950        return rc;
    18011951    return acpiSetupXSDT(s, xsdt_addr + addend, cAddr, xsdt_addrs);
     1952}
     1953
     1954static uint32_t acpiPciConfigRead(PPCIDEVICE pPciDev, uint32_t Address, unsigned cb)
     1955{
     1956    PPDMDEVINS pDevIns = pPciDev->pDevIns;
     1957    ACPIState*  pThis = PDMINS_2_DATA(pDevIns, ACPIState *);
     1958
     1959    return pThis->pfnAcpiPciConfigRead(pPciDev, Address, cb);
     1960}
     1961
     1962static void acpiPciConfigWrite(PPCIDEVICE pPciDev, uint32_t Address, uint32_t u32Value, unsigned cb)
     1963{
     1964    PPDMDEVINS pDevIns = pPciDev->pDevIns;
     1965    ACPIState*  pThis = PDMINS_2_DATA(pDevIns, ACPIState *);
     1966
     1967    if (Address == 0x40)
     1968    {
     1969        pThis->uPmIoPortBase = u32Value & 0xffc0;
     1970    }
     1971
     1972    if (Address == 0x80)
     1973    {
     1974        if (u32Value & 1)
     1975        {
     1976            int rc;
     1977
     1978            acpiUnregisterPmHandlers(pThis);
     1979           
     1980            rc = acpiRegisterPmHandlers(pThis);       
     1981            Assert(RT_SUCCESS(rc));
     1982        }
     1983    }
     1984
     1985    pThis->pfnAcpiPciConfigWrite(pPciDev, Address, u32Value, cb);
    18021986}
    18031987
     
    18792063                                N_("Configuration error: Failed to read \"ShowCpu\""));   
    18802064
    1881     bool fGCEnabled;
    1882     rc = CFGMR3QueryBool(pCfgHandle, "GCEnabled", &fGCEnabled);
     2065    rc = CFGMR3QueryBool(pCfgHandle, "GCEnabled", &s->fGCEnabled);
    18832066    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1884         fGCEnabled = true;
     2067        s->fGCEnabled = true;
    18852068    else if (RT_FAILURE(rc))
    18862069        return PDMDEV_SET_ERROR(pDevIns, rc,
    18872070                                N_("Configuration error: Failed to read \"GCEnabled\""));
    18882071
    1889     bool fR0Enabled;
    1890     rc = CFGMR3QueryBool(pCfgHandle, "R0Enabled", &fR0Enabled);
     2072    rc = CFGMR3QueryBool(pCfgHandle, "R0Enabled", &s->fR0Enabled);
    18912073    if (rc == VERR_CFGM_VALUE_NOT_FOUND)
    1892         fR0Enabled = true;
     2074        s->fR0Enabled = true;
    18932075    else if (RT_FAILURE(rc))
    18942076        return PDMDEV_SET_ERROR(pDevIns, rc,
    18952077                                N_("configuration error: failed to read R0Enabled as boolean"));
     2078
     2079    /* Set default port base */
     2080    s->uPmIoPortBase = PM_PORT_BASE;
    18962081
    18972082    /* */
     
    19102095        return rc;
    19112096
    1912 #define R(addr, cnt, writer, reader, description) \
     2097    rc = acpiRegisterPmHandlers(s);
     2098    if (RT_FAILURE(rc))
     2099        return rc;
     2100
     2101#define R(addr, cnt, writer, reader, description)       \
    19132102    do { \
    19142103        rc = PDMDevHlpIOPortRegister(pDevIns, addr, cnt, s, writer, reader, \
     
    19172106            return rc; \
    19182107    } while (0)
    1919 #define L       (GPE0_BLK_LEN / 2)
    1920 
    1921     R(PM1a_EVT_BLK+2, 1, acpiPM1aEnWrite,       acpiPm1aEnRead,      "ACPI PM1a Enable");
    1922     R(PM1a_EVT_BLK,   1, acpiPM1aStsWrite,      acpiPm1aStsRead,     "ACPI PM1a Status");
    1923     R(PM1a_CTL_BLK,   1, acpiPM1aCtlWrite,      acpiPm1aCtlRead,     "ACPI PM1a Control");
    1924     R(PM_TMR_BLK,     1, NULL,                  acpiPMTmrRead,       "ACPI PM Timer");
    19252108    R(SMI_CMD,        1, acpiSmiWrite,          NULL,                "ACPI SMI");
    19262109#ifdef DEBUG_ACPI
     
    19322115    R(SYSI_INDEX,     1, acpiSysInfoIndexWrite, NULL,                "ACPI system info index");
    19332116    R(SYSI_DATA,      1, acpiSysInfoDataWrite,  acpiSysInfoDataRead, "ACPI system info data");
    1934     R(GPE0_BLK + L,   L, acpiGpe0EnWrite,       acpiGpe0EnRead,      "ACPI GPE0 Enable");
    1935     R(GPE0_BLK,       L, acpiGpe0StsWrite,      acpiGpe0StsRead,     "ACPI GPE0 Status");
    19362117    R(ACPI_RESET_BLK, 1, acpiResetWrite,        NULL,                "ACPI Reset");
    1937 #undef L
    19382118#undef R
    1939 
    1940     /* register GC stuff */
    1941     if (fGCEnabled)
    1942     {
    1943         rc = PDMDevHlpIOPortRegisterGC(pDevIns, PM_TMR_BLK, 1, 0, NULL, "acpiPMTmrRead",
    1944                                        NULL, NULL, "ACPI PM Timer");
    1945         AssertRCReturn(rc, rc);
    1946     }
    1947 
    1948     /* register R0 stuff */
    1949     if (fR0Enabled)
    1950     {
    1951         rc = PDMDevHlpIOPortRegisterR0(pDevIns, PM_TMR_BLK, 1, 0, NULL, "acpiPMTmrRead",
    1952                                        NULL, NULL, "ACPI PM Timer");
    1953         AssertRCReturn(rc, rc);
    1954     }
    19552119
    19562120    rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, acpiTimer, dev,
     
    19702134    PCIDevSetDeviceId(dev, 0x7113); /* 82371AB */
    19712135
     2136    /* See p. 50 of PIIX4 manual */
    19722137    dev->config[0x04] = 0x01; /* command */
    19732138    dev->config[0x05] = 0x00;
     
    19752140    dev->config[0x06] = 0x80; /* status */
    19762141    dev->config[0x07] = 0x02;
    1977     dev->config[0x08] = 0x08;
    1978     dev->config[0x09] = 0x00;
    1979 
     2142
     2143    dev->config[0x08] = 0x08; /* revision number */
     2144
     2145    dev->config[0x09] = 0x00; /* class code */
    19802146    dev->config[0x0a] = 0x80;
    19812147    dev->config[0x0b] = 0x06;
    19822148
    1983     dev->config[0x0e] = 0x80;
    1984     dev->config[0x0f] = 0x00;
    1985 
    1986 #if 0 /* The ACPI controller usually has no subsystem ID. */
    1987     dev->config[0x2c] = 0x86;
    1988     dev->config[0x2d] = 0x80;
    1989     dev->config[0x2e] = 0x00;
    1990     dev->config[0x2f] = 0x00;
     2149    dev->config[0x0e] = 0x80; /* header type */
     2150
     2151    dev->config[0x0f] = 0x00; /* reserved */
     2152
     2153    dev->config[0x3c] = SCI_INT; /* interrupt line */
     2154
     2155#if 0
     2156    dev->config[0x3d] = 0x01;    /* interrupt pin */
    19912157#endif
    1992     dev->config[0x3c] = SCI_INT;
     2158
     2159    dev->config[0x40] = 0x01; /* PM base address, this bit marks it as IO range, not PA */
    19932160
    19942161    rc = PDMDevHlpPCIRegister(pDevIns, dev);
     
    19962163        return rc;
    19972164
    1998     rc = PDMDevHlpSSMRegister(pDevIns, pDevIns->pDevReg->szDeviceName, iInstance, 4, sizeof(*s),
     2165    PDMDevHlpPCISetConfigCallbacks(pDevIns, dev,
     2166                                   acpiPciConfigRead,  &s->pfnAcpiPciConfigRead,
     2167                                   acpiPciConfigWrite, &s->pfnAcpiPciConfigWrite);
     2168
     2169    rc = PDMDevHlpSSMRegister(pDevIns, pDevIns->pDevReg->szDeviceName, iInstance, 5, sizeof(*s),
    19992170                              NULL, acpi_save_state, NULL, NULL, acpi_load_state,  NULL);
    20002171    if (RT_FAILURE(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