Skip to content

Commit ae42b9c

Browse files
tdzardbiesheuvel
authored andcommitted
efi/libstub: gop: Initialize screen_info in helper function
Move initialization of screen_info into a single helper function. Frees up space in the main setup helper for adding EDID support. No functional changes. Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de> Reviewed-by: Javier Martinez Canillas <javierm@redhat.com> Signed-off-by: Ard Biesheuvel <ardb@kernel.org>
1 parent 9d80570 commit ae42b9c

1 file changed

Lines changed: 33 additions & 43 deletions

File tree

  • drivers/firmware/efi/libstub

drivers/firmware/efi/libstub/gop.c

Lines changed: 33 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -367,24 +367,31 @@ static void find_bits(u32 mask, u8 *pos, u8 *size)
367367
*size = __fls(mask) - *pos + 1;
368368
}
369369

370-
static void
371-
setup_pixel_info(struct screen_info *si, u32 pixels_per_scan_line,
372-
efi_pixel_bitmask_t pixel_info, int pixel_format)
370+
static void setup_screen_info(struct screen_info *si, const efi_graphics_output_protocol_t *gop)
373371
{
374-
if (pixel_format == PIXEL_BIT_MASK) {
375-
find_bits(pixel_info.red_mask,
376-
&si->red_pos, &si->red_size);
377-
find_bits(pixel_info.green_mask,
378-
&si->green_pos, &si->green_size);
379-
find_bits(pixel_info.blue_mask,
380-
&si->blue_pos, &si->blue_size);
381-
find_bits(pixel_info.reserved_mask,
382-
&si->rsvd_pos, &si->rsvd_size);
383-
si->lfb_depth = si->red_size + si->green_size +
384-
si->blue_size + si->rsvd_size;
385-
si->lfb_linelength = (pixels_per_scan_line * si->lfb_depth) / 8;
372+
const efi_graphics_output_protocol_mode_t *mode = efi_table_attr(gop, mode);
373+
const efi_graphics_output_mode_info_t *info = efi_table_attr(mode, info);
374+
375+
si->orig_video_isVGA = VIDEO_TYPE_EFI;
376+
377+
si->lfb_width = info->horizontal_resolution;
378+
si->lfb_height = info->vertical_resolution;
379+
380+
efi_set_u64_split(efi_table_attr(mode, frame_buffer_base),
381+
&si->lfb_base, &si->ext_lfb_base);
382+
if (si->ext_lfb_base)
383+
si->capabilities |= VIDEO_CAPABILITY_64BIT_BASE;
384+
si->pages = 1;
385+
386+
if (info->pixel_format == PIXEL_BIT_MASK) {
387+
find_bits(info->pixel_information.red_mask, &si->red_pos, &si->red_size);
388+
find_bits(info->pixel_information.green_mask, &si->green_pos, &si->green_size);
389+
find_bits(info->pixel_information.blue_mask, &si->blue_pos, &si->blue_size);
390+
find_bits(info->pixel_information.reserved_mask, &si->rsvd_pos, &si->rsvd_size);
391+
si->lfb_depth = si->red_size + si->green_size + si->blue_size + si->rsvd_size;
392+
si->lfb_linelength = (info->pixels_per_scan_line * si->lfb_depth) / 8;
386393
} else {
387-
if (pixel_format == PIXEL_RGB_RESERVED_8BIT_PER_COLOR) {
394+
if (info->pixel_format == PIXEL_RGB_RESERVED_8BIT_PER_COLOR) {
388395
si->red_pos = 0;
389396
si->blue_pos = 16;
390397
} else /* PIXEL_BGR_RESERVED_8BIT_PER_COLOR */ {
@@ -394,12 +401,16 @@ setup_pixel_info(struct screen_info *si, u32 pixels_per_scan_line,
394401

395402
si->green_pos = 8;
396403
si->rsvd_pos = 24;
397-
si->red_size = si->green_size =
398-
si->blue_size = si->rsvd_size = 8;
399-
404+
si->red_size = 8;
405+
si->green_size = 8;
406+
si->blue_size = 8;
407+
si->rsvd_size = 8;
400408
si->lfb_depth = 32;
401-
si->lfb_linelength = pixels_per_scan_line * 4;
409+
si->lfb_linelength = info->pixels_per_scan_line * 4;
402410
}
411+
412+
si->lfb_size = si->lfb_linelength * si->lfb_height;
413+
si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS;
403414
}
404415

405416
static efi_handle_t find_handle_with_primary_gop(unsigned long num, const efi_handle_t handles[],
@@ -462,8 +473,6 @@ efi_status_t efi_setup_gop(struct screen_info *si)
462473
{
463474
efi_handle_t *handles __free(efi_pool) = NULL;
464475
efi_handle_t handle;
465-
efi_graphics_output_protocol_mode_t *mode;
466-
efi_graphics_output_mode_info_t *info;
467476
efi_graphics_output_protocol_t *gop;
468477
efi_status_t status;
469478
unsigned long num;
@@ -482,27 +491,8 @@ efi_status_t efi_setup_gop(struct screen_info *si)
482491
set_mode(gop);
483492

484493
/* EFI framebuffer */
485-
mode = efi_table_attr(gop, mode);
486-
info = efi_table_attr(mode, info);
487-
488-
si->orig_video_isVGA = VIDEO_TYPE_EFI;
489-
490-
si->lfb_width = info->horizontal_resolution;
491-
si->lfb_height = info->vertical_resolution;
492-
493-
efi_set_u64_split(efi_table_attr(mode, frame_buffer_base),
494-
&si->lfb_base, &si->ext_lfb_base);
495-
if (si->ext_lfb_base)
496-
si->capabilities |= VIDEO_CAPABILITY_64BIT_BASE;
497-
498-
si->pages = 1;
499-
500-
setup_pixel_info(si, info->pixels_per_scan_line,
501-
info->pixel_information, info->pixel_format);
502-
503-
si->lfb_size = si->lfb_linelength * si->lfb_height;
504-
505-
si->capabilities |= VIDEO_CAPABILITY_SKIP_QUIRKS;
494+
if (si)
495+
setup_screen_info(si, gop);
506496

507497
return EFI_SUCCESS;
508498
}

0 commit comments

Comments
 (0)