Date: Thu, 31 Jul 2014 20:55:06 +0000 (UTC) From: Andrew Turner <andrew@FreeBSD.org> To: src-committers@freebsd.org, svn-src-projects@freebsd.org Subject: svn commit: r269350 - in projects/arm64/sys: arm64/arm64 arm64/include boot/arm64/efi Message-ID: <201407312055.s6VKt6Ma006634@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: andrew Date: Thu Jul 31 20:55:05 2014 New Revision: 269350 URL: http://svnweb.freebsd.org/changeset/base/269350 Log: Pass the dtb from loader to the kernel. For now loader tries to load foundation.dtb from the disk and pass this to the kernel. The dtb is expected to be after the kernel and the data passed in is its offset from the start of the kernel. Modified: projects/arm64/sys/arm64/arm64/machdep.c projects/arm64/sys/arm64/include/metadata.h projects/arm64/sys/boot/arm64/efi/autoload.c projects/arm64/sys/boot/arm64/efi/bootinfo.c Modified: projects/arm64/sys/arm64/arm64/machdep.c ============================================================================== --- projects/arm64/sys/arm64/arm64/machdep.c Thu Jul 31 20:28:17 2014 (r269349) +++ projects/arm64/sys/arm64/arm64/machdep.c Thu Jul 31 20:55:05 2014 (r269350) @@ -62,6 +62,10 @@ __FBSDID("$FreeBSD$"); #include <machine/reg.h> #include <machine/vmparam.h> +#include <dev/ofw/openfirm.h> + +#include "opt_platform.h" + struct pcpu __pcpu[MAXCPU]; struct pcpu *pcpup = &__pcpu[0]; @@ -484,6 +488,28 @@ add_efi_map_entries(struct efi_map_heade } } +#ifdef FDT +static void +try_load_dtb(caddr_t kmdp) +{ + vm_offset_t dtboff; + void *dtbp; + + dtboff = MD_FETCH(kmdp, MODINFOMD_DTB_OFF, vm_offset_t); + if (dtboff == 0) + return; + + dtbp = (void *)(KERNBASE + dtboff); + printf("dtbp = %llx\n", *(uint64_t *)(KERNBASE + dtboff)); + + if (OF_install(OFW_FDT, 0) == FALSE) + panic("Cannot install FDT"); + + if (OF_init((void *)dtbp) != 0) + panic("OF_init failed with the found device tree"); +} +#endif + void initarm(struct arm64_bootparams *abp) { @@ -503,6 +529,10 @@ initarm(struct arm64_bootparams *abp) if (kmdp == NULL) kmdp = preload_search_by_type("elf64 kernel"); +#ifdef FDT + try_load_dtb(kmdp); +#endif + /* Find the address to start allocating from */ lastaddr = MD_FETCH(kmdp, MODINFOMD_KERNEND, vm_offset_t); Modified: projects/arm64/sys/arm64/include/metadata.h ============================================================================== --- projects/arm64/sys/arm64/include/metadata.h Thu Jul 31 20:28:17 2014 (r269349) +++ projects/arm64/sys/arm64/include/metadata.h Thu Jul 31 20:55:05 2014 (r269350) @@ -30,6 +30,7 @@ #define _MACHINE_METADATA_H_ #define MODINFOMD_EFI_MAP 0x1001 +#define MODINFOMD_DTB_OFF 0x1002 struct efi_map_header { size_t memory_size; Modified: projects/arm64/sys/boot/arm64/efi/autoload.c ============================================================================== --- projects/arm64/sys/boot/arm64/efi/autoload.c Thu Jul 31 20:28:17 2014 (r269349) +++ projects/arm64/sys/boot/arm64/efi/autoload.c Thu Jul 31 20:55:05 2014 (r269350) @@ -27,9 +27,37 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#if 1 +#include <stand.h> +#include "bootstrap.h" + +/* HACK: Load the foundation model dtb from disk */ +static int +load_dtb_file(const char *filename) +{ + struct preloaded_file *bfp, *oldbfp; + int err; + + oldbfp = file_findfile(NULL, "dtb"); + + /* Attempt to load and validate a new dtb from a file. */ + if ((bfp = file_loadraw(filename, "dtb")) == NULL) { + printf("failed to load file '%s': %s\n", filename, command_errbuf); + return (1); + } + + /* A new dtb was validated, discard any previous file. */ + if (oldbfp) + file_discard(oldbfp); + return (0); +} +#endif + int amd64_autoload(void) { + load_dtb_file("/foundation.dtb"); + return (0); } Modified: projects/arm64/sys/boot/arm64/efi/bootinfo.c ============================================================================== --- projects/arm64/sys/boot/arm64/efi/bootinfo.c Thu Jul 31 20:28:17 2014 (r269349) +++ projects/arm64/sys/boot/arm64/efi/bootinfo.c Thu Jul 31 20:55:05 2014 (r269350) @@ -198,10 +198,11 @@ bi_load_efi_data(struct preloaded_file * int bi_load(char *args, vm_offset_t *modulep, vm_offset_t *kernendp) { - struct preloaded_file *xp, *kfp; + struct preloaded_file *xp, *kfp, *dtbfp; struct file_metadata *md; uint64_t kernend; vm_offset_t addr, size; + vm_offset_t dtbp; /* find the last module in the chain */ addr = 0; @@ -218,6 +219,15 @@ bi_load(char *args, vm_offset_t *modulep if (kfp == NULL) panic("can't find kernel file"); kernend = 0; /* fill it in later */ + + dtbfp = file_findfile(NULL, "dtb"); + if (dtbfp != NULL) { + printf("dtbfp = %llx %lld\n", dtbfp->f_addr, dtbfp->f_addr - kfp->f_addr); + + dtbp = dtbfp->f_addr - kfp->f_addr; + file_addmetadata(kfp, MODINFOMD_DTB_OFF, sizeof dtbp, &dtbp); + } + file_addmetadata(kfp, MODINFOMD_KERNEND, sizeof kernend, &kernend); bi_load_efi_data(kfp);
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201407312055.s6VKt6Ma006634>