Commit aad24cc4 authored by Imre Deak's avatar Imre Deak

drm/i915: Use tile block based dimensions for CCS origin x, y check

The tile size for all surface types is 4 kbyte (or 2 kbyte on old
platforms), with the exception of the TGL/ADL CCS surface where the tile
size is 64 bytes. To be able to remap CCS FBs the CCS surface tile needs
to be defined as 4 kbyte as well (the granularity of GTT pages in a
remapped view).

The only place using the dimension of the 64 byte CCS area is the initial
check for the main vs. CCS plane origin coordinate match. To prepare for
adding support for remapping CCS FBs let's call the 64 byte CCS area a
'tile block' and add a helper to retrieve the dimensions for it.

No functional change.

Cc: Juha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Reviewed-by: default avatarJuha-Pekka Heikkila <juhapekka.heikkila@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20210906182715.3915100-2-imre.deak@intel.com
parent 52913626
...@@ -143,14 +143,14 @@ intel_tile_width_bytes(const struct drm_framebuffer *fb, int color_plane) ...@@ -143,14 +143,14 @@ intel_tile_width_bytes(const struct drm_framebuffer *fb, int color_plane)
unsigned int intel_tile_height(const struct drm_framebuffer *fb, int color_plane) unsigned int intel_tile_height(const struct drm_framebuffer *fb, int color_plane)
{ {
if (is_gen12_ccs_plane(fb, color_plane))
return 1;
return intel_tile_size(to_i915(fb->dev)) / return intel_tile_size(to_i915(fb->dev)) /
intel_tile_width_bytes(fb, color_plane); intel_tile_width_bytes(fb, color_plane);
} }
/* Return the tile dimensions in pixel units */ /*
* Return the tile dimensions in pixel units, based on the (2 or 4 kbyte) GTT
* page tile size.
*/
static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane, static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane,
unsigned int *tile_width, unsigned int *tile_width,
unsigned int *tile_height) unsigned int *tile_height)
...@@ -162,6 +162,21 @@ static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane, ...@@ -162,6 +162,21 @@ static void intel_tile_dims(const struct drm_framebuffer *fb, int color_plane,
*tile_height = intel_tile_height(fb, color_plane); *tile_height = intel_tile_height(fb, color_plane);
} }
/*
* Return the tile dimensions in pixel units, based on the tile block size.
* The block covers the full GTT page sized tile on all tiled surfaces and
* it's a 64 byte portion of the tile on TGL+ CCS surfaces.
*/
static void intel_tile_block_dims(const struct drm_framebuffer *fb, int color_plane,
unsigned int *tile_width,
unsigned int *tile_height)
{
intel_tile_dims(fb, color_plane, tile_width, tile_height);
if (is_gen12_ccs_plane(fb, color_plane))
*tile_height = 1;
}
unsigned int intel_tile_row_size(const struct drm_framebuffer *fb, int color_plane) unsigned int intel_tile_row_size(const struct drm_framebuffer *fb, int color_plane)
{ {
unsigned int tile_width, tile_height; unsigned int tile_width, tile_height;
...@@ -567,7 +582,12 @@ static int intel_fb_check_ccs_xy(const struct drm_framebuffer *fb, int ccs_plane ...@@ -567,7 +582,12 @@ static int intel_fb_check_ccs_xy(const struct drm_framebuffer *fb, int ccs_plane
if (!is_ccs_plane(fb, ccs_plane) || is_gen12_ccs_cc_plane(fb, ccs_plane)) if (!is_ccs_plane(fb, ccs_plane) || is_gen12_ccs_cc_plane(fb, ccs_plane))
return 0; return 0;
intel_tile_dims(fb, ccs_plane, &tile_width, &tile_height); /*
* While all the tile dimensions are based on a 2k or 4k GTT page size
* here the main and CCS coordinates must match only within a (64 byte
* on TGL+) block inside the tile.
*/
intel_tile_block_dims(fb, ccs_plane, &tile_width, &tile_height);
intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane); intel_fb_plane_get_subsampling(&hsub, &vsub, fb, ccs_plane);
tile_width *= hsub; tile_width *= hsub;
......
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