136 lines
4.6 KiB
Diff
136 lines
4.6 KiB
Diff
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 */
|