Skip to content

Commit 98d2f25

Browse files
StanFox1984mattrope
authored andcommitted
drm/i915: Implement Dbuf overlap detection feature starting from LNL
From LNL onwards there is a new hardware feature, which allows to detect if the driver wrongly allocated DBuf entries and they happen to overlap. If enabled this will cause a specific interrupt to occur. We now handle it in the driver, by writing correspondent error message to kernel log. v2: Initialize dbuf overlap flag in runtime_defaults (Jani Nikula) v3: Unmask the overlap detection interrupt (Uma) v4: use display over i915 (Jani Nikula) v5: Use display instead of dev_priv (Jani Nikula) v6: rebased to resolve merge conflicts Bspec: 69450, 69464 Signed-off-by: Stanislav Lisovskiy <stanislav.lisovskiy@intel.com> Signed-off-by: Vinod Govindapillai <vinod.govindapillai@intel.com> Reviewed-by: Mika Kahola <mika.kahola@intel.com> Signed-off-by: Matt Roper <matthew.d.roper@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/20241030103319.207235-1-vinod.govindapillai@intel.com
1 parent 1f12d63 commit 98d2f25

File tree

4 files changed

+19
-0
lines changed

4 files changed

+19
-0
lines changed

drivers/gpu/drm/i915/display/intel_display_device.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1314,6 +1314,7 @@ static const struct intel_display_device_info xe2_lpd_display = {
13141314
.__runtime_defaults.fbc_mask =
13151315
BIT(INTEL_FBC_A) | BIT(INTEL_FBC_B) |
13161316
BIT(INTEL_FBC_C) | BIT(INTEL_FBC_D),
1317+
.__runtime_defaults.has_dbuf_overlap_detection = true,
13171318
};
13181319

13191320
static const struct intel_display_device_info xe2_hpd_display = {
@@ -1784,6 +1785,10 @@ static void __intel_display_device_info_runtime_init(struct drm_i915_private *i9
17841785
if (IS_DISPLAY_VER(i915, 10, 12) &&
17851786
(dfsm & GLK_DFSM_DISPLAY_DSC_DISABLE))
17861787
display_runtime->has_dsc = 0;
1788+
1789+
if (DISPLAY_VER(display) >= 20 &&
1790+
(dfsm & XE2LPD_DFSM_DBUF_OVERLAP_DISABLE))
1791+
display_runtime->has_dbuf_overlap_detection = false;
17871792
}
17881793

17891794
if (DISPLAY_VER(i915) >= 20) {

drivers/gpu/drm/i915/display/intel_display_device.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,7 @@ struct intel_display_platforms {
143143
#define HAS_CDCLK_SQUASH(i915) (DISPLAY_INFO(i915)->has_cdclk_squash)
144144
#define HAS_CUR_FBC(i915) (!HAS_GMCH(i915) && IS_DISPLAY_VER(i915, 7, 13))
145145
#define HAS_D12_PLANE_MINIMIZATION(i915) (IS_ROCKETLAKE(i915) || IS_ALDERLAKE_S(i915))
146+
#define HAS_DBUF_OVERLAP_DETECTION(__i915) (DISPLAY_RUNTIME_INFO(__i915)->has_dbuf_overlap_detection)
146147
#define HAS_DDI(i915) (DISPLAY_INFO(i915)->has_ddi)
147148
#define HAS_DISPLAY(i915) (DISPLAY_RUNTIME_INFO(i915)->pipe_mask != 0)
148149
#define HAS_DMC(i915) (DISPLAY_RUNTIME_INFO(i915)->has_dmc)
@@ -248,6 +249,7 @@ struct intel_display_runtime_info {
248249
bool has_dmc;
249250
bool has_dsc;
250251
bool edp_typec_support;
252+
bool has_dbuf_overlap_detection;
251253
};
252254

253255
struct intel_display_device_info {

drivers/gpu/drm/i915/display/intel_display_irq.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -903,6 +903,13 @@ gen8_de_misc_irq_handler(struct drm_i915_private *dev_priv, u32 iir)
903903
struct intel_display *display = &dev_priv->display;
904904
bool found = false;
905905

906+
if (HAS_DBUF_OVERLAP_DETECTION(display)) {
907+
if (iir & XE2LPD_DBUF_OVERLAP_DETECTED) {
908+
drm_warn(display->drm, "DBuf overlap detected\n");
909+
found = true;
910+
}
911+
}
912+
906913
if (DISPLAY_VER(dev_priv) >= 14) {
907914
if (iir & (XELPDP_PMDEMAND_RSP |
908915
XELPDP_PMDEMAND_RSPTOUT_ERR)) {
@@ -1790,6 +1797,9 @@ void gen8_de_irq_postinstall(struct drm_i915_private *dev_priv)
17901797
de_port_masked |= DSI0_TE | DSI1_TE;
17911798
}
17921799

1800+
if (HAS_DBUF_OVERLAP_DETECTION(display))
1801+
de_misc_masked |= XE2LPD_DBUF_OVERLAP_DETECTED;
1802+
17931803
if (HAS_DSB(dev_priv))
17941804
de_pipe_masked |= GEN12_DSB_INT(INTEL_DSB_0) |
17951805
GEN12_DSB_INT(INTEL_DSB_1) |

drivers/gpu/drm/i915/i915_reg.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2589,6 +2589,7 @@
25892589
#define GEN8_DE_MISC_GSE REG_BIT(27)
25902590
#define GEN8_DE_EDP_PSR REG_BIT(19)
25912591
#define XELPDP_PMDEMAND_RSP REG_BIT(3)
2592+
#define XE2LPD_DBUF_OVERLAP_DETECTED REG_BIT(1)
25922593

25932594
#define GEN8_DE_MISC_IRQ_REGS I915_IRQ_REGS(GEN8_DE_MISC_IMR, \
25942595
GEN8_DE_MISC_IER, \
@@ -2895,6 +2896,7 @@
28952896
#define SKL_DFSM_PIPE_C_DISABLE (1 << 28)
28962897
#define TGL_DFSM_PIPE_D_DISABLE (1 << 22)
28972898
#define GLK_DFSM_DISPLAY_DSC_DISABLE (1 << 7)
2899+
#define XE2LPD_DFSM_DBUF_OVERLAP_DISABLE (1 << 3)
28982900

28992901
#define XE2LPD_DE_CAP _MMIO(0x41100)
29002902
#define XE2LPD_DE_CAP_3DLUT_MASK REG_GENMASK(31, 30)

0 commit comments

Comments
 (0)