@@ -145,52 +145,65 @@ void intel_disable_shared_dpll(struct intel_crtc *crtc)
145145 intel_display_power_put (dev_priv , POWER_DOMAIN_PLLS );
146146}
147147
148- struct intel_shared_dpll * intel_get_shared_dpll (struct intel_crtc * crtc ,
149- struct intel_crtc_state * crtc_state )
148+ static enum intel_dpll_id
149+ ibx_get_fixed_dpll (struct intel_crtc * crtc ,
150+ struct intel_crtc_state * crtc_state )
150151{
151- struct drm_i915_private * dev_priv = crtc -> base .dev -> dev_private ;
152+ struct drm_i915_private * dev_priv = to_i915 ( crtc -> base .dev ) ;
152153 struct intel_shared_dpll * pll ;
153- struct intel_shared_dpll_config * shared_dpll ;
154154 enum intel_dpll_id i ;
155- int max = dev_priv -> num_shared_dpll ;
156155
157- shared_dpll = intel_atomic_get_shared_dpll_state (crtc_state -> base .state );
156+ /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
157+ i = (enum intel_dpll_id ) crtc -> pipe ;
158+ pll = & dev_priv -> shared_dplls [i ];
158159
159- if (HAS_PCH_IBX (dev_priv -> dev )) {
160- /* Ironlake PCH has a fixed PLL->PCH pipe mapping. */
161- i = (enum intel_dpll_id ) crtc -> pipe ;
162- pll = & dev_priv -> shared_dplls [i ];
160+ DRM_DEBUG_KMS ("CRTC:%d using pre-allocated %s\n" ,
161+ crtc -> base .base .id , pll -> name );
163162
164- DRM_DEBUG_KMS ( "CRTC:%d using pre-allocated %s\n" ,
165- crtc -> base . base . id , pll -> name );
163+ return i ;
164+ }
166165
167- WARN_ON (shared_dpll [i ].crtc_mask );
166+ static enum intel_dpll_id
167+ bxt_get_fixed_dpll (struct intel_crtc * crtc ,
168+ struct intel_crtc_state * crtc_state )
169+ {
170+ struct drm_i915_private * dev_priv = to_i915 (crtc -> base .dev );
171+ struct intel_encoder * encoder ;
172+ struct intel_digital_port * intel_dig_port ;
173+ struct intel_shared_dpll * pll ;
174+ enum intel_dpll_id i ;
168175
169- goto found ;
170- }
176+ /* PLL is attached to port in bxt */
177+ encoder = intel_ddi_get_crtc_new_encoder (crtc_state );
178+ if (WARN_ON (!encoder ))
179+ return DPLL_ID_PRIVATE ;
171180
172- if (IS_BROXTON (dev_priv -> dev )) {
173- /* PLL is attached to port in bxt */
174- struct intel_encoder * encoder ;
175- struct intel_digital_port * intel_dig_port ;
181+ intel_dig_port = enc_to_dig_port (& encoder -> base );
182+ /* 1:1 mapping between ports and PLLs */
183+ i = (enum intel_dpll_id )intel_dig_port -> port ;
184+ pll = & dev_priv -> shared_dplls [i ];
185+ DRM_DEBUG_KMS ("CRTC:%d using pre-allocated %s\n" ,
186+ crtc -> base .base .id , pll -> name );
176187
177- encoder = intel_ddi_get_crtc_new_encoder (crtc_state );
178- if (WARN_ON (!encoder ))
179- return NULL ;
188+ return i ;
189+ }
180190
181- intel_dig_port = enc_to_dig_port (& encoder -> base );
182- /* 1:1 mapping between ports and PLLs */
183- i = (enum intel_dpll_id )intel_dig_port -> port ;
184- pll = & dev_priv -> shared_dplls [i ];
185- DRM_DEBUG_KMS ("CRTC:%d using pre-allocated %s\n" ,
186- crtc -> base .base .id , pll -> name );
187- WARN_ON (shared_dpll [i ].crtc_mask );
191+ static enum intel_dpll_id
192+ intel_find_shared_dpll (struct intel_crtc * crtc ,
193+ struct intel_crtc_state * crtc_state )
194+ {
195+ struct drm_i915_private * dev_priv = crtc -> base .dev -> dev_private ;
196+ struct intel_shared_dpll * pll ;
197+ struct intel_shared_dpll_config * shared_dpll ;
198+ enum intel_dpll_id i ;
199+ int max = dev_priv -> num_shared_dpll ;
188200
189- goto found ;
190- } else if (INTEL_INFO (dev_priv )-> gen < 9 && HAS_DDI (dev_priv ))
201+ if (INTEL_INFO (dev_priv )-> gen < 9 && HAS_DDI (dev_priv ))
191202 /* Do not consider SPLL */
192203 max = 2 ;
193204
205+ shared_dpll = intel_atomic_get_shared_dpll_state (crtc_state -> base .state );
206+
194207 for (i = 0 ; i < max ; i ++ ) {
195208 pll = & dev_priv -> shared_dplls [i ];
196209
@@ -205,7 +218,7 @@ struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
205218 crtc -> base .base .id , pll -> name ,
206219 shared_dpll [i ].crtc_mask ,
207220 pll -> active );
208- goto found ;
221+ return i ;
209222 }
210223 }
211224
@@ -215,13 +228,39 @@ struct intel_shared_dpll *intel_get_shared_dpll(struct intel_crtc *crtc,
215228 if (shared_dpll [i ].crtc_mask == 0 ) {
216229 DRM_DEBUG_KMS ("CRTC:%d allocated %s\n" ,
217230 crtc -> base .base .id , pll -> name );
218- goto found ;
231+ return i ;
219232 }
220233 }
221234
222- return NULL ;
235+ return DPLL_ID_PRIVATE ;
236+ }
237+
238+ struct intel_shared_dpll *
239+ intel_get_shared_dpll (struct intel_crtc * crtc ,
240+ struct intel_crtc_state * crtc_state )
241+ {
242+ struct drm_i915_private * dev_priv = crtc -> base .dev -> dev_private ;
243+ struct intel_shared_dpll * pll ;
244+ struct intel_shared_dpll_config * shared_dpll ;
245+ enum intel_dpll_id i ;
246+
247+ shared_dpll = intel_atomic_get_shared_dpll_state (crtc_state -> base .state );
248+
249+ if (HAS_PCH_IBX (dev_priv -> dev )) {
250+ i = ibx_get_fixed_dpll (crtc , crtc_state );
251+ WARN_ON (shared_dpll [i ].crtc_mask );
252+ } else if (IS_BROXTON (dev_priv -> dev )) {
253+ i = bxt_get_fixed_dpll (crtc , crtc_state );
254+ WARN_ON (shared_dpll [i ].crtc_mask );
255+ } else {
256+ i = intel_find_shared_dpll (crtc , crtc_state );
257+ }
258+
259+ if (i < 0 )
260+ return NULL ;
261+
262+ pll = & dev_priv -> shared_dplls [i ];
223263
224- found :
225264 if (shared_dpll [i ].crtc_mask == 0 )
226265 shared_dpll [i ].hw_state =
227266 crtc_state -> dpll_hw_state ;
0 commit comments