Subversion Repositories Kolibri OS

Rev

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

Rev 1963 Rev 1986
Line 36... Line 36...
36
	return 0;
36
	return 0;
37
}
37
}
Line 38... Line 38...
38
 
38
 
39
void radeon_gem_object_free(struct drm_gem_object *gobj)
39
void radeon_gem_object_free(struct drm_gem_object *gobj)
40
{
40
{
Line 41... Line -...
41
	struct radeon_bo *robj = gobj->driver_private;
-
 
42
 
41
	struct radeon_bo *robj = gem_to_radeon_bo(gobj);
43
	gobj->driver_private = NULL;
42
 
44
	if (robj) {
43
	if (robj) {
45
		radeon_bo_unref(&robj);
44
		radeon_bo_unref(&robj);
Line 46... Line 45...
46
	}
45
	}
47
}
46
}
48
 
47
 
49
int radeon_gem_object_create(struct radeon_device *rdev, int size,
48
int radeon_gem_object_create(struct radeon_device *rdev, int size,
50
                 int alignment, int initial_domain,
49
                 int alignment, int initial_domain,
51
                 bool discardable, bool kernel,
-
 
52
				struct drm_gem_object **obj)
50
                 bool discardable, bool kernel,
53
{
51
				struct drm_gem_object **obj)
Line 54... Line 52...
54
	struct drm_gem_object *gobj;
52
{
55
    struct radeon_bo *robj;
-
 
56
	int r;
-
 
57
 
-
 
58
	*obj = NULL;
-
 
59
	gobj = drm_gem_object_alloc(rdev->ddev, size);
53
    struct radeon_bo *robj;
60
	if (!gobj) {
54
	int r;
61
		return -ENOMEM;
55
 
62
	}
56
	*obj = NULL;
63
	/* At least align on page size */
57
	/* At least align on page size */
64
	if (alignment < PAGE_SIZE) {
58
	if (alignment < PAGE_SIZE) {
-
 
59
		alignment = PAGE_SIZE;
65
		alignment = PAGE_SIZE;
60
	}
66
	}
61
	r = radeon_bo_create(rdev, size, alignment, kernel, initial_domain, &robj);
67
	r = radeon_bo_create(rdev, gobj, size, alignment, kernel, initial_domain, &robj);
62
	if (r) {
68
	if (r) {
63
		if (r != -ERESTARTSYS)
69
		DRM_ERROR("Failed to allocate GEM object (%d, %d, %u)\n",
64
			DRM_ERROR("Failed to allocate GEM object (%d, %d, %u, %d)\n",
-
 
65
				  size, initial_domain, alignment, r);
70
			  size, initial_domain, alignment);
66
        return r;
-
 
67
	}
-
 
68
	*obj = &robj->gem_base;
-
 
69
 
71
        return r;
70
	mutex_lock(&rdev->gem.mutex);
72
	}
71
	list_add_tail(&robj->list, &rdev->gem.objects);
Line 73... Line 72...
73
	gobj->driver_private = robj;
72
	mutex_unlock(&rdev->gem.mutex);
74
	*obj = gobj;
73
 
75
	return 0;
74
	return 0;
76
}
75
}
77
 
76
 
Line 78... Line 77...
78
int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
77
int radeon_gem_object_pin(struct drm_gem_object *obj, uint32_t pin_domain,
79
			  uint64_t *gpu_addr)
78
			  uint64_t *gpu_addr)
80
{
79
{
Line 89... Line 88...
89
	return r;
88
	return r;
90
}
89
}
Line 91... Line 90...
91
 
90
 
