|
@@ -17,7 +17,7 @@
|
|
|
static struct acpi_HPET_description_table_t *hpet_table;
|
|
|
static uint64_t HPET_REG_BASE = 0;
|
|
|
static uint32_t HPET_COUNTER_CLK_PERIOD = 0;
|
|
|
-static double HPET_freq = 0;
|
|
|
+static uint64_t HPET_freq = 0;
|
|
|
static uint8_t HPET_NUM_TIM_CAP = 0;
|
|
|
static char measure_apic_timer_flag;
|
|
|
|
|
@@ -124,7 +124,7 @@ void HPET_measure_freq()
|
|
|
|
|
|
|
|
|
apic_make_rte_entry(&entry, 34, IO_APIC_FIXED, DEST_PHYSICAL, IDLE, POLARITY_HIGH, IRR_RESET, EDGE_TRIGGER, MASKED, 0);
|
|
|
-
|
|
|
+
|
|
|
|
|
|
uint64_t clks_to_intr = 0.001 * interval * HPET_freq;
|
|
|
|
|
@@ -134,11 +134,11 @@ void HPET_measure_freq()
|
|
|
while (1)
|
|
|
hlt();
|
|
|
}
|
|
|
- *(uint64_t *)(HPET_REG_BASE + MAIN_CNT) = 0;
|
|
|
+ __write8b(HPET_REG_BASE + MAIN_CNT, 0);
|
|
|
io_mfence();
|
|
|
- *(uint64_t *)(HPET_REG_BASE + TIM0_CONF) = 0x0044;
|
|
|
+ __write8b((HPET_REG_BASE + TIM0_CONF), 0x0044);
|
|
|
io_mfence();
|
|
|
- *(uint64_t *)(HPET_REG_BASE + TIM0_COMP) = clks_to_intr;
|
|
|
+ __write8b(HPET_REG_BASE + TIM0_COMP, clks_to_intr);
|
|
|
|
|
|
io_mfence();
|
|
|
|
|
@@ -146,6 +146,7 @@ void HPET_measure_freq()
|
|
|
|
|
|
|
|
|
irq_register(34, &entry, &HPET_measure_handler, 0, &HPET_intr_controller, "HPET0 measure");
|
|
|
+ sti();
|
|
|
|
|
|
|
|
|
apic_timer_stop();
|
|
@@ -156,13 +157,13 @@ void HPET_measure_freq()
|
|
|
|
|
|
|
|
|
apic_timer_set_LVT(151, 0, APIC_LVT_Timer_One_Shot);
|
|
|
- *(uint64_t *)(HPET_REG_BASE + GEN_CONF) = 3;
|
|
|
+ __write8b(HPET_REG_BASE + GEN_CONF, 3);
|
|
|
+
|
|
|
|
|
|
test_tsc_start = rdtsc();
|
|
|
io_mfence();
|
|
|
while (measure_apic_timer_flag == false)
|
|
|
;
|
|
|
- kdebug("wait done");
|
|
|
|
|
|
irq_unregister(34);
|
|
|
|
|
@@ -195,11 +196,11 @@ void HPET_enable()
|
|
|
hlt();
|
|
|
}
|
|
|
|
|
|
- *(uint64_t *)(HPET_REG_BASE + MAIN_CNT) = 0;
|
|
|
+ __write8b(HPET_REG_BASE + MAIN_CNT, 0);
|
|
|
io_mfence();
|
|
|
- *(uint64_t *)(HPET_REG_BASE + TIM0_CONF) = 0x004c;
|
|
|
+ __write8b(HPET_REG_BASE + TIM0_CONF, 0x004c);
|
|
|
io_mfence();
|
|
|
- *(uint64_t *)(HPET_REG_BASE + TIM0_COMP) = clks_to_intr;
|
|
|
+ __write8b(HPET_REG_BASE + TIM0_COMP, clks_to_intr);
|
|
|
|
|
|
io_mfence();
|
|
|
|
|
@@ -210,7 +211,7 @@ void HPET_enable()
|
|
|
|
|
|
kinfo("HPET0 enabled.");
|
|
|
|
|
|
- *(uint64_t *)(HPET_REG_BASE + GEN_CONF) = 3;
|
|
|
+ __write8b(HPET_REG_BASE + GEN_CONF, 3);
|
|
|
io_mfence();
|
|
|
|
|
|
irq_register(34, &entry, &HPET_handler, 0, &HPET_intr_controller, "HPET0");
|
|
@@ -231,11 +232,11 @@ int HPET_init()
|
|
|
if (RCBA_vaddr != 0)
|
|
|
{
|
|
|
kerror("NO HPET found on this computer!");
|
|
|
- uint32_t *hptc = (uint32_t *)(RCBA_vaddr + 0x3404UL);
|
|
|
+ uint64_t hptc_vaddr = (RCBA_vaddr + 0x3404UL);
|
|
|
|
|
|
io_mfence();
|
|
|
|
|
|
- switch ((*hptc) & 0x3)
|
|
|
+ switch (__read4b(hptc_vaddr) & 0x3)
|
|
|
{
|
|
|
case 0:
|
|
|
HPET_REG_BASE = SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + 0xfed00000;
|
|
@@ -253,7 +254,7 @@ int HPET_init()
|
|
|
break;
|
|
|
}
|
|
|
|
|
|
- *hptc = 0x80;
|
|
|
+ __write4b(hptc_vaddr, 0x80);
|
|
|
io_mfence();
|
|
|
}
|
|
|
else
|
|
@@ -270,19 +271,20 @@ int HPET_init()
|
|
|
|
|
|
|
|
|
HPET_REG_BASE = SPECIAL_MEMOEY_MAPPING_VIRT_ADDR_BASE + hpet_table->address;
|
|
|
+ kdebug("hpet_table->address=%#018lx", hpet_table->address);
|
|
|
}
|
|
|
+ kdebug("HPET_REG_BASE=%#018lx", HPET_REG_BASE);
|
|
|
|
|
|
|
|
|
uint64_t tmp;
|
|
|
- tmp = *(uint64_t *)(HPET_REG_BASE + GCAP_ID);
|
|
|
+ tmp = __read8b(HPET_REG_BASE + GCAP_ID);
|
|
|
HPET_COUNTER_CLK_PERIOD = (tmp >> 32) & 0xffffffff;
|
|
|
- HPET_freq = 1.0 * 1e15 / HPET_COUNTER_CLK_PERIOD;
|
|
|
+ HPET_freq = 1e15 / HPET_COUNTER_CLK_PERIOD;
|
|
|
HPET_NUM_TIM_CAP = (tmp >> 8) & 0x1f;
|
|
|
+
|
|
|
+ kdebug("HPET_COUNTER_CLK_PERIOD=%#018lx", HPET_COUNTER_CLK_PERIOD);
|
|
|
kinfo("Total HPET timers: %d", HPET_NUM_TIM_CAP);
|
|
|
|
|
|
kinfo("HPET driver Initialized.");
|
|
|
-
|
|
|
-
|
|
|
-
|
|
|
}
|
|
|
#pragma GCC pop_options
|