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
44typedef vm_paddr_t dma_addr_t;
45typedef vm_paddr_t resource_size_t;
46#define	wait_queue_head_t atomic_t
47
48typedef uint64_t u64;
49typedef uint32_t u32;
50typedef uint16_t u16;
51typedef uint8_t  u8;
52typedef int64_t s64;
53typedef int32_t s32;
54typedef int16_t s16;
55typedef int8_t  s8;
56typedef uint16_t __le16;
57typedef uint32_t __le32;
58typedef uint64_t __le64;
59typedef uint16_t __be16;
60typedef uint32_t __be32;
61typedef uint64_t __be64;
62
63#define	DRM_IRQ_ARGS		void *arg
64typedef 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
176static inline unsigned long
177roundup_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 */
190static inline uint32_t
191ror32(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. */
204struct __una_u32 { u32 x; } __packed;
205
206static 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
214static inline u32
215get_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. */
222static 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
229static inline u32
230get_unaligned_le32(const void *p)
231{
232
233	return (__get_unaligned_le32((const u8 *)p));
234}
235#endif
236
237static inline unsigned long
238ilog2(unsigned long x)
239{
240
241	return (flsl(x) - 1);
242}
243
244static inline int64_t
245abs64(int64_t x)
246{
247
248	return (x < 0 ? -x : x);
249}
250
251int64_t		timeval_to_ns(const struct timeval *tv);
252struct 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
264static 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
271static 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
281static 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
288static 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
313MALLOC_DECLARE(DRM_MEM_DMA);
314MALLOC_DECLARE(DRM_MEM_SAREA);
315MALLOC_DECLARE(DRM_MEM_DRIVER);
316MALLOC_DECLARE(DRM_MEM_MAGIC);
317MALLOC_DECLARE(DRM_MEM_MINOR);
318MALLOC_DECLARE(DRM_MEM_IOCTLS);
319MALLOC_DECLARE(DRM_MEM_MAPS);
320MALLOC_DECLARE(DRM_MEM_BUFS);
321MALLOC_DECLARE(DRM_MEM_SEGS);
322MALLOC_DECLARE(DRM_MEM_PAGES);
323MALLOC_DECLARE(DRM_MEM_FILES);
324MALLOC_DECLARE(DRM_MEM_QUEUES);
325MALLOC_DECLARE(DRM_MEM_CMDS);
326MALLOC_DECLARE(DRM_MEM_MAPPINGS);
327MALLOC_DECLARE(DRM_MEM_BUFLISTS);
328MALLOC_DECLARE(DRM_MEM_AGPLISTS);
329MALLOC_DECLARE(DRM_MEM_CTXBITMAP);
330MALLOC_DECLARE(DRM_MEM_SGLISTS);
331MALLOC_DECLARE(DRM_MEM_MM);
332MALLOC_DECLARE(DRM_MEM_HASHTAB);
333MALLOC_DECLARE(DRM_MEM_KMS);
334MALLOC_DECLARE(DRM_MEM_VBLANK);
335
336#define	simple_strtol(a, b, c)			strtol((a), (b), (c))
337
338typedef 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
365extern 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
377struct fb_info *	framebuffer_alloc(void);
378void			framebuffer_release(struct fb_info *info);
379
380#define KIB_NOTYET()							\
381do {									\
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