From owner-svn-src-projects@FreeBSD.ORG Thu Jul 31 20:55:07 2014 Return-Path: Delivered-To: svn-src-projects@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [8.8.178.115]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id 0C54E7AF; Thu, 31 Jul 2014 20:55:07 +0000 (UTC) Received: from svn.freebsd.org (svn.freebsd.org [IPv6:2001:1900:2254:2068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mx1.freebsd.org (Postfix) with ESMTPS id ED848269B; Thu, 31 Jul 2014 20:55:06 +0000 (UTC) Received: from svn.freebsd.org ([127.0.1.70]) by svn.freebsd.org (8.14.9/8.14.9) with ESMTP id s6VKt61E006640; Thu, 31 Jul 2014 20:55:06 GMT (envelope-from andrew@svn.freebsd.org) Received: (from andrew@localhost) by svn.freebsd.org (8.14.9/8.14.9/Submit) id s6VKt6Ma006634; Thu, 31 Jul 2014 20:55:06 GMT (envelope-from andrew@svn.freebsd.org) Message-Id: <201407312055.s6VKt6Ma006634@svn.freebsd.org> From: Andrew Turner Date: Thu, 31 Jul 2014 20:55:06 +0000 (UTC) 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 X-SVN-Group: projects MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-projects@freebsd.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: "SVN commit messages for the src " projects" tree" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 31 Jul 2014 20:55:07 -0000 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 #include +#include + +#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 __FBSDID("$FreeBSD$"); +#if 1 +#include +#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);