Hi Andrey, > On July 18, 2018 at 6:54 PM Andrey Smirnov <andrew.smirnov@xxxxxxxxx> wrote: > > > On Wed, Jul 18, 2018 at 12:28 AM Giorgio Dal Molin > <giorgio.nicole@xxxxxxxx> wrote: > > > > Hi all, > > > > I'm currently working with the imx7d sabre board from NXP. > > > > I have now a running barebox bootloader and a booting kernel. > > > > My problem is now that, apparently, only one core is active: > > > > ... > > commandline: console=ttymxc0,115200n8 ip=11.0.0.4::11.0.0.2:255.0.0.0::eth0: root=/dev/mmcblk0p2 rootdelay=1 > > Starting kernel in secure mode > > AFAIK, this means that you are booting in secure mode and secure > monitor code, which also implements PSCI needed for SMP to work, will > _not_ be installed by Barebox. One way to fix this would be to set: > > global.bootm.secure_state=nonsecure > > before booting Linux. Doing that I get: > > # lscpu -e > CPU SOCKET CORE ONLINE MAXMHZ MINMHZ > 0 0 0 yes 996.0000 792.0000 > 1 0 1 yes 996.0000 792.0000 > # > > on my SabreSD board. > I think I've found some inconsistencies in the SECURE / NONSECURE implementation in barebox. In arch/arm/include/asm/secure.h there is the definition: ... enum arm_security_state { ARM_STATE_SECURE, ARM_STATE_NONSECURE, ARM_STATE_HYP, }; where ARM_STATE_SECURE == 0 and ARM_STATE_NONSECURE == 1; In arch/arm/cpu/psci.c we have: ... static int of_psci_fixup(struct device_node *root, void *unused) { struct device_node *psci; int ret; if (bootm_arm_security_state() < ARM_STATE_NONSECURE) return 0; psci = of_create_node(root, "/psci"); if (!psci) ... This is a bit surprising and conterintuitive: I think the logic should be so that if the current mode is not secure then we want to go out, otherwise we want to generate the /psci {} dt block for the kernel. If this is true then we have an error here. One more use of the state is in the start_linux() function, in arch/arm/lib32/armlinux.c: ... void start_linux(void *adr, int swap, unsigned long initrd_address, unsigned long initrd_size, void *oftree, enum arm_security_state state) { void (*kernel)(int zero, int arch, void *params) = adr; void *params = NULL; int architecture; int ret; if (IS_ENABLED(CONFIG_ARM_SECURE_MONITOR) && state > ARM_STATE_NONSECURE) { ret = armv7_secure_monitor_install(); if (ret) pr_err("Failed to install secure monitor\n"); } ... In this case the secure monitor would be installed only in case state == ARM_STATE_HYP, also strange... I tried to fix things so: In arch/arm/include/asm/secure.h: ... enum arm_security_state { ARM_STATE_NONSECURE, ARM_STATE_SECURE, ARM_STATE_HYP, }; In arch/arm/cpu/psci.c: ... static int of_psci_fixup(struct device_node *root, void *unused) { struct device_node *psci; int ret; if (bootm_arm_security_state() < ARM_STATE_SECURE) return 0; psci = of_create_node(root, "/psci"); if (!psci) ... Moreover, in arch/arm/cpu/sm.c I initialized the global var. bootm_secure_state: = ARM_STATE_SECURE static int sm_init(void) { ... bootm_secure_state = ARM_STATE_SECURE } With these fixes I can boot the imx7d sabre in secure mode with 2 cores. Unfortunately the CAAM cripto module still doesn't work :-( giorgio _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox