File grub2-provide-edid.patch of Package grub2

Index: grub-2.12/grub-core/video/video.c
===================================================================
--- grub-2.12.orig/grub-core/video/video.c
+++ grub-2.12/grub-core/video/video.c
@@ -89,6 +89,27 @@ grub_video_get_info_and_fini (struct gru
   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)
+    return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated");
+
+  grub_memset (edid_info, 0, sizeof (*edid_info));
+
+  if (grub_video_adapter_active->get_edid)
+    {
+      err = grub_video_adapter_active->get_edid (edid_info);
+      if (err)
+        return err;
+    }
+
+  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)
Index: grub-2.12/include/grub/video.h
===================================================================
--- grub-2.12.orig/include/grub/video.h
+++ grub-2.12/include/grub/video.h
@@ -445,6 +445,8 @@ grub_err_t EXPORT_FUNC (grub_video_get_i
 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,
Index: grub-2.12/grub-core/loader/i386/linux.c
===================================================================
--- grub-2.12.orig/grub-core/loader/i386/linux.c
+++ grub-2.12/grub-core/loader/i386/linux.c
@@ -234,6 +234,7 @@ grub_e820_add_region (struct grub_e820_m
 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,17 @@ grub_linux_setup_video (struct linux_ker
   if (driver_id == GRUB_VIDEO_DRIVER_NONE)
     return 1;
 
+  grub_video_get_edid (&edid_info); /* ignore errors */
+
+  /*
+   * 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 +350,17 @@ grub_linux_setup_video (struct linux_ker
     }
 #endif
 
+    if (grub_le_to_cpu16 (params->version) >= 0x0208)
+      {
+        grub_memcpy (params->v0208.edid_info, &edid_info,
+		     sizeof (params->v0208.edid_info));
+      }
+    else if (grub_le_to_cpu16 (params->version) >= 0x0206)
+      {
+        grub_memcpy (params->v0206.edid_info, &edid_info,
+		     sizeof (params->v0206.edid_info));
+      }
+
   return GRUB_ERR_NONE;
 }
 
Index: grub-2.12/include/grub/i386/linux.h
===================================================================
--- grub-2.12.orig/include/grub/i386/linux.h
+++ grub-2.12/include/grub/i386/linux.h
@@ -250,14 +250,15 @@ struct linux_kernel_params
   grub_uint32_t ext_ramdisk_size;	/* 0xc4 */
   grub_uint32_t ext_cmd_line_ptr;	/* 0xc8 */
 
-  grub_uint8_t padding7[0x1b8 - 0xcc];
+  grub_uint8_t padding7[0x140 - 0xcc];
 
   union
     {
       struct
         {
+          grub_uint8_t padding7_1[0x1b8 - 0x140];
           grub_uint32_t efi_system_table;	/* 1b8 */
-          grub_uint32_t padding7_1;		/* 1bc */
+          grub_uint32_t padding7_2;		/* 1bc */
           grub_uint32_t efi_signature;		/* 1c0 */
           grub_uint32_t efi_mem_desc_size;	/* 1c4 */
           grub_uint32_t efi_mem_desc_version;	/* 1c8 */
@@ -266,8 +267,7 @@ struct linux_kernel_params
         } v0204;
       struct
         {
-          grub_uint32_t padding7_1;		/* 1b8 */
-          grub_uint32_t padding7_2;		/* 1bc */
+          grub_uint8_t edid_info[128];  	/* 140 */
           grub_uint32_t efi_signature;		/* 1c0 */
           grub_uint32_t efi_system_table;	/* 1c4 */
           grub_uint32_t efi_mem_desc_size;	/* 1c8 */
@@ -277,8 +277,7 @@ struct linux_kernel_params
 	} v0206;
       struct
         {
-          grub_uint32_t padding7_1;		/* 1b8 */
-          grub_uint32_t padding7_2;		/* 1bc */
+          grub_uint8_t edid_info[128];  	/* 140 */
           grub_uint32_t efi_signature;		/* 1c0 */
           grub_uint32_t efi_system_table;	/* 1c4 */
           grub_uint32_t efi_mem_desc_size;	/* 1c8 */
openSUSE Build Service is sponsored by