diff options
author | Ard Biesheuvel <ard.biesheuvel@linaro.org> | 2016-04-25 16:06:53 -0400 |
---|---|---|
committer | Ingo Molnar <mingo@kernel.org> | 2016-04-28 05:33:59 -0400 |
commit | 801820bee9bccb7c156af2b95c7208f428a06ae7 (patch) | |
tree | e2d486dc835f643ffa966d7b499f2ef17d3f1d7b /drivers/firmware/efi/arm-init.c | |
parent | 57fdb89aeb7b0e3aab19847ab7399e5d76f11e6f (diff) |
efi/arm/libstub: Make screen_info accessible to the UEFI stub
In order to hand over the framebuffer described by the GOP protocol and
discovered by the UEFI stub, make struct screen_info accessible by the
stub. This involves allocating a loader data buffer and passing it to the
kernel proper via a UEFI Configuration Table, since the UEFI stub executes
in the context of the decompressor, and cannot access the kernel's copy of
struct screen_info directly.
Signed-off-by: Ard Biesheuvel <ard.biesheuvel@linaro.org>
Signed-off-by: Matt Fleming <matt@codeblueprint.co.uk>
Cc: Borislav Petkov <bp@alien8.de>
Cc: David Herrmann <dh.herrmann@gmail.com>
Cc: Mark Rutland <mark.rutland@arm.com>
Cc: Peter Jones <pjones@redhat.com>
Cc: Peter Zijlstra <peterz@infradead.org>
Cc: Thomas Gleixner <tglx@linutronix.de>
Cc: Will Deacon <will.deacon@arm.com>
Cc: linux-efi@vger.kernel.org
Link: http://lkml.kernel.org/r/1461614832-17633-22-git-send-email-matt@codeblueprint.co.uk
Signed-off-by: Ingo Molnar <mingo@kernel.org>
Diffstat (limited to 'drivers/firmware/efi/arm-init.c')
-rw-r--r-- | drivers/firmware/efi/arm-init.c | 34 |
1 files changed, 33 insertions, 1 deletions
diff --git a/drivers/firmware/efi/arm-init.c b/drivers/firmware/efi/arm-init.c index 909d974d35d9..ac95dd8b119f 100644 --- a/drivers/firmware/efi/arm-init.c +++ b/drivers/firmware/efi/arm-init.c | |||
@@ -11,12 +11,15 @@ | |||
11 | * | 11 | * |
12 | */ | 12 | */ |
13 | 13 | ||
14 | #define pr_fmt(fmt) "efi: " fmt | ||
15 | |||
14 | #include <linux/efi.h> | 16 | #include <linux/efi.h> |
15 | #include <linux/init.h> | 17 | #include <linux/init.h> |
16 | #include <linux/memblock.h> | 18 | #include <linux/memblock.h> |
17 | #include <linux/mm_types.h> | 19 | #include <linux/mm_types.h> |
18 | #include <linux/of.h> | 20 | #include <linux/of.h> |
19 | #include <linux/of_fdt.h> | 21 | #include <linux/of_fdt.h> |
22 | #include <linux/screen_info.h> | ||
20 | 23 | ||
21 | #include <asm/efi.h> | 24 | #include <asm/efi.h> |
22 | 25 | ||
@@ -51,6 +54,32 @@ static phys_addr_t efi_to_phys(unsigned long addr) | |||
51 | return addr; | 54 | return addr; |
52 | } | 55 | } |
53 | 56 | ||
57 | static __initdata unsigned long screen_info_table = EFI_INVALID_TABLE_ADDR; | ||
58 | |||
59 | static __initdata efi_config_table_type_t arch_tables[] = { | ||
60 | {LINUX_EFI_ARM_SCREEN_INFO_TABLE_GUID, NULL, &screen_info_table}, | ||
61 | {NULL_GUID, NULL, NULL} | ||
62 | }; | ||
63 | |||
64 | static void __init init_screen_info(void) | ||
65 | { | ||
66 | struct screen_info *si; | ||
67 | |||
68 | if (screen_info_table != EFI_INVALID_TABLE_ADDR) { | ||
69 | si = early_memremap_ro(screen_info_table, sizeof(*si)); | ||
70 | if (!si) { | ||
71 | pr_err("Could not map screen_info config table\n"); | ||
72 | return; | ||
73 | } | ||
74 | screen_info = *si; | ||
75 | early_memunmap(si, sizeof(*si)); | ||
76 | |||
77 | /* dummycon on ARM needs non-zero values for columns/lines */ | ||
78 | screen_info.orig_video_cols = 80; | ||
79 | screen_info.orig_video_lines = 25; | ||
80 | } | ||
81 | } | ||
82 | |||
54 | static int __init uefi_init(void) | 83 | static int __init uefi_init(void) |
55 | { | 84 | { |
56 | efi_char16_t *c16; | 85 | efi_char16_t *c16; |
@@ -108,7 +137,8 @@ static int __init uefi_init(void) | |||
108 | goto out; | 137 | goto out; |
109 | } | 138 | } |
110 | retval = efi_config_parse_tables(config_tables, efi.systab->nr_tables, | 139 | retval = efi_config_parse_tables(config_tables, efi.systab->nr_tables, |
111 | sizeof(efi_config_table_t), NULL); | 140 | sizeof(efi_config_table_t), |
141 | arch_tables); | ||
112 | 142 | ||
113 | early_memunmap(config_tables, table_size); | 143 | early_memunmap(config_tables, table_size); |
114 | out: | 144 | out: |
@@ -223,4 +253,6 @@ void __init efi_init(void) | |||
223 | PAGE_ALIGN(params.mmap_size + | 253 | PAGE_ALIGN(params.mmap_size + |
224 | (params.mmap & ~PAGE_MASK))); | 254 | (params.mmap & ~PAGE_MASK))); |
225 | } | 255 | } |
256 | |||
257 | init_screen_info(); | ||
226 | } | 258 | } |