Use EDID on EFI.
* grub-core/kern/efi/efi.c (grub_efi_get_variable): New argument datasize_out. * grub-core/video/efi_gop.c (check_protocol): Check that GOP has usable modes. Set gop_handle. (grub_video_gop_get_edid): New function. (grub_gop_get_preferred_mode): Likewise. (grub_video_gop_setup): Use grub_gop_get_preferred_mode. (grub_video_efi_gop_adapter): Set .get_edid. * include/grub/efi/edid.h: New file. * include/grub/efi/efi.h (grub_efi_get_variable): Update proto. Also-By: Vladimir Serbinenko <phcoder@gmail.com>
This commit is contained in:
parent
32107ec02a
commit
3935dde2f2
5 changed files with 200 additions and 5 deletions
|
@ -183,7 +183,8 @@ grub_efi_set_virtual_address_map (grub_efi_uintn_t memory_map_size,
|
|||
}
|
||||
|
||||
void *
|
||||
grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid)
|
||||
grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid,
|
||||
grub_size_t *datasize_out)
|
||||
{
|
||||
grub_efi_status_t status;
|
||||
grub_efi_uintn_t datasize = 0;
|
||||
|
@ -192,6 +193,8 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid)
|
|||
void *data;
|
||||
grub_size_t len, len16;
|
||||
|
||||
*datasize_out = 0;
|
||||
|
||||
len = grub_strlen (var);
|
||||
len16 = len * GRUB_MAX_UTF16_PER_UTF8;
|
||||
var16 = grub_malloc ((len16 + 1) * sizeof (var16[0]));
|
||||
|
@ -204,6 +207,9 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid)
|
|||
|
||||
status = efi_call_5 (r->get_variable, var16, guid, NULL, &datasize, NULL);
|
||||
|
||||
if (!datasize)
|
||||
return NULL;
|
||||
|
||||
data = grub_malloc (datasize);
|
||||
if (!data)
|
||||
{
|
||||
|
@ -215,7 +221,10 @@ grub_efi_get_variable (const char *var, const grub_efi_guid_t *guid)
|
|||
grub_free (var16);
|
||||
|
||||
if (status == GRUB_EFI_SUCCESS)
|
||||
return data;
|
||||
{
|
||||
*datasize_out = datasize;
|
||||
return data;
|
||||
}
|
||||
|
||||
grub_free (data);
|
||||
return NULL;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue