From: Vladimir Serbinenko Date: Sun, 21 Feb 2016 19:28:10 +0000 (+0100) Subject: coreboot X-Git-Url: http://git.ipfire.org/gitweb/gitweb.cgi?a=commitdiff_plain;h=0b71582111639b63b845d7f413beeaec3596aeaf;p=thirdparty%2Fgrub.git coreboot --- diff --git a/grub-core/Makefile.am b/grub-core/Makefile.am index 54180a4c9..a7722290f 100644 --- a/grub-core/Makefile.am +++ b/grub-core/Makefile.am @@ -246,6 +246,9 @@ KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/video_fb.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/gfxterm.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/font.h KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/bufio.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdt.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/arm/coreboot/kernel.h +KERNEL_HEADER_FILES += $(top_srcdir)/include/grub/fdtbus.h endif if COND_arm_efi diff --git a/grub-core/Makefile.core.def b/grub-core/Makefile.core.def index dc2ebb8bb..3838c4481 100644 --- a/grub-core/Makefile.core.def +++ b/grub-core/Makefile.core.def @@ -1675,7 +1675,7 @@ module = { arm64 = loader/arm64/xen_boot.c; enable = arm64; }; -/* + module = { name = linux; x86 = loader/i386/linux.c; @@ -1691,7 +1691,7 @@ module = { common = lib/cmdline.c; enable = noemu; }; -*/ + module = { name = fdt; arm64 = loader/arm64/fdt.c; diff --git a/grub-core/kern/arm/coreboot/init.c b/grub-core/kern/arm/coreboot/init.c index 6953fb92a..84251adf7 100644 --- a/grub-core/kern/arm/coreboot/init.c +++ b/grub-core/kern/arm/coreboot/init.c @@ -38,6 +38,7 @@ extern grub_uint8_t _start[]; extern grub_uint8_t _end[]; extern grub_uint8_t _edata[]; +grub_addr_t start_of_ram = ~(grub_addr_t)0; void __attribute__ ((noreturn)) grub_exit (void) @@ -66,6 +67,9 @@ heap_init (grub_uint64_t addr, grub_uint64_t size, grub_memory_type_t type, end = GRUB_ULONG_MAX; #endif + if (start_of_ram > begin) + start_of_ram = begin; + if (type != GRUB_MEMORY_AVAILABLE) return 0; diff --git a/include/grub/arm/coreboot/kernel.h b/include/grub/arm/coreboot/kernel.h index 3b47a76f1..95fb0b174 100644 --- a/include/grub/arm/coreboot/kernel.h +++ b/include/grub/arm/coreboot/kernel.h @@ -34,6 +34,7 @@ struct grub_fdt_board extern struct grub_fdt_board grub_fdt_boards[]; void grub_machine_timer_init (void); void grub_pl050_init (void); +extern grub_addr_t EXPORT_VAR (start_of_ram); #endif /* ! ASM_FILE */ #define GRUB_KERNEL_MACHINE_STACK_SIZE GRUB_KERNEL_ARM_STACK_SIZE diff --git a/include/grub/arm/linux.h b/include/grub/arm/linux.h index 1ae161d07..126b7db62 100644 --- a/include/grub/arm/linux.h +++ b/include/grub/arm/linux.h @@ -25,7 +25,7 @@ #include "system.h" -#if defined (GRUB_MACHINE_UBOOT) || defined (GRUB_MACHINE_COREBOOT) +#if defined (GRUB_MACHINE_UBOOT) # include # define LINUX_ADDRESS (start_of_ram + 0x8000) # define LINUX_INITRD_ADDRESS (start_of_ram + 0x02000000) @@ -50,6 +50,22 @@ grub_arm_firmware_get_machine_type (void) { return GRUB_ARM_MACHINE_TYPE_FDT; } +#elif defined (GRUB_MACHINE_COREBOOT) +#include +#include +# define LINUX_ADDRESS (start_of_ram + 0x8000) +# define LINUX_INITRD_ADDRESS (start_of_ram + 0x02000000) +# define LINUX_FDT_ADDRESS (LINUX_INITRD_ADDRESS - 0x10000) +static inline const void * +grub_arm_firmware_get_boot_data (void) +{ + return grub_fdtbus_get_fdt (); +} +static inline grub_uint32_t +grub_arm_firmware_get_machine_type (void) +{ + return GRUB_ARM_MACHINE_TYPE_FDT; +} #endif #define FDT_ADDITIONAL_ENTRIES_SIZE 0x300