#define TRANS_DP2_CTL(trans) _MMIO_TRANS(trans, _TRANS_DP2_CTL_A, _TRANS_DP2_CTL_B)
#define TRANS_DP2_128B132B_CHANNEL_CODING REG_BIT(31)
#define TRANS_DP2_PANEL_REPLAY_ENABLE REG_BIT(30)
+#define TRANS_DP2_PR_TUNNELING_ENABLE REG_BIT(26)
#define TRANS_DP2_DEBUG_ENABLE REG_BIT(23)
#define _TRANS_DP2_VFREQHIGH_A 0x600a4
#include "intel_dmc.h"
#include "intel_dp.h"
#include "intel_dp_aux.h"
+#include "intel_dp_tunnel.h"
#include "intel_dsb.h"
#include "intel_frontbuffer.h"
#include "intel_hdmi.h"
return frames_before_su_entry;
}
+static bool intel_psr_allow_pr_bw_optimization(struct intel_dp *intel_dp)
+{
+ if (intel_dp_is_edp(intel_dp))
+ return false;
+
+ if (!intel_dp_tunnel_bw_alloc_is_enabled(intel_dp))
+ return false;
+
+ if (!intel_dp_tunnel_pr_optimization_supported(intel_dp))
+ return false;
+
+ return true;
+}
+
static void dg2_activate_panel_replay(struct intel_dp *intel_dp)
{
struct intel_display *display = to_intel_display(intel_dp);
struct intel_psr *psr = &intel_dp->psr;
enum transcoder cpu_transcoder = intel_dp->psr.transcoder;
+ u32 dp2_ctl_set = TRANS_DP2_PANEL_REPLAY_ENABLE;
+ u32 dp2_ctl_clear = 0;
if (intel_dp_is_edp(intel_dp) && psr->sel_update_enabled) {
u32 val = psr->su_region_et_enabled ?
val);
}
+ if (intel_psr_allow_pr_bw_optimization(intel_dp))
+ dp2_ctl_set |= TRANS_DP2_PR_TUNNELING_ENABLE;
+ else
+ dp2_ctl_clear = TRANS_DP2_PR_TUNNELING_ENABLE;
+
intel_de_rmw(display,
PSR2_MAN_TRK_CTL(display, intel_dp->psr.transcoder),
0, ADLP_PSR2_MAN_TRK_CTL_SF_CONTINUOS_FULL_FRAME);
- intel_de_rmw(display, TRANS_DP2_CTL(intel_dp->psr.transcoder), 0,
- TRANS_DP2_PANEL_REPLAY_ENABLE);
+ intel_de_rmw(display, TRANS_DP2_CTL(intel_dp->psr.transcoder), dp2_ctl_clear, dp2_ctl_set);
}
static void hsw_activate_psr2(struct intel_dp *intel_dp)