aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorJim Bride <jim.bride@linux.intel.com>2016-09-01 18:08:10 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2016-09-07 16:55:33 -0400
commit9a4edadaccea5ba9b73abaff8121e68dd0ff70bc (patch)
tree3428d063b32e7053953eef46ae9e11ebbf2d9f34 /drivers/gpu/drm
parenta277ca7dc01df9c7b8fe5b1d992d2bcc02e2ec23 (diff)
drm/i915: Split skl_get_dpll()
Split out the DisplayPort and HDMI pll setup code into separate functions and refactor the DP code does not directly depend on crtc state, so that the code can be used for upfront link training. Reviewed-by: Manasi Navare <manasi.d.navare@intel.com> Signed-off-by: Jim Bride <jim.bride@linux.intel.com> Signed-off-by: Rodrigo Vivi <rodrigo.vivi@intel.com>
Diffstat (limited to 'drivers/gpu/drm')
-rw-r--r--drivers/gpu/drm/i915/intel_dpll_mgr.c131
-rw-r--r--drivers/gpu/drm/i915/intel_dpll_mgr.h4
2 files changed, 87 insertions, 48 deletions
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
index 6fc32cf2b83d..c6d689534140 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c
@@ -1172,75 +1172,110 @@ skip_remaining_dividers:
1172 return true; 1172 return true;
1173} 1173}
1174 1174
1175static struct intel_shared_dpll * 1175static bool skl_ddi_hdmi_pll_dividers(struct intel_crtc *crtc,
1176skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, 1176 struct intel_crtc_state *crtc_state,
1177 struct intel_encoder *encoder) 1177 int clock)
1178{ 1178{
1179 struct intel_shared_dpll *pll;
1180 uint32_t ctrl1, cfgcr1, cfgcr2; 1179 uint32_t ctrl1, cfgcr1, cfgcr2;
1181 int clock = crtc_state->port_clock; 1180 struct skl_wrpll_params wrpll_params = { 0, };
1182 1181
1183 /* 1182 /*
1184 * See comment in intel_dpll_hw_state to understand why we always use 0 1183 * See comment in intel_dpll_hw_state to understand why we always use 0
1185 * as the DPLL id in this function. 1184 * as the DPLL id in this function.
1186 */ 1185 */
1187
1188 ctrl1 = DPLL_CTRL1_OVERRIDE(0); 1186 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1189 1187
1190 if (encoder->type == INTEL_OUTPUT_HDMI) { 1188 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0);
1191 struct skl_wrpll_params wrpll_params = { 0, };
1192 1189
1193 ctrl1 |= DPLL_CTRL1_HDMI_MODE(0); 1190 if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params))
1191 return false;
1194 1192
1195 if (!skl_ddi_calculate_wrpll(clock * 1000, &wrpll_params)) 1193 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE |
1196 return NULL; 1194 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) |
1195 wrpll_params.dco_integer;
1196
1197 cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) |
1198 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) |
1199 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) |
1200 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) |
1201 wrpll_params.central_freq;
1202
1203 memset(&crtc_state->dpll_hw_state, 0,
1204 sizeof(crtc_state->dpll_hw_state));
1205
1206 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1207 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1208 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1209 return true;
1210}
1211
1212
1213bool skl_ddi_dp_set_dpll_hw_state(int clock,
1214 struct intel_dpll_hw_state *dpll_hw_state)
1215{
1216 uint32_t ctrl1;
1217
1218 /*
1219 * See comment in intel_dpll_hw_state to understand why we always use 0
1220 * as the DPLL id in this function.
1221 */
1222 ctrl1 = DPLL_CTRL1_OVERRIDE(0);
1223 switch (clock / 2) {
1224 case 81000:
1225 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0);
1226 break;
1227 case 135000:
1228 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1229 break;
1230 case 270000:
1231 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1232 break;
1233 /* eDP 1.4 rates */
1234 case 162000:
1235 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1236 break;
1237 case 108000:
1238 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1239 break;
1240 case 216000:
1241 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1242 break;
1243 }
1197 1244
1198 cfgcr1 = DPLL_CFGCR1_FREQ_ENABLE | 1245 dpll_hw_state->ctrl1 = ctrl1;
1199 DPLL_CFGCR1_DCO_FRACTION(wrpll_params.dco_fraction) | 1246 return true;
1200 wrpll_params.dco_integer; 1247}
1201 1248
1202 cfgcr2 = DPLL_CFGCR2_QDIV_RATIO(wrpll_params.qdiv_ratio) | 1249static struct intel_shared_dpll *
1203 DPLL_CFGCR2_QDIV_MODE(wrpll_params.qdiv_mode) | 1250skl_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
1204 DPLL_CFGCR2_KDIV(wrpll_params.kdiv) | 1251 struct intel_encoder *encoder)
1205 DPLL_CFGCR2_PDIV(wrpll_params.pdiv) | 1252{
1206 wrpll_params.central_freq; 1253 struct intel_shared_dpll *pll;
1254 int clock = crtc_state->port_clock;
1255 bool bret;
1256 struct intel_dpll_hw_state dpll_hw_state;
1257
1258 memset(&dpll_hw_state, 0, sizeof(dpll_hw_state));
1259
1260 if (encoder->type == INTEL_OUTPUT_HDMI) {
1261 bret = skl_ddi_hdmi_pll_dividers(crtc, crtc_state, clock);
1262 if (!bret) {
1263 DRM_DEBUG_KMS("Could not get HDMI pll dividers.\n");
1264 return NULL;
1265 }
1207 } else if (encoder->type == INTEL_OUTPUT_DP || 1266 } else if (encoder->type == INTEL_OUTPUT_DP ||
1208 encoder->type == INTEL_OUTPUT_DP_MST || 1267 encoder->type == INTEL_OUTPUT_DP_MST ||
1209 encoder->type == INTEL_OUTPUT_EDP) { 1268 encoder->type == INTEL_OUTPUT_EDP) {
1210 switch (crtc_state->port_clock / 2) { 1269 bret = skl_ddi_dp_set_dpll_hw_state(clock, &dpll_hw_state);
1211 case 81000: 1270 if (!bret) {
1212 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_810, 0); 1271 DRM_DEBUG_KMS("Could not set DP dpll HW state.\n");
1213 break; 1272 return NULL;
1214 case 135000:
1215 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1350, 0);
1216 break;
1217 case 270000:
1218 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2700, 0);
1219 break;
1220 /* eDP 1.4 rates */
1221 case 162000:
1222 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1620, 0);
1223 break;
1224 case 108000:
1225 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_1080, 0);
1226 break;
1227 case 216000:
1228 ctrl1 |= DPLL_CTRL1_LINK_RATE(DPLL_CTRL1_LINK_RATE_2160, 0);
1229 break;
1230 } 1273 }
1231 1274 crtc_state->dpll_hw_state = dpll_hw_state;
1232 cfgcr1 = cfgcr2 = 0;
1233 } else { 1275 } else {
1234 return NULL; 1276 return NULL;
1235 } 1277 }
1236 1278
1237 memset(&crtc_state->dpll_hw_state, 0,
1238 sizeof(crtc_state->dpll_hw_state));
1239
1240 crtc_state->dpll_hw_state.ctrl1 = ctrl1;
1241 crtc_state->dpll_hw_state.cfgcr1 = cfgcr1;
1242 crtc_state->dpll_hw_state.cfgcr2 = cfgcr2;
1243
1244 if (encoder->type == INTEL_OUTPUT_EDP) 1279 if (encoder->type == INTEL_OUTPUT_EDP)
1245 pll = intel_find_shared_dpll(crtc, crtc_state, 1280 pll = intel_find_shared_dpll(crtc, crtc_state,
1246 DPLL_ID_SKL_DPLL0, 1281 DPLL_ID_SKL_DPLL0,
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.h b/drivers/gpu/drm/i915/intel_dpll_mgr.h
index 11a85a53ab40..cb28f8df8701 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.h
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.h
@@ -164,4 +164,8 @@ void intel_shared_dpll_init(struct drm_device *dev);
164bool bxt_ddi_dp_set_dpll_hw_state(int clock, 164bool bxt_ddi_dp_set_dpll_hw_state(int clock,
165 struct intel_dpll_hw_state *dpll_hw_state); 165 struct intel_dpll_hw_state *dpll_hw_state);
166 166
167/* SKL dpll related functions */
168bool skl_ddi_dp_set_dpll_hw_state(int clock,
169 struct intel_dpll_hw_state *dpll_hw_state);
170
167#endif /* _INTEL_DPLL_MGR_H_ */ 171#endif /* _INTEL_DPLL_MGR_H_ */