From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: airlied@linux.ie, linux-fbdev@vger.kernel.org,
dri-devel@lists.freedesktop.org, b.zolnierkie@samsung.com
Subject: Re: [PATCH 11/11] drm/fbdevdrm: Detect and validate display modes
Date: Tue, 26 Mar 2019 16:47:41 +0000 [thread overview]
Message-ID: <20190326164741.GA3888@intel.com> (raw)
In-Reply-To: <20190326091744.11542-12-tzimmermann@suse.de>
On Tue, Mar 26, 2019 at 10:17:44AM +0100, Thomas Zimmermann wrote:
> Mode detection currently reports the modes listed in fb_info::modelist.
> The list is either build from EDID information or, more often, a list of
> previously set modes. A later update to the mode detection could also
> take into account the modes in fb_monspecs::modedb or test pre-defined
> VESA modes.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c | 163 +++++++++++++++++++-
> 1 file changed, 162 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c
> index 87f56ec76edf..e89eca4b58df 100644
> --- a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c
> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c
> @@ -21,9 +21,16 @@
> #include <drm/drm_print.h>
> #include <drm/drm_probe_helper.h>
> #include <linux/fb.h>
> +#include "fbdevdrm_device.h"
> #include "fbdevdrm_modes.h"
> #include "fbdevdrm_primary.h"
>
> +static struct fbdevdrm_modeset* fbdevdrm_modeset_of_connector(
> + struct drm_connector *connector)
> +{
> + return container_of(connector, struct fbdevdrm_modeset, connector);
> +}
> +
> static struct fbdevdrm_modeset* fbdevdrm_modeset_of_crtc(
> struct drm_crtc *crtc)
> {
> @@ -353,11 +360,130 @@ static const struct drm_encoder_funcs fbdevdrm_encoder_funcs = {
> * Connector
> */
>
> -static int connector_helper_get_modes(struct drm_connector *connector)
> +static int update_display_info(struct drm_display_info *info, struct fb_info *fb_info)
> +{
> + int num_pixel;
> +
> + if (fb_info->fix.type != FB_TYPE_PACKED_PIXELS)
> + return -EINVAL; /* rule out text mode, etc. */
> +
> + if (fb_info->fix.id[0]) {
> + strncpy(info->name, fb_info->fix.id, sizeof(info->name) - 1);
> + info->name[sizeof(info->name) - 1] = '\0';
> + } else {
> + memset(info->name, '\0', sizeof(info->name));
> + }
> +
> + info->width_mm = fb_info->var.width;
> + info->height_mm = fb_info->var.height;
> + info->pixel_clock = PICOS2KHZ(fb_info->var.pixclock);
> +
> + num_pixel = 0;
> + if (fb_info->var.red.length)
> + ++num_pixel;
> + if (fb_info->var.green.length)
> + ++num_pixel;
> + if (fb_info->var.blue.length)
> + ++num_pixel;
> + if (fb_info->var.transp.length)
> + ++num_pixel;
> +
> + if (num_pixel)
> + info->bpc = fb_info->var.bits_per_pixel;
> + else
> + info->bpc = 0;
> +
> + info->subpixel_order = SubPixelUnknown;
> + info->color_formats = DRM_COLOR_FORMAT_RGB444;
> + info->bus_formats = &info->color_formats;
> + info->num_bus_formats = 1;
> + info->bus_flags = 0;
> + info->max_tmds_clock = 0;
> + info->dvi_dual = false;
> + info->has_hdmi_infoframe = false;
> + info->edid_hdmi_dc_modes = 0;
> + info->cea_rev = 0;
> + memset(&info->hdmi, 0, sizeof(info->hdmi));
> + info->non_desktop = 0;
I think the only things here you may want to set are
width_mm and height_mm. The rest should not matter.
> +
> + return 0;
> +}
> +
> +static int drm_mode_probed_add_from_fb_videomode(
> + struct drm_connector *connector, const struct fb_videomode *fb_mode,
> + struct fb_info *fb_info)
> {
> + struct drm_display_mode *mode;
> +
> + mode = drm_mode_create_from_fb_videomode(connector->dev, fb_mode);
> + if (!mode)
> + return -ENOMEM;
> +
> + mode->width_mm = fb_info->var.width;
> + mode->height_mm = fb_info->var.height;
> +
> + drm_mode_probed_add(connector, mode);
> +
> + /* update connector properties from display mode */
> + if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> + connector->interlace_allowed = true;
> + if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
> + connector->doublescan_allowed = true;
> + if (mode->flags & DRM_MODE_FLAG_3D_MASK)
> + connector->stereo_allowed = true;
> +
> return 0;
> }
>
> +static int connector_helper_get_modes(struct drm_connector *connector)
> +{
> + struct fbdevdrm_modeset *modeset;
> + struct list_head *pos;
> + int ret, num_modes = 0;
> +
> + modeset = fbdevdrm_modeset_of_connector(connector);
> +
> + ret = update_display_info(&connector->display_info, modeset->fb_info);
> + if (ret)
> + return 0;
> +
> + /* update connector properties from video modes */
> + connector->interlace_allowed = 0;
> + connector->doublescan_allowed = 0;
> + connector->stereo_allowed = 0;
> +
> + if (!num_modes && modeset->fb_info->mode) {
> + ret = drm_mode_probed_add_from_fb_videomode(
> + connector, modeset->fb_info->mode, modeset->fb_info);
> + if (!ret)
> + ++num_modes;
> + }
> +
> + if (!num_modes) {
> +
> + /* DRM backporting notes: we go through all modes in the
> + * fb_info's mode list and convert each to a DRM modes. If
> + * you convert an fbdev driver to DRM, replace this code
> + * with an actual hardware query. This will usually involve
> + * reading the monitor EDID via DDC.
> + */
> +
> + list_for_each(pos, &modeset->fb_info->modelist) {
fbdev has a modelist? I guess it does. But not exposed to
userspace, which is probably the reason I never realized this.
--
Ville Syrjälä
Intel
WARNING: multiple messages have this Message-ID (diff)
From: "Ville Syrjälä" <ville.syrjala@linux.intel.com>
To: Thomas Zimmermann <tzimmermann@suse.de>
Cc: airlied@linux.ie, linux-fbdev@vger.kernel.org,
dri-devel@lists.freedesktop.org, b.zolnierkie@samsung.com
Subject: Re: [PATCH 11/11] drm/fbdevdrm: Detect and validate display modes
Date: Tue, 26 Mar 2019 18:47:41 +0200 [thread overview]
Message-ID: <20190326164741.GA3888@intel.com> (raw)
In-Reply-To: <20190326091744.11542-12-tzimmermann@suse.de>
On Tue, Mar 26, 2019 at 10:17:44AM +0100, Thomas Zimmermann wrote:
> Mode detection currently reports the modes listed in fb_info::modelist.
> The list is either build from EDID information or, more often, a list of
> previously set modes. A later update to the mode detection could also
> take into account the modes in fb_monspecs::modedb or test pre-defined
> VESA modes.
>
> Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
> ---
> drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c | 163 +++++++++++++++++++-
> 1 file changed, 162 insertions(+), 1 deletion(-)
>
> diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c
> index 87f56ec76edf..e89eca4b58df 100644
> --- a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c
> +++ b/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c
> @@ -21,9 +21,16 @@
> #include <drm/drm_print.h>
> #include <drm/drm_probe_helper.h>
> #include <linux/fb.h>
> +#include "fbdevdrm_device.h"
> #include "fbdevdrm_modes.h"
> #include "fbdevdrm_primary.h"
>
> +static struct fbdevdrm_modeset* fbdevdrm_modeset_of_connector(
> + struct drm_connector *connector)
> +{
> + return container_of(connector, struct fbdevdrm_modeset, connector);
> +}
> +
> static struct fbdevdrm_modeset* fbdevdrm_modeset_of_crtc(
> struct drm_crtc *crtc)
> {
> @@ -353,11 +360,130 @@ static const struct drm_encoder_funcs fbdevdrm_encoder_funcs = {
> * Connector
> */
>
> -static int connector_helper_get_modes(struct drm_connector *connector)
> +static int update_display_info(struct drm_display_info *info, struct fb_info *fb_info)
> +{
> + int num_pixel;
> +
> + if (fb_info->fix.type != FB_TYPE_PACKED_PIXELS)
> + return -EINVAL; /* rule out text mode, etc. */
> +
> + if (fb_info->fix.id[0]) {
> + strncpy(info->name, fb_info->fix.id, sizeof(info->name) - 1);
> + info->name[sizeof(info->name) - 1] = '\0';
> + } else {
> + memset(info->name, '\0', sizeof(info->name));
> + }
> +
> + info->width_mm = fb_info->var.width;
> + info->height_mm = fb_info->var.height;
> + info->pixel_clock = PICOS2KHZ(fb_info->var.pixclock);
> +
> + num_pixel = 0;
> + if (fb_info->var.red.length)
> + ++num_pixel;
> + if (fb_info->var.green.length)
> + ++num_pixel;
> + if (fb_info->var.blue.length)
> + ++num_pixel;
> + if (fb_info->var.transp.length)
> + ++num_pixel;
> +
> + if (num_pixel)
> + info->bpc = fb_info->var.bits_per_pixel;
> + else
> + info->bpc = 0;
> +
> + info->subpixel_order = SubPixelUnknown;
> + info->color_formats = DRM_COLOR_FORMAT_RGB444;
> + info->bus_formats = &info->color_formats;
> + info->num_bus_formats = 1;
> + info->bus_flags = 0;
> + info->max_tmds_clock = 0;
> + info->dvi_dual = false;
> + info->has_hdmi_infoframe = false;
> + info->edid_hdmi_dc_modes = 0;
> + info->cea_rev = 0;
> + memset(&info->hdmi, 0, sizeof(info->hdmi));
> + info->non_desktop = 0;
I think the only things here you may want to set are
width_mm and height_mm. The rest should not matter.
> +
> + return 0;
> +}
> +
> +static int drm_mode_probed_add_from_fb_videomode(
> + struct drm_connector *connector, const struct fb_videomode *fb_mode,
> + struct fb_info *fb_info)
> {
> + struct drm_display_mode *mode;
> +
> + mode = drm_mode_create_from_fb_videomode(connector->dev, fb_mode);
> + if (!mode)
> + return -ENOMEM;
> +
> + mode->width_mm = fb_info->var.width;
> + mode->height_mm = fb_info->var.height;
> +
> + drm_mode_probed_add(connector, mode);
> +
> + /* update connector properties from display mode */
> + if (mode->flags & DRM_MODE_FLAG_INTERLACE)
> + connector->interlace_allowed = true;
> + if (mode->flags & DRM_MODE_FLAG_DBLSCAN)
> + connector->doublescan_allowed = true;
> + if (mode->flags & DRM_MODE_FLAG_3D_MASK)
> + connector->stereo_allowed = true;
> +
> return 0;
> }
>
> +static int connector_helper_get_modes(struct drm_connector *connector)
> +{
> + struct fbdevdrm_modeset *modeset;
> + struct list_head *pos;
> + int ret, num_modes = 0;
> +
> + modeset = fbdevdrm_modeset_of_connector(connector);
> +
> + ret = update_display_info(&connector->display_info, modeset->fb_info);
> + if (ret)
> + return 0;
> +
> + /* update connector properties from video modes */
> + connector->interlace_allowed = 0;
> + connector->doublescan_allowed = 0;
> + connector->stereo_allowed = 0;
> +
> + if (!num_modes && modeset->fb_info->mode) {
> + ret = drm_mode_probed_add_from_fb_videomode(
> + connector, modeset->fb_info->mode, modeset->fb_info);
> + if (!ret)
> + ++num_modes;
> + }
> +
> + if (!num_modes) {
> +
> + /* DRM backporting notes: we go through all modes in the
> + * fb_info's mode list and convert each to a DRM modes. If
> + * you convert an fbdev driver to DRM, replace this code
> + * with an actual hardware query. This will usually involve
> + * reading the monitor EDID via DDC.
> + */
> +
> + list_for_each(pos, &modeset->fb_info->modelist) {
fbdev has a modelist? I guess it does. But not exposed to
userspace, which is probably the reason I never realized this.
--
Ville Syrjälä
Intel
_______________________________________________
dri-devel mailing list
dri-devel@lists.freedesktop.org
https://lists.freedesktop.org/mailman/listinfo/dri-devel
next prev parent reply other threads:[~2019-03-26 16:47 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-03-26 9:17 [RFC][PATCH 00/11] DRM driver for fbdev devices Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 01/11] drm/fbdevdrm: Add driver skeleton Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 02/11] drm/fbdevdrm: Add fbdevdrm device Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 16:03 ` Adam Jackson
2019-03-26 16:03 ` Adam Jackson
2019-03-27 7:55 ` Thomas Zimmermann
2019-03-27 7:55 ` Thomas Zimmermann
2019-03-27 8:03 ` Daniel Vetter
2019-03-27 8:03 ` Daniel Vetter
2019-03-26 9:17 ` [PATCH 03/11] drm/fbdevdrm: Add memory management Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 04/11] drm/fbdevdrm: Add file operations Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 05/11] drm/fbdevdrm: Add GEM and dumb interfaces Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 06/11] drm/fbdevdrm: Add modesetting infrastructure Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 07/11] drm/fbdevdrm: Add DRM <-> fbdev pixel-format conversion Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 16:29 ` Ville Syrjälä
2019-03-26 16:29 ` Ville Syrjälä
2019-03-27 8:28 ` Thomas Zimmermann
2019-03-27 8:28 ` Thomas Zimmermann
2019-03-27 10:00 ` Ville Syrjälä
2019-03-27 10:00 ` Ville Syrjälä
2019-03-26 9:17 ` [PATCH 08/11] drm/fbdevdrm: Add mode conversion DRM <-> fbdev Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 09/11] drm/fbdevdrm: Add primary plane Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 13:33 ` Mathieu Malaterre
2019-03-26 13:33 ` Mathieu Malaterre
2019-03-26 13:57 ` Thomas Zimmermann
2019-03-26 13:57 ` Thomas Zimmermann
2019-03-27 9:37 ` Thomas Zimmermann
2019-03-27 9:37 ` Thomas Zimmermann
2019-04-02 7:08 ` Mathieu Malaterre
2019-04-02 7:08 ` Mathieu Malaterre
2019-03-26 9:17 ` [PATCH 10/11] drm/fbdevdrm: Add CRTC Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 9:17 ` [PATCH 11/11] drm/fbdevdrm: Detect and validate display modes Thomas Zimmermann
2019-03-26 9:17 ` Thomas Zimmermann
2019-03-26 16:47 ` Ville Syrjälä [this message]
2019-03-26 16:47 ` Ville Syrjälä
2019-03-26 18:20 ` Daniel Vetter
2019-03-26 18:20 ` Daniel Vetter
2019-03-27 8:31 ` Thomas Zimmermann
2019-03-27 8:31 ` Thomas Zimmermann
2019-03-26 14:53 ` [RFC][PATCH 00/11] DRM driver for fbdev devices Daniel Vetter
2019-03-26 14:53 ` Daniel Vetter
2019-03-27 9:10 ` Thomas Zimmermann
2019-03-27 9:10 ` Thomas Zimmermann
2019-03-27 9:41 ` Daniel Vetter
2019-03-27 9:41 ` Daniel Vetter
2019-03-27 9:55 ` Michel Dänzer
2019-03-27 9:55 ` Michel Dänzer
2019-03-27 10:58 ` Daniel Vetter
2019-03-27 10:58 ` Daniel Vetter
2019-03-27 14:46 ` Thomas Zimmermann
2019-03-27 14:46 ` Thomas Zimmermann
2019-03-27 17:05 ` Daniel Vetter
2019-03-27 17:05 ` Daniel Vetter
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=20190326164741.GA3888@intel.com \
--to=ville.syrjala@linux.intel.com \
--cc=airlied@linux.ie \
--cc=b.zolnierkie@samsung.com \
--cc=dri-devel@lists.freedesktop.org \
--cc=linux-fbdev@vger.kernel.org \
--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.