efi/arm64: efistub: Move shared dependencies to <asm/efi.h>
[deliverable/linux.git] / arch / arm64 / kernel / efi-stub.c
1 /*
2 * Copyright (C) 2013, 2014 Linaro Ltd; <roy.franz@linaro.org>
3 *
4 * This file implements the EFI boot stub for the arm64 kernel.
5 * Adapted from ARM version by Mark Salter <msalter@redhat.com>
6 *
7 * This program is free software; you can redistribute it and/or modify
8 * it under the terms of the GNU General Public License version 2 as
9 * published by the Free Software Foundation.
10 *
11 */
12 #include <linux/efi.h>
13 #include <asm/efi.h>
14 #include <linux/libfdt.h>
15 #include <asm/sections.h>
16
17 static void efi_char16_printk(efi_system_table_t *sys_table_arg,
18 efi_char16_t *str);
19
20 static efi_status_t efi_open_volume(efi_system_table_t *sys_table,
21 void *__image, void **__fh);
22 static efi_status_t efi_file_close(void *handle);
23
24 static efi_status_t
25 efi_file_read(void *handle, unsigned long *size, void *addr);
26
27 static efi_status_t
28 efi_file_size(efi_system_table_t *sys_table, void *__fh,
29 efi_char16_t *filename_16, void **handle, u64 *file_sz);
30
31 /* Include shared EFI stub code */
32 #include "../../../drivers/firmware/efi/efi-stub-helper.c"
33 #include "../../../drivers/firmware/efi/fdt.c"
34 #include "../../../drivers/firmware/efi/arm-stub.c"
35
36
37 static efi_status_t handle_kernel_image(efi_system_table_t *sys_table,
38 unsigned long *image_addr,
39 unsigned long *image_size,
40 unsigned long *reserve_addr,
41 unsigned long *reserve_size,
42 unsigned long dram_base,
43 efi_loaded_image_t *image)
44 {
45 efi_status_t status;
46 unsigned long kernel_size, kernel_memsize = 0;
47
48 /* Relocate the image, if required. */
49 kernel_size = _edata - _text;
50 if (*image_addr != (dram_base + TEXT_OFFSET)) {
51 kernel_memsize = kernel_size + (_end - _edata);
52 status = efi_relocate_kernel(sys_table, image_addr,
53 kernel_size, kernel_memsize,
54 dram_base + TEXT_OFFSET,
55 PAGE_SIZE);
56 if (status != EFI_SUCCESS) {
57 pr_efi_err(sys_table, "Failed to relocate kernel\n");
58 return status;
59 }
60 if (*image_addr != (dram_base + TEXT_OFFSET)) {
61 pr_efi_err(sys_table, "Failed to alloc kernel memory\n");
62 efi_free(sys_table, kernel_memsize, *image_addr);
63 return EFI_LOAD_ERROR;
64 }
65 *image_size = kernel_memsize;
66 }
67
68
69 return EFI_SUCCESS;
70 }
This page took 0.071595 seconds and 5 git commands to generate.