Skip to content

Commit c1ef9a6

Browse files
tombalinusw
authored andcommitted
Revert "drm/atomic-helper: Re-order bridge chain pre-enable and post-disable"
This reverts commit c9b1150. Changing the enable/disable sequence has caused regressions on multiple platforms: R-Car, MCDE, Rockchip. A series (see link below) was sent to fix these, but it was decided that it's better to revert the original patch and change the enable/disable sequence only in the tidss driver. Reverting this commit breaks tidss's DSI and OLDI outputs, which will be fixed in the following commits. Signed-off-by: Tomi Valkeinen <[email protected]> Link: https://lore.kernel.org/all/20251202-mcde-drm-regression-thirdfix-v6-0-f1bffd4ec0fa%40kernel.org/ Fixes: c9b1150 ("drm/atomic-helper: Re-order bridge chain pre-enable and post-disable") Cc: [email protected] # v6.17+ Reviewed-by: Aradhya Bhatia <[email protected]> Reviewed-by: Maxime Ripard <[email protected]> Reviewed-by: Linus Walleij <[email protected]> Tested-by: Linus Walleij <[email protected]> Signed-off-by: Linus Walleij <[email protected]> Link: https://patch.msgid.link/[email protected]
1 parent 0ddd3bb commit c1ef9a6

2 files changed

Lines changed: 70 additions & 187 deletions

File tree

drivers/gpu/drm/drm_atomic_helper.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1341,9 +1341,9 @@ disable_outputs(struct drm_device *dev, struct drm_atomic_state *state)
13411341
{
13421342
encoder_bridge_disable(dev, state);
13431343

1344-
crtc_disable(dev, state);
1345-
13461344
encoder_bridge_post_disable(dev, state);
1345+
1346+
crtc_disable(dev, state);
13471347
}
13481348

