Subversion Repositories Kolibri OS

Rev

Rev 1179 | Rev 1963 | Go to most recent revision | Show entire file | Regard whitespace | Details | Blame | Last modification | View Log | RSS feed

Rev 1179 Rev 1404
Line 28... Line 28...
28
#include "drmP.h"
28
#include "drmP.h"
29
#include "drm.h"
29
#include "drm.h"
30
#include "radeon_drm.h"
30
#include "radeon_drm.h"
31
#include "radeon.h"
31
#include "radeon.h"
Line 32... Line -...
32
 
-
 
33
 
-
 
34
#define TTM_PL_SYSTEM           0
-
 
35
#define TTM_PL_TT               1
-
 
36
#define TTM_PL_VRAM             2
-
 
37
#define TTM_PL_PRIV0            3
-
 
38
#define TTM_PL_PRIV1            4
-
 
39
#define TTM_PL_PRIV2            5
-
 
40
#define TTM_PL_PRIV3            6
-
 
41
#define TTM_PL_PRIV4            7
-
 
42
#define TTM_PL_PRIV5            8
-
 
43
#define TTM_PL_SWAPPED          15
-
 
44
 
-
 
45
#define TTM_PL_FLAG_SYSTEM      (1 << TTM_PL_SYSTEM)
-
 
46
#define TTM_PL_FLAG_TT          (1 << TTM_PL_TT)
-
 
47
#define TTM_PL_FLAG_VRAM        (1 << TTM_PL_VRAM)
-
 
48
#define TTM_PL_FLAG_PRIV0       (1 << TTM_PL_PRIV0)
-
 
49
#define TTM_PL_FLAG_PRIV1       (1 << TTM_PL_PRIV1)
-
 
50
#define TTM_PL_FLAG_PRIV2       (1 << TTM_PL_PRIV2)
-
 
51
#define TTM_PL_FLAG_PRIV3       (1 << TTM_PL_PRIV3)
-
 
52
#define TTM_PL_FLAG_PRIV4       (1 << TTM_PL_PRIV4)
-
 
53
#define TTM_PL_FLAG_PRIV5       (1 << TTM_PL_PRIV5)
-
 
54
#define TTM_PL_FLAG_SWAPPED     (1 << TTM_PL_SWAPPED)
-
 
55
#define TTM_PL_MASK_MEM         0x0000FFFF
-
 
56
 
-
 
57
 
32
 
58
int radeon_gem_object_init(struct drm_gem_object *obj)
33
int radeon_gem_object_init(struct drm_gem_object *obj)
59
{
34
{
60
	/* we do nothings here */
35
	/* we do nothings here */
61
	return 0;
36
	return 0;
Line 62... Line 37...
62
}
37
}
63
 
38
 
64
void radeon_gem_object_free(struct drm_gem_object *gobj)
39
void radeon_gem_object_free(struct drm_gem_object *gobj)
Line 65... Line 40...
65
{
40
{
66
	struct radeon_object *robj = gobj->driver_private;
41
	struct radeon_bo *robj = gobj->driver_private;
67
 
42
 
68
	gobj->driver_private = NULL;
43
	gobj->driver_private = NULL;
69
	if (robj) {
44
	if (robj) {
Line 70... Line 45...
70
//       radeon_object_unref(&robj);
45
		radeon_bo_unref(&robj);
71
	}
46
	}
72
}
47
}
73
 
-
 
74
int radeon_gem_object_create(struct radeon_device *rdev, int size,
48
 
75
			     int alignment, int initial_domain,
49
int radeon_gem_object_create(struct radeon_device *rdev, int size,
76
			     bool discardable, bool kernel,
50
                 int alignment, int initial_domain,
77
			     bool interruptible,
51
                 bool discardable, bool kernel,
78
			     struct drm_gem_object **obj)
52
				struct drm_gem_object **obj)
Line 79... Line 53...
79
{
53
{
80
	struct drm_gem_object *gobj;
54
	struct drm_gem_object *gobj;
81
	struct radeon_object *robj;
55
    struct radeon_bo *robj;
Line 88... Line 62...
88
	}
62
	}
89
	/* At least align on page size */
63
	/* At least align on page size */
90
	if (alignment < PAGE_SIZE) {
64
	if (alignment < PAGE_SIZE) {
91
		alignment = PAGE_SIZE;
65
		alignment = PAGE_SIZE;
92
	}
66
	}
93
	r = radeon_object_create(rdev, gobj, size, kernel, initial_domain,
67
    r = radeon_fb_bo_create(rdev, gobj, size, kernel, initial_domain, &robj);
94
				 interruptible, &robj);
-
 
95
	if (r) {
68
	if (r) {
96
		DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n",
69
		DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n",
97
			  size, initial_domain, alignment);
70
			  size, initial_domain, alignment);
98
//       mutex_lock(&rdev->ddev->struct_mutex);
-
 
99
//       drm_gem_object_unreference(gobj);
-
 
100
//       mutex_unlock(&rdev->ddev->struct_mutex);
-
 
101
		return r;
71
        return r;
102
	}
72
	}
