Commit ba28989d authored by Jani Nikula's avatar Jani Nikula

drm/i915/display: add intel_encoder_is_*() and _to_*() functions

Add a number of encoder based functions to check if the port/phy of the
encoder is of a certain type, or to convert to phy or tc_port. Initially
these are just wrappers around the existing functions, but they can be
improved to use VBT data or use some cached info in the future.
Reviewed-by: default avatarVille Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/7b2d350ee42883f2784030c649d16f983bd407bd.1710949619.git.jani.nikula@intel.comSigned-off-by: default avatarJani Nikula <jani.nikula@intel.com>
parent 0a099232
...@@ -29,6 +29,7 @@ ...@@ -29,6 +29,7 @@
#define INTEL_CX0_LANE1 BIT(1) #define INTEL_CX0_LANE1 BIT(1)
#define INTEL_CX0_BOTH_LANES (INTEL_CX0_LANE1 | INTEL_CX0_LANE0) #define INTEL_CX0_BOTH_LANES (INTEL_CX0_LANE1 | INTEL_CX0_LANE0)
/* Prefer intel_encoder_is_c10phy() */
bool intel_is_c10phy(struct drm_i915_private *i915, enum phy phy) bool intel_is_c10phy(struct drm_i915_private *i915, enum phy phy)
{ {
if ((IS_LUNARLAKE(i915) || IS_METEORLAKE(i915)) && phy < PHY_C) if ((IS_LUNARLAKE(i915) || IS_METEORLAKE(i915)) && phy < PHY_C)
...@@ -37,6 +38,14 @@ bool intel_is_c10phy(struct drm_i915_private *i915, enum phy phy) ...@@ -37,6 +38,14 @@ bool intel_is_c10phy(struct drm_i915_private *i915, enum phy phy)
return false; return false;
} }
bool intel_encoder_is_c10phy(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
enum phy phy = intel_encoder_to_phy(encoder);
return intel_is_c10phy(i915, phy);
}
static int lane_mask_to_lane(u8 lane_mask) static int lane_mask_to_lane(u8 lane_mask)
{ {
if (WARN_ON((lane_mask & ~INTEL_CX0_BOTH_LANES) || if (WARN_ON((lane_mask & ~INTEL_CX0_BOTH_LANES) ||
......
...@@ -23,6 +23,7 @@ struct intel_encoder; ...@@ -23,6 +23,7 @@ struct intel_encoder;
struct intel_hdmi; struct intel_hdmi;
bool intel_is_c10phy(struct drm_i915_private *dev_priv, enum phy phy); bool intel_is_c10phy(struct drm_i915_private *dev_priv, enum phy phy);
bool intel_encoder_is_c10phy(struct intel_encoder *encoder);
void intel_mtl_pll_enable(struct intel_encoder *encoder, void intel_mtl_pll_enable(struct intel_encoder *encoder,
const struct intel_crtc_state *crtc_state); const struct intel_crtc_state *crtc_state);
void intel_mtl_pll_disable(struct intel_encoder *encoder); void intel_mtl_pll_disable(struct intel_encoder *encoder);
......
...@@ -1836,6 +1836,7 @@ static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state) ...@@ -1836,6 +1836,7 @@ static void i9xx_pfit_enable(const struct intel_crtc_state *crtc_state)
intel_de_write(dev_priv, BCLRPAT(crtc->pipe), 0); intel_de_write(dev_priv, BCLRPAT(crtc->pipe), 0);
} }
/* Prefer intel_encoder_is_combo() */
bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy) bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy)
{ {
if (phy == PHY_NONE) if (phy == PHY_NONE)
...@@ -1857,6 +1858,7 @@ bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy) ...@@ -1857,6 +1858,7 @@ bool intel_phy_is_combo(struct drm_i915_private *dev_priv, enum phy phy)
return false; return false;
} }
/* Prefer intel_encoder_is_tc() */
bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy) bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy)
{ {
/* /*
...@@ -1877,6 +1879,7 @@ bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy) ...@@ -1877,6 +1879,7 @@ bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy)
return false; return false;
} }
/* Prefer intel_encoder_is_snps() */
bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy) bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy)
{ {
/* /*
...@@ -1886,6 +1889,7 @@ bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy) ...@@ -1886,6 +1889,7 @@ bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy)
return IS_DG2(dev_priv) && phy > PHY_NONE && phy <= PHY_E; return IS_DG2(dev_priv) && phy > PHY_NONE && phy <= PHY_E;
} }
/* Prefer intel_encoder_to_phy() */
enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port) enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port)
{ {
if (DISPLAY_VER(i915) >= 13 && port >= PORT_D_XELPD) if (DISPLAY_VER(i915) >= 13 && port >= PORT_D_XELPD)
...@@ -1903,6 +1907,7 @@ enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port) ...@@ -1903,6 +1907,7 @@ enum phy intel_port_to_phy(struct drm_i915_private *i915, enum port port)
return PHY_A + port - PORT_A; return PHY_A + port - PORT_A;
} }
/* Prefer intel_encoder_to_tc() */
enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port) enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port)
{ {
if (!intel_phy_is_tc(dev_priv, intel_port_to_phy(dev_priv, port))) if (!intel_phy_is_tc(dev_priv, intel_port_to_phy(dev_priv, port)))
...@@ -1914,6 +1919,41 @@ enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port) ...@@ -1914,6 +1919,41 @@ enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum port port)
return TC_PORT_1 + port - PORT_C; return TC_PORT_1 + port - PORT_C;
} }
enum phy intel_encoder_to_phy(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
return intel_port_to_phy(i915, encoder->port);
}
bool intel_encoder_is_combo(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
return intel_phy_is_combo(i915, intel_encoder_to_phy(encoder));
}
bool intel_encoder_is_snps(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
return intel_phy_is_snps(i915, intel_encoder_to_phy(encoder));
}
bool intel_encoder_is_tc(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
return intel_phy_is_tc(i915, intel_encoder_to_phy(encoder));
}
enum tc_port intel_encoder_to_tc(struct intel_encoder *encoder)
{
struct drm_i915_private *i915 = to_i915(encoder->base.dev);
return intel_port_to_tc(i915, encoder->port);
}
enum intel_display_power_domain enum intel_display_power_domain
intel_aux_power_domain(struct intel_digital_port *dig_port) intel_aux_power_domain(struct intel_digital_port *dig_port)
{ {
......
...@@ -448,6 +448,13 @@ bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy); ...@@ -448,6 +448,13 @@ bool intel_phy_is_tc(struct drm_i915_private *dev_priv, enum phy phy);
bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy); bool intel_phy_is_snps(struct drm_i915_private *dev_priv, enum phy phy);
enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv, enum tc_port intel_port_to_tc(struct drm_i915_private *dev_priv,
enum port port); enum port port);
enum phy intel_encoder_to_phy(struct intel_encoder *encoder);
bool intel_encoder_is_combo(struct intel_encoder *encoder);
bool intel_encoder_is_snps(struct intel_encoder *encoder);
bool intel_encoder_is_tc(struct intel_encoder *encoder);
enum tc_port intel_encoder_to_tc(struct intel_encoder *encoder);
int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data, int intel_get_pipe_from_crtc_id_ioctl(struct drm_device *dev, void *data,
struct drm_file *file_priv); struct drm_file *file_priv);
......
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