18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */
28c2ecf20Sopenharmony_ci#ifndef _ASM_IA64_DELAY_H
38c2ecf20Sopenharmony_ci#define _ASM_IA64_DELAY_H
48c2ecf20Sopenharmony_ci
58c2ecf20Sopenharmony_ci/*
68c2ecf20Sopenharmony_ci * Delay routines using a pre-computed "cycles/usec" value.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * Copyright (C) 1998, 1999 Hewlett-Packard Co
98c2ecf20Sopenharmony_ci *	David Mosberger-Tang <davidm@hpl.hp.com>
108c2ecf20Sopenharmony_ci * Copyright (C) 1999 VA Linux Systems
118c2ecf20Sopenharmony_ci * Copyright (C) 1999 Walt Drummond <drummond@valinux.com>
128c2ecf20Sopenharmony_ci * Copyright (C) 1999 Asit Mallick <asit.k.mallick@intel.com>
138c2ecf20Sopenharmony_ci * Copyright (C) 1999 Don Dugger <don.dugger@intel.com>
148c2ecf20Sopenharmony_ci */
158c2ecf20Sopenharmony_ci
168c2ecf20Sopenharmony_ci#include <linux/kernel.h>
178c2ecf20Sopenharmony_ci#include <linux/sched.h>
188c2ecf20Sopenharmony_ci#include <linux/compiler.h>
198c2ecf20Sopenharmony_ci
208c2ecf20Sopenharmony_ci#include <asm/intrinsics.h>
218c2ecf20Sopenharmony_ci#include <asm/processor.h>
228c2ecf20Sopenharmony_ci
238c2ecf20Sopenharmony_cistatic __inline__ void
248c2ecf20Sopenharmony_ciia64_set_itm (unsigned long val)
258c2ecf20Sopenharmony_ci{
268c2ecf20Sopenharmony_ci	ia64_setreg(_IA64_REG_CR_ITM, val);
278c2ecf20Sopenharmony_ci	ia64_srlz_d();
288c2ecf20Sopenharmony_ci}
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_cistatic __inline__ unsigned long
318c2ecf20Sopenharmony_ciia64_get_itm (void)
328c2ecf20Sopenharmony_ci{
338c2ecf20Sopenharmony_ci	unsigned long result;
348c2ecf20Sopenharmony_ci
358c2ecf20Sopenharmony_ci	result = ia64_getreg(_IA64_REG_CR_ITM);
368c2ecf20Sopenharmony_ci	ia64_srlz_d();
378c2ecf20Sopenharmony_ci	return result;
388c2ecf20Sopenharmony_ci}
398c2ecf20Sopenharmony_ci
408c2ecf20Sopenharmony_cistatic __inline__ void
418c2ecf20Sopenharmony_ciia64_set_itv (unsigned long val)
428c2ecf20Sopenharmony_ci{
438c2ecf20Sopenharmony_ci	ia64_setreg(_IA64_REG_CR_ITV, val);
448c2ecf20Sopenharmony_ci	ia64_srlz_d();
458c2ecf20Sopenharmony_ci}
468c2ecf20Sopenharmony_ci
478c2ecf20Sopenharmony_cistatic __inline__ unsigned long
488c2ecf20Sopenharmony_ciia64_get_itv (void)
498c2ecf20Sopenharmony_ci{
508c2ecf20Sopenharmony_ci	return ia64_getreg(_IA64_REG_CR_ITV);
518c2ecf20Sopenharmony_ci}
528c2ecf20Sopenharmony_ci
538c2ecf20Sopenharmony_cistatic __inline__ void
548c2ecf20Sopenharmony_ciia64_set_itc (unsigned long val)
558c2ecf20Sopenharmony_ci{
568c2ecf20Sopenharmony_ci	ia64_setreg(_IA64_REG_AR_ITC, val);
578c2ecf20Sopenharmony_ci	ia64_srlz_d();
588c2ecf20Sopenharmony_ci}
598c2ecf20Sopenharmony_ci
608c2ecf20Sopenharmony_cistatic __inline__ unsigned long
618c2ecf20Sopenharmony_ciia64_get_itc (void)
628c2ecf20Sopenharmony_ci{
638c2ecf20Sopenharmony_ci	unsigned long result;
648c2ecf20Sopenharmony_ci
658c2ecf20Sopenharmony_ci	result = ia64_getreg(_IA64_REG_AR_ITC);
668c2ecf20Sopenharmony_ci	ia64_barrier();
678c2ecf20Sopenharmony_ci#ifdef CONFIG_ITANIUM
688c2ecf20Sopenharmony_ci	while (unlikely((__s32) result == -1)) {
698c2ecf20Sopenharmony_ci		result = ia64_getreg(_IA64_REG_AR_ITC);
708c2ecf20Sopenharmony_ci		ia64_barrier();
718c2ecf20Sopenharmony_ci	}
728c2ecf20Sopenharmony_ci#endif
738c2ecf20Sopenharmony_ci	return result;
748c2ecf20Sopenharmony_ci}
758c2ecf20Sopenharmony_ci
768c2ecf20Sopenharmony_ciextern void ia64_delay_loop (unsigned long loops);
778c2ecf20Sopenharmony_ci
788c2ecf20Sopenharmony_cistatic __inline__ void
798c2ecf20Sopenharmony_ci__delay (unsigned long loops)
808c2ecf20Sopenharmony_ci{
818c2ecf20Sopenharmony_ci	if (unlikely(loops < 1))
828c2ecf20Sopenharmony_ci		return;
838c2ecf20Sopenharmony_ci
848c2ecf20Sopenharmony_ci	ia64_delay_loop (loops - 1);
858c2ecf20Sopenharmony_ci}
868c2ecf20Sopenharmony_ci
878c2ecf20Sopenharmony_ciextern void udelay (unsigned long usecs);
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci#endif /* _ASM_IA64_DELAY_H */
90