103
	gobj->driver_private = robj;
73
	gobj->driver_private = robj;
104
	*obj = gobj;
74
	*obj = gobj;
105
	return 0;
75
	return 0;
106
}
76
}
Line 107... Line 77...
107
 
77
 
108
int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
78
int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
109
			  uint64_t *gpu_addr)
79
			  uint64_t *gpu_addr)
110
{
80
{
111
	struct radeon_object *robj = obj->driver_private;
81
	struct radeon_bo *robj = obj->driver_private;
Line 112... Line -...
112
	uint32_t flags;
-
 
113
 
82
	int r;
114
	switch (pin_domain) {
83
 
115
	case RADEON_GEM_DOMAIN_VRAM:
84
	r = radeon_bo_reserve(robj, false);
116
		flags = TTM_PL_FLAG_VRAM;
85
	if (unlikely(r != 0))
117
		break;
-
 
118
	case RADEON_GEM_DOMAIN_GTT:
-
 
119
		flags = TTM_PL_FLAG_TT;
-
 
120
		break;
86
		return r;
121
	default:
87
	r = radeon_bo_pin(robj, pin_domain, gpu_addr);
122
		flags = TTM_PL_FLAG_SYSTEM;
-
 
123
		break;
-
 
124
	}
88
	radeon_bo_unreserve(robj);
Line 125... Line 89...
125
	return radeon_object_pin(robj, flags, gpu_addr);
89
	return r;
126
}
90
}
127
 
91
 
-
 
92
void radeon_gem_object_unpin(struct drm_gem_object *obj)
-
 
93
{
-
 
94
	struct radeon_bo *robj = obj->driver_private;
-
 
95
	int r;
128
void radeon_gem_object_unpin(struct drm_gem_object *obj)
96
 
-
 
97
	r = radeon_bo_reserve(robj, false);
-
 
98
	if (likely(r == 0)) {
129
{
99
		radeon_bo_unpin(robj);
Line 130... Line 100...
130
	struct radeon_object *robj = obj->driver_private;
100
		radeon_bo_unreserve(robj);
131
//   radeon_object_unpin(robj);
101
	}
132
}
102
}
133
 
103
 
134
int radeon_gem_set_domain(struct drm_gem_object *gobj,
104
int radeon_gem_set_domain(struct drm_gem_object *gobj,
135
			  uint32_t rdomain, uint32_t wdomain)
105
			  uint32_t rdomain, uint32_t wdomain)
Line 136... Line 106...
136
{
106
{
137
	struct radeon_object *robj;
107
	struct radeon_bo *robj;
Line 150... Line 120...
150
		printk(KERN_WARNING "Set domain withou domain !\n");
120
		printk(KERN_WARNING "Set domain withou domain !\n");
151
		return 0;
121
		return 0;
152
	}
122
	}
153
	if (domain == RADEON_GEM_DOMAIN_CPU) {
123
	if (domain == RADEON_GEM_DOMAIN_CPU) {
154
		/* Asking for cpu access wait for object idle */
124
		/* Asking for cpu access wait for object idle */
155
//       r = radeon_object_wait(robj);
125
//		r = radeon_bo_wait(robj, NULL, false);
156
		if (r) {
126
//		if (r) {
157
			printk(KERN_ERR "Failed to wait for object !\n");
127
//			printk(KERN_ERR "Failed to wait for object !\n");
158
			return r;
128
//			return r;
159
		}
129
//		}
160
	}
130
	}
161
	return 0;
131
	return 0;
162
}
132
}
Line 163... Line 133...
163
 
133
 
Line 216... Line 186...
216
 
186
 
217
	/* create a gem object to contain this object in */
187
	/* create a gem object to contain this object in */
218
	args->size = roundup(args->size, PAGE_SIZE);
188
	args->size = roundup(args->size, PAGE_SIZE);
219
	r = radeon_gem_object_create(rdev, args->size, args->alignment,
189
	r = radeon_gem_object_create(rdev, args->size, args->alignment,
220
				     args->initial_domain, false,
190
				     args->initial_domain, false,
221
				     false, true, &gobj);
191
					false, &gobj);
222
	if (r) {
192
	if (r) {
223
		return r;
193
		return r;
224
	}
194
	}
225
	r = drm_gem_handle_create(filp, gobj, &handle);
195
	r = drm_gem_handle_create(filp, gobj, &handle);
