162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_IA64_DELAY_H 362306a36Sopenharmony_ci#define _ASM_IA64_DELAY_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Delay routines using a pre-computed "cycles/usec" value. 762306a36Sopenharmony_ci * 862306a36Sopenharmony_ci * Copyright (C) 1998, 1999 Hewlett-Packard Co 962306a36Sopenharmony_ci * David Mosberger-Tang <davidm@hpl.hp.com> 1062306a36Sopenharmony_ci * Copyright (C) 1999 VA Linux Systems 1162306a36Sopenharmony_ci * Copyright (C) 1999 Walt Drummond <drummond@valinux.com> 1262306a36Sopenharmony_ci * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com> 1362306a36Sopenharmony_ci * Copyright (C) 1999 Don Dugger <don.dugger@intel.com> 1462306a36Sopenharmony_ci */ 1562306a36Sopenharmony_ci 1662306a36Sopenharmony_ci#include <linux/kernel.h> 1762306a36Sopenharmony_ci#include <linux/sched.h> 1862306a36Sopenharmony_ci#include <linux/compiler.h> 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci#include <asm/intrinsics.h> 2162306a36Sopenharmony_ci#include <asm/processor.h> 2262306a36Sopenharmony_ci 2362306a36Sopenharmony_cistatic __inline__ void 2462306a36Sopenharmony_ciia64_set_itm (unsigned long val) 2562306a36Sopenharmony_ci{ 2662306a36Sopenharmony_ci ia64_setreg(_IA64_REG_CR_ITM, val); 2762306a36Sopenharmony_ci ia64_srlz_d(); 2862306a36Sopenharmony_ci} 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_cistatic __inline__ unsigned long 3162306a36Sopenharmony_ciia64_get_itm (void) 3262306a36Sopenharmony_ci{ 3362306a36Sopenharmony_ci unsigned long result; 3462306a36Sopenharmony_ci 3562306a36Sopenharmony_ci result = ia64_getreg(_IA64_REG_CR_ITM); 3662306a36Sopenharmony_ci ia64_srlz_d(); 3762306a36Sopenharmony_ci return result; 3862306a36Sopenharmony_ci} 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_cistatic __inline__ void 4162306a36Sopenharmony_ciia64_set_itv (unsigned long val) 4262306a36Sopenharmony_ci{ 4362306a36Sopenharmony_ci ia64_setreg(_IA64_REG_CR_ITV, val); 4462306a36Sopenharmony_ci ia64_srlz_d(); 4562306a36Sopenharmony_ci} 4662306a36Sopenharmony_ci 4762306a36Sopenharmony_cistatic __inline__ unsigned long 4862306a36Sopenharmony_ciia64_get_itv (void) 4962306a36Sopenharmony_ci{ 5062306a36Sopenharmony_ci return ia64_getreg(_IA64_REG_CR_ITV); 5162306a36Sopenharmony_ci} 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_cistatic __inline__ void 5462306a36Sopenharmony_ciia64_set_itc (unsigned long val) 5562306a36Sopenharmony_ci{ 5662306a36Sopenharmony_ci ia64_setreg(_IA64_REG_AR_ITC, val); 5762306a36Sopenharmony_ci ia64_srlz_d(); 5862306a36Sopenharmony_ci} 5962306a36Sopenharmony_ci 6062306a36Sopenharmony_cistatic __inline__ unsigned long 6162306a36Sopenharmony_ciia64_get_itc (void) 6262306a36Sopenharmony_ci{ 6362306a36Sopenharmony_ci unsigned long result; 6462306a36Sopenharmony_ci 6562306a36Sopenharmony_ci result = ia64_getreg(_IA64_REG_AR_ITC); 6662306a36Sopenharmony_ci ia64_barrier(); 6762306a36Sopenharmony_ci#ifdef CONFIG_ITANIUM 6862306a36Sopenharmony_ci while (unlikely((__s32) result == -1)) { 6962306a36Sopenharmony_ci result = ia64_getreg(_IA64_REG_AR_ITC); 7062306a36Sopenharmony_ci ia64_barrier(); 7162306a36Sopenharmony_ci } 7262306a36Sopenharmony_ci#endif 7362306a36Sopenharmony_ci return result; 7462306a36Sopenharmony_ci} 7562306a36Sopenharmony_ci 7662306a36Sopenharmony_ciextern void ia64_delay_loop (unsigned long loops); 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_cistatic __inline__ void 7962306a36Sopenharmony_ci__delay (unsigned long loops) 8062306a36Sopenharmony_ci{ 8162306a36Sopenharmony_ci if (unlikely(loops < 1)) 8262306a36Sopenharmony_ci return; 8362306a36Sopenharmony_ci 8462306a36Sopenharmony_ci ia64_delay_loop (loops - 1); 8562306a36Sopenharmony_ci} 8662306a36Sopenharmony_ci 8762306a36Sopenharmony_ciextern void udelay (unsigned long usecs); 8862306a36Sopenharmony_ci 8962306a36Sopenharmony_ci#endif /* _ASM_IA64_DELAY_H */ 90