Commit 13f2cb9a authored by Dhinakaran Pandiyan's avatar Dhinakaran Pandiyan Committed by Imre Deak

drm/i915: Extract framebufer CCS offset checks into a function

intel_fill_fb_info() has grown quite large and wrapping the offset checks
into a separate function makes the loop a bit easier to follow.

v2: Skip the check for non-CCS planes. (Mika)

Cc: Ville Syrjälä <ville.syrjala@linux.intel.com>
Cc: Matt Roper <matthew.d.roper@intel.com>
Cc: Mika Kahola <mika.kahola@intel.com>
Signed-off-by: default avatarDhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarMika Kahola <mika.kahola@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20191221120543.22816-4-imre.deak@intel.com
parent 86f236bb
...@@ -2678,43 +2678,20 @@ static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state) ...@@ -2678,43 +2678,20 @@ static bool intel_plane_needs_remap(const struct intel_plane_state *plane_state)
} }
static int static int
intel_fill_fb_info(struct drm_i915_private *dev_priv, intel_fb_check_ccs_xy(struct drm_framebuffer *fb, int ccs_plane, int x, int y)
struct drm_framebuffer *fb)
{ {
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb); struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
struct intel_rotation_info *rot_info = &intel_fb->rot_info;
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
u32 gtt_offset_rotated = 0;
unsigned int max_size = 0;
int i, num_planes = fb->format->num_planes;
unsigned int tile_size = intel_tile_size(dev_priv);
for (i = 0; i < num_planes; i++) {
unsigned int width, height;
unsigned int cpp, size;
u32 offset;
int x, y;
int ret;
cpp = fb->format->cpp[i];
width = drm_framebuffer_plane_width(fb->width, fb, i);
height = drm_framebuffer_plane_height(fb->height, fb, i);
ret = intel_fb_offset_to_xy(&x, &y, fb, i);
if (ret) {
DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
i, fb->offsets[i]);
return ret;
}
if (is_ccs_modifier(fb->modifier) && i == 1) {
int hsub = fb->format->hsub; int hsub = fb->format->hsub;
int vsub = fb->format->vsub; int vsub = fb->format->vsub;
int tile_width, tile_height; int tile_width, tile_height;
int main_x, main_y;
int ccs_x, ccs_y; int ccs_x, ccs_y;
int main_x, main_y;
if (!is_ccs_modifier(fb->modifier) || ccs_plane != 1)
return 0;
intel_tile_dims(fb, 1, &tile_width, &tile_height);
intel_tile_dims(fb, i, &tile_width, &tile_height);
tile_width *= hsub; tile_width *= hsub;
tile_height *= vsub; tile_height *= vsub;
...@@ -2736,8 +2713,44 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv, ...@@ -2736,8 +2713,44 @@ intel_fill_fb_info(struct drm_i915_private *dev_priv,
x, y); x, y);
return -EINVAL; return -EINVAL;
} }
return 0;
}
static int
intel_fill_fb_info(struct drm_i915_private *dev_priv,
struct drm_framebuffer *fb)
{
struct intel_framebuffer *intel_fb = to_intel_framebuffer(fb);
struct intel_rotation_info *rot_info = &intel_fb->rot_info;
struct drm_i915_gem_object *obj = intel_fb_obj(fb);
u32 gtt_offset_rotated = 0;
unsigned int max_size = 0;
int i, num_planes = fb->format->num_planes;
unsigned int tile_size = intel_tile_size(dev_priv);
for (i = 0; i < num_planes; i++) {
unsigned int width, height;
unsigned int cpp, size;
u32 offset;
int x, y;
int ret;
cpp = fb->format->cpp[i];
width = drm_framebuffer_plane_width(fb->width, fb, i);
height = drm_framebuffer_plane_height(fb->height, fb, i);
ret = intel_fb_offset_to_xy(&x, &y, fb, i);
if (ret) {
DRM_DEBUG_KMS("bad fb plane %d offset: 0x%x\n",
i, fb->offsets[i]);
return ret;
} }
ret = intel_fb_check_ccs_xy(fb, i, x, y);
if (ret)
return ret;
/* /*
* The fence (if used) is aligned to the start of the object * The fence (if used) is aligned to the start of the object
* so having the framebuffer wrap around across the edge of the * so having the framebuffer wrap around across the edge of the
......
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