[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH 10 of 10] arm: Shutdown and reboot



On Thu, 2012-02-23 at 17:40 +0000, Tim Deegan wrote:
> # HG changeset patch
> # User Tim Deegan <tim@xxxxxxx>
> # Date 1330018799 0
> # Node ID 8a2d38ab67ccaf8637e223feb0d0678433974e93
> # Parent  a78bc9b8421492e0545c6d52c7a32b9de9737d61
> arm: Shutdown and reboot
> 
> Reboot runes grabbed from linux's SP810 reset function.
> Doesn't seem to work on the model, though.
> 
> Signed-off-by: Tim Deegan <tim@xxxxxxx>

Acked-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

But please add an "XXX get this from device tree" somewhere
appropriate ;-)

> 
> diff -r a78bc9b84214 -r 8a2d38ab67cc xen/arch/arm/shutdown.c
> --- a/xen/arch/arm/shutdown.c Thu Feb 23 17:39:59 2012 +0000
> +++ b/xen/arch/arm/shutdown.c Thu Feb 23 17:39:59 2012 +0000
> @@ -1,18 +1,63 @@
>  #include <xen/config.h>
> +#include <xen/console.h>
> +#include <xen/cpu.h>
> +#include <xen/delay.h>
>  #include <xen/lib.h>
> +#include <xen/mm.h>
> +#include <xen/smp.h>
> +
> +static void raw_machine_reset(void)
> +{
> +#ifdef SP810_ADDRESS
> +    /* Use the SP810 system controller to force a reset */
> +    volatile uint32_t *sp810;
> +    set_fixmap(FIXMAP_MISC, SP810_ADDRESS >> PAGE_SHIFT, DEV_SHARED);
> +    sp810 = ((uint32_t *)
> +             (FIXMAP_ADDR(FIXMAP_MISC) + (SP810_ADDRESS & ~PAGE_MASK)));
> +    sp810[0] = 0x3; /* switch to slow mode */
> +    dsb(); isb();
> +    sp810[1] = 0x1; /* writing any value to SCSYSSTAT reg will reset system 
> */
> +    dsb(); isb();
> +    clear_fixmap(FIXMAP_MISC);
> +#endif
> +}
> +
> +static void halt_this_cpu(void *arg)
> +{
> +    __cpu_disable();
> +    stop_cpu();
> +}
>  
>  void machine_halt(void)
>  {
> -        /* TODO: halt */
> -        while(1) ;
> +    watchdog_disable();
> +    console_start_sync();
> +    local_irq_enable();
> +    smp_call_function(halt_this_cpu, NULL, 0);
> +    halt_this_cpu(NULL);
>  }
>  
>  void machine_restart(unsigned int delay_millisecs)
>  {
> -        /* TODO: restart */
> -        printk("Cannot restart yet\n");
> -        while(1);
> +    int timeout = 10;
> +
> +    local_irq_enable();
> +    smp_call_function(halt_this_cpu, NULL, 0);
> +    local_irq_disable();
> +
> +    mdelay(delay_millisecs);
> +
> +    /* Wait at most another 10ms for all other CPUs to go offline. */
> +    while ( (num_online_cpus() > 1) && (timeout-- > 0) )
> +        mdelay(1);
> +
> +    while ( 1 )
> +    {
> +        raw_machine_reset();
> +        mdelay(100);
> +    }
>  }
> +
>  /*
>   * Local variables:
>   * mode: C
> diff -r a78bc9b84214 -r 8a2d38ab67cc xen/include/asm-arm/config.h
> --- a/xen/include/asm-arm/config.h    Thu Feb 23 17:39:59 2012 +0000
> +++ b/xen/include/asm-arm/config.h    Thu Feb 23 17:39:59 2012 +0000
> @@ -119,6 +119,9 @@ extern unsigned long frametable_virt_end
>  #define GIC_CR_OFFSET 0x2000
>  #define GIC_HR_OFFSET 0x4000 /* Guess work 
> http://lists.infradead.org/pipermail/linux-arm-kernel/2011-September/064219.html
>  */
>  #define GIC_VR_OFFSET 0x6000 /* Virtual Machine CPU interface) */
> +/* Board-specific: base address of system controller */
> +#define SP810_ADDRESS 0x1C020000
> +
>  
>  #endif /* __ARM_CONFIG_H__ */
>  /*



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


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.