Adds frame buffer support code for flat-CCS devices, like DG2. A flat-CCS modifier is attached to a fb object that contains the original bo by means of the drmModeAddFB2WithModifiers drm API call. Signed-off-by: Adrian Larumbe <adrian.larumbe@xxxxxxxxxxxxx> --- drivers/gpu/drm/i915/display/intel_fb.c | 36 ++++++++++++++++++++++--- drivers/gpu/drm/i915/display/intel_fb.h | 1 + 2 files changed, 33 insertions(+), 4 deletions(-) diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index 72040f580911..6f998d1956bb 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -158,19 +158,24 @@ static const struct intel_modifier_desc intel_modifiers[] = { { .modifier = I915_FORMAT_MOD_4_TILED_DG2_MC_CCS, .display_ver = { 13, 14 }, - .plane_caps = INTEL_PLANE_CAP_TILING_4 | INTEL_PLANE_CAP_CCS_MC, + .plane_caps = INTEL_PLANE_CAP_TILING_4 | + INTEL_PLANE_CAP_CCS_MC | + INTEL_PLANE_CAP_DG2_CCS, }, { .modifier = I915_FORMAT_MOD_4_TILED_DG2_RC_CCS_CC, .display_ver = { 13, 14 }, - .plane_caps = INTEL_PLANE_CAP_TILING_4 | INTEL_PLANE_CAP_CCS_RC_CC, - + .plane_caps = INTEL_PLANE_CAP_TILING_4 | + INTEL_PLANE_CAP_CCS_RC_CC | + INTEL_PLANE_CAP_DG2_CCS, .ccs.cc_planes = BIT(1), FORMAT_OVERRIDE(gen12_flat_ccs_cc_formats), }, { .modifier = I915_FORMAT_MOD_4_TILED_DG2_RC_CCS, .display_ver = { 13, 14 }, - .plane_caps = INTEL_PLANE_CAP_TILING_4 | INTEL_PLANE_CAP_CCS_RC, + .plane_caps = INTEL_PLANE_CAP_TILING_4 | + INTEL_PLANE_CAP_CCS_RC | + INTEL_PLANE_CAP_DG2_CCS, }, { .modifier = I915_FORMAT_MOD_4_TILED, .display_ver = { 13, 14 }, @@ -313,6 +318,20 @@ bool intel_fb_is_ccs_modifier(u64 modifier) INTEL_PLANE_CAP_CCS_MASK); } +/** + * if (intel_fb_is_dg2_ccs_modifier): Check if a modifier is a DG2 CCS modifier type + * @modifier: Modifier to check + * + * Returns: + * Returns %true if @modifier is a render, render with color clear or + * media compression modifier compatible with DG2 devices. + */ +bool intel_fb_is_dg2_ccs_modifier(u64 modifier) +{ + return plane_caps_contain_any(lookup_modifier(modifier)->plane_caps, + INTEL_PLANE_CAP_DG2_CCS); +} + /** * intel_fb_is_rc_ccs_cc_modifier: Check if a modifier is an RC CCS CC modifier type * @modifier: Modifier to check @@ -2000,6 +2019,15 @@ int intel_framebuffer_init(struct intel_framebuffer *intel_fb, intel_fb->dpt_vm = vm; } + /* + * In devices with flat CCS support, a compressed buffer object + * will need to shuffle its CCS block back and forth between lmem + * and smem at object migration events. + */ + if (intel_fb_is_dg2_ccs_modifier(fb->modifier) && HAS_FLAT_CCS(dev_priv)) + if (!i915_gem_object_migratable(obj) && i915_gem_object_is_lmem(obj)) + obj->flat_css.enabled = true; + ret = drm_framebuffer_init(&dev_priv->drm, fb, &intel_fb_funcs); if (ret) { drm_err(&dev_priv->drm, "framebuffer init failed %d\n", ret); diff --git a/drivers/gpu/drm/i915/display/intel_fb.h b/drivers/gpu/drm/i915/display/intel_fb.h index 12386f13a4e0..5bd74ff9a449 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.h +++ b/drivers/gpu/drm/i915/display/intel_fb.h @@ -28,6 +28,7 @@ struct intel_plane_state; #define INTEL_PLANE_CAP_TILING_Y BIT(4) #define INTEL_PLANE_CAP_TILING_Yf BIT(5) #define INTEL_PLANE_CAP_TILING_4 BIT(6) +#define INTEL_PLANE_CAP_DG2_CCS BIT(7) bool intel_fb_is_ccs_modifier(u64 modifier); bool intel_fb_is_rc_ccs_cc_modifier(u64 modifier); -- 2.34.1