xref: /openbmc/linux/arch/x86/kernel/hpet.c (revision 2874c5fd)
1 // SPDX-License-Identifier: GPL-2.0-only
2 #include <linux/clocksource.h>
3 #include <linux/clockchips.h>
4 #include <linux/interrupt.h>
5 #include <linux/irq.h>
6 #include <linux/export.h>
7 #include <linux/delay.h>
8 #include <linux/errno.h>
9 #include <linux/i8253.h>
10 #include <linux/slab.h>
11 #include <linux/hpet.h>
12 #include <linux/init.h>
13 #include <linux/cpu.h>
14 #include <linux/pm.h>
15 #include <linux/io.h>
16 
17 #include <asm/cpufeature.h>
18 #include <asm/irqdomain.h>
19 #include <asm/fixmap.h>
20 #include <asm/hpet.h>
21 #include <asm/time.h>
22 
23 #define HPET_MASK			CLOCKSOURCE_MASK(32)
24 
25 #define HPET_DEV_USED_BIT		2
26 #define HPET_DEV_USED			(1 << HPET_DEV_USED_BIT)
27 #define HPET_DEV_VALID			0x8
28 #define HPET_DEV_FSB_CAP		0x1000
29 #define HPET_DEV_PERI_CAP		0x2000
30 
31 #define HPET_MIN_CYCLES			128
32 #define HPET_MIN_PROG_DELTA		(HPET_MIN_CYCLES + (HPET_MIN_CYCLES >> 1))
33 
34 /*
35  * HPET address is set in acpi/boot.c, when an ACPI entry exists
36  */
37 unsigned long				hpet_address;
38 u8					hpet_blockid; /* OS timer block num */
39 bool					hpet_msi_disable;
40 
41 #ifdef CONFIG_PCI_MSI
42 static unsigned int			hpet_num_timers;
43 #endif
44 static void __iomem			*hpet_virt_address;
45 
46 struct hpet_dev {
47 	struct clock_event_device	evt;
48 	unsigned int			num;
49 	int				cpu;
50 	unsigned int			irq;
51 	unsigned int			flags;
52 	char				name[10];
53 };
54 
55 static inline struct hpet_dev *EVT_TO_HPET_DEV(struct clock_event_device *evtdev)
56 {
57 	return container_of(evtdev, struct hpet_dev, evt);
58 }
59 
60 inline unsigned int hpet_readl(unsigned int a)
61 {
62 	return readl(hpet_virt_address + a);
63 }
64 
65 static inline void hpet_writel(unsigned int d, unsigned int a)
66 {
67 	writel(d, hpet_virt_address + a);
68 }
69 
70 #ifdef CONFIG_X86_64
71 #include <asm/pgtable.h>
72 #endif
73 
74 static inline void hpet_set_mapping(void)
75 {
76 	hpet_virt_address = ioremap_nocache(hpet_address, HPET_MMAP_SIZE);
77 }
78 
79 static inline void hpet_clear_mapping(void)
80 {
81 	iounmap(hpet_virt_address);
82 	hpet_virt_address = NULL;
83 }
84 
85 /*
86  * HPET command line enable / disable
87  */
88 bool boot_hpet_disable;
89 bool hpet_force_user;
90 static bool hpet_verbose;
91 
92 static int __init hpet_setup(char *str)
93 {
94 	while (str) {
95 		char *next = strchr(str, ',');
96 
97 		if (next)
98 			*next++ = 0;
99 		if (!strncmp("disable", str, 7))
100 			boot_hpet_disable = true;
101 		if (!strncmp("force", str, 5))
102 			hpet_force_user = true;
103 		if (!strncmp("verbose", str, 7))
104 			hpet_verbose = true;
105 		str = next;
106 	}
107 	return 1;
108 }
109 __setup("hpet=", hpet_setup);
110 
111 static int __init disable_hpet(char *str)
112 {
113 	boot_hpet_disable = true;
114 	return 1;
115 }
116 __setup("nohpet", disable_hpet);
117 
118 static inline int is_hpet_capable(void)
119 {
120 	return !boot_hpet_disable && hpet_address;
121 }
122 
123 /*
124  * HPET timer interrupt enable / disable
125  */
126 static bool hpet_legacy_int_enabled;
127 
128 /**
129  * is_hpet_enabled - check whether the hpet timer interrupt is enabled
130  */
131 int is_hpet_enabled(void)
132 {
133 	return is_hpet_capable() && hpet_legacy_int_enabled;
134 }
135 EXPORT_SYMBOL_GPL(is_hpet_enabled);
136 
137 static void _hpet_print_config(const char *function, int line)
138 {
139 	u32 i, timers, l, h;
140 	printk(KERN_INFO "hpet: %s(%d):\n", function, line);
141 	l = hpet_readl(HPET_ID);
142 	h = hpet_readl(HPET_PERIOD);
143 	timers = ((l & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1;
144 	printk(KERN_INFO "hpet: ID: 0x%x, PERIOD: 0x%x\n", l, h);
145 	l = hpet_readl(HPET_CFG);
146 	h = hpet_readl(HPET_STATUS);
147 	printk(KERN_INFO "hpet: CFG: 0x%x, STATUS: 0x%x\n", l, h);
148 	l = hpet_readl(HPET_COUNTER);
149 	h = hpet_readl(HPET_COUNTER+4);
150 	printk(KERN_INFO "hpet: COUNTER_l: 0x%x, COUNTER_h: 0x%x\n", l, h);
151 
152 	for (i = 0; i < timers; i++) {
153 		l = hpet_readl(HPET_Tn_CFG(i));
154 		h = hpet_readl(HPET_Tn_CFG(i)+4);
155 		printk(KERN_INFO "hpet: T%d: CFG_l: 0x%x, CFG_h: 0x%x\n",
156 		       i, l, h);
157 		l = hpet_readl(HPET_Tn_CMP(i));
158 		h = hpet_readl(HPET_Tn_CMP(i)+4);
159 		printk(KERN_INFO "hpet: T%d: CMP_l: 0x%x, CMP_h: 0x%x\n",
160 		       i, l, h);
161 		l = hpet_readl(HPET_Tn_ROUTE(i));
162 		h = hpet_readl(HPET_Tn_ROUTE(i)+4);
163 		printk(KERN_INFO "hpet: T%d ROUTE_l: 0x%x, ROUTE_h: 0x%x\n",
164 		       i, l, h);
165 	}
166 }
167 
168 #define hpet_print_config()					\
169 do {								\
170 	if (hpet_verbose)					\
171 		_hpet_print_config(__func__, __LINE__);	\
172 } while (0)
173 
174 /*
175  * When the hpet driver (/dev/hpet) is enabled, we need to reserve
176  * timer 0 and timer 1 in case of RTC emulation.
177  */
178 #ifdef CONFIG_HPET
179 
180 static void hpet_reserve_msi_timers(struct hpet_data *hd);
181 
182 static void hpet_reserve_platform_timers(unsigned int id)
183 {
184 	struct hpet __iomem *hpet = hpet_virt_address;
185 	struct hpet_timer __iomem *timer = &hpet->hpet_timers[2];
186 	unsigned int nrtimers, i;
187 	struct hpet_data hd;
188 
189 	nrtimers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT) + 1;
190 
191 	memset(&hd, 0, sizeof(hd));
192 	hd.hd_phys_address	= hpet_address;
193 	hd.hd_address		= hpet;
194 	hd.hd_nirqs		= nrtimers;
195 	hpet_reserve_timer(&hd, 0);
196 
197 #ifdef CONFIG_HPET_EMULATE_RTC
198 	hpet_reserve_timer(&hd, 1);
199 #endif
200 
201 	/*
202 	 * NOTE that hd_irq[] reflects IOAPIC input pins (LEGACY_8254
203 	 * is wrong for i8259!) not the output IRQ.  Many BIOS writers
204 	 * don't bother configuring *any* comparator interrupts.
205 	 */
206 	hd.hd_irq[0] = HPET_LEGACY_8254;
207 	hd.hd_irq[1] = HPET_LEGACY_RTC;
208 
209 	for (i = 2; i < nrtimers; timer++, i++) {
210 		hd.hd_irq[i] = (readl(&timer->hpet_config) &
211 			Tn_INT_ROUTE_CNF_MASK) >> Tn_INT_ROUTE_CNF_SHIFT;
212 	}
213 
214 	hpet_reserve_msi_timers(&hd);
215 
216 	hpet_alloc(&hd);
217 
218 }
219 #else
220 static void hpet_reserve_platform_timers(unsigned int id) { }
221 #endif
222 
223 /*
224  * Common hpet info
225  */
226 static unsigned long hpet_freq;
227 
228 static struct clock_event_device hpet_clockevent;
229 
230 static void hpet_stop_counter(void)
231 {
232 	u32 cfg = hpet_readl(HPET_CFG);
233 	cfg &= ~HPET_CFG_ENABLE;
234 	hpet_writel(cfg, HPET_CFG);
235 }
236 
237 static void hpet_reset_counter(void)
238 {
239 	hpet_writel(0, HPET_COUNTER);
240 	hpet_writel(0, HPET_COUNTER + 4);
241 }
242 
243 static void hpet_start_counter(void)
244 {
245 	unsigned int cfg = hpet_readl(HPET_CFG);
246 	cfg |= HPET_CFG_ENABLE;
247 	hpet_writel(cfg, HPET_CFG);
248 }
249 
250 static void hpet_restart_counter(void)
251 {
252 	hpet_stop_counter();
253 	hpet_reset_counter();
254 	hpet_start_counter();
255 }
256 
257 static void hpet_resume_device(void)
258 {
259 	force_hpet_resume();
260 }
261 
262 static void hpet_resume_counter(struct clocksource *cs)
263 {
264 	hpet_resume_device();
265 	hpet_restart_counter();
266 }
267 
268 static void hpet_enable_legacy_int(void)
269 {
270 	unsigned int cfg = hpet_readl(HPET_CFG);
271 
272 	cfg |= HPET_CFG_LEGACY;
273 	hpet_writel(cfg, HPET_CFG);
274 	hpet_legacy_int_enabled = true;
275 }
276 
277 static void hpet_legacy_clockevent_register(void)
278 {
279 	/* Start HPET legacy interrupts */
280 	hpet_enable_legacy_int();
281 
282 	/*
283 	 * Start hpet with the boot cpu mask and make it
284 	 * global after the IO_APIC has been initialized.
285 	 */
286 	hpet_clockevent.cpumask = cpumask_of(boot_cpu_data.cpu_index);
287 	clockevents_config_and_register(&hpet_clockevent, hpet_freq,
288 					HPET_MIN_PROG_DELTA, 0x7FFFFFFF);
289 	global_clock_event = &hpet_clockevent;
290 	printk(KERN_DEBUG "hpet clockevent registered\n");
291 }
292 
293 static int hpet_set_periodic(struct clock_event_device *evt, int timer)
294 {
295 	unsigned int cfg, cmp, now;
296 	uint64_t delta;
297 
298 	hpet_stop_counter();
299 	delta = ((uint64_t)(NSEC_PER_SEC / HZ)) * evt->mult;
300 	delta >>= evt->shift;
301 	now = hpet_readl(HPET_COUNTER);
302 	cmp = now + (unsigned int)delta;
303 	cfg = hpet_readl(HPET_Tn_CFG(timer));
304 	cfg |= HPET_TN_ENABLE | HPET_TN_PERIODIC | HPET_TN_SETVAL |
305 	       HPET_TN_32BIT;
306 	hpet_writel(cfg, HPET_Tn_CFG(timer));
307 	hpet_writel(cmp, HPET_Tn_CMP(timer));
308 	udelay(1);
309 	/*
310 	 * HPET on AMD 81xx needs a second write (with HPET_TN_SETVAL
311 	 * cleared) to T0_CMP to set the period. The HPET_TN_SETVAL
312 	 * bit is automatically cleared after the first write.
313 	 * (See AMD-8111 HyperTransport I/O Hub Data Sheet,
314 	 * Publication # 24674)
315 	 */
316 	hpet_writel((unsigned int)delta, HPET_Tn_CMP(timer));
317 	hpet_start_counter();
318 	hpet_print_config();
319 
320 	return 0;
321 }
322 
323 static int hpet_set_oneshot(struct clock_event_device *evt, int timer)
324 {
325 	unsigned int cfg;
326 
327 	cfg = hpet_readl(HPET_Tn_CFG(timer));
328 	cfg &= ~HPET_TN_PERIODIC;
329 	cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
330 	hpet_writel(cfg, HPET_Tn_CFG(timer));
331 
332 	return 0;
333 }
334 
335 static int hpet_shutdown(struct clock_event_device *evt, int timer)
336 {
337 	unsigned int cfg;
338 
339 	cfg = hpet_readl(HPET_Tn_CFG(timer));
340 	cfg &= ~HPET_TN_ENABLE;
341 	hpet_writel(cfg, HPET_Tn_CFG(timer));
342 
343 	return 0;
344 }
345 
346 static int hpet_resume(struct clock_event_device *evt)
347 {
348 	hpet_enable_legacy_int();
349 	hpet_print_config();
350 	return 0;
351 }
352 
353 static int hpet_next_event(unsigned long delta,
354 			   struct clock_event_device *evt, int timer)
355 {
356 	u32 cnt;
357 	s32 res;
358 
359 	cnt = hpet_readl(HPET_COUNTER);
360 	cnt += (u32) delta;
361 	hpet_writel(cnt, HPET_Tn_CMP(timer));
362 
363 	/*
364 	 * HPETs are a complete disaster. The compare register is
365 	 * based on a equal comparison and neither provides a less
366 	 * than or equal functionality (which would require to take
367 	 * the wraparound into account) nor a simple count down event
368 	 * mode. Further the write to the comparator register is
369 	 * delayed internally up to two HPET clock cycles in certain
370 	 * chipsets (ATI, ICH9,10). Some newer AMD chipsets have even
371 	 * longer delays. We worked around that by reading back the
372 	 * compare register, but that required another workaround for
373 	 * ICH9,10 chips where the first readout after write can
374 	 * return the old stale value. We already had a minimum
375 	 * programming delta of 5us enforced, but a NMI or SMI hitting
376 	 * between the counter readout and the comparator write can
377 	 * move us behind that point easily. Now instead of reading
378 	 * the compare register back several times, we make the ETIME
379 	 * decision based on the following: Return ETIME if the
380 	 * counter value after the write is less than HPET_MIN_CYCLES
381 	 * away from the event or if the counter is already ahead of
382 	 * the event. The minimum programming delta for the generic
383 	 * clockevents code is set to 1.5 * HPET_MIN_CYCLES.
384 	 */
385 	res = (s32)(cnt - hpet_readl(HPET_COUNTER));
386 
387 	return res < HPET_MIN_CYCLES ? -ETIME : 0;
388 }
389 
390 static int hpet_legacy_shutdown(struct clock_event_device *evt)
391 {
392 	return hpet_shutdown(evt, 0);
393 }
394 
395 static int hpet_legacy_set_oneshot(struct clock_event_device *evt)
396 {
397 	return hpet_set_oneshot(evt, 0);
398 }
399 
400 static int hpet_legacy_set_periodic(struct clock_event_device *evt)
401 {
402 	return hpet_set_periodic(evt, 0);
403 }
404 
405 static int hpet_legacy_resume(struct clock_event_device *evt)
406 {
407 	return hpet_resume(evt);
408 }
409 
410 static int hpet_legacy_next_event(unsigned long delta,
411 			struct clock_event_device *evt)
412 {
413 	return hpet_next_event(delta, evt, 0);
414 }
415 
416 /*
417  * The hpet clock event device
418  */
419 static struct clock_event_device hpet_clockevent = {
420 	.name			= "hpet",
421 	.features		= CLOCK_EVT_FEAT_PERIODIC |
422 				  CLOCK_EVT_FEAT_ONESHOT,
423 	.set_state_periodic	= hpet_legacy_set_periodic,
424 	.set_state_oneshot	= hpet_legacy_set_oneshot,
425 	.set_state_shutdown	= hpet_legacy_shutdown,
426 	.tick_resume		= hpet_legacy_resume,
427 	.set_next_event		= hpet_legacy_next_event,
428 	.irq			= 0,
429 	.rating			= 50,
430 };
431 
432 /*
433  * HPET MSI Support
434  */
435 #ifdef CONFIG_PCI_MSI
436 
437 static DEFINE_PER_CPU(struct hpet_dev *, cpu_hpet_dev);
438 static struct hpet_dev	*hpet_devs;
439 static struct irq_domain *hpet_domain;
440 
441 void hpet_msi_unmask(struct irq_data *data)
442 {
443 	struct hpet_dev *hdev = irq_data_get_irq_handler_data(data);
444 	unsigned int cfg;
445 
446 	/* unmask it */
447 	cfg = hpet_readl(HPET_Tn_CFG(hdev->num));
448 	cfg |= HPET_TN_ENABLE | HPET_TN_FSB;
449 	hpet_writel(cfg, HPET_Tn_CFG(hdev->num));
450 }
451 
452 void hpet_msi_mask(struct irq_data *data)
453 {
454 	struct hpet_dev *hdev = irq_data_get_irq_handler_data(data);
455 	unsigned int cfg;
456 
457 	/* mask it */
458 	cfg = hpet_readl(HPET_Tn_CFG(hdev->num));
459 	cfg &= ~(HPET_TN_ENABLE | HPET_TN_FSB);
460 	hpet_writel(cfg, HPET_Tn_CFG(hdev->num));
461 }
462 
463 void hpet_msi_write(struct hpet_dev *hdev, struct msi_msg *msg)
464 {
465 	hpet_writel(msg->data, HPET_Tn_ROUTE(hdev->num));
466 	hpet_writel(msg->address_lo, HPET_Tn_ROUTE(hdev->num) + 4);
467 }
468 
469 void hpet_msi_read(struct hpet_dev *hdev, struct msi_msg *msg)
470 {
471 	msg->data = hpet_readl(HPET_Tn_ROUTE(hdev->num));
472 	msg->address_lo = hpet_readl(HPET_Tn_ROUTE(hdev->num) + 4);
473 	msg->address_hi = 0;
474 }
475 
476 static int hpet_msi_shutdown(struct clock_event_device *evt)
477 {
478 	struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt);
479 
480 	return hpet_shutdown(evt, hdev->num);
481 }
482 
483 static int hpet_msi_set_oneshot(struct clock_event_device *evt)
484 {
485 	struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt);
486 
487 	return hpet_set_oneshot(evt, hdev->num);
488 }
489 
490 static int hpet_msi_set_periodic(struct clock_event_device *evt)
491 {
492 	struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt);
493 
494 	return hpet_set_periodic(evt, hdev->num);
495 }
496 
497 static int hpet_msi_resume(struct clock_event_device *evt)
498 {
499 	struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt);
500 	struct irq_data *data = irq_get_irq_data(hdev->irq);
501 	struct msi_msg msg;
502 
503 	/* Restore the MSI msg and unmask the interrupt */
504 	irq_chip_compose_msi_msg(data, &msg);
505 	hpet_msi_write(hdev, &msg);
506 	hpet_msi_unmask(data);
507 	return 0;
508 }
509 
510 static int hpet_msi_next_event(unsigned long delta,
511 				struct clock_event_device *evt)
512 {
513 	struct hpet_dev *hdev = EVT_TO_HPET_DEV(evt);
514 	return hpet_next_event(delta, evt, hdev->num);
515 }
516 
517 static irqreturn_t hpet_interrupt_handler(int irq, void *data)
518 {
519 	struct hpet_dev *dev = (struct hpet_dev *)data;
520 	struct clock_event_device *hevt = &dev->evt;
521 
522 	if (!hevt->event_handler) {
523 		printk(KERN_INFO "Spurious HPET timer interrupt on HPET timer %d\n",
524 				dev->num);
525 		return IRQ_HANDLED;
526 	}
527 
528 	hevt->event_handler(hevt);
529 	return IRQ_HANDLED;
530 }
531 
532 static int hpet_setup_irq(struct hpet_dev *dev)
533 {
534 
535 	if (request_irq(dev->irq, hpet_interrupt_handler,
536 			IRQF_TIMER | IRQF_NOBALANCING,
537 			dev->name, dev))
538 		return -1;
539 
540 	disable_irq(dev->irq);
541 	irq_set_affinity(dev->irq, cpumask_of(dev->cpu));
542 	enable_irq(dev->irq);
543 
544 	printk(KERN_DEBUG "hpet: %s irq %d for MSI\n",
545 			 dev->name, dev->irq);
546 
547 	return 0;
548 }
549 
550 /* This should be called in specific @cpu */
551 static void init_one_hpet_msi_clockevent(struct hpet_dev *hdev, int cpu)
552 {
553 	struct clock_event_device *evt = &hdev->evt;
554 
555 	WARN_ON(cpu != smp_processor_id());
556 	if (!(hdev->flags & HPET_DEV_VALID))
557 		return;
558 
559 	hdev->cpu = cpu;
560 	per_cpu(cpu_hpet_dev, cpu) = hdev;
561 	evt->name = hdev->name;
562 	hpet_setup_irq(hdev);
563 	evt->irq = hdev->irq;
564 
565 	evt->rating = 110;
566 	evt->features = CLOCK_EVT_FEAT_ONESHOT;
567 	if (hdev->flags & HPET_DEV_PERI_CAP) {
568 		evt->features |= CLOCK_EVT_FEAT_PERIODIC;
569 		evt->set_state_periodic = hpet_msi_set_periodic;
570 	}
571 
572 	evt->set_state_shutdown = hpet_msi_shutdown;
573 	evt->set_state_oneshot = hpet_msi_set_oneshot;
574 	evt->tick_resume = hpet_msi_resume;
575 	evt->set_next_event = hpet_msi_next_event;
576 	evt->cpumask = cpumask_of(hdev->cpu);
577 
578 	clockevents_config_and_register(evt, hpet_freq, HPET_MIN_PROG_DELTA,
579 					0x7FFFFFFF);
580 }
581 
582 #ifdef CONFIG_HPET
583 /* Reserve at least one timer for userspace (/dev/hpet) */
584 #define RESERVE_TIMERS 1
585 #else
586 #define RESERVE_TIMERS 0
587 #endif
588 
589 static void hpet_msi_capability_lookup(unsigned int start_timer)
590 {
591 	unsigned int id;
592 	unsigned int num_timers;
593 	unsigned int num_timers_used = 0;
594 	int i, irq;
595 
596 	if (hpet_msi_disable)
597 		return;
598 
599 	if (boot_cpu_has(X86_FEATURE_ARAT))
600 		return;
601 	id = hpet_readl(HPET_ID);
602 
603 	num_timers = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT);
604 	num_timers++; /* Value read out starts from 0 */
605 	hpet_print_config();
606 
607 	hpet_domain = hpet_create_irq_domain(hpet_blockid);
608 	if (!hpet_domain)
609 		return;
610 
611 	hpet_devs = kcalloc(num_timers, sizeof(struct hpet_dev), GFP_KERNEL);
612 	if (!hpet_devs)
613 		return;
614 
615 	hpet_num_timers = num_timers;
616 
617 	for (i = start_timer; i < num_timers - RESERVE_TIMERS; i++) {
618 		struct hpet_dev *hdev = &hpet_devs[num_timers_used];
619 		unsigned int cfg = hpet_readl(HPET_Tn_CFG(i));
620 
621 		/* Only consider HPET timer with MSI support */
622 		if (!(cfg & HPET_TN_FSB_CAP))
623 			continue;
624 
625 		hdev->flags = 0;
626 		if (cfg & HPET_TN_PERIODIC_CAP)
627 			hdev->flags |= HPET_DEV_PERI_CAP;
628 		sprintf(hdev->name, "hpet%d", i);
629 		hdev->num = i;
630 
631 		irq = hpet_assign_irq(hpet_domain, hdev, hdev->num);
632 		if (irq <= 0)
633 			continue;
634 
635 		hdev->irq = irq;
636 		hdev->flags |= HPET_DEV_FSB_CAP;
637 		hdev->flags |= HPET_DEV_VALID;
638 		num_timers_used++;
639 		if (num_timers_used == num_possible_cpus())
640 			break;
641 	}
642 
643 	printk(KERN_INFO "HPET: %d timers in total, %d timers will be used for per-cpu timer\n",
644 		num_timers, num_timers_used);
645 }
646 
647 #ifdef CONFIG_HPET
648 static void hpet_reserve_msi_timers(struct hpet_data *hd)
649 {
650 	int i;
651 
652 	if (!hpet_devs)
653 		return;
654 
655 	for (i = 0; i < hpet_num_timers; i++) {
656 		struct hpet_dev *hdev = &hpet_devs[i];
657 
658 		if (!(hdev->flags & HPET_DEV_VALID))
659 			continue;
660 
661 		hd->hd_irq[hdev->num] = hdev->irq;
662 		hpet_reserve_timer(hd, hdev->num);
663 	}
664 }
665 #endif
666 
667 static struct hpet_dev *hpet_get_unused_timer(void)
668 {
669 	int i;
670 
671 	if (!hpet_devs)
672 		return NULL;
673 
674 	for (i = 0; i < hpet_num_timers; i++) {
675 		struct hpet_dev *hdev = &hpet_devs[i];
676 
677 		if (!(hdev->flags & HPET_DEV_VALID))
678 			continue;
679 		if (test_and_set_bit(HPET_DEV_USED_BIT,
680 			(unsigned long *)&hdev->flags))
681 			continue;
682 		return hdev;
683 	}
684 	return NULL;
685 }
686 
687 struct hpet_work_struct {
688 	struct delayed_work work;
689 	struct completion complete;
690 };
691 
692 static void hpet_work(struct work_struct *w)
693 {
694 	struct hpet_dev *hdev;
695 	int cpu = smp_processor_id();
696 	struct hpet_work_struct *hpet_work;
697 
698 	hpet_work = container_of(w, struct hpet_work_struct, work.work);
699 
700 	hdev = hpet_get_unused_timer();
701 	if (hdev)
702 		init_one_hpet_msi_clockevent(hdev, cpu);
703 
704 	complete(&hpet_work->complete);
705 }
706 
707 static int hpet_cpuhp_online(unsigned int cpu)
708 {
709 	struct hpet_work_struct work;
710 
711 	INIT_DELAYED_WORK_ONSTACK(&work.work, hpet_work);
712 	init_completion(&work.complete);
713 	/* FIXME: add schedule_work_on() */
714 	schedule_delayed_work_on(cpu, &work.work, 0);
715 	wait_for_completion(&work.complete);
716 	destroy_delayed_work_on_stack(&work.work);
717 	return 0;
718 }
719 
720 static int hpet_cpuhp_dead(unsigned int cpu)
721 {
722 	struct hpet_dev *hdev = per_cpu(cpu_hpet_dev, cpu);
723 
724 	if (!hdev)
725 		return 0;
726 	free_irq(hdev->irq, hdev);
727 	hdev->flags &= ~HPET_DEV_USED;
728 	per_cpu(cpu_hpet_dev, cpu) = NULL;
729 	return 0;
730 }
731 #else
732 
733 static void hpet_msi_capability_lookup(unsigned int start_timer)
734 {
735 	return;
736 }
737 
738 #ifdef CONFIG_HPET
739 static void hpet_reserve_msi_timers(struct hpet_data *hd)
740 {
741 	return;
742 }
743 #endif
744 
745 #define hpet_cpuhp_online	NULL
746 #define hpet_cpuhp_dead		NULL
747 
748 #endif
749 
750 /*
751  * Clock source related code
752  */
753 #if defined(CONFIG_SMP) && defined(CONFIG_64BIT)
754 /*
755  * Reading the HPET counter is a very slow operation. If a large number of
756  * CPUs are trying to access the HPET counter simultaneously, it can cause
757  * massive delay and slow down system performance dramatically. This may
758  * happen when HPET is the default clock source instead of TSC. For a
759  * really large system with hundreds of CPUs, the slowdown may be so
760  * severe that it may actually crash the system because of a NMI watchdog
761  * soft lockup, for example.
762  *
763  * If multiple CPUs are trying to access the HPET counter at the same time,
764  * we don't actually need to read the counter multiple times. Instead, the
765  * other CPUs can use the counter value read by the first CPU in the group.
766  *
767  * This special feature is only enabled on x86-64 systems. It is unlikely
768  * that 32-bit x86 systems will have enough CPUs to require this feature
769  * with its associated locking overhead. And we also need 64-bit atomic
770  * read.
771  *
772  * The lock and the hpet value are stored together and can be read in a
773  * single atomic 64-bit read. It is explicitly assumed that arch_spinlock_t
774  * is 32 bits in size.
775  */
776 union hpet_lock {
777 	struct {
778 		arch_spinlock_t lock;
779 		u32 value;
780 	};
781 	u64 lockval;
782 };
783 
784 static union hpet_lock hpet __cacheline_aligned = {
785 	{ .lock = __ARCH_SPIN_LOCK_UNLOCKED, },
786 };
787 
788 static u64 read_hpet(struct clocksource *cs)
789 {
790 	unsigned long flags;
791 	union hpet_lock old, new;
792 
793 	BUILD_BUG_ON(sizeof(union hpet_lock) != 8);
794 
795 	/*
796 	 * Read HPET directly if in NMI.
797 	 */
798 	if (in_nmi())
799 		return (u64)hpet_readl(HPET_COUNTER);
800 
801 	/*
802 	 * Read the current state of the lock and HPET value atomically.
803 	 */
804 	old.lockval = READ_ONCE(hpet.lockval);
805 
806 	if (arch_spin_is_locked(&old.lock))
807 		goto contended;
808 
809 	local_irq_save(flags);
810 	if (arch_spin_trylock(&hpet.lock)) {
811 		new.value = hpet_readl(HPET_COUNTER);
812 		/*
813 		 * Use WRITE_ONCE() to prevent store tearing.
814 		 */
815 		WRITE_ONCE(hpet.value, new.value);
816 		arch_spin_unlock(&hpet.lock);
817 		local_irq_restore(flags);
818 		return (u64)new.value;
819 	}
820 	local_irq_restore(flags);
821 
822 contended:
823 	/*
824 	 * Contended case
825 	 * --------------
826 	 * Wait until the HPET value change or the lock is free to indicate
827 	 * its value is up-to-date.
828 	 *
829 	 * It is possible that old.value has already contained the latest
830 	 * HPET value while the lock holder was in the process of releasing
831 	 * the lock. Checking for lock state change will enable us to return
832 	 * the value immediately instead of waiting for the next HPET reader
833 	 * to come along.
834 	 */
835 	do {
836 		cpu_relax();
837 		new.lockval = READ_ONCE(hpet.lockval);
838 	} while ((new.value == old.value) && arch_spin_is_locked(&new.lock));
839 
840 	return (u64)new.value;
841 }
842 #else
843 /*
844  * For UP or 32-bit.
845  */
846 static u64 read_hpet(struct clocksource *cs)
847 {
848 	return (u64)hpet_readl(HPET_COUNTER);
849 }
850 #endif
851 
852 static struct clocksource clocksource_hpet = {
853 	.name		= "hpet",
854 	.rating		= 250,
855 	.read		= read_hpet,
856 	.mask		= HPET_MASK,
857 	.flags		= CLOCK_SOURCE_IS_CONTINUOUS,
858 	.resume		= hpet_resume_counter,
859 };
860 
861 static int hpet_clocksource_register(void)
862 {
863 	u64 start, now;
864 	u64 t1;
865 
866 	/* Start the counter */
867 	hpet_restart_counter();
868 
869 	/* Verify whether hpet counter works */
870 	t1 = hpet_readl(HPET_COUNTER);
871 	start = rdtsc();
872 
873 	/*
874 	 * We don't know the TSC frequency yet, but waiting for
875 	 * 200000 TSC cycles is safe:
876 	 * 4 GHz == 50us
877 	 * 1 GHz == 200us
878 	 */
879 	do {
880 		rep_nop();
881 		now = rdtsc();
882 	} while ((now - start) < 200000UL);
883 
884 	if (t1 == hpet_readl(HPET_COUNTER)) {
885 		printk(KERN_WARNING
886 		       "HPET counter not counting. HPET disabled\n");
887 		return -ENODEV;
888 	}
889 
890 	clocksource_register_hz(&clocksource_hpet, (u32)hpet_freq);
891 	return 0;
892 }
893 
894 static u32 *hpet_boot_cfg;
895 
896 /**
897  * hpet_enable - Try to setup the HPET timer. Returns 1 on success.
898  */
899 int __init hpet_enable(void)
900 {
901 	u32 hpet_period, cfg, id;
902 	u64 freq;
903 	unsigned int i, last;
904 
905 	if (!is_hpet_capable())
906 		return 0;
907 
908 	hpet_set_mapping();
909 	if (!hpet_virt_address)
910 		return 0;
911 
912 	/*
913 	 * Read the period and check for a sane value:
914 	 */
915 	hpet_period = hpet_readl(HPET_PERIOD);
916 
917 	/*
918 	 * AMD SB700 based systems with spread spectrum enabled use a
919 	 * SMM based HPET emulation to provide proper frequency
920 	 * setting. The SMM code is initialized with the first HPET
921 	 * register access and takes some time to complete. During
922 	 * this time the config register reads 0xffffffff. We check
923 	 * for max. 1000 loops whether the config register reads a non
924 	 * 0xffffffff value to make sure that HPET is up and running
925 	 * before we go further. A counting loop is safe, as the HPET
926 	 * access takes thousands of CPU cycles. On non SB700 based
927 	 * machines this check is only done once and has no side
928 	 * effects.
929 	 */
930 	for (i = 0; hpet_readl(HPET_CFG) == 0xFFFFFFFF; i++) {
931 		if (i == 1000) {
932 			printk(KERN_WARNING
933 			       "HPET config register value = 0xFFFFFFFF. "
934 			       "Disabling HPET\n");
935 			goto out_nohpet;
936 		}
937 	}
938 
939 	if (hpet_period < HPET_MIN_PERIOD || hpet_period > HPET_MAX_PERIOD)
940 		goto out_nohpet;
941 
942 	/*
943 	 * The period is a femto seconds value. Convert it to a
944 	 * frequency.
945 	 */
946 	freq = FSEC_PER_SEC;
947 	do_div(freq, hpet_period);
948 	hpet_freq = freq;
949 
950 	/*
951 	 * Read the HPET ID register to retrieve the IRQ routing
952 	 * information and the number of channels
953 	 */
954 	id = hpet_readl(HPET_ID);
955 	hpet_print_config();
956 
957 	last = (id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT;
958 
959 #ifdef CONFIG_HPET_EMULATE_RTC
960 	/*
961 	 * The legacy routing mode needs at least two channels, tick timer
962 	 * and the rtc emulation channel.
963 	 */
964 	if (!last)
965 		goto out_nohpet;
966 #endif
967 
968 	cfg = hpet_readl(HPET_CFG);
969 	hpet_boot_cfg = kmalloc_array(last + 2, sizeof(*hpet_boot_cfg),
970 				      GFP_KERNEL);
971 	if (hpet_boot_cfg)
972 		*hpet_boot_cfg = cfg;
973 	else
974 		pr_warn("HPET initial state will not be saved\n");
975 	cfg &= ~(HPET_CFG_ENABLE | HPET_CFG_LEGACY);
976 	hpet_writel(cfg, HPET_CFG);
977 	if (cfg)
978 		pr_warn("Unrecognized bits %#x set in global cfg\n", cfg);
979 
980 	for (i = 0; i <= last; ++i) {
981 		cfg = hpet_readl(HPET_Tn_CFG(i));
982 		if (hpet_boot_cfg)
983 			hpet_boot_cfg[i + 1] = cfg;
984 		cfg &= ~(HPET_TN_ENABLE | HPET_TN_LEVEL | HPET_TN_FSB);
985 		hpet_writel(cfg, HPET_Tn_CFG(i));
986 		cfg &= ~(HPET_TN_PERIODIC | HPET_TN_PERIODIC_CAP
987 			 | HPET_TN_64BIT_CAP | HPET_TN_32BIT | HPET_TN_ROUTE
988 			 | HPET_TN_FSB | HPET_TN_FSB_CAP);
989 		if (cfg)
990 			pr_warn("Unrecognized bits %#x set in cfg#%u\n",
991 				cfg, i);
992 	}
993 	hpet_print_config();
994 
995 	if (hpet_clocksource_register())
996 		goto out_nohpet;
997 
998 	if (id & HPET_ID_LEGSUP) {
999 		hpet_legacy_clockevent_register();
1000 		return 1;
1001 	}
1002 	return 0;
1003 
1004 out_nohpet:
1005 	hpet_clear_mapping();
1006 	hpet_address = 0;
1007 	return 0;
1008 }
1009 
1010 /*
1011  * Needs to be late, as the reserve_timer code calls kalloc !
1012  *
1013  * Not a problem on i386 as hpet_enable is called from late_time_init,
1014  * but on x86_64 it is necessary !
1015  */
1016 static __init int hpet_late_init(void)
1017 {
1018 	int ret;
1019 
1020 	if (boot_hpet_disable)
1021 		return -ENODEV;
1022 
1023 	if (!hpet_address) {
1024 		if (!force_hpet_address)
1025 			return -ENODEV;
1026 
1027 		hpet_address = force_hpet_address;
1028 		hpet_enable();
1029 	}
1030 
1031 	if (!hpet_virt_address)
1032 		return -ENODEV;
1033 
1034 	if (hpet_readl(HPET_ID) & HPET_ID_LEGSUP)
1035 		hpet_msi_capability_lookup(2);
1036 	else
1037 		hpet_msi_capability_lookup(0);
1038 
1039 	hpet_reserve_platform_timers(hpet_readl(HPET_ID));
1040 	hpet_print_config();
1041 
1042 	if (hpet_msi_disable)
1043 		return 0;
1044 
1045 	if (boot_cpu_has(X86_FEATURE_ARAT))
1046 		return 0;
1047 
1048 	/* This notifier should be called after workqueue is ready */
1049 	ret = cpuhp_setup_state(CPUHP_AP_X86_HPET_ONLINE, "x86/hpet:online",
1050 				hpet_cpuhp_online, NULL);
1051 	if (ret)
1052 		return ret;
1053 	ret = cpuhp_setup_state(CPUHP_X86_HPET_DEAD, "x86/hpet:dead", NULL,
1054 				hpet_cpuhp_dead);
1055 	if (ret)
1056 		goto err_cpuhp;
1057 	return 0;
1058 
1059 err_cpuhp:
1060 	cpuhp_remove_state(CPUHP_AP_X86_HPET_ONLINE);
1061 	return ret;
1062 }
1063 fs_initcall(hpet_late_init);
1064 
1065 void hpet_disable(void)
1066 {
1067 	if (is_hpet_capable() && hpet_virt_address) {
1068 		unsigned int cfg = hpet_readl(HPET_CFG), id, last;
1069 
1070 		if (hpet_boot_cfg)
1071 			cfg = *hpet_boot_cfg;
1072 		else if (hpet_legacy_int_enabled) {
1073 			cfg &= ~HPET_CFG_LEGACY;
1074 			hpet_legacy_int_enabled = false;
1075 		}
1076 		cfg &= ~HPET_CFG_ENABLE;
1077 		hpet_writel(cfg, HPET_CFG);
1078 
1079 		if (!hpet_boot_cfg)
1080 			return;
1081 
1082 		id = hpet_readl(HPET_ID);
1083 		last = ((id & HPET_ID_NUMBER) >> HPET_ID_NUMBER_SHIFT);
1084 
1085 		for (id = 0; id <= last; ++id)
1086 			hpet_writel(hpet_boot_cfg[id + 1], HPET_Tn_CFG(id));
1087 
1088 		if (*hpet_boot_cfg & HPET_CFG_ENABLE)
1089 			hpet_writel(*hpet_boot_cfg, HPET_CFG);
1090 	}
1091 }
1092 
1093 #ifdef CONFIG_HPET_EMULATE_RTC
1094 
1095 /* HPET in LegacyReplacement Mode eats up RTC interrupt line. When, HPET
1096  * is enabled, we support RTC interrupt functionality in software.
1097  * RTC has 3 kinds of interrupts:
1098  * 1) Update Interrupt - generate an interrupt, every sec, when RTC clock
1099  *    is updated
1100  * 2) Alarm Interrupt - generate an interrupt at a specific time of day
1101  * 3) Periodic Interrupt - generate periodic interrupt, with frequencies
1102  *    2Hz-8192Hz (2Hz-64Hz for non-root user) (all freqs in powers of 2)
1103  * (1) and (2) above are implemented using polling at a frequency of
1104  * 64 Hz. The exact frequency is a tradeoff between accuracy and interrupt
1105  * overhead. (DEFAULT_RTC_INT_FREQ)
1106  * For (3), we use interrupts at 64Hz or user specified periodic
1107  * frequency, whichever is higher.
1108  */
1109 #include <linux/mc146818rtc.h>
1110 #include <linux/rtc.h>
1111 
1112 #define DEFAULT_RTC_INT_FREQ	64
1113 #define DEFAULT_RTC_SHIFT	6
1114 #define RTC_NUM_INTS		1
1115 
1116 static unsigned long hpet_rtc_flags;
1117 static int hpet_prev_update_sec;
1118 static struct rtc_time hpet_alarm_time;
1119 static unsigned long hpet_pie_count;
1120 static u32 hpet_t1_cmp;
1121 static u32 hpet_default_delta;
1122 static u32 hpet_pie_delta;
1123 static unsigned long hpet_pie_limit;
1124 
1125 static rtc_irq_handler irq_handler;
1126 
1127 /*
1128  * Check that the hpet counter c1 is ahead of the c2
1129  */
1130 static inline int hpet_cnt_ahead(u32 c1, u32 c2)
1131 {
1132 	return (s32)(c2 - c1) < 0;
1133 }
1134 
1135 /*
1136  * Registers a IRQ handler.
1137  */
1138 int hpet_register_irq_handler(rtc_irq_handler handler)
1139 {
1140 	if (!is_hpet_enabled())
1141 		return -ENODEV;
1142 	if (irq_handler)
1143 		return -EBUSY;
1144 
1145 	irq_handler = handler;
1146 
1147 	return 0;
1148 }
1149 EXPORT_SYMBOL_GPL(hpet_register_irq_handler);
1150 
1151 /*
1152  * Deregisters the IRQ handler registered with hpet_register_irq_handler()
1153  * and does cleanup.
1154  */
1155 void hpet_unregister_irq_handler(rtc_irq_handler handler)
1156 {
1157 	if (!is_hpet_enabled())
1158 		return;
1159 
1160 	irq_handler = NULL;
1161 	hpet_rtc_flags = 0;
1162 }
1163 EXPORT_SYMBOL_GPL(hpet_unregister_irq_handler);
1164 
1165 /*
1166  * Timer 1 for RTC emulation. We use one shot mode, as periodic mode
1167  * is not supported by all HPET implementations for timer 1.
1168  *
1169  * hpet_rtc_timer_init() is called when the rtc is initialized.
1170  */
1171 int hpet_rtc_timer_init(void)
1172 {
1173 	unsigned int cfg, cnt, delta;
1174 	unsigned long flags;
1175 
1176 	if (!is_hpet_enabled())
1177 		return 0;
1178 
1179 	if (!hpet_default_delta) {
1180 		uint64_t clc;
1181 
1182 		clc = (uint64_t) hpet_clockevent.mult * NSEC_PER_SEC;
1183 		clc >>= hpet_clockevent.shift + DEFAULT_RTC_SHIFT;
1184 		hpet_default_delta = clc;
1185 	}
1186 
1187 	if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit)
1188 		delta = hpet_default_delta;
1189 	else
1190 		delta = hpet_pie_delta;
1191 
1192 	local_irq_save(flags);
1193 
1194 	cnt = delta + hpet_readl(HPET_COUNTER);
1195 	hpet_writel(cnt, HPET_T1_CMP);
1196 	hpet_t1_cmp = cnt;
1197 
1198 	cfg = hpet_readl(HPET_T1_CFG);
1199 	cfg &= ~HPET_TN_PERIODIC;
1200 	cfg |= HPET_TN_ENABLE | HPET_TN_32BIT;
1201 	hpet_writel(cfg, HPET_T1_CFG);
1202 
1203 	local_irq_restore(flags);
1204 
1205 	return 1;
1206 }
1207 EXPORT_SYMBOL_GPL(hpet_rtc_timer_init);
1208 
1209 static void hpet_disable_rtc_channel(void)
1210 {
1211 	u32 cfg = hpet_readl(HPET_T1_CFG);
1212 	cfg &= ~HPET_TN_ENABLE;
1213 	hpet_writel(cfg, HPET_T1_CFG);
1214 }
1215 
1216 /*
1217  * The functions below are called from rtc driver.
1218  * Return 0 if HPET is not being used.
1219  * Otherwise do the necessary changes and return 1.
1220  */
1221 int hpet_mask_rtc_irq_bit(unsigned long bit_mask)
1222 {
1223 	if (!is_hpet_enabled())
1224 		return 0;
1225 
1226 	hpet_rtc_flags &= ~bit_mask;
1227 	if (unlikely(!hpet_rtc_flags))
1228 		hpet_disable_rtc_channel();
1229 
1230 	return 1;
1231 }
1232 EXPORT_SYMBOL_GPL(hpet_mask_rtc_irq_bit);
1233 
1234 int hpet_set_rtc_irq_bit(unsigned long bit_mask)
1235 {
1236 	unsigned long oldbits = hpet_rtc_flags;
1237 
1238 	if (!is_hpet_enabled())
1239 		return 0;
1240 
1241 	hpet_rtc_flags |= bit_mask;
1242 
1243 	if ((bit_mask & RTC_UIE) && !(oldbits & RTC_UIE))
1244 		hpet_prev_update_sec = -1;
1245 
1246 	if (!oldbits)
1247 		hpet_rtc_timer_init();
1248 
1249 	return 1;
1250 }
1251 EXPORT_SYMBOL_GPL(hpet_set_rtc_irq_bit);
1252 
1253 int hpet_set_alarm_time(unsigned char hrs, unsigned char min,
1254 			unsigned char sec)
1255 {
1256 	if (!is_hpet_enabled())
1257 		return 0;
1258 
1259 	hpet_alarm_time.tm_hour = hrs;
1260 	hpet_alarm_time.tm_min = min;
1261 	hpet_alarm_time.tm_sec = sec;
1262 
1263 	return 1;
1264 }
1265 EXPORT_SYMBOL_GPL(hpet_set_alarm_time);
1266 
1267 int hpet_set_periodic_freq(unsigned long freq)
1268 {
1269 	uint64_t clc;
1270 
1271 	if (!is_hpet_enabled())
1272 		return 0;
1273 
1274 	if (freq <= DEFAULT_RTC_INT_FREQ)
1275 		hpet_pie_limit = DEFAULT_RTC_INT_FREQ / freq;
1276 	else {
1277 		clc = (uint64_t) hpet_clockevent.mult * NSEC_PER_SEC;
1278 		do_div(clc, freq);
1279 		clc >>= hpet_clockevent.shift;
1280 		hpet_pie_delta = clc;
1281 		hpet_pie_limit = 0;
1282 	}
1283 	return 1;
1284 }
1285 EXPORT_SYMBOL_GPL(hpet_set_periodic_freq);
1286 
1287 int hpet_rtc_dropped_irq(void)
1288 {
1289 	return is_hpet_enabled();
1290 }
1291 EXPORT_SYMBOL_GPL(hpet_rtc_dropped_irq);
1292 
1293 static void hpet_rtc_timer_reinit(void)
1294 {
1295 	unsigned int delta;
1296 	int lost_ints = -1;
1297 
1298 	if (unlikely(!hpet_rtc_flags))
1299 		hpet_disable_rtc_channel();
1300 
1301 	if (!(hpet_rtc_flags & RTC_PIE) || hpet_pie_limit)
1302 		delta = hpet_default_delta;
1303 	else
1304 		delta = hpet_pie_delta;
1305 
1306 	/*
1307 	 * Increment the comparator value until we are ahead of the
1308 	 * current count.
1309 	 */
1310 	do {
1311 		hpet_t1_cmp += delta;
1312 		hpet_writel(hpet_t1_cmp, HPET_T1_CMP);
1313 		lost_ints++;
1314 	} while (!hpet_cnt_ahead(hpet_t1_cmp, hpet_readl(HPET_COUNTER)));
1315 
1316 	if (lost_ints) {
1317 		if (hpet_rtc_flags & RTC_PIE)
1318 			hpet_pie_count += lost_ints;
1319 		if (printk_ratelimit())
1320 			printk(KERN_WARNING "hpet1: lost %d rtc interrupts\n",
1321 				lost_ints);
1322 	}
1323 }
1324 
1325 irqreturn_t hpet_rtc_interrupt(int irq, void *dev_id)
1326 {
1327 	struct rtc_time curr_time;
1328 	unsigned long rtc_int_flag = 0;
1329 
1330 	hpet_rtc_timer_reinit();
1331 	memset(&curr_time, 0, sizeof(struct rtc_time));
1332 
1333 	if (hpet_rtc_flags & (RTC_UIE | RTC_AIE))
1334 		mc146818_get_time(&curr_time);
1335 
1336 	if (hpet_rtc_flags & RTC_UIE &&
1337 	    curr_time.tm_sec != hpet_prev_update_sec) {
1338 		if (hpet_prev_update_sec >= 0)
1339 			rtc_int_flag = RTC_UF;
1340 		hpet_prev_update_sec = curr_time.tm_sec;
1341 	}
1342 
1343 	if (hpet_rtc_flags & RTC_PIE &&
1344 	    ++hpet_pie_count >= hpet_pie_limit) {
1345 		rtc_int_flag |= RTC_PF;
1346 		hpet_pie_count = 0;
1347 	}
1348 
1349 	if (hpet_rtc_flags & RTC_AIE &&
1350 	    (curr_time.tm_sec == hpet_alarm_time.tm_sec) &&
1351 	    (curr_time.tm_min == hpet_alarm_time.tm_min) &&
1352 	    (curr_time.tm_hour == hpet_alarm_time.tm_hour))
1353 			rtc_int_flag |= RTC_AF;
1354 
1355 	if (rtc_int_flag) {
1356 		rtc_int_flag |= (RTC_IRQF | (RTC_NUM_INTS << 8));
1357 		if (irq_handler)
1358 			irq_handler(rtc_int_flag, dev_id);
1359 	}
1360 	return IRQ_HANDLED;
1361 }
1362 EXPORT_SYMBOL_GPL(hpet_rtc_interrupt);
1363 #endif
1364