@@ -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
405416static 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