xref: /kvm-unit-tests/lib/arm/delay.c (revision 0df901e0379da84a0eaec1daf464c699995dddf5)
1a5875fd4SAndrew Jones /*
2a5875fd4SAndrew Jones  * Delay loops
3a5875fd4SAndrew Jones  *
4a5875fd4SAndrew Jones  * Copyright (C) 2016, Red Hat Inc, Andrew Jones <drjones@redhat.com>
5a5875fd4SAndrew Jones  *
6a5875fd4SAndrew Jones  * This work is licensed under the terms of the GNU LGPL, version 2.
7a5875fd4SAndrew Jones  */
8a5875fd4SAndrew Jones #include <libcflat.h>
9a5875fd4SAndrew Jones #include <asm/processor.h>
10a5875fd4SAndrew Jones #include <asm/barrier.h>
11*0df901e0SAndrew Jones #include <asm/delay.h>
12a5875fd4SAndrew Jones 
delay(u64 cycles)13a5875fd4SAndrew Jones void delay(u64 cycles)
14a5875fd4SAndrew Jones {
15a5875fd4SAndrew Jones 	u64 start = get_cntvct();
16a5875fd4SAndrew Jones 
17a5875fd4SAndrew Jones 	while ((get_cntvct() - start) < cycles)
18a5875fd4SAndrew Jones 		cpu_relax();
19a5875fd4SAndrew Jones }
20a5875fd4SAndrew Jones 
udelay(unsigned long usec)21a5875fd4SAndrew Jones void udelay(unsigned long usec)
22a5875fd4SAndrew Jones {
23a5875fd4SAndrew Jones 	delay((u64)usec * get_cntfrq() / 1000000);
24a5875fd4SAndrew Jones }
25a5875fd4SAndrew Jones 
mdelay(unsigned long msecs)26a5875fd4SAndrew Jones void mdelay(unsigned long msecs)
27a5875fd4SAndrew Jones {
28a5875fd4SAndrew Jones 	while (msecs--)
29a5875fd4SAndrew Jones 		udelay(1000);
30a5875fd4SAndrew Jones }
31