92
void radeon_gem_object_unpin(struct drm_gem_object *obj)
91
void radeon_gem_object_unpin(struct drm_gem_object *obj)
93
{
92
{
94
	struct radeon_bo *robj = obj->driver_private;
93
	struct radeon_bo *robj = gem_to_radeon_bo(obj);
Line 95... Line 94...
95
	int r;
94
	int r;
96
 
95
 
97
	r = radeon_bo_reserve(robj, false);
96
	r = radeon_bo_reserve(robj, false);
Line 107... Line 106...
107
	struct radeon_bo *robj;
106
	struct radeon_bo *robj;
108
	uint32_t domain;
107
	uint32_t domain;
109
	int r;
108
	int r;
Line 110... Line 109...
110
 
109
 
111
	/* FIXME: reeimplement */
110
	/* FIXME: reeimplement */
112
	robj = gobj->driver_private;
111
	robj = gem_to_radeon_bo(gobj);
113
	/* work out where to validate the buffer to */
112
	/* work out where to validate the buffer to */
114
	domain = wdomain;
113
	domain = wdomain;
115
	if (!domain) {
114
	if (!domain) {
116
		domain = rdomain;
115
		domain = rdomain;
Line 149... Line 148...
149
int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
148
int radeon_gem_info_ioctl(struct drm_device *dev, void *data,
150
			  struct drm_file *filp)
149
			  struct drm_file *filp)
151
{
150
{
152
	struct radeon_device *rdev = dev->dev_private;
151
	struct radeon_device *rdev = dev->dev_private;
153
	struct drm_radeon_gem_info *args = data;
152
	struct drm_radeon_gem_info *args = data;
-
 
153
	struct ttm_mem_type_manager *man;
-
 
154
 
-
 
155
	man = &rdev->mman.bdev.man[TTM_PL_VRAM];
Line 154... Line 156...
154
 
156
 
155
	args->vram_size = rdev->mc.real_vram_size;
157
	args->vram_size = rdev->mc.real_vram_size;
156
	args->vram_visible = rdev->mc.real_vram_size;
158
	args->vram_visible = (u64)man->size << PAGE_SHIFT;
157
	if (rdev->stollen_vga_memory)
159
	if (rdev->stollen_vga_memory)
158
		args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
160
		args->vram_visible -= radeon_bo_size(rdev->stollen_vga_memory);
159
	args->vram_visible -= radeon_fbdev_total_size(rdev);
161
	args->vram_visible -= radeon_fbdev_total_size(rdev);
160
	args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 -
162
	args->gart_size = rdev->mc.gtt_size - rdev->cp.ring_size - 4096 -
Line 221... Line 223...
221
	/* just do a BO wait for now */
223
	/* just do a BO wait for now */
222
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
224
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
223
	if (gobj == NULL) {
225
	if (gobj == NULL) {
224
		return -ENOENT;
226
		return -ENOENT;
225
	}
227
	}
226
	robj = gobj->driver_private;
228
	robj = gem_to_radeon_bo(gobj);
Line 227... Line 229...
227
 
229
 
Line 228... Line 230...
228
	r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
230
	r = radeon_gem_set_domain(gobj, args->read_domains, args->write_domain);
229
 
231
 
230
	drm_gem_object_unreference_unlocked(gobj);
232
	drm_gem_object_unreference_unlocked(gobj);
Line 231... Line 233...
231
	return r;
233
	return r;
232
}
234
}
-
 
235
 
233
 
236
int radeon_mode_dumb_mmap(struct drm_file *filp,
234
int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
-
 
235
			  struct drm_file *filp)
237
			  struct drm_device *dev,
236
{
238
			  uint32_t handle, uint64_t *offset_p)
Line 237... Line 239...
237
	struct drm_radeon_gem_mmap *args = data;
239
{
238
	struct drm_gem_object *gobj;
240
	struct drm_gem_object *gobj;
239
	struct radeon_bo *robj;
241
	struct radeon_bo *robj;
240
 
242
 
241
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
243
	gobj = drm_gem_object_lookup(dev, filp, handle);
242
	if (gobj == NULL) {
244
	if (gobj == NULL) {
243
		return -ENOENT;
245
		return -ENOENT;
244
	}
246
	}
245
	robj = gobj->driver_private;
247
	robj = gem_to_radeon_bo(gobj);
Line -... Line 248...
-
 
248
	*offset_p = radeon_bo_mmap_offset(robj);
-
 
249
	drm_gem_object_unreference_unlocked(gobj);
-
 
250
	return 0;
-
 
251
}
-
 
252
 
-
 
253
int radeon_gem_mmap_ioctl(struct drm_device *dev, void *data,
-
 
254
			  struct drm_file *filp)
-
 
255
{
246
	args->addr_ptr = radeon_bo_mmap_offset(robj);
256
	struct drm_radeon_gem_mmap *args = data;
247
	drm_gem_object_unreference_unlocked(gobj);
257
 
248
	return 0;
258
	return radeon_mode_dumb_mmap(filp, dev, args->handle, &args->addr_ptr);
249
}
259
}
250
 
260
 
Line 259... Line 269...
259
 
269
 
260
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
270
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
261
	if (gobj == NULL) {
271
	if (gobj == NULL) {
262
		return -ENOENT;
272
		return -ENOENT;
263
	}
273
	}
264
	robj = gobj->driver_private;
274
	robj = gem_to_radeon_bo(gobj);
265
	r = radeon_bo_wait(robj, &cur_placement, true);
275
	r = radeon_bo_wait(robj, &cur_placement, true);
266
	switch (cur_placement) {
276
	switch (cur_placement) {
267
	case TTM_PL_VRAM:
277
	case TTM_PL_VRAM:
268
		args->domain = RADEON_GEM_DOMAIN_VRAM;
278
		args->domain = RADEON_GEM_DOMAIN_VRAM;
Line 289... Line 299...
289
 
299
 
290
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
300
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
291
	if (gobj == NULL) {
301
	if (gobj == NULL) {
292
		return -ENOENT;
302
		return -ENOENT;
293
	}
303
	}
294
	robj = gobj->driver_private;
304
	robj = gem_to_radeon_bo(gobj);
295
	r = radeon_bo_wait(robj, NULL, false);
305
	r = radeon_bo_wait(robj, NULL, false);
296
	/* callback hw specific functions if any */
306
	/* callback hw specific functions if any */
297
	if (robj->rdev->asic->ioctl_wait_idle)
307
	if (robj->rdev->asic->ioctl_wait_idle)
298
		robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
308
		robj->rdev->asic->ioctl_wait_idle(robj->rdev, robj);
Line 310... Line 320...
310
 
320
 
311
	DRM_DEBUG("%d \n", args->handle);
321
	DRM_DEBUG("%d \n", args->handle);
312
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
322
	gobj = drm_gem_object_lookup(dev, filp, args->handle);
313
	if (gobj == NULL)
323
	if (gobj == NULL)
314
		return -ENOENT;
324
		return -ENOENT;
315
	robj = gobj->driver_private;
325
	robj = gem_to_radeon_bo(gobj);
316
	r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
326
	r = radeon_bo_set_tiling_flags(robj, args->tiling_flags, args->pitch);
317
	drm_gem_object_unreference_unlocked(gobj);
327
	drm_gem_object_unreference_unlocked(gobj);
318
	return r;
328
	return r;