13491349
/**
@@ -1682,10 +1682,10 @@ encoder_bridge_enable(struct drm_device *dev, struct drm_atomic_state *state)
16821682
void drm_atomic_helper_commit_modeset_enables(struct drm_device *dev,
16831683
struct drm_atomic_state *state)
16841684
{
1685-
encoder_bridge_pre_enable(dev, state);
1686-
16871685
crtc_enable(dev, state);
16881686

1687+
encoder_bridge_pre_enable(dev, state);
1688+
16891689
encoder_bridge_enable(dev, state);
16901690

16911691
drm_atomic_helper_commit_writebacks(dev, state);

include/drm/drm_bridge.h

Lines changed: 66 additions & 183 deletions
Original file line numberDiff line numberDiff line change
@@ -176,33 +176,17 @@ struct drm_bridge_funcs {
176176
/**
177177
* @disable:
178178
*
179-
* The @disable callback should disable the bridge.
179+
* This callback should disable the bridge. It is called right before
180+
* the preceding element in the display pipe is disabled. If the
181+
* preceding element is a bridge this means it's called before that
182+
* bridge's @disable vfunc. If the preceding element is a &drm_encoder
183+
* it's called right before the &drm_encoder_helper_funcs.disable,
184+
* &drm_encoder_helper_funcs.prepare or &drm_encoder_helper_funcs.dpms
185+
* hook.
180186
*
181187
* The bridge can assume that the display pipe (i.e. clocks and timing
182188
* signals) feeding it is still running when this callback is called.
183189
*
184-
*
185-
* If the preceding element is a &drm_bridge, then this is called before
186-
* that bridge is disabled via one of:
187-
*
188-
* - &drm_bridge_funcs.disable
189-
* - &drm_bridge_funcs.atomic_disable
190-
*
191-
* If the preceding element of the bridge is a display controller, then
192-
* this callback is called before the encoder is disabled via one of:
193-
*
194-
* - &drm_encoder_helper_funcs.atomic_disable
195-
* - &drm_encoder_helper_funcs.prepare
196-
* - &drm_encoder_helper_funcs.disable
197-
* - &drm_encoder_helper_funcs.dpms
198-
*
199-
* and the CRTC is disabled via one of:
200-
*
201-
* - &drm_crtc_helper_funcs.prepare
202-
* - &drm_crtc_helper_funcs.atomic_disable
203-
* - &drm_crtc_helper_funcs.disable
204-
* - &drm_crtc_helper_funcs.dpms.
205-
*
206190
* The @disable callback is optional.
207191
*
208192
* NOTE:
@@ -215,34 +199,17 @@ struct drm_bridge_funcs {
215199
/**
216200
* @post_disable:
217201
*
218-
* The bridge must assume that the display pipe (i.e. clocks and timing
219-
* signals) feeding this bridge is no longer running when the
220-
* @post_disable is called.
202+
* This callback should disable the bridge. It is called right after the
203+
* preceding element in the display pipe is disabled. If the preceding
204+
* element is a bridge this means it's called after that bridge's
205+
* @post_disable function. If the preceding element is a &drm_encoder
206+
* it's called right after the encoder's
207+
* &drm_encoder_helper_funcs.disable, &drm_encoder_helper_funcs.prepare
208+
* or &drm_encoder_helper_funcs.dpms hook.
221209
*
222-
* This callback should perform all the actions required by the hardware
223-
* after it has stopped receiving signals from the preceding element.
224-
*
225-
* If the preceding element is a &drm_bridge, then this is called after
226-
* that bridge is post-disabled (unless marked otherwise by the
227-
* @pre_enable_prev_first flag) via one of:
228-
*
229-
* - &drm_bridge_funcs.post_disable
230-
* - &drm_bridge_funcs.atomic_post_disable
231-
*
232-
* If the preceding element of the bridge is a display controller, then
233-
* this callback is called after the encoder is disabled via one of:
234-
*
235-
* - &drm_encoder_helper_funcs.atomic_disable
236-
* - &drm_encoder_helper_funcs.prepare
237-
* - &drm_encoder_helper_funcs.disable
238-
* - &drm_encoder_helper_funcs.dpms
239-
*
240-
* and the CRTC is disabled via one of:
241-
*
242-
* - &drm_crtc_helper_funcs.prepare
243-
* - &drm_crtc_helper_funcs.atomic_disable
244-
* - &drm_crtc_helper_funcs.disable
245-
* - &drm_crtc_helper_funcs.dpms
210+
* The bridge must assume that the display pipe (i.e. clocks and timing
211+
* signals) feeding it is no longer running when this callback is
212+
* called.
246213
*
247214
* The @post_disable callback is optional.
248215
*
@@ -285,30 +252,18 @@ struct drm_bridge_funcs {
285252
/**
286253
* @pre_enable:
287254
*
288-
* The display pipe (i.e. clocks and timing signals) feeding this bridge
289-
* will not yet be running when the @pre_enable is called.
290-
*
291-
* This callback should perform all the necessary actions to prepare the
292-
* bridge to accept signals from the preceding element.
293-
*
294-
* If the preceding element is a &drm_bridge, then this is called before
295-
* that bridge is pre-enabled (unless marked otherwise by
296-
* @pre_enable_prev_first flag) via one of:
297-
*
298-
* - &drm_bridge_funcs.pre_enable
299-
* - &drm_bridge_funcs.atomic_pre_enable
300-
*
301-
* If the preceding element of the bridge is a display controller, then
302-
* this callback is called before the CRTC is enabled via one of:
303-
*
304-
* - &drm_crtc_helper_funcs.atomic_enable
305-
* - &drm_crtc_helper_funcs.commit
306-
*
307-
* and the encoder is enabled via one of:
255+
* This callback should enable the bridge. It is called right before
256+
* the preceding element in the display pipe is enabled. If the
257+
* preceding element is a bridge this means it's called before that
258+
* bridge's @pre_enable function. If the preceding element is a
259+
* &drm_encoder it's called right before the encoder's
260+
* &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
261+
* &drm_encoder_helper_funcs.dpms hook.
308262
*
309-
* - &drm_encoder_helper_funcs.atomic_enable
310-
* - &drm_encoder_helper_funcs.enable
311-
* - &drm_encoder_helper_funcs.commit
263+
* The display pipe (i.e. clocks and timing signals) feeding this bridge
264+
* will not yet be running when this callback is called. The bridge must
265+
* not enable the display link feeding the next bridge in the chain (if
266+
* there is one) when this callback is called.
312267
*
313268
* The @pre_enable callback is optional.
314269
*
@@ -322,31 +277,19 @@ struct drm_bridge_funcs {
322277
/**
323278
* @enable:
324279
*
325-
* The @enable callback should enable the bridge.
280+
* This callback should enable the bridge. It is called right after
281+
* the preceding element in the display pipe is enabled. If the
282+
* preceding element is a bridge this means it's called after that
283+
* bridge's @enable function. If the preceding element is a
284+
* &drm_encoder it's called right after the encoder's
285+
* &drm_encoder_helper_funcs.enable, &drm_encoder_helper_funcs.commit or
286+
* &drm_encoder_helper_funcs.dpms hook.
326287
*
327288
* The bridge can assume that the display pipe (i.e. clocks and timing
328289
* signals) feeding it is running when this callback is called. This
329290
* callback must enable the display link feeding the next bridge in the
330291
* chain if there is one.
331292
*
332-
* If the preceding element is a &drm_bridge, then this is called after
333-
* that bridge is enabled via one of:
334-
*
335-
* - &drm_bridge_funcs.enable
336-
* - &drm_bridge_funcs.atomic_enable
337-
*
338-
* If the preceding element of the bridge is a display controller, then
339-
* this callback is called after the CRTC is enabled via one of:
340-
*
341-
* - &drm_crtc_helper_funcs.atomic_enable
342-
* - &drm_crtc_helper_funcs.commit
343-
*
344-
* and the encoder is enabled via one of:
345-
*
346-
* - &drm_encoder_helper_funcs.atomic_enable
347-
* - &drm_encoder_helper_funcs.enable
348-
* - drm_encoder_helper_funcs.commit
349-
*
350293
* The @enable callback is optional.
351294
*
352295
* NOTE:
@@ -359,30 +302,17 @@ struct drm_bridge_funcs {
359302
/**
360303
* @atomic_pre_enable:
361304
*
362-
* The display pipe (i.e. clocks and timing signals) feeding this bridge
363-
* will not yet be running when the @atomic_pre_enable is called.
364-
*
365-
* This callback should perform all the necessary actions to prepare the
366-
* bridge to accept signals from the preceding element.
367-
*
368-
* If the preceding element is a &drm_bridge, then this is called before
369-
* that bridge is pre-enabled (unless marked otherwise by
370-
* @pre_enable_prev_first flag) via one of:
371-
*
372-
* - &drm_bridge_funcs.pre_enable
373-
* - &drm_bridge_funcs.atomic_pre_enable
305+
* This callback should enable the bridge. It is called right before
306+
* the preceding element in the display pipe is enabled. If the
307+
* preceding element is a bridge this means it's called before that
308+
* bridge's @atomic_pre_enable or @pre_enable function. If the preceding
309+
* element is a &drm_encoder it's called right before the encoder's
310+
* &drm_encoder_helper_funcs.atomic_enable hook.
374311
*
375-
* If the preceding element of the bridge is a display controller, then
376-
* this callback is called before the CRTC is enabled via one of:
377-
*
378-
* - &drm_crtc_helper_funcs.atomic_enable
379-
* - &drm_crtc_helper_funcs.commit
380-
*
381-
* and the encoder is enabled via one of:
382-
*
383-
* - &drm_encoder_helper_funcs.atomic_enable
384-
* - &drm_encoder_helper_funcs.enable
385-
* - &drm_encoder_helper_funcs.commit
312+
* The display pipe (i.e. clocks and timing signals) feeding this bridge
313+
* will not yet be running when this callback is called. The bridge must
314+
* not enable the display link feeding the next bridge in the chain (if
315+
* there is one) when this callback is called.
386316
*
387317
* The @atomic_pre_enable callback is optional.
388318
*/
@@ -392,64 +322,35 @@ struct drm_bridge_funcs {
392322
/**
393323
* @atomic_enable:
394324
*
395-
* The @atomic_enable callback should enable the bridge.
325+
* This callback should enable the bridge. It is called right after
326+
* the preceding element in the display pipe is enabled. If the
327+
* preceding element is a bridge this means it's called after that
328+
* bridge's @atomic_enable or @enable function. If the preceding element
329+
* is a &drm_encoder it's called right after the encoder's
330+
* &drm_encoder_helper_funcs.atomic_enable hook.
396331
*
397332
* The bridge can assume that the display pipe (i.e. clocks and timing
398333
* signals) feeding it is running when this callback is called. This
399334
* callback must enable the display link feeding the next bridge in the
400335
* chain if there is one.
401336
*
402-
* If the preceding element is a &drm_bridge, then this is called after
403-
* that bridge is enabled via one of:
404-
*
405-
* - &drm_bridge_funcs.enable
406-
* - &drm_bridge_funcs.atomic_enable
407-
*
408-
* If the preceding element of the bridge is a display controller, then
409-
* this callback is called after the CRTC is enabled via one of:
410-
*
411-
* - &drm_crtc_helper_funcs.atomic_enable
412-
* - &drm_crtc_helper_funcs.commit
413-
*
414-
* and the encoder is enabled via one of:
415-
*
416-
* - &drm_encoder_helper_funcs.atomic_enable
417-
* - &drm_encoder_helper_funcs.enable
418-
* - drm_encoder_helper_funcs.commit
419-
*
420337
* The @atomic_enable callback is optional.
421338
*/
422339
void (*atomic_enable)(struct drm_bridge *bridge,
423340
struct drm_atomic_state *state);
424341
/**
425342
* @atomic_disable:
426343
*
427-
* The @atomic_disable callback should disable the bridge.
344+
* This callback should disable the bridge. It is called right before
345+
* the preceding element in the display pipe is disabled. If the
346+
* preceding element is a bridge this means it's called before that
347+
* bridge's @atomic_disable or @disable vfunc. If the preceding element
348+
* is a &drm_encoder it's called right before the
349+
* &drm_encoder_helper_funcs.atomic_disable hook.
428350
*
429351
* The bridge can assume that the display pipe (i.e. clocks and timing
430352
* signals) feeding it is still running when this callback is called.
431353
*
432-
* If the preceding element is a &drm_bridge, then this is called before
433-
* that bridge is disabled via one of:
434-
*
435-
* - &drm_bridge_funcs.disable
436-
* - &drm_bridge_funcs.atomic_disable
437-
*
438-
* If the preceding element of the bridge is a display controller, then
439-
* this callback is called before the encoder is disabled via one of:
440-
*
441-
* - &drm_encoder_helper_funcs.atomic_disable
442-
* - &drm_encoder_helper_funcs.prepare
443-
* - &drm_encoder_helper_funcs.disable
444-
* - &drm_encoder_helper_funcs.dpms
445-
*
446-
* and the CRTC is disabled via one of:
447-
*
448-
* - &drm_crtc_helper_funcs.prepare
449-
* - &drm_crtc_helper_funcs.atomic_disable
450-
* - &drm_crtc_helper_funcs.disable
451-
* - &drm_crtc_helper_funcs.dpms.
452-
*
453354
* The @atomic_disable callback is optional.
454355
*/
455356
void (*atomic_disable)(struct drm_bridge *bridge,
@@ -458,34 +359,16 @@ struct drm_bridge_funcs {
458359
/**
459360
* @atomic_post_disable:
460361
*
461-
* The bridge must assume that the display pipe (i.e. clocks and timing
462-
* signals) feeding this bridge is no longer running when the
463-
* @atomic_post_disable is called.
464-
*
465-
* This callback should perform all the actions required by the hardware
466-
* after it has stopped receiving signals from the preceding element.
362+
* This callback should disable the bridge. It is called right after the
363+
* preceding element in the display pipe is disabled. If the preceding
364+
* element is a bridge this means it's called after that bridge's
365+
* @atomic_post_disable or @post_disable function. If the preceding
366+
* element is a &drm_encoder it's called right after the encoder's
367+
* &drm_encoder_helper_funcs.atomic_disable hook.
467368
*
468-
* If the preceding element is a &drm_bridge, then this is called after
469-
* that bridge is post-disabled (unless marked otherwise by the
470-
* @pre_enable_prev_first flag) via one of:
471-
*
472-
* - &drm_bridge_funcs.post_disable
473-
* - &drm_bridge_funcs.atomic_post_disable
474-
*
475-
* If the preceding element of the bridge is a display controller, then
476-
* this callback is called after the encoder is disabled via one of:
477-
*
478-
* - &drm_encoder_helper_funcs.atomic_disable
479-
* - &drm_encoder_helper_funcs.prepare
480-
* - &drm_encoder_helper_funcs.disable
481-
* - &drm_encoder_helper_funcs.dpms
482-
*
483-
* and the CRTC is disabled via one of:
484-
*
485-
* - &drm_crtc_helper_funcs.prepare
486-
* - &drm_crtc_helper_funcs.atomic_disable
487-
* - &drm_crtc_helper_funcs.disable
488-
* - &drm_crtc_helper_funcs.dpms
369+
* The bridge must assume that the display pipe (i.e. clocks and timing
370+
* signals) feeding it is no longer running when this callback is
371+
* called.
489372
*
490373
* The @atomic_post_disable callback is optional.
491374
*/

0 commit comments

Comments
 (0)