Chameleon Applications

Chameleon Applications Svn Source Tree

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

Source at commit 307 created 12 years 11 months ago.
By ifabio, merge changes from trunk (929). Also merge the module changes from Azimutz branche (fix compile error) Also edited the info.plist into AHCIPortInjector.kext: http://forum.voodooprojects.org/index.php/topic,1170.0.html
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
36{ 0x8086, 0x2810, "ICH8R" },
37{ 0x8086, 0x2811, "ICH8M-E" },
38{ 0x8086, 0x2812, "ICH8DH" },
39{ 0x8086, 0x2814, "ICH8DO" },
40{ 0x8086, 0x2815, "ICH8M" },
41
42{ 0x8086, 0x2912, "ICH9DH" },
43{ 0x8086, 0x2914, "ICH9DO" },
44{ 0x8086, 0x2916, "ICH9R" },
45{ 0x8086, 0x2917, "ICH9M-E" },
46{ 0x8086, 0x2918, "ICH9" },
47{ 0x8086, 0x2919, "ICH9M" },
48
49{ 0x8086, 0x3a14, "ICH10DO" },
50{ 0x8086, 0x3a16, "ICH10R" },
51{ 0x8086, 0x3a18, "ICH10" },
52{ 0x8086, 0x3a1a, "ICH10D" },
53
54};
55
56void force_enable_hpet(pci_dt_t *lpc_dev)
57{
58int i;
59uint32_tval, hpet_address = 0xFED00000;
60void*rcba;
61
62/* LPC on Intel ICH is always (?) at 00:1f.0 */
63for(i = 1; i < sizeof(lpc_controllers) / sizeof(lpc_controllers[0]); i++)
64if ((lpc_controllers[i].vendor == lpc_dev->vendor_id)
65&& (lpc_controllers[i].device == lpc_dev->device_id))
66{
67rcba = (void *)(pci_config_read32(lpc_dev->dev.addr, 0xF0) & 0xFFFFC000);
68
69DBG("Intel(R) %s LPC Interface [%04x:%04x], MMIO @ 0x%lx\n",
70lpc_controllers[i].name, lpc_dev->vendor_id, lpc_dev->device_id, rcba);
71
72if (rcba == 0)
73printf(" RCBA disabled; cannot force enable HPET\n");
74else
75{
76val = REG32(rcba, 0x3404);
77if (val & 0x80)
78{
79// HPET is enabled in HPTC. Just not reported by BIOS
80DBG(" HPET is enabled in HPTC, just not reported by BIOS\n");
81hpet_address |= (val & 3) << 12 ;
82DBG(" HPET MMIO @ 0x%lx\n", hpet_address);
83}
84else
85{
86// HPET disabled in HPTC. Trying to enable
87DBG(" HPET is disabled in HPTC, trying to enable\n");
88REG32(rcba, 0x3404) = val | 0x80;
89hpet_address |= (val & 3) << 12 ;
90DBG(" Force enabled HPET, MMIO @ 0x%lx\n", hpet_address);
91}
92
93// verify if the job is done
94val = REG32(rcba, 0x3404);
95if (!(val & 0x80))
96printf(" Failed to force enable HPET\n");
97}
98break;
99}
100
101#if DEBUG_HPET
102printf("Press [Enter] to continue...\n");
103getc();
104#endif
105}
106

Archive Download this file

Revision: 307