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;
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)
}
#endif
+ grub_memcpy (params->edid_info, &edid_info, sizeof (params->edid_info));
+
return GRUB_ERR_NONE;
}
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)
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,