> Date: Mon, 23 Jul 2018 13:28:40 -0500
> From: joshua stein <[email protected]>
>
> On the 2015 MacBook Pro and the 12" MacBook, the firmware reports a
> framebuffer size of 2880x1800 but the screens are 2560x1600 and
> 2304x1440. Our console ends up drawing text off screen and the
> latest few lines can't be read.
>
> Once X loads, it probes the outputs again and uses the proper
> resolution.
>
> For the console, the outputs are already being probed but the BIOS
> resolution is only discarded if it's too small. I'd like to change
> it to discard it if it's too large as well, so it uses the actual
> resolution probed.
>
> On a machine like a server where inteldrm loads but has nothing
> connected, intel_fb is null, so this code doesn't run.
I'm hesitant to change this code. How does Linux behave on tese
machines? Does it use the invisible part of the framebuffer? Or have
they done away with actually using the kernel framebuffer completely
like some developers threatened a couple of years ago...
Do you have a (larger) monitor connected to your laptops when this happens?
Maybe the wsdisplay(4) interface code should be a bit more clever when
it initializes rasops and make sure we only use the part of the
framebuffer that is visible on all connected displays...
> Index: sys/dev/pci/drm/i915/intel_fbdev.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/i915/intel_fbdev.c,v
> retrieving revision 1.3
> diff -u -p -u -p -r1.3 intel_fbdev.c
> --- sys/dev/pci/drm/i915/intel_fbdev.c 1 Jul 2017 16:14:10 -0000
> 1.3
> +++ sys/dev/pci/drm/i915/intel_fbdev.c 23 Jul 2018 17:58:03 -0000
> @@ -202,10 +202,9 @@ static int intelfb_create(struct drm_fb_
> mutex_lock(&dev->struct_mutex);
>
> if (intel_fb &&
> - (sizes->fb_width > intel_fb->base.width ||
> - sizes->fb_height > intel_fb->base.height)) {
> - DRM_DEBUG_KMS("BIOS fb too small (%dx%d), we require (%dx%d),"
> - " releasing it\n",
> + (sizes->fb_width != intel_fb->base.width ||
> + sizes->fb_height != intel_fb->base.height)) {
> + DRM_DEBUG_KMS("BIOS fb %dx%d != %dx%d, releasing it\n",
> intel_fb->base.width, intel_fb->base.height,
> sizes->fb_width, sizes->fb_height);
> drm_framebuffer_unreference(&intel_fb->base);
>
>