blob: e9369ee54025ef335dbf6ba1936036f558c1893d [file] [log] [blame]
Angel Ponseef43432021-01-12 22:25:28 +01001/* SPDX-License-Identifier: GPL-2.0-only */
2
Felix Heldf47d17d2022-02-24 01:03:23 +01003#include <arch/hpet.h>
Angel Ponseef43432021-01-12 22:25:28 +01004#include <southbridge/intel/common/rcba.h>
5#include <stdint.h>
6
7#include "hpet.h"
8
9#define HPTC 0x3404
10
Felix Heldf47d17d2022-02-24 01:03:23 +010011#define HPET32(x) (*((volatile u32 *)(HPET_BASE_ADDRESS + (x))))
Angel Ponseef43432021-01-12 22:25:28 +010012
13void enable_hpet(void)
14{
15 u32 reg32;
16 reg32 = RCBA32(HPTC);
17 reg32 &= ~0x03;
18 reg32 |= (1 << 7);
19 RCBA32(HPTC) = reg32;
20 /* Read back for posted write to take effect */
21 RCBA32(HPTC);
22 HPET32(0x10) = HPET32(0x10) | 1;
23}
24
25void hpet_udelay(u32 delay)
26{
27 u32 start, finish, now;
28
29 delay *= 15; /* now in usec */
30
31 start = HPET32(0xf0);
32 finish = start + delay;
33 while (1) {
34 now = HPET32(0xf0);
35 if (finish > start) {
36 if (now >= finish)
37 break;
38 } else {
39 if ((now < start) && (now >= finish))
40 break;
41 }
42 }
43}