Changeset 21820 in vbox for trunk/src/VBox/Devices/PC
- Timestamp:
- Jul 27, 2009 4:18:55 PM (16 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
trunk/src/VBox/Devices/PC/DevACPI.cpp
r21782 r21820 5 5 6 6 /* 7 * Copyright (C) 2006-200 7Sun Microsystems, Inc.7 * Copyright (C) 2006-2009 Sun Microsystems, Inc. 8 8 * 9 9 * This file is part of VirtualBox Open Source Edition (OSE), as … … 55 55 56 56 #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 */ 60 enum 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 65 72 #define BAT_INDEX 0x00004040 66 73 #define BAT_DATA 0x00004044 … … 217 224 /** If Real Time Clock ACPI object to be shown */ 218 225 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; 219 232 /** Aligning IBase. */ 220 bool afAlignment[ 5];233 bool afAlignment[1]; 221 234 222 235 /** ACPI port base interface. */ … … 230 243 /** Pointer to the driver connector interface */ 231 244 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; 232 250 } ACPIState; 233 251 … … 574 592 #ifdef IN_RING3 575 593 594 static 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 576 604 /* Simple acpiChecksum: all the bytes must add up to 0. */ 577 605 static uint8_t acpiChecksum(const uint8_t * const data, size_t len) … … 657 685 fadt.u8S4BIOSReq = 0; 658 686 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)); 667 695 fadt.u8PM1EVTLEN = 4; 668 696 fadt.u8PM1CTLLEN = 2; … … 691 719 fadt.u64XFACS = RT_H2LE_U64((uint64_t)facs_addr); 692 720 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)); 701 729 fadt.header.u8Checksum = acpiChecksum((uint8_t *)&fadt, sizeof(fadt)); 702 730 acpiPhyscpy(s, addr_acpi2, &fadt, sizeof(fadt)); … … 1072 1100 } 1073 1101 1074 static voidacpiPMTimerReset(ACPIState *s)1102 static int acpiPMTimerReset(ACPIState *s) 1075 1103 { 1076 1104 uint64_t interval, freq; … … 1080 1108 Log(("interval = %RU64\n", interval)); 1081 1109 TMTimerSet(s->CTX_SUFF(ts), TMTimerGet(s->CTX_SUFF(ts)) + interval); 1110 1111 return VINF_SUCCESS; 1082 1112 } 1083 1113 … … 1097 1127 * _BST method. 1098 1128 */ 1099 static voidacpiFetchBatteryStatus(ACPIState *s)1129 static int acpiFetchBatteryStatus(ACPIState *s) 1100 1130 { 1101 1131 uint32_t *p = s->au8BatteryInfo; … … 1107 1137 1108 1138 if (!s->pDrv) 1109 return ;1139 return VINF_SUCCESS; 1110 1140 rc = s->pDrv->pfnQueryBatteryStatus(s->pDrv, &fPresent, &hostRemainingCapacity, 1111 1141 &hostBatteryState, &hostPresentRate); … … 1124 1154 if (hostBatteryState == PDM_ACPI_BAT_STATE_CHARGED) 1125 1155 p[BAT_STATUS_PRESENT_RATE] = 0; /* mV */ 1156 1157 return VINF_SUCCESS; 1126 1158 } 1127 1159 … … 1129 1161 * _BIF method. 1130 1162 */ 1131 static voidacpiFetchBatteryInfo(ACPIState *s)1163 static int acpiFetchBatteryInfo(ACPIState *s) 1132 1164 { 1133 1165 uint32_t *p = s->au8BatteryInfo; … … 1142 1174 p[BAT_INFO_CAPACITY_GRANULARITY_1] = 1; /* mWh */ 1143 1175 p[BAT_INFO_CAPACITY_GRANULARITY_2] = 1; /* mWh */ 1176 1177 return VINF_SUCCESS; 1144 1178 } 1145 1179 … … 1629 1663 #endif /* DEBUG_ACPI */ 1630 1664 1665 static 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 1708 static 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 } 1631 1733 1632 1734 /** 1633 * Saved state structure description .1735 * Saved state structure description, version 4. 1634 1736 */ 1635 static const SSMFIELD g_AcpiSavedStateFields [] =1737 static const SSMFIELD g_AcpiSavedStateFields4[] = 1636 1738 { 1637 1739 SSMFIELD_ENTRY(ACPIState, pm1a_en), … … 1650 1752 }; 1651 1753 1754 /** 1755 * Saved state structure description, version 5. 1756 */ 1757 static 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 1652 1784 static DECLCALLBACK(int) acpi_save_state(PPDMDEVINS pDevIns, PSSMHANDLE pSSMHandle) 1653 1785 { 1654 1786 ACPIState *s = PDMINS_2_DATA(pDevIns, ACPIState *); 1655 return SSMR3PutStruct(pSSMHandle, s, &g_AcpiSavedStateFields [0]);1787 return SSMR3PutStruct(pSSMHandle, s, &g_AcpiSavedStateFields5[0]); 1656 1788 } 1657 1789 … … 1662 1794 int rc; 1663 1795 1664 if (u32Version != 4 )1796 if (u32Version != 4 && u32Version != 5) 1665 1797 return VERR_SSM_UNSUPPORTED_DATA_UNIT_VERSION; 1666 1798 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 } 1668 1809 if (RT_SUCCESS(rc)) 1669 1810 { 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; 1673 1823 } 1674 1824 return rc; … … 1800 1950 return rc; 1801 1951 return acpiSetupXSDT(s, xsdt_addr + addend, cAddr, xsdt_addrs); 1952 } 1953 1954 static 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 1962 static 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); 1802 1986 } 1803 1987 … … 1879 2063 N_("Configuration error: Failed to read \"ShowCpu\"")); 1880 2064 1881 bool fGCEnabled; 1882 rc = CFGMR3QueryBool(pCfgHandle, "GCEnabled", &fGCEnabled); 2065 rc = CFGMR3QueryBool(pCfgHandle, "GCEnabled", &s->fGCEnabled); 1883 2066 if (rc == VERR_CFGM_VALUE_NOT_FOUND) 1884 fGCEnabled = true;2067 s->fGCEnabled = true; 1885 2068 else if (RT_FAILURE(rc)) 1886 2069 return PDMDEV_SET_ERROR(pDevIns, rc, 1887 2070 N_("Configuration error: Failed to read \"GCEnabled\"")); 1888 2071 1889 bool fR0Enabled; 1890 rc = CFGMR3QueryBool(pCfgHandle, "R0Enabled", &fR0Enabled); 2072 rc = CFGMR3QueryBool(pCfgHandle, "R0Enabled", &s->fR0Enabled); 1891 2073 if (rc == VERR_CFGM_VALUE_NOT_FOUND) 1892 fR0Enabled = true;2074 s->fR0Enabled = true; 1893 2075 else if (RT_FAILURE(rc)) 1894 2076 return PDMDEV_SET_ERROR(pDevIns, rc, 1895 2077 N_("configuration error: failed to read R0Enabled as boolean")); 2078 2079 /* Set default port base */ 2080 s->uPmIoPortBase = PM_PORT_BASE; 1896 2081 1897 2082 /* */ … … 1910 2095 return rc; 1911 2096 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) \ 1913 2102 do { \ 1914 2103 rc = PDMDevHlpIOPortRegister(pDevIns, addr, cnt, s, writer, reader, \ … … 1917 2106 return rc; \ 1918 2107 } 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");1925 2108 R(SMI_CMD, 1, acpiSmiWrite, NULL, "ACPI SMI"); 1926 2109 #ifdef DEBUG_ACPI … … 1932 2115 R(SYSI_INDEX, 1, acpiSysInfoIndexWrite, NULL, "ACPI system info index"); 1933 2116 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");1936 2117 R(ACPI_RESET_BLK, 1, acpiResetWrite, NULL, "ACPI Reset"); 1937 #undef L1938 2118 #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 }1955 2119 1956 2120 rc = PDMDevHlpTMTimerCreate(pDevIns, TMCLOCK_VIRTUAL_SYNC, acpiTimer, dev, … … 1970 2134 PCIDevSetDeviceId(dev, 0x7113); /* 82371AB */ 1971 2135 2136 /* See p. 50 of PIIX4 manual */ 1972 2137 dev->config[0x04] = 0x01; /* command */ 1973 2138 dev->config[0x05] = 0x00; … … 1975 2140 dev->config[0x06] = 0x80; /* status */ 1976 2141 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 */ 1980 2146 dev->config[0x0a] = 0x80; 1981 2147 dev->config[0x0b] = 0x06; 1982 2148 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[0x 2c] = 0x86;1988 dev->config[0x2d] = 0x80; 1989 dev->config[0x2e] = 0x00; 1990 dev->config[0x 2f] = 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 */ 1991 2157 #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 */ 1993 2160 1994 2161 rc = PDMDevHlpPCIRegister(pDevIns, dev); … … 1996 2163 return rc; 1997 2164 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), 1999 2170 NULL, acpi_save_state, NULL, NULL, acpi_load_state, NULL); 2000 2171 if (RT_FAILURE(rc))
Note:
See TracChangeset
for help on using the changeset viewer.