xref: /freebsd/sys/dev/drm2/drm_os_freebsd.h (revision f4b37ed0f8b307b1f3f0f630ca725d68f1dff30d)
1 /**
2  * \file drm_os_freebsd.h
3  * OS abstraction macros.
4  */
5 
6 #include <sys/cdefs.h>
7 __FBSDID("$FreeBSD$");
8 
9 #ifndef _DRM_OS_FREEBSD_H_
10 #define	_DRM_OS_FREEBSD_H_
11 
12 #include <sys/fbio.h>
13 
14 #if _BYTE_ORDER == _BIG_ENDIAN
15 #define	__BIG_ENDIAN 4321
16 #else
17 #define	__LITTLE_ENDIAN 1234
18 #endif
19 
20 #ifdef __LP64__
21 #define	BITS_PER_LONG	64
22 #else
23 #define	BITS_PER_LONG	32
24 #endif
25 
26 #ifndef __user
27 #define __user
28 #endif
29 #ifndef __iomem
30 #define __iomem
31 #endif
32 
33 #define	cpu_to_le16(x)	htole16(x)
34 #define	le16_to_cpu(x)	le16toh(x)
35 #define	cpu_to_le32(x)	htole32(x)
36 #define	le32_to_cpu(x)	le32toh(x)
37 
38 #define	cpu_to_be16(x)	htobe16(x)
39 #define	be16_to_cpu(x)	be16toh(x)
40 #define	cpu_to_be32(x)	htobe32(x)
41 #define	be32_to_cpu(x)	be32toh(x)
42 #define	be32_to_cpup(x)	be32toh(*x)
43 
44 typedef vm_paddr_t dma_addr_t;
45 typedef vm_paddr_t resource_size_t;
46 #define	wait_queue_head_t atomic_t
47 
48 typedef uint64_t u64;
49 typedef uint32_t u32;
50 typedef uint16_t u16;
51 typedef uint8_t  u8;
52 typedef int64_t s64;
53 typedef int32_t s32;
54 typedef int16_t s16;
55 typedef int8_t  s8;
56 typedef uint16_t __le16;
57 typedef uint32_t __le32;
58 typedef uint64_t __le64;
59 typedef uint16_t __be16;
60 typedef uint32_t __be32;
61 typedef uint64_t __be64;
62 
63 #define	DRM_IRQ_ARGS		void *arg
64 typedef void			irqreturn_t;
65 #define	IRQ_HANDLED		/* nothing */
66 #define	IRQ_NONE		/* nothing */
67 
68 #define	__init
69 #define	__exit
70 #define	__read_mostly
71 
72 #define	WARN_ON(cond)		KASSERT(!(cond), ("WARN ON: " #cond))
73 #define	WARN_ON_SMP(cond)	WARN_ON(cond)
74 #define	BUG_ON(cond)		KASSERT(!(cond), ("BUG ON: " #cond))
75 #define	unlikely(x)            __builtin_expect(!!(x), 0)
76 #define	likely(x)              __builtin_expect(!!(x), 1)
77 #define	container_of(ptr, type, member) ({			\
78 	__typeof( ((type *)0)->member ) *__mptr = (ptr);	\
79 	(type *)( (char *)__mptr - offsetof(type,member) );})
80 
81 #define	KHZ2PICOS(a)	(1000000000UL/(a))
82 
83 #define ARRAY_SIZE(x)		(sizeof(x)/sizeof(x[0]))
84 
85 #define	HZ			hz
86 #define	DRM_HZ			hz
87 #define	DRM_CURRENTPID		curthread->td_proc->p_pid
88 #define	DRM_SUSER(p)		(priv_check(p, PRIV_DRIVER) == 0)
89 #define	udelay(usecs)		DELAY(usecs)
90 #define	mdelay(msecs)		do { int loops = (msecs);		\
91 				  while (loops--) DELAY(1000);		\
92 				} while (0)
93 #define	DRM_UDELAY(udelay)	DELAY(udelay)
94 #define	drm_msleep(x, msg)	pause((msg), ((int64_t)(x)) * hz / 1000)
95 #define	DRM_MSLEEP(msecs)	drm_msleep((msecs), "drm_msleep")
96 
97 #define	DRM_READ8(map, offset)						\
98 	*(volatile u_int8_t *)(((vm_offset_t)(map)->handle) +		\
99 	    (vm_offset_t)(offset))
100 #define	DRM_READ16(map, offset)						\
101 	le16toh(*(volatile u_int16_t *)(((vm_offset_t)(map)->handle) +	\
102 	    (vm_offset_t)(offset)))
103 #define	DRM_READ32(map, offset)						\
104 	le32toh(*(volatile u_int32_t *)(((vm_offset_t)(map)->handle) +	\
105 	    (vm_offset_t)(offset)))
106 #define	DRM_READ64(map, offset)						\
107 	le64toh(*(volatile u_int64_t *)(((vm_offset_t)(map)->handle) +	\
108 	    (vm_offset_t)(offset)))
109 #define	DRM_WRITE8(map, offset, val)					\
110 	*(volatile u_int8_t *)(((vm_offset_t)(map)->handle) +		\
111 	    (vm_offset_t)(offset)) = val
112 #define	DRM_WRITE16(map, offset, val)					\
113 	*(volatile u_int16_t *)(((vm_offset_t)(map)->handle) +		\
114 	    (vm_offset_t)(offset)) = htole16(val)
115 #define	DRM_WRITE32(map, offset, val)					\
116 	*(volatile u_int32_t *)(((vm_offset_t)(map)->handle) +		\
117 	    (vm_offset_t)(offset)) = htole32(val)
118 #define	DRM_WRITE64(map, offset, val)					\
119 	*(volatile u_int64_t *)(((vm_offset_t)(map)->handle) +		\
120 	    (vm_offset_t)(offset)) = htole64(val)
121 
122 /* DRM_READMEMORYBARRIER() prevents reordering of reads.
123  * DRM_WRITEMEMORYBARRIER() prevents reordering of writes.
124  * DRM_MEMORYBARRIER() prevents reordering of reads and writes.
125  */
126 #define	DRM_READMEMORYBARRIER()		rmb()
127 #define	DRM_WRITEMEMORYBARRIER()	wmb()
128 #define	DRM_MEMORYBARRIER()		mb()
129 #define	smp_rmb()			rmb()
130 #define	smp_mb__before_atomic_inc()	mb()
131 #define	smp_mb__after_atomic_inc()	mb()
132 
133 #define	do_div(a, b)		((a) /= (b))
134 #define	div64_u64(a, b)		((a) / (b))
135 #define	lower_32_bits(n)	((u32)(n))
136 
137 #define min_t(type, x, y) ({			\
138 	type __min1 = (x);			\
139 	type __min2 = (y);			\
140 	__min1 < __min2 ? __min1 : __min2; })
141 
142 #define max_t(type, x, y) ({			\
143 	type __max1 = (x);			\
144 	type __max2 = (y);			\
145 	__max1 > __max2 ? __max1 : __max2; })
146 
147 #define	memset_io(a, b, c)	memset((a), (b), (c))
148 #define	memcpy_fromio(a, b, c)	memcpy((a), (b), (c))
149 #define	memcpy_toio(a, b, c)	memcpy((a), (b), (c))
150 
151 /* XXXKIB what is the right code for the FreeBSD ? */
152 /* kib@ used ENXIO here -- dumbbell@ */
153 #define	EREMOTEIO	EIO
154 #define	ERESTARTSYS	512 /* Same value as Linux. */
155 
156 #define	KTR_DRM		KTR_DEV
157 #define	KTR_DRM_REG	KTR_SPARE3
158 
159 #define	DRM_AGP_KERN	struct agp_info
160 #define	DRM_AGP_MEM	void
161 
162 #define	PCI_VENDOR_ID_APPLE		0x106b
163 #define	PCI_VENDOR_ID_ASUSTEK		0x1043
164 #define	PCI_VENDOR_ID_ATI		0x1002
165 #define	PCI_VENDOR_ID_DELL		0x1028
166 #define	PCI_VENDOR_ID_HP		0x103c
167 #define	PCI_VENDOR_ID_IBM		0x1014
168 #define	PCI_VENDOR_ID_INTEL		0x8086
169 #define	PCI_VENDOR_ID_SERVERWORKS	0x1166
170 #define	PCI_VENDOR_ID_SONY		0x104d
171 #define	PCI_VENDOR_ID_VIA		0x1106
172 
173 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
174 #define	hweight32(i)	bitcount32(i)
175 
176 static inline unsigned long
177 roundup_pow_of_two(unsigned long x)
178 {
179 
180 	return (1UL << flsl(x - 1));
181 }
182 
183 /**
184  * ror32 - rotate a 32-bit value right
185  * @word: value to rotate
186  * @shift: bits to roll
187  *
188  * Source: include/linux/bitops.h
189  */
190 static inline uint32_t
191 ror32(uint32_t word, unsigned int shift)
192 {
193 
194 	return (word >> shift) | (word << (32 - shift));
195 }
196 
197 #define	IS_ALIGNED(x, y)	(((x) & ((y) - 1)) == 0)
198 #define	get_unaligned(ptr)                                              \
199 	({ __typeof__(*(ptr)) __tmp;                                    \
200 	  memcpy(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
201 
202 #if _BYTE_ORDER == _LITTLE_ENDIAN
203 /* Taken from linux/include/linux/unaligned/le_struct.h. */
204 struct __una_u32 { u32 x; } __packed;
205 
206 static inline u32
207 __get_unaligned_cpu32(const void *p)
208 {
209 	const struct __una_u32 *ptr = (const struct __una_u32 *)p;
210 
211 	return (ptr->x);
212 }
213 
214 static inline u32
215 get_unaligned_le32(const void *p)
216 {
217 
218 	return (__get_unaligned_cpu32((const u8 *)p));
219 }
220 #else
221 /* Taken from linux/include/linux/unaligned/le_byteshift.h. */
222 static inline u32
223 __get_unaligned_le32(const u8 *p)
224 {
225 
226 	return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24);
227 }
228 
229 static inline u32
230 get_unaligned_le32(const void *p)
231 {
232 
233 	return (__get_unaligned_le32((const u8 *)p));
234 }
235 #endif
236 
237 static inline unsigned long
238 ilog2(unsigned long x)
239 {
240 
241 	return (flsl(x) - 1);
242 }
243 
244 static inline int64_t
245 abs64(int64_t x)
246 {
247 
248 	return (x < 0 ? -x : x);
249 }
250 
251 int64_t		timeval_to_ns(const struct timeval *tv);
252 struct timeval	ns_to_timeval(const int64_t nsec);
253 
254 #define PAGE_ALIGN(addr) round_page(addr)
255 
256 #define	drm_get_device_from_kdev(_kdev)	(((struct drm_minor *)(_kdev)->si_drv1)->dev)
257 
258 #define DRM_IOC_VOID		IOC_VOID
259 #define DRM_IOC_READ		IOC_OUT
260 #define DRM_IOC_WRITE		IOC_IN
261 #define DRM_IOC_READWRITE	IOC_INOUT
262 #define DRM_IOC(dir, group, nr, size) _IOC(dir, group, nr, size)
263 
264 static inline long
265 __copy_to_user(void __user *to, const void *from, unsigned long n)
266 {
267 	return (copyout(from, to, n) != 0 ? n : 0);
268 }
269 #define	copy_to_user(to, from, n) __copy_to_user((to), (from), (n))
270 
271 static inline int
272 __put_user(size_t size, void *ptr, void *x)
273 {
274 
275 	size = copy_to_user(ptr, x, size);
276 
277 	return (size ? -EFAULT : size);
278 }
279 #define	put_user(x, ptr) __put_user(sizeof(*ptr), (ptr), &(x))
280 
281 static inline unsigned long
282 __copy_from_user(void *to, const void __user *from, unsigned long n)
283 {
284 	return ((copyin(__DECONST(void *, from), to, n) != 0 ? n : 0));
285 }
286 #define	copy_from_user(to, from, n) __copy_from_user((to), (from), (n))
287 
288 static inline int
289 __get_user(size_t size, const void *ptr, void *x)
290 {
291 
292 	size = copy_from_user(x, ptr, size);
293 
294 	return (size ? -EFAULT : size);
295 }
296 #define	get_user(x, ptr) __get_user(sizeof(*ptr), (ptr), &(x))
297 
298 #define	sigemptyset(set)	SIGEMPTYSET(set)
299 #define	sigaddset(set, sig)	SIGADDSET(set, sig)
300 
301 #define DRM_LOCK(dev)		sx_xlock(&(dev)->dev_struct_lock)
302 #define DRM_UNLOCK(dev) 	sx_xunlock(&(dev)->dev_struct_lock)
303 
304 #define jiffies			ticks
305 #define	jiffies_to_msecs(x)	(((int64_t)(x)) * 1000 / hz)
306 #define	msecs_to_jiffies(x)	(((int64_t)(x)) * hz / 1000)
307 #define	time_after(a,b)		((long)(b) - (long)(a) < 0)
308 #define	time_after_eq(a,b)	((long)(b) - (long)(a) <= 0)
309 
310 #define	wake_up(queue)			wakeup((void *)queue)
311 #define	wake_up_interruptible(queue)	wakeup((void *)queue)
312 
313 MALLOC_DECLARE(DRM_MEM_DMA);
314 MALLOC_DECLARE(DRM_MEM_SAREA);
315 MALLOC_DECLARE(DRM_MEM_DRIVER);
316 MALLOC_DECLARE(DRM_MEM_MAGIC);
317 MALLOC_DECLARE(DRM_MEM_MINOR);
318 MALLOC_DECLARE(DRM_MEM_IOCTLS);
319 MALLOC_DECLARE(DRM_MEM_MAPS);
320 MALLOC_DECLARE(DRM_MEM_BUFS);
321 MALLOC_DECLARE(DRM_MEM_SEGS);
322 MALLOC_DECLARE(DRM_MEM_PAGES);
323 MALLOC_DECLARE(DRM_MEM_FILES);
324 MALLOC_DECLARE(DRM_MEM_QUEUES);
325 MALLOC_DECLARE(DRM_MEM_CMDS);
326 MALLOC_DECLARE(DRM_MEM_MAPPINGS);
327 MALLOC_DECLARE(DRM_MEM_BUFLISTS);
328 MALLOC_DECLARE(DRM_MEM_AGPLISTS);
329 MALLOC_DECLARE(DRM_MEM_CTXBITMAP);
330 MALLOC_DECLARE(DRM_MEM_SGLISTS);
331 MALLOC_DECLARE(DRM_MEM_MM);
332 MALLOC_DECLARE(DRM_MEM_HASHTAB);
333 MALLOC_DECLARE(DRM_MEM_KMS);
334 MALLOC_DECLARE(DRM_MEM_VBLANK);
335 
336 #define	simple_strtol(a, b, c)			strtol((a), (b), (c))
337 
338 typedef struct drm_pci_id_list
339 {
340 	int vendor;
341 	int device;
342 	long driver_private;
343 	char *name;
344 } drm_pci_id_list_t;
345 
346 #ifdef __i386__
347 #define	CONFIG_X86	1
348 #endif
349 #ifdef __amd64__
350 #define	CONFIG_X86	1
351 #define	CONFIG_X86_64	1
352 #endif
353 #ifdef __ia64__
354 #define	CONFIG_IA64	1
355 #endif
356 
357 #if defined(__i386__) || defined(__amd64__)
358 #define	CONFIG_ACPI
359 #endif
360 
361 #define	CONFIG_AGP	1
362 #define	CONFIG_MTRR	1
363 
364 #define	CONFIG_FB	1
365 extern const char *fb_mode_option;
366 
367 #define	EXPORT_SYMBOL(x)
368 #define	MODULE_AUTHOR(author)
369 #define	MODULE_DESCRIPTION(desc)
370 #define	MODULE_LICENSE(license)
371 #define	MODULE_PARM_DESC(name, desc)
372 #define	module_param_named(name, var, type, perm)
373 
374 #define	printk		printf
375 #define	KERN_DEBUG	""
376 
377 struct fb_info *	framebuffer_alloc(void);
378 void			framebuffer_release(struct fb_info *info);
379 
380 #define KIB_NOTYET()							\
381 do {									\
382 	if (drm_debug && drm_notyet)					\
383 		printf("NOTYET: %s at %s:%d\n", __func__, __FILE__, __LINE__); \
384 } while (0)
385 
386 #endif /* _DRM_OS_FREEBSD_H_ */
387