Mailing List Archive

[PATCH 02 of 10] arm: implement udelay()
# HG changeset patch
# User Tim Deegan <tim@xen.org>
# Date 1330018799 0
# Node ID ec051056db2b6d37344629e2f01d17240099d5ec
# Parent 4a7c1420913135fbeba361cd9603e748c074cdac
arm: implement udelay()

Signed-off-by: Tim Deegan <tim@xen.org>

diff -r 4a7c14209131 -r ec051056db2b xen/arch/arm/dummy.S
--- a/xen/arch/arm/dummy.S Thu Feb 23 17:39:59 2012 +0000
+++ b/xen/arch/arm/dummy.S Thu Feb 23 17:39:59 2012 +0000
@@ -62,5 +62,4 @@ DUMMY(gmfn_to_mfn);
DUMMY(hypercall_create_continuation);
DUMMY(send_timer_event);
DUMMY(share_xen_page_with_privileged_guests);
-DUMMY(__udelay);
DUMMY(wallclock_time);
diff -r 4a7c14209131 -r ec051056db2b xen/arch/arm/time.c
--- a/xen/arch/arm/time.c Thu Feb 23 17:39:59 2012 +0000
+++ b/xen/arch/arm/time.c Thu Feb 23 17:39:59 2012 +0000
@@ -171,6 +171,16 @@ void __cpuinit init_timer_interrupt(void
request_irq(30, timer_interrupt, 0, "phytimer", NULL);
}

+/* Wait a set number of microseconds */
+void udelay(unsigned long usecs)
+{
+ s_time_t deadline = get_s_time() + 1000 * (s_time_t) usecs;
+ do {
+ dsb();
+ isb();
+ } while ( get_s_time() - deadline < 0 );
+}
+
/*
* Local variables:
* mode: C
diff -r 4a7c14209131 -r ec051056db2b xen/include/asm-arm/delay.h
--- a/xen/include/asm-arm/delay.h Thu Feb 23 17:39:59 2012 +0000
+++ b/xen/include/asm-arm/delay.h Thu Feb 23 17:39:59 2012 +0000
@@ -1,8 +1,7 @@
#ifndef _ARM_DELAY_H
#define _ARM_DELAY_H

-extern void __udelay(unsigned long usecs);
-#define udelay(n) __udelay(n)
+extern void udelay(unsigned long usecs);

#endif /* defined(_ARM_DELAY_H) */
/*

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Re: [PATCH 02 of 10] arm: implement udelay() [ In reply to ]
On 23/02/12 17:40, Tim Deegan wrote:
> arm: implement udelay()
>
> Signed-off-by: Tim Deegan <tim@xen.org>
>
[...]
> diff -r 4a7c14209131 -r ec051056db2b xen/arch/arm/time.c
> --- a/xen/arch/arm/time.c Thu Feb 23 17:39:59 2012 +0000
> +++ b/xen/arch/arm/time.c Thu Feb 23 17:39:59 2012 +0000
> @@ -171,6 +171,16 @@ void __cpuinit init_timer_interrupt(void
> request_irq(30, timer_interrupt, 0, "phytimer", NULL);
> }
>
> +/* Wait a set number of microseconds */
> +void udelay(unsigned long usecs)
> +{
> + s_time_t deadline = get_s_time() + 1000 * (s_time_t) usecs;
> + do {
> + dsb();
> + isb();

What are these barriers for?

David

> + } while ( get_s_time() - deadline < 0 );
> +}
> +
> /*
> * Local variables:
> * mode: C

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel
Re: [PATCH 02 of 10] arm: implement udelay() [ In reply to ]
At 19:03 +0000 on 23 Feb (1330023834), David Vrabel wrote:
> On 23/02/12 17:40, Tim Deegan wrote:
> > arm: implement udelay()
> >
> > Signed-off-by: Tim Deegan <tim@xen.org>
> >
> [...]
> > diff -r 4a7c14209131 -r ec051056db2b xen/arch/arm/time.c
> > --- a/xen/arch/arm/time.c Thu Feb 23 17:39:59 2012 +0000
> > +++ b/xen/arch/arm/time.c Thu Feb 23 17:39:59 2012 +0000
> > @@ -171,6 +171,16 @@ void __cpuinit init_timer_interrupt(void
> > request_irq(30, timer_interrupt, 0, "phytimer", NULL);
> > }
> >
> > +/* Wait a set number of microseconds */
> > +void udelay(unsigned long usecs)
> > +{
> > + s_time_t deadline = get_s_time() + 1000 * (s_time_t) usecs;
> > + do {
> > + dsb();
> > + isb();
>
> What are these barriers for?

To make sure the CPU doesn't hoist any instructions past the wait
loop. :) They don't really have to be inside the loop body; I can
change that if you like.

Tim.

_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
http://lists.xen.org/xen-devel