11da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifndef _ASM_IA64_DELAY_H
21da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#define _ASM_IA64_DELAY_H
31da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
41da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds/*
51da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Delay routines using a pre-computed "cycles/usec" value.
61da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *
71da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1998, 1999 Hewlett-Packard Co
81da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds *	David Mosberger-Tang <davidm@hpl.hp.com>
91da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 VA Linux Systems
101da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
111da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
121da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
131da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds */
141da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
151da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/kernel.h>
161da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/sched.h>
171da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <linux/compiler.h>
181da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
191da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/intrinsics.h>
201da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#include <asm/processor.h>
211da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
221da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ void
231da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_set_itm (unsigned long val)
241da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
251da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_setreg(_IA64_REG_CR_ITM, val);
261da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_srlz_d();
271da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
281da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
291da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ unsigned long
301da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_get_itm (void)
311da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
321da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long result;
331da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
341da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	result = ia64_getreg(_IA64_REG_CR_ITM);
351da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_srlz_d();
361da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return result;
371da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
381da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
391da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ void
401da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_set_itv (unsigned long val)
411da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
421da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_setreg(_IA64_REG_CR_ITV, val);
431da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_srlz_d();
441da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
451da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
461da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ unsigned long
471da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_get_itv (void)
481da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
491da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return ia64_getreg(_IA64_REG_CR_ITV);
501da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
511da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
521da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ void
531da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_set_itc (unsigned long val)
541da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
551da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_setreg(_IA64_REG_AR_ITC, val);
561da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_srlz_d();
571da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
581da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
591da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ unsigned long
601da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsia64_get_itc (void)
611da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
621da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	unsigned long result;
631da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
641da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	result = ia64_getreg(_IA64_REG_AR_ITC);
651da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_barrier();
661da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#ifdef CONFIG_ITANIUM
671da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	while (unlikely((__s32) result == -1)) {
681da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		result = ia64_getreg(_IA64_REG_AR_ITC);
691da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		ia64_barrier();
701da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	}
711da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif
721da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	return result;
731da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
741da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
751da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsextern void ia64_delay_loop (unsigned long loops);
761da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
771da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvaldsstatic __inline__ void
781da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds__delay (unsigned long loops)
791da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds{
801da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	if (unlikely(loops < 1))
811da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds		return;
821da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
831da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds	ia64_delay_loop (loops - 1);
841da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds}
851da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
86f5899b5d4fa806403f547dc41312d017d94ec273John Hawkesextern void udelay (unsigned long usecs);
871da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds
881da177e4c3f41524e886b7f1b8a0c1fc7321cacLinus Torvalds#endif /* _ASM_IA64_DELAY_H */
89