aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/gpu/drm
diff options
context:
space:
mode:
authorManasi Navare <manasi.d.navare@intel.com>2016-09-01 18:08:11 -0400
committerRodrigo Vivi <rodrigo.vivi@intel.com>2016-09-07 16:55:33 -0400
commit81b9fd8fc68e9e0999efc604c4e5477b8d1982aa (patch)
treecfd68e638787b33638d718a3244837acdbafe0ca /drivers/gpu/drm
parent9a4edadaccea5ba9b73abaff8121e68dd0ff70bc (diff)
drm/i915: Split hsw_get_dpll()
Split out the DisplayPort and HDMI pll setup code into separate functions and refactor the DP code that calculates the pll so that it doesn't depend on crtc state. This will be used for acquiring port pll when doing upfront link training. Reviewed-by: Durgadoss R <durgadoss.r@intel.com> Signed-off-by: Manasi Navare <manasi.d.navare@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.c90
-rw-r--r--drivers/gpu/drm/i915/intel_dpll_mgr.h6
2 files changed, 63 insertions, 33 deletions
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.c b/drivers/gpu/drm/i915/intel_dpll_mgr.c
index c6d689534140..9a1da98805d6 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.c
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.c
@@ -667,11 +667,65 @@ hsw_ddi_calculate_wrpll(int clock /* in Hz */,
667 *r2_out = best.r2; 667 *r2_out = best.r2;
668} 668}
669 669
670static struct intel_shared_dpll *hsw_ddi_hdmi_get_dpll(int clock,
671 struct intel_crtc *crtc,
672 struct intel_crtc_state *crtc_state)
673{
674 struct intel_shared_dpll *pll;
675 uint32_t val;
676 unsigned int p, n2, r2;
677
678 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
679
680 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
681 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
682 WRPLL_DIVIDER_POST(p);
683
684 crtc_state->dpll_hw_state.wrpll = val;
685
686 pll = intel_find_shared_dpll(crtc, crtc_state,
687 DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
688
689 if (!pll)
690 return NULL;
691
692 return pll;
693}
694
695struct intel_shared_dpll *hsw_ddi_dp_get_dpll(struct intel_encoder *encoder,
696 int clock)
697{
698 struct drm_i915_private *dev_priv = to_i915(encoder->base.dev);
699 struct intel_shared_dpll *pll;
700 enum intel_dpll_id pll_id;
701
702 switch (clock / 2) {
703 case 81000:
704 pll_id = DPLL_ID_LCPLL_810;
705 break;
706 case 135000:
707 pll_id = DPLL_ID_LCPLL_1350;
708 break;
709 case 270000:
710 pll_id = DPLL_ID_LCPLL_2700;
711 break;
712 default:
713 DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
714 return NULL;
715 }
716
717 pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
718
719 if (!pll)
720 return NULL;
721
722 return pll;
723}
724
670static struct intel_shared_dpll * 725static struct intel_shared_dpll *
671hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state, 726hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
672 struct intel_encoder *encoder) 727 struct intel_encoder *encoder)
673{ 728{
674 struct drm_i915_private *dev_priv = to_i915(crtc->base.dev);
675 struct intel_shared_dpll *pll; 729 struct intel_shared_dpll *pll;
676 int clock = crtc_state->port_clock; 730 int clock = crtc_state->port_clock;
677 731
@@ -679,41 +733,12 @@ hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
679 sizeof(crtc_state->dpll_hw_state)); 733 sizeof(crtc_state->dpll_hw_state));
680 734
681 if (encoder->type == INTEL_OUTPUT_HDMI) { 735 if (encoder->type == INTEL_OUTPUT_HDMI) {
682 uint32_t val; 736 pll = hsw_ddi_hdmi_get_dpll(clock, crtc, crtc_state);
683 unsigned p, n2, r2;
684
685 hsw_ddi_calculate_wrpll(clock * 1000, &r2, &n2, &p);
686
687 val = WRPLL_PLL_ENABLE | WRPLL_PLL_LCPLL |
688 WRPLL_DIVIDER_REFERENCE(r2) | WRPLL_DIVIDER_FEEDBACK(n2) |
689 WRPLL_DIVIDER_POST(p);
690
691 crtc_state->dpll_hw_state.wrpll = val;
692
693 pll = intel_find_shared_dpll(crtc, crtc_state,
694 DPLL_ID_WRPLL1, DPLL_ID_WRPLL2);
695 737
696 } else if (encoder->type == INTEL_OUTPUT_DP || 738 } else if (encoder->type == INTEL_OUTPUT_DP ||
697 encoder->type == INTEL_OUTPUT_DP_MST || 739 encoder->type == INTEL_OUTPUT_DP_MST ||
698 encoder->type == INTEL_OUTPUT_EDP) { 740 encoder->type == INTEL_OUTPUT_EDP) {
699 enum intel_dpll_id pll_id; 741 pll = hsw_ddi_dp_get_dpll(encoder, clock);
700
701 switch (clock / 2) {
702 case 81000:
703 pll_id = DPLL_ID_LCPLL_810;
704 break;
705 case 135000:
706 pll_id = DPLL_ID_LCPLL_1350;
707 break;
708 case 270000:
709 pll_id = DPLL_ID_LCPLL_2700;
710 break;
711 default:
712 DRM_DEBUG_KMS("Invalid clock for DP: %d\n", clock);
713 return NULL;
714 }
715
716 pll = intel_get_shared_dpll_by_id(dev_priv, pll_id);
717 742
718 } else if (encoder->type == INTEL_OUTPUT_ANALOG) { 743 } else if (encoder->type == INTEL_OUTPUT_ANALOG) {
719 if (WARN_ON(crtc_state->port_clock / 2 != 135000)) 744 if (WARN_ON(crtc_state->port_clock / 2 != 135000))
@@ -736,7 +761,6 @@ hsw_get_dpll(struct intel_crtc *crtc, struct intel_crtc_state *crtc_state,
736 return pll; 761 return pll;
737} 762}
738 763
739
740static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = { 764static const struct intel_shared_dpll_funcs hsw_ddi_wrpll_funcs = {
741 .enable = hsw_ddi_wrpll_enable, 765 .enable = hsw_ddi_wrpll_enable,
742 .disable = hsw_ddi_wrpll_disable, 766 .disable = hsw_ddi_wrpll_disable,
diff --git a/drivers/gpu/drm/i915/intel_dpll_mgr.h b/drivers/gpu/drm/i915/intel_dpll_mgr.h
index cb28f8df8701..aed74084f759 100644
--- a/drivers/gpu/drm/i915/intel_dpll_mgr.h
+++ b/drivers/gpu/drm/i915/intel_dpll_mgr.h
@@ -164,8 +164,14 @@ 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
167/* SKL dpll related functions */ 168/* SKL dpll related functions */
168bool skl_ddi_dp_set_dpll_hw_state(int clock, 169bool skl_ddi_dp_set_dpll_hw_state(int clock,
169 struct intel_dpll_hw_state *dpll_hw_state); 170 struct intel_dpll_hw_state *dpll_hw_state);
170 171
172
173/* HSW dpll related functions */
174struct intel_shared_dpll *hsw_ddi_dp_get_dpll(struct intel_encoder *encoder,
175 int clock);
176
171#endif /* _INTEL_DPLL_MGR_H_ */ 177#endif /* _INTEL_DPLL_MGR_H_ */