summaryrefslogtreecommitdiffstats
path: root/sys/dev/drm2/drm_os_freebsd.h
diff options
context:
space:
mode:
Diffstat (limited to 'sys/dev/drm2/drm_os_freebsd.h')
-rw-r--r--sys/dev/drm2/drm_os_freebsd.h332
1 files changed, 323 insertions, 9 deletions
diff --git a/sys/dev/drm2/drm_os_freebsd.h b/sys/dev/drm2/drm_os_freebsd.h
index 8aa660a..f590493 100644
--- a/sys/dev/drm2/drm_os_freebsd.h
+++ b/sys/dev/drm2/drm_os_freebsd.h
@@ -10,6 +10,7 @@ __FBSDID("$FreeBSD$");
#define _DRM_OS_FREEBSD_H_
#include <sys/fbio.h>
+#include <sys/smp.h>
#if _BYTE_ORDER == _BIG_ENDIAN
#define __BIG_ENDIAN 4321
@@ -24,10 +25,22 @@ __FBSDID("$FreeBSD$");
#endif
#ifndef __user
-#define __user
+#define __user
#endif
#ifndef __iomem
-#define __iomem
+#define __iomem
+#endif
+#ifndef __always_unused
+#define __always_unused
+#endif
+#ifndef __must_check
+#define __must_check
+#endif
+#ifndef __force
+#define __force
+#endif
+#ifndef uninitialized_var
+#define uninitialized_var(x) x
#endif
#define cpu_to_le16(x) htole16(x)
@@ -69,9 +82,23 @@ typedef void irqreturn_t;
#define __exit
#define __read_mostly
-#define WARN_ON(cond) KASSERT(!(cond), ("WARN ON: " #cond))
+#define BUILD_BUG_ON(x) CTASSERT(!(x))
+#define BUILD_BUG_ON_NOT_POWER_OF_2(x)
+
+#ifndef WARN
+#define WARN(condition, format, ...) ({ \
+ int __ret_warn_on = !!(condition); \
+ if (unlikely(__ret_warn_on)) \
+ DRM_ERROR(format, ##__VA_ARGS__); \
+ unlikely(__ret_warn_on); \
+})
+#endif
+#define WARN_ONCE(condition, format, ...) \
+ WARN(condition, format, ##__VA_ARGS__)
+#define WARN_ON(cond) WARN(cond, "WARN ON: " #cond)
#define WARN_ON_SMP(cond) WARN_ON(cond)
-#define BUG_ON(cond) KASSERT(!(cond), ("BUG ON: " #cond))
+#define BUG() panic("BUG")
+#define BUG_ON(cond) KASSERT(!(cond), ("BUG ON: " #cond " -> 0x%jx", (uintmax_t)(cond)))
#define unlikely(x) __builtin_expect(!!(x), 0)
#define likely(x) __builtin_expect(!!(x), 1)
#define container_of(ptr, type, member) ({ \
@@ -93,6 +120,15 @@ typedef void irqreturn_t;
#define DRM_UDELAY(udelay) DELAY(udelay)
#define drm_msleep(x, msg) pause((msg), ((int64_t)(x)) * hz / 1000)
#define DRM_MSLEEP(msecs) drm_msleep((msecs), "drm_msleep")
+#define get_seconds() time_second
+
+#define ioread8(addr) *(volatile uint8_t *)((char *)addr)
+#define ioread16(addr) *(volatile uint16_t *)((char *)addr)
+#define ioread32(addr) *(volatile uint32_t *)((char *)addr)
+
+#define iowrite8(data, addr) *(volatile uint8_t *)((char *)addr) = data;
+#define iowrite16(data, addr) *(volatile uint16_t *)((char *)addr) = data;
+#define iowrite32(data, addr) *(volatile uint32_t *)((char *)addr) = data;
#define DRM_READ8(map, offset) \
*(volatile u_int8_t *)(((vm_offset_t)(map)->handle) + \
@@ -127,12 +163,18 @@ typedef void irqreturn_t;
#define DRM_WRITEMEMORYBARRIER() wmb()
#define DRM_MEMORYBARRIER() mb()
#define smp_rmb() rmb()
+#define smp_wmb() wmb()
#define smp_mb__before_atomic_inc() mb()
#define smp_mb__after_atomic_inc() mb()
+#define barrier() __compiler_membar()
#define do_div(a, b) ((a) /= (b))
#define div64_u64(a, b) ((a) / (b))
#define lower_32_bits(n) ((u32)(n))
+#define upper_32_bits(n) ((u32)(((n) >> 16) >> 16))
+
+#define __set_bit(n, s) set_bit((n), (s))
+#define __clear_bit(n, s) clear_bit((n), (s))
#define min_t(type, x, y) ({ \
type __min1 = (x); \
@@ -148,6 +190,10 @@ typedef void irqreturn_t;
#define memcpy_fromio(a, b, c) memcpy((a), (b), (c))
#define memcpy_toio(a, b, c) memcpy((a), (b), (c))
+#define VERIFY_READ VM_PROT_READ
+#define VERIFY_WRITE VM_PROT_WRITE
+#define access_ok(prot, p, l) useracc((p), (l), (prot))
+
/* XXXKIB what is the right code for the FreeBSD ? */
/* kib@ used ENXIO here -- dumbbell@ */
#define EREMOTEIO EIO
@@ -170,8 +216,10 @@ typedef void irqreturn_t;
#define PCI_VENDOR_ID_SONY 0x104d
#define PCI_VENDOR_ID_VIA 0x1106
-#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
-#define hweight32(i) bitcount32(i)
+#define DIV_ROUND_UP(n,d) (((n) + (d) - 1) / (d))
+#define DIV_ROUND_CLOSEST(n,d) (((n) + (d) / 2) / (d))
+#define div_u64(n, d) ((n) / (d))
+#define hweight32(i) bitcount32(i)
static inline unsigned long
roundup_pow_of_two(unsigned long x)
@@ -195,6 +243,8 @@ ror32(uint32_t word, unsigned int shift)
}
#define IS_ALIGNED(x, y) (((x) & ((y) - 1)) == 0)
+#define round_down(x, y) rounddown2((x), (y))
+#define round_up(x, y) roundup2((x), (y))
#define get_unaligned(ptr) \
({ __typeof__(*(ptr)) __tmp; \
memcpy(&__tmp, (ptr), sizeof(*(ptr))); __tmp; })
@@ -251,7 +301,9 @@ abs64(int64_t x)
int64_t timeval_to_ns(const struct timeval *tv);
struct timeval ns_to_timeval(const int64_t nsec);
-#define PAGE_ALIGN(addr) round_page(addr)
+#define PAGE_ALIGN(addr) round_page(addr)
+#define page_to_phys(x) VM_PAGE_TO_PHYS(x)
+#define offset_in_page(x) ((x) & PAGE_MASK)
#define drm_get_device_from_kdev(_kdev) (((struct drm_minor *)(_kdev)->si_drv1)->dev)
@@ -295,20 +347,193 @@ __get_user(size_t size, const void *ptr, void *x)
}
#define get_user(x, ptr) __get_user(sizeof(*ptr), (ptr), &(x))
+static inline int
+__copy_to_user_inatomic(void __user *to, const void *from, unsigned n)
+{
+
+ return (copyout_nofault(from, to, n) != 0 ? n : 0);
+}
+#define __copy_to_user_inatomic_nocache(to, from, n) \
+ __copy_to_user_inatomic((to), (from), (n))
+
+static inline unsigned long
+__copy_from_user_inatomic(void *to, const void __user *from,
+ unsigned long n)
+{
+
+ /*
+ * XXXKIB. Equivalent Linux function is implemented using
+ * MOVNTI for aligned moves. For unaligned head and tail,
+ * normal move is performed. As such, it is not incorrect, if
+ * only somewhat slower, to use normal copyin. All uses
+ * except shmem_pwrite_fast() have the destination mapped WC.
+ */
+ return ((copyin_nofault(__DECONST(void *, from), to, n) != 0 ? n : 0));
+}
+#define __copy_from_user_inatomic_nocache(to, from, n) \
+ __copy_from_user_inatomic((to), (from), (n))
+
+static inline int
+fault_in_multipages_readable(const char __user *uaddr, int size)
+{
+ char c;
+ int ret = 0;
+ const char __user *end = uaddr + size - 1;
+
+ if (unlikely(size == 0))
+ return ret;
+
+ while (uaddr <= end) {
+ ret = -copyin(uaddr, &c, 1);
+ if (ret != 0)
+ return -EFAULT;
+ uaddr += PAGE_SIZE;
+ }
+
+ /* Check whether the range spilled into the next page. */
+ if (((unsigned long)uaddr & ~PAGE_MASK) ==
+ ((unsigned long)end & ~PAGE_MASK)) {
+ ret = -copyin(end, &c, 1);
+ }
+
+ return ret;
+}
+
+static inline int
+fault_in_multipages_writeable(char __user *uaddr, int size)
+{
+ int ret = 0;
+ char __user *end = uaddr + size - 1;
+
+ if (unlikely(size == 0))
+ return ret;
+
+ /*
+ * Writing zeroes into userspace here is OK, because we know that if
+ * the zero gets there, we'll be overwriting it.
+ */
+ while (uaddr <= end) {
+ ret = subyte(uaddr, 0);
+ if (ret != 0)
+ return -EFAULT;
+ uaddr += PAGE_SIZE;
+ }
+
+ /* Check whether the range spilled into the next page. */
+ if (((unsigned long)uaddr & ~PAGE_MASK) ==
+ ((unsigned long)end & ~PAGE_MASK))
+ ret = subyte(end, 0);
+
+ return ret;
+}
+
+enum __drm_capabilities {
+ CAP_SYS_ADMIN
+};
+
+static inline bool
+capable(enum __drm_capabilities cap)
+{
+
+ switch (cap) {
+ case CAP_SYS_ADMIN:
+ return DRM_SUSER(curthread);
+ }
+}
+
+#define to_user_ptr(x) ((void *)(uintptr_t)(x))
#define sigemptyset(set) SIGEMPTYSET(set)
#define sigaddset(set, sig) SIGADDSET(set, sig)
#define DRM_LOCK(dev) sx_xlock(&(dev)->dev_struct_lock)
#define DRM_UNLOCK(dev) sx_xunlock(&(dev)->dev_struct_lock)
+extern unsigned long drm_linux_timer_hz_mask;
#define jiffies ticks
#define jiffies_to_msecs(x) (((int64_t)(x)) * 1000 / hz)
#define msecs_to_jiffies(x) (((int64_t)(x)) * hz / 1000)
+#define timespec_to_jiffies(x) (((x)->tv_sec * 1000000 + (x)->tv_nsec) * hz / 1000000)
#define time_after(a,b) ((long)(b) - (long)(a) < 0)
#define time_after_eq(a,b) ((long)(b) - (long)(a) <= 0)
+#define round_jiffies(j) ((unsigned long)(((j) + drm_linux_timer_hz_mask) & ~drm_linux_timer_hz_mask))
+#define round_jiffies_up(j) round_jiffies(j) /* TODO */
+#define round_jiffies_up_relative(j) round_jiffies_up(j) /* TODO */
+
+#define getrawmonotonic(ts) getnanouptime(ts)
+
+#define wake_up(queue) wakeup_one((void *)queue)
+#define wake_up_interruptible(queue) wakeup_one((void *)queue)
+#define wake_up_all(queue) wakeup((void *)queue)
+#define wake_up_interruptible_all(queue) wakeup((void *)queue)
+
+struct completion {
+ unsigned int done;
+ struct mtx lock;
+};
+
+#define INIT_COMPLETION(c) ((c).done = 0);
+
+static inline void
+init_completion(struct completion *c)
+{
+
+ mtx_init(&c->lock, "drmcompl", NULL, MTX_DEF);
+ c->done = 0;
+}
+
+static inline void
+free_completion(struct completion *c)
+{
+
+ mtx_destroy(&c->lock);
+}
+
+static inline void
+complete_all(struct completion *c)
+{
-#define wake_up(queue) wakeup((void *)queue)
-#define wake_up_interruptible(queue) wakeup((void *)queue)
+ mtx_lock(&c->lock);
+ c->done++;
+ mtx_unlock(&c->lock);
+ wakeup(c);
+}
+
+static inline long
+wait_for_completion_interruptible_timeout(struct completion *c,
+ unsigned long timeout)
+{
+ unsigned long start_jiffies, elapsed_jiffies;
+ bool timeout_expired = false, awakened = false;
+ long ret = timeout;
+
+ start_jiffies = ticks;
+
+ mtx_lock(&c->lock);
+ while (c->done == 0 && !timeout_expired) {
+ ret = -msleep(c, &c->lock, PCATCH, "drmwco", timeout);
+ switch(ret) {
+ case -EWOULDBLOCK:
+ timeout_expired = true;
+ ret = 0;
+ break;
+ case -EINTR:
+ case -ERESTART:
+ ret = -ERESTARTSYS;
+ break;
+ case 0:
+ awakened = true;
+ break;
+ }
+ }
+ mtx_unlock(&c->lock);
+
+ if (awakened) {
+ elapsed_jiffies = ticks - start_jiffies;
+ ret = timeout > elapsed_jiffies ? timeout - elapsed_jiffies : 1;
+ }
+
+ return (ret);
+}
MALLOC_DECLARE(DRM_MEM_DMA);
MALLOC_DECLARE(DRM_MEM_SAREA);
@@ -356,6 +581,12 @@ typedef struct drm_pci_id_list
#if defined(__i386__) || defined(__amd64__)
#define CONFIG_ACPI
+#define CONFIG_DRM_I915_KMS
+#undef CONFIG_INTEL_IOMMU
+#endif
+
+#ifdef COMPAT_FREEBSD32
+#define CONFIG_COMPAT
#endif
#define CONFIG_AGP 1
@@ -364,19 +595,102 @@ typedef struct drm_pci_id_list
#define CONFIG_FB 1
extern const char *fb_mode_option;
+#undef CONFIG_DEBUG_FS
+#undef CONFIG_VGA_CONSOLE
+
#define EXPORT_SYMBOL(x)
+#define EXPORT_SYMBOL_GPL(x)
#define MODULE_AUTHOR(author)
#define MODULE_DESCRIPTION(desc)
#define MODULE_LICENSE(license)
#define MODULE_PARM_DESC(name, desc)
+#define MODULE_DEVICE_TABLE(name, list)
#define module_param_named(name, var, type, perm)
#define printk printf
+#define pr_err DRM_ERROR
+#define pr_warn DRM_WARNING
+#define pr_warn_once DRM_WARNING
#define KERN_DEBUG ""
+/* I2C compatibility. */
+#define I2C_M_RD IIC_M_RD
+#define I2C_M_WR IIC_M_WR
+#define I2C_M_NOSTART IIC_M_NOSTART
+
struct fb_info * framebuffer_alloc(void);
void framebuffer_release(struct fb_info *info);
+#define console_lock()
+#define console_unlock()
+#define console_trylock() true
+
+#define PM_EVENT_SUSPEND 0x0002
+#define PM_EVENT_QUIESCE 0x0008
+#define PM_EVENT_PRETHAW PM_EVENT_QUIESCE
+
+typedef struct pm_message {
+ int event;
+} pm_message_t;
+
+static inline int
+pci_read_config_byte(device_t kdev, int where, u8 *val)
+{
+
+ *val = (u8)pci_read_config(kdev, where, 1);
+ return (0);
+}
+
+static inline int
+pci_write_config_byte(device_t kdev, int where, u8 val)
+{
+
+ pci_write_config(kdev, where, val, 1);
+ return (0);
+}
+
+static inline int
+pci_read_config_word(device_t kdev, int where, uint16_t *val)
+{
+
+ *val = (uint16_t)pci_read_config(kdev, where, 2);
+ return (0);
+}
+
+static inline int
+pci_write_config_word(device_t kdev, int where, uint16_t val)
+{
+
+ pci_write_config(kdev, where, val, 2);
+ return (0);
+}
+
+static inline int
+pci_read_config_dword(device_t kdev, int where, uint32_t *val)
+{
+
+ *val = (uint32_t)pci_read_config(kdev, where, 4);
+ return (0);
+}
+
+static inline int
+pci_write_config_dword(device_t kdev, int where, uint32_t val)
+{
+
+ pci_write_config(kdev, where, val, 4);
+ return (0);
+}
+
+static inline void
+on_each_cpu(void callback(void *data), void *data, int wait)
+{
+
+ smp_rendezvous(NULL, callback, NULL, data);
+}
+
+void hex_dump_to_buffer(const void *buf, size_t len, int rowsize,
+ int groupsize, char *linebuf, size_t linebuflen, bool ascii);
+
#define KIB_NOTYET() \
do { \
if (drm_debug && drm_notyet) \
OpenPOWER on IntegriCloud