diff options
| author | Alan Cox <alan@linux.intel.com> | 2012-04-25 14:37:40 +0100 | 
|---|---|---|
| committer | Dave Airlie <airlied@redhat.com> | 2012-04-27 09:24:09 +0100 | 
| commit | 3aad16d2ea75cd604400577e9644c9d982c0bfe6 (patch) | |
| tree | ae2a02bdfbe13ecb7d3a471485217a1e3e7a6493 /drivers/gpu/drm/gma500/framebuffer.c | |
| parent | 1b2db4cee5433e089533f81fea6721c1b653703c (diff) | |
| download | olio-linux-3.10-3aad16d2ea75cd604400577e9644c9d982c0bfe6.tar.xz olio-linux-3.10-3aad16d2ea75cd604400577e9644c9d982c0bfe6.zip  | |
gma500: support 1080p
The problem in console mode is lack of linear memory. We can solve that by
dropping to 16bpp. The mode setting X server will allocate its own GEM
framebuffer in 32bpp and all will be well.
We could just do 16bpp anyway but that would be a regression on the lower
modes as many distributions don't yet ship the generic mode setting KMS
drivers.
Signed-off-by: Alan Cox <alan@linux.intel.com>
Signed-off-by: Dave Airlie <airlied@redhat.com>
Diffstat (limited to 'drivers/gpu/drm/gma500/framebuffer.c')
| -rw-r--r-- | drivers/gpu/drm/gma500/framebuffer.c | 16 | 
1 files changed, 16 insertions, 0 deletions
diff --git a/drivers/gpu/drm/gma500/framebuffer.c b/drivers/gpu/drm/gma500/framebuffer.c index 8ea202f1ba5..c2cf6bf217d 100644 --- a/drivers/gpu/drm/gma500/framebuffer.c +++ b/drivers/gpu/drm/gma500/framebuffer.c @@ -543,9 +543,25 @@ static int psbfb_probe(struct drm_fb_helper *helper,  				struct drm_fb_helper_surface_size *sizes)  {  	struct psb_fbdev *psb_fbdev = (struct psb_fbdev *)helper; +	struct drm_device *dev = psb_fbdev->psb_fb_helper.dev; +	struct drm_psb_private *dev_priv = dev->dev_private;  	int new_fb = 0; +	int bytespp;  	int ret; +	bytespp = sizes->surface_bpp / 8; +	if (bytespp == 3)	/* no 24bit packed */ +		bytespp = 4; + +	/* If the mode will not fit in 32bit then switch to 16bit to get +	   a console on full resolution. The X mode setting server will +	   allocate its own 32bit GEM framebuffer */ +	if (ALIGN(sizes->fb_width * bytespp, 64) * sizes->fb_height > +	                dev_priv->vram_stolen_size) { +                sizes->surface_bpp = 16; +                sizes->surface_depth = 16; +        } +  	if (!helper->fb) {  		ret = psbfb_create(psb_fbdev, sizes);  		if (ret)  |