drm/fb-helper: pass physical dimensions to fbdev
Subsystems (2)
PATCH v5 1/1 drm/fb-helper: pass physical dimensions to fbdev
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().
---
v1 changes (from RFC):
* Use loop to get info from first connected connector instead of just the first connector.
v2 changes:
* Update width in height in drm_setup_crtcs() also to handle hotplug events.
v3 changes:
* Add new patch to handle post-fb allocation crcts setup.
* Use new drm_setup_crtcs_fb() function from new patch to avoid duplication of code.
v4 changes:
* Drop patch "drm/fb-helper: add new drm_setup_crtcs_fb() function" since it has been applied already.
* Add mutex lock.
v5 changes:
* Fix height = width mismatch.
drivers/gpu/drm/drm_fb_helper.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)
drivers/gpu/drm/drm_fb_helper.c +15 -2
@@ -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.height =-1 ; - info->var.width =-1 ;switch (fb->format->depth) {case 8 :
@@ -2435,11 +2433,26 @@ static void drm_setup_crtcs(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; + +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. */
Signature · 1 line
2.7.4
Hi David,
Thank you for the patch.
Quoted 3 lines · On Friday 04 Aug 2017 11:25:24 David Lechner wrote:
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.
I'm curious, what's your use case for this ? What userspace software do you use that is still based on fbdev and needs screen dimensions ?
Quoted 49 lines
This has to be done in
drm_setup_crtcs_fb()instead ofdrm_setup_crtcs()becausefb_helper->fbdevmay be NULL indrm_setup_crtcs().
---v1 changes (from RFC):
* Use loop to get info from first connected connector instead of just the first connector.v2 changes:
* Update width in height indrm_setup_crtcs()also to handle hotplug events.v3 changes:
* Add new patch to handle post-fb allocation crcts setup.
* Use newdrm_setup_crtcs_fb()function from new patch to avoid duplication of code.v4 changes:
* Drop patch "drm/fb-helper: add newdrm_setup_crtcs_fb()function" since it has been applied already.
* Add mutex lock.v5 changes:
* Fix height = width mismatch.drivers/gpu/drm/drm_fb_helper.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)(quoted diff) +0
-0
b/drivers/gpu/drm/drm_fb_helper.cindex 4447a28..24787d6 100644drivers/gpu/drm/drm_fb_helper.c +1
-2@@ -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.height =-1 ; - info->var.width =-1 ;switch (fb->format->depth) {case 8 :@@ -2435,11 +2433,26 @@ static void drm_setup_crtcs(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)
drivers/gpu/drm/drm_fb_helper.c static void drm_setup_crtcs(struct drm_fb_helper · line 2450
Quoted 10 lines
drivers/gpu/drm/drm_fb_helper.c +7
-0fb_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
*/
Quoted 11 lines
drivers/gpu/drm/drm_fb_helper.c +7
-0+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->lockbefore returning. */
Signature · 3 lines
Regards, Laurent Pinchart
Quoted 11 lines · Laurent Pinchart
Hi David,
Thank you for the patch.
Quoted 3 lines · On Friday 04 Aug 2017 11:25:24 David Lechner wrote:
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.
I'm curious, what's your use case for this ? What userspace software do you use that is still based on fbdev and needs screen dimensions ?
I have dug up an old graphics library called GRX[1] and modernized it[2]. So, I am using the screen dimensions to make it DPI-aware so that the font on my 2.4" screen looks the same size as my 2.8" screen when both are 320x240 pixels. Until this year, all of the displays I have only have fbdev drivers.
[1]: http://grx.gnu.de
[2]: https://github.com/ev3dev/grx
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 6 lines · David Lechner
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 ofdrm_setup_crtcs()becausefb_helper->fbdevmay be NULL indrm_setup_crtcs().
You'r sob line is missing here.
-Daniel
Quoted 72 lines
---
v1 changes (from RFC):
* Use loop to get info from first connected connector instead of just the first connector.v2 changes:
* Update width in height indrm_setup_crtcs()also to handle hotplug events.v3 changes:
* Add new patch to handle post-fb allocation crcts setup.
* Use newdrm_setup_crtcs_fb()function from new patch to avoid duplication of code.v4 changes:
* Drop patch "drm/fb-helper: add newdrm_setup_crtcs_fb()function" since it has been applied already.
* Add mutex lock.v5 changes:
* Fix height = width mismatch.drivers/gpu/drm/drm_fb_helper.c | 17 +++++++++++++++-- 1 file changed, 15 insertions(+), 2 deletions(-)drivers/gpu/drm/drm_fb_helper.c +15
-2@@ -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.height =-1 ; - info->var.width =-1 ;switch (fb->format->depth) {case 8 :@@ -2435,11 +2433,26 @@ static void drm_setup_crtcs(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; + +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. */ Signature · 6 lines
2.7.4 _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel
Quoted 6 lines · David Lechner
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 ofdrm_setup_crtcs()becausefb_helper->fbdevmay be NULL indrm_setup_crtcs().
_______________________________________________
dri-devel mailing list
[email protected]
https://lists.freedesktop.org/mailman/listinfo/dri-devel
Daniel Vetter
AppliedQuoted 9 lines · David Lechner
Quoted 6 lines · David Lechner
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 ofdrm_setup_crtcs()becausefb_helper->fbdevmay be NULL indrm_setup_crtcs().Signed-off-by David Lechner <[email protected]>
Thanks, applied.
-Daniel
Signature · 7 lines
Daniel Vetter Software Engineer, Intel Corporation http://blog.ffwll.ch _______________________________________________ dri-devel mailing list [email protected] https://lists.freedesktop.org/mailman/listinfo/dri-devel