Add function to set tsc frequency directly, without calibration.
Also tweak timer setup functions a bit: skip setup in case TimerPort
has not the default value any more, i.e. another timer has been setup
already.
Signed-off-by: Gerd Hoffmann <kraxel(a)redhat.com>
---
src/util.h | 1 +
src/hw/timer.c | 26 +++++++++++++++++++++++++-
2 files changed, 26 insertions(+), 1 deletion(-)
diff --git a/src/util.h b/src/util.h
index d96db788d1b8..94592a2d2e8d 100644
--- a/src/util.h
+++ b/src/util.h
@@ -171,6 +171,7 @@ void sdcard_setup(void);
// hw/timer.c
void timer_setup(void);
void pmtimer_setup(u16 ioport);
+void tsctimer_setfreq(u32 khz, const char *src);
u32 timer_calc(u32 msecs);
u32 timer_calc_usec(u32 usecs);
int timer_check(u32 end);
diff --git a/src/hw/timer.c b/src/hw/timer.c
index bdcb3bfca211..56bb289a4adc 100644
--- a/src/hw/timer.c
+++ b/src/hw/timer.c
@@ -101,8 +101,10 @@ tsctimer_setup(void)
void
timer_setup(void)
{
- if (!CONFIG_TSC_TIMER || (CONFIG_PMTIMER && TimerPort != PORT_PIT_COUNTER0))
+ if (!CONFIG_TSC_TIMER)
return;
+ if (TimerPort != PORT_PIT_COUNTER0)
+ return; // have timer already
// Check if CPU has a timestamp counter
u32 eax, ebx, ecx, edx, cpuid_features = 0;
@@ -113,11 +115,33 @@ timer_setup(void)
tsctimer_setup();
}
+void
+tsctimer_setfreq(u32 khz, const char *src)
+{
+ if (!CONFIG_TSC_TIMER)
+ return;
+ if (TimerPort != PORT_PIT_COUNTER0)
+ return; // have timer already
+
+ TimerKHz = khz;
+ ShiftTSC = 0;
+ while (TimerKHz >= 6000) {
+ ShiftTSC++;
+ TimerKHz = (TimerKHz + 1) >> 1;
+ }
+ TimerPort = 0;
+
+ dprintf(1, "CPU Mhz=%u (%s)\n", (TimerKHz << ShiftTSC) / 1000, src);
+}
+
void
pmtimer_setup(u16 ioport)
{
if (!CONFIG_PMTIMER)
return;
+ if (TimerPort != PORT_PIT_COUNTER0)
+ return; // have timer already
+
dprintf(1, "Using pmtimer, ioport 0x%x\n", ioport);
TimerPort = ioport;
TimerKHz = DIV_ROUND_UP(PMTIMER_HZ, 1000);
--
2.18.2