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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.