Commit 0da2f826 authored by Mika Kuoppala's avatar Mika Kuoppala Committed by Greg Kroah-Hartman

drm/i915: Avoid pointer arithmetic in calculating plane surface offset

commit 44eb0cb9 upstream.

VMA offsets are 64 bits. Plane surface offsets are in ggtt and
the hardware register to set this is thus 32 bits. Be explicit
about these and convert carefully to from vma to final size.

This will make sparse happy by not creating 32bit pointers out
of 64bit vma offsets.

Cc: Tvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: default avatarMika Kuoppala <mika.kuoppala@intel.com>
Link: http://patchwork.freedesktop.org/patch/msgid/1446204375-29831-1-git-send-email-mika.kuoppala@intel.comReviewed-by: default avatarTvrtko Ursulin <tvrtko.ursulin@intel.com>
Signed-off-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent 3314f1f6
...@@ -2950,13 +2950,13 @@ u32 intel_fb_stride_alignment(struct drm_device *dev, uint64_t fb_modifier, ...@@ -2950,13 +2950,13 @@ u32 intel_fb_stride_alignment(struct drm_device *dev, uint64_t fb_modifier,
} }
} }
unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, u32 intel_plane_obj_offset(struct intel_plane *intel_plane,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
unsigned int plane) unsigned int plane)
{ {
const struct i915_ggtt_view *view = &i915_ggtt_view_normal; const struct i915_ggtt_view *view = &i915_ggtt_view_normal;
struct i915_vma *vma; struct i915_vma *vma;
unsigned char *offset; u64 offset;
if (intel_rotation_90_or_270(intel_plane->base.state->rotation)) if (intel_rotation_90_or_270(intel_plane->base.state->rotation))
view = &i915_ggtt_view_rotated; view = &i915_ggtt_view_rotated;
...@@ -2966,14 +2966,16 @@ unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, ...@@ -2966,14 +2966,16 @@ unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane,
view->type)) view->type))
return -1; return -1;
offset = (unsigned char *)vma->node.start; offset = vma->node.start;
if (plane == 1) { if (plane == 1) {
offset += vma->ggtt_view.rotation_info.uv_start_page * offset += vma->ggtt_view.rotation_info.uv_start_page *
PAGE_SIZE; PAGE_SIZE;
} }
return (unsigned long)offset; WARN_ON(upper_32_bits(offset));
return lower_32_bits(offset);
} }
static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id) static void skl_detach_scaler(struct intel_crtc *intel_crtc, int id)
...@@ -3099,7 +3101,7 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc, ...@@ -3099,7 +3101,7 @@ static void skylake_update_primary_plane(struct drm_crtc *crtc,
u32 tile_height, plane_offset, plane_size; u32 tile_height, plane_offset, plane_size;
unsigned int rotation; unsigned int rotation;
int x_offset, y_offset; int x_offset, y_offset;
unsigned long surf_addr; u32 surf_addr;
struct intel_crtc_state *crtc_state = intel_crtc->config; struct intel_crtc_state *crtc_state = intel_crtc->config;
struct intel_plane_state *plane_state; struct intel_plane_state *plane_state;
int src_x = 0, src_y = 0, src_w = 0, src_h = 0; int src_x = 0, src_y = 0, src_w = 0, src_h = 0;
......
...@@ -1177,9 +1177,9 @@ void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file); ...@@ -1177,9 +1177,9 @@ void intel_modeset_preclose(struct drm_device *dev, struct drm_file *file);
int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state); int skl_update_scaler_crtc(struct intel_crtc_state *crtc_state);
int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state); int skl_max_scale(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state);
unsigned long intel_plane_obj_offset(struct intel_plane *intel_plane, u32 intel_plane_obj_offset(struct intel_plane *intel_plane,
struct drm_i915_gem_object *obj, struct drm_i915_gem_object *obj,
unsigned int plane); unsigned int plane);
u32 skl_plane_ctl_format(uint32_t pixel_format); u32 skl_plane_ctl_format(uint32_t pixel_format);
u32 skl_plane_ctl_tiling(uint64_t fb_modifier); u32 skl_plane_ctl_tiling(uint64_t fb_modifier);
......
...@@ -195,7 +195,7 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc, ...@@ -195,7 +195,7 @@ skl_update_plane(struct drm_plane *drm_plane, struct drm_crtc *crtc,
int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0); int pixel_size = drm_format_plane_cpp(fb->pixel_format, 0);
const struct drm_intel_sprite_colorkey *key = const struct drm_intel_sprite_colorkey *key =
&to_intel_plane_state(drm_plane->state)->ckey; &to_intel_plane_state(drm_plane->state)->ckey;
unsigned long surf_addr; u32 surf_addr;
u32 tile_height, plane_offset, plane_size; u32 tile_height, plane_offset, plane_size;
unsigned int rotation; unsigned int rotation;
int x_offset, y_offset; int x_offset, y_offset;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment