aboutsummaryrefslogtreecommitdiffstats
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
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>
-rw-r--r--drivers/gpu/drm/i915/i915_reg.h59
-rw-r--r--drivers/gpu/drm/i915/intel_ddi.c101
-rw-r--r--drivers/gpu/drm/i915/intel_display.c9
-rw-r--r--drivers/gpu/drm/i915/intel_drv.h4
4 files changed, 104 insertions, 69 deletions
diff --git a/drivers/gpu/drm/i915/i915_reg.h b/drivers/gpu/drm/i915/i915_reg.h
index 99cda88819c7..04705b62d4d0 100644
--- a/drivers/gpu/drm/i915/i915_reg.h
+++ b/drivers/gpu/drm/i915/i915_reg.h
@@ -4399,34 +4399,39 @@
4399#define HSW_PWR_WELL_CTL6 0x45414 4399#define HSW_PWR_WELL_CTL6 0x45414
4400 4400
4401/* Per-pipe DDI Function Control */ 4401/* Per-pipe DDI Function Control */
4402#define PIPE_DDI_FUNC_CTL_A 0x60400 4402#define TRANS_DDI_FUNC_CTL_A 0x60400
4403#define PIPE_DDI_FUNC_CTL_B 0x61400 4403#define TRANS_DDI_FUNC_CTL_B 0x61400
4404#define PIPE_DDI_FUNC_CTL_C 0x62400 4404#define TRANS_DDI_FUNC_CTL_C 0x62400
4405#define PIPE_DDI_FUNC_CTL_EDP 0x6F400 4405#define TRANS_DDI_FUNC_CTL_EDP 0x6F400
4406#define DDI_FUNC_CTL(pipe) _PIPE(pipe, PIPE_DDI_FUNC_CTL_A, \ 4406#define TRANS_DDI_FUNC_CTL(tran) _TRANSCODER(tran, TRANS_DDI_FUNC_CTL_A, \
4407 PIPE_DDI_FUNC_CTL_B) 4407 TRANS_DDI_FUNC_CTL_B)
4408#define PIPE_DDI_FUNC_ENABLE (1<<31) 4408#define TRANS_DDI_FUNC_ENABLE (1<<31)
4409/* Those bits are ignored by pipe EDP since it can only connect to DDI A */ 4409/* Those bits are ignored by pipe EDP since it can only connect to DDI A */
4410#define PIPE_DDI_PORT_MASK (7<<28) 4410#define TRANS_DDI_PORT_MASK (7<<28)
4411#define PIPE_DDI_SELECT_PORT(x) ((x)<<28) 4411#define TRANS_DDI_SELECT_PORT(x) ((x)<<28)
4412#define PIPE_DDI_PORT_NONE (0<<28) 4412#define TRANS_DDI_PORT_NONE (0<<28)
4413#define PIPE_DDI_MODE_SELECT_MASK (7<<24) 4413#define TRANS_DDI_MODE_SELECT_MASK (7<<24)
4414#define PIPE_DDI_MODE_SELECT_HDMI (0<<24) 4414#define TRANS_DDI_MODE_SELECT_HDMI (0<<24)
4415#define PIPE_DDI_MODE_SELECT_DVI (1<<24) 4415#define TRANS_DDI_MODE_SELECT_DVI (1<<24)
4416#define PIPE_DDI_MODE_SELECT_DP_SST (2<<24) 4416#define TRANS_DDI_MODE_SELECT_DP_SST (2<<24)
4417#define PIPE_DDI_MODE_SELECT_DP_MST (3<<24) 4417#define TRANS_DDI_MODE_SELECT_DP_MST (3<<24)
4418#define PIPE_DDI_MODE_SELECT_FDI (4<<24) 4418#define TRANS_DDI_MODE_SELECT_FDI (4<<24)
4419#define PIPE_DDI_BPC_MASK (7<<20) 4419#define TRANS_DDI_BPC_MASK (7<<20)
4420#define PIPE_DDI_BPC_8 (0<<20) 4420#define TRANS_DDI_BPC_8 (0<<20)
4421#define PIPE_DDI_BPC_10 (1<<20) 4421#define TRANS_DDI_BPC_10 (1<<20)
4422#define PIPE_DDI_BPC_6 (2<<20) 4422#define TRANS_DDI_BPC_6 (2<<20)
4423#define PIPE_DDI_BPC_12 (3<<20) 4423#define TRANS_DDI_BPC_12 (3<<20)
4424#define PIPE_DDI_PVSYNC (1<<17) 4424#define TRANS_DDI_PVSYNC (1<<17)
4425#define PIPE_DDI_PHSYNC (1<<16) 4425#define TRANS_DDI_PHSYNC (1<<16)
4426#define PIPE_DDI_BFI_ENABLE (1<<4) 4426#define TRANS_DDI_EDP_INPUT_MASK (7<<12)
4427#define PIPE_DDI_PORT_WIDTH_X1 (0<<1) 4427#define TRANS_DDI_EDP_INPUT_A_ON (0<<12)
4428#define PIPE_DDI_PORT_WIDTH_X2 (1<<1) 4428#define TRANS_DDI_EDP_INPUT_A_ONOFF (4<<12)
4429#define PIPE_DDI_PORT_WIDTH_X4 (3<<1) 4429#define TRANS_DDI_EDP_INPUT_B_ONOFF (5<<12)
4430#define TRANS_DDI_EDP_INPUT_C_ONOFF (6<<12)
4431#define TRANS_DDI_BFI_ENABLE (1<<4)
4432#define TRANS_DDI_PORT_WIDTH_X1 (0<<1)
4433#define TRANS_DDI_PORT_WIDTH_X2 (1<<1)
4434#define TRANS_DDI_PORT_WIDTH_X4 (3<<1)
4430 4435
4431/* DisplayPort Transport Control */ 4436/* DisplayPort Transport Control */
4432#define DP_TP_CTL_A 0x64040 4437#define DP_TP_CTL_A 0x64040
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
diff --git a/drivers/gpu/drm/i915/intel_display.c b/drivers/gpu/drm/i915/intel_display.c
index 74e7625b19dc..f51b5eee30c5 100644
--- a/drivers/gpu/drm/i915/intel_display.c
+++ b/drivers/gpu/drm/i915/intel_display.c
@@ -1122,12 +1122,14 @@ static void assert_fdi_tx(struct drm_i915_private *dev_priv,
1122 int reg; 1122 int reg;
1123 u32 val; 1123 u32 val;
1124 bool cur_state; 1124 bool cur_state;
1125 enum transcoder cpu_transcoder = intel_pipe_to_cpu_transcoder(dev_priv,
1126 pipe);
1125 1127
1126 if (IS_HASWELL(dev_priv->dev)) { 1128 if (IS_HASWELL(dev_priv->dev)) {
1127 /* On Haswell, DDI is used instead of FDI_TX_CTL */ 1129 /* On Haswell, DDI is used instead of FDI_TX_CTL */
1128 reg = DDI_FUNC_CTL(pipe); 1130 reg = TRANS_DDI_FUNC_CTL(cpu_transcoder);
1129 val = I915_READ(reg); 1131 val = I915_READ(reg);
1130 cur_state = !!(val & PIPE_DDI_FUNC_ENABLE); 1132 cur_state = !!(val & TRANS_DDI_FUNC_ENABLE);
1131 } else { 1133 } else {
1132 reg = FDI_TX_CTL(pipe); 1134 reg = FDI_TX_CTL(pipe);
1133 val = I915_READ(reg); 1135 val = I915_READ(reg);
@@ -3435,6 +3437,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
3435 struct intel_encoder *encoder; 3437 struct intel_encoder *encoder;
3436 int pipe = intel_crtc->pipe; 3438 int pipe = intel_crtc->pipe;
3437 int plane = intel_crtc->plane; 3439 int plane = intel_crtc->plane;
3440 enum transcoder cpu_transcoder = intel_crtc->cpu_transcoder;
3438 bool is_pch_port; 3441 bool is_pch_port;
3439 3442
3440 if (!intel_crtc->active) 3443 if (!intel_crtc->active)
@@ -3456,7 +3459,7 @@ static void haswell_crtc_disable(struct drm_crtc *crtc)
3456 3459
3457 intel_disable_pipe(dev_priv, pipe); 3460 intel_disable_pipe(dev_priv, pipe);
3458 3461
3459 intel_ddi_disable_pipe_func(dev_priv, pipe); 3462 intel_ddi_disable_transcoder_func(dev_priv, cpu_transcoder);
3460 3463
3461 /* Disable PF */ 3464 /* Disable PF */
3462 I915_WRITE(PF_CTL(pipe), 0); 3465 I915_WRITE(PF_CTL(pipe), 0);
diff --git a/drivers/gpu/drm/i915/intel_drv.h b/drivers/gpu/drm/i915/intel_drv.h
index 90e706c846a4..2ad70d744232 100644
--- a/drivers/gpu/drm/i915/intel_drv.h
+++ b/drivers/gpu/drm/i915/intel_drv.h
@@ -610,8 +610,8 @@ extern void intel_ddi_mode_set(struct drm_encoder *encoder,
610 struct drm_display_mode *adjusted_mode); 610 struct drm_display_mode *adjusted_mode);
611extern void intel_ddi_pll_init(struct drm_device *dev); 611extern void intel_ddi_pll_init(struct drm_device *dev);
612extern void intel_ddi_enable_pipe_func(struct drm_crtc *crtc); 612extern void intel_ddi_enable_pipe_func(struct drm_crtc *crtc);
613extern void intel_ddi_disable_pipe_func(struct drm_i915_private *dev_priv, 613extern void intel_ddi_disable_transcoder_func(struct drm_i915_private *dev_priv,
614 enum pipe pipe); 614 enum transcoder cpu_transcoder);
615extern void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc); 615extern void intel_ddi_enable_pipe_clock(struct intel_crtc *intel_crtc);
616extern void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc); 616extern void intel_ddi_disable_pipe_clock(struct intel_crtc *intel_crtc);
617extern void intel_ddi_setup_hw_pll_state(struct drm_device *dev); 617extern void intel_ddi_setup_hw_pll_state(struct drm_device *dev);