drm_os_linux.h 4.0 KB
Newer Older
L
Linus Torvalds 已提交
1 2 3 4 5 6 7 8
/**
 * \file drm_os_linux.h
 * OS abstraction macros.
 */

#include <linux/interrupt.h>	/* For task queue support */
#include <linux/delay.h>

9
#ifndef readq
10
static inline u64 readq(void __iomem *reg)
11 12 13 14
{
	return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
}

15
static inline void writeq(u64 val, void __iomem *reg)
16 17 18 19 20 21
{
	writel(val & 0xffffffff, reg);
	writel(val >> 32, reg + 0x4UL);
}
#endif

L
Linus Torvalds 已提交
22
/** Current process ID */
23
#define DRM_CURRENTPID			task_pid_nr(current)
D
Dave Airlie 已提交
24
#define DRM_SUSER(p)			capable(CAP_SYS_ADMIN)
L
Linus Torvalds 已提交
25 26 27 28 29 30 31 32 33 34 35 36 37 38
#define DRM_UDELAY(d)			udelay(d)
/** Read a byte from a MMIO region */
#define DRM_READ8(map, offset)		readb(((void __iomem *)(map)->handle) + (offset))
/** Read a word from a MMIO region */
#define DRM_READ16(map, offset)         readw(((void __iomem *)(map)->handle) + (offset))
/** Read a dword from a MMIO region */
#define DRM_READ32(map, offset)		readl(((void __iomem *)(map)->handle) + (offset))
/** Write a byte into a MMIO region */
#define DRM_WRITE8(map, offset, val)	writeb(val, ((void __iomem *)(map)->handle) + (offset))
/** Write a word into a MMIO region */
#define DRM_WRITE16(map, offset, val)   writew(val, ((void __iomem *)(map)->handle) + (offset))
/** Write a dword into a MMIO region */
#define DRM_WRITE32(map, offset, val)	writel(val, ((void __iomem *)(map)->handle) + (offset))
/** Read memory barrier */
39 40 41 42 43 44

/** Read a qword from a MMIO region - be careful using these unless you really understand them */
#define DRM_READ64(map, offset)		readq(((void __iomem *)(map)->handle) + (offset))
/** Write a qword into a MMIO region */
#define DRM_WRITE64(map, offset, val)	writeq(val, ((void __iomem *)(map)->handle) + (offset))

L
Linus Torvalds 已提交
45 46 47 48 49 50 51
#define DRM_READMEMORYBARRIER()		rmb()
/** Write memory barrier */
#define DRM_WRITEMEMORYBARRIER()	wmb()
/** Read/write memory barrier */
#define DRM_MEMORYBARRIER()		mb()

/** IRQ handler arguments and return type and values */
52
#define DRM_IRQ_ARGS		int irq, void *arg
L
Linus Torvalds 已提交
53 54 55 56 57 58 59 60

/** AGP types */
#if __OS_HAS_AGP
#define DRM_AGP_MEM		struct agp_memory
#define DRM_AGP_KERN		struct agp_kern_info
#else
/* define some dummy types for non AGP supporting kernels */
struct no_agp_kern {
D
Dave Airlie 已提交
61 62
	unsigned long aper_base;
	unsigned long aper_size;
L
Linus Torvalds 已提交
63 64 65 66 67 68
};
#define DRM_AGP_MEM             int
#define DRM_AGP_KERN            struct no_agp_kern
#endif

#if !(__OS_HAS_MTRR)
D
Dave Airlie 已提交
69 70
static __inline__ int mtrr_add(unsigned long base, unsigned long size,
			       unsigned int type, char increment)
L
Linus Torvalds 已提交
71 72 73 74
{
	return -ENODEV;
}

D
Dave Airlie 已提交
75
static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size)
L
Linus Torvalds 已提交
76 77 78
{
	return -ENODEV;
}
D
Dave Airlie 已提交
79

L
Linus Torvalds 已提交
80 81 82 83 84 85 86 87 88 89 90
#define MTRR_TYPE_WRCOMB     1

#endif

/** Other copying of data to kernel space */
#define DRM_COPY_FROM_USER(arg1, arg2, arg3)		\
	copy_from_user(arg1, arg2, arg3)
/** Other copying of data from kernel space */
#define DRM_COPY_TO_USER(arg1, arg2, arg3)		\
	copy_to_user(arg1, arg2, arg3)
/* Macros for copyfrom user, but checking readability only once */
D
Dave Airlie 已提交
91
#define DRM_VERIFYAREA_READ( uaddr, size )		\
L
Linus Torvalds 已提交
92
	(access_ok( VERIFY_READ, uaddr, size ) ? 0 : -EFAULT)
D
Dave Airlie 已提交
93
#define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3)	\
L
Linus Torvalds 已提交
94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127
	__copy_from_user(arg1, arg2, arg3)
#define DRM_COPY_TO_USER_UNCHECKED(arg1, arg2, arg3)	\
	__copy_to_user(arg1, arg2, arg3)
#define DRM_GET_USER_UNCHECKED(val, uaddr)		\
	__get_user(val, uaddr)

#define DRM_HZ HZ

#define DRM_WAIT_ON( ret, queue, timeout, condition )		\
do {								\
	DECLARE_WAITQUEUE(entry, current);			\
	unsigned long end = jiffies + (timeout);		\
	add_wait_queue(&(queue), &entry);			\
								\
	for (;;) {						\
		__set_current_state(TASK_INTERRUPTIBLE);	\
		if (condition)					\
			break;					\
		if (time_after_eq(jiffies, end)) {		\
			ret = -EBUSY;				\
			break;					\
		}						\
		schedule_timeout((HZ/100 > 1) ? HZ/100 : 1);	\
		if (signal_pending(current)) {			\
			ret = -EINTR;				\
			break;					\
		}						\
	}							\
	__set_current_state(TASK_RUNNING);			\
	remove_wait_queue(&(queue), &entry);			\
} while (0)

#define DRM_WAKEUP( queue ) wake_up_interruptible( queue )
#define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue )