diff --git a/drivers/gpu/drm/i915/display/intel_display_device.h b/drivers/gpu/drm/i915/display/intel_display_device.h index 11c2b2883f35..50b2e9ae2c18 100644 --- a/drivers/gpu/drm/i915/display/intel_display_device.h +++ b/drivers/gpu/drm/i915/display/intel_display_device.h @@ -149,7 +149,7 @@ struct intel_display_platforms { #define HAS_4TILE(__display) ((__display)->platform.dg2 || DISPLAY_VER(__display) >= 14) #define HAS_ASYNC_FLIPS(__display) (DISPLAY_VER(__display) >= 5) #define HAS_AS_SDP(__display) (DISPLAY_VER(__display) >= 13) -#define HAS_AUX_CCS(__display) (IS_DISPLAY_VER(__display, 9, 12) || (__display)->platform.alderlake_p || (__display)->platform.meteorlake) +#define HAS_AUX_DIST(__display) (IS_DISPLAY_VER(__display, 9, 12) || (__display)->platform.alderlake_p || (__display)->platform.meteorlake) #define HAS_BIGJOINER(__display) (DISPLAY_VER(__display) >= 11 && HAS_DSC(__display)) #define HAS_CASF(__display) (DISPLAY_VER(__display) >= 20) #define HAS_CDCLK_CRAWL(__display) (DISPLAY_INFO(__display)->has_cdclk_crawl) diff --git a/drivers/gpu/drm/i915/display/intel_fb.c b/drivers/gpu/drm/i915/display/intel_fb.c index b34b4961fe1c..5b8e02ca2faf 100644 --- a/drivers/gpu/drm/i915/display/intel_fb.c +++ b/drivers/gpu/drm/i915/display/intel_fb.c @@ -21,6 +21,7 @@ #include "intel_fb_bo.h" #include "intel_frontbuffer.h" #include "intel_panic.h" +#include "intel_parent.h" #include "intel_plane.h" #define check_array_bounds(display, a, i) drm_WARN_ON((display)->drm, (i) >= ARRAY_SIZE(a)) @@ -558,7 +559,7 @@ static bool plane_has_modifier(struct intel_display *display, * where supported. */ if (intel_fb_is_ccs_modifier(md->modifier) && - HAS_AUX_CCS(display) != !!md->ccs.packed_aux_planes) + intel_parent_has_auxccs(display) != !!md->ccs.packed_aux_planes) return false; if (md->modifier == I915_FORMAT_MOD_4_TILED_BMG_CCS && diff --git a/drivers/gpu/drm/i915/display/intel_parent.c b/drivers/gpu/drm/i915/display/intel_parent.c index d16163007545..1d7bee7d2ccd 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.c +++ b/drivers/gpu/drm/i915/display/intel_parent.c @@ -170,3 +170,8 @@ void intel_parent_fence_priority_display(struct intel_display *display, struct d if (display->parent->fence_priority_display) display->parent->fence_priority_display(fence); } + +bool intel_parent_has_auxccs(struct intel_display *display) +{ + return display->parent->has_auxccs && display->parent->has_auxccs(display->drm); +} diff --git a/drivers/gpu/drm/i915/display/intel_parent.h b/drivers/gpu/drm/i915/display/intel_parent.h index bc740dfad985..1bb584d850e5 100644 --- a/drivers/gpu/drm/i915/display/intel_parent.h +++ b/drivers/gpu/drm/i915/display/intel_parent.h @@ -52,4 +52,6 @@ bool intel_parent_has_fenced_regions(struct intel_display *display); void intel_parent_fence_priority_display(struct intel_display *display, struct dma_fence *fence); +bool intel_parent_has_auxccs(struct intel_display *display); + #endif /* __INTEL_PARENT_H__ */ diff --git a/drivers/gpu/drm/i915/display/skl_universal_plane.c b/drivers/gpu/drm/i915/display/skl_universal_plane.c index 6cd94f400e3f..40148d225410 100644 --- a/drivers/gpu/drm/i915/display/skl_universal_plane.c +++ b/drivers/gpu/drm/i915/display/skl_universal_plane.c @@ -22,6 +22,7 @@ #include "intel_fbc.h" #include "intel_frontbuffer.h" #include "intel_panic.h" +#include "intel_parent.h" #include "intel_plane.h" #include "intel_psr.h" #include "intel_psr_regs.h" @@ -1602,7 +1603,7 @@ icl_plane_update_noarm(struct intel_dsb *dsb, } /* FLAT CCS doesn't need to program AUX_DIST */ - if (HAS_AUX_CCS(display)) + if (HAS_AUX_DIST(display)) intel_de_write_dsb(display, dsb, PLANE_AUX_DIST(pipe, plane_id), skl_plane_aux_dist(plane_state, color_plane)); @@ -2972,12 +2973,6 @@ skl_universal_plane_create(struct intel_display *display, else caps = skl_plane_caps(display, pipe, plane_id); - /* FIXME: xe has problems with AUX */ - if (!IS_ENABLED(I915) && HAS_AUX_CCS(display)) - caps &= ~(INTEL_PLANE_CAP_CCS_RC | - INTEL_PLANE_CAP_CCS_RC_CC | - INTEL_PLANE_CAP_CCS_MC); - modifiers = intel_fb_plane_get_modifiers(display, caps); ret = drm_universal_plane_init(display->drm, &plane->base, diff --git a/drivers/gpu/drm/i915/i915_driver.c b/drivers/gpu/drm/i915/i915_driver.c index fe84df4eae8f..0300a1df8bd2 100644 --- a/drivers/gpu/drm/i915/i915_driver.c +++ b/drivers/gpu/drm/i915/i915_driver.c @@ -757,6 +757,15 @@ static void fence_priority_display(struct dma_fence *fence) i915_gem_fence_wait_priority_display(fence); } +static bool has_auxccs(struct drm_device *drm) +{ + struct drm_i915_private *i915 = to_i915(drm); + + return IS_GRAPHICS_VER(i915, 9, 12) || + IS_ALDERLAKE_P(i915) || + IS_METEORLAKE(i915); +} + static const struct intel_display_parent_interface parent = { .hdcp = &i915_display_hdcp_interface, .rpm = &i915_display_rpm_interface, @@ -766,6 +775,7 @@ static const struct intel_display_parent_interface parent = { .vgpu_active = vgpu_active, .has_fenced_regions = has_fenced_regions, .fence_priority_display = fence_priority_display, + .has_auxccs = has_auxccs, }; const struct intel_display_parent_interface *i915_driver_parent_interface(void) diff --git a/include/drm/intel/display_parent_interface.h b/include/drm/intel/display_parent_interface.h index cc13b2ce1324..9733c508ad4c 100644 --- a/include/drm/intel/display_parent_interface.h +++ b/include/drm/intel/display_parent_interface.h @@ -100,6 +100,9 @@ struct intel_display_parent_interface { /** @fence_priority_display: Set display priority. Optional. */ void (*fence_priority_display)(struct dma_fence *fence); + + /** @has_auxcss: Are AuxCCS formats supported by the parent. Optional. */ + bool (*has_auxccs)(struct drm_device *drm); }; #endif