Blame view

include/drm/drm_os_linux.h 3.94 KB
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
1
2
3
4
  /**
   * \file drm_os_linux.h
   * OS abstraction macros.
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
5
6
  #include <linux/interrupt.h>	/* For task queue support */
  #include <linux/delay.h>
87f0da553   Dave Airlie   drm: add DRM_READ...
7
  #ifndef readq
522b5cc7c   Dave Airlie   drm: fix missing ...
8
  static inline u64 readq(void __iomem *reg)
87f0da553   Dave Airlie   drm: add DRM_READ...
9
10
11
  {
  	return ((u64) readl(reg)) | (((u64) readl(reg + 4UL)) << 32);
  }
522b5cc7c   Dave Airlie   drm: fix missing ...
12
  static inline void writeq(u64 val, void __iomem *reg)
87f0da553   Dave Airlie   drm: add DRM_READ...
13
14
15
16
17
  {
  	writel(val & 0xffffffff, reg);
  	writel(val >> 32, reg + 0x4UL);
  }
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
18
  /** Current process ID */
ba25f9dcc   Pavel Emelyanov   Use helpers to ob...
19
  #define DRM_CURRENTPID			task_pid_nr(current)
925142431   Dave Airlie   drm: update VIA d...
20
  #define DRM_SUSER(p)			capable(CAP_SYS_ADMIN)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
21
22
23
24
25
26
27
28
29
30
31
32
33
34
  #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 */
87f0da553   Dave Airlie   drm: add DRM_READ...
35
36
37
38
39
  
  /** 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))
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
40
41
42
43
44
  #define DRM_READMEMORYBARRIER()		rmb()
  /** Write memory barrier */
  #define DRM_WRITEMEMORYBARRIER()	wmb()
  /** Read/write memory barrier */
  #define DRM_MEMORYBARRIER()		mb()
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
45
46
  
  /** IRQ handler arguments and return type and values */
7d12e780e   David Howells   IRQ: Maintain reg...
47
  #define DRM_IRQ_ARGS		int irq, void *arg
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
48
49
50
51
52
53
54
55
  
  /** 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 {
b5e89ed53   Dave Airlie   drm: lindent the ...
56
57
  	unsigned long aper_base;
  	unsigned long aper_size;
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
58
59
60
61
62
63
  };
  #define DRM_AGP_MEM             int
  #define DRM_AGP_KERN            struct no_agp_kern
  #endif
  
  #if !(__OS_HAS_MTRR)
b5e89ed53   Dave Airlie   drm: lindent the ...
64
65
  static __inline__ int mtrr_add(unsigned long base, unsigned long size,
  			       unsigned int type, char increment)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
66
67
68
  {
  	return -ENODEV;
  }
b5e89ed53   Dave Airlie   drm: lindent the ...
69
  static __inline__ int mtrr_del(int reg, unsigned long base, unsigned long size)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
70
71
72
  {
  	return -ENODEV;
  }
b5e89ed53   Dave Airlie   drm: lindent the ...
73

1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
74
75
76
  #define MTRR_TYPE_WRCOMB     1
  
  #endif
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
77
78
79
80
81
82
83
  /** 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 */
bc5f4523f   Dave Airlie   drm: run cleanfil...
84
  #define DRM_VERIFYAREA_READ( uaddr, size )		\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
85
  	(access_ok( VERIFY_READ, uaddr, size ) ? 0 : -EFAULT)
bc5f4523f   Dave Airlie   drm: run cleanfil...
86
  #define DRM_COPY_FROM_USER_UNCHECKED(arg1, arg2, arg3)	\
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
87
88
89
90
91
  	__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)
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
  #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)
48764bf43   Daniel Vetter   drm/i915: add i91...
117
  #define DRM_WAKEUP( queue ) wake_up( queue )
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
118
  #define DRM_INIT_WAITQUEUE( queue ) init_waitqueue_head( queue )