|
@@ -2371,13 +2371,19 @@ intel_alloc_plane_obj(struct intel_crtc *crtc,
|
|
|
struct drm_device *dev = crtc->base.dev;
|
|
struct drm_device *dev = crtc->base.dev;
|
|
|
struct drm_i915_gem_object *obj = NULL;
|
|
struct drm_i915_gem_object *obj = NULL;
|
|
|
struct drm_mode_fb_cmd2 mode_cmd = { 0 };
|
|
struct drm_mode_fb_cmd2 mode_cmd = { 0 };
|
|
|
- u32 base = plane_config->base;
|
|
|
|
|
|
|
+ u32 base_aligned = round_down(plane_config->base, PAGE_SIZE);
|
|
|
|
|
+ u32 size_aligned = round_up(plane_config->base + plane_config->size,
|
|
|
|
|
+ PAGE_SIZE);
|
|
|
|
|
+
|
|
|
|
|
+ size_aligned -= base_aligned;
|
|
|
|
|
|
|
|
if (plane_config->size == 0)
|
|
if (plane_config->size == 0)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
|
|
|
- obj = i915_gem_object_create_stolen_for_preallocated(dev, base, base,
|
|
|
|
|
- plane_config->size);
|
|
|
|
|
|
|
+ obj = i915_gem_object_create_stolen_for_preallocated(dev,
|
|
|
|
|
+ base_aligned,
|
|
|
|
|
+ base_aligned,
|
|
|
|
|
+ size_aligned);
|
|
|
if (!obj)
|
|
if (!obj)
|
|
|
return false;
|
|
return false;
|
|
|
|
|
|
|
@@ -2725,10 +2731,19 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
|
|
|
case DRM_FORMAT_XRGB8888:
|
|
case DRM_FORMAT_XRGB8888:
|
|
|
plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888;
|
|
plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888;
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case DRM_FORMAT_ARGB8888:
|
|
|
|
|
+ plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888;
|
|
|
|
|
+ plane_ctl |= PLANE_CTL_ALPHA_SW_PREMULTIPLY;
|
|
|
|
|
+ break;
|
|
|
case DRM_FORMAT_XBGR8888:
|
|
case DRM_FORMAT_XBGR8888:
|
|
|
plane_ctl |= PLANE_CTL_ORDER_RGBX;
|
|
plane_ctl |= PLANE_CTL_ORDER_RGBX;
|
|
|
plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888;
|
|
plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888;
|
|
|
break;
|
|
break;
|
|
|
|
|
+ case DRM_FORMAT_ABGR8888:
|
|
|
|
|
+ plane_ctl |= PLANE_CTL_ORDER_RGBX;
|
|
|
|
|
+ plane_ctl |= PLANE_CTL_FORMAT_XRGB_8888;
|
|
|
|
|
+ plane_ctl |= PLANE_CTL_ALPHA_SW_PREMULTIPLY;
|
|
|
|
|
+ break;
|
|
|
case DRM_FORMAT_XRGB2101010:
|
|
case DRM_FORMAT_XRGB2101010:
|
|
|
plane_ctl |= PLANE_CTL_FORMAT_XRGB_2101010;
|
|
plane_ctl |= PLANE_CTL_FORMAT_XRGB_2101010;
|
|
|
break;
|
|
break;
|
|
@@ -6627,7 +6642,7 @@ i9xx_get_initial_plane_config(struct intel_crtc *crtc,
|
|
|
aligned_height = intel_fb_align_height(dev, fb->height,
|
|
aligned_height = intel_fb_align_height(dev, fb->height,
|
|
|
plane_config->tiling);
|
|
plane_config->tiling);
|
|
|
|
|
|
|
|
- plane_config->size = PAGE_ALIGN(fb->pitches[0] * aligned_height);
|
|
|
|
|
|
|
+ plane_config->size = fb->pitches[0] * aligned_height;
|
|
|
|
|
|
|
|
DRM_DEBUG_KMS("pipe/plane %c/%d with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
|
DRM_DEBUG_KMS("pipe/plane %c/%d with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
|
|
pipe_name(pipe), plane, fb->width, fb->height,
|
|
pipe_name(pipe), plane, fb->width, fb->height,
|
|
@@ -7664,7 +7679,7 @@ skylake_get_initial_plane_config(struct intel_crtc *crtc,
|
|
|
aligned_height = intel_fb_align_height(dev, fb->height,
|
|
aligned_height = intel_fb_align_height(dev, fb->height,
|
|
|
plane_config->tiling);
|
|
plane_config->tiling);
|
|
|
|
|
|
|
|
- plane_config->size = ALIGN(fb->pitches[0] * aligned_height, PAGE_SIZE);
|
|
|
|
|
|
|
+ plane_config->size = fb->pitches[0] * aligned_height;
|
|
|
|
|
|
|
|
DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
|
DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
|
|
pipe_name(pipe), fb->width, fb->height,
|
|
pipe_name(pipe), fb->width, fb->height,
|
|
@@ -7755,7 +7770,7 @@ ironlake_get_initial_plane_config(struct intel_crtc *crtc,
|
|
|
aligned_height = intel_fb_align_height(dev, fb->height,
|
|
aligned_height = intel_fb_align_height(dev, fb->height,
|
|
|
plane_config->tiling);
|
|
plane_config->tiling);
|
|
|
|
|
|
|
|
- plane_config->size = PAGE_ALIGN(fb->pitches[0] * aligned_height);
|
|
|
|
|
|
|
+ plane_config->size = fb->pitches[0] * aligned_height;
|
|
|
|
|
|
|
|
DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
|
DRM_DEBUG_KMS("pipe %c with fb: size=%dx%d@%d, offset=%x, pitch %d, size 0x%x\n",
|
|
|
pipe_name(pipe), fb->width, fb->height,
|
|
pipe_name(pipe), fb->width, fb->height,
|
|
@@ -12182,9 +12197,6 @@ intel_check_cursor_plane(struct drm_plane *plane,
|
|
|
return -ENOMEM;
|
|
return -ENOMEM;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
- if (fb == crtc->cursor->fb)
|
|
|
|
|
- return 0;
|
|
|
|
|
-
|
|
|
|
|
/* we only need to pin inside GTT if cursor is non-phy */
|
|
/* we only need to pin inside GTT if cursor is non-phy */
|
|
|
mutex_lock(&dev->struct_mutex);
|
|
mutex_lock(&dev->struct_mutex);
|
|
|
if (!INTEL_INFO(dev)->cursor_needs_physical && obj->tiling_mode) {
|
|
if (!INTEL_INFO(dev)->cursor_needs_physical && obj->tiling_mode) {
|
|
@@ -13096,6 +13108,9 @@ static struct intel_quirk intel_quirks[] = {
|
|
|
|
|
|
|
|
/* HP Chromebook 14 (Celeron 2955U) */
|
|
/* HP Chromebook 14 (Celeron 2955U) */
|
|
|
{ 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
|
|
{ 0x0a06, 0x103c, 0x21ed, quirk_backlight_present },
|
|
|
|
|
+
|
|
|
|
|
+ /* Dell Chromebook 11 */
|
|
|
|
|
+ { 0x0a06, 0x1028, 0x0a35, quirk_backlight_present },
|
|
|
};
|
|
};
|
|
|
|
|
|
|
|
static void intel_init_quirks(struct drm_device *dev)
|
|
static void intel_init_quirks(struct drm_device *dev)
|