Re: [U-Boot] [RESEND PATCH v2 03/15] riscv: bootm: Correct the 1st kernel argument to hart id

From: Bin Meng [mailto:bmeng.cn@gmail.com] Sent: Tuesday, September 11, 2018 12:55 PM To: Rick Jian-Zhi Chen(陳建志); U-Boot Mailing List Cc: Lukas Auer Subject: [RESEND PATCH v2 03/15] riscv: bootm: Correct the 1st
kernel argument
to hart id
The first argument of Linux kernel is the risc-v core hart id, from
which the kernel
is booted from. It is not the mach_id, which seems to be copied from arm.
While we are here, this also changes the Linux kernel entry
parameters' type to
support both 32-bit and 64-bit.
Note the hart id is hardcoded to zero for now, and we should change
to fill in it
with the value read from mhartid CSR of the hart which this routine
is currently
running on.
Signed-off-by: Bin Meng bmeng.cn@gmail.com
Changes in v2:
- Change Linux kernel entry parameters' type to support 32/64 bit
arch/riscv/lib/bootm.c | 18 +++++------------- 1 file changed, 5 insertions(+), 13 deletions(-)
diff --git a/arch/riscv/lib/bootm.c b/arch/riscv/lib/bootm.c index 6662aff..6893108 100644 --- a/arch/riscv/lib/bootm.c +++ b/arch/riscv/lib/bootm.c @@ -25,10 +25,7 @@ int arch_fixup_fdt(void *blob)
int do_bootm_linux(int flag, int argc, char *argv[],
bootm_headers_t *images)
{
bd_t *bd = gd->bd;
char *s;
int machid = bd->bi_arch_number;
void (*theKernel)(int arch, uint params);
void (*kernel)(ulong hart, void *dtb); /* * allow the PREP bootm subcommand, it is required for bootm to work
@@ -39,18 +36,12 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) if ((flag != 0) && (flag != BOOTM_STATE_OS_GO)) return 1;
theKernel = (void (*)(int, uint))images->ep;
s = env_get("machid");
if (s) {
machid = simple_strtoul(s, NULL, 16);
printf("Using machid 0x%x from environment\n", machid);
}
kernel = (void (*)(ulong, void *))images->ep; bootstage_mark(BOOTSTAGE_ID_RUN_OS); debug("## Transferring control to Linux (at address %08lx) ...\n",
(ulong)theKernel);
(ulong)kernel); if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len) { #ifdef
CONFIG_OF_LIBFDT @@ -66,8 +57,9 @@ int do_bootm_linux(int flag, int argc, char *argv[], bootm_headers_t *images) printf("\nStarting kernel ...\n\n");
cleanup_before_linux();
/* TODO: hardcode the hart id to zero for now */ if (IMAGE_ENABLE_OF_LIBFDT && images->ft_len)
theKernel(machid, (unsigned long)images->ft_addr);
kernel(0, images->ft_addr); /* does not return */
Reviewed-by: Rick Chen rick@andestech.com
-- 2.7.4
participants (1)
-
Rick Chen