/* SPDX-License-Identifier: GPL-2.0 */1/*2* Copyright (C) 2008 Michal Simek3* Copyright (C) 2007 John Williams4* Copyright (C) 2006 Atmark Techno, Inc.5*/67#ifndef _ASM_MICROBLAZE_DELAY_H8#define _ASM_MICROBLAZE_DELAY_H910#include <linux/param.h>1112static inline void __delay(unsigned long loops)13{14asm volatile ("# __delay \n\t" \15"1: addi %0, %0, -1\t\n" \16"bneid %0, 1b \t\n" \17"nop \t\n"18: "=r" (loops)19: "0" (loops));20}2122/*23* Note that 19 * 226 == 4294 ==~ 2^32 / 10^6, so24* loops = (4294 * usecs * loops_per_jiffy * HZ) / 2^32.25*26* The mul instruction gives us loops = (a * b) / 2^32.27* We choose a = usecs * 19 * HZ and b = loops_per_jiffy * 22628* because this lets us support a wide range of HZ and29* loops_per_jiffy values without either a or b overflowing 2^32.30* Thus we need usecs * HZ <= (2^32 - 1) / 19 = 226050910 and31* loops_per_jiffy <= (2^32 - 1) / 226 = 1900428032* (which corresponds to ~3800 bogomips at HZ = 100).33* -- paulus34*/35#define __MAX_UDELAY (226050910UL/HZ) /* maximum udelay argument */36#define __MAX_NDELAY (4294967295UL/HZ) /* maximum ndelay argument */3738extern unsigned long loops_per_jiffy;3940static inline void __udelay(unsigned int x)41{4243unsigned long long tmp =44(unsigned long long)x * (unsigned long long)loops_per_jiffy \45* 226LL;46unsigned loops = tmp >> 32;4748/*49__asm__("mulxuu %0,%1,%2" : "=r" (loops) :50"r" (x), "r" (loops_per_jiffy * 226));51*/52__delay(loops);53}5455extern void __bad_udelay(void); /* deliberately undefined */56extern void __bad_ndelay(void); /* deliberately undefined */5758#define udelay(n) \59({ \60if (__builtin_constant_p(n)) { \61if ((n) / __MAX_UDELAY >= 1) \62__bad_udelay(); \63else \64__udelay((n) * (19 * HZ)); \65} else { \66__udelay((n) * (19 * HZ)); \67} \68})6970#define ndelay(n) \71({ \72if (__builtin_constant_p(n)) { \73if ((n) / __MAX_NDELAY >= 1) \74__bad_ndelay(); \75else \76__udelay((n) * HZ); \77} else { \78__udelay((n) * HZ); \79} \80})8182#define muldiv(a, b, c) (((a)*(b))/(c))8384#endif /* _ASM_MICROBLAZE_DELAY_H */858687