|
@@ -121,8 +121,9 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
|
|
|
container_of(helper, struct intel_fbdev, helper);
|
|
|
struct drm_framebuffer *fb;
|
|
|
struct drm_device *dev = helper->dev;
|
|
|
+ struct drm_i915_private *dev_priv = to_i915(dev);
|
|
|
struct drm_mode_fb_cmd2 mode_cmd = {};
|
|
|
- struct drm_i915_gem_object *obj;
|
|
|
+ struct drm_i915_gem_object *obj = NULL;
|
|
|
int size, ret;
|
|
|
|
|
|
/* we don't do packed 24bpp */
|
|
@@ -139,7 +140,12 @@ static int intelfb_alloc(struct drm_fb_helper *helper,
|
|
|
|
|
|
size = mode_cmd.pitches[0] * mode_cmd.height;
|
|
|
size = PAGE_ALIGN(size);
|
|
|
- obj = i915_gem_object_create_stolen(dev, size);
|
|
|
+
|
|
|
+ /* If the FB is too big, just don't use it since fbdev is not very
|
|
|
+ * important and we should probably use that space with FBC or other
|
|
|
+ * features. */
|
|
|
+ if (size * 2 < dev_priv->gtt.stolen_usable_size)
|
|
|
+ obj = i915_gem_object_create_stolen(dev, size);
|
|
|
if (obj == NULL)
|
|
|
obj = i915_gem_alloc_object(dev, size);
|
|
|
if (!obj) {
|