xref: /dflybsd-src/sys/dev/drm/include/drm/drm_os_linux.h (revision 3f2dd94a569761201b5b0a18b2f697f97fe1b9dc)
10fb52de5SFrançois Tigeot /**
2a85cb24fSFrançois Tigeot  * \file drm_os_linux.h
30fb52de5SFrançois Tigeot  * OS abstraction macros.
40fb52de5SFrançois Tigeot  */
50fb52de5SFrançois Tigeot 
61e59d133SFrançois Tigeot #include <linux/interrupt.h>	/* For task queue support */
7a85cb24fSFrançois Tigeot #include <linux/sched/signal.h>
80e1ba51bSFrançois Tigeot #include <linux/delay.h>
9*3f2dd94aSFrançois Tigeot #include <linux/io-64-nonatomic-lo-hi.h>
10ba55f2f5SFrançois Tigeot 
1191fff950Szrj /* Handle the DRM options from kernel config. */
1291fff950Szrj #ifdef __DragonFly__
1391fff950Szrj #include "opt_drm.h"
1491fff950Szrj #ifdef DRM_DEBUG
1591fff950Szrj #  if DRM_DEBUG>1
1691fff950Szrj #    define DRM_DEBUG_DEFAULT_ON 2
1791fff950Szrj #  else
1891fff950Szrj #    define DRM_DEBUG_DEFAULT_ON 1
1991fff950Szrj #  endif
2091fff950Szrj #undef DRM_DEBUG
21ea4aad66SSascha Wildner #else /* !DRM_DEBUG */
22ea4aad66SSascha Wildner #  define DRM_DEBUG_DEFAULT_ON 0
2391fff950Szrj #endif /* DRM_DEBUG */
24ea4aad66SSascha Wildner #endif /* __DragonFly__ */
250e1ba51bSFrançois Tigeot 
26dbd50cc0Szrj /** Current process ID */
27dbd50cc0Szrj #define DRM_CURRENTPID			(curproc != NULL ? curproc->p_pid : -1)
28dbd50cc0Szrj #define DRM_UDELAY(d)			DELAY(d)
29dbd50cc0Szrj /** Read a byte from a MMIO region */
300e1ba51bSFrançois Tigeot #define DRM_READ8(map, offset)		readb(((void __iomem *)(map)->handle) + (offset))
310e1ba51bSFrançois Tigeot /** Read a word from a MMIO region */
320e1ba51bSFrançois Tigeot #define DRM_READ16(map, offset)         readw(((void __iomem *)(map)->handle) + (offset))
330e1ba51bSFrançois Tigeot /** Read a dword from a MMIO region */
340e1ba51bSFrançois Tigeot #define DRM_READ32(map, offset)		readl(((void __iomem *)(map)->handle) + (offset))
350e1ba51bSFrançois Tigeot /** Write a byte into a MMIO region */
360e1ba51bSFrançois Tigeot #define DRM_WRITE8(map, offset, val)	writeb(val, ((void __iomem *)(map)->handle) + (offset))
370e1ba51bSFrançois Tigeot /** Write a word into a MMIO region */
380e1ba51bSFrançois Tigeot #define DRM_WRITE16(map, offset, val)   writew(val, ((void __iomem *)(map)->handle) + (offset))
390e1ba51bSFrançois Tigeot /** Write a dword into a MMIO region */
40a85cb24fSFrançois Tigeot #define DRM_WRITE32(map, offset, val)	writel(val, ((void __iomem *)(map)->handle) + (offset))
415c002123SFrançois Tigeot 
420e1ba51bSFrançois Tigeot /** Read a qword from a MMIO region - be careful using these unless you really understand them */
430e1ba51bSFrançois Tigeot #define DRM_READ64(map, offset)		readq(((void __iomem *)(map)->handle) + (offset))
440e1ba51bSFrançois Tigeot /** Write a qword into a MMIO region */
450e1ba51bSFrançois Tigeot #define DRM_WRITE64(map, offset, val)	writeq(val, ((void __iomem *)(map)->handle) + (offset))
460fb52de5SFrançois Tigeot 
471dedbd3bSFrançois Tigeot #define DRM_WAIT_ON( ret, queue, timeout, condition )		\
481dedbd3bSFrançois Tigeot do {								\
49*3f2dd94aSFrançois Tigeot 	wait_queue_entry_t entry = {				\
509e6332eeSFrançois Tigeot 		.private	= current,			\
519e6332eeSFrançois Tigeot 		.func		= default_wake_function,	\
529e6332eeSFrançois Tigeot 	};							\
531dedbd3bSFrançois Tigeot 	unsigned long end = jiffies + (timeout);		\
541dedbd3bSFrançois Tigeot 	add_wait_queue(&(queue), &entry);			\
551dedbd3bSFrançois Tigeot 								\
561dedbd3bSFrançois Tigeot 	for (;;) {						\
571dedbd3bSFrançois Tigeot 		__set_current_state(TASK_INTERRUPTIBLE);	\
581dedbd3bSFrançois Tigeot 		if (condition)					\
591dedbd3bSFrançois Tigeot 			break;					\
601dedbd3bSFrançois Tigeot 		if (time_after_eq(jiffies, end)) {		\
611dedbd3bSFrançois Tigeot 			ret = -EBUSY;				\
621dedbd3bSFrançois Tigeot 			break;					\
631dedbd3bSFrançois Tigeot 		}						\
641dedbd3bSFrançois Tigeot 		schedule_timeout((HZ/100 > 1) ? HZ/100 : 1);	\
651dedbd3bSFrançois Tigeot 		if (signal_pending(current)) {			\
661dedbd3bSFrançois Tigeot 			ret = -EINTR;				\
671dedbd3bSFrançois Tigeot 			break;					\
681dedbd3bSFrançois Tigeot 		}						\
691dedbd3bSFrançois Tigeot 	}							\
701dedbd3bSFrançois Tigeot 	__set_current_state(TASK_RUNNING);			\
711dedbd3bSFrançois Tigeot 	remove_wait_queue(&(queue), &entry);			\
721dedbd3bSFrançois Tigeot } while (0)
73