drm/fb-helper: pass physical dimensions to fbdev
authorDavid Lechner <david@lechnology.com>
Fri, 4 Aug 2017 16:25:24 +0000 (11:25 -0500)
committerDaniel Vetter <daniel.vetter@ffwll.ch>
Mon, 7 Aug 2017 15:01:15 +0000 (17:01 +0200)
The fbdev subsystem has a place for physical dimensions (width and height
in mm) that is readable by userspace. Since DRM also knows these
dimensions, pass this information to the fbdev device.

This has to be done in drm_setup_crtcs_fb() instead of drm_setup_crtcs()
because fb_helper->fbdev may be NULL in drm_setup_crtcs().

Signed-off-by: David Lechner <david@lechnology.com>
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Link: https://patchwork.freedesktop.org/patch/msgid/1501863924-7154-1-git-send-email-david@lechnology.com
drivers/gpu/drm/drm_fb_helper.c

index 4447a28c6d4721f87e9142756fdd8ce3900f3f0e..1b8f013ffa6503ec960cee3bdb9cb7c3fa78d2bc 100644 (file)
@@ -1882,8 +1882,6 @@ void drm_fb_helper_fill_var(struct fb_info *info, struct drm_fb_helper *fb_helpe
        info->var.xoffset = 0;
        info->var.yoffset = 0;
        info->var.activate = FB_ACTIVATE_NOW;
        info->var.xoffset = 0;
        info->var.yoffset = 0;
        info->var.activate = FB_ACTIVATE_NOW;
-       info->var.height = -1;
-       info->var.width = -1;
 
        switch (fb->format->depth) {
        case 8:
 
        switch (fb->format->depth) {
        case 8:
@@ -2435,11 +2433,26 @@ out:
  */
 static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper)
 {
  */
 static void drm_setup_crtcs_fb(struct drm_fb_helper *fb_helper)
 {
+       struct fb_info *info = fb_helper->fbdev;
        int i;
 
        for (i = 0; i < fb_helper->crtc_count; i++)
                if (fb_helper->crtc_info[i].mode_set.num_connectors)
                        fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
        int i;
 
        for (i = 0; i < fb_helper->crtc_count; i++)
                if (fb_helper->crtc_info[i].mode_set.num_connectors)
                        fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb;
+
+       mutex_lock(&fb_helper->dev->mode_config.mutex);
+       drm_fb_helper_for_each_connector(fb_helper, i) {
+               struct drm_connector *connector =
+                                       fb_helper->connector_info[i]->connector;
+
+               /* use first connected connector for the physical dimensions */
+               if (connector->status == connector_status_connected) {
+                       info->var.width = connector->display_info.width_mm;
+                       info->var.height = connector->display_info.height_mm;
+                       break;
+               }
+       }
+       mutex_unlock(&fb_helper->dev->mode_config.mutex);
 }
 
 /* Note: Drops fb_helper->lock before returning. */
 }
 
 /* Note: Drops fb_helper->lock before returning. */