Lines Matching +full:display +full:- +full:related
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
44 * [ CRTC ---> ] Encoder ---> Bridge A ---> Bridge B
51 * Display drivers are responsible for linking encoders with the first bridge
72 * For display drivers that use the atomic helpers
75 * drm_atomic_helper_commit_modeset_disables() (either directly in hand-rolled
76 * commit check and commit tail handlers, or through the higher-level
83 * the bridge chain. Display drivers may use the drm_bridge_connector_init()
85 * connector-related operations exposed by the bridge (see the overview
98 * drm_bridge_add - add the given bridge to the global bridge list
104 mutex_init(&bridge->hpd_mutex); in drm_bridge_add()
107 list_add_tail(&bridge->list, &bridge_list); in drm_bridge_add()
113 * drm_bridge_remove - remove the given bridge from the global bridge list
120 list_del_init(&bridge->list); in drm_bridge_remove()
123 mutex_destroy(&bridge->hpd_mutex); in drm_bridge_remove()
133 state = bridge->funcs->atomic_duplicate_state(bridge); in drm_bridge_atomic_duplicate_priv_state()
134 return state ? &state->base : NULL; in drm_bridge_atomic_duplicate_priv_state()
144 bridge->funcs->atomic_destroy_state(bridge, state); in drm_bridge_atomic_destroy_priv_state()
153 * drm_bridge_attach - attach the bridge to an encoder's chain
165 * If non-NULL the previous bridge must be already attached by a call to this
168 * Note that bridges attached to encoders are auto-detached during encoder
182 return -EINVAL; in drm_bridge_attach()
184 if (previous && (!previous->dev || previous->encoder != encoder)) in drm_bridge_attach()
185 return -EINVAL; in drm_bridge_attach()
187 if (bridge->dev) in drm_bridge_attach()
188 return -EBUSY; in drm_bridge_attach()
190 bridge->dev = encoder->dev; in drm_bridge_attach()
191 bridge->encoder = encoder; in drm_bridge_attach()
194 list_add(&bridge->chain_node, &previous->chain_node); in drm_bridge_attach()
196 list_add(&bridge->chain_node, &encoder->bridge_chain); in drm_bridge_attach()
198 if (bridge->funcs->attach) { in drm_bridge_attach()
199 ret = bridge->funcs->attach(bridge, flags); in drm_bridge_attach()
204 if (bridge->funcs->atomic_reset) { in drm_bridge_attach()
207 state = bridge->funcs->atomic_reset(bridge); in drm_bridge_attach()
213 drm_atomic_private_obj_init(bridge->dev, &bridge->base, in drm_bridge_attach()
214 &state->base, in drm_bridge_attach()
221 if (bridge->funcs->detach) in drm_bridge_attach()
222 bridge->funcs->detach(bridge); in drm_bridge_attach()
225 bridge->dev = NULL; in drm_bridge_attach()
226 bridge->encoder = NULL; in drm_bridge_attach()
227 list_del(&bridge->chain_node); in drm_bridge_attach()
237 if (WARN_ON(!bridge->dev)) in drm_bridge_detach()
240 if (bridge->funcs->atomic_reset) in drm_bridge_detach()
241 drm_atomic_private_obj_fini(&bridge->base); in drm_bridge_detach()
243 if (bridge->funcs->detach) in drm_bridge_detach()
244 bridge->funcs->detach(bridge); in drm_bridge_detach()
246 list_del(&bridge->chain_node); in drm_bridge_detach()
247 bridge->dev = NULL; in drm_bridge_detach()
258 * - The encoder-related operations support control of the bridges in the
267 * finer-grained control.
274 * Mixing atomic and non-atomic versions of the operations is not supported.
276 * - The bus format negotiation operations
281 * transparently for display drivers by the atomic modeset helpers. Only
284 * encoder-related operations. This feature is not supported by the legacy
287 * - The connector-related operations support implementing a &drm_connector
298 * an externally-implemented &drm_connector. Those operations are
302 * implemented, display drivers shall create a &drm_connector instance for
306 * Bridge drivers shall implement the connector-related operations for all
311 * controller of the SoC. Support for the connector-related operations on the
318 * flag will be set. Display drivers shall use the &drm_bridge.ops flags to
322 * read-only memory.
326 * connected-related bridge operations. Connector creation is then controlled
327 * by the flags argument to the drm_bridge_attach() function. Display drivers
334 * %DRM_BRIDGE_ATTACH_NO_CONNECTOR flag is not set. New display drivers
340 * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the
363 encoder = bridge->encoder; in drm_bridge_chain_mode_fixup()
364 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_fixup()
365 if (!bridge->funcs->mode_fixup) in drm_bridge_chain_mode_fixup()
368 if (!bridge->funcs->mode_fixup(bridge, mode, adjusted_mode)) in drm_bridge_chain_mode_fixup()
377 * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
380 * @info: display info against which the mode shall be validated
402 encoder = bridge->encoder; in drm_bridge_chain_mode_valid()
403 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_valid()
406 if (!bridge->funcs->mode_valid) in drm_bridge_chain_mode_valid()
409 ret = bridge->funcs->mode_valid(bridge, info, mode); in drm_bridge_chain_mode_valid()
419 * drm_bridge_chain_disable - disables all bridges in the encoder chain
436 encoder = bridge->encoder; in drm_bridge_chain_disable()
437 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_disable()
438 if (iter->funcs->disable) in drm_bridge_chain_disable()
439 iter->funcs->disable(iter); in drm_bridge_chain_disable()
448 * drm_bridge_chain_post_disable - cleans up after disabling all bridges in the
465 encoder = bridge->encoder; in drm_bridge_chain_post_disable()
466 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_post_disable()
467 if (bridge->funcs->post_disable) in drm_bridge_chain_post_disable()
468 bridge->funcs->post_disable(bridge); in drm_bridge_chain_post_disable()
474 * drm_bridge_chain_mode_set - set proposed mode for all bridges in the
494 encoder = bridge->encoder; in drm_bridge_chain_mode_set()
495 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_set()
496 if (bridge->funcs->mode_set) in drm_bridge_chain_mode_set()
497 bridge->funcs->mode_set(bridge, mode, adjusted_mode); in drm_bridge_chain_mode_set()
503 * drm_bridge_chain_pre_enable - prepares for enabling all bridges in the
521 encoder = bridge->encoder; in drm_bridge_chain_pre_enable()
522 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_pre_enable()
523 if (iter->funcs->pre_enable) in drm_bridge_chain_pre_enable()
524 iter->funcs->pre_enable(iter); in drm_bridge_chain_pre_enable()
530 * drm_bridge_chain_enable - enables all bridges in the encoder chain
546 encoder = bridge->encoder; in drm_bridge_chain_enable()
547 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_enable()
548 if (bridge->funcs->enable) in drm_bridge_chain_enable()
549 bridge->funcs->enable(bridge); in drm_bridge_chain_enable()
555 * drm_atomic_bridge_chain_disable - disables all bridges in the encoder chain
575 encoder = bridge->encoder; in drm_atomic_bridge_chain_disable()
576 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_disable()
577 if (iter->funcs->atomic_disable) { in drm_atomic_bridge_chain_disable()
586 iter->funcs->atomic_disable(iter, old_bridge_state); in drm_atomic_bridge_chain_disable()
587 } else if (iter->funcs->disable) { in drm_atomic_bridge_chain_disable()
588 iter->funcs->disable(iter); in drm_atomic_bridge_chain_disable()
598 * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
618 encoder = bridge->encoder; in drm_atomic_bridge_chain_post_disable()
619 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_post_disable()
620 if (bridge->funcs->atomic_post_disable) { in drm_atomic_bridge_chain_post_disable()
629 bridge->funcs->atomic_post_disable(bridge, in drm_atomic_bridge_chain_post_disable()
631 } else if (bridge->funcs->post_disable) { in drm_atomic_bridge_chain_post_disable()
632 bridge->funcs->post_disable(bridge); in drm_atomic_bridge_chain_post_disable()
639 * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
660 encoder = bridge->encoder; in drm_atomic_bridge_chain_pre_enable()
661 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_pre_enable()
662 if (iter->funcs->atomic_pre_enable) { in drm_atomic_bridge_chain_pre_enable()
671 iter->funcs->atomic_pre_enable(iter, old_bridge_state); in drm_atomic_bridge_chain_pre_enable()
672 } else if (iter->funcs->pre_enable) { in drm_atomic_bridge_chain_pre_enable()
673 iter->funcs->pre_enable(iter); in drm_atomic_bridge_chain_pre_enable()
683 * drm_atomic_bridge_chain_enable - enables all bridges in the encoder chain
702 encoder = bridge->encoder; in drm_atomic_bridge_chain_enable()
703 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_enable()
704 if (bridge->funcs->atomic_enable) { in drm_atomic_bridge_chain_enable()
713 bridge->funcs->atomic_enable(bridge, old_bridge_state); in drm_atomic_bridge_chain_enable()
714 } else if (bridge->funcs->enable) { in drm_atomic_bridge_chain_enable()
715 bridge->funcs->enable(bridge); in drm_atomic_bridge_chain_enable()
725 if (bridge->funcs->atomic_check) { in drm_atomic_bridge_check()
729 bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in drm_atomic_bridge_check()
732 return -EINVAL; in drm_atomic_bridge_check()
734 ret = bridge->funcs->atomic_check(bridge, bridge_state, in drm_atomic_bridge_check()
738 } else if (bridge->funcs->mode_fixup) { in drm_atomic_bridge_check()
739 if (!bridge->funcs->mode_fixup(bridge, &crtc_state->mode, in drm_atomic_bridge_check()
740 &crtc_state->adjusted_mode)) in drm_atomic_bridge_check()
741 return -EINVAL; in drm_atomic_bridge_check()
760 cur_state = drm_atomic_get_new_bridge_state(crtc_state->state, in select_bus_fmt_recursive()
769 if (!cur_bridge->funcs->atomic_get_input_bus_fmts) { in select_bus_fmt_recursive()
784 cur_state->input_bus_cfg.format = MEDIA_BUS_FMT_FIXED; in select_bus_fmt_recursive()
785 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
792 * If the driver implements ->atomic_get_input_bus_fmts() it in select_bus_fmt_recursive()
796 return -EINVAL; in select_bus_fmt_recursive()
798 in_bus_fmts = cur_bridge->funcs->atomic_get_input_bus_fmts(cur_bridge, in select_bus_fmt_recursive()
805 return -ENOTSUPP; in select_bus_fmt_recursive()
807 return -ENOMEM; in select_bus_fmt_recursive()
810 cur_state->input_bus_cfg.format = in_bus_fmts[0]; in select_bus_fmt_recursive()
811 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
820 if (ret != -ENOTSUPP) in select_bus_fmt_recursive()
825 cur_state->input_bus_cfg.format = in_bus_fmts[i]; in select_bus_fmt_recursive()
826 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
845 * support transcoding into a specific output format -ENOTSUPP is returned and
847 * combinations worked, -ENOTSUPP is returned and the atomic modeset will fail.
872 struct drm_connector *conn = conn_state->connector; in drm_atomic_bridge_chain_select_bus_fmts()
873 struct drm_encoder *encoder = bridge->encoder; in drm_atomic_bridge_chain_select_bus_fmts()
880 last_bridge = list_last_entry(&encoder->bridge_chain, in drm_atomic_bridge_chain_select_bus_fmts()
882 last_bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in drm_atomic_bridge_chain_select_bus_fmts()
885 if (last_bridge->funcs->atomic_get_output_bus_fmts) { in drm_atomic_bridge_chain_select_bus_fmts()
886 const struct drm_bridge_funcs *funcs = last_bridge->funcs; in drm_atomic_bridge_chain_select_bus_fmts()
889 * If the driver implements ->atomic_get_output_bus_fmts() it in drm_atomic_bridge_chain_select_bus_fmts()
893 return -EINVAL; in drm_atomic_bridge_chain_select_bus_fmts()
895 out_bus_fmts = funcs->atomic_get_output_bus_fmts(last_bridge, in drm_atomic_bridge_chain_select_bus_fmts()
901 return -ENOTSUPP; in drm_atomic_bridge_chain_select_bus_fmts()
903 return -ENOMEM; in drm_atomic_bridge_chain_select_bus_fmts()
908 return -ENOMEM; in drm_atomic_bridge_chain_select_bus_fmts()
910 if (conn->display_info.num_bus_formats && in drm_atomic_bridge_chain_select_bus_fmts()
911 conn->display_info.bus_formats) in drm_atomic_bridge_chain_select_bus_fmts()
912 out_bus_fmts[0] = conn->display_info.bus_formats[0]; in drm_atomic_bridge_chain_select_bus_fmts()
920 if (ret != -ENOTSUPP) in drm_atomic_bridge_chain_select_bus_fmts()
957 output_flags = conn->display_info.bus_flags; in drm_atomic_bridge_propagate_bus_flags()
966 output_flags = next_bridge_state->input_bus_cfg.flags; in drm_atomic_bridge_propagate_bus_flags()
969 bridge_state->output_bus_cfg.flags = output_flags; in drm_atomic_bridge_propagate_bus_flags()
977 bridge_state->input_bus_cfg.flags = output_flags; in drm_atomic_bridge_propagate_bus_flags()
981 * drm_atomic_bridge_chain_check() - Do an atomic check on the bridge chain
999 struct drm_connector *conn = conn_state->connector; in drm_atomic_bridge_chain_check()
1012 encoder = bridge->encoder; in drm_atomic_bridge_chain_check()
1013 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_check()
1024 crtc_state->state); in drm_atomic_bridge_chain_check()
1039 * drm_bridge_detect - check if anything is attached to the bridge output
1053 if (!(bridge->ops & DRM_BRIDGE_OP_DETECT)) in drm_bridge_detect()
1056 return bridge->funcs->detect(bridge); in drm_bridge_detect()
1061 * drm_bridge_get_modes - fill all modes currently valid for the sink into the
1077 if (!(bridge->ops & DRM_BRIDGE_OP_MODES)) in drm_bridge_get_modes()
1080 return bridge->funcs->get_modes(bridge, connector); in drm_bridge_get_modes()
1085 * drm_bridge_get_edid - get the EDID data of the connected display
1099 if (!(bridge->ops & DRM_BRIDGE_OP_EDID)) in drm_bridge_get_edid()
1102 return bridge->funcs->get_edid(bridge, connector); in drm_bridge_get_edid()
1107 * drm_bridge_hpd_enable - enable hot plug detection for the bridge
1109 * @cb: hot-plug detection callback
1110 * @data: data to be passed to the hot-plug detection callback
1118 * bridge->ops. This function shall not be called when the flag is not set.
1129 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_enable()
1132 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1134 if (WARN(bridge->hpd_cb, "Hot plug detection already enabled\n")) in drm_bridge_hpd_enable()
1137 bridge->hpd_cb = cb; in drm_bridge_hpd_enable()
1138 bridge->hpd_data = data; in drm_bridge_hpd_enable()
1140 if (bridge->funcs->hpd_enable) in drm_bridge_hpd_enable()
1141 bridge->funcs->hpd_enable(bridge); in drm_bridge_hpd_enable()
1144 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1149 * drm_bridge_hpd_disable - disable hot plug detection for the bridge
1158 * bridge->ops. This function shall not be called when the flag is not set.
1162 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_disable()
1165 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1166 if (bridge->funcs->hpd_disable) in drm_bridge_hpd_disable()
1167 bridge->funcs->hpd_disable(bridge); in drm_bridge_hpd_disable()
1169 bridge->hpd_cb = NULL; in drm_bridge_hpd_disable()
1170 bridge->hpd_data = NULL; in drm_bridge_hpd_disable()
1171 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1176 * drm_bridge_hpd_notify - notify hot plug detection events
1189 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1190 if (bridge->hpd_cb) in drm_bridge_hpd_notify()
1191 bridge->hpd_cb(bridge->hpd_data, status); in drm_bridge_hpd_notify()
1192 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1198 * of_drm_find_bridge - find the bridge corresponding to the device node in
1213 if (bridge->of_node == np) { in of_drm_find_bridge()