From: Jani Nikula <jani.nikula@linux.intel.com>
To: Thomas Zimmermann <tzimmermann@suse.de>,
javierm@redhat.com, simona@ffwll.ch, airlied@gmail.com,
maarten.lankhorst@linux.intel.com, mripard@kernel.org
Cc: dri-devel@lists.freedesktop.org, Thomas Zimmermann <tzimmermann@suse.de>
Subject: Re: [PATCH 12/18] drm/sysfb: ofdrm: Add EDID support
Date: Thu, 20 Mar 2025 14:50:46 +0200 [thread overview]
Message-ID: <87a59fdfx5.fsf@intel.com> (raw)
In-Reply-To: <20250319083021.6472-13-tzimmermann@suse.de>
On Wed, 19 Mar 2025, Thomas Zimmermann <tzimmermann@suse.de> wrote:
> Add EDID support to sysfb connector helpers. Read the EDID property
> from the OF node in ofdrm. Without EDID, this does nothing.
>
> Some systems with OF display, such as 32-bit PPC Macintoshs, provide
> the system display's EDID data as node property in their DT. Exporting
> this information allows compositors to implement correct DPI and
> meaningful color management.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/sysfb/drm_sysfb_helper.c | 29 ++++++++++++++++++++++++
> drivers/gpu/drm/sysfb/drm_sysfb_helper.h | 2 ++
> drivers/gpu/drm/sysfb/ofdrm.c | 20 ++++++++++++++++
> 3 files changed, 51 insertions(+)
>
> diff --git a/drivers/gpu/drm/sysfb/drm_sysfb_helper.c b/drivers/gpu/drm/sysfb/drm_sysfb_helper.c
> index b48e06b25305..cb65c618f8d3 100644
> --- a/drivers/gpu/drm/sysfb/drm_sysfb_helper.c
> +++ b/drivers/gpu/drm/sysfb/drm_sysfb_helper.c
> @@ -9,6 +9,7 @@
> #include <drm/drm_atomic_state_helper.h>
> #include <drm/drm_damage_helper.h>
> #include <drm/drm_drv.h>
> +#include <drm/drm_edid.h>
> #include <drm/drm_fourcc.h>
> #include <drm/drm_framebuffer.h>
> #include <drm/drm_gem_atomic_helper.h>
> @@ -281,10 +282,38 @@ EXPORT_SYMBOL(drm_sysfb_crtc_atomic_destroy_state);
> * Connector
> */
>
> +static int drm_sysfb_get_edid_block(void *data, u8 *buf, unsigned int block, size_t len)
> +{
> + const u8 *edid = data;
> + size_t off = block * EDID_LENGTH;
> + size_t end = off + len;
> +
> + if (!edid)
> + return -1;
> + if (end > EDID_LENGTH)
> + return -1;
Nitpick, I guess -1 is used elsewhere, but I think I'd prefer actual
error codes even if they're not currently propagated. It's just cleaner.
> + memcpy(buf, &edid[off], len);
> +
> + return 0;
> +}
> +
> int drm_sysfb_connector_helper_get_modes(struct drm_connector *connector)
> {
> struct drm_sysfb_device *sysfb = to_drm_sysfb_device(connector->dev);
> + const struct drm_edid *drm_edid;
> +
> + if (sysfb->edid) {
> + drm_edid = drm_edid_read_custom(connector, drm_sysfb_get_edid_block,
> + (void *)sysfb->edid);
Nitpick, the (void *) cast is superfluous.
> + if (drm_edid) {
> + drm_edid_connector_update(connector, drm_edid);
> + drm_edid_free(drm_edid);
> + } else {
> + drm_edid_connector_update(connector, NULL);
> + }
Nitpick, the above could just be
drm_edid_connector_update(connector, drm_edid);
drm_edid_free(drm_edid);
without the if.
Despite the nitpicks, overall LGTM.
BR,
Jani.
> + }
>
> + /* Return the fixed mode even with EDID */
> return drm_connector_helper_get_modes_fixed(connector, &sysfb->fb_mode);
> }
> EXPORT_SYMBOL(drm_sysfb_connector_helper_get_modes);
> diff --git a/drivers/gpu/drm/sysfb/drm_sysfb_helper.h b/drivers/gpu/drm/sysfb/drm_sysfb_helper.h
> index 45e396bf74b7..3684bd0ef085 100644
> --- a/drivers/gpu/drm/sysfb/drm_sysfb_helper.h
> +++ b/drivers/gpu/drm/sysfb/drm_sysfb_helper.h
> @@ -24,6 +24,8 @@ struct drm_display_mode drm_sysfb_mode(unsigned int width,
> struct drm_sysfb_device {
> struct drm_device dev;
>
> + const u8 *edid; /* can be NULL */
> +
> /* hardware settings */
> struct drm_display_mode fb_mode;
> const struct drm_format_info *fb_format;
> diff --git a/drivers/gpu/drm/sysfb/ofdrm.c b/drivers/gpu/drm/sysfb/ofdrm.c
> index 71e661ba9329..86c1a0c80ceb 100644
> --- a/drivers/gpu/drm/sysfb/ofdrm.c
> +++ b/drivers/gpu/drm/sysfb/ofdrm.c
> @@ -12,6 +12,7 @@
> #include <drm/drm_damage_helper.h>
> #include <drm/drm_device.h>
> #include <drm/drm_drv.h>
> +#include <drm/drm_edid.h>
> #include <drm/drm_fbdev_shmem.h>
> #include <drm/drm_format_helper.h>
> #include <drm/drm_framebuffer.h>
> @@ -227,6 +228,16 @@ static u64 display_get_address_of(struct drm_device *dev, struct device_node *of
> return address;
> }
>
> +static const u8 *display_get_edid_of(struct drm_device *dev, struct device_node *of_node,
> + u8 buf[EDID_LENGTH])
> +{
> + int ret = of_property_read_u8_array(of_node, "EDID", buf, EDID_LENGTH);
> +
> + if (ret)
> + return NULL;
> + return buf;
> +}
> +
> static bool is_avivo(u32 vendor, u32 device)
> {
> /* This will match most R5xx */
> @@ -298,6 +309,8 @@ struct ofdrm_device {
> /* colormap */
> void __iomem *cmap_base;
>
> + u8 edid[EDID_LENGTH];
> +
> /* modesetting */
> u32 formats[DRM_SYSFB_PLANE_NFORMATS(1)];
> struct drm_plane primary_plane;
> @@ -840,6 +853,7 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
> int width, height, depth, linebytes;
> const struct drm_format_info *format;
> u64 address;
> + const u8 *edid;
> resource_size_t fb_size, fb_base, fb_pgbase, fb_pgsize;
> struct resource *res, *mem;
> void __iomem *screen_base;
> @@ -989,6 +1003,9 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
> }
> }
>
> + /* EDID is optional */
> + edid = display_get_edid_of(dev, of_node, odev->edid);
> +
> /*
> * Firmware framebuffer
> */
> @@ -999,6 +1016,7 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
> sysfb->fb_pitch = linebytes;
> if (odev->cmap_base)
> sysfb->fb_gamma_lut_size = OFDRM_GAMMA_LUT_SIZE;
> + sysfb->edid = edid;
>
> drm_dbg(dev, "display mode={" DRM_MODE_FMT "}\n", DRM_MODE_ARG(&sysfb->fb_mode));
> drm_dbg(dev, "framebuffer format=%p4cc, size=%dx%d, linebytes=%d byte\n",
> @@ -1072,6 +1090,8 @@ static struct ofdrm_device *ofdrm_device_create(struct drm_driver *drv,
> drm_connector_set_panel_orientation_with_quirk(connector,
> DRM_MODE_PANEL_ORIENTATION_UNKNOWN,
> width, height);
> + if (edid)
> + drm_connector_attach_edid_property(connector);
>
> ret = drm_connector_attach_encoder(connector, encoder);
> if (ret)
--
Jani Nikula, Intel
next prev parent reply other threads:[~2025-03-20 12:50 UTC|newest]
Thread overview: 47+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-19 7:44 [PATCH 00/18] drm: Provide helpers for system framebuffers and add efidrm/vesadrm Thomas Zimmermann
2025-03-19 7:45 ` [PATCH 01/18] drm/ofdrm: Remove struct ofdrm_device.pdev Thomas Zimmermann
2025-03-23 10:10 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 02/18] drm/ofdrm: Open-code drm_simple_encoder_init() Thomas Zimmermann
2025-03-23 10:12 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 03/18] drm/simpledrm: Remove struct simpledrm_device.nformats Thomas Zimmermann
2025-03-23 10:17 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 04/18] drm: Move sysfb drivers into separate subdirectory Thomas Zimmermann
2025-03-23 10:21 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 05/18] drm/sysfb: Add struct drm_sysfb_device Thomas Zimmermann
2025-03-23 10:39 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 06/18] drm/sysfb: Provide single mode-init helper Thomas Zimmermann
2025-03-23 10:41 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 07/18] drm/sysfb: Merge mode-config functions Thomas Zimmermann
2025-03-23 10:47 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 08/18] drm/sysfb: Merge connector functions Thomas Zimmermann
2025-03-23 10:57 ` Javier Martinez Canillas
2025-03-24 7:37 ` Thomas Zimmermann
2025-03-24 8:53 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 09/18] drm/sysfb: Maintain CRTC state in struct drm_sysfb_crtc_state Thomas Zimmermann
2025-03-31 8:08 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 10/18] drm/sysfb: Merge CRTC functions Thomas Zimmermann
2025-03-31 9:00 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 11/18] drm/sysfb: Merge primary-plane functions Thomas Zimmermann
2025-03-31 9:12 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 12/18] drm/sysfb: ofdrm: Add EDID support Thomas Zimmermann
2025-03-20 12:50 ` Jani Nikula [this message]
2025-03-20 13:08 ` Thomas Zimmermann
2025-03-31 9:26 ` Maxime Ripard
2025-03-31 9:32 ` Thomas Zimmermann
2025-03-31 9:15 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 13/18] firmware: sysfb: Move bpp-depth calculation into screen_info helper Thomas Zimmermann
2025-03-31 9:24 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 14/18] drm/sysfb: Add efidrm for EFI displays Thomas Zimmermann
2025-03-31 9:35 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 15/18] drm/sysfb: efidrm: Add EDID support Thomas Zimmermann
2025-03-31 9:37 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 16/18] drm/sysfb: Add vesadrm for VESA displays Thomas Zimmermann
2025-03-31 9:42 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 17/18] drm/sysfb: vesadrm: Add EDID support Thomas Zimmermann
2025-03-31 9:44 ` Javier Martinez Canillas
2025-03-19 7:45 ` [PATCH 18/18] drm/sysfb: vesadrm: Add gamma correction Thomas Zimmermann
2025-03-31 9:47 ` Javier Martinez Canillas
2025-03-19 12:50 ` [PATCH 00/18] drm: Provide helpers for system framebuffers and add efidrm/vesadrm nerdopolis
2025-03-19 12:59 ` Thomas Zimmermann
2025-03-31 13:39 ` Thomas Zimmermann
2025-04-02 2:44 ` nerdopolis
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=87a59fdfx5.fsf@intel.com \
--to=jani.nikula@linux.intel.com \
--cc=airlied@gmail.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=javierm@redhat.com \
--cc=maarten.lankhorst@linux.intel.com \
--cc=mripard@kernel.org \
--cc=simona@ffwll.ch \
--cc=tzimmermann@suse.de \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).