diff options
author | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2017-10-31 16:51:18 -0400 |
---|---|---|
committer | Ville Syrjälä <ville.syrjala@linux.intel.com> | 2017-11-09 13:05:01 -0500 |
commit | 2e1029c672c252ad5f34c0bcd0ebacf4a6412cd0 (patch) | |
tree | 493bca3a07d809e9b6b23bf7bcbbc014d7dd1a43 /drivers/gpu/drm/i915/intel_dpio_phy.c | |
parent | a7f519ba706b3be9280c063e7e231da138c202de (diff) |
drm/i915: Pass crtc state to DPIO PHY functions
Rather than digging through encoder->crtc and crtc->config in the
DPIO PHY functions, pass down the correct crtc state from the caller.
Signed-off-by: Ville Syrjälä <ville.syrjala@linux.intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20171031205123.13123-6-ville.syrjala@linux.intel.com
Acked-by: Jani Nikula <jani.nikula@intel.com>
Reviewed-by: Dhinakaran Pandiyan <dhinakaran.pandiyan@intel.com>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_dpio_phy.c')
-rw-r--r-- | drivers/gpu/drm/i915/intel_dpio_phy.c | 87 |
1 files changed, 43 insertions, 44 deletions
diff --git a/drivers/gpu/drm/i915/intel_dpio_phy.c b/drivers/gpu/drm/i915/intel_dpio_phy.c index 490a42d9a3e8..5958d3d8b90e 100644 --- a/drivers/gpu/drm/i915/intel_dpio_phy.c +++ b/drivers/gpu/drm/i915/intel_dpio_phy.c | |||
@@ -733,11 +733,12 @@ void chv_set_phy_signal_level(struct intel_encoder *encoder, | |||
733 | } | 733 | } |
734 | 734 | ||
735 | void chv_data_lane_soft_reset(struct intel_encoder *encoder, | 735 | void chv_data_lane_soft_reset(struct intel_encoder *encoder, |
736 | const struct intel_crtc_state *crtc_state, | ||
736 | bool reset) | 737 | bool reset) |
737 | { | 738 | { |
738 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | 739 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
739 | enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base)); | 740 | enum dpio_channel ch = vlv_dport_to_channel(enc_to_dig_port(&encoder->base)); |
740 | struct intel_crtc *crtc = to_intel_crtc(encoder->base.crtc); | 741 | struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); |
741 | enum pipe pipe = crtc->pipe; | 742 | enum pipe pipe = crtc->pipe; |
742 | uint32_t val; | 743 | uint32_t val; |
743 | 744 | ||
@@ -776,17 +777,16 @@ void chv_data_lane_soft_reset(struct intel_encoder *encoder, | |||
776 | } | 777 | } |
777 | } | 778 | } |
778 | 779 | ||
779 | void chv_phy_pre_pll_enable(struct intel_encoder *encoder) | 780 | void chv_phy_pre_pll_enable(struct intel_encoder *encoder, |
781 | const struct intel_crtc_state *crtc_state) | ||
780 | { | 782 | { |
781 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 783 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
782 | struct drm_device *dev = encoder->base.dev; | 784 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
783 | struct drm_i915_private *dev_priv = to_i915(dev); | 785 | struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); |
784 | struct intel_crtc *intel_crtc = | ||
785 | to_intel_crtc(encoder->base.crtc); | ||
786 | enum dpio_channel ch = vlv_dport_to_channel(dport); | 786 | enum dpio_channel ch = vlv_dport_to_channel(dport); |
787 | enum pipe pipe = intel_crtc->pipe; | 787 | enum pipe pipe = crtc->pipe; |
788 | unsigned int lane_mask = | 788 | unsigned int lane_mask = |
789 | intel_dp_unused_lane_mask(intel_crtc->config->lane_count); | 789 | intel_dp_unused_lane_mask(crtc_state->lane_count); |
790 | u32 val; | 790 | u32 val; |
791 | 791 | ||
792 | /* | 792 | /* |
@@ -802,7 +802,7 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder) | |||
802 | mutex_lock(&dev_priv->sb_lock); | 802 | mutex_lock(&dev_priv->sb_lock); |
803 | 803 | ||
804 | /* Assert data lane reset */ | 804 | /* Assert data lane reset */ |
805 | chv_data_lane_soft_reset(encoder, true); | 805 | chv_data_lane_soft_reset(encoder, crtc_state, true); |
806 | 806 | ||
807 | /* program left/right clock distribution */ | 807 | /* program left/right clock distribution */ |
808 | if (pipe != PIPE_B) { | 808 | if (pipe != PIPE_B) { |
@@ -832,7 +832,7 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder) | |||
832 | val |= CHV_PCS_USEDCLKCHANNEL; | 832 | val |= CHV_PCS_USEDCLKCHANNEL; |
833 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val); | 833 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW8(ch), val); |
834 | 834 | ||
835 | if (intel_crtc->config->lane_count > 2) { | 835 | if (crtc_state->lane_count > 2) { |
836 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch)); | 836 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW8(ch)); |
837 | val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE; | 837 | val |= CHV_PCS_USEDCLKCHANNEL_OVRRIDE; |
838 | if (pipe != PIPE_B) | 838 | if (pipe != PIPE_B) |
@@ -857,16 +857,15 @@ void chv_phy_pre_pll_enable(struct intel_encoder *encoder) | |||
857 | mutex_unlock(&dev_priv->sb_lock); | 857 | mutex_unlock(&dev_priv->sb_lock); |
858 | } | 858 | } |
859 | 859 | ||
860 | void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) | 860 | void chv_phy_pre_encoder_enable(struct intel_encoder *encoder, |
861 | const struct intel_crtc_state *crtc_state) | ||
861 | { | 862 | { |
862 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 863 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
863 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); | 864 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); |
864 | struct drm_device *dev = encoder->base.dev; | 865 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
865 | struct drm_i915_private *dev_priv = to_i915(dev); | 866 | struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); |
866 | struct intel_crtc *intel_crtc = | ||
867 | to_intel_crtc(encoder->base.crtc); | ||
868 | enum dpio_channel ch = vlv_dport_to_channel(dport); | 867 | enum dpio_channel ch = vlv_dport_to_channel(dport); |
869 | int pipe = intel_crtc->pipe; | 868 | enum pipe pipe = crtc->pipe; |
870 | int data, i, stagger; | 869 | int data, i, stagger; |
871 | u32 val; | 870 | u32 val; |
872 | 871 | ||
@@ -877,16 +876,16 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) | |||
877 | val &= ~DPIO_LANEDESKEW_STRAP_OVRD; | 876 | val &= ~DPIO_LANEDESKEW_STRAP_OVRD; |
878 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); | 877 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); |
879 | 878 | ||
880 | if (intel_crtc->config->lane_count > 2) { | 879 | if (crtc_state->lane_count > 2) { |
881 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); | 880 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); |
882 | val &= ~DPIO_LANEDESKEW_STRAP_OVRD; | 881 | val &= ~DPIO_LANEDESKEW_STRAP_OVRD; |
883 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); | 882 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); |
884 | } | 883 | } |
885 | 884 | ||
886 | /* Program Tx lane latency optimal setting*/ | 885 | /* Program Tx lane latency optimal setting*/ |
887 | for (i = 0; i < intel_crtc->config->lane_count; i++) { | 886 | for (i = 0; i < crtc_state->lane_count; i++) { |
888 | /* Set the upar bit */ | 887 | /* Set the upar bit */ |
889 | if (intel_crtc->config->lane_count == 1) | 888 | if (crtc_state->lane_count == 1) |
890 | data = 0x0; | 889 | data = 0x0; |
891 | else | 890 | else |
892 | data = (i == 1) ? 0x0 : 0x1; | 891 | data = (i == 1) ? 0x0 : 0x1; |
@@ -895,13 +894,13 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) | |||
895 | } | 894 | } |
896 | 895 | ||
897 | /* Data lane stagger programming */ | 896 | /* Data lane stagger programming */ |
898 | if (intel_crtc->config->port_clock > 270000) | 897 | if (crtc_state->port_clock > 270000) |
899 | stagger = 0x18; | 898 | stagger = 0x18; |
900 | else if (intel_crtc->config->port_clock > 135000) | 899 | else if (crtc_state->port_clock > 135000) |
901 | stagger = 0xd; | 900 | stagger = 0xd; |
902 | else if (intel_crtc->config->port_clock > 67500) | 901 | else if (crtc_state->port_clock > 67500) |
903 | stagger = 0x7; | 902 | stagger = 0x7; |
904 | else if (intel_crtc->config->port_clock > 33750) | 903 | else if (crtc_state->port_clock > 33750) |
905 | stagger = 0x4; | 904 | stagger = 0x4; |
906 | else | 905 | else |
907 | stagger = 0x2; | 906 | stagger = 0x2; |
@@ -910,7 +909,7 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) | |||
910 | val |= DPIO_TX2_STAGGER_MASK(0x1f); | 909 | val |= DPIO_TX2_STAGGER_MASK(0x1f); |
911 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); | 910 | vlv_dpio_write(dev_priv, pipe, VLV_PCS01_DW11(ch), val); |
912 | 911 | ||
913 | if (intel_crtc->config->lane_count > 2) { | 912 | if (crtc_state->lane_count > 2) { |
914 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); | 913 | val = vlv_dpio_read(dev_priv, pipe, VLV_PCS23_DW11(ch)); |
915 | val |= DPIO_TX2_STAGGER_MASK(0x1f); | 914 | val |= DPIO_TX2_STAGGER_MASK(0x1f); |
916 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); | 915 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW11(ch), val); |
@@ -923,7 +922,7 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) | |||
923 | DPIO_TX1_STAGGER_MULT(6) | | 922 | DPIO_TX1_STAGGER_MULT(6) | |
924 | DPIO_TX2_STAGGER_MULT(0)); | 923 | DPIO_TX2_STAGGER_MULT(0)); |
925 | 924 | ||
926 | if (intel_crtc->config->lane_count > 2) { | 925 | if (crtc_state->lane_count > 2) { |
927 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch), | 926 | vlv_dpio_write(dev_priv, pipe, VLV_PCS23_DW12(ch), |
928 | DPIO_LANESTAGGER_STRAP(stagger) | | 927 | DPIO_LANESTAGGER_STRAP(stagger) | |
929 | DPIO_LANESTAGGER_STRAP_OVRD | | 928 | DPIO_LANESTAGGER_STRAP_OVRD | |
@@ -933,7 +932,7 @@ void chv_phy_pre_encoder_enable(struct intel_encoder *encoder) | |||
933 | } | 932 | } |
934 | 933 | ||
935 | /* Deassert data lane reset */ | 934 | /* Deassert data lane reset */ |
936 | chv_data_lane_soft_reset(encoder, false); | 935 | chv_data_lane_soft_reset(encoder, crtc_state, false); |
937 | 936 | ||
938 | mutex_unlock(&dev_priv->sb_lock); | 937 | mutex_unlock(&dev_priv->sb_lock); |
939 | } | 938 | } |
@@ -949,10 +948,11 @@ void chv_phy_release_cl2_override(struct intel_encoder *encoder) | |||
949 | } | 948 | } |
950 | } | 949 | } |
951 | 950 | ||
952 | void chv_phy_post_pll_disable(struct intel_encoder *encoder) | 951 | void chv_phy_post_pll_disable(struct intel_encoder *encoder, |
952 | const struct intel_crtc_state *old_crtc_state) | ||
953 | { | 953 | { |
954 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | 954 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
955 | enum pipe pipe = to_intel_crtc(encoder->base.crtc)->pipe; | 955 | enum pipe pipe = to_intel_crtc(old_crtc_state->base.crtc)->pipe; |
956 | u32 val; | 956 | u32 val; |
957 | 957 | ||
958 | mutex_lock(&dev_priv->sb_lock); | 958 | mutex_lock(&dev_priv->sb_lock); |
@@ -990,7 +990,7 @@ void vlv_set_phy_signal_level(struct intel_encoder *encoder, | |||
990 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); | 990 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); |
991 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 991 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
992 | enum dpio_channel port = vlv_dport_to_channel(dport); | 992 | enum dpio_channel port = vlv_dport_to_channel(dport); |
993 | int pipe = intel_crtc->pipe; | 993 | enum pipe pipe = intel_crtc->pipe; |
994 | 994 | ||
995 | mutex_lock(&dev_priv->sb_lock); | 995 | mutex_lock(&dev_priv->sb_lock); |
996 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000); | 996 | vlv_dpio_write(dev_priv, pipe, VLV_TX_DW5(port), 0x00000000); |
@@ -1008,15 +1008,14 @@ void vlv_set_phy_signal_level(struct intel_encoder *encoder, | |||
1008 | mutex_unlock(&dev_priv->sb_lock); | 1008 | mutex_unlock(&dev_priv->sb_lock); |
1009 | } | 1009 | } |
1010 | 1010 | ||
1011 | void vlv_phy_pre_pll_enable(struct intel_encoder *encoder) | 1011 | void vlv_phy_pre_pll_enable(struct intel_encoder *encoder, |
1012 | const struct intel_crtc_state *crtc_state) | ||
1012 | { | 1013 | { |
1013 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 1014 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
1014 | struct drm_device *dev = encoder->base.dev; | 1015 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
1015 | struct drm_i915_private *dev_priv = to_i915(dev); | 1016 | struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); |
1016 | struct intel_crtc *intel_crtc = | ||
1017 | to_intel_crtc(encoder->base.crtc); | ||
1018 | enum dpio_channel port = vlv_dport_to_channel(dport); | 1017 | enum dpio_channel port = vlv_dport_to_channel(dport); |
1019 | int pipe = intel_crtc->pipe; | 1018 | enum pipe pipe = crtc->pipe; |
1020 | 1019 | ||
1021 | /* Program Tx lane resets to default */ | 1020 | /* Program Tx lane resets to default */ |
1022 | mutex_lock(&dev_priv->sb_lock); | 1021 | mutex_lock(&dev_priv->sb_lock); |
@@ -1036,15 +1035,15 @@ void vlv_phy_pre_pll_enable(struct intel_encoder *encoder) | |||
1036 | mutex_unlock(&dev_priv->sb_lock); | 1035 | mutex_unlock(&dev_priv->sb_lock); |
1037 | } | 1036 | } |
1038 | 1037 | ||
1039 | void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder) | 1038 | void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder, |
1039 | const struct intel_crtc_state *crtc_state) | ||
1040 | { | 1040 | { |
1041 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); | 1041 | struct intel_dp *intel_dp = enc_to_intel_dp(&encoder->base); |
1042 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); | 1042 | struct intel_digital_port *dport = dp_to_dig_port(intel_dp); |
1043 | struct drm_device *dev = encoder->base.dev; | 1043 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
1044 | struct drm_i915_private *dev_priv = to_i915(dev); | 1044 | struct intel_crtc *crtc = to_intel_crtc(crtc_state->base.crtc); |
1045 | struct intel_crtc *intel_crtc = to_intel_crtc(encoder->base.crtc); | ||
1046 | enum dpio_channel port = vlv_dport_to_channel(dport); | 1045 | enum dpio_channel port = vlv_dport_to_channel(dport); |
1047 | int pipe = intel_crtc->pipe; | 1046 | enum pipe pipe = crtc->pipe; |
1048 | u32 val; | 1047 | u32 val; |
1049 | 1048 | ||
1050 | mutex_lock(&dev_priv->sb_lock); | 1049 | mutex_lock(&dev_priv->sb_lock); |
@@ -1066,14 +1065,14 @@ void vlv_phy_pre_encoder_enable(struct intel_encoder *encoder) | |||
1066 | mutex_unlock(&dev_priv->sb_lock); | 1065 | mutex_unlock(&dev_priv->sb_lock); |
1067 | } | 1066 | } |
1068 | 1067 | ||
1069 | void vlv_phy_reset_lanes(struct intel_encoder *encoder) | 1068 | void vlv_phy_reset_lanes(struct intel_encoder *encoder, |
1069 | const struct intel_crtc_state *old_crtc_state) | ||
1070 | { | 1070 | { |
1071 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); | 1071 | struct intel_digital_port *dport = enc_to_dig_port(&encoder->base); |
1072 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); | 1072 | struct drm_i915_private *dev_priv = to_i915(encoder->base.dev); |
1073 | struct intel_crtc *intel_crtc = | 1073 | struct intel_crtc *crtc = to_intel_crtc(old_crtc_state->base.crtc); |
1074 | to_intel_crtc(encoder->base.crtc); | ||
1075 | enum dpio_channel port = vlv_dport_to_channel(dport); | 1074 | enum dpio_channel port = vlv_dport_to_channel(dport); |
1076 | int pipe = intel_crtc->pipe; | 1075 | enum pipe pipe = crtc->pipe; |
1077 | 1076 | ||
1078 | mutex_lock(&dev_priv->sb_lock); | 1077 | mutex_lock(&dev_priv->sb_lock); |
1079 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000); | 1078 | vlv_dpio_write(dev_priv, pipe, VLV_PCS_DW0(port), 0x00000000); |