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
roundup_pow_of_two(unsigned long x)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
ror32(uint32_t word,unsigned int shift)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
__get_unaligned_cpu32(const void * p)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
get_unaligned_le32(const void * p)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
__get_unaligned_le32(const u8 * p)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
get_unaligned_le32(const void * p)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
ilog2(unsigned long x)238 ilog2(unsigned long x)
239 {
240
241 return (flsl(x) - 1);
242 }
243
244 static inline int64_t
abs64(int64_t x)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
__copy_to_user(void __user * to,const void * from,unsigned long n)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
__put_user(size_t size,void * ptr,void * x)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
__copy_from_user(void * to,const void __user * from,unsigned long n)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
__get_user(size_t size,const void * ptr,void * x)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