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#include <drm/drm.h>
37#include <drm/drm_auth.h>
38#include <drm/drm_hashtab.h>
39
40struct drm_device;
41struct drm_driver;
42struct file;
43struct pci_driver;
44
45
46
47
48
49
50
51
52
53
54
55struct drm_buf {
56 int idx;
57 int total;
58 int order;
59 int used;
60 unsigned long offset;
61 void *address;
62 unsigned long bus_address;
63 struct drm_buf *next;
64 __volatile__ int waiting;
65 __volatile__ int pending;
66 struct drm_file *file_priv;
67 int context;
68 int while_locked;
69 enum {
70 DRM_LIST_NONE = 0,
71 DRM_LIST_FREE = 1,
72 DRM_LIST_WAIT = 2,
73 DRM_LIST_PEND = 3,
74 DRM_LIST_PRIO = 4,
75 DRM_LIST_RECLAIM = 5
76 } list;
77
78 int dev_priv_size;
79 void *dev_private;
80};
81
82typedef struct drm_dma_handle {
83 dma_addr_t busaddr;
84 void *vaddr;
85 size_t size;
86} drm_dma_handle_t;
87
88
89
90
91struct drm_buf_entry {
92 int buf_size;
93 int buf_count;
94 struct drm_buf *buflist;
95 int seg_count;
96 int page_order;
97 struct drm_dma_handle **seglist;
98
99 int low_mark;
100 int high_mark;
101};
102
103
104
105
106struct drm_device_dma {
107
108 struct drm_buf_entry bufs[DRM_MAX_ORDER + 1];
109 int buf_count;
110 struct drm_buf **buflist;
111 int seg_count;
112 int page_count;
113 unsigned long *pagelist;
114 unsigned long byte_count;
115 enum {
116 _DRM_DMA_USE_AGP = 0x01,
117 _DRM_DMA_USE_SG = 0x02,
118 _DRM_DMA_USE_FB = 0x04,
119 _DRM_DMA_USE_PCI_RO = 0x08
120 } flags;
121
122};
123
124
125
126
127struct drm_sg_mem {
128 unsigned long handle;
129 void *virtual;
130 int pages;
131 struct page **pagelist;
132 dma_addr_t *busaddr;
133};
134
135
136
137
138struct drm_local_map {
139 dma_addr_t offset;
140 unsigned long size;
141 enum drm_map_type type;
142 enum drm_map_flags flags;
143 void *handle;
144
145 int mtrr;
146};
147
148typedef struct drm_local_map drm_local_map_t;
149
150
151
152
153struct drm_map_list {
154 struct list_head head;
155 struct drm_hash_item hash;
156 struct drm_local_map *map;
157 uint64_t user_token;
158 struct drm_master *master;
159};
160
161int drm_legacy_addmap(struct drm_device *d, resource_size_t offset,
162 unsigned int size, enum drm_map_type type,
163 enum drm_map_flags flags, struct drm_local_map **map_p);
164struct drm_local_map *drm_legacy_findmap(struct drm_device *dev, unsigned int token);
165void drm_legacy_rmmap(struct drm_device *d, struct drm_local_map *map);
166int drm_legacy_rmmap_locked(struct drm_device *d, struct drm_local_map *map);
167struct drm_local_map *drm_legacy_getsarea(struct drm_device *dev);
168int drm_legacy_mmap(struct file *filp, struct vm_area_struct *vma);
169
170int drm_legacy_addbufs_agp(struct drm_device *d, struct drm_buf_desc *req);
171int drm_legacy_addbufs_pci(struct drm_device *d, struct drm_buf_desc *req);
172
173
174
175
176
177
178
179#define LOCK_TEST_WITH_RETURN( dev, _file_priv ) \
180do { \
181 if (!_DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock) || \
182 _file_priv->master->lock.file_priv != _file_priv) { \
183 DRM_ERROR( "%s called without lock held, held %d owner %p %p\n",\
184 __func__, _DRM_LOCK_IS_HELD(_file_priv->master->lock.hw_lock->lock),\
185 _file_priv->master->lock.file_priv, _file_priv); \
186 return -EINVAL; \
187 } \
188} while (0)
189
190void drm_legacy_idlelock_take(struct drm_lock_data *lock);
191void drm_legacy_idlelock_release(struct drm_lock_data *lock);
192
193
194
195#ifdef CONFIG_PCI
196
197struct drm_dma_handle *drm_pci_alloc(struct drm_device *dev, size_t size,
198 size_t align);
199void drm_pci_free(struct drm_device *dev, struct drm_dma_handle *dmah);
200
201int drm_legacy_pci_init(struct drm_driver *driver, struct pci_driver *pdriver);
202void drm_legacy_pci_exit(struct drm_driver *driver, struct pci_driver *pdriver);
203
204#else
205
206static inline struct drm_dma_handle *drm_pci_alloc(struct drm_device *dev,
207 size_t size, size_t align)
208{
209 return NULL;
210}
211
212static inline void drm_pci_free(struct drm_device *dev,
213 struct drm_dma_handle *dmah)
214{
215}
216
217static inline int drm_legacy_pci_init(struct drm_driver *driver,
218 struct pci_driver *pdriver)
219{
220 return -EINVAL;
221}
222
223static inline void drm_legacy_pci_exit(struct drm_driver *driver,
224 struct pci_driver *pdriver)
225{
226}
227
228#endif
229
230
231void drm_legacy_ioremap(struct drm_local_map *map, struct drm_device *dev);
232void drm_legacy_ioremap_wc(struct drm_local_map *map, struct drm_device *dev);
233void drm_legacy_ioremapfree(struct drm_local_map *map, struct drm_device *dev);
234
235#endif
236