// Internal timer // // Copyright (C) 2008-2013 Kevin O'Connor // // This file may be distributed under the terms of the GNU LGPLv3 license. #include "config.h" // CONFIG_* #include "x86.h" // rdtscll() #include "util.h" // timer_setup #include "parisc/pdc.h" // Setup internal timers. void timer_setup(void) { } void pmtimer_setup(u16 ioport) { } // Return the number of milliseconds in 'ticks' number of timer irqs. u32 ticks_to_ms(u32 ticks) { return (10 * ticks / PAGE0->mem_10msec); } u32 ticks_from_ms(u32 ms) { return (ms * PAGE0->mem_10msec / 10); } /**************************************************************** * Internal timer reading ****************************************************************/ u32 TimerLast VARLOW; // Sample the current timer value. static u32 timer_read(void) { return rdtscll(); } // Check if the current time is past a previously calculated end time. int timer_check(u32 end) { return (s32)(timer_read() - end) > 0; } static void timer_sleep(u32 diff) { u32 start = timer_read(); u32 end = start + diff; while (!timer_check(end)) /* idle wait */; } void ndelay(u32 count) { timer_sleep((count * PAGE0->mem_10msec / 10) / 1000 / 1000); } void udelay(u32 count) { timer_sleep((count * PAGE0->mem_10msec / 10) / 1000); } void mdelay(u32 count) { timer_sleep((count * PAGE0->mem_10msec / 10)); } void nsleep(u32 count) { ndelay(count); } void usleep(u32 count) { udelay(count); } void msleep(u32 count) { mdelay(count); } // Return the TSC value that is 'msecs' time in the future. u32 timer_calc(u32 msecs) { return (msecs * PAGE0->mem_10msec / 10) + timer_read(); } u32 timer_calc_usec(u32 usecs) { return ((usecs * PAGE0->mem_10msec / 10) / 1000) + timer_read(); } void pit_setup(void) { }