drm/i915/tc: Move the intel_tc_port struct declaration to intel_tc.c
authorImre Deak <imre.deak@intel.com>
Thu, 23 Mar 2023 14:20:13 +0000 (16:20 +0200)
committerImre Deak <imre.deak@intel.com>
Mon, 3 Apr 2023 08:35:30 +0000 (11:35 +0300)
Move the intel_tc_port struct to intel_tc.c for better isolation. This
requires allocating the struct dynamically.

Reviewed-by: Mika Kahola <mika.kahola@intel.com>
Signed-off-by: Imre Deak <imre.deak@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20230323142035.1432621-8-imre.deak@intel.com
drivers/gpu/drm/i915/display/intel_ddi.c
drivers/gpu/drm/i915/display/intel_display_types.h
drivers/gpu/drm/i915/display/intel_tc.c
drivers/gpu/drm/i915/display/intel_tc.h

index 73240cf..dac3ec8 100644 (file)
@@ -3843,7 +3843,7 @@ static void intel_ddi_encoder_destroy(struct drm_encoder *encoder)
 
        intel_dp_encoder_flush_work(encoder);
        if (intel_phy_is_tc(i915, phy))
-               intel_tc_port_flush_work(dig_port);
+               intel_tc_port_cleanup(dig_port);
        intel_display_power_flush_work(i915);
 
        drm_encoder_cleanup(encoder);
@@ -4284,7 +4284,7 @@ static void intel_ddi_encoder_shutdown(struct intel_encoder *encoder)
        if (!intel_phy_is_tc(i915, phy))
                return;
 
-       intel_tc_port_flush_work(dig_port);
+       intel_tc_port_cleanup(dig_port);
 }
 
 #define port_tc_name(port) ((port) - PORT_TC1 + '1')
@@ -4541,7 +4541,8 @@ void intel_ddi_init(struct drm_i915_private *dev_priv, enum port port)
                                    is_legacy ? "legacy" : "non-legacy");
                }
 
-               intel_tc_port_init(dig_port, is_legacy);
+               if (intel_tc_port_init(dig_port, is_legacy) < 0)
+                       goto err;
 
                encoder->update_prepare = intel_ddi_update_prepare;
                encoder->update_complete = intel_ddi_update_complete;
index 3dfc8eb..a3ea929 100644 (file)
 #include "intel_display_power.h"
 #include "intel_dpll_mgr.h"
 #include "intel_wm_types.h"
-#include "intel_tc.h"
 
 struct drm_printer;
 struct __intel_global_objs_state;
 struct intel_ddi_buf_trans;
 struct intel_fbc;
 struct intel_connector;
+struct intel_tc_port;
 
 /*
  * Display related stuff
@@ -1783,7 +1783,7 @@ struct intel_digital_port {
        intel_wakeref_t ddi_io_wakeref;
        intel_wakeref_t aux_wakeref;
 
-       struct intel_tc_port tc;
+       struct intel_tc_port *tc;
 
        /* protects num_hdcp_streams reference count, hdcp_port_data and hdcp_auth_status */
        struct mutex hdcp_mutex;
index 4995c63..f43e48c 100644 (file)
 #include "intel_mg_phy_regs.h"
 #include "intel_tc.h"
 
+enum tc_port_mode {
+       TC_PORT_DISCONNECTED,
+       TC_PORT_TBT_ALT,
+       TC_PORT_DP_ALT,
+       TC_PORT_LEGACY,
+};
+
+struct intel_tc_port {
+       struct intel_digital_port *dig_port;
+       struct mutex lock;      /* protects the TypeC port mode */
+       intel_wakeref_t lock_wakeref;
+       enum intel_display_power_domain lock_power_domain;
+       struct delayed_work disconnect_phy_work;
+       int link_refcount;
+       bool legacy_port:1;
+       char port_name[8];
+       enum tc_port_mode mode;
+       enum tc_port_mode init_mode;
+       enum phy_fia phy_fia;
+       u8 phy_fia_idx;
+};
+
 static u32 tc_phy_hpd_live_status(struct intel_tc_port *tc);
 static bool tc_phy_is_ready(struct intel_tc_port *tc);
 static bool tc_phy_take_ownership(struct intel_tc_port *tc, bool take);
