1717#include <drm/drm_atomic_helper.h>
1818#include <drm/drm_bridge.h>
1919#include <drm/drm_color_mgmt.h>
20+ #include <drm/drm_connector.h>
2021#include <drm/drm_crtc.h>
2122#include <drm/drm_encoder.h>
2223#include <drm/drm_fb_dma_helper.h>
@@ -424,15 +425,19 @@ static int lcdif_crtc_atomic_check(struct drm_crtc *crtc,
424425 struct drm_atomic_state * state )
425426{
426427 struct drm_device * drm = crtc -> dev ;
427- struct lcdif_drm_private * lcdif = to_lcdif_drm_private (drm );
428428 struct drm_crtc_state * crtc_state = drm_atomic_get_new_crtc_state (state ,
429429 crtc );
430430 struct lcdif_crtc_state * lcdif_crtc_state = to_lcdif_crtc_state (crtc_state );
431431 bool has_primary = crtc_state -> plane_mask &
432432 drm_plane_mask (crtc -> primary );
433+ struct drm_connector_state * connector_state ;
434+ struct drm_connector * connector ;
435+ struct drm_encoder * encoder ;
433436 struct drm_bridge_state * bridge_state ;
434- struct drm_bridge * bridge = lcdif -> bridge ;
435- int ret ;
437+ struct drm_bridge * bridge ;
438+ u32 bus_format , bus_flags ;
439+ bool format_set = false, flags_set = false;
440+ int ret , i ;
436441
437442 /* The primary plane has to be enabled when the CRTC is active. */
438443 if (crtc_state -> active && !has_primary )
@@ -442,29 +447,58 @@ static int lcdif_crtc_atomic_check(struct drm_crtc *crtc,
442447 if (ret )
443448 return ret ;
444449
445- bridge_state = drm_atomic_get_new_bridge_state (state , bridge );
446- if (!bridge_state )
447- lcdif_crtc_state -> bus_format = MEDIA_BUS_FMT_FIXED ;
448- else
449- lcdif_crtc_state -> bus_format = bridge_state -> input_bus_cfg .format ;
450-
451- if (lcdif_crtc_state -> bus_format == MEDIA_BUS_FMT_FIXED ) {
452- dev_warn_once (drm -> dev ,
453- "Bridge does not provide bus format, assuming MEDIA_BUS_FMT_RGB888_1X24.\n"
454- "Please fix bridge driver by handling atomic_get_input_bus_fmts.\n" );
455- lcdif_crtc_state -> bus_format = MEDIA_BUS_FMT_RGB888_1X24 ;
456- } else if (!lcdif_crtc_state -> bus_format ) {
457- /* If all else fails, default to RGB888_1X24 */
458- lcdif_crtc_state -> bus_format = MEDIA_BUS_FMT_RGB888_1X24 ;
450+ /* Try to find consistent bus format and flags across first bridges. */
451+ for_each_new_connector_in_state (state , connector , connector_state , i ) {
452+ if (!connector_state -> crtc )
453+ continue ;
454+
455+ encoder = connector_state -> best_encoder ;
456+
457+ bridge = drm_bridge_chain_get_first_bridge (encoder );
458+ if (!bridge )
459+ continue ;
460+
461+ bridge_state = drm_atomic_get_new_bridge_state (state , bridge );
462+ if (!bridge_state )
463+ bus_format = MEDIA_BUS_FMT_FIXED ;
464+ else
465+ bus_format = bridge_state -> input_bus_cfg .format ;
466+
467+ if (bus_format == MEDIA_BUS_FMT_FIXED ) {
468+ dev_warn (drm -> dev ,
469+ "[ENCODER:%d:%s]'s bridge does not provide bus format, assuming MEDIA_BUS_FMT_RGB888_1X24.\n"
470+ "Please fix bridge driver by handling atomic_get_input_bus_fmts.\n" ,
471+ encoder -> base .id , encoder -> name );
472+ bus_format = MEDIA_BUS_FMT_RGB888_1X24 ;
473+ } else if (!bus_format ) {
474+ /* If all else fails, default to RGB888_1X24 */
475+ bus_format = MEDIA_BUS_FMT_RGB888_1X24 ;
476+ }
477+
478+ if (!format_set ) {
479+ lcdif_crtc_state -> bus_format = bus_format ;
480+ format_set = true;
481+ } else if (lcdif_crtc_state -> bus_format != bus_format ) {
482+ DRM_DEV_DEBUG_DRIVER (drm -> dev , "inconsistent bus format\n" );
483+ return - EINVAL ;
484+ }
485+
486+ if (bridge -> timings )
487+ bus_flags = bridge -> timings -> input_bus_flags ;
488+ else if (bridge_state )
489+ bus_flags = bridge_state -> input_bus_cfg .flags ;
490+ else
491+ bus_flags = 0 ;
492+
493+ if (!flags_set ) {
494+ lcdif_crtc_state -> bus_flags = bus_flags ;
495+ flags_set = true;
496+ } else if (lcdif_crtc_state -> bus_flags != bus_flags ) {
497+ DRM_DEV_DEBUG_DRIVER (drm -> dev , "inconsistent bus flags\n" );
498+ return - EINVAL ;
499+ }
459500 }
460501
461- if (bridge -> timings )
462- lcdif_crtc_state -> bus_flags = bridge -> timings -> input_bus_flags ;
463- else if (bridge_state )
464- lcdif_crtc_state -> bus_flags = bridge_state -> input_bus_cfg .flags ;
465- else
466- lcdif_crtc_state -> bus_flags = 0 ;
467-
468502 return 0 ;
469503}
470504
0 commit comments