Merge tag 'drm-for-v4.15' of git://people.freedesktop.org/~airlied/linux
Pull drm updates from Dave Airlie: "This is the main drm pull request for v4.15. Core: - Atomic object lifetime fixes - Atomic iterator improvements - Sparse/smatch fixes - Legacy kms ioctls to be interruptible - EDID override improvements - fb/gem helper cleanups - Simple outreachy patches - Documentation improvements - Fix dma-buf rcu races - DRM mode object leasing for improving VR use cases. - vgaarb improvements for non-x86 platforms. New driver: - tve200: Faraday Technology TVE200 block. This "TV Encoder" encodes a ITU-T BT.656 stream and can be found in the StorLink SL3516 (later Cortina Systems CS3516) as well as the Grain Media GM8180. New bridges: - SiI9234 support New panels: - S6E63J0X03, OTM8009A, Seiko 43WVF1G, 7" rpi touch panel, Toshiba LT089AC19000, Innolux AT043TN24 i915: - Remove Coffeelake from alpha support - Cannonlake workarounds - Infoframe refactoring for DisplayPort - VBT updates - DisplayPort vswing/emph/buffer translation refactoring - CCS fixes - Restore GPU clock boost on missed vblanks - Scatter list updates for userptr allocations - Gen9+ transition watermarks - Display IPC (Isochronous Priority Control) - Private PAT management - GVT: improved error handling and pci config sanitizing - Execlist refactoring - Transparent Huge Page support - User defined priorities support - HuC/GuC firmware refactoring - DP MST fixes - eDP power sequencing fixes - Use RCU instead of stop_machine - PSR state tracking support - Eviction fixes - BDW DP aux channel timeout fixes - LSPCON fixes - Cannonlake PLL fixes amdgpu: - Per VM BO support - Powerplay cleanups - CI powerplay support - PASID mgr for kfd - SR-IOV fixes - initial GPU reset for vega10 - Prime mmap support - TTM updates - Clock query interface for Raven - Fence to handle ioctl - UVD encode ring support on Polaris - Transparent huge page DMA support - Compute LRU pipe tweaks - BO flag to allow buffers to opt out of implicit sync - CTX priority setting API - VRAM lost infrastructure plumbing qxl: - fix flicker since atomic rework amdkfd: - Further improvements from internal AMD tree - Usermode events - Drop radeon support nouveau: - Pascal temperature sensor support - Improved BAR2 handling - MMU rework to support Pascal MMU exynos: - Improved HDMI/mixer support - HDMI audio interface support tegra: - Prep work for tegra186 - Cleanup/fixes msm: - Preemption support for a5xx - Display fixes for 8x96 (snapdragon 820) - Async cursor plane fixes - FW loading rework - GPU debugging improvements vc4: - Prep for DSI panels - fix T-format tiling scanout - New madvise ioctl Rockchip: - LVDS support omapdrm: - omap4 HDMI CEC support etnaviv: - GPU performance counters groundwork sun4i: - refactor driver load + TCON backend - HDMI improvements - A31 support - Misc fixes udl: - Probe/EDID read fixes. tilcdc: - Misc fixes. pl111: - Support more variants adv7511: - Improve EDID handling. - HDMI CEC support sii8620: - Add remote control support" * tag 'drm-for-v4.15' of git://people.freedesktop.org/~airlied/linux: (1480 commits) drm/rockchip: analogix_dp: Use mutex rather than spinlock drm/mode_object: fix documentation for object lookups. drm/i915: Reorder context-close to avoid calling i915_vma_close() under RCU drm/i915: Move init_clock_gating() back to where it was drm/i915: Prune the reservation shared fence array drm/i915: Idle the GPU before shinking everything drm/i915: Lock llist_del_first() vs llist_del_all() drm/i915: Calculate ironlake intermediate watermarks correctly, v2. drm/i915: Disable lazy PPGTT page table optimization for vGPU drm/i915/execlists: Remove the priority "optimisation" drm/i915: Filter out spurious execlists context-switch interrupts drm/amdgpu: use irq-safe lock for kiq->ring_lock drm/amdgpu: bypass lru touch for KIQ ring submission drm/amdgpu: Potential uninitialized variable in amdgpu_vm_update_directories() drm/amdgpu: potential uninitialized variable in amdgpu_vce_ring_parse_cs() drm/amd/powerplay: initialize a variable before using it drm/amd/powerplay: suppress KASAN out of bounds warning in vega10_populate_all_memory_levels drm/amd/amdgpu: fix evicted VRAM bo adjudgement condition drm/vblank: Tune drm_crtc_accurate_vblank_count() WARN down to a debug drm/rockchip: add CONFIG_OF dependency for lvds ...
This commit is contained in:
@@ -42,6 +42,7 @@
|
||||
#include "i915_drv.h"
|
||||
|
||||
#define DP_LINK_CHECK_TIMEOUT (10 * 1000)
|
||||
#define DP_DPRX_ESI_LEN 14
|
||||
|
||||
/* Compliance test status bits */
|
||||
#define INTEL_DP_RESOLUTION_SHIFT_MASK 0
|
||||
@@ -103,13 +104,13 @@ static const int cnl_rates[] = { 162000, 216000, 270000,
|
||||
static const int default_rates[] = { 162000, 270000, 540000 };
|
||||
|
||||
/**
|
||||
* is_edp - is the given port attached to an eDP panel (either CPU or PCH)
|
||||
* intel_dp_is_edp - is the given port attached to an eDP panel (either CPU or PCH)
|
||||
* @intel_dp: DP struct
|
||||
*
|
||||
* If a CPU or PCH DP output is attached to an eDP panel, this function
|
||||
* will return true, and false otherwise.
|
||||
*/
|
||||
static bool is_edp(struct intel_dp *intel_dp)
|
||||
bool intel_dp_is_edp(struct intel_dp *intel_dp)
|
||||
{
|
||||
struct intel_digital_port *intel_dig_port = dp_to_dig_port(intel_dp);
|
||||
|
||||
@@ -136,32 +137,20 @@ static void vlv_steal_power_sequencer(struct drm_device *dev,
|
||||
enum pipe pipe);
|
||||
static void intel_dp_unset_edid(struct intel_dp *intel_dp);
|
||||
|
||||
static int intel_dp_num_rates(u8 link_bw_code)
|
||||
{
|
||||
switch (link_bw_code) {
|
||||
default:
|
||||
WARN(1, "invalid max DP link bw val %x, using 1.62Gbps\n",
|
||||
link_bw_code);
|
||||
case DP_LINK_BW_1_62:
|
||||
return 1;
|
||||
case DP_LINK_BW_2_7:
|
||||
return 2;
|
||||
case DP_LINK_BW_5_4:
|
||||
return 3;
|
||||
}
|
||||
}
|
||||
|
||||
/* update sink rates from dpcd */
|
||||
static void intel_dp_set_sink_rates(struct intel_dp *intel_dp)
|
||||
{
|
||||
int i, num_rates;
|
||||
int i, max_rate;
|
||||
|
||||
num_rates = intel_dp_num_rates(intel_dp->dpcd[DP_MAX_LINK_RATE]);
|
||||
max_rate = drm_dp_bw_code_to_link_rate(intel_dp->dpcd[DP_MAX_LINK_RATE]);
|
||||
|
||||
for (i = 0; i < num_rates; i++)
|
||||
for (i = 0; i < ARRAY_SIZE(default_rates); i++) {
|
||||
if (default_rates[i] > max_rate)
|
||||
break;
|
||||
intel_dp->sink_rates[i] = default_rates[i];
|
||||
}
|
||||
|
||||
intel_dp->num_sink_rates = num_rates;
|
||||
intel_dp->num_sink_rates = i;
|
||||
}
|
||||
|
||||
/* Theoretical max between source and sink */
|
||||
@@ -253,15 +242,15 @@ intel_dp_set_source_rates(struct intel_dp *intel_dp)
|
||||
} else if (IS_GEN9_BC(dev_priv)) {
|
||||
source_rates = skl_rates;
|
||||
size = ARRAY_SIZE(skl_rates);
|
||||
} else {
|
||||
} else if ((IS_HASWELL(dev_priv) && !IS_HSW_ULX(dev_priv)) ||
|
||||
IS_BROADWELL(dev_priv)) {
|
||||
source_rates = default_rates;
|
||||
size = ARRAY_SIZE(default_rates);
|
||||
} else {
|
||||
source_rates = default_rates;
|
||||
size = ARRAY_SIZE(default_rates) - 1;
|
||||
}
|
||||
|
||||
/* This depends on the fact that 5.4 is last value in the array */
|
||||
if (!intel_dp_source_supports_hbr2(intel_dp))
|
||||
size--;
|
||||
|
||||
intel_dp->source_rates = source_rates;
|
||||
intel_dp->num_source_rates = size;
|
||||
}
|
||||
@@ -388,7 +377,7 @@ intel_dp_mode_valid(struct drm_connector *connector,
|
||||
|
||||
max_dotclk = intel_dp_downstream_max_dotclock(intel_dp);
|
||||
|
||||
if (is_edp(intel_dp) && fixed_mode) {
|
||||
if (intel_dp_is_edp(intel_dp) && fixed_mode) {
|
||||
if (mode->hdisplay > fixed_mode->hdisplay)
|
||||
return MODE_PANEL;
|
||||
|
||||
@@ -597,7 +586,7 @@ vlv_power_sequencer_pipe(struct intel_dp *intel_dp)
|
||||
lockdep_assert_held(&dev_priv->pps_mutex);
|
||||
|
||||
/* We should never land here with regular DP ports */
|
||||
WARN_ON(!is_edp(intel_dp));
|
||||
WARN_ON(!intel_dp_is_edp(intel_dp));
|
||||
|
||||
WARN_ON(intel_dp->active_pipe != INVALID_PIPE &&
|
||||
intel_dp->active_pipe != intel_dp->pps_pipe);
|
||||
@@ -644,7 +633,7 @@ bxt_power_sequencer_idx(struct intel_dp *intel_dp)
|
||||
lockdep_assert_held(&dev_priv->pps_mutex);
|
||||
|
||||
/* We should never land here with regular DP ports */
|
||||
WARN_ON(!is_edp(intel_dp));
|
||||
WARN_ON(!intel_dp_is_edp(intel_dp));
|
||||
|
||||
/*
|
||||
* TODO: BXT has 2 PPS instances. The correct port->PPS instance
|
||||
@@ -847,7 +836,7 @@ static int edp_notify_handler(struct notifier_block *this, unsigned long code,
|
||||
struct drm_device *dev = intel_dp_to_dev(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
|
||||
if (!is_edp(intel_dp) || code != SYS_RESTART)
|
||||
if (!intel_dp_is_edp(intel_dp) || code != SYS_RESTART)
|
||||
return 0;
|
||||
|
||||
pps_lock(intel_dp);
|
||||
@@ -907,7 +896,7 @@ intel_dp_check_edp(struct intel_dp *intel_dp)
|
||||
struct drm_device *dev = intel_dp_to_dev(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
if (!edp_have_panel_power(intel_dp) && !edp_have_panel_vdd(intel_dp)) {
|
||||
@@ -1018,7 +1007,7 @@ static uint32_t g4x_get_aux_send_ctl(struct intel_dp *intel_dp,
|
||||
else
|
||||
precharge = 5;
|
||||
|
||||
if (IS_BROADWELL(dev_priv) && intel_dig_port->port == PORT_A)
|
||||
if (IS_BROADWELL(dev_priv))
|
||||
timeout = DP_AUX_CH_CTL_TIME_OUT_600us;
|
||||
else
|
||||
timeout = DP_AUX_CH_CTL_TIME_OUT_400us;
|
||||
@@ -1043,7 +1032,7 @@ static uint32_t skl_get_aux_send_ctl(struct intel_dp *intel_dp,
|
||||
DP_AUX_CH_CTL_DONE |
|
||||
(has_aux_irq ? DP_AUX_CH_CTL_INTERRUPT : 0) |
|
||||
DP_AUX_CH_CTL_TIME_OUT_ERROR |
|
||||
DP_AUX_CH_CTL_TIME_OUT_1600us |
|
||||
DP_AUX_CH_CTL_TIME_OUT_MAX |
|
||||
DP_AUX_CH_CTL_RECEIVE_ERROR |
|
||||
(send_bytes << DP_AUX_CH_CTL_MESSAGE_SIZE_SHIFT) |
|
||||
DP_AUX_CH_CTL_FW_SYNC_PULSE_SKL(32) |
|
||||
@@ -1481,14 +1470,9 @@ intel_dp_aux_init(struct intel_dp *intel_dp)
|
||||
|
||||
bool intel_dp_source_supports_hbr2(struct intel_dp *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);
|
||||
int max_rate = intel_dp->source_rates[intel_dp->num_source_rates - 1];
|
||||
|
||||
if ((IS_HASWELL(dev_priv) && !IS_HSW_ULX(dev_priv)) ||
|
||||
IS_BROADWELL(dev_priv) || (INTEL_GEN(dev_priv) >= 9))
|
||||
return true;
|
||||
else
|
||||
return false;
|
||||
return max_rate >= 540000;
|
||||
}
|
||||
|
||||
static void
|
||||
@@ -1681,7 +1665,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
||||
else
|
||||
pipe_config->has_audio = intel_conn_state->force_audio == HDMI_AUDIO_ON;
|
||||
|
||||
if (is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
|
||||
if (intel_dp_is_edp(intel_dp) && intel_connector->panel.fixed_mode) {
|
||||
struct drm_display_mode *panel_mode =
|
||||
intel_connector->panel.alt_fixed_mode;
|
||||
struct drm_display_mode *req_mode = &pipe_config->base.mode;
|
||||
@@ -1736,7 +1720,7 @@ intel_dp_compute_config(struct intel_encoder *encoder,
|
||||
/* Walk through all bpp values. Luckily they're all nicely spaced with 2
|
||||
* bpc in between. */
|
||||
bpp = intel_dp_compute_bpp(intel_dp, pipe_config);
|
||||
if (is_edp(intel_dp)) {
|
||||
if (intel_dp_is_edp(intel_dp)) {
|
||||
|
||||
/* Get bpp from vbt only for panels that dont have bpp in edid */
|
||||
if (intel_connector->base.display_info.bpc == 0 &&
|
||||
@@ -1829,7 +1813,7 @@ found:
|
||||
* DPLL0 VCO may need to be adjusted to get the correct
|
||||
* clock for eDP. This will affect cdclk as well.
|
||||
*/
|
||||
if (is_edp(intel_dp) && IS_GEN9_BC(dev_priv)) {
|
||||
if (intel_dp_is_edp(intel_dp) && IS_GEN9_BC(dev_priv)) {
|
||||
int vco;
|
||||
|
||||
switch (pipe_config->port_clock / 2) {
|
||||
@@ -1848,6 +1832,8 @@ found:
|
||||
if (!HAS_DDI(dev_priv))
|
||||
intel_dp_set_clock(encoder, pipe_config);
|
||||
|
||||
intel_psr_compute_config(intel_dp, pipe_config);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@@ -1861,7 +1847,7 @@ void intel_dp_set_link_params(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
static void intel_dp_prepare(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
const struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
@@ -2069,7 +2055,7 @@ static bool edp_panel_vdd_on(struct intel_dp *intel_dp)
|
||||
|
||||
lockdep_assert_held(&dev_priv->pps_mutex);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return false;
|
||||
|
||||
cancel_delayed_work(&intel_dp->panel_vdd_work);
|
||||
@@ -2119,7 +2105,7 @@ void intel_edp_panel_vdd_on(struct intel_dp *intel_dp)
|
||||
{
|
||||
bool vdd;
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
pps_lock(intel_dp);
|
||||
@@ -2203,7 +2189,7 @@ static void edp_panel_vdd_off(struct intel_dp *intel_dp, bool sync)
|
||||
|
||||
lockdep_assert_held(&dev_priv->pps_mutex);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
I915_STATE_WARN(!intel_dp->want_panel_vdd, "eDP port %c VDD not forced on",
|
||||
@@ -2226,7 +2212,7 @@ static void edp_panel_on(struct intel_dp *intel_dp)
|
||||
|
||||
lockdep_assert_held(&dev_priv->pps_mutex);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
DRM_DEBUG_KMS("Turn eDP port %c panel power on\n",
|
||||
@@ -2267,7 +2253,7 @@ static void edp_panel_on(struct intel_dp *intel_dp)
|
||||
|
||||
void intel_edp_panel_on(struct intel_dp *intel_dp)
|
||||
{
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
pps_lock(intel_dp);
|
||||
@@ -2285,7 +2271,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
|
||||
|
||||
lockdep_assert_held(&dev_priv->pps_mutex);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
DRM_DEBUG_KMS("Turn eDP port %c panel power off\n",
|
||||
@@ -2316,7 +2302,7 @@ static void edp_panel_off(struct intel_dp *intel_dp)
|
||||
|
||||
void intel_edp_panel_off(struct intel_dp *intel_dp)
|
||||
{
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
pps_lock(intel_dp);
|
||||
@@ -2360,7 +2346,7 @@ void intel_edp_backlight_on(const struct intel_crtc_state *crtc_state,
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(conn_state->best_encoder);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
DRM_DEBUG_KMS("\n");
|
||||
@@ -2377,7 +2363,7 @@ static void _intel_edp_backlight_off(struct intel_dp *intel_dp)
|
||||
u32 pp;
|
||||
i915_reg_t pp_ctrl_reg;
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
pps_lock(intel_dp);
|
||||
@@ -2401,7 +2387,7 @@ void intel_edp_backlight_off(const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(old_conn_state->best_encoder);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
DRM_DEBUG_KMS("\n");
|
||||
@@ -2461,7 +2447,7 @@ static void assert_edp_pll(struct drm_i915_private *dev_priv, bool state)
|
||||
#define assert_edp_pll_disabled(d) assert_edp_pll((d), false)
|
||||
|
||||
static void ironlake_edp_pll_on(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *pipe_config)
|
||||
const struct intel_crtc_state *pipe_config)
|
||||
{
|
||||
struct intel_crtc *crtc = to_intel_crtc(pipe_config->base.crtc);
|
||||
struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
|
||||
@@ -2666,7 +2652,7 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||
intel_dotclock_calculate(pipe_config->port_clock,
|
||||
&pipe_config->dp_m_n);
|
||||
|
||||
if (is_edp(intel_dp) && dev_priv->vbt.edp.bpp &&
|
||||
if (intel_dp_is_edp(intel_dp) && dev_priv->vbt.edp.bpp &&
|
||||
pipe_config->pipe_bpp > dev_priv->vbt.edp.bpp) {
|
||||
/*
|
||||
* This is a big fat ugly hack.
|
||||
@@ -2688,33 +2674,55 @@ static void intel_dp_get_config(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void intel_disable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *old_crtc_state,
|
||||
struct drm_connector_state *old_conn_state)
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
|
||||
|
||||
if (old_crtc_state->has_audio)
|
||||
intel_audio_codec_disable(encoder);
|
||||
|
||||
if (HAS_PSR(dev_priv) && !HAS_DDI(dev_priv))
|
||||
intel_psr_disable(intel_dp);
|
||||
|
||||
/* Make sure the panel is off before trying to change the mode. But also
|
||||
* ensure that we have vdd while we switch off the panel. */
|
||||
intel_edp_panel_vdd_on(intel_dp);
|
||||
intel_edp_backlight_off(old_conn_state);
|
||||
intel_dp_sink_dpms(intel_dp, DRM_MODE_DPMS_OFF);
|
||||
intel_edp_panel_off(intel_dp);
|
||||
}
|
||||
|
||||
static void g4x_disable_dp(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
|
||||
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
||||
|
||||
/* disable the port before the pipe on g4x */
|
||||
if (INTEL_GEN(dev_priv) < 5)
|
||||
intel_dp_link_down(intel_dp);
|
||||
intel_dp_link_down(intel_dp);
|
||||
}
|
||||
|
||||
static void ilk_disable_dp(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
||||
}
|
||||
|
||||
static void vlv_disable_dp(struct intel_encoder *encoder,
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
|
||||
intel_psr_disable(intel_dp, old_crtc_state);
|
||||
|
||||
intel_disable_dp(encoder, old_crtc_state, old_conn_state);
|
||||
}
|
||||
|
||||
static void ilk_post_disable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *old_crtc_state,
|
||||
struct drm_connector_state *old_conn_state)
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
enum port port = dp_to_dig_port(intel_dp)->port;
|
||||
@@ -2727,8 +2735,8 @@ static void ilk_post_disable_dp(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void vlv_post_disable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *old_crtc_state,
|
||||
struct drm_connector_state *old_conn_state)
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
|
||||
@@ -2736,8 +2744,8 @@ static void vlv_post_disable_dp(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void chv_post_disable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *old_crtc_state,
|
||||
struct drm_connector_state *old_conn_state)
|
||||
const struct intel_crtc_state *old_crtc_state,
|
||||
const struct drm_connector_state *old_conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
@@ -2842,7 +2850,7 @@ _intel_dp_set_link_train(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
static void intel_dp_enable_port(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *old_crtc_state)
|
||||
const struct intel_crtc_state *old_crtc_state)
|
||||
{
|
||||
struct drm_device *dev = intel_dp_to_dev(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
@@ -2866,8 +2874,8 @@ static void intel_dp_enable_port(struct intel_dp *intel_dp,
|
||||
}
|
||||
|
||||
static void intel_enable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
struct drm_device *dev = encoder->base.dev;
|
||||
@@ -2914,26 +2922,26 @@ static void intel_enable_dp(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void g4x_enable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
intel_enable_dp(encoder, pipe_config, conn_state);
|
||||
intel_edp_backlight_on(pipe_config, conn_state);
|
||||
}
|
||||
|
||||
static void vlv_enable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
|
||||
intel_edp_backlight_on(pipe_config, conn_state);
|
||||
intel_psr_enable(intel_dp);
|
||||
intel_psr_enable(intel_dp, pipe_config);
|
||||
}
|
||||
|
||||
static void g4x_pre_enable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base);
|
||||
enum port port = dp_to_dig_port(intel_dp)->port;
|
||||
@@ -3040,7 +3048,7 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp)
|
||||
|
||||
intel_dp->active_pipe = crtc->pipe;
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
/* now it's all ours */
|
||||
@@ -3055,8 +3063,8 @@ static void vlv_init_panel_power_sequencer(struct intel_dp *intel_dp)
|
||||
}
|
||||
|
||||
static void vlv_pre_enable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
vlv_phy_pre_encoder_enable(encoder);
|
||||
|
||||
@@ -3064,8 +3072,8 @@ static void vlv_pre_enable_dp(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
intel_dp_prepare(encoder, pipe_config);
|
||||
|
||||
@@ -3073,8 +3081,8 @@ static void vlv_dp_pre_pll_enable(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void chv_pre_enable_dp(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
chv_phy_pre_encoder_enable(encoder);
|
||||
|
||||
@@ -3085,8 +3093,8 @@ static void chv_pre_enable_dp(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void chv_dp_pre_pll_enable(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
intel_dp_prepare(encoder, pipe_config);
|
||||
|
||||
@@ -3094,8 +3102,8 @@ static void chv_dp_pre_pll_enable(struct intel_encoder *encoder,
|
||||
}
|
||||
|
||||
static void chv_dp_post_pll_disable(struct intel_encoder *encoder,
|
||||
struct intel_crtc_state *pipe_config,
|
||||
struct drm_connector_state *conn_state)
|
||||
const struct intel_crtc_state *pipe_config,
|
||||
const struct drm_connector_state *conn_state)
|
||||
{
|
||||
chv_phy_post_pll_disable(encoder);
|
||||
}
|
||||
@@ -3147,9 +3155,7 @@ intel_dp_voltage_max(struct intel_dp *intel_dp)
|
||||
struct drm_i915_private *dev_priv = to_i915(intel_dp_to_dev(intel_dp));
|
||||
enum port port = dp_to_dig_port(intel_dp)->port;
|
||||
|
||||
if (IS_GEN9_LP(dev_priv))
|
||||
return DP_TRAIN_VOLTAGE_SWING_LEVEL_3;
|
||||
else if (INTEL_GEN(dev_priv) >= 9) {
|
||||
if (INTEL_GEN(dev_priv) >= 9) {
|
||||
struct intel_encoder *encoder = &dp_to_dig_port(intel_dp)->base;
|
||||
return intel_ddi_dp_voltage_max(encoder);
|
||||
} else if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
|
||||
@@ -3506,13 +3512,11 @@ intel_dp_set_signal_levels(struct intel_dp *intel_dp)
|
||||
uint32_t signal_levels, mask = 0;
|
||||
uint8_t train_set = intel_dp->train_set[0];
|
||||
|
||||
if (HAS_DDI(dev_priv)) {
|
||||
if (IS_GEN9_LP(dev_priv) || IS_CANNONLAKE(dev_priv)) {
|
||||
signal_levels = bxt_signal_levels(intel_dp);
|
||||
} else if (HAS_DDI(dev_priv)) {
|
||||
signal_levels = ddi_signal_levels(intel_dp);
|
||||
|
||||
if (IS_GEN9_LP(dev_priv) || IS_CANNONLAKE(dev_priv))
|
||||
signal_levels = 0;
|
||||
else
|
||||
mask = DDI_BUF_EMP_MASK;
|
||||
mask = DDI_BUF_EMP_MASK;
|
||||
} else if (IS_CHERRYVIEW(dev_priv)) {
|
||||
signal_levels = chv_signal_levels(intel_dp);
|
||||
} else if (IS_VALLEYVIEW(dev_priv)) {
|
||||
@@ -3791,7 +3795,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
|
||||
return false;
|
||||
|
||||
/* Don't clobber cached eDP rates. */
|
||||
if (!is_edp(intel_dp)) {
|
||||
if (!intel_dp_is_edp(intel_dp)) {
|
||||
intel_dp_set_sink_rates(intel_dp);
|
||||
intel_dp_set_common_rates(intel_dp);
|
||||
}
|
||||
@@ -3813,7 +3817,7 @@ intel_dp_get_dpcd(struct intel_dp *intel_dp)
|
||||
* downstream port information. So, an early return here saves
|
||||
* time from performing other operations which are not required.
|
||||
*/
|
||||
if (!is_edp(intel_dp) && !intel_dp->sink_count)
|
||||
if (!intel_dp_is_edp(intel_dp) && !intel_dp->sink_count)
|
||||
return false;
|
||||
|
||||
if (!drm_dp_is_branch(intel_dp->dpcd))
|
||||
@@ -3835,7 +3839,7 @@ intel_dp_can_mst(struct intel_dp *intel_dp)
|
||||
{
|
||||
u8 mstm_cap;
|
||||
|
||||
if (!i915.enable_dp_mst)
|
||||
if (!i915_modparams.enable_dp_mst)
|
||||
return false;
|
||||
|
||||
if (!intel_dp->can_mst)
|
||||
@@ -3853,7 +3857,7 @@ intel_dp_can_mst(struct intel_dp *intel_dp)
|
||||
static void
|
||||
intel_dp_configure_mst(struct intel_dp *intel_dp)
|
||||
{
|
||||
if (!i915.enable_dp_mst)
|
||||
if (!i915_modparams.enable_dp_mst)
|
||||
return;
|
||||
|
||||
if (!intel_dp->can_mst)
|
||||
@@ -4000,15 +4004,9 @@ intel_dp_get_sink_irq(struct intel_dp *intel_dp, u8 *sink_irq_vector)
|
||||
static bool
|
||||
intel_dp_get_sink_irq_esi(struct intel_dp *intel_dp, u8 *sink_irq_vector)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = drm_dp_dpcd_read(&intel_dp->aux,
|
||||
DP_SINK_COUNT_ESI,
|
||||
sink_irq_vector, 14);
|
||||
if (ret != 14)
|
||||
return false;
|
||||
|
||||
return true;
|
||||
return drm_dp_dpcd_read(&intel_dp->aux, DP_SINK_COUNT_ESI,
|
||||
sink_irq_vector, DP_DPRX_ESI_LEN) ==
|
||||
DP_DPRX_ESI_LEN;
|
||||
}
|
||||
|
||||
static uint8_t intel_dp_autotest_link_training(struct intel_dp *intel_dp)
|
||||
@@ -4208,7 +4206,7 @@ intel_dp_check_mst_status(struct intel_dp *intel_dp)
|
||||
bool bret;
|
||||
|
||||
if (intel_dp->is_mst) {
|
||||
u8 esi[16] = { 0 };
|
||||
u8 esi[DP_DPRX_ESI_LEN] = { 0 };
|
||||
int ret = 0;
|
||||
int retry;
|
||||
bool handled;
|
||||
@@ -4403,7 +4401,7 @@ intel_dp_detect_dpcd(struct intel_dp *intel_dp)
|
||||
if (!intel_dp_get_dpcd(intel_dp))
|
||||
return connector_status_disconnected;
|
||||
|
||||
if (is_edp(intel_dp))
|
||||
if (intel_dp_is_edp(intel_dp))
|
||||
return connector_status_connected;
|
||||
|
||||
/* if there's no downstream port, we're done */
|
||||
@@ -4719,7 +4717,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
|
||||
intel_display_power_get(to_i915(dev), intel_dp->aux_power_domain);
|
||||
|
||||
/* Can't disconnect eDP, but you can close the lid... */
|
||||
if (is_edp(intel_dp))
|
||||
if (intel_dp_is_edp(intel_dp))
|
||||
status = edp_detect(intel_dp);
|
||||
else if (intel_digital_port_connected(to_i915(dev),
|
||||
dp_to_dig_port(intel_dp)))
|
||||
@@ -4745,10 +4743,6 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
|
||||
if (intel_encoder->type != INTEL_OUTPUT_EDP)
|
||||
intel_encoder->type = INTEL_OUTPUT_DP;
|
||||
|
||||
DRM_DEBUG_KMS("Display Port TPS3 support: source %s, sink %s\n",
|
||||
yesno(intel_dp_source_supports_hbr2(intel_dp)),
|
||||
yesno(drm_dp_tps3_supported(intel_dp->dpcd)));
|
||||
|
||||
if (intel_dp->reset_link_params) {
|
||||
/* Initial max link lane count */
|
||||
intel_dp->max_link_lane_count = intel_dp_max_common_lane_count(intel_dp);
|
||||
@@ -4799,7 +4793,7 @@ intel_dp_long_pulse(struct intel_connector *intel_connector)
|
||||
intel_dp->aux.i2c_defer_count = 0;
|
||||
|
||||
intel_dp_set_edid(intel_dp);
|
||||
if (is_edp(intel_dp) || intel_connector->detect_edid)
|
||||
if (intel_dp_is_edp(intel_dp) || intel_connector->detect_edid)
|
||||
status = connector_status_connected;
|
||||
intel_dp->detect_done = true;
|
||||
|
||||
@@ -4883,7 +4877,7 @@ static int intel_dp_get_modes(struct drm_connector *connector)
|
||||
}
|
||||
|
||||
/* if eDP has no EDID, fall back to fixed mode */
|
||||
if (is_edp(intel_attached_dp(connector)) &&
|
||||
if (intel_dp_is_edp(intel_attached_dp(connector)) &&
|
||||
intel_connector->panel.fixed_mode) {
|
||||
struct drm_display_mode *mode;
|
||||
|
||||
@@ -4934,8 +4928,10 @@ intel_dp_connector_destroy(struct drm_connector *connector)
|
||||
if (!IS_ERR_OR_NULL(intel_connector->edid))
|
||||
kfree(intel_connector->edid);
|
||||
|
||||
/* Can't call is_edp() since the encoder may have been destroyed
|
||||
* already. */
|
||||
/*
|
||||
* Can't call intel_dp_is_edp() since the encoder may have been
|
||||
* destroyed already.
|
||||
*/
|
||||
if (connector->connector_type == DRM_MODE_CONNECTOR_eDP)
|
||||
intel_panel_fini(&intel_connector->panel);
|
||||
|
||||
@@ -4949,7 +4945,7 @@ void intel_dp_encoder_destroy(struct drm_encoder *encoder)
|
||||
struct intel_dp *intel_dp = &intel_dig_port->dp;
|
||||
|
||||
intel_dp_mst_encoder_cleanup(intel_dig_port);
|
||||
if (is_edp(intel_dp)) {
|
||||
if (intel_dp_is_edp(intel_dp)) {
|
||||
cancel_delayed_work_sync(&intel_dp->panel_vdd_work);
|
||||
/*
|
||||
* vdd might still be enabled do to the delayed vdd off.
|
||||
@@ -4975,7 +4971,7 @@ void intel_dp_encoder_suspend(struct intel_encoder *intel_encoder)
|
||||
{
|
||||
struct intel_dp *intel_dp = enc_to_intel_dp(&intel_encoder->base);
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return;
|
||||
|
||||
/*
|
||||
@@ -5043,7 +5039,7 @@ void intel_dp_encoder_reset(struct drm_encoder *encoder)
|
||||
if (IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv))
|
||||
intel_dp->active_pipe = vlv_active_pipe(intel_dp);
|
||||
|
||||
if (is_edp(intel_dp)) {
|
||||
if (intel_dp_is_edp(intel_dp)) {
|
||||
/* Reinit the power sequencer, in case BIOS did something with it. */
|
||||
intel_dp_pps_init(encoder->dev, intel_dp);
|
||||
intel_edp_panel_vdd_sanitize(intel_dp);
|
||||
@@ -5144,7 +5140,7 @@ put_power:
|
||||
}
|
||||
|
||||
/* check the VBT to see whether the eDP is on another port */
|
||||
bool intel_dp_is_edp(struct drm_i915_private *dev_priv, enum port port)
|
||||
bool intel_dp_is_port_edp(struct drm_i915_private *dev_priv, enum port port)
|
||||
{
|
||||
/*
|
||||
* eDP not supported on g4x. so bail out early just
|
||||
@@ -5167,7 +5163,7 @@ intel_dp_add_properties(struct intel_dp *intel_dp, struct drm_connector *connect
|
||||
intel_attach_force_audio_property(connector);
|
||||
intel_attach_broadcast_rgb_property(connector);
|
||||
|
||||
if (is_edp(intel_dp)) {
|
||||
if (intel_dp_is_edp(intel_dp)) {
|
||||
u32 allowed_scalers;
|
||||
|
||||
allowed_scalers = BIT(DRM_MODE_SCALE_ASPECT) | BIT(DRM_MODE_SCALE_FULLSCREEN);
|
||||
@@ -5455,7 +5451,7 @@ static void intel_dp_pps_init(struct drm_device *dev,
|
||||
* The caller of this function needs to take a lock on dev_priv->drrs.
|
||||
*/
|
||||
static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv,
|
||||
struct intel_crtc_state *crtc_state,
|
||||
const struct intel_crtc_state *crtc_state,
|
||||
int refresh_rate)
|
||||
{
|
||||
struct intel_encoder *encoder;
|
||||
@@ -5474,11 +5470,6 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv,
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* FIXME: This needs proper synchronization with psr state for some
|
||||
* platforms that cannot have PSR and DRRS enabled at the same time.
|
||||
*/
|
||||
|
||||
dig_port = dp_to_dig_port(intel_dp);
|
||||
encoder = &dig_port->base;
|
||||
intel_crtc = to_intel_crtc(encoder->base.crtc);
|
||||
@@ -5552,7 +5543,7 @@ static void intel_dp_set_drrs_state(struct drm_i915_private *dev_priv,
|
||||
* Initializes frontbuffer_bits and drrs.dp
|
||||
*/
|
||||
void intel_edp_drrs_enable(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *crtc_state)
|
||||
const struct intel_crtc_state *crtc_state)
|
||||
{
|
||||
struct drm_device *dev = intel_dp_to_dev(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
@@ -5562,6 +5553,11 @@ void intel_edp_drrs_enable(struct intel_dp *intel_dp,
|
||||
return;
|
||||
}
|
||||
|
||||
if (dev_priv->psr.enabled) {
|
||||
DRM_DEBUG_KMS("PSR enabled. Not enabling DRRS.\n");
|
||||
return;
|
||||
}
|
||||
|
||||
mutex_lock(&dev_priv->drrs.mutex);
|
||||
if (WARN_ON(dev_priv->drrs.dp)) {
|
||||
DRM_ERROR("DRRS already enabled\n");
|
||||
@@ -5583,7 +5579,7 @@ unlock:
|
||||
*
|
||||
*/
|
||||
void intel_edp_drrs_disable(struct intel_dp *intel_dp,
|
||||
struct intel_crtc_state *old_crtc_state)
|
||||
const struct intel_crtc_state *old_crtc_state)
|
||||
{
|
||||
struct drm_device *dev = intel_dp_to_dev(intel_dp);
|
||||
struct drm_i915_private *dev_priv = to_i915(dev);
|
||||
@@ -5833,7 +5829,7 @@ static bool intel_edp_init_connector(struct intel_dp *intel_dp,
|
||||
struct edid *edid;
|
||||
enum pipe pipe = INVALID_PIPE;
|
||||
|
||||
if (!is_edp(intel_dp))
|
||||
if (!intel_dp_is_edp(intel_dp))
|
||||
return true;
|
||||
|
||||
/*
|
||||
@@ -6049,7 +6045,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
||||
intel_dp->DP = I915_READ(intel_dp->output_reg);
|
||||
intel_dp->attached_connector = intel_connector;
|
||||
|
||||
if (intel_dp_is_edp(dev_priv, port))
|
||||
if (intel_dp_is_port_edp(dev_priv, port))
|
||||
type = DRM_MODE_CONNECTOR_eDP;
|
||||
else
|
||||
type = DRM_MODE_CONNECTOR_DisplayPort;
|
||||
@@ -6067,7 +6063,8 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
||||
|
||||
/* eDP only on port B and/or C on vlv/chv */
|
||||
if (WARN_ON((IS_VALLEYVIEW(dev_priv) || IS_CHERRYVIEW(dev_priv)) &&
|
||||
is_edp(intel_dp) && port != PORT_B && port != PORT_C))
|
||||
intel_dp_is_edp(intel_dp) &&
|
||||
port != PORT_B && port != PORT_C))
|
||||
return false;
|
||||
|
||||
DRM_DEBUG_KMS("Adding %s connector on port %c\n",
|
||||
@@ -6095,7 +6092,7 @@ intel_dp_init_connector(struct intel_digital_port *intel_dig_port,
|
||||
intel_connector->get_hw_state = intel_connector_get_hw_state;
|
||||
|
||||
/* init MST on ports that can support it */
|
||||
if (HAS_DP_MST(dev_priv) && !is_edp(intel_dp) &&
|
||||
if (HAS_DP_MST(dev_priv) && !intel_dp_is_edp(intel_dp) &&
|
||||
(port == PORT_B || port == PORT_C || port == PORT_D))
|
||||
intel_dp_mst_encoder_init(intel_dig_port,
|
||||
intel_connector->base.base.id);
|
||||
@@ -6151,7 +6148,6 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
|
||||
goto err_encoder_init;
|
||||
|
||||
intel_encoder->compute_config = intel_dp_compute_config;
|
||||
intel_encoder->disable = intel_disable_dp;
|
||||
intel_encoder->get_hw_state = intel_dp_get_hw_state;
|
||||
intel_encoder->get_config = intel_dp_get_config;
|
||||
intel_encoder->suspend = intel_dp_encoder_suspend;
|
||||
@@ -6159,18 +6155,24 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
|
||||
intel_encoder->pre_pll_enable = chv_dp_pre_pll_enable;
|
||||
intel_encoder->pre_enable = chv_pre_enable_dp;
|
||||
intel_encoder->enable = vlv_enable_dp;
|
||||
intel_encoder->disable = vlv_disable_dp;
|
||||
intel_encoder->post_disable = chv_post_disable_dp;
|
||||
intel_encoder->post_pll_disable = chv_dp_post_pll_disable;
|
||||
} else if (IS_VALLEYVIEW(dev_priv)) {
|
||||
intel_encoder->pre_pll_enable = vlv_dp_pre_pll_enable;
|
||||
intel_encoder->pre_enable = vlv_pre_enable_dp;
|
||||
intel_encoder->enable = vlv_enable_dp;
|
||||
intel_encoder->disable = vlv_disable_dp;
|
||||
intel_encoder->post_disable = vlv_post_disable_dp;
|
||||
} else if (INTEL_GEN(dev_priv) >= 5) {
|
||||
intel_encoder->pre_enable = g4x_pre_enable_dp;
|
||||
intel_encoder->enable = g4x_enable_dp;
|
||||
intel_encoder->disable = ilk_disable_dp;
|
||||
intel_encoder->post_disable = ilk_post_disable_dp;
|
||||
} else {
|
||||
intel_encoder->pre_enable = g4x_pre_enable_dp;
|
||||
intel_encoder->enable = g4x_enable_dp;
|
||||
if (INTEL_GEN(dev_priv) >= 5)
|
||||
intel_encoder->post_disable = ilk_post_disable_dp;
|
||||
intel_encoder->disable = g4x_disable_dp;
|
||||
}
|
||||
|
||||
intel_dig_port->port = port;
|
||||
@@ -6193,6 +6195,9 @@ bool intel_dp_init(struct drm_i915_private *dev_priv,
|
||||
intel_dig_port->hpd_pulse = intel_dp_hpd_pulse;
|
||||
dev_priv->hotplug.irq_port[port] = intel_dig_port;
|
||||
|
||||
if (port != PORT_A)
|
||||
intel_infoframe_init(intel_dig_port);
|
||||
|
||||
if (!intel_dp_init_connector(intel_dig_port, intel_connector))
|
||||
goto err_init_connector;
|
||||
|
||||
|
Reference in New Issue
Block a user