On Tue, Sep 16, 2025 at 01:48:45PM +0200, Thomas Zimmermann wrote:
> The Linux kernel's struct bootparams provides a field at offset 0x140
> for storing an EDID header. Copy the video adapter's data to the field.
>
> The edid_info field was added in 2003 (see "[FBDEV] EDID support from
> OpenFirmware on PPC platoforms and from the BIOS on intel platforms."),
> but only got useable in 2004 (see "[PATCH] Fix EDID_INFO in zero-page").
> The boot protocol was at version 2.03 at that time.
>
> The field was never used much, but with the recent addition of the efidrm
> and vesadrm drivers to the kernel, it becomes much more useful. As with
> the initial screen setup, these drivers can make use of the provided
> EDID information for basic display output.
>
> Signed-off-by: Thomas Zimmermann <[email protected]>

Reviewed-by: Daniel Kiper <[email protected]>

But a few nits below...

> ---
>  grub-core/loader/i386/linux.c | 16 ++++++++++++++++
>  grub-core/video/video.c       | 21 +++++++++++++++++++++
>  include/grub/video.h          |  2 ++
>  3 files changed, 39 insertions(+)
>
> diff --git a/grub-core/loader/i386/linux.c b/grub-core/loader/i386/linux.c
> index 12731feb2..afc8699bf 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)

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..b92b7036d 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)

if (grub_video_adapter_active == NULL)

> +    return grub_error (GRUB_ERR_BAD_DEVICE, "no video mode activated");
> +
> +  if (grub_video_adapter_active->get_edid)

if (grub_video_adapter_active->get_edid != NULL)

> +    {
> +      err = grub_video_adapter_active->get_edid (edid_info);
> +      if (err)

if (err != GRUB_ERR_NONE)

> +     return err;
> +    }
> +  else
> +    grub_memset (edid_info, 0, sizeof (*edid_info));
> +
> +  return GRUB_ERR_NONE;
> +}

Please fix the issues, add all RBs which you got and repost the patch...

Daniel

_______________________________________________
Grub-devel mailing list
[email protected]
https://lists.gnu.org/mailman/listinfo/grub-devel

Reply via email to