1 /* 2 * Copyright (C) Paul Mackerras 1997. 3 * 4 * This program is free software; you can redistribute it and/or 5 * modify it under the terms of the GNU General Public License 6 * as published by the Free Software Foundation; either version 7 * 2 of the License, or (at your option) any later version. 8 */ 9 #include <stdarg.h> 10 #include <stddef.h> 11 #include "types.h" 12 #include "elf.h" 13 #include "string.h" 14 #include "stdio.h" 15 #include "page.h" 16 #include "ops.h" 17 18 #include "of.h" 19 20 extern char _end[]; 21 22 /* Value picked to match that used by yaboot */ 23 #define PROG_START 0x01400000 /* only used on 64-bit systems */ 24 #define RAM_END (512<<20) /* Fixme: use OF */ 25 #define ONE_MB 0x100000 26 27 28 29 static unsigned long claim_base; 30 31 static void *of_try_claim(unsigned long size) 32 { 33 unsigned long addr = 0; 34 35 if (claim_base == 0) 36 claim_base = _ALIGN_UP((unsigned long)_end, ONE_MB); 37 38 for(; claim_base < RAM_END; claim_base += ONE_MB) { 39 #ifdef DEBUG 40 printf(" trying: 0x%08lx\n\r", claim_base); 41 #endif 42 addr = (unsigned long)of_claim(claim_base, size, 0); 43 if ((void *)addr != (void *)-1) 44 break; 45 } 46 if (addr == 0) 47 return NULL; 48 claim_base = PAGE_ALIGN(claim_base + size); 49 return (void *)addr; 50 } 51 52 static void of_image_hdr(const void *hdr) 53 { 54 const Elf64_Ehdr *elf64 = hdr; 55 56 if (elf64->e_ident[EI_CLASS] == ELFCLASS64) { 57 /* 58 * Maintain a "magic" minimum address. This keeps some older 59 * firmware platforms running. 60 */ 61 if (claim_base < PROG_START) 62 claim_base = PROG_START; 63 } 64 } 65 66 void platform_init(unsigned long a1, unsigned long a2, void *promptr) 67 { 68 platform_ops.image_hdr = of_image_hdr; 69 platform_ops.malloc = of_try_claim; 70 platform_ops.exit = of_exit; 71 platform_ops.vmlinux_alloc = of_vmlinux_alloc; 72 73 dt_ops.finddevice = of_finddevice; 74 dt_ops.getprop = of_getprop; 75 dt_ops.setprop = of_setprop; 76 77 of_console_init(); 78 79 of_init(promptr); 80 loader_info.promptr = promptr; 81 if (a1 && a2 && a2 != 0xdeadbeef) { 82 loader_info.initrd_addr = a1; 83 loader_info.initrd_size = a2; 84 } 85 } 86