On Sun, Aug 11, 2013 at 7:42 PM, Tony Prisk linux@prisktech.co.nz wrote:
On 11/08/13 20:42, Dave Airlie wrote:
On Sun, Aug 11, 2013 at 2:41 PM, Tony Prisk linux@prisktech.co.nz wrote:
I am working on the HDMI driver for the i.MX6 as part of the larger DRM driver written by Sascha Hauer and need a little advice. I seem to be missing one important part of the subsystem that I haven't been able to resolve.
fbcon is limited by boot sizes as at least with dynamic memory management and how fbdev works resizing the allocation is nearly impossible to do race free, since fbdev will hand out mmaps to userspace and that stops you from ever moving anything once the device is open.
But this is only for the fbdev emulation, a real kms application should be able to use a larger size no problems.
Dave.
It seems to be worse than just a fbcon issue as far as I can tell.
I am making an assumption, but I believe '/sys/class/drm/card0-HDMI-A-1/modes' should list all the supported modes of the connector (regardless of fbcon). Using 'cat /sys/class/drm/card0-HDMI-A-1/modes', it appears the supported modes are being limited by fbcon
- HDMI Cable connected at bootup (fb @ 1920x1080)
cat /sys/class/drm/card0-HDMI-A-1/modes 1920x1080 1280x720 1280x720 720x576 720x480 640x480
- HDMI Cable NOT connected at bootup (fb @ 1024x768), cable is then
connected after userspace has started (still in console) cat /sys/class/drm/card0-HDMI-A-1/modes 720x576 720x480 640x480
Following back through the source:
static struct drm_connector_funcs imx_hdmi_connector_funcs = { .fill_modes = drm_helper_probe_single_connector_modes, ... };
static struct drm_connector_helper_funcs imx_hdmi_connector_helper_funcs = { .get_modes = imx_hdmi_connector_get_modes, .mode_valid = imx_hdmi_connector_mode_valid, ... };
It appears that only drm_helper_probe_single_connector_modes() calls .get_modes() and .mode_valid() .fill_modes() is called from drm_fb_helper_probe_connector_modes(), which is called from drm_fb_helper_hotplug_event() drm_fb_helper_hotplug_event() sets max_width to fb_helper->fb->width, and max_height to fb_helper->fb->height. fb->width is 1024 if booted without the cable connected, hence the clipping of the values.
fill_modes is also called from the drm_crtc.c userspace interface, all the functions in drm_fb_helper are for fbdev/con use, the fact sysfs is wrong is only a side effect.
Userspace should get a full list of modes, try using the modetest application which I think should work.
Dave.