drm_os_freebsd.h revision 262861
1/**
2 * \file drm_os_freebsd.h
3 * OS abstraction macros.
4 */
5
6#include <sys/cdefs.h>
7__FBSDID("$FreeBSD: stable/10/sys/dev/drm2/drm_os_freebsd.h 262861 2014-03-06 18:30:56Z jhb $");
8
9#include <sys/fbio.h>
10
11#if _BYTE_ORDER == _BIG_ENDIAN
12#define	__BIG_ENDIAN 4321
13#else
14#define	__LITTLE_ENDIAN 1234
15#endif
16
17#define	cpu_to_le16(x)	htole16(x)
18#define	le16_to_cpu(x)	le16toh(x)
19#define	cpu_to_le32(x)	htole32(x)
20#define	le32_to_cpu(x)	le32toh(x)
21
22#define	cpu_to_be16(x)	htobe16(x)
23#define	be16_to_cpu(x)	be16toh(x)
24#define	cpu_to_be32(x)	htobe32(x)
25#define	be32_to_cpu(x)	be32toh(x)
26#define	be32_to_cpup(x)	be32toh(*x)
27
28typedef vm_paddr_t dma_addr_t;
29typedef uint64_t u64;
30typedef uint32_t u32;
31typedef uint16_t u16;
32typedef uint8_t u8;
33typedef int64_t s64;
34typedef int32_t s32;
35typedef int16_t s16;
36typedef int8_t s8;
37typedef int32_t __be32;
38
39#define	unlikely(x)            __builtin_expect(!!(x), 0)
40#define	likely(x)              __builtin_expect(!!(x), 1)
41#define	container_of(ptr, type, member) ({			\
42	__typeof( ((type *)0)->member ) *__mptr = (ptr);	\
43	(type *)( (char *)__mptr - offsetof(type,member) );})
44
45#define DRM_HZ			hz
46#define DRM_UDELAY(udelay)	DELAY(udelay)
47#define DRM_MDELAY(msecs)	do { int loops = (msecs);		\
48				  while (loops--) DELAY(1000);		\
49				} while (0)
50#define DRM_MSLEEP(msecs)	drm_msleep((msecs), "drm_msleep")
51#define DRM_TIME_SLICE		(hz/20)  /* Time slice for GLXContexts	  */
52
53#define	do_div(a, b)		((a) /= (b))
54#define	lower_32_bits(n)	((u32)(n))
55
56#define min_t(type, x, y) ({			\
57	type __min1 = (x);			\
58	type __min2 = (y);			\
59	__min1 < __min2 ? __min1 : __min2; })
60
61#define max_t(type, x, y) ({			\
62	type __max1 = (x);			\
63	type __max2 = (y);			\
64	__max1 > __max2 ? __max1 : __max2; })
65
66#define	memset_io(a, b, c)	memset((a), (b), (c))
67#define	memcpy_fromio(a, b, c)	memcpy((a), (b), (c))
68#define	memcpy_toio(a, b, c)	memcpy((a), (b), (c))
69
70/* XXXKIB what is the right code for the FreeBSD ? */
71/* kib@ used ENXIO here -- dumbbell@ */
72#define	EREMOTEIO	EIO
73#define	ERESTARTSYS	ERESTART
74
75#define	KTR_DRM		KTR_DEV
76#define	KTR_DRM_REG	KTR_SPARE3
77
78#define	PCI_VENDOR_ID_APPLE		0x106b
79#define	PCI_VENDOR_ID_ASUSTEK		0x1043
80#define	PCI_VENDOR_ID_ATI		0x1002
81#define	PCI_VENDOR_ID_DELL		0x1028
82#define	PCI_VENDOR_ID_HP		0x103c
83#define	PCI_VENDOR_ID_IBM		0x1014
84#define	PCI_VENDOR_ID_INTEL		0x8086
85#define	PCI_VENDOR_ID_SERVERWORKS	0x1166
86#define	PCI_VENDOR_ID_SONY		0x104d
87#define	PCI_VENDOR_ID_VIA		0x1106
88
89#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
90#define	hweight32(i)	bitcount32(i)
91
92static inline unsigned long
93roundup_pow_of_two(unsigned long x)
94{
95	return (1UL << flsl(x - 1));
96}
97
98/**
99 * ror32 - rotate a 32-bit value right
100 * @word: value to rotate
101 * @shift: bits to roll
102 *
103 * Source: include/linux/bitops.h
104 */
105static inline uint32_t ror32(uint32_t word, unsigned int shift)
106{
107	return (word >> shift) | (word << (32 - shift));
108}
109
110#define	IS_ALIGNED(x, y)	(((x) & ((y) - 1)) == 0)
111#define	get_unaligned(ptr)                                              \
112	({ __typeof__(*(ptr)) __tmp;                                    \
113	  memcpy(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
114
115#if _BYTE_ORDER == _LITTLE_ENDIAN
116/* Taken from linux/include/linux/unaligned/le_struct.h. */
117struct __una_u32 { u32 x; } __packed;
118
119static inline u32 __get_unaligned_cpu32(const void *p)
120{
121	const struct __una_u32 *ptr = (const struct __una_u32 *)p;
122	return ptr->x;
123}
124
125static inline u32 get_unaligned_le32(const void *p)
126{
127	return __get_unaligned_cpu32((const u8 *)p);
128}
129#else
130/* Taken from linux/include/linux/unaligned/le_byteshift.h. */
131static inline u32 __get_unaligned_le32(const u8 *p)
132{
133	return p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24;
134}
135
136static inline u32 get_unaligned_le32(const void *p)
137{
138	return __get_unaligned_le32((const u8 *)p);
139}
140#endif
141
142#define KIB_NOTYET()							\
143do {									\
144	if (drm_debug_flag && drm_notyet_flag)				\
145		printf("NOTYET: %s at %s:%d\n", __func__, __FILE__, __LINE__); \
146} while (0)
147