2 * \file drm_os_freebsd.h
3 * OS abstraction macros.
9 #ifndef _DRM_OS_FREEBSD_H_
10 #define _DRM_OS_FREEBSD_H_
14 #if _BYTE_ORDER == _BIG_ENDIAN
15 #define __BIG_ENDIAN 4321
17 #define __LITTLE_ENDIAN 1234
21 #define BITS_PER_LONG 64
23 #define BITS_PER_LONG 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)
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)
44 typedef vm_paddr_t dma_addr_t;
45 typedef vm_paddr_t resource_size_t;
46 #define wait_queue_head_t atomic_t
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;
63 #define DRM_IRQ_ARGS void *arg
64 typedef void irqreturn_t;
65 #define IRQ_HANDLED /* nothing */
66 #define IRQ_NONE /* nothing */
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) );})
81 #define KHZ2PICOS(a) (1000000000UL/(a))
83 #define ARRAY_SIZE(x) (sizeof(x)/sizeof(x[0]))
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); \
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")
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)
122 /* DRM_READMEMORYBARRIER() prevents reordering of reads.
123 * DRM_WRITEMEMORYBARRIER() prevents reordering of writes.
124 * DRM_MEMORYBARRIER() prevents reordering of reads and writes.
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()
133 #define do_div(a, b) ((a) /= (b))
134 #define div64_u64(a, b) ((a) / (b))
135 #define lower_32_bits(n) ((u32)(n))
137 #define min_t(type, x, y) ({ \
140 __min1 < __min2 ? __min1 : __min2; })
142 #define max_t(type, x, y) ({ \
145 __max1 > __max2 ? __max1 : __max2; })
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))
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. */
156 #define KTR_DRM KTR_DEV
157 #define KTR_DRM_REG KTR_SPARE3
159 #define DRM_AGP_KERN struct agp_info
160 #define DRM_AGP_MEM void
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
173 #define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
174 #define hweight32(i) bitcount32(i)
176 static inline unsigned long
177 roundup_pow_of_two(unsigned long x)
180 return (1UL << flsl(x - 1));
184 * ror32 - rotate a 32-bit value right
185 * @word: value to rotate
186 * @shift: bits to roll
188 * Source: include/linux/bitops.h
190 static inline uint32_t
191 ror32(uint32_t word, unsigned int shift)
194 return (word >> shift) | (word << (32 - shift));
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; })
202 #if _BYTE_ORDER == _LITTLE_ENDIAN
203 /* Taken from linux/include/linux/unaligned/le_struct.h. */
204 struct __una_u32 { u32 x; } __packed;
207 __get_unaligned_cpu32(const void *p)
209 const struct __una_u32 *ptr = (const struct __una_u32 *)p;
215 get_unaligned_le32(const void *p)
218 return (__get_unaligned_cpu32((const u8 *)p));
221 /* Taken from linux/include/linux/unaligned/le_byteshift.h. */
223 __get_unaligned_le32(const u8 *p)
226 return (p[0] | p[1] << 8 | p[2] << 16 | p[3] << 24);
230 get_unaligned_le32(const void *p)
233 return (__get_unaligned_le32((const u8 *)p));
237 static inline unsigned long
238 ilog2(unsigned long x)
241 return (flsl(x) - 1);
244 static inline int64_t
248 return (x < 0 ? -x : x);
251 int64_t timeval_to_ns(const struct timeval *tv);
252 struct timeval ns_to_timeval(const int64_t nsec);
254 #define PAGE_ALIGN(addr) round_page(addr)
256 #define drm_get_device_from_kdev(_kdev) (((struct drm_minor *)(_kdev)->si_drv1)->dev)
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)
265 __copy_to_user(void __user *to, const void *from, unsigned long n)
267 return (copyout(from, to, n) != 0 ? n : 0);
269 #define copy_to_user(to, from, n) __copy_to_user((to), (from), (n))
272 __put_user(size_t size, void *ptr, void *x)
275 size = copy_to_user(ptr, x, size);
277 return (size ? -EFAULT : size);
279 #define put_user(x, ptr) __put_user(sizeof(*ptr), (ptr), &(x))
281 static inline unsigned long
282 __copy_from_user(void *to, const void __user *from, unsigned long n)
284 return ((copyin(__DECONST(void *, from), to, n) != 0 ? n : 0));
286 #define copy_from_user(to, from, n) __copy_from_user((to), (from), (n))
289 __get_user(size_t size, const void *ptr, void *x)
292 size = copy_from_user(x, ptr, size);
294 return (size ? -EFAULT : size);
296 #define get_user(x, ptr) __get_user(sizeof(*ptr), (ptr), &(x))
298 #define sigemptyset(set) SIGEMPTYSET(set)
299 #define sigaddset(set, sig) SIGADDSET(set, sig)
301 #define DRM_LOCK(dev) sx_xlock(&(dev)->dev_struct_lock)
302 #define DRM_UNLOCK(dev) sx_xunlock(&(dev)->dev_struct_lock)
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)
310 #define wake_up(queue) wakeup((void *)queue)
311 #define wake_up_interruptible(queue) wakeup((void *)queue)
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);
336 #define simple_strtol(a, b, c) strtol((a), (b), (c))
338 typedef struct drm_pci_id_list
351 #define CONFIG_X86_64 1
354 #define CONFIG_IA64 1
357 #if defined(__i386__) || defined(__amd64__)
362 #define CONFIG_MTRR 1
365 extern const char *fb_mode_option;
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)
374 #define printk printf
375 #define KERN_DEBUG ""
377 struct fb_info * framebuffer_alloc(void);
378 void framebuffer_release(struct fb_info *info);
380 #define KIB_NOTYET() \
382 if (drm_debug && drm_notyet) \
383 printf("NOTYET: %s at %s:%d\n", __func__, __FILE__, __LINE__); \
386 #endif /* _DRM_OS_FREEBSD_H_ */