2 Provide constructor and GetTick for Base instance of ACPI Timer Library
4 Copyright (C) 2014, Gabriel L. Somlo <somlo@cmu.edu>
6 SPDX-License-Identifier: BSD-2-Clause-Patent
9 #include <Library/DebugLib.h>
10 #include <Library/IoLib.h>
11 #include <Library/PciLib.h>
12 #include <OvmfPlatforms.h>
15 // Cached ACPI Timer IO Address
17 STATIC UINT32 mAcpiTimerIoAddr
;
20 The constructor function caches the ACPI tick counter address, and,
21 if necessary, enables ACPI IO space.
23 @retval EFI_SUCCESS The constructor always returns RETURN_SUCCESS.
28 AcpiTimerLibConstructor (
32 UINT16 HostBridgeDevId
;
40 // Query Host Bridge DID to determine platform type
42 HostBridgeDevId
= PciRead16 (OVMF_HOSTBRIDGE_DID
);
43 switch (HostBridgeDevId
) {
44 case INTEL_82441_DEVICE_ID
:
45 Pmba
= POWER_MGMT_REGISTER_PIIX4 (PIIX4_PMBA
);
46 PmbaAndVal
= ~(UINT32
)PIIX4_PMBA_MASK
;
47 PmbaOrVal
= PIIX4_PMBA_VALUE
;
48 AcpiCtlReg
= POWER_MGMT_REGISTER_PIIX4 (PIIX4_PMREGMISC
);
49 AcpiEnBit
= PIIX4_PMREGMISC_PMIOSE
;
51 case INTEL_Q35_MCH_DEVICE_ID
:
52 Pmba
= POWER_MGMT_REGISTER_Q35 (ICH9_PMBASE
);
53 PmbaAndVal
= ~(UINT32
)ICH9_PMBASE_MASK
;
54 PmbaOrVal
= ICH9_PMBASE_VALUE
;
55 AcpiCtlReg
= POWER_MGMT_REGISTER_Q35 (ICH9_ACPI_CNTL
);
56 AcpiEnBit
= ICH9_ACPI_CNTL_ACPI_EN
;
61 "%a: Unknown Host Bridge Device ID: 0x%04x\n",
66 return RETURN_UNSUPPORTED
;
70 // Check to see if the Power Management Base Address is already enabled
72 if ((PciRead8 (AcpiCtlReg
) & AcpiEnBit
) == 0) {
74 // If the Power Management Base Address is not programmed,
75 // then program it now.
77 PciAndThenOr32 (Pmba
, PmbaAndVal
, PmbaOrVal
);
80 // Enable PMBA I/O port decodes
82 PciOr8 (AcpiCtlReg
, AcpiEnBit
);
85 mAcpiTimerIoAddr
= (PciRead32 (Pmba
) & ~PMBA_RTE
) + ACPI_TIMER_OFFSET
;
86 return RETURN_SUCCESS
;
90 Internal function to read the current tick counter of ACPI.
92 Read the current ACPI tick counter using the counter address cached
93 by this instance's constructor.
95 @return The tick counter read.
99 InternalAcpiGetTimerTick (
104 // Return the current ACPI timer value.
106 return IoRead32 (mAcpiTimerIoAddr
);