From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Date: Tue, 26 Mar 2019 16:47:41 +0000 Subject: Re: [PATCH 11/11] drm/fbdevdrm: Detect and validate display modes Message-Id: <20190326164741.GA3888@intel.com> List-Id: References: <20190326091744.11542-1-tzimmermann@suse.de> <20190326091744.11542-12-tzimmermann@suse.de> In-Reply-To: <20190326091744.11542-12-tzimmermann@suse.de> MIME-Version: 1.0 Content-Type: text/plain; charset="iso-8859-1" Content-Transfer-Encoding: quoted-printable To: Thomas Zimmermann Cc: airlied@linux.ie, linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org, b.zolnierkie@samsung.com 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. >=20 > Signed-off-by: Thomas Zimmermann > --- > drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c | 163 +++++++++++++++++++- > 1 file changed, 162 insertions(+), 1 deletion(-) >=20 > diff --git a/drivers/gpu/drm/fbdevdrm/fbdevdrm_modeset.c b/drivers/gpu/dr= m/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 > #include > #include > +#include "fbdevdrm_device.h" > #include "fbdevdrm_modes.h" > #include "fbdevdrm_primary.h" > =20 > +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_enc= oder_funcs =3D { > * Connector > */ > =20 > -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 !=3D 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] =3D '\0'; > + } else { > + memset(info->name, '\0', sizeof(info->name)); > + } > + > + info->width_mm =3D fb_info->var.width; > + info->height_mm =3D fb_info->var.height; > + info->pixel_clock =3D PICOS2KHZ(fb_info->var.pixclock); > + > + num_pixel =3D 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 =3D fb_info->var.bits_per_pixel; > + else > + info->bpc =3D 0; > + > + info->subpixel_order =3D SubPixelUnknown; > + info->color_formats =3D DRM_COLOR_FORMAT_RGB444; > + info->bus_formats =3D &info->color_formats; > + info->num_bus_formats =3D 1; > + info->bus_flags =3D 0; > + info->max_tmds_clock =3D 0; > + info->dvi_dual =3D false; > + info->has_hdmi_infoframe =3D false; > + info->edid_hdmi_dc_modes =3D 0; > + info->cea_rev =3D 0; > + memset(&info->hdmi, 0, sizeof(info->hdmi)); > + info->non_desktop =3D 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 =3D drm_mode_create_from_fb_videomode(connector->dev, fb_mode); > + if (!mode) > + return -ENOMEM; > + > + mode->width_mm =3D fb_info->var.width; > + mode->height_mm =3D 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 =3D true; > + if (mode->flags & DRM_MODE_FLAG_DBLSCAN) > + connector->doublescan_allowed =3D true; > + if (mode->flags & DRM_MODE_FLAG_3D_MASK) > + connector->stereo_allowed =3D true; > + > return 0; > } > =20 > +static int connector_helper_get_modes(struct drm_connector *connector) > +{ > + struct fbdevdrm_modeset *modeset; > + struct list_head *pos; > + int ret, num_modes =3D 0; > + > + modeset =3D fbdevdrm_modeset_of_connector(connector); > + > + ret =3D update_display_info(&connector->display_info, modeset->fb_info); > + if (ret) > + return 0; > + > + /* update connector properties from video modes */ > + connector->interlace_allowed =3D 0; > + connector->doublescan_allowed =3D 0; > + connector->stereo_allowed =3D 0; > + > + if (!num_modes && modeset->fb_info->mode) { > + ret =3D 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. --=20 Ville Syrj=E4l=E4 Intel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH 11/11] drm/fbdevdrm: Detect and validate display modes Date: Tue, 26 Mar 2019 18:47:41 +0200 Message-ID: <20190326164741.GA3888@intel.com> References: <20190326091744.11542-1-tzimmermann@suse.de> <20190326091744.11542-12-tzimmermann@suse.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) by gabe.freedesktop.org (Postfix) with ESMTPS id 28A146E076 for ; Tue, 26 Mar 2019 16:47:45 +0000 (UTC) Content-Disposition: inline In-Reply-To: <20190326091744.11542-12-tzimmermann@suse.de> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Thomas Zimmermann Cc: airlied@linux.ie, linux-fbdev@vger.kernel.org, dri-devel@lists.freedesktop.org, b.zolnierkie@samsung.com List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBNYXIgMjYsIDIwMTkgYXQgMTA6MTc6NDRBTSArMDEwMCwgVGhvbWFzIFppbW1lcm1h bm4gd3JvdGU6Cj4gTW9kZSBkZXRlY3Rpb24gY3VycmVudGx5IHJlcG9ydHMgdGhlIG1vZGVzIGxp c3RlZCBpbiBmYl9pbmZvOjptb2RlbGlzdC4KPiBUaGUgbGlzdCBpcyBlaXRoZXIgYnVpbGQgZnJv bSBFRElEIGluZm9ybWF0aW9uIG9yLCBtb3JlIG9mdGVuLCBhIGxpc3Qgb2YKPiBwcmV2aW91c2x5 IHNldCBtb2Rlcy4gQSBsYXRlciB1cGRhdGUgdG8gdGhlIG1vZGUgZGV0ZWN0aW9uIGNvdWxkIGFs c28KPiB0YWtlIGludG8gYWNjb3VudCB0aGUgbW9kZXMgaW4gZmJfbW9uc3BlY3M6Om1vZGVkYiBv ciB0ZXN0IHByZS1kZWZpbmVkCj4gVkVTQSBtb2Rlcy4KPiAKPiBTaWduZWQtb2ZmLWJ5OiBUaG9t YXMgWmltbWVybWFubiA8dHppbW1lcm1hbm5Ac3VzZS5kZT4KPiAtLS0KPiAgZHJpdmVycy9ncHUv ZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJtX21vZGVzZXQuYyB8IDE2MyArKysrKysrKysrKysrKysrKysr LQo+ICAxIGZpbGUgY2hhbmdlZCwgMTYyIGluc2VydGlvbnMoKyksIDEgZGVsZXRpb24oLSkKPiAK PiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9ncHUvZHJtL2ZiZGV2ZHJtL2ZiZGV2ZHJtX21vZGVzZXQu YyBiL2RyaXZlcnMvZ3B1L2RybS9mYmRldmRybS9mYmRldmRybV9tb2Rlc2V0LmMKPiBpbmRleCA4 N2Y1NmVjNzZlZGYuLmU4OWVjYTRiNThkZiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0v ZmJkZXZkcm0vZmJkZXZkcm1fbW9kZXNldC5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2ZiZGV2 ZHJtL2ZiZGV2ZHJtX21vZGVzZXQuYwo+IEBAIC0yMSw5ICsyMSwxNiBAQAo+ICAjaW5jbHVkZSA8 ZHJtL2RybV9wcmludC5oPgo+ICAjaW5jbHVkZSA8ZHJtL2RybV9wcm9iZV9oZWxwZXIuaD4KPiAg I2luY2x1ZGUgPGxpbnV4L2ZiLmg+Cj4gKyNpbmNsdWRlICJmYmRldmRybV9kZXZpY2UuaCIKPiAg I2luY2x1ZGUgImZiZGV2ZHJtX21vZGVzLmgiCj4gICNpbmNsdWRlICJmYmRldmRybV9wcmltYXJ5 LmgiCj4gIAo+ICtzdGF0aWMgc3RydWN0IGZiZGV2ZHJtX21vZGVzZXQqIGZiZGV2ZHJtX21vZGVz ZXRfb2ZfY29ubmVjdG9yKAo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3RvcikKPiAr ewo+ICsJcmV0dXJuIGNvbnRhaW5lcl9vZihjb25uZWN0b3IsIHN0cnVjdCBmYmRldmRybV9tb2Rl c2V0LCBjb25uZWN0b3IpOwo+ICt9Cj4gKwo+ICBzdGF0aWMgc3RydWN0IGZiZGV2ZHJtX21vZGVz ZXQqIGZiZGV2ZHJtX21vZGVzZXRfb2ZfY3J0YygKPiAgCXN0cnVjdCBkcm1fY3J0YyAqY3J0YykK PiAgewo+IEBAIC0zNTMsMTEgKzM2MCwxMzAgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBkcm1fZW5j b2Rlcl9mdW5jcyBmYmRldmRybV9lbmNvZGVyX2Z1bmNzID0gewo+ICAgKiBDb25uZWN0b3IKPiAg ICovCj4gIAo+IC1zdGF0aWMgaW50IGNvbm5lY3Rvcl9oZWxwZXJfZ2V0X21vZGVzKHN0cnVjdCBk cm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3N0YXRpYyBpbnQgdXBkYXRlX2Rpc3BsYXlfaW5m byhzdHJ1Y3QgZHJtX2Rpc3BsYXlfaW5mbyAqaW5mbywgc3RydWN0IGZiX2luZm8gKmZiX2luZm8p Cj4gK3sKPiArCWludCBudW1fcGl4ZWw7Cj4gKwo+ICsJaWYgKGZiX2luZm8tPmZpeC50eXBlICE9 IEZCX1RZUEVfUEFDS0VEX1BJWEVMUykKPiArCQlyZXR1cm4gLUVJTlZBTDsgLyogcnVsZSBvdXQg dGV4dCBtb2RlLCBldGMuICovCj4gKwo+ICsJaWYgKGZiX2luZm8tPmZpeC5pZFswXSkgewo+ICsJ CXN0cm5jcHkoaW5mby0+bmFtZSwgZmJfaW5mby0+Zml4LmlkLCBzaXplb2YoaW5mby0+bmFtZSkg LSAxKTsKPiArCQlpbmZvLT5uYW1lW3NpemVvZihpbmZvLT5uYW1lKSAtIDFdID0gJ1wwJzsKPiAr CX0gZWxzZSB7Cj4gKwkJbWVtc2V0KGluZm8tPm5hbWUsICdcMCcsIHNpemVvZihpbmZvLT5uYW1l KSk7Cj4gKwl9Cj4gKwo+ICsJaW5mby0+d2lkdGhfbW0gPSBmYl9pbmZvLT52YXIud2lkdGg7Cj4g KwlpbmZvLT5oZWlnaHRfbW0gPSBmYl9pbmZvLT52YXIuaGVpZ2h0Owo+ICsJaW5mby0+cGl4ZWxf Y2xvY2sgPSBQSUNPUzJLSFooZmJfaW5mby0+dmFyLnBpeGNsb2NrKTsKPiArCj4gKwludW1fcGl4 ZWwgPSAwOwo+ICsJaWYgKGZiX2luZm8tPnZhci5yZWQubGVuZ3RoKQo+ICsJCSsrbnVtX3BpeGVs Owo+ICsJaWYgKGZiX2luZm8tPnZhci5ncmVlbi5sZW5ndGgpCj4gKwkJKytudW1fcGl4ZWw7Cj4g KwlpZiAoZmJfaW5mby0+dmFyLmJsdWUubGVuZ3RoKQo+ICsJCSsrbnVtX3BpeGVsOwo+ICsJaWYg KGZiX2luZm8tPnZhci50cmFuc3AubGVuZ3RoKQo+ICsJCSsrbnVtX3BpeGVsOwo+ICsKPiArCWlm IChudW1fcGl4ZWwpCj4gKwkJaW5mby0+YnBjID0gZmJfaW5mby0+dmFyLmJpdHNfcGVyX3BpeGVs Owo+ICsJZWxzZQo+ICsJCWluZm8tPmJwYyA9IDA7Cj4gKwo+ICsJaW5mby0+c3VicGl4ZWxfb3Jk ZXIgPSBTdWJQaXhlbFVua25vd247Cj4gKwlpbmZvLT5jb2xvcl9mb3JtYXRzID0gRFJNX0NPTE9S X0ZPUk1BVF9SR0I0NDQ7Cj4gKwlpbmZvLT5idXNfZm9ybWF0cyA9ICZpbmZvLT5jb2xvcl9mb3Jt YXRzOwo+ICsJaW5mby0+bnVtX2J1c19mb3JtYXRzID0gMTsKPiArCWluZm8tPmJ1c19mbGFncyA9 IDA7Cj4gKwlpbmZvLT5tYXhfdG1kc19jbG9jayA9IDA7Cj4gKwlpbmZvLT5kdmlfZHVhbCA9IGZh bHNlOwo+ICsJaW5mby0+aGFzX2hkbWlfaW5mb2ZyYW1lID0gZmFsc2U7Cj4gKwlpbmZvLT5lZGlk X2hkbWlfZGNfbW9kZXMgPSAwOwo+ICsJaW5mby0+Y2VhX3JldiA9IDA7Cj4gKwltZW1zZXQoJmlu Zm8tPmhkbWksIDAsIHNpemVvZihpbmZvLT5oZG1pKSk7Cj4gKwlpbmZvLT5ub25fZGVza3RvcCA9 IDA7CgpJIHRoaW5rIHRoZSBvbmx5IHRoaW5ncyBoZXJlIHlvdSBtYXkgd2FudCB0byBzZXQgYXJl CndpZHRoX21tIGFuZCBoZWlnaHRfbW0uIFRoZSByZXN0IHNob3VsZCBub3QgbWF0dGVyLgoKPiAr Cj4gKwlyZXR1cm4gMDsKPiArfQo+ICsKPiArc3RhdGljIGludCBkcm1fbW9kZV9wcm9iZWRfYWRk X2Zyb21fZmJfdmlkZW9tb2RlKAo+ICsJc3RydWN0IGRybV9jb25uZWN0b3IgKmNvbm5lY3Rvciwg Y29uc3Qgc3RydWN0IGZiX3ZpZGVvbW9kZSAqZmJfbW9kZSwKPiArCXN0cnVjdCBmYl9pbmZvICpm Yl9pbmZvKQo+ICB7Cj4gKwlzdHJ1Y3QgZHJtX2Rpc3BsYXlfbW9kZSAqbW9kZTsKPiArCj4gKwlt b2RlID0gZHJtX21vZGVfY3JlYXRlX2Zyb21fZmJfdmlkZW9tb2RlKGNvbm5lY3Rvci0+ZGV2LCBm Yl9tb2RlKTsKPiArCWlmICghbW9kZSkKPiArCQlyZXR1cm4gLUVOT01FTTsKPiArCj4gKwltb2Rl LT53aWR0aF9tbSA9IGZiX2luZm8tPnZhci53aWR0aDsKPiArCW1vZGUtPmhlaWdodF9tbSA9IGZi X2luZm8tPnZhci5oZWlnaHQ7Cj4gKwo+ICsJZHJtX21vZGVfcHJvYmVkX2FkZChjb25uZWN0b3Is IG1vZGUpOwo+ICsKPiArCS8qIHVwZGF0ZSBjb25uZWN0b3IgcHJvcGVydGllcyBmcm9tIGRpc3Bs YXkgbW9kZSAqLwo+ICsJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR19JTlRFUkxBQ0Up Cj4gKwkJY29ubmVjdG9yLT5pbnRlcmxhY2VfYWxsb3dlZCA9IHRydWU7Cj4gKwlpZiAobW9kZS0+ ZmxhZ3MgJiBEUk1fTU9ERV9GTEFHX0RCTFNDQU4pCj4gKwkJY29ubmVjdG9yLT5kb3VibGVzY2Fu X2FsbG93ZWQgPSB0cnVlOwo+ICsJaWYgKG1vZGUtPmZsYWdzICYgRFJNX01PREVfRkxBR18zRF9N QVNLKQo+ICsJCWNvbm5lY3Rvci0+c3RlcmVvX2FsbG93ZWQgPSB0cnVlOwo+ICsKPiAgCXJldHVy biAwOwo+ICB9Cj4gIAo+ICtzdGF0aWMgaW50IGNvbm5lY3Rvcl9oZWxwZXJfZ2V0X21vZGVzKHN0 cnVjdCBkcm1fY29ubmVjdG9yICpjb25uZWN0b3IpCj4gK3sKPiArCXN0cnVjdCBmYmRldmRybV9t b2Rlc2V0ICptb2Rlc2V0Owo+ICsJc3RydWN0IGxpc3RfaGVhZCAqcG9zOwo+ICsJaW50IHJldCwg bnVtX21vZGVzID0gMDsKPiArCj4gKwltb2Rlc2V0ID0gZmJkZXZkcm1fbW9kZXNldF9vZl9jb25u ZWN0b3IoY29ubmVjdG9yKTsKPiArCj4gKwlyZXQgPSB1cGRhdGVfZGlzcGxheV9pbmZvKCZjb25u ZWN0b3ItPmRpc3BsYXlfaW5mbywgbW9kZXNldC0+ZmJfaW5mbyk7Cj4gKwlpZiAocmV0KQo+ICsJ CXJldHVybiAwOwo+ICsKPiArCS8qIHVwZGF0ZSBjb25uZWN0b3IgcHJvcGVydGllcyBmcm9tIHZp ZGVvIG1vZGVzICovCj4gKwljb25uZWN0b3ItPmludGVybGFjZV9hbGxvd2VkID0gMDsKPiArCWNv bm5lY3Rvci0+ZG91Ymxlc2Nhbl9hbGxvd2VkID0gMDsKPiArCWNvbm5lY3Rvci0+c3RlcmVvX2Fs bG93ZWQgPSAwOwo+ICsKPiArCWlmICghbnVtX21vZGVzICYmIG1vZGVzZXQtPmZiX2luZm8tPm1v ZGUpIHsKPiArCQlyZXQgPSBkcm1fbW9kZV9wcm9iZWRfYWRkX2Zyb21fZmJfdmlkZW9tb2RlKAo+ ICsJCQljb25uZWN0b3IsIG1vZGVzZXQtPmZiX2luZm8tPm1vZGUsIG1vZGVzZXQtPmZiX2luZm8p Owo+ICsJCWlmICghcmV0KQo+ICsJCQkrK251bV9tb2RlczsKPiArCX0KPiArCj4gKwlpZiAoIW51 bV9tb2Rlcykgewo+ICsKPiArCQkvKiBEUk0gYmFja3BvcnRpbmcgbm90ZXM6IHdlIGdvIHRocm91 Z2ggYWxsIG1vZGVzIGluIHRoZQo+ICsJCSAqIGZiX2luZm8ncyBtb2RlIGxpc3QgYW5kIGNvbnZl cnQgZWFjaCB0byBhIERSTSBtb2Rlcy4gSWYKPiArCQkgKiB5b3UgY29udmVydCBhbiBmYmRldiBk cml2ZXIgdG8gRFJNLCByZXBsYWNlIHRoaXMgY29kZQo+ICsJCSAqIHdpdGggYW4gYWN0dWFsIGhh cmR3YXJlIHF1ZXJ5LiBUaGlzIHdpbGwgdXN1YWxseSBpbnZvbHZlCj4gKwkJICogcmVhZGluZyB0 aGUgbW9uaXRvciBFRElEIHZpYSBEREMuCj4gKwkJICovCj4gKwo+ICsJCWxpc3RfZm9yX2VhY2go cG9zLCAmbW9kZXNldC0+ZmJfaW5mby0+bW9kZWxpc3QpIHsKCmZiZGV2IGhhcyBhIG1vZGVsaXN0 PyBJIGd1ZXNzIGl0IGRvZXMuIEJ1dCBub3QgZXhwb3NlZCB0bwp1c2Vyc3BhY2UsIHdoaWNoIGlz IHByb2JhYmx5IHRoZSByZWFzb24gSSBuZXZlciByZWFsaXplZCB0aGlzLgoKLS0gClZpbGxlIFN5 cmrDpGzDpApJbnRlbApfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5v cmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2 ZWw=