UBUNTU: SAUCE: drm/i915/display/psr: add a psr2 disable quirk table

BugLink: https://bugs.launchpad.net/bugs/2069993

This design refers to the Kai-Heng's work:
https://lists.ubuntu.com/archives/kernel-team/2023-February/137349.html

Signed-off-by: En-Wei Wu <en-wei.wu@canonical.com>
Acked-by: Aaron Jauregui <aaron.jauregui@canonical.com>
Acked-by: Kuan-Ying Lee <kuan-ying.lee@canonical.com>
Signed-off-by: Stefan Bader <stefan.bader@canonical.com>
This commit is contained in:
En-Wei Wu
2024-08-14 11:16:00 +02:00
committed by Stefan Bader
parent fe35c48a46
commit 28b1b9810d
3 changed files with 53 additions and 0 deletions
+11
View File
@@ -5508,6 +5508,17 @@ intel_dp_get_edid(struct intel_dp *intel_dp)
return drm_edid_read_ddc(&connector->base, &intel_dp->aux.ddc);
}
const struct edid *
intel_dp_fetch_edid(struct intel_dp *intel_dp)
{
const struct drm_edid * d_edid;
d_edid = intel_dp_get_edid(intel_dp);
if (d_edid)
return drm_edid_raw(d_edid);
return NULL;
}
static void
intel_dp_update_dfp(struct intel_dp *intel_dp,
const struct drm_edid *drm_edid)
+2
View File
@@ -187,4 +187,6 @@ intel_dp_compute_config_link_bpp_limits(struct intel_dp *intel_dp,
void intel_dp_get_dsc_sink_cap(u8 dpcd_rev, struct intel_connector *connector);
const struct edid *intel_dp_fetch_edid(struct intel_dp *intel_dp);
#endif /* __INTEL_DP_H__ */
+40
View File
@@ -24,6 +24,7 @@
#include <drm/drm_atomic_helper.h>
#include <drm/drm_damage_helper.h>
#include <drm/drm_debugfs.h>
#include <drm/drm_edid.h>
#include "i915_drv.h"
#include "i915_reg.h"
@@ -1015,11 +1016,50 @@ tgl_dc3co_exitline_compute_config(struct intel_dp *intel_dp,
crtc_state->dc3co_exitline = crtc_vdisplay - exit_scanlines;
}
struct edid_mfgid_prodcode {
u8 mfg_id0;
u8 mfg_id1;
u8 prod_code0;
u8 prod_code1;
};
#define PSR2_DISABLE_QUIRK_ENTRY(id0, id1, code0, code1) \
{ .mfg_id0 = (id0), .mfg_id1 = (id1), .prod_code0 = (code0), .prod_code1 = (code1) }
static struct edid_mfgid_prodcode psr2_disable_quirk_tbl[] = {
{ }
};
static bool is_edid_in_psr2_disable_quirk_tbl(struct intel_dp *intel_dp)
{
const struct edid *p_edid;
int i;
p_edid = intel_dp_fetch_edid(intel_dp);
if (p_edid) {
for (i = 0; i < ARRAY_SIZE(psr2_disable_quirk_tbl); i ++) {
if (p_edid->mfg_id[0] == psr2_disable_quirk_tbl[i].mfg_id0 &&
p_edid->mfg_id[1] == psr2_disable_quirk_tbl[i].mfg_id1 &&
p_edid->prod_code[0] == psr2_disable_quirk_tbl[i].prod_code0 &&
p_edid->prod_code[1] == psr2_disable_quirk_tbl[i].prod_code1)
return true;
}
}
return false;
}
static bool intel_psr2_sel_fetch_config_valid(struct intel_dp *intel_dp,
struct intel_crtc_state *crtc_state)
{
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
if (is_edid_in_psr2_disable_quirk_tbl(intel_dp)) {
drm_info_once(&dev_priv->drm,
"PSR2 sel fetch disabled by the edid quirk table\n");
return false;
}
if (!dev_priv->display.params.enable_psr2_sel_fetch &&
intel_dp->psr.debug != I915_PSR_DEBUG_ENABLE_SEL_FETCH) {
drm_dbg_kms(&dev_priv->drm,