/[pkgs]/rpms/kernel/F-10/drm-f10-compat.patch
ViewVC logotype

Contents of /rpms/kernel/F-10/drm-f10-compat.patch

Parent Directory Parent Directory | Revision Log Revision Log


Revision 1.1 - (show annotations) (download) (as text)
Fri Apr 3 03:26:36 2009 UTC (7 months, 3 weeks ago) by airlied
Branch: MAIN
CVS Tags: kernel-2_6_29_1-41_fc10, kernel-2_6_29_3-60_fc10, kernel-2_6_29_6-99_fc10, kernel-2_6_29_1-42_fc10, kernel-2_6_29_6-93_fc10, kernel-2_6_29_2-45_rc1_fc10, kernel-2_6_29_2-48_rc1_fc10, kernel-2_6_29_6-97_fc10, kernel-2_6_29_5-84_fc10, kernel-2_6_29_2-55_fc10, kernel-2_6_29_2-52_fc10, kernel-2_6_29_1-36_fc10, kernel-2_6_29_4-72_fc10, kernel-2_6_29_5-88_fc10, kernel-2_6_29_4-75_fc10, kernel-2_6_29_4-80_fc10, kernel-2_6_29_1-15_fc10, kernel-2_6_29_1-30_fc10, kernel-2_6_29_1-38_fc10, HEAD
File MIME type: text/x-patch
* Fri Apr 03 2009 Dave Airlie <airlied@redhat.com>
- add backwards drm compat for radeon kms
1 From 5b64dc2000826365cff157de0bbeaedc21eb90d7 Mon Sep 17 00:00:00 2001
2 From: Dave Airlie <airlied@redhat.com>
3 Date: Fri, 3 Apr 2009 13:19:09 +1000
4 Subject: [PATCH] drm: backwards compat layer on top of F11 DRM for F10
5
6 for radeon kms
7 ---
8 drivers/gpu/drm/radeon/radeon_gem.c | 254 +++++++++++++++++++++++++++++++++++
9 include/drm/drm.h | 39 +++---
10 include/drm/drm_mode.h | 23 ++--
11 include/drm/radeon_drm.h | 18 +++-
12 4 files changed, 306 insertions(+), 28 deletions(-)
13
14 diff --git a/drivers/gpu/drm/radeon/radeon_gem.c b/drivers/gpu/drm/radeon/radeon_gem.c
15 index ab9c005..2fd1c5d 100644
16 --- a/drivers/gpu/drm/radeon/radeon_gem.c
17 +++ b/drivers/gpu/drm/radeon/radeon_gem.c
18 @@ -30,6 +30,9 @@
19 static int radeon_gem_ib_init(struct drm_device *dev);
20 static int radeon_gem_ib_destroy(struct drm_device *dev);
21
22 +static int radeon_gem_dma_bufs_init(struct drm_device *dev);
23 +static void radeon_gem_dma_bufs_destroy(struct drm_device *dev);
24 +
25 int radeon_gem_init_object(struct drm_gem_object *obj)
26 {
27 struct drm_radeon_gem_object *obj_priv;
28 @@ -721,6 +724,7 @@ int radeon_alloc_gart_objects(struct drm_device *dev)
29
30 /* init the indirect buffers */
31 radeon_gem_ib_init(dev);
32 + radeon_gem_dma_bufs_init(dev);
33 return 0;
34
35 }
36 @@ -1158,6 +1162,8 @@ void radeon_gem_mm_fini(struct drm_device *dev)
37 {
38 drm_radeon_private_t *dev_priv = dev->dev_private;
39
40 + radeon_gem_dma_bufs_destroy(dev);
41 +
42 radeon_gem_ib_destroy(dev);
43
44 mutex_lock(&dev->struct_mutex);
45 @@ -1583,3 +1589,251 @@ void radeon_gem_update_offsets(struct drm_device *dev, struct drm_master *master
46 }
47
48
49 +
50 +#define RADEON_DMA_BUFFER_SIZE (64 * 1024)
51 +#define RADEON_DMA_BUFFER_COUNT (16)
52 +
53 +
54 +/**
55 + * Cleanup after an error on one of the addbufs() functions.
56 + *
57 + * \param dev DRM device.
58 + * \param entry buffer entry where the error occurred.
59 + *
60 + * Frees any pages and buffers associated with the given entry.
61 + */
62 +static void drm_cleanup_buf_error(struct drm_device * dev,
63 + struct drm_buf_entry * entry)
64 +{
65 + int i;
66 +
67 + if (entry->seg_count) {
68 + for (i = 0; i < entry->seg_count; i++) {
69 + if (entry->seglist[i]) {
70 + drm_pci_free(dev, entry->seglist[i]);
71 + }
72 + }
73 + drm_free(entry->seglist,
74 + entry->seg_count *
75 + sizeof(*entry->seglist), DRM_MEM_SEGS);
76 +
77 + entry->seg_count = 0;
78 + }
79 +
80 + if (entry->buf_count) {
81 + for (i = 0; i < entry->buf_count; i++) {
82 + if (entry->buflist[i].dev_private) {
83 + drm_free(entry->buflist[i].dev_private,
84 + entry->buflist[i].dev_priv_size,
85 + DRM_MEM_BUFS);
86 + }
87 + }
88 + drm_free(entry->buflist,
89 + entry->buf_count *
90 + sizeof(*entry->buflist), DRM_MEM_BUFS);
91 +
92 + entry->buf_count = 0;
93 + }
94 +}
95 +
96 +static int radeon_gem_addbufs(struct drm_device *dev)
97 +{
98 + struct drm_radeon_private *dev_priv = dev->dev_private;
99 + struct drm_device_dma *dma = dev->dma;
100 + struct drm_buf_entry *entry;
101 + struct drm_buf *buf;
102 + unsigned long offset;
103 + unsigned long agp_offset;
104 + int count;
105 + int order;
106 + int size;
107 + int alignment;
108 + int page_order;
109 + int total;
110 + int byte_count;
111 + int i;
112 + struct drm_buf **temp_buflist;
113 +
114 + if (!dma)
115 + return -EINVAL;
116 +
117 + count = RADEON_DMA_BUFFER_COUNT;
118 + order = drm_order(RADEON_DMA_BUFFER_SIZE);
119 + size = 1 << order;
120 +
121 + alignment = PAGE_ALIGN(size);
122 + page_order = order - PAGE_SHIFT > 0 ? order - PAGE_SHIFT : 0;
123 + total = PAGE_SIZE << page_order;
124 +
125 + byte_count = 0;
126 + agp_offset = dev_priv->mm.dma_bufs.bo->offset;
127 +
128 + DRM_DEBUG("count: %d\n", count);
129 + DRM_DEBUG("order: %d\n", order);
130 + DRM_DEBUG("size: %d\n", size);
131 + DRM_DEBUG("agp_offset: %lu\n", agp_offset);
132 + DRM_DEBUG("alignment: %d\n", alignment);
133 + DRM_DEBUG("page_order: %d\n", page_order);
134 + DRM_DEBUG("total: %d\n", total);
135 +
136 + if (order < DRM_MIN_ORDER || order > DRM_MAX_ORDER)
137 + return -EINVAL;
138 + if (dev->queue_count)
139 + return -EBUSY; /* Not while in use */
140 +
141 + spin_lock(&dev->count_lock);
142 + if (dev->buf_use) {
143 + spin_unlock(&dev->count_lock);
144 + return -EBUSY;
145 + }
146 + atomic_inc(&dev->buf_alloc);
147 + spin_unlock(&dev->count_lock);
148 +
149 + mutex_lock(&dev->struct_mutex);
150 + entry = &dma->bufs[order];
151 + if (entry->buf_count) {
152 + mutex_unlock(&dev->struct_mutex);
153 + atomic_dec(&dev->buf_alloc);
154 + return -ENOMEM; /* May only call once for each order */
155 + }
156 +
157 + if (count < 0 || count > 4096) {
158 + mutex_unlock(&dev->struct_mutex);
159 + atomic_dec(&dev->buf_alloc);
160 + return -EINVAL;
161 + }
162 +
163 + entry->buflist = drm_alloc(count * sizeof(*entry->buflist),
164 + DRM_MEM_BUFS);
165 + if (!entry->buflist) {
166 + mutex_unlock(&dev->struct_mutex);
167 + atomic_dec(&dev->buf_alloc);
168 + return -ENOMEM;
169 + }
170 + memset(entry->buflist, 0, count * sizeof(*entry->buflist));
171 +
172 + entry->buf_size = size;
173 + entry->page_order = page_order;
174 +
175 + offset = 0;
176 +
177 + while (entry->buf_count < count) {
178 + buf = &entry->buflist[entry->buf_count];
179 + buf->idx = dma->buf_count + entry->buf_count;
180 + buf->total = alignment;
181 + buf->order = order;
182 + buf->used = 0;
183 +
184 + buf->offset = (dma->byte_count + offset);
185 + buf->bus_address = dev_priv->gart_vm_start + agp_offset + offset;
186 + buf->address = (void *)(agp_offset + offset);
187 + buf->next = NULL;
188 + buf->waiting = 0;
189 + buf->pending = 0;
190 + init_waitqueue_head(&buf->dma_wait);
191 + buf->file_priv = NULL;
192 +
193 + buf->dev_priv_size = dev->driver->dev_priv_size;
194 + buf->dev_private = drm_alloc(buf->dev_priv_size, DRM_MEM_BUFS);
195 + if (!buf->dev_private) {
196 + /* Set count correctly so we free the proper amount. */
197 + entry->buf_count = count;
198 + drm_cleanup_buf_error(dev, entry);
199 + mutex_unlock(&dev->struct_mutex);
200 + atomic_dec(&dev->buf_alloc);
201 + return -ENOMEM;
202 + }
203 +
204 + memset(buf->dev_private, 0, buf->dev_priv_size);
205 +
206 + DRM_DEBUG("buffer %d @ %p\n", entry->buf_count, buf->address);
207 +
208 + offset += alignment;
209 + entry->buf_count++;
210 + byte_count += PAGE_SIZE << page_order;
211 + }
212 +
213 + DRM_DEBUG("byte_count: %d\n", byte_count);
214 +
215 + temp_buflist = drm_realloc(dma->buflist,
216 + dma->buf_count * sizeof(*dma->buflist),
217 + (dma->buf_count + entry->buf_count)
218 + * sizeof(*dma->buflist), DRM_MEM_BUFS);
219 + if (!temp_buflist) {
220 + /* Free the entry because it isn't valid */
221 + drm_cleanup_buf_error(dev, entry);
222 + mutex_unlock(&dev->struct_mutex);
223 + atomic_dec(&dev->buf_alloc);
224 + return -ENOMEM;
225 + }
226 + dma->buflist = temp_buflist;
227 +
228 + for (i = 0; i < entry->buf_count; i++) {
229 + dma->buflist[i + dma->buf_count] = &entry->buflist[i];
230 + }
231 +
232 + dma->buf_count += entry->buf_count;
233 + dma->seg_count += entry->seg_count;
234 + dma->page_count += byte_count >> PAGE_SHIFT;
235 + dma->byte_count += byte_count;
236 +
237 + DRM_DEBUG("dma->buf_count : %d\n", dma->buf_count);
238 + DRM_DEBUG("entry->buf_count : %d\n", entry->buf_count);
239 +
240 + mutex_unlock(&dev->struct_mutex);
241 +
242 + dma->flags = _DRM_DMA_USE_SG;
243 + atomic_dec(&dev->buf_alloc);
244 + return 0;
245 +}
246 +
247 +static int radeon_gem_dma_bufs_init(struct drm_device *dev)
248 +{
249 + struct drm_radeon_private *dev_priv = dev->dev_private;
250 + int size = RADEON_DMA_BUFFER_SIZE * RADEON_DMA_BUFFER_COUNT;
251 + int ret;
252 +
253 + ret = drm_dma_setup(dev);
254 + if (ret < 0)
255 + return ret;
256 +
257 + ret = drm_buffer_object_create(dev, size, drm_bo_type_kernel,
258 + DRM_BO_FLAG_READ | DRM_BO_FLAG_WRITE | DRM_BO_FLAG_NO_EVICT |
259 + DRM_BO_FLAG_MEM_TT | DRM_BO_FLAG_MAPPABLE, 0,
260 + 0, 0, &dev_priv->mm.dma_bufs.bo);
261 + if (ret) {
262 + DRM_ERROR("Failed to create DMA bufs\n");
263 + return -ENOMEM;
264 + }
265 +
266 + ret = drm_bo_kmap(dev_priv->mm.dma_bufs.bo, 0, size >> PAGE_SHIFT,
267 + &dev_priv->mm.dma_bufs.kmap);
268 + if (ret) {
269 + DRM_ERROR("Failed to mmap DMA buffers\n");
270 + return -ENOMEM;
271 + }
272 + dev_priv->mm.gart_useable -= size;
273 + DRM_DEBUG("\n");
274 + radeon_gem_addbufs(dev);
275 +
276 + DRM_DEBUG("%lx %d\n", dev_priv->mm.dma_bufs.bo->map_list.hash.key, size);
277 + dev->agp_buffer_token = dev_priv->mm.dma_bufs.bo->map_list.hash.key << PAGE_SHIFT;
278 + dev_priv->mm.fake_agp_map.handle = dev_priv->mm.dma_bufs.kmap.virtual;
279 + dev_priv->mm.fake_agp_map.size = size;
280 +
281 + dev->agp_buffer_map = &dev_priv->mm.fake_agp_map;
282 + dev_priv->gart_buffers_offset = dev_priv->mm.dma_bufs.bo->offset + dev_priv->gart_vm_start;
283 + return 0;
284 +}
285 +
286 +static void radeon_gem_dma_bufs_destroy(struct drm_device *dev)
287 +{
288 +
289 + struct drm_radeon_private *dev_priv = dev->dev_private;
290 + drm_dma_takedown(dev);
291 +
292 + if (dev_priv->mm.dma_bufs.bo) {
293 + drm_bo_kunmap(&dev_priv->mm.dma_bufs.kmap);
294 + drm_bo_usage_deref_unlocked(&dev_priv->mm.dma_bufs.bo);
295 + }
296 +}
297 diff --git a/include/drm/drm.h b/include/drm/drm.h
298 index 17a1e2c..fa02570 100644
299 --- a/include/drm/drm.h
300 +++ b/include/drm/drm.h
301 @@ -671,23 +671,28 @@ struct drm_gem_open {
302
303 #define DRM_IOCTL_UPDATE_DRAW DRM_IOW(0x3f, struct drm_update_draw)
304
305 -#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
306 -#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
307 -#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA2, struct drm_mode_crtc)
308 -#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xA3, struct drm_mode_cursor)
309 -#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xA4, struct drm_mode_crtc_lut)
310 -#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xA5, struct drm_mode_crtc_lut)
311 -#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xA6, struct drm_mode_get_encoder)
312 -#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA7, struct drm_mode_get_connector)
313 -#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA8, struct drm_mode_mode_cmd)
314 -#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd)
315 -
316 -#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAA, struct drm_mode_get_property)
317 -#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xAB, struct drm_mode_connector_set_property)
318 -#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xAC, struct drm_mode_get_blob)
319 -#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xAD, struct drm_mode_fb_cmd)
320 -#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xAE, struct drm_mode_fb_cmd)
321 -#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xAF, unsigned int)
322 +#define DRM_IOCTL_MODE_GETRESOURCES DRM_IOWR(0xA0, struct drm_mode_card_res)
323 +#define DRM_IOCTL_MODE_GETCRTC DRM_IOWR(0xA1, struct drm_mode_crtc)
324 +#define DRM_IOCTL_MODE_GETCONNECTOR DRM_IOWR(0xA2, struct drm_mode_get_connector)
325 +#define DRM_IOCTL_MODE_SETCRTC DRM_IOWR(0xA3, struct drm_mode_crtc)
326 +#define DRM_IOCTL_MODE_ADDFB DRM_IOWR(0xA4, struct drm_mode_fb_cmd)
327 +#define DRM_IOCTL_MODE_RMFB DRM_IOWR(0xA5, unsigned int)
328 +#define DRM_IOCTL_MODE_GETFB DRM_IOWR(0xA6, struct drm_mode_fb_cmd)
329 +
330 +#define DRM_IOCTL_MODE_SETPROPERTY DRM_IOWR(0xA7, struct drm_mode_connector_set_property)
331 +#define DRM_IOCTL_MODE_GETPROPBLOB DRM_IOWR(0xA8, struct drm_mode_get_blob)
332 +#define DRM_IOCTL_MODE_ATTACHMODE DRM_IOWR(0xA9, struct drm_mode_mode_cmd)
333 +#define DRM_IOCTL_MODE_DETACHMODE DRM_IOWR(0xAA, struct drm_mode_mode_cmd)
334 +
335 +#define DRM_IOCTL_MODE_GETPROPERTY DRM_IOWR(0xAB, struct drm_mode_get_property)
336 +#define DRM_IOCTL_MODE_CURSOR DRM_IOWR(0xAC, struct drm_mode_cursor)
337 +#define DRM_IOCTL_MODE_HOTPLUG DRM_IOWR(0xAD, struct drm_mode_hotplug)
338 +#define DRM_IOCTL_WAIT_HOTPLUG DRM_IOWR(0xAE, union drm_wait_hotplug)
339 +
340 +#define DRM_IOCTL_MODE_REPLACEFB DRM_IOWR(0xAF, struct drm_mode_fb_cmd)
341 +#define DRM_IOCTL_MODE_GETENCODER DRM_IOWR(0xB0, struct drm_mode_get_encoder)
342 +#define DRM_IOCTL_MODE_GETGAMMA DRM_IOWR(0xB1, struct drm_mode_crtc_lut)
343 +#define DRM_IOCTL_MODE_SETGAMMA DRM_IOWR(0xB2, struct drm_mode_crtc_lut)
344
345 /**
346 * Device specific ioctls should only be in their respective headers
347 diff --git a/include/drm/drm_mode.h b/include/drm/drm_mode.h
348 index 601d2bd..58417e5 100644
349 --- a/include/drm/drm_mode.h
350 +++ b/include/drm/drm_mode.h
351 @@ -126,10 +126,11 @@ struct drm_mode_crtc {
352 #define DRM_MODE_ENCODER_TVDAC 4
353
354 struct drm_mode_get_encoder {
355 - uint32_t encoder_id;
356 - uint32_t encoder_type;
357
358 - uint32_t crtc_id; /**< Id of crtc */
359 + unsigned int encoder_type;
360 + unsigned int encoder_id;
361 +
362 + unsigned int crtc_id; /**< Id of crtc */
363
364 uint32_t possible_crtcs;
365 uint32_t possible_clones;
366 @@ -216,13 +217,15 @@ struct drm_mode_get_blob {
367 };
368
369 struct drm_mode_fb_cmd {
370 - uint32_t fb_id;
371 - uint32_t width, height;
372 - uint32_t pitch;
373 - uint32_t bpp;
374 - uint32_t depth;
375 - /* driver specific handle */
376 - uint32_t handle;
377 + union {
378 + unsigned int fb_id;
379 + unsigned int buffer_id;
380 + };
381 + unsigned int width, height;
382 + unsigned int pitch;
383 + unsigned int bpp;
384 + unsigned int handle;
385 + unsigned int depth;
386 };
387
388 struct drm_mode_mode_cmd {
389 diff --git a/include/drm/radeon_drm.h b/include/drm/radeon_drm.h
390 index f716e0a..d6a233f 100644
391 --- a/include/drm/radeon_drm.h
392 +++ b/include/drm/radeon_drm.h
393 @@ -514,7 +514,8 @@ typedef struct {
394 #define DRM_RADEON_GEM_SET_DOMAIN 0x23
395 #define DRM_RADEON_GEM_WAIT_RENDERING 0x24
396
397 -#define DRM_RADEON_CS 0x26
398 +#define DRM_RADEON_CS 0x26
399 +#define DRM_RADEON_CS2 0x26
400
401 #define DRM_IOCTL_RADEON_CP_INIT DRM_IOW( DRM_COMMAND_BASE + DRM_RADEON_CP_INIT, drm_radeon_init_t)
402 #define DRM_IOCTL_RADEON_CP_START DRM_IO( DRM_COMMAND_BASE + DRM_RADEON_CP_START)
403 @@ -554,6 +555,7 @@ typedef struct {
404 #define DRM_IOCTL_RADEON_GEM_SET_DOMAIN DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_GEM_SET_DOMAIN, struct drm_radeon_gem_set_domain)
405 #define DRM_IOCTL_RADEON_GEM_WAIT_RENDERING DRM_IOW(DRM_COMMAND_BASE + DRM_RADEON_GEM_WAIT_RENDERING, struct drm_radeon_gem_wait_rendering)
406 #define DRM_IOCTL_RADEON_CS DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS, struct drm_radeon_cs)
407 +#define DRM_IOCTL_RADEON_CS2 DRM_IOWR(DRM_COMMAND_BASE + DRM_RADEON_CS2, struct drm_radeon_cs2)
408
409
410 typedef struct drm_radeon_init {
411 @@ -869,6 +871,14 @@ struct drm_radeon_gem_pwrite {
412
413 /* New interface which obsolete all previous interface.
414 */
415 +
416 +
417 +struct drm_radeon_cs_old {
418 + uint32_t dwords;
419 + uint32_t cs_id;
420 + uint64_t packets;
421 +};
422 +
423 #define RADEON_CHUNK_ID_RELOCS 0x01
424 #define RADEON_CHUNK_ID_IB 0x02
425 #define RADEON_CHUNK_ID_OLD 0xff
426 @@ -886,5 +896,11 @@ struct drm_radeon_cs {
427 cs chunks */
428 };
429
430 +struct drm_radeon_cs2 {
431 + uint32_t num_chunks;
432 + uint32_t cs_id;
433 + uint64_t chunks; /* this points to uint64_t * which point to
434 + cs chunks */
435 +};
436
437 #endif
438 --
439 1.6.0.6
440

admin@fedoraproject.org
ViewVC Help
Powered by ViewVC 1.1.2