|
@@ -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)
|