xref: /openbmc/linux/include/drm/drm_util.h (revision 6349120d)
1d78aa650SDaniel Vetter /*
2d78aa650SDaniel Vetter  * Internal Header for the Direct Rendering Manager
3d78aa650SDaniel Vetter  *
4d78aa650SDaniel Vetter  * Copyright 2018 Intel Corporation
5d78aa650SDaniel Vetter  *
6d78aa650SDaniel Vetter  * Permission is hereby granted, free of charge, to any person obtaining a
7d78aa650SDaniel Vetter  * copy of this software and associated documentation files (the "Software"),
8d78aa650SDaniel Vetter  * to deal in the Software without restriction, including without limitation
9d78aa650SDaniel Vetter  * the rights to use, copy, modify, merge, publish, distribute, sublicense,
10d78aa650SDaniel Vetter  * and/or sell copies of the Software, and to permit persons to whom the
11d78aa650SDaniel Vetter  * Software is furnished to do so, subject to the following conditions:
12d78aa650SDaniel Vetter  *
13d78aa650SDaniel Vetter  * The above copyright notice and this permission notice (including the next
14d78aa650SDaniel Vetter  * paragraph) shall be included in all copies or substantial portions of the
15d78aa650SDaniel Vetter  * Software.
16d78aa650SDaniel Vetter  *
17d78aa650SDaniel Vetter  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
18d78aa650SDaniel Vetter  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
19d78aa650SDaniel Vetter  * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
20d78aa650SDaniel Vetter  * VA LINUX SYSTEMS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM, DAMAGES OR
21d78aa650SDaniel Vetter  * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
22d78aa650SDaniel Vetter  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
23d78aa650SDaniel Vetter  * OTHER DEALINGS IN THE SOFTWARE.
24d78aa650SDaniel Vetter  */
25d78aa650SDaniel Vetter 
26d78aa650SDaniel Vetter #ifndef _DRM_UTIL_H_
27d78aa650SDaniel Vetter #define _DRM_UTIL_H_
28d78aa650SDaniel Vetter 
29e9eafcb5SSam Ravnborg /**
30e9eafcb5SSam Ravnborg  * DOC: drm utils
31e9eafcb5SSam Ravnborg  *
32e9eafcb5SSam Ravnborg  * Macros and inline functions that does not naturally belong in other places
33e9eafcb5SSam Ravnborg  */
34e9eafcb5SSam Ravnborg 
3594520db5SSam Ravnborg #include <linux/interrupt.h>
36e9eafcb5SSam Ravnborg #include <linux/kgdb.h>
3794520db5SSam Ravnborg #include <linux/preempt.h>
38e9eafcb5SSam Ravnborg #include <linux/smp.h>
39e9eafcb5SSam Ravnborg 
4021376e2cSSam Ravnborg /*
4121376e2cSSam Ravnborg  * Use EXPORT_SYMBOL_FOR_TESTS_ONLY() for functions that shall
4221376e2cSSam Ravnborg  * only be visible for drmselftests.
4321376e2cSSam Ravnborg  */
446349120dSChris Wilson #if defined(CONFIG_DRM_EXPORT_FOR_TESTS)
4521376e2cSSam Ravnborg #define EXPORT_SYMBOL_FOR_TESTS_ONLY(x) EXPORT_SYMBOL(x)
4621376e2cSSam Ravnborg #else
4721376e2cSSam Ravnborg #define EXPORT_SYMBOL_FOR_TESTS_ONLY(x)
4821376e2cSSam Ravnborg #endif
4921376e2cSSam Ravnborg 
50e9eafcb5SSam Ravnborg /**
51e9eafcb5SSam Ravnborg  * for_each_if - helper for handling conditionals in various for_each macros
52e9eafcb5SSam Ravnborg  * @condition: The condition to check
53e9eafcb5SSam Ravnborg  *
54e9eafcb5SSam Ravnborg  * Typical use::
55e9eafcb5SSam Ravnborg  *
56e9eafcb5SSam Ravnborg  *	#define for_each_foo_bar(x, y) \'
57e9eafcb5SSam Ravnborg  *		list_for_each_entry(x, y->list, head) \'
58e9eafcb5SSam Ravnborg  *			for_each_if(x->something == SOMETHING)
59e9eafcb5SSam Ravnborg  *
60e9eafcb5SSam Ravnborg  * The for_each_if() macro makes the use of for_each_foo_bar() less error
61e9eafcb5SSam Ravnborg  * prone.
62e9eafcb5SSam Ravnborg  */
63d78aa650SDaniel Vetter #define for_each_if(condition) if (!(condition)) {} else
64d78aa650SDaniel Vetter 
65e9eafcb5SSam Ravnborg /**
66e9eafcb5SSam Ravnborg  * drm_can_sleep - returns true if currently okay to sleep
67e9eafcb5SSam Ravnborg  *
68e9eafcb5SSam Ravnborg  * This function shall not be used in new code.
69e9eafcb5SSam Ravnborg  * The check for running in atomic context may not work - see linux/preempt.h.
70e9eafcb5SSam Ravnborg  *
71e9eafcb5SSam Ravnborg  * FIXME: All users of drm_can_sleep should be removed (see todo.rst)
72e9eafcb5SSam Ravnborg  *
73e9eafcb5SSam Ravnborg  * Returns:
7447ef63e0SSam Ravnborg  * False if kgdb is active, we are in atomic context or irqs are disabled.
75e9eafcb5SSam Ravnborg  */
drm_can_sleep(void)76e9eafcb5SSam Ravnborg static inline bool drm_can_sleep(void)
77e9eafcb5SSam Ravnborg {
78e9eafcb5SSam Ravnborg 	if (in_atomic() || in_dbg_master() || irqs_disabled())
79e9eafcb5SSam Ravnborg 		return false;
80e9eafcb5SSam Ravnborg 	return true;
81e9eafcb5SSam Ravnborg }
82e9eafcb5SSam Ravnborg 
83d78aa650SDaniel Vetter #endif
84