Commit e60cff45 authored by Imre Deak's avatar Imre Deak

drm/i915/dp: Enable DP tunnel BW allocation mode

Detect DP tunnels and enable the BW allocation mode on them. Send a
hotplug notification to userspace in response to a BW change.
Reviewed-by: default avatarUma Shankar <uma.shankar@intel.com>
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Signed-off-by: default avatarImre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20240220211841.448846-22-imre.deak@intel.com
parent a32f3a95
...@@ -35,6 +35,7 @@ ...@@ -35,6 +35,7 @@
#include "intel_dkl_phy.h" #include "intel_dkl_phy.h"
#include "intel_dmc.h" #include "intel_dmc.h"
#include "intel_dp.h" #include "intel_dp.h"
#include "intel_dp_tunnel.h"
#include "intel_dpll.h" #include "intel_dpll.h"
#include "intel_dpll_mgr.h" #include "intel_dpll_mgr.h"
#include "intel_fb.h" #include "intel_fb.h"
...@@ -434,10 +435,8 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915) ...@@ -434,10 +435,8 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
for_each_pipe(i915, pipe) { for_each_pipe(i915, pipe) {
ret = intel_crtc_init(i915, pipe); ret = intel_crtc_init(i915, pipe);
if (ret) { if (ret)
intel_mode_config_cleanup(i915); goto err_mode_config;
return ret;
}
} }
intel_plane_possible_crtcs_init(i915); intel_plane_possible_crtcs_init(i915);
...@@ -457,6 +456,10 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915) ...@@ -457,6 +456,10 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
intel_vga_disable(i915); intel_vga_disable(i915);
intel_setup_outputs(i915); intel_setup_outputs(i915);
ret = intel_dp_tunnel_mgr_init(i915);
if (ret)
goto err_hdcp;
intel_display_driver_disable_user_access(i915); intel_display_driver_disable_user_access(i915);
drm_modeset_lock_all(dev); drm_modeset_lock_all(dev);
...@@ -475,6 +478,13 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915) ...@@ -475,6 +478,13 @@ int intel_display_driver_probe_nogem(struct drm_i915_private *i915)
ilk_wm_sanitize(i915); ilk_wm_sanitize(i915);
return 0; return 0;
err_hdcp:
intel_hdcp_component_fini(i915);
err_mode_config:
intel_mode_config_cleanup(i915);
return ret;
} }
/* part #3: call after gem init */ /* part #3: call after gem init */
...@@ -598,6 +608,8 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915) ...@@ -598,6 +608,8 @@ void intel_display_driver_remove_noirq(struct drm_i915_private *i915)
intel_mode_config_cleanup(i915); intel_mode_config_cleanup(i915);
intel_dp_tunnel_mgr_cleanup(i915);
intel_overlay_cleanup(i915); intel_overlay_cleanup(i915);
intel_gmbus_teardown(i915); intel_gmbus_teardown(i915);
......
...@@ -5729,6 +5729,7 @@ intel_dp_detect(struct drm_connector *connector, ...@@ -5729,6 +5729,7 @@ intel_dp_detect(struct drm_connector *connector,
struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp); struct intel_digital_port *dig_port = dp_to_dig_port(intel_dp);
struct intel_encoder *encoder = &dig_port->base; struct intel_encoder *encoder = &dig_port->base;
enum drm_connector_status status; enum drm_connector_status status;
int ret;
drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n", drm_dbg_kms(&dev_priv->drm, "[CONNECTOR:%d:%s]\n",
connector->base.id, connector->name); connector->base.id, connector->name);
...@@ -5764,9 +5765,18 @@ intel_dp_detect(struct drm_connector *connector, ...@@ -5764,9 +5765,18 @@ intel_dp_detect(struct drm_connector *connector,
intel_dp->is_mst); intel_dp->is_mst);
} }
intel_dp_tunnel_disconnect(intel_dp);
goto out; goto out;
} }
ret = intel_dp_tunnel_detect(intel_dp, ctx);
if (ret == -EDEADLK)
return ret;
if (ret == 1)
intel_connector->base.epoch_counter++;
intel_dp_detect_dsc_caps(intel_dp, intel_connector); intel_dp_detect_dsc_caps(intel_dp, intel_connector);
intel_dp_configure_mst(intel_dp); intel_dp_configure_mst(intel_dp);
...@@ -5797,8 +5807,6 @@ intel_dp_detect(struct drm_connector *connector, ...@@ -5797,8 +5807,6 @@ intel_dp_detect(struct drm_connector *connector,
* with an IRQ_HPD, so force a link status check. * with an IRQ_HPD, so force a link status check.
*/ */
if (!intel_dp_is_edp(intel_dp)) { if (!intel_dp_is_edp(intel_dp)) {
int ret;
ret = intel_dp_retrain_link(encoder, ctx); ret = intel_dp_retrain_link(encoder, ctx);
if (ret) if (ret)
return ret; return ret;
...@@ -5938,6 +5946,8 @@ void intel_dp_encoder_flush_work(struct drm_encoder *encoder) ...@@ -5938,6 +5946,8 @@ void intel_dp_encoder_flush_work(struct drm_encoder *encoder)
intel_dp_mst_encoder_cleanup(dig_port); intel_dp_mst_encoder_cleanup(dig_port);
intel_dp_tunnel_destroy(intel_dp);
intel_pps_vdd_off_sync(intel_dp); intel_pps_vdd_off_sync(intel_dp);
/* /*
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment