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