diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c index 12731feb2..d6e291b2c 100644 --- a/grub-core/loader/i386/linux.c +++ b/grub-core/loader/i386/linux.c @@ -234,6 +234,7 @@ grub_e820_add_region (struct grub_boot_e820_entry *e820_entry, int *e820_num, static grub_err_t grub_linux_setup_video (struct linux_kernel_params *params) { + struct grub_video_edid_info edid_info; struct grub_video_mode_info mode_info; void *framebuffer; grub_err_t err; @@ -245,6 +246,19 @@ grub_linux_setup_video (struct linux_kernel_params *params) if (driver_id == GRUB_VIDEO_DRIVER_NONE) return 1; + err = grub_video_get_edid (&edid_info); + if (err != GRUB_ERR_NONE) + grub_memset (&edid_info, 0, sizeof (edid_info)); + + /* + * We cannot transfer any extensions. Therefore clear + * the extension flag from the checksum and set the + * field to zero. Adding the extension flag to the + * checksum does the trick. + */ + edid_info.checksum += edid_info.extension_flag; + edid_info.extension_flag = 0; + err = grub_video_get_info_and_fini (&mode_info, &framebuffer); if (err) @@ -338,6 +352,8 @@ grub_linux_setup_video (struct linux_kernel_params *params) } #endif + grub_memcpy (params->edid_info, &edid_info, sizeof (params->edid_info)); + return GRUB_ERR_NONE; } diff --git a/grub-core/video/video.c b/grub-core/video/video.c index 8937da745..d5bd1d079 100644 --- a/grub-core/video/video.c +++ b/grub-core/video/video.c @@ -89,6 +89,27 @@ grub_video_get_info_and_fini (struct grub_video_mode_info *mode_info, return GRUB_ERR_NONE; } +/* Get information about connected display. */ +grub_err_t +grub_video_get_edid (struct grub_video_edid_info *edid_info) +{ + grub_err_t err; + + if (grub_video_adapter_active == NULL) + return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated"); + + if (grub_video_adapter_active->get_edid != NULL) + { + err = grub_video_adapter_active->get_edid (edid_info); + if (err != GRUB_ERR_NONE) + return err; + } + else + grub_memset (edid_info, 0, sizeof (*edid_info)); + + return GRUB_ERR_NONE; +} + /* Determine optimized blitting formation for specified video mode info. */ enum grub_video_blit_format grub_video_get_blit_format (struct grub_video_mode_info *mode_info) diff --git a/include/grub/video.h b/include/grub/video.h index 9dac0f379..761ee994a 100644 --- a/include/grub/video.h +++ b/include/grub/video.h @@ -445,6 +445,8 @@ grub_err_t EXPORT_FUNC (grub_video_get_info) (struct grub_video_mode_info *mode_ grub_err_t EXPORT_FUNC (grub_video_get_info_and_fini) (struct grub_video_mode_info *mode_info, void **framebuffer); +grub_err_t EXPORT_FUNC (grub_video_get_edid) (struct grub_video_edid_info *edid_info); + enum grub_video_blit_format EXPORT_FUNC(grub_video_get_blit_format) (struct grub_video_mode_info *mode_info); grub_err_t grub_video_set_palette (unsigned int start, unsigned int count,