Lines Matching +full:display +full:- +full:related
17 * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
45 * [ CRTC ---> ] Encoder ---> Bridge A ---> Bridge B
52 * Display drivers are responsible for linking encoders with the first bridge
73 * For display drivers that use the atomic helpers
76 * drm_atomic_helper_commit_modeset_disables() (either directly in hand-rolled
77 * commit check and commit tail handlers, or through the higher-level
84 * the bridge chain. Display drivers may use the drm_bridge_connector_init()
86 * connector-related operations exposed by the bridge (see the overview
99 * drm_bridge_add - add the given bridge to the global bridge list
105 mutex_init(&bridge->hpd_mutex); in drm_bridge_add()
108 list_add_tail(&bridge->list, &bridge_list); in drm_bridge_add()
114 * drm_bridge_remove - remove the given bridge from the global bridge list
121 list_del_init(&bridge->list); in drm_bridge_remove()
124 mutex_destroy(&bridge->hpd_mutex); in drm_bridge_remove()
134 state = bridge->funcs->atomic_duplicate_state(bridge); in drm_bridge_atomic_duplicate_priv_state()
135 return state ? &state->base : NULL; in drm_bridge_atomic_duplicate_priv_state()
145 bridge->funcs->atomic_destroy_state(bridge, state); in drm_bridge_atomic_destroy_priv_state()
154 * drm_bridge_attach - attach the bridge to an encoder's chain
166 * If non-NULL the previous bridge must be already attached by a call to this
169 * Note that bridges attached to encoders are auto-detached during encoder
183 return -EINVAL; in drm_bridge_attach()
185 if (previous && (!previous->dev || previous->encoder != encoder)) in drm_bridge_attach()
186 return -EINVAL; in drm_bridge_attach()
188 if (bridge->dev) in drm_bridge_attach()
189 return -EBUSY; in drm_bridge_attach()
191 bridge->dev = encoder->dev; in drm_bridge_attach()
192 bridge->encoder = encoder; in drm_bridge_attach()
195 list_add(&bridge->chain_node, &previous->chain_node); in drm_bridge_attach()
197 list_add(&bridge->chain_node, &encoder->bridge_chain); in drm_bridge_attach()
199 if (bridge->funcs->attach) { in drm_bridge_attach()
200 ret = bridge->funcs->attach(bridge, flags); in drm_bridge_attach()
205 if (bridge->funcs->atomic_reset) { in drm_bridge_attach()
208 state = bridge->funcs->atomic_reset(bridge); in drm_bridge_attach()
214 drm_atomic_private_obj_init(bridge->dev, &bridge->base, in drm_bridge_attach()
215 &state->base, in drm_bridge_attach()
222 if (bridge->funcs->detach) in drm_bridge_attach()
223 bridge->funcs->detach(bridge); in drm_bridge_attach()
226 bridge->dev = NULL; in drm_bridge_attach()
227 bridge->encoder = NULL; in drm_bridge_attach()
228 list_del(&bridge->chain_node); in drm_bridge_attach()
232 bridge->of_node, encoder->name, ret); in drm_bridge_attach()
235 encoder->name, ret); in drm_bridge_attach()
247 if (WARN_ON(!bridge->dev)) in drm_bridge_detach()
250 if (bridge->funcs->atomic_reset) in drm_bridge_detach()
251 drm_atomic_private_obj_fini(&bridge->base); in drm_bridge_detach()
253 if (bridge->funcs->detach) in drm_bridge_detach()
254 bridge->funcs->detach(bridge); in drm_bridge_detach()
256 list_del(&bridge->chain_node); in drm_bridge_detach()
257 bridge->dev = NULL; in drm_bridge_detach()
268 * - The encoder-related operations support control of the bridges in the
277 * finer-grained control.
284 * Mixing atomic and non-atomic versions of the operations is not supported.
286 * - The bus format negotiation operations
291 * transparently for display drivers by the atomic modeset helpers. Only
294 * encoder-related operations. This feature is not supported by the legacy
297 * - The connector-related operations support implementing a &drm_connector
308 * an externally-implemented &drm_connector. Those operations are
312 * implemented, display drivers shall create a &drm_connector instance for
316 * Bridge drivers shall implement the connector-related operations for all
321 * controller of the SoC. Support for the connector-related operations on the
328 * flag will be set. Display drivers shall use the &drm_bridge.ops flags to
332 * read-only memory.
336 * connected-related bridge operations. Connector creation is then controlled
337 * by the flags argument to the drm_bridge_attach() function. Display drivers
344 * %DRM_BRIDGE_ATTACH_NO_CONNECTOR flag is not set. New display drivers
350 * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the
373 encoder = bridge->encoder; in drm_bridge_chain_mode_fixup()
374 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_fixup()
375 if (!bridge->funcs->mode_fixup) in drm_bridge_chain_mode_fixup()
378 if (!bridge->funcs->mode_fixup(bridge, mode, adjusted_mode)) in drm_bridge_chain_mode_fixup()
387 * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
390 * @info: display info against which the mode shall be validated
412 encoder = bridge->encoder; in drm_bridge_chain_mode_valid()
413 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_valid()
416 if (!bridge->funcs->mode_valid) in drm_bridge_chain_mode_valid()
419 ret = bridge->funcs->mode_valid(bridge, info, mode); in drm_bridge_chain_mode_valid()
429 * drm_bridge_chain_disable - disables all bridges in the encoder chain
446 encoder = bridge->encoder; in drm_bridge_chain_disable()
447 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_disable()
448 if (iter->funcs->disable) in drm_bridge_chain_disable()
449 iter->funcs->disable(iter); in drm_bridge_chain_disable()
458 * drm_bridge_chain_post_disable - cleans up after disabling all bridges in the
475 encoder = bridge->encoder; in drm_bridge_chain_post_disable()
476 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_post_disable()
477 if (bridge->funcs->post_disable) in drm_bridge_chain_post_disable()
478 bridge->funcs->post_disable(bridge); in drm_bridge_chain_post_disable()
484 * drm_bridge_chain_mode_set - set proposed mode for all bridges in the
504 encoder = bridge->encoder; in drm_bridge_chain_mode_set()
505 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_mode_set()
506 if (bridge->funcs->mode_set) in drm_bridge_chain_mode_set()
507 bridge->funcs->mode_set(bridge, mode, adjusted_mode); in drm_bridge_chain_mode_set()
513 * drm_bridge_chain_pre_enable - prepares for enabling all bridges in the
531 encoder = bridge->encoder; in drm_bridge_chain_pre_enable()
532 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_pre_enable()
533 if (iter->funcs->pre_enable) in drm_bridge_chain_pre_enable()
534 iter->funcs->pre_enable(iter); in drm_bridge_chain_pre_enable()
543 * drm_bridge_chain_enable - enables all bridges in the encoder chain
559 encoder = bridge->encoder; in drm_bridge_chain_enable()
560 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_bridge_chain_enable()
561 if (bridge->funcs->enable) in drm_bridge_chain_enable()
562 bridge->funcs->enable(bridge); in drm_bridge_chain_enable()
568 * drm_atomic_bridge_chain_disable - disables all bridges in the encoder chain
588 encoder = bridge->encoder; in drm_atomic_bridge_chain_disable()
589 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_disable()
590 if (iter->funcs->atomic_disable) { in drm_atomic_bridge_chain_disable()
599 iter->funcs->atomic_disable(iter, old_bridge_state); in drm_atomic_bridge_chain_disable()
600 } else if (iter->funcs->disable) { in drm_atomic_bridge_chain_disable()
601 iter->funcs->disable(iter); in drm_atomic_bridge_chain_disable()
611 * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
631 encoder = bridge->encoder; in drm_atomic_bridge_chain_post_disable()
632 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_post_disable()
633 if (bridge->funcs->atomic_post_disable) { in drm_atomic_bridge_chain_post_disable()
642 bridge->funcs->atomic_post_disable(bridge, in drm_atomic_bridge_chain_post_disable()
644 } else if (bridge->funcs->post_disable) { in drm_atomic_bridge_chain_post_disable()
645 bridge->funcs->post_disable(bridge); in drm_atomic_bridge_chain_post_disable()
652 * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
673 encoder = bridge->encoder; in drm_atomic_bridge_chain_pre_enable()
674 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_pre_enable()
675 if (iter->funcs->atomic_pre_enable) { in drm_atomic_bridge_chain_pre_enable()
684 iter->funcs->atomic_pre_enable(iter, old_bridge_state); in drm_atomic_bridge_chain_pre_enable()
685 } else if (iter->funcs->pre_enable) { in drm_atomic_bridge_chain_pre_enable()
686 iter->funcs->pre_enable(iter); in drm_atomic_bridge_chain_pre_enable()
696 * drm_atomic_bridge_chain_enable - enables all bridges in the encoder chain
715 encoder = bridge->encoder; in drm_atomic_bridge_chain_enable()
716 list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_enable()
717 if (bridge->funcs->atomic_enable) { in drm_atomic_bridge_chain_enable()
726 bridge->funcs->atomic_enable(bridge, old_bridge_state); in drm_atomic_bridge_chain_enable()
727 } else if (bridge->funcs->enable) { in drm_atomic_bridge_chain_enable()
728 bridge->funcs->enable(bridge); in drm_atomic_bridge_chain_enable()
738 if (bridge->funcs->atomic_check) { in drm_atomic_bridge_check()
742 bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in drm_atomic_bridge_check()
745 return -EINVAL; in drm_atomic_bridge_check()
747 ret = bridge->funcs->atomic_check(bridge, bridge_state, in drm_atomic_bridge_check()
751 } else if (bridge->funcs->mode_fixup) { in drm_atomic_bridge_check()
752 if (!bridge->funcs->mode_fixup(bridge, &crtc_state->mode, in drm_atomic_bridge_check()
753 &crtc_state->adjusted_mode)) in drm_atomic_bridge_check()
754 return -EINVAL; in drm_atomic_bridge_check()
773 cur_state = drm_atomic_get_new_bridge_state(crtc_state->state, in select_bus_fmt_recursive()
782 if (!cur_bridge->funcs->atomic_get_input_bus_fmts) { in select_bus_fmt_recursive()
797 cur_state->input_bus_cfg.format = MEDIA_BUS_FMT_FIXED; in select_bus_fmt_recursive()
798 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
805 * If the driver implements ->atomic_get_input_bus_fmts() it in select_bus_fmt_recursive()
809 return -EINVAL; in select_bus_fmt_recursive()
811 in_bus_fmts = cur_bridge->funcs->atomic_get_input_bus_fmts(cur_bridge, in select_bus_fmt_recursive()
818 return -ENOTSUPP; in select_bus_fmt_recursive()
820 return -ENOMEM; in select_bus_fmt_recursive()
823 cur_state->input_bus_cfg.format = in_bus_fmts[0]; in select_bus_fmt_recursive()
824 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
833 if (ret != -ENOTSUPP) in select_bus_fmt_recursive()
838 cur_state->input_bus_cfg.format = in_bus_fmts[i]; in select_bus_fmt_recursive()
839 cur_state->output_bus_cfg.format = out_bus_fmt; in select_bus_fmt_recursive()
858 * support transcoding into a specific output format -ENOTSUPP is returned and
860 * combinations worked, -ENOTSUPP is returned and the atomic modeset will fail.
885 struct drm_connector *conn = conn_state->connector; in drm_atomic_bridge_chain_select_bus_fmts()
886 struct drm_encoder *encoder = bridge->encoder; in drm_atomic_bridge_chain_select_bus_fmts()
893 last_bridge = list_last_entry(&encoder->bridge_chain, in drm_atomic_bridge_chain_select_bus_fmts()
895 last_bridge_state = drm_atomic_get_new_bridge_state(crtc_state->state, in drm_atomic_bridge_chain_select_bus_fmts()
898 if (last_bridge->funcs->atomic_get_output_bus_fmts) { in drm_atomic_bridge_chain_select_bus_fmts()
899 const struct drm_bridge_funcs *funcs = last_bridge->funcs; in drm_atomic_bridge_chain_select_bus_fmts()
902 * If the driver implements ->atomic_get_output_bus_fmts() it in drm_atomic_bridge_chain_select_bus_fmts()
906 return -EINVAL; in drm_atomic_bridge_chain_select_bus_fmts()
908 out_bus_fmts = funcs->atomic_get_output_bus_fmts(last_bridge, in drm_atomic_bridge_chain_select_bus_fmts()
914 return -ENOTSUPP; in drm_atomic_bridge_chain_select_bus_fmts()
916 return -ENOMEM; in drm_atomic_bridge_chain_select_bus_fmts()
921 return -ENOMEM; in drm_atomic_bridge_chain_select_bus_fmts()
923 if (conn->display_info.num_bus_formats && in drm_atomic_bridge_chain_select_bus_fmts()
924 conn->display_info.bus_formats) in drm_atomic_bridge_chain_select_bus_fmts()
925 out_bus_fmts[0] = conn->display_info.bus_formats[0]; in drm_atomic_bridge_chain_select_bus_fmts()
933 if (ret != -ENOTSUPP) in drm_atomic_bridge_chain_select_bus_fmts()
970 output_flags = conn->display_info.bus_flags; in drm_atomic_bridge_propagate_bus_flags()
979 output_flags = next_bridge_state->input_bus_cfg.flags; in drm_atomic_bridge_propagate_bus_flags()
982 bridge_state->output_bus_cfg.flags = output_flags; in drm_atomic_bridge_propagate_bus_flags()
990 bridge_state->input_bus_cfg.flags = output_flags; in drm_atomic_bridge_propagate_bus_flags()
994 * drm_atomic_bridge_chain_check() - Do an atomic check on the bridge chain
1012 struct drm_connector *conn = conn_state->connector; in drm_atomic_bridge_chain_check()
1025 encoder = bridge->encoder; in drm_atomic_bridge_chain_check()
1026 list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) { in drm_atomic_bridge_chain_check()
1037 crtc_state->state); in drm_atomic_bridge_chain_check()
1052 * drm_bridge_detect - check if anything is attached to the bridge output
1066 if (!(bridge->ops & DRM_BRIDGE_OP_DETECT)) in drm_bridge_detect()
1069 return bridge->funcs->detect(bridge); in drm_bridge_detect()
1074 * drm_bridge_get_modes - fill all modes currently valid for the sink into the
1090 if (!(bridge->ops & DRM_BRIDGE_OP_MODES)) in drm_bridge_get_modes()
1093 return bridge->funcs->get_modes(bridge, connector); in drm_bridge_get_modes()
1098 * drm_bridge_get_edid - get the EDID data of the connected display
1112 if (!(bridge->ops & DRM_BRIDGE_OP_EDID)) in drm_bridge_get_edid()
1115 return bridge->funcs->get_edid(bridge, connector); in drm_bridge_get_edid()
1120 * drm_bridge_hpd_enable - enable hot plug detection for the bridge
1122 * @cb: hot-plug detection callback
1123 * @data: data to be passed to the hot-plug detection callback
1131 * bridge->ops. This function shall not be called when the flag is not set.
1142 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_enable()
1145 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1147 if (WARN(bridge->hpd_cb, "Hot plug detection already enabled\n")) in drm_bridge_hpd_enable()
1150 bridge->hpd_cb = cb; in drm_bridge_hpd_enable()
1151 bridge->hpd_data = data; in drm_bridge_hpd_enable()
1153 if (bridge->funcs->hpd_enable) in drm_bridge_hpd_enable()
1154 bridge->funcs->hpd_enable(bridge); in drm_bridge_hpd_enable()
1157 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_enable()
1162 * drm_bridge_hpd_disable - disable hot plug detection for the bridge
1171 * bridge->ops. This function shall not be called when the flag is not set.
1175 if (!(bridge->ops & DRM_BRIDGE_OP_HPD)) in drm_bridge_hpd_disable()
1178 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1179 if (bridge->funcs->hpd_disable) in drm_bridge_hpd_disable()
1180 bridge->funcs->hpd_disable(bridge); in drm_bridge_hpd_disable()
1182 bridge->hpd_cb = NULL; in drm_bridge_hpd_disable()
1183 bridge->hpd_data = NULL; in drm_bridge_hpd_disable()
1184 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_disable()
1189 * drm_bridge_hpd_notify - notify hot plug detection events
1202 mutex_lock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1203 if (bridge->hpd_cb) in drm_bridge_hpd_notify()
1204 bridge->hpd_cb(bridge->hpd_data, status); in drm_bridge_hpd_notify()
1205 mutex_unlock(&bridge->hpd_mutex); in drm_bridge_hpd_notify()
1211 * of_drm_find_bridge - find the bridge corresponding to the device node in
1226 if (bridge->of_node == np) { in of_drm_find_bridge()