diff mbox series

xen/arm: Switch OMAP5 secondary cores into hyp mode

Message ID ee1f4b9b969e6cf67278905e0405bc4fa5d6080c.1561147189.git.denisobrezkov@gmail.com (mailing list archive)
State Superseded
Headers show
Series xen/arm: Switch OMAP5 secondary cores into hyp mode | expand

Commit Message

Denis Obrezkov June 21, 2019, 8:02 p.m. UTC
This function allows xen to bring secondary CPU cores into non-secure
HYP mode. This is done by using a Secure Monitor call.

Signed-off-by: Denis Obrezkov <denisobrezkov@gmail.com>
---
 xen/arch/arm/arm32/head.S             | 11 ++++++++++-
 xen/arch/arm/platforms/omap5.c        |  5 +++--
 xen/include/asm-arm/platforms/omap5.h |  3 +++
 3 files changed, 16 insertions(+), 3 deletions(-)

Comments

Julien Grall June 24, 2019, 11:09 a.m. UTC | #1
(+ GSOC mentors and Andre)

Hi Denis,

Thank you for the patch.

First of all, may I ask to CC the other mentors?

On 6/21/19 9:02 PM, Denis Obrezkov wrote:
> This function allows xen to bring secondary CPU cores into non-secure
> HYP mode. This is done by using a Secure Monitor call.
> 
> Signed-off-by: Denis Obrezkov <denisobrezkov@gmail.com>
> ---
>   xen/arch/arm/arm32/head.S             | 11 ++++++++++-
>   xen/arch/arm/platforms/omap5.c        |  5 +++--
>   xen/include/asm-arm/platforms/omap5.h |  3 +++
>   3 files changed, 16 insertions(+), 3 deletions(-)
> 
> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
> index 5f817d473e..120e034934 100644
> --- a/xen/arch/arm/arm32/head.S
> +++ b/xen/arch/arm/arm32/head.S
> @@ -36,6 +36,10 @@
>   #include EARLY_PRINTK_INC
>   #endif
>   
> +
> +#define API_HYP_ENTRY 0x102
> +#define AUX_CORE_BOOT0_PA           0x48281800
> +

I have thought a bit more about the placement of the code. I think it 
would be best if it lives in a separate file (maybe platforms/omap5-head.S).

>   /*
>    * Common register usage in this file:
>    *   r0  -
> @@ -113,6 +117,12 @@ past_zImage:
>   
>           b     common_start
>   
> +GLOBAL(omap5_init_secondary)
> +        ldr  r12, =API_HYP_ENTRY

NIT: It is 3 spaces after ldr.

> +        adr  r0, init_secondary

Same here.

> +		dsb

Why do you need the dsb here?

> +        smc   #0
> +
>   GLOBAL(init_secondary)
>           cpsid aif                    /* Disable all interrupts */
>   
> @@ -159,7 +169,6 @@ common_start:
>           PRINT("- CPU doesn't support the virtualization extensions -\r\n")
>           b     fail
>   1:
> -

This is a spurious change. Please remove it.

>           /* Check that we're already in Hyp mode */
>           mrs   r0, cpsr
>           and   r0, r0, #0x1f          /* Mode is in the low 5 bits of CPSR */
> diff --git a/xen/arch/arm/platforms/omap5.c b/xen/arch/arm/platforms/omap5.c
> index aee24e4d28..6b5cc15af3 100644
> --- a/xen/arch/arm/platforms/omap5.c
> +++ b/xen/arch/arm/platforms/omap5.c
> @@ -128,8 +128,9 @@ static int __init omap5_smp_init(void)
>       }
>   
>       printk("Set AuxCoreBoot1 to %"PRIpaddr" (%p)\n",
> -           __pa(init_secondary), init_secondary);
> -    writel(__pa(init_secondary), wugen_base + OMAP_AUX_CORE_BOOT_1_OFFSET);
> +           __pa(omap5_init_secondary), omap5_init_secondary);
> +    writel(__pa(omap5_init_secondary),
> +            wugen_base + OMAP_AUX_CORE_BOOT_1_OFFSET);

I am trying to understand how this ever worked. omap5_smp_init is called 
by two sets of platforms (based on compatible):
    - ti,dra7: there were some hacks in U-boot to avoid the SMC. If I am 
right, then I would not bother to support hacked U-boot.
    - ti,omap5: [1] suggest that U-boot do the switch for us but it is 
not clear whether this is upstreamed. @Chen, I know you did the port a 
long time ago. Do you recall how this worked?

Linux seems to use the smc on any dra7 and omap54xx. So maybe we can use 
safely here.

>       printk("Set AuxCoreBoot0 to 0x20\n");
>       writel(0x20, wugen_base + OMAP_AUX_CORE_BOOT_0_OFFSET);
> diff --git a/xen/include/asm-arm/platforms/omap5.h b/xen/include/asm-arm/platforms/omap5.h
> index c559c84b61..732b27f403 100644
> --- a/xen/include/asm-arm/platforms/omap5.h
> +++ b/xen/include/asm-arm/platforms/omap5.h
> @@ -22,6 +22,9 @@
>   
>   #endif /* __ASM_ARM_PLATFORMS_OMAP5_H */
>   
> +/* Secondary cpu omap5 specific init routine */
> +extern void omap5_init_secondary(void);
> +
>   /*
>    * Local variables:
>    * mode: C
> 

[1] 
https://wiki.xenproject.org/wiki/Xen_ARM_with_Virtualization_Extensions/OMAP5432_uEVM
Andrew Cooper June 24, 2019, 12:03 p.m. UTC | #2
On 24/06/2019 12:09, Julien Grall wrote:
> (+ GSOC mentors and Andre)
>
> Hi Denis,
>
> Thank you for the patch.
>
> First of all, may I ask to CC the other mentors?
>
> On 6/21/19 9:02 PM, Denis Obrezkov wrote:
>> This function allows xen to bring secondary CPU cores into non-secure
>> HYP mode. This is done by using a Secure Monitor call.
>>
>> Signed-off-by: Denis Obrezkov <denisobrezkov@gmail.com>
>> ---
>>   xen/arch/arm/arm32/head.S             | 11 ++++++++++-
>>   xen/arch/arm/platforms/omap5.c        |  5 +++--
>>   xen/include/asm-arm/platforms/omap5.h |  3 +++
>>   3 files changed, 16 insertions(+), 3 deletions(-)
>>
>> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
>> index 5f817d473e..120e034934 100644
>> --- a/xen/arch/arm/arm32/head.S
>> +++ b/xen/arch/arm/arm32/head.S
>> @@ -36,6 +36,10 @@
>>   #include EARLY_PRINTK_INC
>>   #endif
>>   +
>> +#define API_HYP_ENTRY 0x102
>> +#define AUX_CORE_BOOT0_PA           0x48281800
>> +
>
> I have thought a bit more about the placement of the code. I think it
> would be best if it lives in a separate file (maybe
> platforms/omap5-head.S).

For something this trivial, it is easy to put straight into omap5.c

Completely untested, but this ought to work:

diff --git a/xen/arch/arm/platforms/omap5.c b/xen/arch/arm/platforms/omap5.c
index 6b5cc15af3..1dcc92d3a4 100644
--- a/xen/arch/arm/platforms/omap5.c
+++ b/xen/arch/arm/platforms/omap5.c
@@ -23,6 +23,16 @@
 #include <xen/vmap.h>
 #include <asm/io.h>
 
+void omap5_init_secondary(void);
+asm (
+".text                            \n\t"
+"omap5_init_secondary:            \n\t"
+"        ldr   r12, =0x102        \n\t" /* API_HYP_ENTRY */
+"        adr   r0, init_secondary \n\t"
+"        smc   #0                 \n\t"
+"        b     init_secondary     \n\t"
+);
+
 static uint16_t num_den[8][2] = {
     {         0,          0 },  /* not used */
     {  26 *  64,  26 *  125 },  /* 12.0 Mhz */


I personally find this favourable to introducing new stub files.

Ultimately it is Julien/Stefano's decision, but I'd like to point it out
as an option for anyone who is unaware.

~Andrew
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
  </head>
  <body text="#000000" bgcolor="#FFFFFF">
    <div class="moz-cite-prefix">On 24/06/2019 12:09, Julien Grall
      wrote:<br>
    </div>
    <blockquote type="cite"
      cite="mid:ecfa161d-1389-1541-e92c-dfa3b8c7e402@arm.com">(+ GSOC
      mentors and Andre)
      <br>
      <br>
      Hi Denis,
      <br>
      <br>
      Thank you for the patch.
      <br>
      <br>
      First of all, may I ask to CC the other mentors?
      <br>
      <br>
      On 6/21/19 9:02 PM, Denis Obrezkov wrote:
      <br>
      <blockquote type="cite">This function allows xen to bring
        secondary CPU cores into non-secure
        <br>
        HYP mode. This is done by using a Secure Monitor call.
        <br>
        <br>
        Signed-off-by: Denis Obrezkov <a class="moz-txt-link-rfc2396E" href="mailto:denisobrezkov@gmail.com">&lt;denisobrezkov@gmail.com&gt;</a>
        <br>
        ---
        <br>
          xen/arch/arm/arm32/head.S             | 11 ++++++++++-
        <br>
          xen/arch/arm/platforms/omap5.c        |  5 +++--
        <br>
          xen/include/asm-arm/platforms/omap5.h |  3 +++
        <br>
          3 files changed, 16 insertions(+), 3 deletions(-)
        <br>
        <br>
        diff --git a/xen/arch/arm/arm32/head.S
        b/xen/arch/arm/arm32/head.S
        <br>
        index 5f817d473e..120e034934 100644
        <br>
        --- a/xen/arch/arm/arm32/head.S
        <br>
        +++ b/xen/arch/arm/arm32/head.S
        <br>
        @@ -36,6 +36,10 @@
        <br>
          #include EARLY_PRINTK_INC
        <br>
          #endif
        <br>
          +
        <br>
        +#define API_HYP_ENTRY 0x102
        <br>
        +#define AUX_CORE_BOOT0_PA           0x48281800
        <br>
        +
        <br>
      </blockquote>
      <br>
      I have thought a bit more about the placement of the code. I think
      it would be best if it lives in a separate file (maybe
      platforms/omap5-head.S).<br>
    </blockquote>
    <br>
    For something this trivial, it is easy to put straight into omap5.c<br>
    <br>
    Completely untested, but this ought to work:<br>
    <br>
    <pre>diff --git a/xen/arch/arm/platforms/omap5.c b/xen/arch/arm/platforms/omap5.c
index 6b5cc15af3..1dcc92d3a4 100644
--- a/xen/arch/arm/platforms/omap5.c
+++ b/xen/arch/arm/platforms/omap5.c
@@ -23,6 +23,16 @@
 #include &lt;xen/vmap.h&gt;
 #include &lt;asm/io.h&gt;
 
+void omap5_init_secondary(void);
+asm (
+".text                            \n\t"
+"omap5_init_secondary:            \n\t"
+"        ldr   r12, =0x102        \n\t" /* API_HYP_ENTRY */
+"        adr   r0, init_secondary \n\t"
+"        smc   #0                 \n\t"
+"        b     init_secondary     \n\t"
+);
+
 static uint16_t num_den[8][2] = {
     {         0,          0 },  /* not used */
     {  26 *  64,  26 *  125 },  /* 12.0 Mhz */

</pre>
    <br>
    I personally find this favourable to introducing new stub files.<br>
    <br>
    Ultimately it is Julien/Stefano's decision, but I'd like to point it
    out as an option for anyone who is unaware.<br>
    <br>
    ~Andrew<br>
  </body>
</html>
Julien Grall June 25, 2019, 9:57 a.m. UTC | #3
Hi Andrew,

On 24/06/2019 13:03, Andrew Cooper wrote:
> On 24/06/2019 12:09, Julien Grall wrote:
>> (+ GSOC mentors and Andre)
>>
>> Hi Denis,
>>
>> Thank you for the patch.
>>
>> First of all, may I ask to CC the other mentors?
>>
>> On 6/21/19 9:02 PM, Denis Obrezkov wrote:
>>> This function allows xen to bring secondary CPU cores into non-secure
>>> HYP mode. This is done by using a Secure Monitor call.
>>>
>>> Signed-off-by: Denis Obrezkov <denisobrezkov@gmail.com>
>>> ---
>>>   xen/arch/arm/arm32/head.S             | 11 ++++++++++-
>>>   xen/arch/arm/platforms/omap5.c        |  5 +++--
>>>   xen/include/asm-arm/platforms/omap5.h |  3 +++
>>>   3 files changed, 16 insertions(+), 3 deletions(-)
>>>
>>> diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
>>> index 5f817d473e..120e034934 100644
>>> --- a/xen/arch/arm/arm32/head.S
>>> +++ b/xen/arch/arm/arm32/head.S
>>> @@ -36,6 +36,10 @@
>>>   #include EARLY_PRINTK_INC
>>>   #endif
>>>   +
>>> +#define API_HYP_ENTRY 0x102
>>> +#define AUX_CORE_BOOT0_PA           0x48281800
>>> +
>>
>> I have thought a bit more about the placement of the code. I think it would be 
>> best if it lives in a separate file (maybe platforms/omap5-head.S).
> 
> For something this trivial, it is easy to put straight into omap5.c
> 
> Completely untested, but this ought to work:
> 
> diff --git a/xen/arch/arm/platforms/omap5.c b/xen/arch/arm/platforms/omap5.c
> index 6b5cc15af3..1dcc92d3a4 100644
> --- a/xen/arch/arm/platforms/omap5.c
> +++ b/xen/arch/arm/platforms/omap5.c
> @@ -23,6 +23,16 @@
>   #include <xen/vmap.h>
>   #include <asm/io.h>
>   
> +void omap5_init_secondary(void);
> +asm (
> +".text                            \n\t"
> +"omap5_init_secondary:            \n\t"
> +"        ldr   r12, =0x102        \n\t" /* API_HYP_ENTRY */
> +"        adr   r0, init_secondary \n\t"

You cannot use adr on external address for Arm32. This is because the immediate 
constant needs to have a specific format (see "Modified immediate constants in 
ARM instructions" A5.2.4 in ARM DDI 406C.c).

Instead we would need something like:

omap5_init_secondary:
      ldr r12, =0x102
      adr r0, omap5_hyp
      smc #0
omap5_hyp:
      b   init_secondary

Note similar code would be needed for the stub file.

> +"        smc   #0                 \n\t"
> +"        b     init_secondary     \n\t"
> +);
> +
>   static uint16_t num_den[8][2] = {
>       {         0,          0 },  /* not used */
>       {  26 *  64,  26 *  125 },  /* 12.0 Mhz */
> 
> 
> I personally find this favourable to introducing new stub files.
> 
> Ultimately it is Julien/Stefano's decision, but I'd like to point it out as an 
> option for anyone who is unaware.

Thank you for the suggestion :). This was suggested last week, but no-one came 
back explaining how it could be implemented.

The two are fine with me.

Cheers,
diff mbox series

Patch

diff --git a/xen/arch/arm/arm32/head.S b/xen/arch/arm/arm32/head.S
index 5f817d473e..120e034934 100644
--- a/xen/arch/arm/arm32/head.S
+++ b/xen/arch/arm/arm32/head.S
@@ -36,6 +36,10 @@ 
 #include EARLY_PRINTK_INC
 #endif
 
+
+#define API_HYP_ENTRY 0x102
+#define AUX_CORE_BOOT0_PA           0x48281800
+
 /*
  * Common register usage in this file:
  *   r0  -
@@ -113,6 +117,12 @@  past_zImage:
 
         b     common_start
 
+GLOBAL(omap5_init_secondary)
+        ldr  r12, =API_HYP_ENTRY
+        adr  r0, init_secondary
+		dsb
+        smc   #0
+
 GLOBAL(init_secondary)
         cpsid aif                    /* Disable all interrupts */
 
@@ -159,7 +169,6 @@  common_start:
         PRINT("- CPU doesn't support the virtualization extensions -\r\n")
         b     fail
 1:
-
         /* Check that we're already in Hyp mode */
         mrs   r0, cpsr
         and   r0, r0, #0x1f          /* Mode is in the low 5 bits of CPSR */
diff --git a/xen/arch/arm/platforms/omap5.c b/xen/arch/arm/platforms/omap5.c
index aee24e4d28..6b5cc15af3 100644
--- a/xen/arch/arm/platforms/omap5.c
+++ b/xen/arch/arm/platforms/omap5.c
@@ -128,8 +128,9 @@  static int __init omap5_smp_init(void)
     }
 
     printk("Set AuxCoreBoot1 to %"PRIpaddr" (%p)\n",
-           __pa(init_secondary), init_secondary);
-    writel(__pa(init_secondary), wugen_base + OMAP_AUX_CORE_BOOT_1_OFFSET);
+           __pa(omap5_init_secondary), omap5_init_secondary);
+    writel(__pa(omap5_init_secondary), 
+            wugen_base + OMAP_AUX_CORE_BOOT_1_OFFSET);
 
     printk("Set AuxCoreBoot0 to 0x20\n");
     writel(0x20, wugen_base + OMAP_AUX_CORE_BOOT_0_OFFSET);
diff --git a/xen/include/asm-arm/platforms/omap5.h b/xen/include/asm-arm/platforms/omap5.h
index c559c84b61..732b27f403 100644
--- a/xen/include/asm-arm/platforms/omap5.h
+++ b/xen/include/asm-arm/platforms/omap5.h
@@ -22,6 +22,9 @@ 
 
 #endif /* __ASM_ARM_PLATFORMS_OMAP5_H */
 
+/* Secondary cpu omap5 specific init routine */
+extern void omap5_init_secondary(void);
+
 /*
  * Local variables:
  * mode: C