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

Re: [Xen-devel] [PATCH] xen/arm: Support kick cpus and switch to hypervisor for the OMAP5



On Aug 15, 2013, at 7:40 PM, Julien Grall <julien.grall@xxxxxxxxxx> wrote:

> On 15 August 2013 12:19, Chen Baozi <baozich@xxxxxxxxx> wrote:
>> 
>> On Aug 15, 2013, at 6:03 PM, Julien Grall <julien.grall@xxxxxxxxxx> wrote:
>> 
>>> On 15 August 2013 10:16, Chen Baozi <baozich@xxxxxxxxx> wrote:
>>>> 
>>>> Signed-off-by: Chen Baozi <baozich@xxxxxxxxx>
>>>> ---
>>>> xen/arch/arm/arm32/mode_switch.S      | 34 
>>>> +++++++++++++++++++++++++++++++---
>>>> xen/include/asm-arm/platforms/omap5.h | 17 +++++++++++++++++
>>>> 2 files changed, 48 insertions(+), 3 deletions(-)
>>>> 
>>>> diff --git a/xen/arch/arm/arm32/mode_switch.S 
>>>> b/xen/arch/arm/arm32/mode_switch.S
>>>> index 3500eb0..e86d3d1 100644
>>>> --- a/xen/arch/arm/arm32/mode_switch.S
>>>> +++ b/xen/arch/arm/arm32/mode_switch.S
>>>> @@ -21,11 +21,13 @@
>>>> #include <asm/page.h>
>>>> #include <asm/platforms/vexpress.h>
>>>> #include <asm/platforms/exynos5.h>
>>>> +#include <asm/platforms/omap5.h>
>>>> #include <asm/asm_defns.h>
>>>> #include <asm/gic.h>
>>>> 
>>>> /* Wake up secondary cpus
>>>> - * This code relies on Machine ID and only works for Vexpress and the 
>>>> Arndale
>>>> + * This code relies on Machine ID and only works for Vexpress, the Arndale
>>>> + * and the OMAP5 uEVM.
>>>> * TODO: Move this code either later (via platform specific desc) or in a 
>>>> bootwrapper
>>>> * r5: Machine ID
>>>> * Clobber r0 r2 */
>>>> @@ -34,6 +36,10 @@ kick_cpus:
>>>>        ldr   r0, =MACH_TYPE_SMDK5250
>>>>        teq   r5, r0                          /* Are we running on the 
>>>> arndale? */
>>>>        beq   kick_cpus_arndale
>>>> +       /* for OMAP5432 */
>>>> +       ldr   r0, =MACH_TYPE_OMAP5_SEVM
>>>> +       teq   r5, r0
>>>> +       beq   kick_cpus_omap5
>>>>        /* otherwise versatile express */
>>>>        /* write start paddr to v2m sysreg FLAGSSET register */
>>>>        ldr   r0, =(V2M_SYS_MMIO_BASE)        /* base V2M sysreg MMIO 
>>>> address */
>>>> @@ -55,6 +61,20 @@ kick_cpus_arndale:
>>>>        str   r2, [r0]
>>>>        dsb
>>>>        ldr   r2, =EXYNOS5_GIC_BASE_ADDRESS   /* r2 := Exynos5 gic base 
>>>> address */
>>>> +       b     kick_cpus_sgi
>>>> +kick_cpus_omap5:
>>>> +       /* write start paddr to AuxCoreBoot1 where ROM code will jump */
>>>> +        ldr   r0, =(OMAP_AUX_CORE_BOOT_1)
>>>> +        ldr   r2, =start
>>>> +        add   r2, r2, r10
>>>> +        str   r2, [r0]
>>>> +        ldr   r0, =(OMAP_AUX_CORE_BOOT_0)
>>>> +        mov   r2, #0x20
>>>> +        str   r2, [r0]
>>>> +        dsb
>>>> +        sev
>>>> +        ldr   r2, =OMAP5_GIC_BASE_ADDRESS     /* r2 := OMAP5 gic base 
>>>> address */
>>>> +        b     kick_cpus_sgi
>>>> kick_cpus_sgi:
>>>>        /* send an interrupt */
>>>>        ldr   r0, =GIC_DR_OFFSET              /* GIC distributor offset */
>>>> @@ -90,15 +110,23 @@ enter_hyp_mode:
>>>>        bic   r0, r0, #0xe           /* Clear EA, FIQ and IRQ */
>>>>        mcr   CP32(r0, SCR)
>>>> 
>>>> -        ldr   r2, =MACH_TYPE_SMDK5250   /* r4 := Arndale machine ID */
>>>>        /* By default load Arndale defaults values */
>>>> +        ldr   r2, =MACH_TYPE_SMDK5250       /* r2 := Arndale machine ID */
>>>>        ldr   r0, =EXYNOS5_TIMER_FREQUENCY  /* r0 := timer's frequency */
>>>>        ldr   r1, =EXYNOS5_GIC_BASE_ADDRESS /* r1 := GIC base address */
>>>> -        /* If it's not the Arndale machine ID, load VE values */
>>>>        teq   r5, r2
>>>> +        beq   1f
>>>> +        /* If it's not the Arndale machine ID, try OMAP5 uEVM */
>>>> +        ldr   r2, =MACH_TYPE_OMAP5_SEVM     /* r2 := OMAP5 uEVM machine 
>>>> ID */
>>>> +        ldr   r0, =OMAP5_TIMER_FREQUENCY    /* r0 := timer's frequency */
>>>> +        ldr   r1, =OMAP5_GIC_BASE_ADDRESS   /* r1 := GIC base address */
>>>> +        teq   r5, r2
>>>> +        beq   1f
>>>> +        /* If it's not the OMAP5432 machine ID, load VE values */
>>>>        ldrne r0, =V2M_TIMER_FREQUENCY
>>>>        ldrne r1, =V2M_GIC_BASE_ADDRESS
>>>> 
>>>> +1:
>>>>        /* Ugly: the system timer's frequency register is only
>>>>         * programmable in Secure state.  Since we don't know where its
>>>>         * memory-mapped control registers live, we can't find out the
>>> 
>>> I'm not in favor to extend this assembly file (see full explanation on
>>> Ian's mail 
>>> http://lists.xen.org/archives/html/xen-devel/2013-06/msg01231.html).
>>> 
>>> Some ideas to remove this file:
>>>  - Move kick cpus code later (ie in C code) and per platform
>>>  - Use U-boot or a bootwrapper to switch CPUs to HYP mode
>>> 
>>> Cheers,
>> 
>> Well, it is reasonable.
>> 
>> Actually, I have hacked my u-boot to boot xen in hyp mode. So enter_hyp_mode
>> is not necessary at least for my situation now.
>> 
>> For "kick cpus codes", I supposed we still need it before we move to the C
>> code later? In that case, I would like to split this patch to 2 patches (one
>> with kick cpus code, and one with hyp mode switching). So we could have
>> a working SMP system on OMAP5 before moving to the new implementation. And
>> some one who need the hyp mode switching codes could apply the patch, which
>> won't be applied in mainline, by themselves.
> 
> I don't think so. Linux is able to kick cpus in C code, so I don't
> find any good reason to keep this code in assembly.
> IMHO, the best place is smp_prepare_cpus.
> 
> I would prefer to move to the new implementation before adding new
> platform SMP support.

Ok. So any plans of the new implementation? I mean, if it is still not
on schedule, I may have a try...

Cheers,

Baozi
_______________________________________________
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®.