Chameleon Applications

Chameleon Applications Svn Source Tree

Root/branches/iFabio/Chameleon/i386/libsaio/hpet.c

Source at commit 318 created 12 years 9 months ago.
By ifabio, update chameleon to 1162.
1/*
2 *
3 */
4
5#include "libsaio.h"
6#include "pci.h"
7#include "hpet.h"
8
9#ifndef DEBUG_HPET
10#define DEBUG_HPET 0
11#endif
12
13#if DEBUG_HPET
14#define DBG(x...) printf(x)
15#else
16#define DBG(x...)
17#endif
18
19static struct lpc_controller_t lpc_controllers[] = {
20
21// Default unknown chipset
22{ 0, 0, "" },
23
24// Intel
25{ 0x8086, 0x24dc, "ICH5" },
26{ 0x8086, 0x2640, "ICH6" },
27{ 0x8086, 0x2641, "ICH6M" },
28
29{ 0x8086, 0x27b0, "ICH7 DH" },
30{ 0x8086, 0x27b8, "ICH7" },
31{ 0x8086, 0x27b9, "ICH7M" },
32{ 0x8086, 0x27bd, "ICH7M DH" },
33
34{ 0x8086, 0x27bc, "NM10" },
35{ 0x8086, 0x2810, "ICH8R" },
36{ 0x8086, 0x2811, "ICH8M-E" },
37{ 0x8086, 0x2812, "ICH8DH" },
38{ 0x8086, 0x2814, "ICH8DO" },
39{ 0x8086, 0x2815, "ICH8M" },
40
41{ 0x8086, 0x2912, "ICH9DH" },
42{ 0x8086, 0x2914, "ICH9DO" },
43{ 0x8086, 0x2916, "ICH9R" },
44{ 0x8086, 0x2917, "ICH9M-E" },
45{ 0x8086, 0x2918, "ICH9" },
46{ 0x8086, 0x2919, "ICH9M" },
47
48{ 0x8086, 0x3a14, "ICH10DO" },
49{ 0x8086, 0x3a16, "ICH10R" },
50{ 0x8086, 0x3a18, "ICH10" },
51{ 0x8086, 0x3a1a, "ICH10D" },
52
53};
54
55void force_enable_hpet(pci_dt_t *lpc_dev)
56{
57int i;
58uint32_tval, hpet_address = 0xFED00000;
59void*rcba;
60
61/* LPC on Intel ICH is always (?) at 00:1f.0 */
62for(i = 1; i < sizeof(lpc_controllers) / sizeof(lpc_controllers[0]); i++)
63if ((lpc_controllers[i].vendor == lpc_dev->vendor_id)
64&& (lpc_controllers[i].device == lpc_dev->device_id))
65{
66rcba = (void *)(pci_config_read32(lpc_dev->dev.addr, 0xF0) & 0xFFFFC000);
67
68DBG("Intel(R) %s LPC Interface [%04x:%04x], MMIO @ 0x%lx\n",
69lpc_controllers[i].name, lpc_dev->vendor_id, lpc_dev->device_id, rcba);
70
71if (rcba == 0)
72printf(" RCBA disabled; cannot force enable HPET\n");
73else
74{
75val = REG32(rcba, 0x3404);
76if (val & 0x80)
77{
78// HPET is enabled in HPTC. Just not reported by BIOS
79DBG(" HPET is enabled in HPTC, just not reported by BIOS\n");
80hpet_address |= (val & 3) << 12 ;
81DBG(" HPET MMIO @ 0x%lx\n", hpet_address);
82}
83else
84{
85// HPET disabled in HPTC. Trying to enable
86DBG(" HPET is disabled in HPTC, trying to enable\n");
87REG32(rcba, 0x3404) = val | 0x80;
88hpet_address |= (val & 3) << 12 ;
89DBG(" Force enabled HPET, MMIO @ 0x%lx\n", hpet_address);
90}
91
92// verify if the job is done
93val = REG32(rcba, 0x3404);
94if (!(val & 0x80))
95printf(" Failed to force enable HPET\n");
96}
97break;
98}
99
100#if DEBUG_HPET
101printf("Press [Enter] to continue...\n");
102getchar();
103#endif
104}
105

Archive Download this file

Revision: 318