drm/i915: Refactor intel_surf_alignment()
Pull the code to determine the surface alignment for both linear and tiled surfaces into a separate function intel_surf_alignment(). This will be used not only for the vma alignment but actually aligning the plane SURF once SKL+ starts using intel_compute_page_offset() (since SKL+ needs >4K alignment for tiled surfaces too). Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> Link: http://patchwork.freedesktop.org/patch/msgid/1452625717-9713-8-git-send-email-ville.syrjala@linux.intel.com
This commit is contained in:
Родитель
ce1e5c140c
Коммит
603525d722
|
@ -2330,7 +2330,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view, struct drm_framebuffer *fb,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
static unsigned int intel_linear_alignment(struct drm_i915_private *dev_priv)
|
static unsigned int intel_linear_alignment(const struct drm_i915_private *dev_priv)
|
||||||
{
|
{
|
||||||
if (INTEL_INFO(dev_priv)->gen >= 9)
|
if (INTEL_INFO(dev_priv)->gen >= 9)
|
||||||
return 256 * 1024;
|
return 256 * 1024;
|
||||||
|
@ -2343,6 +2343,25 @@ static unsigned int intel_linear_alignment(struct drm_i915_private *dev_priv)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static unsigned int intel_surf_alignment(const struct drm_i915_private *dev_priv,
|
||||||
|
uint64_t fb_modifier)
|
||||||
|
{
|
||||||
|
switch (fb_modifier) {
|
||||||
|
case DRM_FORMAT_MOD_NONE:
|
||||||
|
return intel_linear_alignment(dev_priv);
|
||||||
|
case I915_FORMAT_MOD_X_TILED:
|
||||||
|
if (INTEL_INFO(dev_priv)->gen >= 9)
|
||||||
|
return 256 * 1024;
|
||||||
|
return 0;
|
||||||
|
case I915_FORMAT_MOD_Y_TILED:
|
||||||
|
case I915_FORMAT_MOD_Yf_TILED:
|
||||||
|
return 1 * 1024 * 1024;
|
||||||
|
default:
|
||||||
|
MISSING_CASE(fb_modifier);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
intel_pin_and_fence_fb_obj(struct drm_plane *plane,
|
intel_pin_and_fence_fb_obj(struct drm_plane *plane,
|
||||||
struct drm_framebuffer *fb,
|
struct drm_framebuffer *fb,
|
||||||
|
@ -2357,29 +2376,7 @@ intel_pin_and_fence_fb_obj(struct drm_plane *plane,
|
||||||
|
|
||||||
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
|
WARN_ON(!mutex_is_locked(&dev->struct_mutex));
|
||||||
|
|
||||||
switch (fb->modifier[0]) {
|
alignment = intel_surf_alignment(dev_priv, fb->modifier[0]);
|
||||||
case DRM_FORMAT_MOD_NONE:
|
|
||||||
alignment = intel_linear_alignment(dev_priv);
|
|
||||||
break;
|
|
||||||
case I915_FORMAT_MOD_X_TILED:
|
|
||||||
if (INTEL_INFO(dev)->gen >= 9)
|
|
||||||
alignment = 256 * 1024;
|
|
||||||
else {
|
|
||||||
/* pin() will align the object as required by fence */
|
|
||||||
alignment = 0;
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case I915_FORMAT_MOD_Y_TILED:
|
|
||||||
case I915_FORMAT_MOD_Yf_TILED:
|
|
||||||
if (WARN_ONCE(INTEL_INFO(dev)->gen < 9,
|
|
||||||
"Y tiling bo slipped through, driver bug!\n"))
|
|
||||||
return -EINVAL;
|
|
||||||
alignment = 1 * 1024 * 1024;
|
|
||||||
break;
|
|
||||||
default:
|
|
||||||
MISSING_CASE(fb->modifier[0]);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
intel_fill_fb_ggtt_view(&view, fb, plane_state);
|
intel_fill_fb_ggtt_view(&view, fb, plane_state);
|
||||||
|
|
||||||
|
|
Загрузка…
Ссылка в новой задаче