@@ -36,7 +58,7 @@ static const char *tc_port_mode_name(enum tc_port_mode mode)
 
 static struct intel_tc_port *to_tc_port(struct intel_digital_port *dig_port)
 {
-       return &dig_port->tc;
+       return dig_port->tc;
 }
 
 static struct drm_i915_private *tc_to_i915(struct intel_tc_port *tc)
@@ -1158,16 +1180,21 @@ tc_port_load_fia_params(struct drm_i915_private *i915, struct intel_tc_port *tc)
        }
 }
 
-void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
+int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
 {
        struct drm_i915_private *i915 = to_i915(dig_port->base.base.dev);
-       struct intel_tc_port *tc = to_tc_port(dig_port);
+       struct intel_tc_port *tc;
        enum port port = dig_port->base.port;
        enum tc_port tc_port = intel_port_to_tc(i915, port);
 
        if (drm_WARN_ON(&i915->drm, tc_port == TC_PORT_NONE))
-               return;
+               return -EINVAL;
+
+       tc = kzalloc(sizeof(*tc), GFP_KERNEL);
+       if (!tc)
+               return -ENOMEM;
 
+       dig_port->tc = tc;
        tc->dig_port = dig_port;
 
        snprintf(tc->port_name, sizeof(tc->port_name),
@@ -1181,4 +1208,14 @@ void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy)
        tc_port_load_fia_params(i915, tc);
 
        intel_tc_port_init_mode(dig_port);
+
+       return 0;
+}
+
+void intel_tc_port_cleanup(struct intel_digital_port *dig_port)
+{
+       intel_tc_port_flush_work(dig_port);
+
+       kfree(dig_port->tc);
+       dig_port->tc = NULL;
 }
index cc3a7fd..dd0810f 100644 (file)
@@ -6,39 +6,12 @@
 #ifndef __INTEL_TC_H__
 #define __INTEL_TC_H__
 
-#include <linux/mutex.h>
 #include <linux/types.h>
 
-#include "intel_display.h"
-#include "intel_display_power.h"
-#include "intel_wakeref.h"
-
 struct intel_crtc_state;
 struct intel_digital_port;
 struct intel_encoder;
 
-enum tc_port_mode {
-       TC_PORT_DISCONNECTED,
-       TC_PORT_TBT_ALT,
-       TC_PORT_DP_ALT,
-       TC_PORT_LEGACY,
-};
-
-struct intel_tc_port {
-       struct intel_digital_port *dig_port;
-       struct mutex lock;      /* protects the TypeC port mode */
-       intel_wakeref_t lock_wakeref;
-       enum intel_display_power_domain lock_power_domain;
-       struct delayed_work disconnect_phy_work;
-       int link_refcount;
-       bool legacy_port:1;
-       char port_name[8];
-       enum tc_port_mode mode;
-       enum tc_port_mode init_mode;
-       enum phy_fia phy_fia;
-       u8 phy_fia_idx;
-};
-
 bool intel_tc_port_in_tbt_alt_mode(struct intel_digital_port *dig_port);
 bool intel_tc_port_in_dp_alt_mode(struct intel_digital_port *dig_port);
 bool intel_tc_port_in_legacy_mode(struct intel_digital_port *dig_port);
@@ -63,7 +36,8 @@ void intel_tc_port_get_link(struct intel_digital_port *dig_port,
 void intel_tc_port_put_link(struct intel_digital_port *dig_port);
 bool intel_tc_port_ref_held(struct intel_digital_port *dig_port);
 
-void intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy);
+int intel_tc_port_init(struct intel_digital_port *dig_port, bool is_legacy);
+void intel_tc_port_cleanup(struct intel_digital_port *dig_port);
 
 bool intel_tc_cold_requires_aux_pw(struct intel_digital_port *dig_port);