Home | History | Annotate | Line # | Download | only in drm
      1 /*	$NetBSD: drm_bridge.c,v 1.5 2021/12/18 23:44:57 riastradh Exp $	*/
      2 
      3 /*
      4  * Copyright (c) 2014 Samsung Electronics Co., Ltd
      5  *
      6  * Permission is hereby granted, free of charge, to any person obtaining a
      7  * copy of this software and associated documentation files (the "Software"),
      8  * to deal in the Software without restriction, including without limitation
      9  * the rights to use, copy, modify, merge, publish, distribute, sub license,
     10  * and/or sell copies of the Software, and to permit persons to whom the
     11  * Software is furnished to do so, subject to the following conditions:
     12  *
     13  * The above copyright notice and this permission notice (including the
     14  * next paragraph) shall be included in all copies or substantial portions
     15  * of the Software.
     16  *
     17  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
     18  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
     19  * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
     20  * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
     21  * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
     22  * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
     23  * DEALINGS IN THE SOFTWARE.
     24  */
     25 
     26 #include <sys/cdefs.h>
     27 __KERNEL_RCSID(0, "$NetBSD: drm_bridge.c,v 1.5 2021/12/18 23:44:57 riastradh Exp $");
     28 
     29 #include <linux/err.h>
     30 #include <linux/module.h>
     31 #include <linux/mutex.h>
     32 
     33 #include <drm/drm_bridge.h>
     34 #include <drm/drm_encoder.h>
     35 
     36 #include "drm_crtc_internal.h"
     37 
     38 /**
     39  * DOC: overview
     40  *
     41  * &struct drm_bridge represents a device that hangs on to an encoder. These are
     42  * handy when a regular &drm_encoder entity isn't enough to represent the entire
     43  * encoder chain.
     44  *
     45  * A bridge is always attached to a single &drm_encoder at a time, but can be
     46  * either connected to it directly, or through an intermediate bridge::
     47  *
     48  *     encoder ---> bridge B ---> bridge A
     49  *
     50  * Here, the output of the encoder feeds to bridge B, and that furthers feeds to
     51  * bridge A.
     52  *
     53  * The driver using the bridge is responsible to make the associations between
     54  * the encoder and bridges. Once these links are made, the bridges will
     55  * participate along with encoder functions to perform mode_set/enable/disable
     56  * through the ops provided in &drm_bridge_funcs.
     57  *
     58  * drm_bridge, like drm_panel, aren't drm_mode_object entities like planes,
     59  * CRTCs, encoders or connectors and hence are not visible to userspace. They
     60  * just provide additional hooks to get the desired output at the end of the
     61  * encoder chain.
     62  *
     63  * Bridges can also be chained up using the &drm_bridge.chain_node field.
     64  *
     65  * Both legacy CRTC helpers and the new atomic modeset helpers support bridges.
     66  */
     67 
     68 #ifdef __NetBSD__
     69 static struct mutex bridge_lock;
     70 static struct list_head bridge_list = LIST_HEAD_INIT(bridge_list);
     71 #else
     72 static DEFINE_MUTEX(bridge_lock);
     73 static LIST_HEAD(bridge_list);
     74 #endif
     75 
     76 #ifdef __NetBSD__
     77 void drm_bridge_init_lock(void)
     78 {
     79 	linux_mutex_init(&bridge_lock);
     80 }
     81 void drm_bridge_fini_lock(void)
     82 {
     83 	linux_mutex_destroy(&bridge_lock);
     84 }
     85 #endif
     86 
     87 /**
     88  * drm_bridge_add - add the given bridge to the global bridge list
     89  *
     90  * @bridge: bridge control structure
     91  */
     92 void drm_bridge_add(struct drm_bridge *bridge)
     93 {
     94 	mutex_lock(&bridge_lock);
     95 	list_add_tail(&bridge->list, &bridge_list);
     96 	mutex_unlock(&bridge_lock);
     97 }
     98 EXPORT_SYMBOL(drm_bridge_add);
     99 
    100 /**
    101  * drm_bridge_remove - remove the given bridge from the global bridge list
    102  *
    103  * @bridge: bridge control structure
    104  */
    105 void drm_bridge_remove(struct drm_bridge *bridge)
    106 {
    107 	mutex_lock(&bridge_lock);
    108 	list_del_init(&bridge->list);
    109 	mutex_unlock(&bridge_lock);
    110 }
    111 EXPORT_SYMBOL(drm_bridge_remove);
    112 
    113 /**
    114  * drm_bridge_attach - attach the bridge to an encoder's chain
    115  *
    116  * @encoder: DRM encoder
    117  * @bridge: bridge to attach
    118  * @previous: previous bridge in the chain (optional)
    119  *
    120  * Called by a kms driver to link the bridge to an encoder's chain. The previous
    121  * argument specifies the previous bridge in the chain. If NULL, the bridge is
    122  * linked directly at the encoder's output. Otherwise it is linked at the
    123  * previous bridge's output.
    124  *
    125  * If non-NULL the previous bridge must be already attached by a call to this
    126  * function.
    127  *
    128  * Note that bridges attached to encoders are auto-detached during encoder
    129  * cleanup in drm_encoder_cleanup(), so drm_bridge_attach() should generally
    130  * *not* be balanced with a drm_bridge_detach() in driver code.
    131  *
    132  * RETURNS:
    133  * Zero on success, error code on failure
    134  */
    135 int drm_bridge_attach(struct drm_encoder *encoder, struct drm_bridge *bridge,
    136 		      struct drm_bridge *previous)
    137 {
    138 	int ret;
    139 
    140 	if (!encoder || !bridge)
    141 		return -EINVAL;
    142 
    143 	if (previous && (!previous->dev || previous->encoder != encoder))
    144 		return -EINVAL;
    145 
    146 	if (bridge->dev)
    147 		return -EBUSY;
    148 
    149 	bridge->dev = encoder->dev;
    150 	bridge->encoder = encoder;
    151 
    152 	if (previous)
    153 		list_add(&bridge->chain_node, &previous->chain_node);
    154 	else
    155 		list_add(&bridge->chain_node, &encoder->bridge_chain);
    156 
    157 	if (bridge->funcs->attach) {
    158 		ret = bridge->funcs->attach(bridge);
    159 		if (ret < 0) {
    160 			list_del(&bridge->chain_node);
    161 			bridge->dev = NULL;
    162 			bridge->encoder = NULL;
    163 			return ret;
    164 		}
    165 	}
    166 
    167 	return 0;
    168 }
    169 EXPORT_SYMBOL(drm_bridge_attach);
    170 
    171 void drm_bridge_detach(struct drm_bridge *bridge)
    172 {
    173 	if (WARN_ON(!bridge))
    174 		return;
    175 
    176 	if (WARN_ON(!bridge->dev))
    177 		return;
    178 
    179 	if (bridge->funcs->detach)
    180 		bridge->funcs->detach(bridge);
    181 
    182 	list_del(&bridge->chain_node);
    183 	bridge->dev = NULL;
    184 }
    185 
    186 /**
    187  * DOC: bridge callbacks
    188  *
    189  * The &drm_bridge_funcs ops are populated by the bridge driver. The DRM
    190  * internals (atomic and CRTC helpers) use the helpers defined in drm_bridge.c
    191  * These helpers call a specific &drm_bridge_funcs op for all the bridges
    192  * during encoder configuration.
    193  *
    194  * For detailed specification of the bridge callbacks see &drm_bridge_funcs.
    195  */
    196 
    197 /**
    198  * drm_bridge_chain_mode_fixup - fixup proposed mode for all bridges in the
    199  *				 encoder chain
    200  * @bridge: bridge control structure
    201  * @mode: desired mode to be set for the bridge
    202  * @adjusted_mode: updated mode that works for this bridge
    203  *
    204  * Calls &drm_bridge_funcs.mode_fixup for all the bridges in the
    205  * encoder chain, starting from the first bridge to the last.
    206  *
    207  * Note: the bridge passed should be the one closest to the encoder
    208  *
    209  * RETURNS:
    210  * true on success, false on failure
    211  */
    212 bool drm_bridge_chain_mode_fixup(struct drm_bridge *bridge,
    213 				 const struct drm_display_mode *mode,
    214 				 struct drm_display_mode *adjusted_mode)
    215 {
    216 	struct drm_encoder *encoder;
    217 
    218 	if (!bridge)
    219 		return true;
    220 
    221 	encoder = bridge->encoder;
    222 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    223 		if (!bridge->funcs->mode_fixup)
    224 			continue;
    225 
    226 		if (!bridge->funcs->mode_fixup(bridge, mode, adjusted_mode))
    227 			return false;
    228 	}
    229 
    230 	return true;
    231 }
    232 EXPORT_SYMBOL(drm_bridge_chain_mode_fixup);
    233 
    234 /**
    235  * drm_bridge_chain_mode_valid - validate the mode against all bridges in the
    236  *				 encoder chain.
    237  * @bridge: bridge control structure
    238  * @mode: desired mode to be validated
    239  *
    240  * Calls &drm_bridge_funcs.mode_valid for all the bridges in the encoder
    241  * chain, starting from the first bridge to the last. If at least one bridge
    242  * does not accept the mode the function returns the error code.
    243  *
    244  * Note: the bridge passed should be the one closest to the encoder.
    245  *
    246  * RETURNS:
    247  * MODE_OK on success, drm_mode_status Enum error code on failure
    248  */
    249 enum drm_mode_status
    250 drm_bridge_chain_mode_valid(struct drm_bridge *bridge,
    251 			    const struct drm_display_mode *mode)
    252 {
    253 	struct drm_encoder *encoder;
    254 
    255 	if (!bridge)
    256 		return MODE_OK;
    257 
    258 	encoder = bridge->encoder;
    259 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    260 		enum drm_mode_status ret;
    261 
    262 		if (!bridge->funcs->mode_valid)
    263 			continue;
    264 
    265 		ret = bridge->funcs->mode_valid(bridge, mode);
    266 		if (ret != MODE_OK)
    267 			return ret;
    268 	}
    269 
    270 	return MODE_OK;
    271 }
    272 EXPORT_SYMBOL(drm_bridge_chain_mode_valid);
    273 
    274 /**
    275  * drm_bridge_chain_disable - disables all bridges in the encoder chain
    276  * @bridge: bridge control structure
    277  *
    278  * Calls &drm_bridge_funcs.disable op for all the bridges in the encoder
    279  * chain, starting from the last bridge to the first. These are called before
    280  * calling the encoder's prepare op.
    281  *
    282  * Note: the bridge passed should be the one closest to the encoder
    283  */
    284 void drm_bridge_chain_disable(struct drm_bridge *bridge)
    285 {
    286 	struct drm_encoder *encoder;
    287 	struct drm_bridge *iter;
    288 
    289 	if (!bridge)
    290 		return;
    291 
    292 	encoder = bridge->encoder;
    293 	list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
    294 		if (iter->funcs->disable)
    295 			iter->funcs->disable(iter);
    296 
    297 		if (iter == bridge)
    298 			break;
    299 	}
    300 }
    301 EXPORT_SYMBOL(drm_bridge_chain_disable);
    302 
    303 /**
    304  * drm_bridge_chain_post_disable - cleans up after disabling all bridges in the
    305  *				   encoder chain
    306  * @bridge: bridge control structure
    307  *
    308  * Calls &drm_bridge_funcs.post_disable op for all the bridges in the
    309  * encoder chain, starting from the first bridge to the last. These are called
    310  * after completing the encoder's prepare op.
    311  *
    312  * Note: the bridge passed should be the one closest to the encoder
    313  */
    314 void drm_bridge_chain_post_disable(struct drm_bridge *bridge)
    315 {
    316 	struct drm_encoder *encoder;
    317 
    318 	if (!bridge)
    319 		return;
    320 
    321 	encoder = bridge->encoder;
    322 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    323 		if (bridge->funcs->post_disable)
    324 			bridge->funcs->post_disable(bridge);
    325 	}
    326 }
    327 EXPORT_SYMBOL(drm_bridge_chain_post_disable);
    328 
    329 /**
    330  * drm_bridge_chain_mode_set - set proposed mode for all bridges in the
    331  *			       encoder chain
    332  * @bridge: bridge control structure
    333  * @mode: desired mode to be set for the encoder chain
    334  * @adjusted_mode: updated mode that works for this encoder chain
    335  *
    336  * Calls &drm_bridge_funcs.mode_set op for all the bridges in the
    337  * encoder chain, starting from the first bridge to the last.
    338  *
    339  * Note: the bridge passed should be the one closest to the encoder
    340  */
    341 void drm_bridge_chain_mode_set(struct drm_bridge *bridge,
    342 			       const struct drm_display_mode *mode,
    343 			       const struct drm_display_mode *adjusted_mode)
    344 {
    345 	struct drm_encoder *encoder;
    346 
    347 	if (!bridge)
    348 		return;
    349 
    350 	encoder = bridge->encoder;
    351 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    352 		if (bridge->funcs->mode_set)
    353 			bridge->funcs->mode_set(bridge, mode, adjusted_mode);
    354 	}
    355 }
    356 EXPORT_SYMBOL(drm_bridge_chain_mode_set);
    357 
    358 /**
    359  * drm_bridge_chain_pre_enable - prepares for enabling all bridges in the
    360  *				 encoder chain
    361  * @bridge: bridge control structure
    362  *
    363  * Calls &drm_bridge_funcs.pre_enable op for all the bridges in the encoder
    364  * chain, starting from the last bridge to the first. These are called
    365  * before calling the encoder's commit op.
    366  *
    367  * Note: the bridge passed should be the one closest to the encoder
    368  */
    369 void drm_bridge_chain_pre_enable(struct drm_bridge *bridge)
    370 {
    371 	struct drm_encoder *encoder;
    372 	struct drm_bridge *iter;
    373 
    374 	if (!bridge)
    375 		return;
    376 
    377 	encoder = bridge->encoder;
    378 	list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
    379 		if (iter->funcs->pre_enable)
    380 			iter->funcs->pre_enable(iter);
    381 	}
    382 }
    383 EXPORT_SYMBOL(drm_bridge_chain_pre_enable);
    384 
    385 /**
    386  * drm_bridge_chain_enable - enables all bridges in the encoder chain
    387  * @bridge: bridge control structure
    388  *
    389  * Calls &drm_bridge_funcs.enable op for all the bridges in the encoder
    390  * chain, starting from the first bridge to the last. These are called
    391  * after completing the encoder's commit op.
    392  *
    393  * Note that the bridge passed should be the one closest to the encoder
    394  */
    395 void drm_bridge_chain_enable(struct drm_bridge *bridge)
    396 {
    397 	struct drm_encoder *encoder;
    398 
    399 	if (!bridge)
    400 		return;
    401 
    402 	encoder = bridge->encoder;
    403 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    404 		if (bridge->funcs->enable)
    405 			bridge->funcs->enable(bridge);
    406 	}
    407 }
    408 EXPORT_SYMBOL(drm_bridge_chain_enable);
    409 
    410 /**
    411  * drm_atomic_bridge_chain_disable - disables all bridges in the encoder chain
    412  * @bridge: bridge control structure
    413  * @old_state: old atomic state
    414  *
    415  * Calls &drm_bridge_funcs.atomic_disable (falls back on
    416  * &drm_bridge_funcs.disable) op for all the bridges in the encoder chain,
    417  * starting from the last bridge to the first. These are called before calling
    418  * &drm_encoder_helper_funcs.atomic_disable
    419  *
    420  * Note: the bridge passed should be the one closest to the encoder
    421  */
    422 void drm_atomic_bridge_chain_disable(struct drm_bridge *bridge,
    423 				     struct drm_atomic_state *old_state)
    424 {
    425 	struct drm_encoder *encoder;
    426 	struct drm_bridge *iter;
    427 
    428 	if (!bridge)
    429 		return;
    430 
    431 	encoder = bridge->encoder;
    432 	list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
    433 		if (iter->funcs->atomic_disable)
    434 			iter->funcs->atomic_disable(iter, old_state);
    435 		else if (iter->funcs->disable)
    436 			iter->funcs->disable(iter);
    437 
    438 		if (iter == bridge)
    439 			break;
    440 	}
    441 }
    442 EXPORT_SYMBOL(drm_atomic_bridge_chain_disable);
    443 
    444 /**
    445  * drm_atomic_bridge_chain_post_disable - cleans up after disabling all bridges
    446  *					  in the encoder chain
    447  * @bridge: bridge control structure
    448  * @old_state: old atomic state
    449  *
    450  * Calls &drm_bridge_funcs.atomic_post_disable (falls back on
    451  * &drm_bridge_funcs.post_disable) op for all the bridges in the encoder chain,
    452  * starting from the first bridge to the last. These are called after completing
    453  * &drm_encoder_helper_funcs.atomic_disable
    454  *
    455  * Note: the bridge passed should be the one closest to the encoder
    456  */
    457 void drm_atomic_bridge_chain_post_disable(struct drm_bridge *bridge,
    458 					  struct drm_atomic_state *old_state)
    459 {
    460 	struct drm_encoder *encoder;
    461 
    462 	if (!bridge)
    463 		return;
    464 
    465 	encoder = bridge->encoder;
    466 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    467 		if (bridge->funcs->atomic_post_disable)
    468 			bridge->funcs->atomic_post_disable(bridge, old_state);
    469 		else if (bridge->funcs->post_disable)
    470 			bridge->funcs->post_disable(bridge);
    471 	}
    472 }
    473 EXPORT_SYMBOL(drm_atomic_bridge_chain_post_disable);
    474 
    475 /**
    476  * drm_atomic_bridge_chain_pre_enable - prepares for enabling all bridges in
    477  *					the encoder chain
    478  * @bridge: bridge control structure
    479  * @old_state: old atomic state
    480  *
    481  * Calls &drm_bridge_funcs.atomic_pre_enable (falls back on
    482  * &drm_bridge_funcs.pre_enable) op for all the bridges in the encoder chain,
    483  * starting from the last bridge to the first. These are called before calling
    484  * &drm_encoder_helper_funcs.atomic_enable
    485  *
    486  * Note: the bridge passed should be the one closest to the encoder
    487  */
    488 void drm_atomic_bridge_chain_pre_enable(struct drm_bridge *bridge,
    489 					struct drm_atomic_state *old_state)
    490 {
    491 	struct drm_encoder *encoder;
    492 	struct drm_bridge *iter;
    493 
    494 	if (!bridge)
    495 		return;
    496 
    497 	encoder = bridge->encoder;
    498 	list_for_each_entry_reverse(iter, &encoder->bridge_chain, chain_node) {
    499 		if (iter->funcs->atomic_pre_enable)
    500 			iter->funcs->atomic_pre_enable(iter, old_state);
    501 		else if (iter->funcs->pre_enable)
    502 			iter->funcs->pre_enable(iter);
    503 
    504 		if (iter == bridge)
    505 			break;
    506 	}
    507 }
    508 EXPORT_SYMBOL(drm_atomic_bridge_chain_pre_enable);
    509 
    510 /**
    511  * drm_atomic_bridge_chain_enable - enables all bridges in the encoder chain
    512  * @bridge: bridge control structure
    513  * @old_state: old atomic state
    514  *
    515  * Calls &drm_bridge_funcs.atomic_enable (falls back on
    516  * &drm_bridge_funcs.enable) op for all the bridges in the encoder chain,
    517  * starting from the first bridge to the last. These are called after completing
    518  * &drm_encoder_helper_funcs.atomic_enable
    519  *
    520  * Note: the bridge passed should be the one closest to the encoder
    521  */
    522 void drm_atomic_bridge_chain_enable(struct drm_bridge *bridge,
    523 				    struct drm_atomic_state *old_state)
    524 {
    525 	struct drm_encoder *encoder;
    526 
    527 	if (!bridge)
    528 		return;
    529 
    530 	encoder = bridge->encoder;
    531 	list_for_each_entry_from(bridge, &encoder->bridge_chain, chain_node) {
    532 		if (bridge->funcs->atomic_enable)
    533 			bridge->funcs->atomic_enable(bridge, old_state);
    534 		else if (bridge->funcs->enable)
    535 			bridge->funcs->enable(bridge);
    536 	}
    537 }
    538 EXPORT_SYMBOL(drm_atomic_bridge_chain_enable);
    539 
    540 #ifdef CONFIG_OF
    541 /**
    542  * of_drm_find_bridge - find the bridge corresponding to the device node in
    543  *			the global bridge list
    544  *
    545  * @np: device node
    546  *
    547  * RETURNS:
    548  * drm_bridge control struct on success, NULL on failure
    549  */
    550 struct drm_bridge *of_drm_find_bridge(struct device_node *np)
    551 {
    552 	struct drm_bridge *bridge;
    553 
    554 	mutex_lock(&bridge_lock);
    555 
    556 	list_for_each_entry(bridge, &bridge_list, list) {
    557 		if (bridge->of_node == np) {
    558 			mutex_unlock(&bridge_lock);
    559 			return bridge;
    560 		}
    561 	}
    562 
    563 	mutex_unlock(&bridge_lock);
    564 	return NULL;
    565 }
    566 EXPORT_SYMBOL(of_drm_find_bridge);
    567 #endif
    568 
    569 MODULE_AUTHOR("Ajay Kumar <ajaykumar.rs (at) samsung.com>");
    570 MODULE_DESCRIPTION("DRM bridge infrastructure");
    571 MODULE_LICENSE("GPL and additional rights");
    572