drm/i915: Reorganize intel_rotation_info
Throw out a bunch of unnecessary stuff from struct intel_rotation_info, and pull most of the remaining stuff to live under an array of per-color plane sub-structures. What still remains outside the sub-structure will be reorgranized later as well, but that requires more work elsewhere so leave it be for now. v2: Split the vma size == luma+chroma size fix to prep patch (Daniel) Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com> Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch> (v1) Link: http://patchwork.freedesktop.org/patch/msgid/1455569699-27905-8-git-send-email-ville.syrjala@linux.intel.com
This commit is contained in:
parent
4f2d9934bd
commit
1663b9d6a2
|
@ -3405,7 +3405,7 @@ static struct sg_table *
|
|||
intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
|
||||
struct drm_i915_gem_object *obj)
|
||||
{
|
||||
unsigned int size_pages = rot_info->size >> PAGE_SHIFT;
|
||||
unsigned int size_pages = rot_info->plane[0].width * rot_info->plane[0].height;
|
||||
unsigned int size_pages_uv;
|
||||
struct sg_page_iter sg_iter;
|
||||
unsigned long i;
|
||||
|
@ -3423,7 +3423,7 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
|
|||
|
||||
/* Account for UV plane with NV12. */
|
||||
if (rot_info->pixel_format == DRM_FORMAT_NV12)
|
||||
size_pages_uv = rot_info->size_uv >> PAGE_SHIFT;
|
||||
size_pages_uv = rot_info->plane[1].width * rot_info->plane[1].height;
|
||||
else
|
||||
size_pages_uv = 0;
|
||||
|
||||
|
@ -3445,9 +3445,9 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
|
|||
|
||||
/* Rotate the pages. */
|
||||
sg = rotate_pages(page_addr_list, 0,
|
||||
rot_info->width_pages, rot_info->height_pages,
|
||||
rot_info->width_pages,
|
||||
st, NULL);
|
||||
rot_info->plane[0].width, rot_info->plane[0].height,
|
||||
rot_info->plane[0].width,
|
||||
st, NULL);
|
||||
|
||||
/* Append the UV plane if NV12. */
|
||||
if (rot_info->pixel_format == DRM_FORMAT_NV12) {
|
||||
|
@ -3459,18 +3459,15 @@ intel_rotate_fb_obj_pages(struct intel_rotation_info *rot_info,
|
|||
|
||||
rot_info->uv_start_page = uv_start_page;
|
||||
|
||||
rotate_pages(page_addr_list, uv_start_page,
|
||||
rot_info->width_pages_uv,
|
||||
rot_info->height_pages_uv,
|
||||
rot_info->width_pages_uv,
|
||||
rotate_pages(page_addr_list, rot_info->uv_start_page,
|
||||
rot_info->plane[1].width, rot_info->plane[1].height,
|
||||
rot_info->plane[1].width,
|
||||
st, sg);
|
||||
}
|
||||
|
||||
DRM_DEBUG_KMS(
|
||||
"Created rotated page mapping for object size %zu (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 0)).\n",
|
||||
obj->base.size, rot_info->pitch, rot_info->height,
|
||||
rot_info->pixel_format, rot_info->width_pages,
|
||||
rot_info->height_pages, size_pages + size_pages_uv,
|
||||
DRM_DEBUG_KMS("Created rotated page mapping for object size %zu (%ux%u tiles, %u pages (%u plane 0)).\n",
|
||||
obj->base.size, rot_info->plane[0].width,
|
||||
rot_info->plane[0].height, size_pages + size_pages_uv,
|
||||
size_pages);
|
||||
|
||||
drm_free_large(page_addr_list);
|
||||
|
@ -3482,11 +3479,9 @@ err_sg_alloc:
|
|||
err_st_alloc:
|
||||
drm_free_large(page_addr_list);
|
||||
|
||||
DRM_DEBUG_KMS(
|
||||
"Failed to create rotated mapping for object size %zu! (%d) (pitch=%u, height=%u, pixel_format=0x%x, %ux%u tiles, %u pages (%u plane 0))\n",
|
||||
obj->base.size, ret, rot_info->pitch, rot_info->height,
|
||||
rot_info->pixel_format, rot_info->width_pages,
|
||||
rot_info->height_pages, size_pages + size_pages_uv,
|
||||
DRM_DEBUG_KMS("Failed to create rotated mapping for object size %zu! (%d) (%ux%u tiles, %u pages (%u plane 0))\n",
|
||||
obj->base.size, ret, rot_info->plane[0].width,
|
||||
rot_info->plane[0].height, size_pages + size_pages_uv,
|
||||
size_pages);
|
||||
return ERR_PTR(ret);
|
||||
}
|
||||
|
@ -3634,7 +3629,7 @@ i915_ggtt_view_size(struct drm_i915_gem_object *obj,
|
|||
if (view->type == I915_GGTT_VIEW_NORMAL) {
|
||||
return obj->base.size;
|
||||
} else if (view->type == I915_GGTT_VIEW_ROTATED) {
|
||||
return view->params.rotated.size + view->params.rotated.size_uv;
|
||||
return intel_rotation_info_size(&view->params.rotated) << PAGE_SHIFT;
|
||||
} else if (view->type == I915_GGTT_VIEW_PARTIAL) {
|
||||
return view->params.partial.size << PAGE_SHIFT;
|
||||
} else {
|
||||
|
|
|
@ -135,16 +135,13 @@ enum i915_ggtt_view_type {
|
|||
};
|
||||
|
||||
struct intel_rotation_info {
|
||||
unsigned int height;
|
||||
unsigned int pitch;
|
||||
unsigned int uv_offset;
|
||||
uint32_t pixel_format;
|
||||
uint64_t fb_modifier;
|
||||
unsigned int width_pages, height_pages;
|
||||
uint64_t size;
|
||||
unsigned int width_pages_uv, height_pages_uv;
|
||||
uint64_t size_uv;
|
||||
unsigned int uv_start_page;
|
||||
struct {
|
||||
/* tiles */
|
||||
unsigned int width, height;
|
||||
} plane[2];
|
||||
};
|
||||
|
||||
struct i915_ggtt_view {
|
||||
|
|
|
@ -2296,6 +2296,17 @@ intel_fb_align_height(struct drm_device *dev, unsigned int height,
|
|||
return ALIGN(height, tile_height);
|
||||
}
|
||||
|
||||
unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info)
|
||||
{
|
||||
unsigned int size = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0 ; i < ARRAY_SIZE(rot_info->plane); i++)
|
||||
size += rot_info->plane[i].width * rot_info->plane[i].height;
|
||||
|
||||
return size;
|
||||
}
|
||||
|
||||
static void
|
||||
intel_fill_fb_ggtt_view(struct i915_ggtt_view *view,
|
||||
const struct drm_framebuffer *fb,
|
||||
|
@ -2312,11 +2323,7 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view,
|
|||
|
||||
*view = i915_ggtt_view_rotated;
|
||||
|
||||
info->height = fb->height;
|
||||
info->pixel_format = fb->pixel_format;
|
||||
info->pitch = fb->pitches[0];
|
||||
info->uv_offset = fb->offsets[1];
|
||||
info->fb_modifier = fb->modifier[0];
|
||||
|
||||
tile_size = intel_tile_size(dev_priv);
|
||||
|
||||
|
@ -2324,18 +2331,16 @@ intel_fill_fb_ggtt_view(struct i915_ggtt_view *view,
|
|||
intel_tile_dims(dev_priv, &tile_width, &tile_height,
|
||||
fb->modifier[0], cpp);
|
||||
|
||||
info->width_pages = DIV_ROUND_UP(fb->pitches[0], tile_width * cpp);
|
||||
info->height_pages = DIV_ROUND_UP(fb->height, tile_height);
|
||||
info->size = info->width_pages * info->height_pages * tile_size;
|
||||
info->plane[0].width = DIV_ROUND_UP(fb->pitches[0], tile_width * cpp);
|
||||
info->plane[0].height = DIV_ROUND_UP(fb->height, tile_height);
|
||||
|
||||
if (info->pixel_format == DRM_FORMAT_NV12) {
|
||||
cpp = drm_format_plane_cpp(fb->pixel_format, 1);
|
||||
intel_tile_dims(dev_priv, &tile_width, &tile_height,
|
||||
fb->modifier[1], cpp);
|
||||
|
||||
info->width_pages_uv = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp);
|
||||
info->height_pages_uv = DIV_ROUND_UP(fb->height / 2, tile_height);
|
||||
info->size_uv = info->width_pages_uv * info->height_pages_uv * tile_size;
|
||||
info->plane[1].width = DIV_ROUND_UP(fb->pitches[1], tile_width * cpp);
|
||||
info->plane[1].height = DIV_ROUND_UP(fb->height / 2, tile_height);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -1082,6 +1082,7 @@ void i915_audio_component_cleanup(struct drm_i915_private *dev_priv);
|
|||
|
||||
/* intel_display.c */
|
||||
extern const struct drm_plane_funcs intel_plane_funcs;
|
||||
unsigned int intel_rotation_info_size(const struct intel_rotation_info *rot_info);
|
||||
bool intel_has_pending_fb_unpin(struct drm_device *dev);
|
||||
int intel_pch_rawclk(struct drm_device *dev);
|
||||
int intel_hrawclk(struct drm_device *dev);
|
||||
|
|
Loading…
Reference in New Issue