aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm/i915/intel_ddi.c
diff options
context:
space:
mode:
authorPaulo Zanoni <paulo.r.zanoni@intel.com>2012-10-24 14:06:19 -0400
committerDaniel Vetter <daniel.vetter@ffwll.ch>2012-10-26 04:24:46 -0400
commitad80a810ec3ffa96450ce3b40128d55fede7a825 (patch)
tree03f6f55c6d35782fe21607f966d5a94bf196af71 /drivers/gpu/drm/i915/intel_ddi.c
parentbb523fc08d4a4a726c7555be7800735685888b3c (diff)
drm/i915: convert DDI_FUNC_CTL to transcoder
Because there's one instance of the register per CPU transcoder and not per CPU pipe. This is another register that appeared for the first time on Haswell, and even though its Haswell name is PIPE_DDI_FUNC_CTL, it will be renamed to TRANS_DDI_FUNC_CTL, so let's just use the new naming scheme before it confuses more people. Notice that there's a big improvement on intel_ddi_get_hw_state due to the new TRANSCODER_EDP. V2: Also rename the register to TRANS_DDI_FUNC_CTL as suggested by Damien Lespiau. Signed-off-by: Paulo Zanoni <paulo.r.zanoni@intel.com> Reviewed-by: Damien Lespiau <damien.lespiau@intel.com> Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'drivers/gpu/drm/i915/intel_ddi.c')
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c101
1 files changed, 64 insertions, 37 deletions
diff --git a/drivers/gpu/drm/i915/intel_ddi.c b/drivers/gpu/drm/i915/intel_ddi.c
index f568862aca57..4b5366b9b04d 100644
--- a/drivers/gpu/drm/i915/intel_ddi.c
+++ b/drivers/gpu/drm/i915/intel_ddi.c
@@ -924,68 +924,69 @@ void intel_ddi_enable_pipe_func(struct drm_crtc *crtc)
924 struct drm_encoder *encoder = &intel_encoder->base; 924 struct drm_encoder *encoder = &intel_encoder->base;
925 struct drm_i915_private *dev_priv = crtc->dev->dev_private; 925 struct drm_i915_private *dev_priv = crtc->dev->dev_private;
926 enum pipe pipe = intel_crtc->pipe; 926 enum pipe pipe = intel_crtc->pipe;
927 enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
927 int type = intel_encoder->type; 928 int type = intel_encoder->type;
928 uint32_t temp; 929 uint32_t temp;
929 930
930 /* Enable PIPE_DDI_FUNC_CTL for the pipe to work in HDMI mode */ 931 /* Enable TRANS_DDI_FUNC_CTL for the pipe to work in HDMI mode */
931 temp = PIPE_DDI_FUNC_ENABLE; 932 temp = TRANS_DDI_FUNC_ENABLE;
932 933
933 switch (intel_crtc->bpp) { 934 switch (intel_crtc->bpp) {
934 case 18: 935 case 18:
935 temp |= PIPE_DDI_BPC_6; 936 temp |= TRANS_DDI_BPC_6;
936 break; 937 break;
937 case 24: 938 case 24:
938 temp |= PIPE_DDI_BPC_8; 939 temp |= TRANS_DDI_BPC_8;
939 break; 940 break;
940 case 30: 941 case 30:
941 temp |= PIPE_DDI_BPC_10; 942 temp |= TRANS_DDI_BPC_10;
942 break; 943 break;
943 case 36: 944 case 36:
944 temp |= PIPE_DDI_BPC_12; 945 temp |= TRANS_DDI_BPC_12;
945 break; 946 break;
946 default: 947 default:
947 WARN(1, "%d bpp unsupported by pipe DDI function\n", 948 WARN(1, "%d bpp unsupported by transcoder DDI function\n",
948 intel_crtc->bpp); 949 intel_crtc->bpp);
949 } 950 }
950 951
951 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC) 952 if (crtc->mode.flags & DRM_MODE_FLAG_PVSYNC)
952 temp |= PIPE_DDI_PVSYNC; 953 temp |= TRANS_DDI_PVSYNC;
953 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC) 954 if (crtc->mode.flags & DRM_MODE_FLAG_PHSYNC)
954 temp |= PIPE_DDI_PHSYNC; 955 temp |= TRANS_DDI_PHSYNC;
955 956
956 if (type == INTEL_OUTPUT_HDMI) { 957 if (type == INTEL_OUTPUT_HDMI) {
957 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder); 958 struct intel_hdmi *intel_hdmi = enc_to_intel_hdmi(encoder);
958 959
959 if (intel_hdmi->has_hdmi_sink) 960 if (intel_hdmi->has_hdmi_sink)
960 temp |= PIPE_DDI_MODE_SELECT_HDMI; 961 temp |= TRANS_DDI_MODE_SELECT_HDMI;
961 else 962 else
962 temp |= PIPE_DDI_MODE_SELECT_DVI; 963 temp |= TRANS_DDI_MODE_SELECT_DVI;
963 964
964 temp |= PIPE_DDI_SELECT_PORT(intel_hdmi->ddi_port); 965 temp |= TRANS_DDI_SELECT_PORT(intel_hdmi->ddi_port);
965 966
966 } else if (type == INTEL_OUTPUT_ANALOG) { 967 } else if (type == INTEL_OUTPUT_ANALOG) {
967 temp |= PIPE_DDI_MODE_SELECT_FDI; 968 temp |= TRANS_DDI_MODE_SELECT_FDI;
968 temp |= PIPE_DDI_SELECT_PORT(PORT_E); 969 temp |= TRANS_DDI_SELECT_PORT(PORT_E);
969 970
970 } else if (type == INTEL_OUTPUT_DISPLAYPORT || 971 } else if (type == INTEL_OUTPUT_DISPLAYPORT ||
971 type == INTEL_OUTPUT_EDP) { 972 type == INTEL_OUTPUT_EDP) {
972 struct intel_dp *intel_dp = enc_to_intel_dp(encoder); 973 struct intel_dp *intel_dp = enc_to_intel_dp(encoder);
973 974
974 temp |= PIPE_DDI_MODE_SELECT_DP_SST; 975 temp |= TRANS_DDI_MODE_SELECT_DP_SST;
975 temp |= PIPE_DDI_SELECT_PORT(intel_dp->port); 976 temp |= TRANS_DDI_SELECT_PORT(intel_dp->port);
976 977
977 switch (intel_dp->lane_count) { 978 switch (intel_dp->lane_count) {
978 case 1: 979 case 1:
979 temp |= PIPE_DDI_PORT_WIDTH_X1; 980 temp |= TRANS_DDI_PORT_WIDTH_X1;
980 break; 981 break;
981 case 2: 982 case 2:
982 temp |= PIPE_DDI_PORT_WIDTH_X2; 983 temp |= TRANS_DDI_PORT_WIDTH_X2;
983 break; 984 break;
984 case 4: 985 case 4:
985 temp |= PIPE_DDI_PORT_WIDTH_X4; 986 temp |= TRANS_DDI_PORT_WIDTH_X4;
986 break; 987 break;
987 default: 988 default:
988 temp |= PIPE_DDI_PORT_WIDTH_X4; 989 temp |= TRANS_DDI_PORT_WIDTH_X4;
989 WARN(1, "Unsupported lane count %d\n", 990 WARN(1, "Unsupported lane count %d\n",
990 intel_dp->lane_count); 991 intel_dp->lane_count);
991 } 992 }
@@ -995,17 +996,17 @@ void intel_ddi_enable_pipe_func(struct drm_crtc *crtc)
995 intel_encoder->type, pipe); 996 intel_encoder->type, pipe);
996 } 997 }
997 998
998 I915_WRITE(DDI_FUNC_CTL(pipe), temp); 999 I915_WRITE(TRANS_DDI_FUNC_CTL(cpu_transcoder), temp);
999} 1000}
1000 1001
1001void intel_ddi_disable_pipe_func(struct drm_i915_private *dev_priv, 1002void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
1002 enum pipe pipe) 1003 enum transcoder cpu_transcoder)
1003{ 1004{
1004 uint32_t reg = DDI_FUNC_CTL(pipe); 1005 uint32_t reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
1005 uint32_t val = I915_READ(reg); 1006 uint32_t val = I915_READ(reg);
1006 1007
1007 val &= ~(PIPE_DDI_FUNC_ENABLE | PIPE_DDI_PORT_MASK); 1008 val &= ~(TRANS_DDI_FUNC_ENABLE | TRANS_DDI_PORT_MASK);
1008 val |= PIPE_DDI_PORT_NONE; 1009 val |= TRANS_DDI_PORT_NONE;
1009 I915_WRITE(reg, val); 1010 I915_WRITE(reg, val);
1010} 1011}
1011 1012
@@ -1023,13 +1024,32 @@ bool intel_ddi_get_hw_state(struct intel_encoder *encoder,
1023 if (!(tmp & DDI_BUF_CTL_ENABLE)) 1024 if (!(tmp & DDI_BUF_CTL_ENABLE))
1024 return false; 1025 return false;
1025 1026
1026 for_each_pipe(i) { 1027 if (port == PORT_A) {
1027 tmp = I915_READ(DDI_FUNC_CTL(i)); 1028 tmp = I915_READ(TRANS_DDI_FUNC_CTL(TRANSCODER_EDP));
1028 1029
1029 if ((tmp & PIPE_DDI_PORT_MASK) 1030 switch (tmp & TRANS_DDI_EDP_INPUT_MASK) {
1030 == PIPE_DDI_SELECT_PORT(port)) { 1031 case TRANS_DDI_EDP_INPUT_A_ON:
1031 *pipe = i; 1032 case TRANS_DDI_EDP_INPUT_A_ONOFF:
1032 return true; 1033 *pipe = PIPE_A;
1034 break;
1035 case TRANS_DDI_EDP_INPUT_B_ONOFF:
1036 *pipe = PIPE_B;
1037 break;
1038 case TRANS_DDI_EDP_INPUT_C_ONOFF:
1039 *pipe = PIPE_C;
1040 break;
1041 }
1042
1043 return true;
1044 } else {
1045 for (i = TRANSCODER_A; i <= TRANSCODER_C; i++) {
1046 tmp = I915_READ(TRANS_DDI_FUNC_CTL(i));
1047
1048 if ((tmp & TRANS_DDI_PORT_MASK)
1049 == TRANS_DDI_SELECT_PORT(port)) {
1050 *pipe = i;
1051 return true;
1052 }
1033 } 1053 }
1034 } 1054 }
1035 1055
@@ -1043,13 +1063,20 @@ static uint32_t intel_ddi_get_crtc_pll(struct drm_i915_private *dev_priv,
1043{ 1063{
1044 uint32_t temp, ret; 1064 uint32_t temp, ret;
1045 enum port port; 1065 enum port port;
1066 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
1067 pipe);
1046 int i; 1068 int i;
1047 1069
1048 temp = I915_READ(DDI_FUNC_CTL(pipe)); 1070 if (cpu_transcoder == TRANSCODER_EDP) {
1049 temp &= PIPE_DDI_PORT_MASK; 1071 port = PORT_A;
1050 for (i = PORT_A; i <= PORT_E; i++) 1072 } else {
1051 if (temp == PIPE_DDI_SELECT_PORT(i)) 1073 temp = I915_READ(TRANS_DDI_FUNC_CTL(cpu_transcoder));
1052 port = i; 1074 temp &= TRANS_DDI_PORT_MASK;
1075
1076 for (i = PORT_B; i <= PORT_E; i++)
1077 if (temp == TRANS_DDI_SELECT_PORT(i))
1078 port = i;
1079 }
1053 1080
1054 ret = I915_READ(PORT_CLK_SEL(port)); 1081 ret = I915_READ(PORT_CLK_SEL(port));
1055 1082