Line 241... Line 211...
241
{
211
{
242
	/* transition the BO to a domain -
212
	/* transition the BO to a domain -
243
	 * just validate the BO into a certain domain */
213
	 * just validate the BO into a certain domain */
244
	struct drm_radeon_gem_set_domain *args = data;
214
	struct drm_radeon_gem_set_domain *args = data;
245
	struct drm_gem_object *gobj;
215
	struct drm_gem_object *gobj;
246
	struct radeon_object *robj;
216
	struct radeon_bo *robj;
247
	int r;
217
	int r;
Line 248... Line 218...
248
 
218
 
249
	/* for now if someone requests domain CPU -
219
	/* for now if someone requests domain CPU -
Line 267... Line 237...
267
int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
237
int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
268
			  struct drm_file *filp)
238
			  struct drm_file *filp)
269
{
239
{
270
	struct drm_radeon_gem_mmap *args = data;
240
	struct drm_radeon_gem_mmap *args = data;
271
	struct drm_gem_object *gobj;
241
	struct drm_gem_object *gobj;
272
	struct radeon_object *robj;
242
	struct radeon_bo *robj;
273
	int r;
-
 
Line 274... Line 243...
274
 
243
 
275
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
244
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
276
	if (gobj == NULL) {
245
	if (gobj == NULL) {
277
		return -EINVAL;
246
		return -EINVAL;
278
	}
247
	}
279
	robj = gobj->driver_private;
248
	robj = gobj->driver_private;
280
	r = radeon_object_mmap(robj, &args->addr_ptr);
249
	args->addr_ptr = radeon_bo_mmap_offset(robj);
281
	mutex_lock(&dev->struct_mutex);
250
	mutex_lock(&dev->struct_mutex);
282
	drm_gem_object_unreference(gobj);
251
	drm_gem_object_unreference(gobj);
283
	mutex_unlock(&dev->struct_mutex);
252
	mutex_unlock(&dev->struct_mutex);
284
	return r;
253
	return 0;
Line 285... Line 254...
285
}
254
}
286
 
255
 
287
int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
256
int radeon_gem_busy_ioctl(struct drm_device *dev, void *data,
-
 
257
			  struct drm_file *filp)
-
 
258
{
-
 
259
	struct drm_radeon_gem_busy *args = data;
-
 
260
	struct drm_gem_object *gobj;
-
 
261
	struct radeon_bo *robj;
-
 
262
	int r;
-
 
263
	uint32_t cur_placement = 0;
-
 
264
 
-
 
265
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
-
 
266
	if (gobj == NULL) {
-
 
267
		return -EINVAL;
-
 
268
	}
288
			  struct drm_file *filp)
269
	robj = gobj->driver_private;
-
 
270
	r = radeon_bo_wait(robj, &cur_placement, true);
-
 
271
	switch (cur_placement) {
-
 
272
	case TTM_PL_VRAM:
-
 
273
		args->domain = RADEON_GEM_DOMAIN_VRAM;
-
 
274
		break;
-
 
275
	case TTM_PL_TT:
-
 
276
		args->domain = RADEON_GEM_DOMAIN_GTT;
-
 
277
		break;
-
 
278
	case TTM_PL_SYSTEM:
-
 
279
		args->domain = RADEON_GEM_DOMAIN_CPU;
-
 
280
	default:
-
 
281
		break;
-
 
282
	}
-
 
283
	mutex_lock(&dev->struct_mutex);
289
{
284
	drm_gem_object_unreference(gobj);
290
	/* FIXME: implement */
285
	mutex_unlock(&dev->struct_mutex);
Line 291... Line 286...
291
	return 0;
286
	return r;
292
}
287
}
293
 
288
 
294
int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
289
int radeon_gem_wait_idle_ioctl(struct drm_device *dev, void *data,
295
			      struct drm_file *filp)
290
			      struct drm_file *filp)
296
{
291
{
297
	struct drm_radeon_gem_wait_idle *args = data;
292
	struct drm_radeon_gem_wait_idle *args = data;
Line 298... Line 293...
298
	struct drm_gem_object *gobj;
293
	struct drm_gem_object *gobj;
299
	struct radeon_object *robj;
294
	struct radeon_bo *robj;
300
	int r;
295
	int r;
301
 
296
 
302
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
297
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
303
	if (gobj == NULL) {
298
	if (gobj == NULL) {
-
 
299
		return -EINVAL;
-
 
300
	}
-
 
301
	robj = gobj->driver_private;
-
 
302
	r = radeon_bo_wait(robj, NULL, false);
-
 
303
	/* callback hw specific functions if any */
-
 
304
	if (robj->rdev->asic->ioctl_wait_idle)
-
 
305
		robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
-
 
306
	mutex_lock(&dev->struct_mutex);
-
 
307
	drm_gem_object_unreference(gobj);
-
 
308
	mutex_unlock(&dev->struct_mutex);
-
 
309
	return r;
-
 
310
}
-
 
311
 
-
 
312
int radeon_gem_set_tiling_ioctl(struct drm_device *dev, void *data,
-
 
313
				struct drm_file *filp)
-
 
314
{
-
 
315
	struct drm_radeon_gem_set_tiling *args = data;
-
 
316
	struct drm_gem_object *gobj;
-
 
317
	struct radeon_bo *robj;
-
 
318
	int r = 0;
-
 
319
 
-
 
320
	DRM_DEBUG("%d \n", args->handle);
-
 
321
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
304
		return -EINVAL;
322
	if (gobj == NULL)
305
	}
323
		return -EINVAL;
306
	robj = gobj->driver_private;
324
	robj = gobj->driver_private;
307
	r = radeon_object_wait(robj);
325
	r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
308
	mutex_lock(&dev->struct_mutex);
326
	mutex_lock(&dev->struct_mutex);