|
@@ -169,6 +169,25 @@ void efi_char16_printk(efi_system_table_t *sys_table_arg,
|
|
|
out->output_string(out, str);
|
|
|
}
|
|
|
|
|
|
+static struct screen_info *setup_graphics(efi_system_table_t *sys_table_arg)
|
|
|
+{
|
|
|
+ efi_guid_t gop_proto = EFI_GRAPHICS_OUTPUT_PROTOCOL_GUID;
|
|
|
+ efi_status_t status;
|
|
|
+ unsigned long size;
|
|
|
+ void **gop_handle = NULL;
|
|
|
+ struct screen_info *si = NULL;
|
|
|
+
|
|
|
+ size = 0;
|
|
|
+ status = efi_call_early(locate_handle, EFI_LOCATE_BY_PROTOCOL,
|
|
|
+ &gop_proto, NULL, &size, gop_handle);
|
|
|
+ if (status == EFI_BUFFER_TOO_SMALL) {
|
|
|
+ si = alloc_screen_info(sys_table_arg);
|
|
|
+ if (!si)
|
|
|
+ return NULL;
|
|
|
+ efi_setup_gop(sys_table_arg, si, &gop_proto, size);
|
|
|
+ }
|
|
|
+ return si;
|
|
|
+}
|
|
|
|
|
|
/*
|
|
|
* This function handles the architcture specific differences between arm and
|
|
@@ -208,6 +227,7 @@ unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
|
|
|
unsigned long reserve_addr = 0;
|
|
|
unsigned long reserve_size = 0;
|
|
|
int secure_boot = 0;
|
|
|
+ struct screen_info *si;
|
|
|
|
|
|
/* Check if we were booted by the EFI firmware */
|
|
|
if (sys_table->hdr.signature != EFI_SYSTEM_TABLE_SIGNATURE)
|
|
@@ -260,6 +280,8 @@ unsigned long efi_entry(void *handle, efi_system_table_t *sys_table,
|
|
|
__nokaslr = true;
|
|
|
}
|
|
|
|
|
|
+ si = setup_graphics(sys_table);
|
|
|
+
|
|
|
status = handle_kernel_image(sys_table, image_addr, &image_size,
|
|
|
&reserve_addr,
|
|
|
&reserve_size,
|
|
@@ -341,6 +363,7 @@ fail_free_image:
|
|
|
efi_free(sys_table, image_size, *image_addr);
|
|
|
efi_free(sys_table, reserve_size, reserve_addr);
|
|
|
fail_free_cmdline:
|
|
|
+ free_screen_info(sys_table, si);
|
|
|
efi_free(sys_table, cmdline_size, (unsigned long)cmdline_ptr);
|
|
|
fail:
|
|
|
return EFI_ERROR;
|