Module Name: src Committed By: aymeric Date: Mon May 20 20:17:25 UTC 2019
Modified Files: src/sys/arch/arm/altera: cycv_platform.c Log Message: make CPU 1 bootstrapping work even if the kernel is not loaded close to PA 0. More precisely, we used "B cpu_mpstart", which worked for small addresses and thus does not work in the EFI case. It is now replaced by a "LDR PC, =cpu_mpstart", which works for arbitrary addresses. To generate a diff of this commit: cvs rdiff -u -r1.10 -r1.11 src/sys/arch/arm/altera/cycv_platform.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/altera/cycv_platform.c diff -u src/sys/arch/arm/altera/cycv_platform.c:1.10 src/sys/arch/arm/altera/cycv_platform.c:1.11 --- src/sys/arch/arm/altera/cycv_platform.c:1.10 Thu Jan 31 13:06:10 2019 +++ src/sys/arch/arm/altera/cycv_platform.c Mon May 20 20:17:25 2019 @@ -1,4 +1,4 @@ -/* $NetBSD: cycv_platform.c,v 1.10 2019/01/31 13:06:10 skrll Exp $ */ +/* $NetBSD: cycv_platform.c,v 1.11 2019/05/20 20:17:25 aymeric Exp $ */ /* This file is in the public domain. */ @@ -7,7 +7,7 @@ #include "opt_multiprocessor.h" #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: cycv_platform.c,v 1.10 2019/01/31 13:06:10 skrll Exp $"); +__KERNEL_RCSID(0, "$NetBSD: cycv_platform.c,v 1.11 2019/05/20 20:17:25 aymeric Exp $"); #define _ARM32_BUS_DMA_PRIVATE #include <sys/param.h> @@ -92,18 +92,21 @@ cycv_mpstart(void) bus_space_write_4(bst, bsh_scu, SCU_CTL, bus_space_read_4(bst, bsh_scu, SCU_CTL) | SCU_CTL_SCU_ENA); - const uint32_t startfunc = (uint32_t) KERN_VTOPHYS((vaddr_t)cpu_mpstart); + const uint32_t startfunc = + (uint32_t) KERN_VTOPHYS((vaddr_t) cpu_mpstart); /* - * We place a "B cortex_mpstart" at address 0 in order to bootstrap + * We place a "LDR PC, =cpu_mpstart" at address 0 in order to bootstrap * CPU 1. We can't use the similar feature of the Boot ROM because - * it was unmapped by u-boot in favor of the SDRAM. Plus the dtb is - * stored very low in RAM so we can't re-map the Boot ROM easily. + * it was unmapped by u-boot in favor of the SDRAM. */ pmap_map_chunk(kernel_l1pt.pv_va, CYCV_SDRAM_VBASE, CYCV_SDRAM_BASE, L1_S_SIZE, VM_PROT_READ|VM_PROT_WRITE, PMAP_NOCACHE); - *(volatile uint32_t *) CYCV_SDRAM_VBASE = - htole32(0xea000000 | ((startfunc - 8 - 0x0) >> 2)); + + /* 0: LDR PC, [PC, #0x18] -> loads address at 0x20 into PC */ + *(volatile uint32_t *) CYCV_SDRAM_VBASE = htole32(0xe59ff018); + *(volatile uint32_t *) (CYCV_SDRAM_VBASE + 0x20) = startfunc; + pmap_unmap_chunk(kernel_l1pt.pv_va, CYCV_SDRAM_VBASE, L1_S_SIZE); bus_space_write_4(bst, bsh_rst, CYCV_RSTMGR_MPUMODRST,