[U-Boot] [PATCH] arm: exynos: Use the generic lowlevel_init instead of the specific one

Thomas Abraham ta.omasab at gmail.com
Tue Sep 20 10:45:18 CEST 2016


On Tue, Sep 20, 2016 at 12:03 PM, Alexander Graf <agraf at suse.de> wrote:
>
>
> On 20.09.16 08:25, Thomas Abraham wrote:
>> On Tue, Sep 20, 2016 at 11:35 AM, Alexander Graf <agraf at suse.de> wrote:
>>>
>>>
>>> Am 20.09.2016 um 07:51 schrieb Thomas Abraham <ta.omasab at gmail.com>:
>>>
>>> Hi Alison,
>>>
>>>
>>> On Mon, Sep 19, 2016 at 7:38 PM, Alexander Graf <agraf at suse.de> wrote:
>>>
>>>
>>>
>>> On 09.09.16 10:48, Alison Wang wrote:
>>>
>>> This patch is to use the the generic lowlevel_init instead of the
>>>
>>> specific one.
>>>
>>>
>>> Signed-off-by: Alison Wang <alison.wang at nxp.com>
>>>
>>>
>>> If I had to guess, I'd think they only had their own version because the
>>>
>>> old one required a GIC.
>>>
>>>
>>> I apologize for the delay.
>>>
>>> The reason for using a custom version was to avoid enabling
>>> ARMV8_MULTIENTRY config option since the Exynos7 code was ready for
>>> it.
>>>
>>>
>>> Either way, since Samsung doesn't reply, I'm fine potentially breaking
>>>
>>> their boards if that means that we can make progress for actively
>>>
>>> maintained ones:
>>>
>>>
>>>  Reviewed-by: Alexander Graf <agraf at suse.de>
>>>
>>>
>>> This patch without the ARMV8_MULTIENTRY and ARMV8_SWITCH_TO_EL1 config
>>> options does not switch the boot CPU from EL3 to EL1. So it would be
>>> preferable to not merge this patch until ARMV8_MULTIENTRY  is enabled
>>> for Exynos7.
>>>
>>>
>>> Why do you want to switch it to EL1 in the first place? Linux is very happy
>>> to live in EL2 - which is what we call it in by default.
>>
>> Okay, there is no particular requirement to be in EL1 for Exynos7. EL2
>> would also be fine. But Exynos7 support in u-boot is not yet ready for
>> enabling ARMV8_MULTIENTRY config option. Is there anything be blocked
>> due to Exynos7 using a custom lowlevel_init function?
>
> Yes, we're changing the semantics of armv8_switch_to_el2 and
> armv8_switch_to_el1:
>
>   http://lists.denx.de/pipermail/u-boot/2016-September/266217.html
>
> which is a prerequisite for AArch32 kernel boot on AArch64 systems.

Okay.

>
> How quickly do you think you could make Exynos7 work with MULTIENTRY?
>

Exynos7420 uses CPU 0 of Cluster 1 as boot CPU (master CPU). The macro
'branch_if_master' requires all affinity values to be zero for a CPU
to be identified as a master CPU. And so the boot CPU is incorrectly
detected as a slave CPU. I have tested with the following temporary
workaround to enable ARMV8_MULTIENTRY on Exynos7420. If it looks fine,
this can be merged along with Alison's patch.

Thomas.

diff --git a/arch/arm/mach-exynos/Kconfig b/arch/arm/mach-exynos/Kconfig
index ce2a16f..45c5eeb 100644
--- a/arch/arm/mach-exynos/Kconfig
+++ b/arch/arm/mach-exynos/Kconfig
@@ -126,6 +126,8 @@ choice
 config  TARGET_ESPRESSO7420
        bool "ESPRESSO7420 board"
        select ARM64
+       select ARMV8_MULTIENTRY
+       select ARMV8_SWITCH_TO_EL1
        select SUPPORT_SPL
        select OF_CONTROL
        select SPL_DISABLE_OF_CONTROL
diff --git a/arch/arm/mach-exynos/soc.c b/arch/arm/mach-exynos/soc.c
index f9c7468..6c3ebb0 100644
--- a/arch/arm/mach-exynos/soc.c
+++ b/arch/arm/mach-exynos/soc.c
@@ -9,6 +9,16 @@
 #include <asm/io.h>
 #include <asm/system.h>

+#ifdef CONFIG_TARGET_ESPRESSO7420
+/*
+ * Exynos7420 uses CPU0 of Cluster-1 as boot CPU. Due to this branch_if_master
+ * fails to identify as the master CPU. As temporary workaround, setup the
+ * slave CPU boot address as "_main".
+ */
+extern void _main(void);
+void *secondary_boot_addr = (void *)_main;
+#endif /* CONFIG_TARGET_ESPRESSO7420 */
+
 void reset_cpu(ulong addr)
 {
 #ifdef CONFIG_CPU_V7
diff --git a/include/configs/exynos7420-common.h
b/include/configs/exynos7420-common.h
index 9e03962..6f58aef 100644
--- a/include/configs/exynos7420-common.h
+++ b/include/configs/exynos7420-common.h
@@ -48,6 +48,7 @@
 #define CONFIG_IRAM_BASE               0x02100000
 #define CONFIG_IRAM_SIZE               0x58000
 #define CONFIG_IRAM_END                        (CONFIG_IRAM_BASE +
CONFIG_IRAM_SIZE)
+#define CPU_RELEASE_ADDR               secondary_boot_addr

 /* Number of CPUs available */
 #define CONFIG_CORE_COUNT              0x8

>
> Alex


More information about the U-Boot mailing list