1*4882a593Smuzhiyun // SPDX-License-Identifier: GPL-2.0-only
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun * linux/drivers/clocksource/acpi_pm.c
4*4882a593Smuzhiyun *
5*4882a593Smuzhiyun * This file contains the ACPI PM based clocksource.
6*4882a593Smuzhiyun *
7*4882a593Smuzhiyun * This code was largely moved from the i386 timer_pm.c file
8*4882a593Smuzhiyun * which was (C) Dominik Brodowski <linux@brodo.de> 2003
9*4882a593Smuzhiyun * and contained the following comments:
10*4882a593Smuzhiyun *
11*4882a593Smuzhiyun * Driver to use the Power Management Timer (PMTMR) available in some
12*4882a593Smuzhiyun * southbridges as primary timing source for the Linux kernel.
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * Based on parts of linux/drivers/acpi/hardware/hwtimer.c, timer_pit.c,
15*4882a593Smuzhiyun * timer_hpet.c, and on Arjan van de Ven's implementation for 2.4.
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun #include <linux/acpi_pmtmr.h>
19*4882a593Smuzhiyun #include <linux/clocksource.h>
20*4882a593Smuzhiyun #include <linux/timex.h>
21*4882a593Smuzhiyun #include <linux/errno.h>
22*4882a593Smuzhiyun #include <linux/init.h>
23*4882a593Smuzhiyun #include <linux/pci.h>
24*4882a593Smuzhiyun #include <linux/delay.h>
25*4882a593Smuzhiyun #include <asm/io.h>
26*4882a593Smuzhiyun
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun * The I/O port the PMTMR resides at.
29*4882a593Smuzhiyun * The location is detected during setup_arch(),
30*4882a593Smuzhiyun * in arch/i386/kernel/acpi/boot.c
31*4882a593Smuzhiyun */
32*4882a593Smuzhiyun u32 pmtmr_ioport __read_mostly;
33*4882a593Smuzhiyun
read_pmtmr(void)34*4882a593Smuzhiyun static inline u32 read_pmtmr(void)
35*4882a593Smuzhiyun {
36*4882a593Smuzhiyun /* mask the output to 24 bits */
37*4882a593Smuzhiyun return inl(pmtmr_ioport) & ACPI_PM_MASK;
38*4882a593Smuzhiyun }
39*4882a593Smuzhiyun
acpi_pm_read_verified(void)40*4882a593Smuzhiyun u32 acpi_pm_read_verified(void)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun u32 v1 = 0, v2 = 0, v3 = 0;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /*
45*4882a593Smuzhiyun * It has been reported that because of various broken
46*4882a593Smuzhiyun * chipsets (ICH4, PIIX4 and PIIX4E) where the ACPI PM clock
47*4882a593Smuzhiyun * source is not latched, you must read it multiple
48*4882a593Smuzhiyun * times to ensure a safe value is read:
49*4882a593Smuzhiyun */
50*4882a593Smuzhiyun do {
51*4882a593Smuzhiyun v1 = read_pmtmr();
52*4882a593Smuzhiyun v2 = read_pmtmr();
53*4882a593Smuzhiyun v3 = read_pmtmr();
54*4882a593Smuzhiyun } while (unlikely((v1 > v2 && v1 < v3) || (v2 > v3 && v2 < v1)
55*4882a593Smuzhiyun || (v3 > v1 && v3 < v2)));
56*4882a593Smuzhiyun
57*4882a593Smuzhiyun return v2;
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun
acpi_pm_read(struct clocksource * cs)60*4882a593Smuzhiyun static u64 acpi_pm_read(struct clocksource *cs)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun return (u64)read_pmtmr();
63*4882a593Smuzhiyun }
64*4882a593Smuzhiyun
65*4882a593Smuzhiyun static struct clocksource clocksource_acpi_pm = {
66*4882a593Smuzhiyun .name = "acpi_pm",
67*4882a593Smuzhiyun .rating = 200,
68*4882a593Smuzhiyun .read = acpi_pm_read,
69*4882a593Smuzhiyun .mask = (u64)ACPI_PM_MASK,
70*4882a593Smuzhiyun .flags = CLOCK_SOURCE_IS_CONTINUOUS,
71*4882a593Smuzhiyun };
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun #ifdef CONFIG_PCI
75*4882a593Smuzhiyun static int acpi_pm_good;
acpi_pm_good_setup(char * __str)76*4882a593Smuzhiyun static int __init acpi_pm_good_setup(char *__str)
77*4882a593Smuzhiyun {
78*4882a593Smuzhiyun acpi_pm_good = 1;
79*4882a593Smuzhiyun return 1;
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun __setup("acpi_pm_good", acpi_pm_good_setup);
82*4882a593Smuzhiyun
acpi_pm_read_slow(struct clocksource * cs)83*4882a593Smuzhiyun static u64 acpi_pm_read_slow(struct clocksource *cs)
84*4882a593Smuzhiyun {
85*4882a593Smuzhiyun return (u64)acpi_pm_read_verified();
86*4882a593Smuzhiyun }
87*4882a593Smuzhiyun
acpi_pm_need_workaround(void)88*4882a593Smuzhiyun static inline void acpi_pm_need_workaround(void)
89*4882a593Smuzhiyun {
90*4882a593Smuzhiyun clocksource_acpi_pm.read = acpi_pm_read_slow;
91*4882a593Smuzhiyun clocksource_acpi_pm.rating = 120;
92*4882a593Smuzhiyun }
93*4882a593Smuzhiyun
94*4882a593Smuzhiyun /*
95*4882a593Smuzhiyun * PIIX4 Errata:
96*4882a593Smuzhiyun *
97*4882a593Smuzhiyun * The power management timer may return improper results when read.
98*4882a593Smuzhiyun * Although the timer value settles properly after incrementing,
99*4882a593Smuzhiyun * while incrementing there is a 3 ns window every 69.8 ns where the
100*4882a593Smuzhiyun * timer value is indeterminate (a 4.2% chance that the data will be
101*4882a593Smuzhiyun * incorrect when read). As a result, the ACPI free running count up
102*4882a593Smuzhiyun * timer specification is violated due to erroneous reads.
103*4882a593Smuzhiyun */
acpi_pm_check_blacklist(struct pci_dev * dev)104*4882a593Smuzhiyun static void acpi_pm_check_blacklist(struct pci_dev *dev)
105*4882a593Smuzhiyun {
106*4882a593Smuzhiyun if (acpi_pm_good)
107*4882a593Smuzhiyun return;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun /* the bug has been fixed in PIIX4M */
110*4882a593Smuzhiyun if (dev->revision < 3) {
111*4882a593Smuzhiyun pr_warn("* Found PM-Timer Bug on the chipset. Due to workarounds for a bug,\n"
112*4882a593Smuzhiyun "* this clock source is slow. Consider trying other clock sources\n");
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun acpi_pm_need_workaround();
115*4882a593Smuzhiyun }
116*4882a593Smuzhiyun }
117*4882a593Smuzhiyun DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82371AB_3,
118*4882a593Smuzhiyun acpi_pm_check_blacklist);
119*4882a593Smuzhiyun
acpi_pm_check_graylist(struct pci_dev * dev)120*4882a593Smuzhiyun static void acpi_pm_check_graylist(struct pci_dev *dev)
121*4882a593Smuzhiyun {
122*4882a593Smuzhiyun if (acpi_pm_good)
123*4882a593Smuzhiyun return;
124*4882a593Smuzhiyun
125*4882a593Smuzhiyun pr_warn("* The chipset may have PM-Timer Bug. Due to workarounds for a bug,\n"
126*4882a593Smuzhiyun "* this clock source is slow. If you are sure your timer does not have\n"
127*4882a593Smuzhiyun "* this bug, please use \"acpi_pm_good\" to disable the workaround\n");
128*4882a593Smuzhiyun
129*4882a593Smuzhiyun acpi_pm_need_workaround();
130*4882a593Smuzhiyun }
131*4882a593Smuzhiyun DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_INTEL, PCI_DEVICE_ID_INTEL_82801DB_0,
132*4882a593Smuzhiyun acpi_pm_check_graylist);
133*4882a593Smuzhiyun DECLARE_PCI_FIXUP_EARLY(PCI_VENDOR_ID_SERVERWORKS, PCI_DEVICE_ID_SERVERWORKS_LE,
134*4882a593Smuzhiyun acpi_pm_check_graylist);
135*4882a593Smuzhiyun #endif
136*4882a593Smuzhiyun
137*4882a593Smuzhiyun #ifndef CONFIG_X86_64
138*4882a593Smuzhiyun #include <asm/mach_timer.h>
139*4882a593Smuzhiyun #define PMTMR_EXPECTED_RATE \
140*4882a593Smuzhiyun ((CALIBRATE_LATCH * (PMTMR_TICKS_PER_SEC >> 10)) / (PIT_TICK_RATE>>10))
141*4882a593Smuzhiyun /*
142*4882a593Smuzhiyun * Some boards have the PMTMR running way too fast. We check
143*4882a593Smuzhiyun * the PMTMR rate against PIT channel 2 to catch these cases.
144*4882a593Smuzhiyun */
verify_pmtmr_rate(void)145*4882a593Smuzhiyun static int verify_pmtmr_rate(void)
146*4882a593Smuzhiyun {
147*4882a593Smuzhiyun u64 value1, value2;
148*4882a593Smuzhiyun unsigned long count, delta;
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun mach_prepare_counter();
151*4882a593Smuzhiyun value1 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
152*4882a593Smuzhiyun mach_countup(&count);
153*4882a593Smuzhiyun value2 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
154*4882a593Smuzhiyun delta = (value2 - value1) & ACPI_PM_MASK;
155*4882a593Smuzhiyun
156*4882a593Smuzhiyun /* Check that the PMTMR delta is within 5% of what we expect */
157*4882a593Smuzhiyun if (delta < (PMTMR_EXPECTED_RATE * 19) / 20 ||
158*4882a593Smuzhiyun delta > (PMTMR_EXPECTED_RATE * 21) / 20) {
159*4882a593Smuzhiyun pr_info("PM-Timer running at invalid rate: %lu%% of normal - aborting.\n",
160*4882a593Smuzhiyun 100UL * delta / PMTMR_EXPECTED_RATE);
161*4882a593Smuzhiyun return -1;
162*4882a593Smuzhiyun }
163*4882a593Smuzhiyun
164*4882a593Smuzhiyun return 0;
165*4882a593Smuzhiyun }
166*4882a593Smuzhiyun #else
167*4882a593Smuzhiyun #define verify_pmtmr_rate() (0)
168*4882a593Smuzhiyun #endif
169*4882a593Smuzhiyun
170*4882a593Smuzhiyun /* Number of monotonicity checks to perform during initialization */
171*4882a593Smuzhiyun #define ACPI_PM_MONOTONICITY_CHECKS 10
172*4882a593Smuzhiyun /* Number of reads we try to get two different values */
173*4882a593Smuzhiyun #define ACPI_PM_READ_CHECKS 10000
174*4882a593Smuzhiyun
init_acpi_pm_clocksource(void)175*4882a593Smuzhiyun static int __init init_acpi_pm_clocksource(void)
176*4882a593Smuzhiyun {
177*4882a593Smuzhiyun u64 value1, value2;
178*4882a593Smuzhiyun unsigned int i, j = 0;
179*4882a593Smuzhiyun
180*4882a593Smuzhiyun if (!pmtmr_ioport)
181*4882a593Smuzhiyun return -ENODEV;
182*4882a593Smuzhiyun
183*4882a593Smuzhiyun /* "verify" this timing source: */
184*4882a593Smuzhiyun for (j = 0; j < ACPI_PM_MONOTONICITY_CHECKS; j++) {
185*4882a593Smuzhiyun udelay(100 * j);
186*4882a593Smuzhiyun value1 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
187*4882a593Smuzhiyun for (i = 0; i < ACPI_PM_READ_CHECKS; i++) {
188*4882a593Smuzhiyun value2 = clocksource_acpi_pm.read(&clocksource_acpi_pm);
189*4882a593Smuzhiyun if (value2 == value1)
190*4882a593Smuzhiyun continue;
191*4882a593Smuzhiyun if (value2 > value1)
192*4882a593Smuzhiyun break;
193*4882a593Smuzhiyun if ((value2 < value1) && ((value2) < 0xFFF))
194*4882a593Smuzhiyun break;
195*4882a593Smuzhiyun pr_info("PM-Timer had inconsistent results: %#llx, %#llx - aborting.\n",
196*4882a593Smuzhiyun value1, value2);
197*4882a593Smuzhiyun pmtmr_ioport = 0;
198*4882a593Smuzhiyun return -EINVAL;
199*4882a593Smuzhiyun }
200*4882a593Smuzhiyun if (i == ACPI_PM_READ_CHECKS) {
201*4882a593Smuzhiyun pr_info("PM-Timer failed consistency check (%#llx) - aborting.\n",
202*4882a593Smuzhiyun value1);
203*4882a593Smuzhiyun pmtmr_ioport = 0;
204*4882a593Smuzhiyun return -ENODEV;
205*4882a593Smuzhiyun }
206*4882a593Smuzhiyun }
207*4882a593Smuzhiyun
208*4882a593Smuzhiyun if (verify_pmtmr_rate() != 0){
209*4882a593Smuzhiyun pmtmr_ioport = 0;
210*4882a593Smuzhiyun return -ENODEV;
211*4882a593Smuzhiyun }
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun return clocksource_register_hz(&clocksource_acpi_pm,
214*4882a593Smuzhiyun PMTMR_TICKS_PER_SEC);
215*4882a593Smuzhiyun }
216*4882a593Smuzhiyun
217*4882a593Smuzhiyun /* We use fs_initcall because we want the PCI fixups to have run
218*4882a593Smuzhiyun * but we still need to load before device_initcall
219*4882a593Smuzhiyun */
220*4882a593Smuzhiyun fs_initcall(init_acpi_pm_clocksource);
221*4882a593Smuzhiyun
222*4882a593Smuzhiyun /*
223*4882a593Smuzhiyun * Allow an override of the IOPort. Stupid BIOSes do not tell us about
224*4882a593Smuzhiyun * the PMTimer, but we might know where it is.
225*4882a593Smuzhiyun */
parse_pmtmr(char * arg)226*4882a593Smuzhiyun static int __init parse_pmtmr(char *arg)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun unsigned int base;
229*4882a593Smuzhiyun int ret;
230*4882a593Smuzhiyun
231*4882a593Smuzhiyun ret = kstrtouint(arg, 16, &base);
232*4882a593Smuzhiyun if (ret) {
233*4882a593Smuzhiyun pr_warn("PMTMR: invalid 'pmtmr=' value: '%s'\n", arg);
234*4882a593Smuzhiyun return 1;
235*4882a593Smuzhiyun }
236*4882a593Smuzhiyun
237*4882a593Smuzhiyun pr_info("PMTMR IOPort override: 0x%04x -> 0x%04x\n", pmtmr_ioport,
238*4882a593Smuzhiyun base);
239*4882a593Smuzhiyun pmtmr_ioport = base;
240*4882a593Smuzhiyun
241*4882a593Smuzhiyun return 1;
242*4882a593Smuzhiyun }
243*4882a593Smuzhiyun __setup("pmtmr=", parse_pmtmr);
244