mirror of
https://github.com/torvalds/linux.git
synced 2024-11-10 06:01:57 +00:00
- Fix probe on 'nomodeset and deprecate i915.modeset=0 (Jani)
- Update new entries in VBT BDB block definitions (Dnyaneshwar) - Fix clang build (Andy Shevchenko) - More clean up on drvdata usage in display code (Jani) - Increase fastwake DP sync pulse count as a quirk (Jouni) -----BEGIN PGP SIGNATURE----- iQEzBAABCAAdFiEEbSBwaO7dZQkcLOKj+mJfZA7rE8oFAmbXKXsACgkQ+mJfZA7r E8qs/AgAjQydIri2k/rDewOlG7xpQhQC4KWdXaa3vifXRHKNV7EqrkD68+v2DPI2 5AzDBMN1iUcnooYXFMj7gyHE/3QdbHAt7ouUaAtROZ30FirkqMZur09u6w/ek09P Rv9f0HOeT86S8++f+IJqGxm/MPs0VxfgMwlx+Vo2q8eKJyAXkgOREK7Pwc4bEMS3 vTJSPlDzrjnYmsmu07D+V/7BjZfFsacKFqPibI/ltWqrlJTvno/8w2QdYdkaGhUG qp0PBuZruZOZMBVWLwZPncwKiZXHXUy1ezfY4cJsFMo+r7ZnUMR6SgL2/UKIXo8F z3LqvmAVhFJm2FPB5A1FjUkmk/srNA== =T3+y -----END PGP SIGNATURE----- Merge tag 'drm-intel-next-2024-09-03' of https://gitlab.freedesktop.org/drm/i915/kernel into drm-next - Fix probe on 'nomodeset and deprecate i915.modeset=0 (Jani) - Update new entries in VBT BDB block definitions (Dnyaneshwar) - Fix clang build (Andy Shevchenko) - More clean up on drvdata usage in display code (Jani) - Increase fastwake DP sync pulse count as a quirk (Jouni) Signed-off-by: Dave Airlie <airlied@redhat.com> From: Rodrigo Vivi <rodrigo.vivi@intel.com> Link: https://patchwork.freedesktop.org/patch/msgid/ZtcqaxYKgA5F7BXT@intel.com
This commit is contained in:
commit
eb7205b7cb
@ -89,6 +89,7 @@ void g4x_dp_set_clock(struct intel_encoder *encoder,
|
||||
static void intel_dp_prepare(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
enum port port = encoder->port;
|
||||
@ -118,7 +119,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
|
||||
/* Preserve the BIOS-computed detected bit. This is
|
||||
* supposed to be read-only.
|
||||
*/
|
||||
intel_dp->DP = intel_de_read(dev_priv, intel_dp->output_reg) & DP_DETECTED;
|
||||
intel_dp->DP = intel_de_read(display, intel_dp->output_reg) & DP_DETECTED;
|
||||
|
||||
/* Handle DP bits in common between all three register formats */
|
||||
intel_dp->DP |= DP_VOLTAGE_0_4 | DP_PRE_EMPHASIS_0;
|
||||
@ -140,7 +141,7 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
|
||||
} else if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
|
||||
intel_dp->DP |= DP_LINK_TRAIN_OFF_CPT;
|
||||
|
||||
intel_de_rmw(dev_priv, TRANS_DP_CTL(crtc->pipe),
|
||||
intel_de_rmw(display, TRANS_DP_CTL(crtc->pipe),
|
||||
TRANS_DP_ENH_FRAMING,
|
||||
pipe_config->enhanced_framing ?
|
||||
TRANS_DP_ENH_FRAMING : 0);
|
||||
@ -166,9 +167,10 @@ static void intel_dp_prepare(struct intel_encoder *encoder,
|
||||
|
||||
static void assert_dp_port(struct intel_dp *intel_dp, bool state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dig_port->base.base.dev);
|
||||
bool cur_state = intel_de_read(dev_priv, intel_dp->output_reg) & DP_PORT_EN;
|
||||
bool cur_state = intel_de_read(display, intel_dp->output_reg) & DP_PORT_EN;
|
||||
|
||||
I915_STATE_WARN(dev_priv, cur_state != state,
|
||||
"[ENCODER:%d:%s] state assertion failure (expected %s, current %s)\n",
|
||||
@ -179,7 +181,8 @@ static void assert_dp_port(struct intel_dp *intel_dp, bool state)
|
||||
|
||||
static void assert_edp_pll(struct drm_i915_private *dev_priv, bool state)
|
||||
{
|
||||
bool cur_state = intel_de_read(dev_priv, DP_A) & DP_PLL_ENABLE;
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
bool cur_state = intel_de_read(display, DP_A) & DP_PLL_ENABLE;
|
||||
|
||||
I915_STATE_WARN(dev_priv, cur_state != state,
|
||||
"eDP PLL state assertion failure (expected %s, current %s)\n",
|
||||
@ -191,6 +194,7 @@ static void assert_edp_pll(struct drm_i915_private *dev_priv, bool state)
|
||||
static void ilk_edp_pll_on(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_crtc *crtc = to_intel_crtc(pipe_config->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
|
||||
@ -198,7 +202,7 @@ static void ilk_edp_pll_on(struct intel_dp *intel_dp,
|
||||
assert_dp_port_disabled(intel_dp);
|
||||
assert_edp_pll_disabled(dev_priv);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "enabling eDP PLL for clock %d\n",
|
||||
drm_dbg_kms(display->drm, "enabling eDP PLL for clock %d\n",
|
||||
pipe_config->port_clock);
|
||||
|
||||
intel_dp->DP &= ~DP_PLL_FREQ_MASK;
|
||||
@ -208,8 +212,8 @@ static void ilk_edp_pll_on(struct intel_dp *intel_dp,
|
||||
else
|
||||
intel_dp->DP |= DP_PLL_FREQ_270MHZ;
|
||||
|
||||
intel_de_write(dev_priv, DP_A, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, DP_A);
|
||||
intel_de_write(display, DP_A, intel_dp->DP);
|
||||
intel_de_posting_read(display, DP_A);
|
||||
udelay(500);
|
||||
|
||||
/*
|
||||
@ -223,14 +227,15 @@ static void ilk_edp_pll_on(struct intel_dp *intel_dp,
|
||||
|
||||
intel_dp->DP |= DP_PLL_ENABLE;
|
||||
|
||||
intel_de_write(dev_priv, DP_A, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, DP_A);
|
||||
intel_de_write(display, DP_A, intel_dp->DP);
|
||||
intel_de_posting_read(display, DP_A);
|
||||
udelay(200);
|
||||
}
|
||||
|
||||
static void ilk_edp_pll_off(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *old_crtc_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
|
||||
@ -238,22 +243,23 @@ static void ilk_edp_pll_off(struct intel_dp *intel_dp,
|
||||
assert_dp_port_disabled(intel_dp);
|
||||
assert_edp_pll_enabled(dev_priv);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "disabling eDP PLL\n");
|
||||
drm_dbg_kms(display->drm, "disabling eDP PLL\n");
|
||||
|
||||
intel_dp->DP &= ~DP_PLL_ENABLE;
|
||||
|
||||
intel_de_write(dev_priv, DP_A, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, DP_A);
|
||||
intel_de_write(display, DP_A, intel_dp->DP);
|
||||
intel_de_posting_read(display, DP_A);
|
||||
udelay(200);
|
||||
}
|
||||
|
||||
static bool cpt_dp_port_selected(struct drm_i915_private *dev_priv,
|
||||
enum port port, enum pipe *pipe)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
enum pipe p;
|
||||
|
||||
for_each_pipe(dev_priv, p) {
|
||||
u32 val = intel_de_read(dev_priv, TRANS_DP_CTL(p));
|
||||
for_each_pipe(display, p) {
|
||||
u32 val = intel_de_read(display, TRANS_DP_CTL(p));
|
||||
|
||||
if ((val & TRANS_DP_PORT_SEL_MASK) == TRANS_DP_PORT_SEL(port)) {
|
||||
*pipe = p;
|
||||
@ -261,7 +267,7 @@ static bool cpt_dp_port_selected(struct drm_i915_private *dev_priv,
|
||||
}
|
||||
}
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "No pipe for DP port %c found\n",
|
||||
drm_dbg_kms(display->drm, "No pipe for DP port %c found\n",
|
||||
port_name(port));
|
||||
|
||||
/* must initialize pipe to something for the asserts */
|
||||
@ -274,10 +280,11 @@ bool g4x_dp_port_enabled(struct drm_i915_private *dev_priv,
|
||||
i915_reg_t dp_reg, enum port port,
|
||||
enum pipe *pipe)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
bool ret;
|
||||
u32 val;
|
||||
|
||||
val = intel_de_read(dev_priv, dp_reg);
|
||||
val = intel_de_read(display, dp_reg);
|
||||
|
||||
ret = val & DP_PORT_EN;
|
||||
|
||||
@ -333,6 +340,7 @@ static void g4x_dp_get_m_n(struct intel_crtc_state *crtc_state)
|
||||
static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
u32 tmp, flags = 0;
|
||||
@ -344,12 +352,12 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||
else
|
||||
pipe_config->output_types |= BIT(INTEL_OUTPUT_DP);
|
||||
|
||||
tmp = intel_de_read(dev_priv, intel_dp->output_reg);
|
||||
tmp = intel_de_read(display, intel_dp->output_reg);
|
||||
|
||||
pipe_config->has_audio = tmp & DP_AUDIO_OUTPUT_ENABLE && port != PORT_A;
|
||||
|
||||
if (HAS_PCH_CPT(dev_priv) && port != PORT_A) {
|
||||
u32 trans_dp = intel_de_read(dev_priv,
|
||||
u32 trans_dp = intel_de_read(display,
|
||||
TRANS_DP_CTL(crtc->pipe));
|
||||
|
||||
if (trans_dp & TRANS_DP_ENH_FRAMING)
|
||||
@ -390,7 +398,7 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||
g4x_dp_get_m_n(pipe_config);
|
||||
|
||||
if (port == PORT_A) {
|
||||
if ((intel_de_read(dev_priv, DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_162MHZ)
|
||||
if ((intel_de_read(display, DP_A) & DP_PLL_FREQ_MASK) == DP_PLL_FREQ_162MHZ)
|
||||
pipe_config->port_clock = 162000;
|
||||
else
|
||||
pipe_config->port_clock = 270000;
|
||||
@ -410,17 +418,18 @@ static void
|
||||
intel_dp_link_down(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *old_crtc_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->uapi.crtc);
|
||||
enum port port = encoder->port;
|
||||
|
||||
if (drm_WARN_ON(&dev_priv->drm,
|
||||
(intel_de_read(dev_priv, intel_dp->output_reg) &
|
||||
if (drm_WARN_ON(display->drm,
|
||||
(intel_de_read(display, intel_dp->output_reg) &
|
||||
DP_PORT_EN) == 0))
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "\n");
|
||||
drm_dbg_kms(display->drm, "\n");
|
||||
|
||||
if ((IS_IVYBRIDGE(dev_priv) && port == PORT_A) ||
|
||||
(HAS_PCH_CPT(dev_priv) && port != PORT_A)) {
|
||||
@ -430,12 +439,12 @@ intel_dp_link_down(struct intel_encoder *encoder,
|
||||
intel_dp->DP &= ~DP_LINK_TRAIN_MASK;
|
||||
intel_dp->DP |= DP_LINK_TRAIN_PAT_IDLE;
|
||||
}
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
|
||||
intel_dp->DP &= ~DP_PORT_EN;
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
|
||||
/*
|
||||
* HW workaround for IBX, we need to move the port
|
||||
@ -454,12 +463,12 @@ intel_dp_link_down(struct intel_encoder *encoder,
|
||||
intel_dp->DP &= ~(DP_PIPE_SEL_MASK | DP_LINK_TRAIN_MASK);
|
||||
intel_dp->DP |= DP_PORT_EN | DP_PIPE_SEL(PIPE_A) |
|
||||
DP_LINK_TRAIN_PAT_1;
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
|
||||
intel_dp->DP &= ~DP_PORT_EN;
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
|
||||
intel_wait_for_vblank_if_active(dev_priv, PIPE_A);
|
||||
intel_set_cpu_fifo_underrun_reporting(dev_priv, PIPE_A, true);
|
||||
@ -480,7 +489,7 @@ static void g4x_dp_audio_enable(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
|
||||
if (!crtc_state->has_audio)
|
||||
@ -488,7 +497,7 @@ static void g4x_dp_audio_enable(struct intel_encoder *encoder,
|
||||
|
||||
/* Enable audio presence detect */
|
||||
intel_dp->DP |= DP_AUDIO_OUTPUT_ENABLE;
|
||||
intel_de_write(i915, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
|
||||
intel_audio_codec_enable(encoder, crtc_state, conn_state);
|
||||
}
|
||||
@ -497,7 +506,7 @@ static void g4x_dp_audio_disable(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
|
||||
if (!old_crtc_state->has_audio)
|
||||
@ -507,7 +516,7 @@ static void g4x_dp_audio_disable(struct intel_encoder *encoder,
|
||||
|
||||
/* Disable audio presence detect */
|
||||
intel_dp->DP &= ~DP_AUDIO_OUTPUT_ENABLE;
|
||||
intel_de_write(i915, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
}
|
||||
|
||||
static void intel_disable_dp(struct intel_atomic_state *state,
|
||||
@ -596,7 +605,7 @@ cpt_set_link_train(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
u8 dp_train_pat)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
intel_dp->DP &= ~DP_LINK_TRAIN_MASK_CPT;
|
||||
|
||||
@ -615,8 +624,8 @@ cpt_set_link_train(struct intel_dp *intel_dp,
|
||||
return;
|
||||
}
|
||||
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -624,7 +633,7 @@ g4x_set_link_train(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
u8 dp_train_pat)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
intel_dp->DP &= ~DP_LINK_TRAIN_MASK;
|
||||
|
||||
@ -643,14 +652,14 @@ g4x_set_link_train(struct intel_dp *intel_dp,
|
||||
return;
|
||||
}
|
||||
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
}
|
||||
|
||||
static void intel_dp_enable_port(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
/* enable with pattern 1 (as per spec) */
|
||||
|
||||
@ -665,8 +674,8 @@ static void intel_dp_enable_port(struct intel_dp *intel_dp,
|
||||
*/
|
||||
intel_dp->DP |= DP_PORT_EN;
|
||||
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
}
|
||||
|
||||
static void intel_enable_dp(struct intel_atomic_state *state,
|
||||
@ -674,12 +683,13 @@ static void intel_enable_dp(struct intel_atomic_state *state,
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
u32 dp_reg = intel_de_read(dev_priv, intel_dp->output_reg);
|
||||
u32 dp_reg = intel_de_read(display, intel_dp->output_reg);
|
||||
intel_wakeref_t wakeref;
|
||||
|
||||
if (drm_WARN_ON(&dev_priv->drm, dp_reg & DP_PORT_EN))
|
||||
if (drm_WARN_ON(display->drm, dp_reg & DP_PORT_EN))
|
||||
return;
|
||||
|
||||
with_intel_pps_lock(intel_dp, wakeref) {
|
||||
@ -1026,21 +1036,21 @@ static void
|
||||
g4x_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
u8 train_set = intel_dp->train_set[0];
|
||||
u32 signal_levels;
|
||||
|
||||
signal_levels = g4x_signal_levels(train_set);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
|
||||
drm_dbg_kms(display->drm, "Using signal levels %08x\n",
|
||||
signal_levels);
|
||||
|
||||
intel_dp->DP &= ~(DP_VOLTAGE_MASK | DP_PRE_EMPHASIS_MASK);
|
||||
intel_dp->DP |= signal_levels;
|
||||
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
}
|
||||
|
||||
/* SNB CPU eDP voltage swing and pre-emphasis control */
|
||||
@ -1074,21 +1084,21 @@ static void
|
||||
snb_cpu_edp_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
u8 train_set = intel_dp->train_set[0];
|
||||
u32 signal_levels;
|
||||
|
||||
signal_levels = snb_cpu_edp_signal_levels(train_set);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
|
||||
drm_dbg_kms(display->drm, "Using signal levels %08x\n",
|
||||
signal_levels);
|
||||
|
||||
intel_dp->DP &= ~EDP_LINK_TRAIN_VOL_EMP_MASK_SNB;
|
||||
intel_dp->DP |= signal_levels;
|
||||
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
}
|
||||
|
||||
/* IVB CPU eDP voltage swing and pre-emphasis control */
|
||||
@ -1126,21 +1136,21 @@ static void
|
||||
ivb_cpu_edp_set_signal_levels(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
|
||||
u8 train_set = intel_dp->train_set[0];
|
||||
u32 signal_levels;
|
||||
|
||||
signal_levels = ivb_cpu_edp_signal_levels(train_set);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Using signal levels %08x\n",
|
||||
drm_dbg_kms(display->drm, "Using signal levels %08x\n",
|
||||
signal_levels);
|
||||
|
||||
intel_dp->DP &= ~EDP_LINK_TRAIN_VOL_EMP_MASK_IVB;
|
||||
intel_dp->DP |= signal_levels;
|
||||
|
||||
intel_de_write(dev_priv, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(dev_priv, intel_dp->output_reg);
|
||||
intel_de_write(display, intel_dp->output_reg, intel_dp->DP);
|
||||
intel_de_posting_read(display, intel_dp->output_reg);
|
||||
}
|
||||
|
||||
/*
|
||||
@ -1185,15 +1195,15 @@ intel_dp_hotplug(struct intel_encoder *encoder,
|
||||
|
||||
static bool ibx_digital_port_connected(struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
u32 bit = dev_priv->display.hotplug.pch_hpd[encoder->hpd_pin];
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
u32 bit = display->hotplug.pch_hpd[encoder->hpd_pin];
|
||||
|
||||
return intel_de_read(dev_priv, SDEISR) & bit;
|
||||
return intel_de_read(display, SDEISR) & bit;
|
||||
}
|
||||
|
||||
static bool g4x_digital_port_connected(struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
u32 bit;
|
||||
|
||||
switch (encoder->hpd_pin) {
|
||||
@ -1211,15 +1221,15 @@ static bool g4x_digital_port_connected(struct intel_encoder *encoder)
|
||||
return false;
|
||||
}
|
||||
|
||||
return intel_de_read(dev_priv, PORT_HOTPLUG_STAT(dev_priv)) & bit;
|
||||
return intel_de_read(display, PORT_HOTPLUG_STAT(display)) & bit;
|
||||
}
|
||||
|
||||
static bool ilk_digital_port_connected(struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
u32 bit = dev_priv->display.hotplug.hpd[encoder->hpd_pin];
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
u32 bit = display->hotplug.hpd[encoder->hpd_pin];
|
||||
|
||||
return intel_de_read(dev_priv, DEISR) & bit;
|
||||
return intel_de_read(display, DEISR) & bit;
|
||||
}
|
||||
|
||||
static void g4x_dp_suspend_complete(struct intel_encoder *encoder)
|
||||
@ -1241,7 +1251,8 @@ static void intel_dp_encoder_destroy(struct drm_encoder *encoder)
|
||||
|
||||
enum pipe vlv_active_pipe(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *dev_priv = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(display->drm);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
enum pipe pipe;
|
||||
|
||||
@ -1254,10 +1265,11 @@ enum pipe vlv_active_pipe(struct intel_dp *intel_dp)
|
||||
|
||||
static void intel_dp_encoder_reset(struct drm_encoder *encoder)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(encoder->dev);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->dev);
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(to_intel_encoder(encoder));
|
||||
|
||||
intel_dp->DP = intel_de_read(dev_priv, intel_dp->output_reg);
|
||||
intel_dp->DP = intel_de_read(display, intel_dp->output_reg);
|
||||
|
||||
intel_dp->reset_link_params = true;
|
||||
|
||||
@ -1293,7 +1305,7 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
|
||||
|
||||
/* FIXME bail? */
|
||||
if (!devdata)
|
||||
drm_dbg_kms(&dev_priv->drm, "No VBT child device for DP-%c\n",
|
||||
drm_dbg_kms(display->drm, "No VBT child device for DP-%c\n",
|
||||
port_name(port));
|
||||
|
||||
dig_port = kzalloc(sizeof(*dig_port), GFP_KERNEL);
|
||||
@ -1313,7 +1325,7 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
|
||||
|
||||
mutex_init(&dig_port->hdcp_mutex);
|
||||
|
||||
if (drm_encoder_init(&dev_priv->drm, &intel_encoder->base,
|
||||
if (drm_encoder_init(display->drm, &intel_encoder->base,
|
||||
&intel_dp_enc_funcs, DRM_MODE_ENCODER_TMDS,
|
||||
"DP %c", port_name(port)))
|
||||
goto err_encoder_init;
|
||||
@ -1397,7 +1409,7 @@ bool g4x_dp_init(struct drm_i915_private *dev_priv,
|
||||
|
||||
dig_port->hpd_pulse = intel_dp_hpd_pulse;
|
||||
|
||||
if (HAS_GMCH(dev_priv)) {
|
||||
if (HAS_GMCH(display)) {
|
||||
dig_port->connected = g4x_digital_port_connected;
|
||||
} else {
|
||||
if (port == PORT_A)
|
||||
|
@ -228,7 +228,7 @@ bool intel_alpm_compute_params(struct intel_dp *intel_dp,
|
||||
int tfw_exit_latency = 20; /* eDP spec */
|
||||
int phy_wake = 4; /* eDP spec */
|
||||
int preamble = 8; /* eDP spec */
|
||||
int precharge = intel_dp_aux_fw_sync_len() - preamble;
|
||||
int precharge = intel_dp_aux_fw_sync_len(intel_dp) - preamble;
|
||||
u8 max_wake_lines;
|
||||
|
||||
io_wake_time = max(precharge, io_buffer_wake_time(crtc_state)) +
|
||||
|
@ -980,7 +980,8 @@ retry:
|
||||
|
||||
static unsigned long i915_audio_component_get_power(struct device *kdev)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(kdev);
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
intel_wakeref_t ret;
|
||||
|
||||
/* Catch potential impedance mismatches before they occur! */
|
||||
@ -1012,7 +1013,8 @@ static unsigned long i915_audio_component_get_power(struct device *kdev)
|
||||
static void i915_audio_component_put_power(struct device *kdev,
|
||||
unsigned long cookie)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(kdev);
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
/* Stop forcing CDCLK to 2*BCLK if no need for audio to be powered. */
|
||||
if (--i915->display.audio.power_refcount == 0)
|
||||
@ -1025,7 +1027,8 @@ static void i915_audio_component_put_power(struct device *kdev,
|
||||
static void i915_audio_component_codec_wake_override(struct device *kdev,
|
||||
bool enable)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(kdev);
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
unsigned long cookie;
|
||||
|
||||
if (DISPLAY_VER(i915) < 9)
|
||||
@ -1053,7 +1056,8 @@ static void i915_audio_component_codec_wake_override(struct device *kdev,
|
||||
/* Get CDCLK in kHz */
|
||||
static int i915_audio_component_get_cdclk_freq(struct device *kdev)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(kdev);
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
if (drm_WARN_ON_ONCE(&i915->drm, !HAS_DDI(i915)))
|
||||
return -ENODEV;
|
||||
@ -1112,7 +1116,8 @@ static struct intel_audio_state *find_audio_state(struct drm_i915_private *i915,
|
||||
static int i915_audio_component_sync_audio_rate(struct device *kdev, int port,
|
||||
int cpu_transcoder, int rate)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(kdev);
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
struct i915_audio_component *acomp = i915->display.audio.component;
|
||||
const struct intel_audio_state *audio_state;
|
||||
struct intel_encoder *encoder;
|
||||
@ -1154,7 +1159,8 @@ static int i915_audio_component_get_eld(struct device *kdev, int port,
|
||||
int cpu_transcoder, bool *enabled,
|
||||
unsigned char *buf, int max_bytes)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(kdev);
|
||||
struct intel_display *display = to_intel_display(kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
const struct intel_audio_state *audio_state;
|
||||
int ret = 0;
|
||||
|
||||
@ -1189,24 +1195,25 @@ static const struct drm_audio_component_ops i915_audio_component_ops = {
|
||||
.get_eld = i915_audio_component_get_eld,
|
||||
};
|
||||
|
||||
static int i915_audio_component_bind(struct device *i915_kdev,
|
||||
static int i915_audio_component_bind(struct device *drv_kdev,
|
||||
struct device *hda_kdev, void *data)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(drv_kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
struct i915_audio_component *acomp = data;
|
||||
struct drm_i915_private *i915 = kdev_to_i915(i915_kdev);
|
||||
int i;
|
||||
|
||||
if (drm_WARN_ON(&i915->drm, acomp->base.ops || acomp->base.dev))
|
||||
return -EEXIST;
|
||||
|
||||
if (drm_WARN_ON(&i915->drm,
|
||||
!device_link_add(hda_kdev, i915_kdev,
|
||||
!device_link_add(hda_kdev, drv_kdev,
|
||||
DL_FLAG_STATELESS)))
|
||||
return -ENOMEM;
|
||||
|
||||
drm_modeset_lock_all(&i915->drm);
|
||||
acomp->base.ops = &i915_audio_component_ops;
|
||||
acomp->base.dev = i915_kdev;
|
||||
acomp->base.dev = drv_kdev;
|
||||
BUILD_BUG_ON(MAX_PORTS != I915_MAX_PORTS);
|
||||
for (i = 0; i < ARRAY_SIZE(acomp->aud_sample_rate); i++)
|
||||
acomp->aud_sample_rate[i] = 0;
|
||||
@ -1216,11 +1223,12 @@ static int i915_audio_component_bind(struct device *i915_kdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void i915_audio_component_unbind(struct device *i915_kdev,
|
||||
static void i915_audio_component_unbind(struct device *drv_kdev,
|
||||
struct device *hda_kdev, void *data)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(drv_kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
struct i915_audio_component *acomp = data;
|
||||
struct drm_i915_private *i915 = kdev_to_i915(i915_kdev);
|
||||
|
||||
drm_modeset_lock_all(&i915->drm);
|
||||
acomp->base.ops = NULL;
|
||||
@ -1228,7 +1236,7 @@ static void i915_audio_component_unbind(struct device *i915_kdev,
|
||||
i915->display.audio.component = NULL;
|
||||
drm_modeset_unlock_all(&i915->drm);
|
||||
|
||||
device_link_remove(hda_kdev, i915_kdev);
|
||||
device_link_remove(hda_kdev, drv_kdev);
|
||||
|
||||
if (i915->display.audio.power_refcount)
|
||||
drm_err(&i915->drm, "audio power refcount %d after unbind\n",
|
||||
|
@ -1400,7 +1400,7 @@ static void tgl_dkl_phy_set_signal_levels(struct intel_encoder *encoder,
|
||||
static int translate_signal_level(struct intel_dp *intel_dp,
|
||||
u8 signal_levels)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(index_to_dp_signal_levels); i++) {
|
||||
@ -1408,7 +1408,7 @@ static int translate_signal_level(struct intel_dp *intel_dp,
|
||||
return i;
|
||||
}
|
||||
|
||||
drm_WARN(&i915->drm, 1,
|
||||
drm_WARN(display->drm, 1,
|
||||
"Unsupported voltage swing/pre-emphasis level: 0x%x\n",
|
||||
signal_levels);
|
||||
|
||||
@ -2211,14 +2211,14 @@ static void intel_dp_sink_set_msa_timing_par_ignore_state(struct intel_dp *intel
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
bool enable)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
if (!crtc_state->vrr.enable)
|
||||
return;
|
||||
|
||||
if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_DOWNSPREAD_CTRL,
|
||||
enable ? DP_MSA_TIMING_PAR_IGNORE_EN : 0) <= 0)
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"Failed to %s MSA_TIMING_PAR_IGNORE in the sink\n",
|
||||
str_enable_disable(enable));
|
||||
}
|
||||
@ -2227,20 +2227,20 @@ static void intel_dp_sink_set_fec_ready(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
bool enable)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
if (!crtc_state->fec_enable)
|
||||
return;
|
||||
|
||||
if (drm_dp_dpcd_writeb(&intel_dp->aux, DP_FEC_CONFIGURATION,
|
||||
enable ? DP_FEC_READY : 0) <= 0)
|
||||
drm_dbg_kms(&i915->drm, "Failed to set FEC_READY to %s in the sink\n",
|
||||
drm_dbg_kms(display->drm, "Failed to set FEC_READY to %s in the sink\n",
|
||||
enable ? "enabled" : "disabled");
|
||||
|
||||
if (enable &&
|
||||
drm_dp_dpcd_writeb(&intel_dp->aux, DP_FEC_STATUS,
|
||||
DP_FEC_DECODE_EN_DETECTED | DP_FEC_DECODE_DIS_DETECTED) <= 0)
|
||||
drm_dbg_kms(&i915->drm, "Failed to clear FEC detected flags\n");
|
||||
drm_dbg_kms(display->drm, "Failed to clear FEC detected flags\n");
|
||||
}
|
||||
|
||||
static int read_fec_detected_status(struct drm_dp_aux *aux)
|
||||
|
@ -7793,7 +7793,7 @@ void intel_setup_outputs(struct drm_i915_private *dev_priv)
|
||||
struct intel_encoder *encoder;
|
||||
bool dpd_is_edp = false;
|
||||
|
||||
intel_pps_unlock_regs_wa(dev_priv);
|
||||
intel_pps_unlock_regs_wa(display);
|
||||
|
||||
if (!HAS_DISPLAY(dev_priv))
|
||||
return;
|
||||
|
@ -1071,7 +1071,7 @@ void intel_display_debugfs_register(struct drm_i915_private *i915)
|
||||
intel_fbc_debugfs_register(display);
|
||||
intel_hpd_debugfs_register(i915);
|
||||
intel_opregion_debugfs_register(display);
|
||||
intel_psr_debugfs_register(i915);
|
||||
intel_psr_debugfs_register(display);
|
||||
intel_wm_debugfs_register(i915);
|
||||
intel_display_debugfs_params(display);
|
||||
}
|
||||
|
@ -428,7 +428,7 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
|
||||
|
||||
intel_panel_sanitize_ssc(i915);
|
||||
|
||||
intel_pps_setup(i915);
|
||||
intel_pps_setup(display);
|
||||
|
||||
intel_gmbus_setup(i915);
|
||||
|
||||
@ -459,7 +459,7 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
|
||||
intel_vga_disable(i915);
|
||||
intel_setup_outputs(i915);
|
||||
|
||||
ret = intel_dp_tunnel_mgr_init(i915);
|
||||
ret = intel_dp_tunnel_mgr_init(display);
|
||||
if (ret)
|
||||
goto err_hdcp;
|
||||
|
||||
@ -580,6 +580,8 @@ void intel_display_driver_remove(struct drm_i915_private *i915)
|
||||
/* part #2: call after irq uninstall */
|
||||
void intel_display_driver_remove_noirq(struct drm_i915_private *i915)
|
||||
{
|
||||
struct intel_display *display = &i915->display;
|
||||
|
||||
if (!HAS_DISPLAY(i915))
|
||||
return;
|
||||
|
||||
@ -600,7 +602,7 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915)
|
||||
|
||||
intel_mode_config_cleanup(i915);
|
||||
|
||||
intel_dp_tunnel_mgr_cleanup(i915);
|
||||
intel_dp_tunnel_mgr_cleanup(display);
|
||||
|
||||
intel_overlay_cleanup(i915);
|
||||
|
||||
|
@ -576,6 +576,7 @@ void valleyview_pipestat_irq_handler(struct drm_i915_private *dev_priv,
|
||||
|
||||
static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
enum pipe pipe;
|
||||
u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK;
|
||||
|
||||
@ -589,7 +590,7 @@ static void ibx_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
||||
}
|
||||
|
||||
if (pch_iir & SDE_AUX_MASK)
|
||||
intel_dp_aux_irq_handler(dev_priv);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
|
||||
if (pch_iir & SDE_GMBUS)
|
||||
intel_gmbus_irq_handler(dev_priv);
|
||||
@ -664,6 +665,7 @@ static void cpt_serr_int_handler(struct drm_i915_private *dev_priv)
|
||||
|
||||
static void cpt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
enum pipe pipe;
|
||||
u32 hotplug_trigger = pch_iir & SDE_HOTPLUG_MASK_CPT;
|
||||
|
||||
@ -677,7 +679,7 @@ static void cpt_irq_handler(struct drm_i915_private *dev_priv, u32 pch_iir)
|
||||
}
|
||||
|
||||
if (pch_iir & SDE_AUX_MASK_CPT)
|
||||
intel_dp_aux_irq_handler(dev_priv);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
|
||||
if (pch_iir & SDE_GMBUS_CPT)
|
||||
intel_gmbus_irq_handler(dev_priv);
|
||||
@ -709,7 +711,7 @@ void ilk_display_irq_handler(struct drm_i915_private *dev_priv, u32 de_iir)
|
||||
ilk_hpd_irq_handler(dev_priv, hotplug_trigger);
|
||||
|
||||
if (de_iir & DE_AUX_CHANNEL_A)
|
||||
intel_dp_aux_irq_handler(dev_priv);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
|
||||
if (de_iir & DE_GSE)
|
||||
intel_opregion_asle_intr(display);
|
||||
@ -775,7 +777,7 @@ void ivb_display_irq_handler(struct drm_i915_private *dev_priv, u32 de_iir)
|
||||
}
|
||||
|
||||
if (de_iir & DE_AUX_CHANNEL_A_IVB)
|
||||
intel_dp_aux_irq_handler(dev_priv);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
|
||||
if (de_iir & DE_GSE_IVB)
|
||||
intel_opregion_asle_intr(display);
|
||||
@ -1065,6 +1067,7 @@ static void gen8_read_and_ack_pch_irqs(struct drm_i915_private *i915, u32 *pch_i
|
||||
|
||||
void gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
u32 iir;
|
||||
enum pipe pipe;
|
||||
|
||||
@ -1100,7 +1103,7 @@ void gen8_de_irq_handler(struct drm_i915_private *dev_priv, u32 master_ctl)
|
||||
intel_uncore_write(&dev_priv->uncore, GEN8_DE_PORT_IIR, iir);
|
||||
|
||||
if (iir & gen8_de_port_aux_mask(dev_priv)) {
|
||||
intel_dp_aux_irq_handler(dev_priv);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
found = true;
|
||||
}
|
||||
|
||||
|
@ -861,6 +861,8 @@ void skl_enable_dc6(struct drm_i915_private *dev_priv)
|
||||
|
||||
void bxt_enable_dc9(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
|
||||
assert_can_enable_dc9(dev_priv);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Enabling DC9\n");
|
||||
@ -870,19 +872,21 @@ void bxt_enable_dc9(struct drm_i915_private *dev_priv)
|
||||
* because PPS registers are always on.
|
||||
*/
|
||||
if (!HAS_PCH_SPLIT(dev_priv))
|
||||
intel_pps_reset_all(dev_priv);
|
||||
intel_pps_reset_all(display);
|
||||
gen9_set_dc_state(dev_priv, DC_STATE_EN_DC9);
|
||||
}
|
||||
|
||||
void bxt_disable_dc9(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
|
||||
assert_can_disable_dc9(dev_priv);
|
||||
|
||||
drm_dbg_kms(&dev_priv->drm, "Disabling DC9\n");
|
||||
|
||||
gen9_set_dc_state(dev_priv, DC_STATE_DISABLE);
|
||||
|
||||
intel_pps_unlock_regs_wa(dev_priv);
|
||||
intel_pps_unlock_regs_wa(display);
|
||||
}
|
||||
|
||||
static void hsw_power_well_sync_hw(struct drm_i915_private *dev_priv,
|
||||
@ -1184,6 +1188,7 @@ static void vlv_init_display_clock_gating(struct drm_i915_private *dev_priv)
|
||||
|
||||
static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
struct intel_encoder *encoder;
|
||||
enum pipe pipe;
|
||||
|
||||
@ -1229,11 +1234,13 @@ static void vlv_display_power_well_init(struct drm_i915_private *dev_priv)
|
||||
|
||||
intel_vga_redisable_power_on(dev_priv);
|
||||
|
||||
intel_pps_unlock_regs_wa(dev_priv);
|
||||
intel_pps_unlock_regs_wa(display);
|
||||
}
|
||||
|
||||
static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
|
||||
spin_lock_irq(&dev_priv->irq_lock);
|
||||
valleyview_disable_display_irqs(dev_priv);
|
||||
spin_unlock_irq(&dev_priv->irq_lock);
|
||||
@ -1241,7 +1248,7 @@ static void vlv_display_power_well_deinit(struct drm_i915_private *dev_priv)
|
||||
/* make sure we're done processing display irqs */
|
||||
intel_synchronize_irq(dev_priv);
|
||||
|
||||
intel_pps_reset_all(dev_priv);
|
||||
intel_pps_reset_all(display);
|
||||
|
||||
/* Prevent us from re-enabling polling on accident in late suspend */
|
||||
if (!dev_priv->drm.dev->power.is_suspended)
|
||||
|
@ -83,7 +83,8 @@ void intel_display_reset_prepare(struct drm_i915_private *dev_priv)
|
||||
|
||||
void intel_display_reset_finish(struct drm_i915_private *i915)
|
||||
{
|
||||
struct drm_modeset_acquire_ctx *ctx = &i915->display.restore.reset_ctx;
|
||||
struct intel_display *display = &i915->display;
|
||||
struct drm_modeset_acquire_ctx *ctx = &display->restore.reset_ctx;
|
||||
struct drm_atomic_state *state;
|
||||
int ret;
|
||||
|
||||
@ -94,7 +95,7 @@ void intel_display_reset_finish(struct drm_i915_private *i915)
|
||||
if (!test_bit(I915_RESET_MODESET, &to_gt(i915)->reset.flags))
|
||||
return;
|
||||
|
||||
state = fetch_and_zero(&i915->display.restore.modeset_state);
|
||||
state = fetch_and_zero(&display->restore.modeset_state);
|
||||
if (!state)
|
||||
goto unlock;
|
||||
|
||||
@ -112,7 +113,7 @@ void intel_display_reset_finish(struct drm_i915_private *i915)
|
||||
* The display has been reset as well,
|
||||
* so need a full re-initialization.
|
||||
*/
|
||||
intel_pps_unlock_regs_wa(i915);
|
||||
intel_pps_unlock_regs_wa(display);
|
||||
intel_display_driver_init_hw(i915);
|
||||
intel_clock_gating_init(i915);
|
||||
intel_hpd_init(i915);
|
||||
|
@ -1907,6 +1907,10 @@ struct intel_dp {
|
||||
} alpm_parameters;
|
||||
|
||||
u8 alpm_dpcd;
|
||||
|
||||
struct {
|
||||
unsigned long mask;
|
||||
} quirks;
|
||||
};
|
||||
|
||||
enum lspcon_vendor {
|
||||
@ -2081,8 +2085,6 @@ dp_to_lspcon(struct intel_dp *intel_dp)
|
||||
return &dp_to_dig_port(intel_dp)->lspcon;
|
||||
}
|
||||
|
||||
#define dp_to_i915(__intel_dp) to_i915(dp_to_dig_port(__intel_dp)->base.base.dev)
|
||||
|
||||
static inline struct intel_digital_port *
|
||||
hdmi_to_dig_port(struct intel_hdmi *intel_hdmi)
|
||||
{
|
||||
@ -2205,7 +2207,11 @@ to_intel_frontbuffer(struct drm_framebuffer *fb)
|
||||
* intel_display pointer.
|
||||
*/
|
||||
#define __drm_device_to_intel_display(p) \
|
||||
(&to_i915(p)->display)
|
||||
((p) ? &to_i915(p)->display : NULL)
|
||||
#define __device_to_intel_display(p) \
|
||||
__drm_device_to_intel_display(dev_get_drvdata(p))
|
||||
#define __pci_dev_to_intel_display(p) \
|
||||
__drm_device_to_intel_display(pci_get_drvdata(p))
|
||||
#define __intel_atomic_state_to_intel_display(p) \
|
||||
__drm_device_to_intel_display((p)->base.dev)
|
||||
#define __intel_connector_to_intel_display(p) \
|
||||
@ -2231,6 +2237,8 @@ to_intel_frontbuffer(struct drm_framebuffer *fb)
|
||||
#define to_intel_display(p) \
|
||||
_Generic(*p, \
|
||||
__assoc(drm_device, p), \
|
||||
__assoc(device, p), \
|
||||
__assoc(pci_dev, p), \
|
||||
__assoc(intel_atomic_state, p), \
|
||||
__assoc(intel_connector, p), \
|
||||
__assoc(intel_crtc, p), \
|
||||
|
@ -84,11 +84,14 @@
|
||||
#include "intel_pch_display.h"
|
||||
#include "intel_pps.h"
|
||||
#include "intel_psr.h"
|
||||
#include "intel_quirks.h"
|
||||
#include "intel_tc.h"
|
||||
#include "intel_vdsc.h"
|
||||
#include "intel_vrr.h"
|
||||
#include "intel_crtc_state_dump.h"
|
||||
|
||||
#define dp_to_i915(__intel_dp) to_i915(dp_to_dig_port(__intel_dp)->base.base.dev)
|
||||
|
||||
/* DP DSC throughput values used for slice count calculations KPixels/s */
|
||||
#define DP_DSC_PEAK_PIXEL_RATE 2720000
|
||||
#define DP_DSC_MAX_ENC_THROUGHPUT_0 340000
|
||||
@ -4053,6 +4056,7 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *connector
|
||||
|
||||
drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
|
||||
drm_dp_is_branch(intel_dp->dpcd));
|
||||
intel_init_dpcd_quirks(intel_dp, &intel_dp->desc.ident);
|
||||
|
||||
/*
|
||||
* Read the eDP display control registers.
|
||||
@ -4165,6 +4169,8 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
|
||||
drm_dp_read_desc(&intel_dp->aux, &intel_dp->desc,
|
||||
drm_dp_is_branch(intel_dp->dpcd));
|
||||
|
||||
intel_init_dpcd_quirks(intel_dp, &intel_dp->desc.ident);
|
||||
|
||||
intel_dp_update_sink_caps(intel_dp);
|
||||
}
|
||||
|
||||
|
@ -13,16 +13,17 @@
|
||||
#include "intel_dp_aux.h"
|
||||
#include "intel_dp_aux_regs.h"
|
||||
#include "intel_pps.h"
|
||||
#include "intel_quirks.h"
|
||||
#include "intel_tc.h"
|
||||
|
||||
#define AUX_CH_NAME_BUFSIZE 6
|
||||
|
||||
static const char *aux_ch_name(struct drm_i915_private *i915,
|
||||
static const char *aux_ch_name(struct intel_display *display,
|
||||
char *buf, int size, enum aux_ch aux_ch)
|
||||
{
|
||||
if (DISPLAY_VER(i915) >= 13 && aux_ch >= AUX_CH_D_XELPD)
|
||||
if (DISPLAY_VER(display) >= 13 && aux_ch >= AUX_CH_D_XELPD)
|
||||
snprintf(buf, size, "%c", 'A' + aux_ch - AUX_CH_D_XELPD + AUX_CH_D);
|
||||
else if (DISPLAY_VER(i915) >= 12 && aux_ch >= AUX_CH_USBC1)
|
||||
else if (DISPLAY_VER(display) >= 12 && aux_ch >= AUX_CH_USBC1)
|
||||
snprintf(buf, size, "USBC%c", '1' + aux_ch - AUX_CH_USBC1);
|
||||
else
|
||||
snprintf(buf, size, "%c", 'A' + aux_ch);
|
||||
@ -55,17 +56,18 @@ static void intel_dp_aux_unpack(u32 src, u8 *dst, int dst_bytes)
|
||||
static u32
|
||||
intel_dp_aux_wait_done(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
i915_reg_t ch_ctl = intel_dp->aux_ch_ctl_reg(intel_dp);
|
||||
const unsigned int timeout_ms = 10;
|
||||
u32 status;
|
||||
int ret;
|
||||
|
||||
ret = intel_de_wait_custom(i915, ch_ctl, DP_AUX_CH_CTL_SEND_BUSY, 0,
|
||||
ret = intel_de_wait_custom(display, ch_ctl, DP_AUX_CH_CTL_SEND_BUSY,
|
||||
0,
|
||||
2, timeout_ms, &status);
|
||||
|
||||
if (ret == -ETIMEDOUT)
|
||||
drm_err(&i915->drm,
|
||||
drm_err(display->drm,
|
||||
"%s: did not complete or timeout within %ums (status 0x%08x)\n",
|
||||
intel_dp->aux.name, timeout_ms, status);
|
||||
|
||||
@ -74,7 +76,7 @@ intel_dp_aux_wait_done(struct intel_dp *intel_dp)
|
||||
|
||||
static u32 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
if (index)
|
||||
return 0;
|
||||
@ -83,12 +85,12 @@ static u32 g4x_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
|
||||
* The clock divider is based off the hrawclk, and would like to run at
|
||||
* 2MHz. So, take the hrawclk value and divide by 2000 and use that
|
||||
*/
|
||||
return DIV_ROUND_CLOSEST(DISPLAY_RUNTIME_INFO(i915)->rawclk_freq, 2000);
|
||||
return DIV_ROUND_CLOSEST(DISPLAY_RUNTIME_INFO(display)->rawclk_freq, 2000);
|
||||
}
|
||||
|
||||
static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
u32 freq;
|
||||
|
||||
@ -101,15 +103,16 @@ static u32 ilk_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
|
||||
* divide by 2000 and use that
|
||||
*/
|
||||
if (dig_port->aux_ch == AUX_CH_A)
|
||||
freq = i915->display.cdclk.hw.cdclk;
|
||||
freq = display->cdclk.hw.cdclk;
|
||||
else
|
||||
freq = DISPLAY_RUNTIME_INFO(i915)->rawclk_freq;
|
||||
freq = DISPLAY_RUNTIME_INFO(display)->rawclk_freq;
|
||||
return DIV_ROUND_CLOSEST(freq, 2000);
|
||||
}
|
||||
|
||||
static u32 hsw_get_aux_clock_divider(struct intel_dp *intel_dp, int index)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
|
||||
if (dig_port->aux_ch != AUX_CH_A && HAS_PCH_LPT_H(i915)) {
|
||||
@ -142,16 +145,21 @@ static int intel_dp_aux_sync_len(void)
|
||||
return precharge + preamble;
|
||||
}
|
||||
|
||||
int intel_dp_aux_fw_sync_len(void)
|
||||
int intel_dp_aux_fw_sync_len(struct intel_dp *intel_dp)
|
||||
{
|
||||
int precharge = 10; /* 10-16 */
|
||||
int preamble = 8;
|
||||
|
||||
/*
|
||||
* We faced some glitches on Dell Precision 5490 MTL laptop with panel:
|
||||
* "Manufacturer: AUO, Model: 63898" when using HW default 18. Using 20
|
||||
* is fixing these problems with the panel. It is still within range
|
||||
* mentioned in eDP specification.
|
||||
* mentioned in eDP specification. Increasing Fast Wake sync length is
|
||||
* causing problems with other panels: increase length as a quirk for
|
||||
* this specific laptop.
|
||||
*/
|
||||
int precharge = 12; /* 10-16 */
|
||||
int preamble = 8;
|
||||
if (intel_has_dpcd_quirk(intel_dp, QUIRK_FW_SYNC_LEN))
|
||||
precharge += 2;
|
||||
|
||||
return precharge + preamble;
|
||||
}
|
||||
@ -195,8 +203,8 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,
|
||||
int send_bytes,
|
||||
u32 unused)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
u32 ret;
|
||||
|
||||
/*
|
||||
@ -211,7 +219,7 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,
|
||||
DP_AUX_CH_CTL_TIME_OUT_MAX |
|
||||
DP_AUX_CH_CTL_RECEIVE_ERROR |
|
||||
DP_AUX_CH_CTL_MESSAGE_SIZE(send_bytes) |
|
||||
DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(intel_dp_aux_fw_sync_len()) |
|
||||
DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(intel_dp_aux_fw_sync_len(intel_dp)) |
|
||||
DP_AUX_CH_CTL_SYNC_PULSE_SKL(intel_dp_aux_sync_len());
|
||||
|
||||
if (intel_tc_port_in_tbt_alt_mode(dig_port))
|
||||
@ -221,7 +229,7 @@ static u32 skl_get_aux_send_ctl(struct intel_dp *intel_dp,
|
||||
* Power request bit is already set during aux power well enable.
|
||||
* Preserve the bit across aux transactions.
|
||||
*/
|
||||
if (DISPLAY_VER(i915) >= 14)
|
||||
if (DISPLAY_VER(display) >= 14)
|
||||
ret |= XELPDP_DP_AUX_CH_CTL_POWER_REQUEST;
|
||||
|
||||
return ret;
|
||||
@ -233,6 +241,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
|
||||
u8 *recv, int recv_size,
|
||||
u32 aux_send_ctl_flags)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
|
||||
@ -291,7 +300,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
|
||||
|
||||
/* Try to wait for any previous AUX channel activity */
|
||||
for (try = 0; try < 3; try++) {
|
||||
status = intel_de_read_notrace(i915, ch_ctl);
|
||||
status = intel_de_read_notrace(display, ch_ctl);
|
||||
if ((status & DP_AUX_CH_CTL_SEND_BUSY) == 0)
|
||||
break;
|
||||
msleep(1);
|
||||
@ -300,10 +309,10 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
|
||||
trace_i915_reg_rw(false, ch_ctl, status, sizeof(status), true);
|
||||
|
||||
if (try == 3) {
|
||||
const u32 status = intel_de_read(i915, ch_ctl);
|
||||
const u32 status = intel_de_read(display, ch_ctl);
|
||||
|
||||
if (status != intel_dp->aux_busy_last_status) {
|
||||
drm_WARN(&i915->drm, 1,
|
||||
drm_WARN(display->drm, 1,
|
||||
"%s: not started (status 0x%08x)\n",
|
||||
intel_dp->aux.name, status);
|
||||
intel_dp->aux_busy_last_status = status;
|
||||
@ -314,7 +323,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
/* Only 5 data registers! */
|
||||
if (drm_WARN_ON(&i915->drm, send_bytes > 20 || recv_size > 20)) {
|
||||
if (drm_WARN_ON(display->drm, send_bytes > 20 || recv_size > 20)) {
|
||||
ret = -E2BIG;
|
||||
goto out;
|
||||
}
|
||||
@ -330,17 +339,17 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
|
||||
for (try = 0; try < 5; try++) {
|
||||
/* Load the send data into the aux channel data registers */
|
||||
for (i = 0; i < send_bytes; i += 4)
|
||||
intel_de_write(i915, ch_data[i >> 2],
|
||||
intel_de_write(display, ch_data[i >> 2],
|
||||
intel_dp_aux_pack(send + i,
|
||||
send_bytes - i));
|
||||
|
||||
/* Send the command and wait for it to complete */
|
||||
intel_de_write(i915, ch_ctl, send_ctl);
|
||||
intel_de_write(display, ch_ctl, send_ctl);
|
||||
|
||||
status = intel_dp_aux_wait_done(intel_dp);
|
||||
|
||||
/* Clear done status and any errors */
|
||||
intel_de_write(i915, ch_ctl,
|
||||
intel_de_write(display, ch_ctl,
|
||||
status | DP_AUX_CH_CTL_DONE |
|
||||
DP_AUX_CH_CTL_TIME_OUT_ERROR |
|
||||
DP_AUX_CH_CTL_RECEIVE_ERROR);
|
||||
@ -364,7 +373,7 @@ intel_dp_aux_xfer(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
if ((status & DP_AUX_CH_CTL_DONE) == 0) {
|
||||
drm_err(&i915->drm, "%s: not done (status 0x%08x)\n",
|
||||
drm_err(display->drm, "%s: not done (status 0x%08x)\n",
|
||||
intel_dp->aux.name, status);
|
||||
ret = -EBUSY;
|
||||
goto out;
|
||||
@ -376,7 +385,7 @@ done:
|
||||
* not connected.
|
||||
*/
|
||||
if (status & DP_AUX_CH_CTL_RECEIVE_ERROR) {
|
||||
drm_err(&i915->drm, "%s: receive error (status 0x%08x)\n",
|
||||
drm_err(display->drm, "%s: receive error (status 0x%08x)\n",
|
||||
intel_dp->aux.name, status);
|
||||
ret = -EIO;
|
||||
goto out;
|
||||
@ -387,7 +396,7 @@ done:
|
||||
* -- don't fill the kernel log with these
|
||||
*/
|
||||
if (status & DP_AUX_CH_CTL_TIME_OUT_ERROR) {
|
||||
drm_dbg_kms(&i915->drm, "%s: timeout (status 0x%08x)\n",
|
||||
drm_dbg_kms(display->drm, "%s: timeout (status 0x%08x)\n",
|
||||
intel_dp->aux.name, status);
|
||||
ret = -ETIMEDOUT;
|
||||
goto out;
|
||||
@ -402,7 +411,7 @@ done:
|
||||
* drm layer takes care for the necessary retries.
|
||||
*/
|
||||
if (recv_bytes == 0 || recv_bytes > 20) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"%s: Forbidden recv_bytes = %d on aux transaction\n",
|
||||
intel_dp->aux.name, recv_bytes);
|
||||
ret = -EBUSY;
|
||||
@ -413,7 +422,7 @@ done:
|
||||
recv_bytes = recv_size;
|
||||
|
||||
for (i = 0; i < recv_bytes; i += 4)
|
||||
intel_dp_aux_unpack(intel_de_read(i915, ch_data[i >> 2]),
|
||||
intel_dp_aux_unpack(intel_de_read(display, ch_data[i >> 2]),
|
||||
recv + i, recv_bytes - i);
|
||||
|
||||
ret = recv_bytes;
|
||||
@ -462,7 +471,7 @@ static ssize_t
|
||||
intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
|
||||
{
|
||||
struct intel_dp *intel_dp = container_of(aux, struct intel_dp, aux);
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
u8 txbuf[20], rxbuf[20];
|
||||
size_t txsize, rxsize;
|
||||
u32 flags = intel_dp_aux_xfer_flags(msg);
|
||||
@ -477,10 +486,10 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
|
||||
txsize = msg->size ? HEADER_SIZE + msg->size : BARE_ADDRESS_SIZE;
|
||||
rxsize = 2; /* 0 or 1 data bytes */
|
||||
|
||||
if (drm_WARN_ON(&i915->drm, txsize > 20))
|
||||
if (drm_WARN_ON(display->drm, txsize > 20))
|
||||
return -E2BIG;
|
||||
|
||||
drm_WARN_ON(&i915->drm, !msg->buffer != !msg->size);
|
||||
drm_WARN_ON(display->drm, !msg->buffer != !msg->size);
|
||||
|
||||
if (msg->buffer)
|
||||
memcpy(txbuf + HEADER_SIZE, msg->buffer, msg->size);
|
||||
@ -505,7 +514,7 @@ intel_dp_aux_transfer(struct drm_dp_aux *aux, struct drm_dp_aux_msg *msg)
|
||||
txsize = msg->size ? HEADER_SIZE : BARE_ADDRESS_SIZE;
|
||||
rxsize = msg->size + 1;
|
||||
|
||||
if (drm_WARN_ON(&i915->drm, rxsize > 20))
|
||||
if (drm_WARN_ON(display->drm, rxsize > 20))
|
||||
return -E2BIG;
|
||||
|
||||
ret = intel_dp_aux_xfer(intel_dp, txbuf, txsize,
|
||||
@ -715,7 +724,7 @@ static i915_reg_t tgl_aux_data_reg(struct intel_dp *intel_dp, int index)
|
||||
|
||||
static i915_reg_t xelpdp_aux_ctl_reg(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
enum aux_ch aux_ch = dig_port->aux_ch;
|
||||
|
||||
@ -726,16 +735,16 @@ static i915_reg_t xelpdp_aux_ctl_reg(struct intel_dp *intel_dp)
|
||||
case AUX_CH_USBC2:
|
||||
case AUX_CH_USBC3:
|
||||
case AUX_CH_USBC4:
|
||||
return XELPDP_DP_AUX_CH_CTL(i915, aux_ch);
|
||||
return XELPDP_DP_AUX_CH_CTL(display, aux_ch);
|
||||
default:
|
||||
MISSING_CASE(aux_ch);
|
||||
return XELPDP_DP_AUX_CH_CTL(i915, AUX_CH_A);
|
||||
return XELPDP_DP_AUX_CH_CTL(display, AUX_CH_A);
|
||||
}
|
||||
}
|
||||
|
||||
static i915_reg_t xelpdp_aux_data_reg(struct intel_dp *intel_dp, int index)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
enum aux_ch aux_ch = dig_port->aux_ch;
|
||||
|
||||
@ -746,10 +755,10 @@ static i915_reg_t xelpdp_aux_data_reg(struct intel_dp *intel_dp, int index)
|
||||
case AUX_CH_USBC2:
|
||||
case AUX_CH_USBC3:
|
||||
case AUX_CH_USBC4:
|
||||
return XELPDP_DP_AUX_CH_DATA(i915, aux_ch, index);
|
||||
return XELPDP_DP_AUX_CH_DATA(display, aux_ch, index);
|
||||
default:
|
||||
MISSING_CASE(aux_ch);
|
||||
return XELPDP_DP_AUX_CH_DATA(i915, AUX_CH_A, index);
|
||||
return XELPDP_DP_AUX_CH_DATA(display, AUX_CH_A, index);
|
||||
}
|
||||
}
|
||||
|
||||
@ -763,19 +772,20 @@ void intel_dp_aux_fini(struct intel_dp *intel_dp)
|
||||
|
||||
void intel_dp_aux_init(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
enum aux_ch aux_ch = dig_port->aux_ch;
|
||||
char buf[AUX_CH_NAME_BUFSIZE];
|
||||
|
||||
if (DISPLAY_VER(i915) >= 14) {
|
||||
if (DISPLAY_VER(display) >= 14) {
|
||||
intel_dp->aux_ch_ctl_reg = xelpdp_aux_ctl_reg;
|
||||
intel_dp->aux_ch_data_reg = xelpdp_aux_data_reg;
|
||||
} else if (DISPLAY_VER(i915) >= 12) {
|
||||
} else if (DISPLAY_VER(display) >= 12) {
|
||||
intel_dp->aux_ch_ctl_reg = tgl_aux_ctl_reg;
|
||||
intel_dp->aux_ch_data_reg = tgl_aux_data_reg;
|
||||
} else if (DISPLAY_VER(i915) >= 9) {
|
||||
} else if (DISPLAY_VER(display) >= 9) {
|
||||
intel_dp->aux_ch_ctl_reg = skl_aux_ctl_reg;
|
||||
intel_dp->aux_ch_data_reg = skl_aux_data_reg;
|
||||
} else if (HAS_PCH_SPLIT(i915)) {
|
||||
@ -789,7 +799,7 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
|
||||
intel_dp->aux_ch_data_reg = g4x_aux_data_reg;
|
||||
}
|
||||
|
||||
if (DISPLAY_VER(i915) >= 9)
|
||||
if (DISPLAY_VER(display) >= 9)
|
||||
intel_dp->get_aux_clock_divider = skl_get_aux_clock_divider;
|
||||
else if (IS_BROADWELL(i915) || IS_HASWELL(i915))
|
||||
intel_dp->get_aux_clock_divider = hsw_get_aux_clock_divider;
|
||||
@ -798,17 +808,17 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
|
||||
else
|
||||
intel_dp->get_aux_clock_divider = g4x_get_aux_clock_divider;
|
||||
|
||||
if (DISPLAY_VER(i915) >= 9)
|
||||
if (DISPLAY_VER(display) >= 9)
|
||||
intel_dp->get_aux_send_ctl = skl_get_aux_send_ctl;
|
||||
else
|
||||
intel_dp->get_aux_send_ctl = g4x_get_aux_send_ctl;
|
||||
|
||||
intel_dp->aux.drm_dev = &i915->drm;
|
||||
intel_dp->aux.drm_dev = display->drm;
|
||||
drm_dp_aux_init(&intel_dp->aux);
|
||||
|
||||
/* Failure to allocate our preferred name is not critical */
|
||||
intel_dp->aux.name = kasprintf(GFP_KERNEL, "AUX %s/%s",
|
||||
aux_ch_name(i915, buf, sizeof(buf), aux_ch),
|
||||
aux_ch_name(display, buf, sizeof(buf), aux_ch),
|
||||
encoder->base.name);
|
||||
|
||||
intel_dp->aux.transfer = intel_dp_aux_transfer;
|
||||
@ -817,10 +827,10 @@ void intel_dp_aux_init(struct intel_dp *intel_dp)
|
||||
|
||||
static enum aux_ch default_aux_ch(struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
|
||||
/* SKL has DDI E but no AUX E */
|
||||
if (DISPLAY_VER(i915) == 9 && encoder->port == PORT_E)
|
||||
if (DISPLAY_VER(display) == 9 && encoder->port == PORT_E)
|
||||
return AUX_CH_A;
|
||||
|
||||
return (enum aux_ch)encoder->port;
|
||||
@ -830,10 +840,10 @@ static struct intel_encoder *
|
||||
get_encoder_by_aux_ch(struct intel_encoder *encoder,
|
||||
enum aux_ch aux_ch)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_encoder *other;
|
||||
|
||||
for_each_intel_encoder(&i915->drm, other) {
|
||||
for_each_intel_encoder(display->drm, other) {
|
||||
if (other == encoder)
|
||||
continue;
|
||||
|
||||
@ -849,7 +859,7 @@ get_encoder_by_aux_ch(struct intel_encoder *encoder,
|
||||
|
||||
enum aux_ch intel_dp_aux_ch(struct intel_encoder *encoder)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
|
||||
struct intel_display *display = to_intel_display(encoder);
|
||||
struct intel_encoder *other;
|
||||
const char *source;
|
||||
enum aux_ch aux_ch;
|
||||
@ -870,23 +880,23 @@ enum aux_ch intel_dp_aux_ch(struct intel_encoder *encoder)
|
||||
|
||||
other = get_encoder_by_aux_ch(encoder, aux_ch);
|
||||
if (other) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[ENCODER:%d:%s] AUX CH %s already claimed by [ENCODER:%d:%s]\n",
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
aux_ch_name(i915, buf, sizeof(buf), aux_ch),
|
||||
aux_ch_name(display, buf, sizeof(buf), aux_ch),
|
||||
other->base.base.id, other->base.name);
|
||||
return AUX_CH_NONE;
|
||||
}
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[ENCODER:%d:%s] Using AUX CH %s (%s)\n",
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
aux_ch_name(i915, buf, sizeof(buf), aux_ch), source);
|
||||
aux_ch_name(display, buf, sizeof(buf), aux_ch), source);
|
||||
|
||||
return aux_ch;
|
||||
}
|
||||
|
||||
void intel_dp_aux_irq_handler(struct drm_i915_private *i915)
|
||||
void intel_dp_aux_irq_handler(struct intel_display *display)
|
||||
{
|
||||
wake_up_all(&i915->display.gmbus.wait_queue);
|
||||
wake_up_all(&display->gmbus.wait_queue);
|
||||
}
|
||||
|
@ -9,7 +9,7 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
enum aux_ch;
|
||||
struct drm_i915_private;
|
||||
struct intel_display;
|
||||
struct intel_dp;
|
||||
struct intel_encoder;
|
||||
|
||||
@ -18,8 +18,8 @@ void intel_dp_aux_init(struct intel_dp *intel_dp);
|
||||
|
||||
enum aux_ch intel_dp_aux_ch(struct intel_encoder *encoder);
|
||||
|
||||
void intel_dp_aux_irq_handler(struct drm_i915_private *i915);
|
||||
void intel_dp_aux_irq_handler(struct intel_display *display);
|
||||
u32 intel_dp_aux_pack(const u8 *src, int src_bytes);
|
||||
int intel_dp_aux_fw_sync_len(void);
|
||||
int intel_dp_aux_fw_sync_len(struct intel_dp *intel_dp);
|
||||
|
||||
#endif /* __INTEL_DP_AUX_H__ */
|
||||
|
@ -39,13 +39,13 @@
|
||||
drm_dp_phy_name(_dp_phy)
|
||||
|
||||
#define lt_dbg(_intel_dp, _dp_phy, _format, ...) \
|
||||
drm_dbg_kms(&dp_to_i915(_intel_dp)->drm, \
|
||||
drm_dbg_kms(to_intel_display(_intel_dp)->drm, \
|
||||
LT_MSG_PREFIX _format, \
|
||||
LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__)
|
||||
|
||||
#define lt_err(_intel_dp, _dp_phy, _format, ...) do { \
|
||||
if (intel_digital_port_connected(&dp_to_dig_port(_intel_dp)->base)) \
|
||||
drm_err(&dp_to_i915(_intel_dp)->drm, \
|
||||
drm_err(to_intel_display(_intel_dp)->drm, \
|
||||
LT_MSG_PREFIX _format, \
|
||||
LT_MSG_ARGS(_intel_dp, _dp_phy), ## __VA_ARGS__); \
|
||||
else \
|
||||
@ -216,7 +216,8 @@ static int intel_dp_init_lttpr(struct intel_dp *intel_dp, const u8 dpcd[DP_RECEI
|
||||
|
||||
int intel_dp_read_dprx_caps(struct intel_dp *intel_dp, u8 dpcd[DP_RECEIVER_CAP_SIZE])
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
if (intel_dp_is_edp(intel_dp))
|
||||
return 0;
|
||||
@ -225,7 +226,7 @@ int intel_dp_read_dprx_caps(struct intel_dp *intel_dp, u8 dpcd[DP_RECEIVER_CAP_S
|
||||
* Detecting LTTPRs must be avoided on platforms with an AUX timeout
|
||||
* period < 3.2ms. (see DP Standard v2.0, 2.11.2, 3.6.6.1).
|
||||
*/
|
||||
if (DISPLAY_VER(i915) >= 10 && !IS_GEMINILAKE(i915))
|
||||
if (DISPLAY_VER(display) >= 10 && !IS_GEMINILAKE(i915))
|
||||
if (drm_dp_dpcd_probe(&intel_dp->aux,
|
||||
DP_LT_TUNABLE_PHY_REPEATER_FIELD_DATA_STRUCTURE_REV))
|
||||
return -EIO;
|
||||
@ -256,7 +257,8 @@ int intel_dp_read_dprx_caps(struct intel_dp *intel_dp, u8 dpcd[DP_RECEIVER_CAP_S
|
||||
*/
|
||||
int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
int lttpr_count = 0;
|
||||
|
||||
/*
|
||||
@ -264,7 +266,7 @@ int intel_dp_init_lttpr_and_dprx_caps(struct intel_dp *intel_dp)
|
||||
* period < 3.2ms. (see DP Standard v2.0, 2.11.2, 3.6.6.1).
|
||||
*/
|
||||
if (!intel_dp_is_edp(intel_dp) &&
|
||||
(DISPLAY_VER(i915) >= 10 && !IS_GEMINILAKE(i915))) {
|
||||
(DISPLAY_VER(display) >= 10 && !IS_GEMINILAKE(i915))) {
|
||||
u8 dpcd[DP_RECEIVER_CAP_SIZE];
|
||||
int err = intel_dp_read_dprx_caps(intel_dp, dpcd);
|
||||
|
||||
@ -327,10 +329,11 @@ static bool
|
||||
intel_dp_phy_is_downstream_of_source(struct intel_dp *intel_dp,
|
||||
enum drm_dp_phy dp_phy)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
int lttpr_count = drm_dp_lttpr_count(intel_dp->lttpr_common_caps);
|
||||
|
||||
drm_WARN_ON_ONCE(&i915->drm, lttpr_count <= 0 && dp_phy != DP_PHY_DPRX);
|
||||
drm_WARN_ON_ONCE(display->drm,
|
||||
lttpr_count <= 0 && dp_phy != DP_PHY_DPRX);
|
||||
|
||||
return lttpr_count <= 0 || dp_phy == DP_PHY_LTTPR(lttpr_count - 1);
|
||||
}
|
||||
@ -339,7 +342,7 @@ static u8 intel_dp_phy_voltage_max(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
enum drm_dp_phy dp_phy)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
u8 voltage_max;
|
||||
|
||||
/*
|
||||
@ -351,7 +354,7 @@ static u8 intel_dp_phy_voltage_max(struct intel_dp *intel_dp,
|
||||
else
|
||||
voltage_max = intel_dp_lttpr_voltage_max(intel_dp, dp_phy + 1);
|
||||
|
||||
drm_WARN_ON_ONCE(&i915->drm,
|
||||
drm_WARN_ON_ONCE(display->drm,
|
||||
voltage_max != DP_TRAIN_VOLTAGE_SWING_LEVEL_2 &&
|
||||
voltage_max != DP_TRAIN_VOLTAGE_SWING_LEVEL_3);
|
||||
|
||||
@ -361,7 +364,7 @@ static u8 intel_dp_phy_voltage_max(struct intel_dp *intel_dp,
|
||||
static u8 intel_dp_phy_preemph_max(struct intel_dp *intel_dp,
|
||||
enum drm_dp_phy dp_phy)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
u8 preemph_max;
|
||||
|
||||
/*
|
||||
@ -373,7 +376,7 @@ static u8 intel_dp_phy_preemph_max(struct intel_dp *intel_dp,
|
||||
else
|
||||
preemph_max = intel_dp_lttpr_preemph_max(intel_dp, dp_phy + 1);
|
||||
|
||||
drm_WARN_ON_ONCE(&i915->drm,
|
||||
drm_WARN_ON_ONCE(display->drm,
|
||||
preemph_max != DP_TRAIN_PRE_EMPH_LEVEL_2 &&
|
||||
preemph_max != DP_TRAIN_PRE_EMPH_LEVEL_3);
|
||||
|
||||
@ -383,10 +386,11 @@ static u8 intel_dp_phy_preemph_max(struct intel_dp *intel_dp,
|
||||
static bool has_per_lane_signal_levels(struct intel_dp *intel_dp,
|
||||
enum drm_dp_phy dp_phy)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
return !intel_dp_phy_is_downstream_of_source(intel_dp, dp_phy) ||
|
||||
DISPLAY_VER(i915) >= 10 || IS_BROXTON(i915);
|
||||
DISPLAY_VER(display) >= 10 || IS_BROXTON(i915);
|
||||
}
|
||||
|
||||
/* 128b/132b */
|
||||
@ -950,7 +954,8 @@ static u32 intel_dp_training_pattern(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
enum drm_dp_phy dp_phy)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
bool source_tps3, sink_tps3, source_tps4, sink_tps4;
|
||||
|
||||
/* UHBR+ use separate 128b/132b TPS2 */
|
||||
@ -1586,7 +1591,7 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,
|
||||
struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
|
||||
struct intel_encoder *encoder = &dig_port->base;
|
||||
bool passed;
|
||||
@ -1631,7 +1636,7 @@ void intel_dp_start_link_train(struct intel_atomic_state *state,
|
||||
* For test cases which rely on the link training or processing of HPDs
|
||||
* ignore_long_hpd flag can unset from the testcase.
|
||||
*/
|
||||
if (i915->display.hotplug.ignore_long_hpd) {
|
||||
if (display->hotplug.ignore_long_hpd) {
|
||||
lt_dbg(intel_dp, DP_PHY_DPRX, "Ignore the link failure\n");
|
||||
return;
|
||||
}
|
||||
@ -1683,14 +1688,14 @@ static struct intel_dp *intel_connector_to_intel_dp(struct intel_connector *conn
|
||||
static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int current_rate = -1;
|
||||
int force_rate;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -1698,7 +1703,7 @@ static int i915_dp_force_link_rate_show(struct seq_file *m, void *data)
|
||||
current_rate = intel_dp->link_rate;
|
||||
force_rate = intel_dp->link.force_rate;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
seq_printf(m, "%sauto%s",
|
||||
force_rate == 0 ? "[" : "",
|
||||
@ -1754,7 +1759,7 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int rate;
|
||||
int err;
|
||||
@ -1763,14 +1768,14 @@ static ssize_t i915_dp_force_link_rate_write(struct file *file,
|
||||
if (rate < 0)
|
||||
return rate;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
intel_dp_reset_link_params(intel_dp);
|
||||
intel_dp->link.force_rate = rate;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
*offp += len;
|
||||
|
||||
@ -1781,14 +1786,14 @@ DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_link_rate);
|
||||
static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int current_lane_count = -1;
|
||||
int force_lane_count;
|
||||
int err;
|
||||
int i;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
@ -1796,7 +1801,7 @@ static int i915_dp_force_lane_count_show(struct seq_file *m, void *data)
|
||||
current_lane_count = intel_dp->lane_count;
|
||||
force_lane_count = intel_dp->link.force_lane_count;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
seq_printf(m, "%sauto%s",
|
||||
force_lane_count == 0 ? "[" : "",
|
||||
@ -1856,7 +1861,7 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file,
|
||||
{
|
||||
struct seq_file *m = file->private_data;
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int lane_count;
|
||||
int err;
|
||||
@ -1865,14 +1870,14 @@ static ssize_t i915_dp_force_lane_count_write(struct file *file,
|
||||
if (lane_count < 0)
|
||||
return lane_count;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
intel_dp_reset_link_params(intel_dp);
|
||||
intel_dp->link.force_lane_count = lane_count;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
*offp += len;
|
||||
|
||||
@ -1883,17 +1888,17 @@ DEFINE_SHOW_STORE_ATTRIBUTE(i915_dp_force_lane_count);
|
||||
static int i915_dp_max_link_rate_show(void *data, u64 *val)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(data);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*val = intel_dp->link.max_rate;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1902,17 +1907,17 @@ DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_link_rate_fops, i915_dp_max_link_rate_show,
|
||||
static int i915_dp_max_lane_count_show(void *data, u64 *val)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(data);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*val = intel_dp->link.max_lane_count;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1921,17 +1926,17 @@ DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_max_lane_count_fops, i915_dp_max_lane_count_sho
|
||||
static int i915_dp_force_link_training_failure_show(void *data, u64 *val)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(data);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*val = intel_dp->link.force_train_failure;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1939,20 +1944,20 @@ static int i915_dp_force_link_training_failure_show(void *data, u64 *val)
|
||||
static int i915_dp_force_link_training_failure_write(void *data, u64 val)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(data);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
if (val > 2)
|
||||
return -EINVAL;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
intel_dp->link.force_train_failure = val;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1963,17 +1968,17 @@ DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_force_link_training_failure_fops,
|
||||
static int i915_dp_force_link_retrain_show(void *data, u64 *val)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(data);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
*val = intel_dp->link.force_retrain;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -1981,17 +1986,17 @@ static int i915_dp_force_link_retrain_show(void *data, u64 *val)
|
||||
static int i915_dp_force_link_retrain_write(void *data, u64 val)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(data);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
intel_dp->link.force_retrain = val;
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
intel_hpd_trigger_irq(dp_to_dig_port(intel_dp));
|
||||
|
||||
@ -2004,17 +2009,17 @@ DEFINE_DEBUGFS_ATTRIBUTE(i915_dp_force_link_retrain_fops,
|
||||
static int i915_dp_link_retrain_disabled_show(struct seq_file *m, void *data)
|
||||
{
|
||||
struct intel_connector *connector = to_intel_connector(m->private);
|
||||
struct drm_i915_private *i915 = to_i915(connector->base.dev);
|
||||
struct intel_display *display = to_intel_display(connector);
|
||||
struct intel_dp *intel_dp = intel_connector_to_intel_dp(connector);
|
||||
int err;
|
||||
|
||||
err = drm_modeset_lock_single_interruptible(&i915->drm.mode_config.connection_mutex);
|
||||
err = drm_modeset_lock_single_interruptible(&display->drm->mode_config.connection_mutex);
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
seq_printf(m, "%s\n", str_yes_no(intel_dp->link.retrain_disabled));
|
||||
|
||||
drm_modeset_unlock(&i915->drm.mode_config.connection_mutex);
|
||||
drm_modeset_unlock(&display->drm->mode_config.connection_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -69,7 +69,7 @@ static int get_current_link_bw(struct intel_dp *intel_dp,
|
||||
|
||||
static int update_tunnel_state(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
bool old_bw_below_dprx;
|
||||
bool new_bw_below_dprx;
|
||||
@ -81,7 +81,7 @@ static int update_tunnel_state(struct intel_dp *intel_dp)
|
||||
|
||||
ret = drm_dp_tunnel_update_state(intel_dp->tunnel);
|
||||
if (ret < 0) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][ENCODER:%d:%s] State update failed (err %pe)\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
@ -103,7 +103,7 @@ static int update_tunnel_state(struct intel_dp *intel_dp)
|
||||
!new_bw_below_dprx)
|
||||
return 0;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][ENCODER:%d:%s] Notify users about BW change: %d -> %d\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
@ -121,20 +121,20 @@ static int update_tunnel_state(struct intel_dp *intel_dp)
|
||||
*/
|
||||
static int allocate_initial_tunnel_bw_for_pipes(struct intel_dp *intel_dp, u8 pipe_mask)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
struct intel_crtc *crtc;
|
||||
int tunnel_bw = 0;
|
||||
int err;
|
||||
|
||||
for_each_intel_crtc_in_pipe_mask(&i915->drm, crtc, pipe_mask) {
|
||||
for_each_intel_crtc_in_pipe_mask(display->drm, crtc, pipe_mask) {
|
||||
const struct intel_crtc_state *crtc_state =
|
||||
to_intel_crtc_state(crtc->base.state);
|
||||
int stream_bw = intel_dp_config_required_rate(crtc_state);
|
||||
|
||||
tunnel_bw += stream_bw;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][ENCODER:%d:%s][CRTC:%d:%s] Initial BW for stream %d: %d/%d Mb/s\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
@ -145,7 +145,7 @@ static int allocate_initial_tunnel_bw_for_pipes(struct intel_dp *intel_dp, u8 pi
|
||||
|
||||
err = drm_dp_tunnel_alloc_bw(intel_dp->tunnel, tunnel_bw);
|
||||
if (err) {
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][ENCODER:%d:%s] Initial BW allocation failed (err %pe)\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
@ -172,12 +172,12 @@ static int allocate_initial_tunnel_bw(struct intel_dp *intel_dp,
|
||||
|
||||
static int detect_new_tunnel(struct intel_dp *intel_dp, struct drm_modeset_acquire_ctx *ctx)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
struct drm_dp_tunnel *tunnel;
|
||||
int ret;
|
||||
|
||||
tunnel = drm_dp_tunnel_detect(i915->display.dp_tunnel_mgr,
|
||||
tunnel = drm_dp_tunnel_detect(display->dp_tunnel_mgr,
|
||||
&intel_dp->aux);
|
||||
if (IS_ERR(tunnel))
|
||||
return PTR_ERR(tunnel);
|
||||
@ -189,7 +189,7 @@ static int detect_new_tunnel(struct intel_dp *intel_dp, struct drm_modeset_acqui
|
||||
if (ret == -EOPNOTSUPP)
|
||||
return 0;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][ENCODER:%d:%s] Failed to enable BW allocation mode (ret %pe)\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
encoder->base.base.id, encoder->base.name,
|
||||
@ -266,14 +266,15 @@ bool intel_dp_tunnel_bw_alloc_is_enabled(struct intel_dp *intel_dp)
|
||||
*/
|
||||
void intel_dp_tunnel_suspend(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_connector *connector = intel_dp->attached_connector;
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
|
||||
if (!intel_dp_tunnel_bw_alloc_is_enabled(intel_dp))
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&i915->drm, "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Suspend\n",
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Suspend\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
connector->base.base.id, connector->base.name,
|
||||
encoder->base.base.id, encoder->base.name);
|
||||
@ -295,7 +296,7 @@ void intel_dp_tunnel_resume(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
bool dpcd_updated)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct intel_connector *connector = intel_dp->attached_connector;
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
u8 dpcd[DP_RECEIVER_CAP_SIZE];
|
||||
@ -307,7 +308,8 @@ void intel_dp_tunnel_resume(struct intel_dp *intel_dp,
|
||||
|
||||
intel_dp->tunnel_suspended = false;
|
||||
|
||||
drm_dbg_kms(&i915->drm, "[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Resume\n",
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Resume\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
connector->base.base.id, connector->base.name,
|
||||
encoder->base.base.id, encoder->base.name);
|
||||
@ -347,7 +349,7 @@ void intel_dp_tunnel_resume(struct intel_dp *intel_dp,
|
||||
return;
|
||||
|
||||
out_err:
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s] Tunnel can't be resumed, will drop and reject it (err %pe)\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
connector->base.base.id, connector->base.name,
|
||||
@ -369,12 +371,12 @@ add_inherited_tunnel(struct intel_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel,
|
||||
struct intel_crtc *crtc)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct drm_dp_tunnel *old_tunnel;
|
||||
|
||||
old_tunnel = get_inherited_tunnel(state, crtc);
|
||||
if (old_tunnel) {
|
||||
drm_WARN_ON(&i915->drm, old_tunnel != tunnel);
|
||||
drm_WARN_ON(display->drm, old_tunnel != tunnel);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -394,7 +396,7 @@ static int check_inherited_tunnel_state(struct intel_atomic_state *state,
|
||||
struct intel_dp *intel_dp,
|
||||
const struct intel_digital_connector_state *old_conn_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = dp_to_i915(intel_dp);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
struct intel_connector *connector =
|
||||
to_intel_connector(old_conn_state->base.connector);
|
||||
@ -422,7 +424,7 @@ static int check_inherited_tunnel_state(struct intel_atomic_state *state,
|
||||
old_crtc_state->dp_tunnel_ref.tunnel == intel_dp->tunnel)
|
||||
return 0;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Adding state for inherited tunnel %p\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
connector->base.base.id, connector->base.name,
|
||||
@ -441,12 +443,13 @@ static int check_inherited_tunnel_state(struct intel_atomic_state *state,
|
||||
*/
|
||||
void intel_dp_tunnel_atomic_cleanup_inherited_state(struct intel_atomic_state *state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
enum pipe pipe;
|
||||
|
||||
if (!state->inherited_dp_tunnels)
|
||||
return;
|
||||
|
||||
for_each_pipe(to_i915(state->base.dev), pipe)
|
||||
for_each_pipe(display, pipe)
|
||||
if (state->inherited_dp_tunnels->ref[pipe].tunnel)
|
||||
drm_dp_tunnel_ref_put(&state->inherited_dp_tunnels->ref[pipe]);
|
||||
|
||||
@ -457,7 +460,7 @@ void intel_dp_tunnel_atomic_cleanup_inherited_state(struct intel_atomic_state *s
|
||||
static int intel_dp_tunnel_atomic_add_group_state(struct intel_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
u32 pipe_mask;
|
||||
int err;
|
||||
|
||||
@ -466,7 +469,7 @@ static int intel_dp_tunnel_atomic_add_group_state(struct intel_atomic_state *sta
|
||||
if (err)
|
||||
return err;
|
||||
|
||||
drm_WARN_ON(&i915->drm, pipe_mask & ~((1 << I915_MAX_PIPES) - 1));
|
||||
drm_WARN_ON(display->drm, pipe_mask & ~((1 << I915_MAX_PIPES) - 1));
|
||||
|
||||
return intel_modeset_pipes_in_mask_early(state, "DPTUN", pipe_mask);
|
||||
}
|
||||
@ -504,7 +507,7 @@ static int check_group_state(struct intel_atomic_state *state,
|
||||
struct intel_connector *connector,
|
||||
struct intel_crtc *crtc)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
const struct intel_crtc_state *crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
@ -512,7 +515,7 @@ static int check_group_state(struct intel_atomic_state *state,
|
||||
if (!crtc_state->dp_tunnel_ref.tunnel)
|
||||
return 0;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Adding group state for tunnel %p\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
connector->base.base.id, connector->base.name,
|
||||
@ -583,7 +586,7 @@ int intel_dp_tunnel_atomic_compute_stream_bw(struct intel_atomic_state *state,
|
||||
const struct intel_connector *connector,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
int required_rate = intel_dp_config_required_rate(crtc_state);
|
||||
@ -592,7 +595,7 @@ int intel_dp_tunnel_atomic_compute_stream_bw(struct intel_atomic_state *state,
|
||||
if (!intel_dp_tunnel_bw_alloc_is_enabled(intel_dp))
|
||||
return 0;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][CONNECTOR:%d:%s][ENCODER:%d:%s][CRTC:%d:%s] Stream %d required BW %d Mb/s\n",
|
||||
drm_dp_tunnel_name(intel_dp->tunnel),
|
||||
connector->base.base.id, connector->base.name,
|
||||
@ -708,7 +711,7 @@ static void queue_retry_work(struct intel_atomic_state *state,
|
||||
struct drm_dp_tunnel *tunnel,
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_i915_private *i915 = to_i915(state->base.dev);
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct intel_encoder *encoder;
|
||||
|
||||
encoder = intel_get_crtc_new_encoder(state, crtc_state);
|
||||
@ -716,7 +719,7 @@ static void queue_retry_work(struct intel_atomic_state *state,
|
||||
if (!intel_digital_port_connected(encoder))
|
||||
return;
|
||||
|
||||
drm_dbg_kms(&i915->drm,
|
||||
drm_dbg_kms(display->drm,
|
||||
"[DPTUN %s][ENCODER:%d:%s] BW allocation failed on a connected sink\n",
|
||||
drm_dp_tunnel_name(tunnel),
|
||||
encoder->base.base.id,
|
||||
@ -765,7 +768,7 @@ void intel_dp_tunnel_atomic_alloc_bw(struct intel_atomic_state *state)
|
||||
|
||||
/**
|
||||
* intel_dp_tunnel_mgr_init - Initialize the DP tunnel manager
|
||||
* @i915: i915 device object
|
||||
* @display: display device
|
||||
*
|
||||
* Initialize the DP tunnel manager. The tunnel manager will support the
|
||||
* detection/management of DP tunnels on all DP connectors, so the function
|
||||
@ -773,14 +776,14 @@ void intel_dp_tunnel_atomic_alloc_bw(struct intel_atomic_state *state)
|
||||
*
|
||||
* Return 0 in case of success, a negative error code otherwise.
|
||||
*/
|
||||
int intel_dp_tunnel_mgr_init(struct drm_i915_private *i915)
|
||||
int intel_dp_tunnel_mgr_init(struct intel_display *display)
|
||||
{
|
||||
struct drm_dp_tunnel_mgr *tunnel_mgr;
|
||||
struct drm_connector_list_iter connector_list_iter;
|
||||
struct intel_connector *connector;
|
||||
int dp_connectors = 0;
|
||||
|
||||
drm_connector_list_iter_begin(&i915->drm, &connector_list_iter);
|
||||
drm_connector_list_iter_begin(display->drm, &connector_list_iter);
|
||||
for_each_intel_connector_iter(connector, &connector_list_iter) {
|
||||
if (connector->base.connector_type != DRM_MODE_CONNECTOR_DisplayPort)
|
||||
continue;
|
||||
@ -789,23 +792,23 @@ int intel_dp_tunnel_mgr_init(struct drm_i915_private *i915)
|
||||
}
|
||||
drm_connector_list_iter_end(&connector_list_iter);
|
||||
|
||||
tunnel_mgr = drm_dp_tunnel_mgr_create(&i915->drm, dp_connectors);
|
||||
tunnel_mgr = drm_dp_tunnel_mgr_create(display->drm, dp_connectors);
|
||||
if (IS_ERR(tunnel_mgr))
|
||||
return PTR_ERR(tunnel_mgr);
|
||||
|
||||
i915->display.dp_tunnel_mgr = tunnel_mgr;
|
||||
display->dp_tunnel_mgr = tunnel_mgr;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* intel_dp_tunnel_mgr_cleanup - Clean up the DP tunnel manager state
|
||||
* @i915: i915 device object
|
||||
* @display: display device
|
||||
*
|
||||
* Clean up the DP tunnel manager state.
|
||||
*/
|
||||
void intel_dp_tunnel_mgr_cleanup(struct drm_i915_private *i915)
|
||||
void intel_dp_tunnel_mgr_cleanup(struct intel_display *display)
|
||||
{
|
||||
drm_dp_tunnel_mgr_destroy(i915->display.dp_tunnel_mgr);
|
||||
i915->display.dp_tunnel_mgr = NULL;
|
||||
drm_dp_tunnel_mgr_destroy(display->dp_tunnel_mgr);
|
||||
display->dp_tunnel_mgr = NULL;
|
||||
}
|
||||
|
@ -9,14 +9,13 @@
|
||||
#include <linux/errno.h>
|
||||
#include <linux/types.h>
|
||||
|
||||
struct drm_i915_private;
|
||||
struct drm_connector_state;
|
||||
struct drm_modeset_acquire_ctx;
|
||||
|
||||
struct intel_atomic_state;
|
||||
struct intel_connector;
|
||||
struct intel_crtc;
|
||||
struct intel_crtc_state;
|
||||
struct intel_display;
|
||||
struct intel_dp;
|
||||
struct intel_encoder;
|
||||
struct intel_link_bw_limits;
|
||||
@ -53,8 +52,8 @@ int intel_dp_tunnel_atomic_check_state(struct intel_atomic_state *state,
|
||||
|
||||
void intel_dp_tunnel_atomic_alloc_bw(struct intel_atomic_state *state);
|
||||
|
||||
int intel_dp_tunnel_mgr_init(struct drm_i915_private *i915);
|
||||
void intel_dp_tunnel_mgr_cleanup(struct drm_i915_private *i915);
|
||||
int intel_dp_tunnel_mgr_init(struct intel_display *display);
|
||||
void intel_dp_tunnel_mgr_cleanup(struct intel_display *display);
|
||||
|
||||
#else
|
||||
|
||||
@ -121,12 +120,12 @@ intel_dp_tunnel_atomic_alloc_bw(struct intel_atomic_state *state)
|
||||
}
|
||||
|
||||
static inline int
|
||||
intel_dp_tunnel_mgr_init(struct drm_i915_private *i915)
|
||||
intel_dp_tunnel_mgr_init(struct intel_display *display)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline void intel_dp_tunnel_mgr_cleanup(struct drm_i915_private *i915) {}
|
||||
static inline void intel_dp_tunnel_mgr_cleanup(struct intel_display *display) {}
|
||||
|
||||
#endif /* CONFIG_DRM_I915_DP_TUNNEL */
|
||||
|
||||
|
@ -1823,6 +1823,7 @@ static bool i9xx_has_pps(struct drm_i915_private *dev_priv)
|
||||
|
||||
void i9xx_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(crtc_state);
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
@ -1833,7 +1834,7 @@ void i9xx_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
|
||||
/* PLL is protected by panel, make sure we can write it */
|
||||
if (i9xx_has_pps(dev_priv))
|
||||
assert_pps_unlocked(dev_priv, pipe);
|
||||
assert_pps_unlocked(display, pipe);
|
||||
|
||||
intel_de_write(dev_priv, FP0(pipe), hw_state->fp0);
|
||||
intel_de_write(dev_priv, FP1(pipe), hw_state->fp1);
|
||||
@ -2004,6 +2005,7 @@ static void _vlv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
|
||||
void vlv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(crtc_state);
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
@ -2012,7 +2014,7 @@ void vlv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
assert_transcoder_disabled(dev_priv, crtc_state->cpu_transcoder);
|
||||
|
||||
/* PLL is protected by panel, make sure we can write it */
|
||||
assert_pps_unlocked(dev_priv, pipe);
|
||||
assert_pps_unlocked(display, pipe);
|
||||
|
||||
/* Enable Refclk */
|
||||
intel_de_write(dev_priv, DPLL(dev_priv, pipe),
|
||||
@ -2150,6 +2152,7 @@ static void _chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
|
||||
void chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(crtc_state);
|
||||
struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct i9xx_dpll_hw_state *hw_state = &crtc_state->dpll_hw_state.i9xx;
|
||||
@ -2158,7 +2161,7 @@ void chv_enable_pll(const struct intel_crtc_state *crtc_state)
|
||||
assert_transcoder_disabled(dev_priv, crtc_state->cpu_transcoder);
|
||||
|
||||
/* PLL is protected by panel, make sure we can write it */
|
||||
assert_pps_unlocked(dev_priv, pipe);
|
||||
assert_pps_unlocked(display, pipe);
|
||||
|
||||
/* Enable Refclk and SSC */
|
||||
intel_de_write(dev_priv, DPLL(dev_priv, pipe),
|
||||
|
@ -83,6 +83,8 @@ static void frontbuffer_flush(struct drm_i915_private *i915,
|
||||
unsigned int frontbuffer_bits,
|
||||
enum fb_op_origin origin)
|
||||
{
|
||||
struct intel_display *display = &i915->display;
|
||||
|
||||
/* Delay flushing when rings are still busy.*/
|
||||
spin_lock(&i915->display.fb_tracking.lock);
|
||||
frontbuffer_bits &= ~i915->display.fb_tracking.busy_bits;
|
||||
@ -96,7 +98,7 @@ static void frontbuffer_flush(struct drm_i915_private *i915,
|
||||
might_sleep();
|
||||
intel_td_flush(i915);
|
||||
intel_drrs_flush(i915, frontbuffer_bits);
|
||||
intel_psr_flush(i915, frontbuffer_bits, origin);
|
||||
intel_psr_flush(display, frontbuffer_bits, origin);
|
||||
intel_fbc_flush(i915, frontbuffer_bits, origin);
|
||||
}
|
||||
|
||||
@ -172,6 +174,7 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front,
|
||||
unsigned int frontbuffer_bits)
|
||||
{
|
||||
struct drm_i915_private *i915 = intel_bo_to_i915(front->obj);
|
||||
struct intel_display *display = &i915->display;
|
||||
|
||||
if (origin == ORIGIN_CS) {
|
||||
spin_lock(&i915->display.fb_tracking.lock);
|
||||
@ -183,7 +186,7 @@ void __intel_fb_invalidate(struct intel_frontbuffer *front,
|
||||
trace_intel_frontbuffer_invalidate(i915, frontbuffer_bits, origin);
|
||||
|
||||
might_sleep();
|
||||
intel_psr_invalidate(i915, frontbuffer_bits, origin);
|
||||
intel_psr_invalidate(display, frontbuffer_bits, origin);
|
||||
intel_drrs_invalidate(i915, frontbuffer_bits);
|
||||
intel_fbc_invalidate(i915, frontbuffer_bits, origin);
|
||||
}
|
||||
|
@ -2181,10 +2181,11 @@ static void intel_hdcp_check_work(struct work_struct *work)
|
||||
DRM_HDCP_CHECK_PERIOD_MS);
|
||||
}
|
||||
|
||||
static int i915_hdcp_component_bind(struct device *i915_kdev,
|
||||
static int i915_hdcp_component_bind(struct device *drv_kdev,
|
||||
struct device *mei_kdev, void *data)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(i915_kdev);
|
||||
struct intel_display *display = to_intel_display(drv_kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
drm_dbg(&i915->drm, "I915 HDCP comp bind\n");
|
||||
mutex_lock(&i915->display.hdcp.hdcp_mutex);
|
||||
@ -2195,10 +2196,11 @@ static int i915_hdcp_component_bind(struct device *i915_kdev,
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void i915_hdcp_component_unbind(struct device *i915_kdev,
|
||||
static void i915_hdcp_component_unbind(struct device *drv_kdev,
|
||||
struct device *mei_kdev, void *data)
|
||||
{
|
||||
struct drm_i915_private *i915 = kdev_to_i915(i915_kdev);
|
||||
struct intel_display *display = to_intel_display(drv_kdev);
|
||||
struct drm_i915_private *i915 = to_i915(display->drm);
|
||||
|
||||
drm_dbg(&i915->drm, "I915 HDCP comp unbind\n");
|
||||
mutex_lock(&i915->display.hdcp.hdcp_mutex);
|
||||
|
@ -7,6 +7,7 @@
|
||||
#include <drm/intel/i915_hdcp_interface.h>
|
||||
|
||||
#include "i915_drv.h"
|
||||
#include "intel_display_types.h"
|
||||
#include "intel_hdcp_gsc_message.h"
|
||||
|
||||
int
|
||||
@ -15,17 +16,19 @@ intel_hdcp_gsc_initiate_session(struct device *dev, struct hdcp_port_data *data,
|
||||
{
|
||||
struct wired_cmd_initiate_hdcp2_session_in session_init_in = {};
|
||||
struct wired_cmd_initiate_hdcp2_session_out session_init_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !ake_data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
session_init_in.header.api_version = HDCP_API_VERSION;
|
||||
session_init_in.header.command_id = WIRED_INITIATE_HDCP2_SESSION;
|
||||
@ -72,17 +75,19 @@ intel_hdcp_gsc_verify_receiver_cert_prepare_km(struct device *dev,
|
||||
{
|
||||
struct wired_cmd_verify_receiver_cert_in verify_rxcert_in = {};
|
||||
struct wired_cmd_verify_receiver_cert_out verify_rxcert_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !rx_cert || !km_stored || !ek_pub_km || !msg_sz)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
verify_rxcert_in.header.api_version = HDCP_API_VERSION;
|
||||
verify_rxcert_in.header.command_id = WIRED_VERIFY_RECEIVER_CERT;
|
||||
@ -135,17 +140,19 @@ intel_hdcp_gsc_verify_hprime(struct device *dev, struct hdcp_port_data *data,
|
||||
{
|
||||
struct wired_cmd_ake_send_hprime_in send_hprime_in = {};
|
||||
struct wired_cmd_ake_send_hprime_out send_hprime_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !rx_hprime)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
send_hprime_in.header.api_version = HDCP_API_VERSION;
|
||||
send_hprime_in.header.command_id = WIRED_AKE_SEND_HPRIME;
|
||||
@ -183,17 +190,19 @@ intel_hdcp_gsc_store_pairing_info(struct device *dev, struct hdcp_port_data *dat
|
||||
{
|
||||
struct wired_cmd_ake_send_pairing_info_in pairing_info_in = {};
|
||||
struct wired_cmd_ake_send_pairing_info_out pairing_info_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !pairing_info)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
pairing_info_in.header.api_version = HDCP_API_VERSION;
|
||||
pairing_info_in.header.command_id = WIRED_AKE_SEND_PAIRING_INFO;
|
||||
@ -234,17 +243,19 @@ intel_hdcp_gsc_initiate_locality_check(struct device *dev,
|
||||
{
|
||||
struct wired_cmd_init_locality_check_in lc_init_in = {};
|
||||
struct wired_cmd_init_locality_check_out lc_init_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !lc_init_data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
lc_init_in.header.api_version = HDCP_API_VERSION;
|
||||
lc_init_in.header.command_id = WIRED_INIT_LOCALITY_CHECK;
|
||||
@ -280,17 +291,19 @@ intel_hdcp_gsc_verify_lprime(struct device *dev, struct hdcp_port_data *data,
|
||||
{
|
||||
struct wired_cmd_validate_locality_in verify_lprime_in = {};
|
||||
struct wired_cmd_validate_locality_out verify_lprime_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !rx_lprime)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
verify_lprime_in.header.api_version = HDCP_API_VERSION;
|
||||
verify_lprime_in.header.command_id = WIRED_VALIDATE_LOCALITY;
|
||||
@ -330,17 +343,19 @@ int intel_hdcp_gsc_get_session_key(struct device *dev,
|
||||
{
|
||||
struct wired_cmd_get_session_key_in get_skey_in = {};
|
||||
struct wired_cmd_get_session_key_out get_skey_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data || !ske_data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
get_skey_in.header.api_version = HDCP_API_VERSION;
|
||||
get_skey_in.header.command_id = WIRED_GET_SESSION_KEY;
|
||||
@ -382,17 +397,19 @@ intel_hdcp_gsc_repeater_check_flow_prepare_ack(struct device *dev,
|
||||
{
|
||||
struct wired_cmd_verify_repeater_in verify_repeater_in = {};
|
||||
struct wired_cmd_verify_repeater_out verify_repeater_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !rep_topology || !rep_send_ack || !data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
verify_repeater_in.header.api_version = HDCP_API_VERSION;
|
||||
verify_repeater_in.header.command_id = WIRED_VERIFY_REPEATER;
|
||||
@ -442,6 +459,7 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev,
|
||||
{
|
||||
struct wired_cmd_repeater_auth_stream_req_in *verify_mprime_in;
|
||||
struct wired_cmd_repeater_auth_stream_req_out verify_mprime_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
size_t cmd_size;
|
||||
@ -449,11 +467,12 @@ int intel_hdcp_gsc_verify_mprime(struct device *dev,
|
||||
if (!dev || !stream_ready || !data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
cmd_size = struct_size(verify_mprime_in, streams, data->k);
|
||||
if (cmd_size == SIZE_MAX)
|
||||
@ -504,17 +523,19 @@ int intel_hdcp_gsc_enable_authentication(struct device *dev,
|
||||
{
|
||||
struct wired_cmd_enable_auth_in enable_auth_in = {};
|
||||
struct wired_cmd_enable_auth_out enable_auth_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
enable_auth_in.header.api_version = HDCP_API_VERSION;
|
||||
enable_auth_in.header.command_id = WIRED_ENABLE_AUTH;
|
||||
@ -549,17 +570,19 @@ intel_hdcp_gsc_close_session(struct device *dev, struct hdcp_port_data *data)
|
||||
{
|
||||
struct wired_cmd_close_session_in session_close_in = {};
|
||||
struct wired_cmd_close_session_out session_close_out = {};
|
||||
struct intel_display *display;
|
||||
struct drm_i915_private *i915;
|
||||
ssize_t byte;
|
||||
|
||||
if (!dev || !data)
|
||||
return -EINVAL;
|
||||
|
||||
i915 = kdev_to_i915(dev);
|
||||
if (!i915) {
|
||||
display = to_intel_display(dev);
|
||||
if (!display) {
|
||||
dev_err(dev, "DRM not initialized, aborting HDCP.\n");
|
||||
return -ENODEV;
|
||||
}
|
||||
i915 = to_i915(display->drm);
|
||||
|
||||
session_close_in.header.api_version = HDCP_API_VERSION;
|
||||
session_close_in.header.command_id = WIRED_CLOSE_SESSION;
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -58,6 +58,5 @@ int intel_hdmi_dsc_get_num_slices(const struct intel_crtc_state *crtc_state,
|
||||
int src_max_slices, int src_max_slice_width,
|
||||
int hdmi_max_slices, int hdmi_throughput);
|
||||
int intel_hdmi_dsc_get_slice_height(int vactive);
|
||||
struct drm_i915_private *intel_hdmi_to_i915(struct intel_hdmi *intel_hdmi);
|
||||
|
||||
#endif /* __INTEL_HDMI_H__ */
|
||||
|
@ -456,6 +456,7 @@ u32 i9xx_hpd_irq_ack(struct drm_i915_private *dev_priv)
|
||||
|
||||
void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_status)
|
||||
{
|
||||
struct intel_display *display = &dev_priv->display;
|
||||
u32 pin_mask = 0, long_mask = 0;
|
||||
u32 hotplug_trigger;
|
||||
|
||||
@ -477,7 +478,7 @@ void i9xx_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_status)
|
||||
if ((IS_G4X(dev_priv) ||
|
||||
IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
|
||||
hotplug_status & DP_AUX_CHANNEL_MASK_INT_STATUS_G4X)
|
||||
intel_dp_aux_irq_handler(dev_priv);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
}
|
||||
|
||||
void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_trigger)
|
||||
@ -513,6 +514,7 @@ void ibx_hpd_irq_handler(struct drm_i915_private *dev_priv, u32 hotplug_trigger)
|
||||
|
||||
void xelpdp_pica_irq_handler(struct drm_i915_private *i915, u32 iir)
|
||||
{
|
||||
struct intel_display *display = &i915->display;
|
||||
enum hpd_pin pin;
|
||||
u32 hotplug_trigger = iir & (XELPDP_DP_ALT_HOTPLUG_MASK | XELPDP_TBT_HOTPLUG_MASK);
|
||||
u32 trigger_aux = iir & XELPDP_AUX_TC_MASK;
|
||||
@ -545,7 +547,7 @@ void xelpdp_pica_irq_handler(struct drm_i915_private *i915, u32 iir)
|
||||
}
|
||||
|
||||
if (trigger_aux)
|
||||
intel_dp_aux_irq_handler(i915);
|
||||
intel_dp_aux_irq_handler(display);
|
||||
|
||||
if (!pin_mask && !trigger_aux)
|
||||
drm_err(&i915->drm,
|
||||
|
@ -358,6 +358,7 @@ void ilk_pch_pre_enable(struct intel_atomic_state *state,
|
||||
void ilk_pch_enable(struct intel_atomic_state *state,
|
||||
struct intel_crtc *crtc)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(state);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
const struct intel_crtc_state *crtc_state =
|
||||
intel_atomic_get_new_crtc_state(state, crtc);
|
||||
@ -399,7 +400,7 @@ void ilk_pch_enable(struct intel_atomic_state *state,
|
||||
intel_enable_shared_dpll(crtc_state);
|
||||
|
||||
/* set transcoder timing, panel must allow it */
|
||||
assert_pps_unlocked(dev_priv, pipe);
|
||||
assert_pps_unlocked(display, pipe);
|
||||
if (intel_crtc_has_dp_encoder(crtc_state)) {
|
||||
intel_pch_transcoder_set_m1_n1(crtc, &crtc_state->dp_m_n);
|
||||
intel_pch_transcoder_set_m2_n2(crtc, &crtc_state->dp_m2_n2);
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,9 +11,9 @@
|
||||
#include "intel_wakeref.h"
|
||||
|
||||
enum pipe;
|
||||
struct drm_i915_private;
|
||||
struct intel_connector;
|
||||
struct intel_crtc_state;
|
||||
struct intel_display;
|
||||
struct intel_dp;
|
||||
struct intel_encoder;
|
||||
|
||||
@ -43,16 +43,16 @@ void intel_pps_wait_power_cycle(struct intel_dp *intel_dp);
|
||||
bool intel_pps_init(struct intel_dp *intel_dp);
|
||||
void intel_pps_init_late(struct intel_dp *intel_dp);
|
||||
void intel_pps_encoder_reset(struct intel_dp *intel_dp);
|
||||
void intel_pps_reset_all(struct drm_i915_private *i915);
|
||||
void intel_pps_reset_all(struct intel_display *display);
|
||||
|
||||
void vlv_pps_init(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *crtc_state);
|
||||
|
||||
void intel_pps_unlock_regs_wa(struct drm_i915_private *i915);
|
||||
void intel_pps_setup(struct drm_i915_private *i915);
|
||||
void intel_pps_unlock_regs_wa(struct intel_display *display);
|
||||
void intel_pps_setup(struct intel_display *display);
|
||||
|
||||
void intel_pps_connector_debugfs_add(struct intel_connector *connector);
|
||||
|
||||
void assert_pps_unlocked(struct drm_i915_private *i915, enum pipe pipe);
|
||||
void assert_pps_unlocked(struct intel_display *display, enum pipe pipe);
|
||||
|
||||
#endif /* __INTEL_PPS_H__ */
|
||||
|
File diff suppressed because it is too large
Load Diff
@ -11,11 +11,11 @@
|
||||
enum fb_op_origin;
|
||||
struct drm_connector;
|
||||
struct drm_connector_state;
|
||||
struct drm_i915_private;
|
||||
struct intel_atomic_state;
|
||||
struct intel_connector;
|
||||
struct intel_crtc;
|
||||
struct intel_crtc_state;
|
||||
struct intel_display;
|
||||
struct intel_dp;
|
||||
struct intel_encoder;
|
||||
struct intel_plane;
|
||||
@ -35,10 +35,10 @@ void intel_psr_post_plane_update(struct intel_atomic_state *state,
|
||||
void intel_psr_disable(struct intel_dp *intel_dp,
|
||||
const struct intel_crtc_state *old_crtc_state);
|
||||
int intel_psr_debug_set(struct intel_dp *intel_dp, u64 value);
|
||||
void intel_psr_invalidate(struct drm_i915_private *dev_priv,
|
||||
void intel_psr_invalidate(struct intel_display *display,
|
||||
unsigned frontbuffer_bits,
|
||||
enum fb_op_origin origin);
|
||||
void intel_psr_flush(struct drm_i915_private *dev_priv,
|
||||
void intel_psr_flush(struct intel_display *display,
|
||||
unsigned frontbuffer_bits,
|
||||
enum fb_op_origin origin);
|
||||
void intel_psr_init(struct intel_dp *intel_dp);
|
||||
@ -60,6 +60,6 @@ void intel_psr_resume(struct intel_dp *intel_dp);
|
||||
void intel_psr_lock(const struct intel_crtc_state *crtc_state);
|
||||
void intel_psr_unlock(const struct intel_crtc_state *crtc_state);
|
||||
void intel_psr_connector_debugfs_add(struct intel_connector *connector);
|
||||
void intel_psr_debugfs_register(struct drm_i915_private *i915);
|
||||
void intel_psr_debugfs_register(struct intel_display *display);
|
||||
|
||||
#endif /* __INTEL_PSR_H__ */
|
||||
|
@ -14,6 +14,11 @@ static void intel_set_quirk(struct intel_display *display, enum intel_quirk_id q
|
||||
display->quirks.mask |= BIT(quirk);
|
||||
}
|
||||
|
||||
static void intel_set_dpcd_quirk(struct intel_dp *intel_dp, enum intel_quirk_id quirk)
|
||||
{
|
||||
intel_dp->quirks.mask |= BIT(quirk);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some machines (Lenovo U160) do not work with SSC on LVDS for some reason
|
||||
*/
|
||||
@ -65,6 +70,14 @@ static void quirk_no_pps_backlight_power_hook(struct intel_display *display)
|
||||
drm_info(display->drm, "Applying no pps backlight power quirk\n");
|
||||
}
|
||||
|
||||
static void quirk_fw_sync_len(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
|
||||
intel_set_dpcd_quirk(intel_dp, QUIRK_FW_SYNC_LEN);
|
||||
drm_info(display->drm, "Applying Fast Wake sync pulse count quirk\n");
|
||||
}
|
||||
|
||||
struct intel_quirk {
|
||||
int device;
|
||||
int subsystem_vendor;
|
||||
@ -72,6 +85,21 @@ struct intel_quirk {
|
||||
void (*hook)(struct intel_display *display);
|
||||
};
|
||||
|
||||
struct intel_dpcd_quirk {
|
||||
int device;
|
||||
int subsystem_vendor;
|
||||
int subsystem_device;
|
||||
u8 sink_oui[3];
|
||||
u8 sink_device_id[6];
|
||||
void (*hook)(struct intel_dp *intel_dp);
|
||||
};
|
||||
|
||||
#define SINK_OUI(first, second, third) { (first), (second), (third) }
|
||||
#define SINK_DEVICE_ID(first, second, third, fourth, fifth, sixth) \
|
||||
{ (first), (second), (third), (fourth), (fifth), (sixth) }
|
||||
|
||||
#define SINK_DEVICE_ID_ANY SINK_DEVICE_ID(0, 0, 0, 0, 0, 0)
|
||||
|
||||
/* For systems that don't have a meaningful PCI subdevice/subvendor ID */
|
||||
struct intel_dmi_quirk {
|
||||
void (*hook)(struct intel_display *display);
|
||||
@ -203,6 +231,18 @@ static struct intel_quirk intel_quirks[] = {
|
||||
{ 0x0f31, 0x103c, 0x220f, quirk_invert_brightness },
|
||||
};
|
||||
|
||||
static struct intel_dpcd_quirk intel_dpcd_quirks[] = {
|
||||
/* Dell Precision 5490 */
|
||||
{
|
||||
.device = 0x7d55,
|
||||
.subsystem_vendor = 0x1028,
|
||||
.subsystem_device = 0x0cc7,
|
||||
.sink_oui = SINK_OUI(0x38, 0xec, 0x11),
|
||||
.hook = quirk_fw_sync_len,
|
||||
},
|
||||
|
||||
};
|
||||
|
||||
void intel_init_quirks(struct intel_display *display)
|
||||
{
|
||||
struct pci_dev *d = to_pci_dev(display->drm->dev);
|
||||
@ -224,7 +264,35 @@ void intel_init_quirks(struct intel_display *display)
|
||||
}
|
||||
}
|
||||
|
||||
void intel_init_dpcd_quirks(struct intel_dp *intel_dp,
|
||||
const struct drm_dp_dpcd_ident *ident)
|
||||
{
|
||||
struct intel_display *display = to_intel_display(intel_dp);
|
||||
struct pci_dev *d = to_pci_dev(display->drm->dev);
|
||||
int i;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(intel_dpcd_quirks); i++) {
|
||||
struct intel_dpcd_quirk *q = &intel_dpcd_quirks[i];
|
||||
|
||||
if (d->device == q->device &&
|
||||
(d->subsystem_vendor == q->subsystem_vendor ||
|
||||
q->subsystem_vendor == PCI_ANY_ID) &&
|
||||
(d->subsystem_device == q->subsystem_device ||
|
||||
q->subsystem_device == PCI_ANY_ID) &&
|
||||
!memcmp(q->sink_oui, ident->oui, sizeof(ident->oui)) &&
|
||||
(!memcmp(q->sink_device_id, ident->device_id,
|
||||
sizeof(ident->device_id)) ||
|
||||
mem_is_zero(q->sink_device_id, sizeof(q->sink_device_id))))
|
||||
q->hook(intel_dp);
|
||||
}
|
||||
}
|
||||
|
||||
bool intel_has_quirk(struct intel_display *display, enum intel_quirk_id quirk)
|
||||
{
|
||||
return display->quirks.mask & BIT(quirk);
|
||||
}
|
||||
|
||||
bool intel_has_dpcd_quirk(struct intel_dp *intel_dp, enum intel_quirk_id quirk)
|
||||
{
|
||||
return intel_dp->quirks.mask & BIT(quirk);
|
||||
}
|
||||
|
@ -9,6 +9,8 @@
|
||||
#include <linux/types.h>
|
||||
|
||||
struct intel_display;
|
||||
struct intel_dp;
|
||||
struct drm_dp_dpcd_ident;
|
||||
|
||||
enum intel_quirk_id {
|
||||
QUIRK_BACKLIGHT_PRESENT,
|
||||
@ -17,9 +19,13 @@ enum intel_quirk_id {
|
||||
QUIRK_INVERT_BRIGHTNESS,
|
||||
QUIRK_LVDS_SSC_DISABLE,
|
||||
QUIRK_NO_PPS_BACKLIGHT_POWER_HOOK,
|
||||
QUIRK_FW_SYNC_LEN,
|
||||
};
|
||||
|
||||
void intel_init_quirks(struct intel_display *display);
|
||||
void intel_init_dpcd_quirks(struct intel_dp *intel_dp,
|
||||
const struct drm_dp_dpcd_ident *ident);
|
||||
bool intel_has_quirk(struct intel_display *display, enum intel_quirk_id quirk);
|
||||
bool intel_has_dpcd_quirk(struct intel_dp *intel_dp, enum intel_quirk_id quirk);
|
||||
|
||||
#endif /* __INTEL_QUIRKS_H__ */
|
||||
|
@ -1080,6 +1080,8 @@ struct bdb_edp {
|
||||
u16 edp_fast_link_training_rate[16]; /* 224+ */
|
||||
u16 edp_max_port_link_rate[16]; /* 244+ */
|
||||
u16 edp_dsc_disable; /* 251+ */
|
||||
u16 t6_delay_support; /* 260+ */
|
||||
u16 link_idle_time[16]; /* 260+ */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
@ -1321,7 +1323,7 @@ struct als_data_entry {
|
||||
} __packed;
|
||||
|
||||
struct aggressiveness_profile_entry {
|
||||
u8 dpst_aggressiveness : 4;
|
||||
u8 dpst_aggressiveness : 4; /* (228/252)-256 */
|
||||
u8 lace_aggressiveness : 4;
|
||||
} __packed;
|
||||
|
||||
@ -1330,12 +1332,27 @@ struct aggressiveness_profile2_entry {
|
||||
u8 elp_aggressiveness : 4;
|
||||
} __packed;
|
||||
|
||||
struct aggressiveness_profile3_entry {
|
||||
u8 apd_aggressiveness:4;
|
||||
u8 pixoptix_aggressiveness:4;
|
||||
} __packed;
|
||||
|
||||
struct aggressiveness_profile4_entry {
|
||||
u8 xpst_aggressiveness:4;
|
||||
u8 tcon_aggressiveness:4;
|
||||
} __packed;
|
||||
|
||||
struct panel_identification {
|
||||
u8 panel_technology:4;
|
||||
u8 reserved:4;
|
||||
} __packed;
|
||||
|
||||
struct bdb_lfp_power {
|
||||
struct lfp_power_features features; /* ???-227 */
|
||||
struct als_data_entry als[5];
|
||||
u8 lace_aggressiveness_profile:3; /* 210-227 */
|
||||
u8 reserved1:5;
|
||||
u16 dpst; /* 228+ */
|
||||
u16 dpst; /* 228-256 */
|
||||
u16 psr; /* 228+ */
|
||||
u16 drrs; /* 228+ */
|
||||
u16 lace_support; /* 228+ */
|
||||
@ -1343,12 +1360,20 @@ struct bdb_lfp_power {
|
||||
u16 dmrrs; /* 228+ */
|
||||
u16 adb; /* 228+ */
|
||||
u16 lace_enabled_status; /* 228+ */
|
||||
struct aggressiveness_profile_entry aggressiveness[16]; /* 228+ */
|
||||
struct aggressiveness_profile_entry aggressiveness[16];
|
||||
u16 hobl; /* 232+ */
|
||||
u16 vrr_feature_enabled; /* 233+ */
|
||||
u16 elp; /* 247+ */
|
||||
u16 opst; /* 247+ */
|
||||
struct aggressiveness_profile2_entry aggressiveness2[16]; /* 247+ */
|
||||
u16 elp; /* 247-256 */
|
||||
u16 opst; /* 247-256 */
|
||||
struct aggressiveness_profile2_entry aggressiveness2[16]; /* 247-256 */
|
||||
u16 apd; /* 253-256 */
|
||||
u16 pixoptix; /* 253-256 */
|
||||
struct aggressiveness_profile3_entry aggressiveness3[16]; /* 253-256 */
|
||||
struct panel_identification panel_identification[16]; /* 257+ */
|
||||
u16 xpst_support; /* 257+ */
|
||||
u16 tcon_based_backlight_optimization; /* 257+ */
|
||||
struct aggressiveness_profile4_entry aggressiveness4[16]; /* 257+ */
|
||||
u16 tcon_backlight_xpst_coexistence; /* 257+ */
|
||||
} __packed;
|
||||
|
||||
/*
|
||||
|
@ -723,7 +723,7 @@ i915_driver_create(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (IS_ERR(i915))
|
||||
return i915;
|
||||
|
||||
pci_set_drvdata(pdev, i915);
|
||||
pci_set_drvdata(pdev, &i915->drm);
|
||||
|
||||
/* Device parameters start as a copy of module parameters. */
|
||||
i915_params_copy(&i915->params, &i915_modparams);
|
||||
@ -1167,7 +1167,7 @@ static int i915_drm_resume(struct drm_device *dev)
|
||||
intel_dmc_resume(dev_priv);
|
||||
|
||||
i915_restore_display(dev_priv);
|
||||
intel_pps_unlock_regs_wa(dev_priv);
|
||||
intel_pps_unlock_regs_wa(display);
|
||||
|
||||
intel_init_pch_refclk(dev_priv);
|
||||
|
||||
|
@ -365,12 +365,16 @@ static inline struct drm_i915_private *to_i915(const struct drm_device *dev)
|
||||
|
||||
static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
|
||||
{
|
||||
return dev_get_drvdata(kdev);
|
||||
struct drm_device *drm = dev_get_drvdata(kdev);
|
||||
|
||||
return drm ? to_i915(drm) : NULL;
|
||||
}
|
||||
|
||||
static inline struct drm_i915_private *pdev_to_i915(struct pci_dev *pdev)
|
||||
{
|
||||
return pci_get_drvdata(pdev);
|
||||
struct drm_device *drm = pci_get_drvdata(pdev);
|
||||
|
||||
return drm ? to_i915(drm) : NULL;
|
||||
}
|
||||
|
||||
static inline struct intel_gt *to_gt(const struct drm_i915_private *i915)
|
||||
|
@ -29,6 +29,12 @@ static int i915_check_nomodeset(void)
|
||||
* nomodeset boot option.
|
||||
*/
|
||||
|
||||
if (i915_modparams.modeset == 0)
|
||||
pr_warn("i915.modeset=0 is deprecated. Please use the 'nomodeset' kernel parameter instead.\n");
|
||||
else if (i915_modparams.modeset != -1)
|
||||
pr_warn("i915.modeset=%d is deprecated. Please remove it and the 'nomodeset' kernel parameter instead.\n",
|
||||
i915_modparams.modeset);
|
||||
|
||||
if (i915_modparams.modeset == 0)
|
||||
use_kms = false;
|
||||
|
||||
@ -36,9 +42,8 @@ static int i915_check_nomodeset(void)
|
||||
use_kms = false;
|
||||
|
||||
if (!use_kms) {
|
||||
/* Silently fail loading to not upset userspace. */
|
||||
DRM_DEBUG_DRIVER("KMS disabled.\n");
|
||||
return 1;
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
@ -64,8 +64,7 @@ struct i915_params i915_modparams __read_mostly = {
|
||||
*/
|
||||
|
||||
i915_param_named(modeset, int, 0400,
|
||||
"Use kernel modesetting [KMS] (0=disable, "
|
||||
"1=on, -1=force vga console preference [default])");
|
||||
"Deprecated. Use the 'nomodeset' kernel parameter instead.");
|
||||
|
||||
i915_param_named_unsafe(reset, uint, 0400,
|
||||
"Attempt GPU resets (0=disabled, 1=full gpu reset, 2=engine reset [default])");
|
||||
|
@ -51,7 +51,7 @@ static inline void debug_fence_init(struct i915_sw_fence *fence)
|
||||
debug_object_init(fence, &i915_sw_fence_debug_descr);
|
||||
}
|
||||
|
||||
static inline void debug_fence_init_onstack(struct i915_sw_fence *fence)
|
||||
static inline __maybe_unused void debug_fence_init_onstack(struct i915_sw_fence *fence)
|
||||
{
|
||||
debug_object_init_on_stack(fence, &i915_sw_fence_debug_descr);
|
||||
}
|
||||
@ -77,7 +77,7 @@ static inline void debug_fence_destroy(struct i915_sw_fence *fence)
|
||||
debug_object_destroy(fence, &i915_sw_fence_debug_descr);
|
||||
}
|
||||
|
||||
static inline void debug_fence_free(struct i915_sw_fence *fence)
|
||||
static inline __maybe_unused void debug_fence_free(struct i915_sw_fence *fence)
|
||||
{
|
||||
debug_object_free(fence, &i915_sw_fence_debug_descr);
|
||||
smp_wmb(); /* flush the change in state before reallocation */
|
||||
@ -94,7 +94,7 @@ static inline void debug_fence_init(struct i915_sw_fence *fence)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void debug_fence_init_onstack(struct i915_sw_fence *fence)
|
||||
static inline __maybe_unused void debug_fence_init_onstack(struct i915_sw_fence *fence)
|
||||
{
|
||||
}
|
||||
|
||||
@ -115,7 +115,7 @@ static inline void debug_fence_destroy(struct i915_sw_fence *fence)
|
||||
{
|
||||
}
|
||||
|
||||
static inline void debug_fence_free(struct i915_sw_fence *fence)
|
||||
static inline __maybe_unused void debug_fence_free(struct i915_sw_fence *fence)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -172,7 +172,7 @@ struct drm_i915_private *mock_gem_device(void)
|
||||
return NULL;
|
||||
}
|
||||
|
||||
pci_set_drvdata(pdev, i915);
|
||||
pci_set_drvdata(pdev, &i915->drm);
|
||||
|
||||
/* Device parameters start as a copy of module parameters. */
|
||||
i915_params_copy(&i915->params, &i915_modparams);
|
||||
|
@ -21,11 +21,6 @@ static inline struct drm_i915_private *to_i915(const struct drm_device *dev)
|
||||
return container_of(dev, struct drm_i915_private, drm);
|
||||
}
|
||||
|
||||
static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
|
||||
{
|
||||
return dev_get_drvdata(kdev);
|
||||
}
|
||||
|
||||
#define IS_PLATFORM(xe, x) ((xe)->info.platform == x)
|
||||
#define INTEL_INFO(dev_priv) (&((dev_priv)->info))
|
||||
#define IS_I830(dev_priv) (dev_priv && 0)
|
||||
@ -80,9 +75,9 @@ static inline struct drm_i915_private *kdev_to_i915(struct device *kdev)
|
||||
|
||||
#define IS_MOBILE(xe) (xe && 0)
|
||||
|
||||
#define IS_LP(xe) (0)
|
||||
#define IS_GEN9_LP(xe) (0)
|
||||
#define IS_GEN9_BC(xe) (0)
|
||||
#define IS_LP(xe) ((xe) && 0)
|
||||
#define IS_GEN9_LP(xe) ((xe) && 0)
|
||||
#define IS_GEN9_BC(xe) ((xe) && 0)
|
||||
|
||||
#define IS_TIGERLAKE_UY(xe) (xe && 0)
|
||||
#define IS_COMETLAKE_ULX(xe) (xe && 0)
|
||||
@ -110,8 +105,6 @@ struct i915_sched_attr {
|
||||
};
|
||||
#define i915_gem_fence_wait_priority(fence, attr) do { (void) attr; } while (0)
|
||||
|
||||
#define pdev_to_i915 pdev_to_xe_device
|
||||
|
||||
#define FORCEWAKE_ALL XE_FORCEWAKE_ALL
|
||||
|
||||
#ifdef CONFIG_ARM64
|
||||
|
@ -17,12 +17,16 @@ static inline struct xe_device *to_xe_device(const struct drm_device *dev)
|
||||
|
||||
static inline struct xe_device *kdev_to_xe_device(struct device *kdev)
|
||||
{
|
||||
return dev_get_drvdata(kdev);
|
||||
struct drm_device *drm = dev_get_drvdata(kdev);
|
||||
|
||||
return drm ? to_xe_device(drm) : NULL;
|
||||
}
|
||||
|
||||
static inline struct xe_device *pdev_to_xe_device(struct pci_dev *pdev)
|
||||
{
|
||||
return pci_get_drvdata(pdev);
|
||||
struct drm_device *drm = pci_get_drvdata(pdev);
|
||||
|
||||
return drm ? to_xe_device(drm) : NULL;
|
||||
}
|
||||
|
||||
static inline struct xe_device *xe_device_const_cast(const struct xe_device *xe)
|
||||
|
@ -793,7 +793,7 @@ static int xe_pci_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
|
||||
if (IS_ERR(xe))
|
||||
return PTR_ERR(xe);
|
||||
|
||||
pci_set_drvdata(pdev, xe);
|
||||
pci_set_drvdata(pdev, &xe->drm);
|
||||
|
||||
xe_pm_assert_unbounded_bridge(xe);
|
||||
subplatform_desc = find_subplatform(xe, desc);
|
||||
|
Loading…
Reference in New Issue
Block a user