1#ifndef __DRM_DRM_LEGACY_H__
2#define __DRM_DRM_LEGACY_H__
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48struct drm_buf {
49 int idx;
50 int total;
51 int order;
52 int used;
53 unsigned long offset;
54 void *address;
55 unsigned long bus_address;
56 struct drm_buf *next;
57 __volatile__ int waiting;
58 __volatile__ int pending;
59 struct drm_file *file_priv;
60 int context;
61 int while_locked;
62 enum {
63 DRM_LIST_NONE = 0,
64 DRM_LIST_FREE = 1,
65 DRM_LIST_WAIT = 2,
66 DRM_LIST_PEND = 3,
67 DRM_LIST_PRIO = 4,
68 DRM_LIST_RECLAIM = 5
69 } list;
70
71 int dev_priv_size;
72 void *dev_private;
73};
74
75typedef struct drm_dma_handle {
76 dma_addr_t busaddr;
77 void *vaddr;
78 size_t size;
79} drm_dma_handle_t;
80
81
82
83
84struct drm_buf_entry {
85 int buf_size;
86 int buf_count;
87 struct drm_buf *buflist;
88 int seg_count;
89 int page_order;
90 struct drm_dma_handle **seglist;
91
92 int low_mark;
93 int high_mark;
94};
95
96
97
98
99struct drm_device_dma {
100
101 struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];
102 int buf_count;
103 struct drm_buf **buflist;
104 int seg_count;
105 int page_count;
106 unsigned long *pagelist;
107 unsigned long byte_count;
108 enum {
109 _DRM_DMA_USE_AGP = 0x01,
110 _DRM_DMA_USE_SG = 0x02,
111 _DRM_DMA_USE_FB = 0x04,
112 _DRM_DMA_USE_PCI_RO = 0x08
113 } flags;
114
115};
116
117
118
119
120struct drm_sg_mem {
121 unsigned long handle;
122 void *virtual;
123 int pages;
124 struct page **pagelist;
125 dma_addr_t *busaddr;
126};
127
128
129
130
131struct drm_local_map {
132 resource_size_t offset;
133 unsigned long size;
134 enum drm_map_type type;
135 enum drm_map_flags flags;
136 void *handle;
137
138 int mtrr;
139};
140
141typedef struct drm_local_map drm_local_map_t;
142
143
144
145
146struct drm_map_list {
147 struct list_head head;
148 struct drm_hash_item hash;
149 struct drm_local_map *map;
150 uint64_t user_token;
151 struct drm_master *master;
152};
153
154int drm_legacy_addmap(struct drm_device *d, resource_size_t offset,
155 unsigned int size, enum drm_map_type type,
156 enum drm_map_flags flags, struct drm_local_map **map_p);
157int drm_legacy_rmmap(struct drm_device *d, struct drm_local_map *map);
158int drm_legacy_rmmap_locked(struct drm_device *d, struct drm_local_map *map);
159struct drm_local_map *drm_legacy_getsarea(struct drm_device *dev);
160int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma);
161
162int drm_legacy_addbufs_agp(struct drm_device *d, struct drm_buf_desc *req);
163int drm_legacy_addbufs_pci(struct drm_device *d, struct drm_buf_desc *req);
164
165
166
167
168
169
170
171#define LOCK_TEST_WITH_RETURN( dev, _file_priv ) \
172do { \
173 if (!_DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock) || \
174 _file_priv->master->lock.file_priv != _file_priv) { \
175 DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\
176 __func__, _DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock),\
177 _file_priv->master->lock.file_priv, _file_priv); \
178 return -EINVAL; \
179 } \
180} while (0)
181
182void drm_legacy_idlelock_take(struct drm_lock_data *lock);
183void drm_legacy_idlelock_release(struct drm_lock_data *lock);
184
185
186void __drm_legacy_pci_free(struct drm_device *dev, drm_dma_handle_t * dmah);
187
188
189void drm_legacy_ioremap(struct drm_local_map *map, struct drm_device *dev);
190void drm_legacy_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
191void drm_legacy_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
192
193static __inline__ struct drm_local_map *drm_legacy_findmap(struct drm_device *dev,
194 unsigned int token)
195{
196 struct drm_map_list *_entry;
197 list_for_each_entry(_entry, &dev->maplist, head)
198 if (_entry->user_token == token)
199 return _entry->map;
200 return NULL;
201}
202
203#endif
204