Subversion Repositories Kolibri OS

Rev

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

Rev 4392 Rev 4539
Line 188... Line 188...
188
 
188
 
189
static int
189
static int
190
relocate_entry_cpu(struct drm_i915_gem_object *obj,
190
relocate_entry_cpu(struct drm_i915_gem_object *obj,
191
		   struct drm_i915_gem_relocation_entry *reloc)
191
		   struct drm_i915_gem_relocation_entry *reloc)
-
 
192
{
-
 
193
    struct drm_device *dev = obj->base.dev;
192
{
194
    struct drm_i915_private *dev_priv = dev->dev_private;
193
	uint32_t page_offset = offset_in_page(reloc->offset);
195
	uint32_t page_offset = offset_in_page(reloc->offset);
194
	char *vaddr;
196
	char *vaddr;
Line 195... Line 197...
195
	int ret = -EINVAL;
197
	int ret = -EINVAL;
196
 
198
 
197
	ret = i915_gem_object_set_to_cpu_domain(obj, 1);
199
	ret = i915_gem_object_set_to_cpu_domain(obj, 1);
Line 198... Line 200...
198
	if (ret)
200
	if (ret)
199
		return ret;
201
		return ret;
200
 
202
 
201
    vaddr = (char *)MapIoMem((addr_t)i915_gem_object_get_page(obj,
-
 
Line 202... Line 203...
202
                                 reloc->offset >> PAGE_SHIFT), 4096, 3);
203
    vaddr = dev_priv->gtt.mappable+4096;
203
	*(uint32_t *)(vaddr + page_offset) = reloc->delta;
204
    MapPage(vaddr,(addr_t)i915_gem_object_get_page(obj,reloc->offset >> PAGE_SHIFT), PG_SW);
Line 204... Line 205...
204
    FreeKernelSpace(vaddr);
205
	*(uint32_t *)(vaddr + page_offset) = reloc->delta;
Line 224... Line 225...
224
	if (ret)
225
	if (ret)
225
		return ret;
226
		return ret;
Line 226... Line 227...
226
 
227
 
227
	/* Map the page containing the relocation we're going to perform.  */
228
	/* Map the page containing the relocation we're going to perform.  */
228
	reloc->offset += i915_gem_obj_ggtt_offset(obj);
229
	reloc->offset += i915_gem_obj_ggtt_offset(obj);
229
    reloc_page = (void*)MapIoMem(dev_priv->gtt.mappable_base +
230
    MapPage(dev_priv->gtt.mappable,dev_priv->gtt.mappable_base +
-
 
231
                                 (reloc->offset & PAGE_MASK), PG_SW);
230
                                 (reloc->offset & PAGE_MASK), 4096, 0x18|3);
232
	reloc_page = dev_priv->gtt.mappable;
231
	reloc_entry = (uint32_t __iomem *)
233
	reloc_entry = (uint32_t __iomem *)
232
		(reloc_page + offset_in_page(reloc->offset));
234
		(reloc_page + offset_in_page(reloc->offset));
233
	iowrite32(reloc->delta, reloc_entry);
-
 
Line 234... Line 235...
234
    FreeKernelSpace(reloc_page);
235
	iowrite32(reloc->delta, reloc_entry);
235
 
236
 
Line 236... Line 237...
236
	return 0;
237
	return 0;
Line 341... Line 342...
341
	struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(64)];
342
	struct drm_i915_gem_relocation_entry stack_reloc[N_RELOC(64)];
342
	struct drm_i915_gem_relocation_entry __user *user_relocs;
343
	struct drm_i915_gem_relocation_entry __user *user_relocs;
343
	struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
344
	struct drm_i915_gem_exec_object2 *entry = obj->exec_entry;
344
	int remain, ret;
345
	int remain, ret;
Line 345... Line 346...
345
 
346
 
Line 346... Line 347...
346
	user_relocs = (void __user *)(uintptr_t)entry->relocs_ptr;
347
	user_relocs = to_user_ptr(entry->relocs_ptr);
347
 
348
 
348
	remain = entry->relocation_count;
349
	remain = entry->relocation_count;
349
	while (remain) {
350
	while (remain) {
Line 665... Line 666...
665
	for (i = 0; i < count; i++) {
666
	for (i = 0; i < count; i++) {
666
		struct drm_i915_gem_relocation_entry __user *user_relocs;
667
		struct drm_i915_gem_relocation_entry __user *user_relocs;
667
		u64 invalid_offset = (u64)-1;
668
		u64 invalid_offset = (u64)-1;
668
		int j;
669
		int j;
Line 669... Line 670...
669
 
670
 
Line 670... Line 671...
670
		user_relocs = (void __user *)(uintptr_t)exec[i].relocs_ptr;
671
		user_relocs = to_user_ptr(exec[i].relocs_ptr);
671
 
672
 
672
		if (copy_from_user(reloc+total, user_relocs,
673
		if (copy_from_user(reloc+total, user_relocs,
673
				   exec[i].relocation_count * sizeof(*reloc))) {
674
				   exec[i].relocation_count * sizeof(*reloc))) {
Line 1258... Line 1259...
1258
		DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
1259
		DRM_DEBUG("Failed to allocate exec list for %d buffers\n",
1259
			  args->buffer_count);
1260
			  args->buffer_count);
1260
		return -ENOMEM;
1261
		return -ENOMEM;
1261
	}
1262
	}
1262
	ret = copy_from_user(exec2_list,
1263
	ret = copy_from_user(exec2_list,
1263
			     (struct drm_i915_relocation_entry __user *)
-
 
1264
			     (uintptr_t) args->buffers_ptr,
1264
			     to_user_ptr(args->buffers_ptr),
1265
			     sizeof(*exec2_list) * args->buffer_count);
1265
			     sizeof(*exec2_list) * args->buffer_count);
1266
	if (ret != 0) {
1266
	if (ret != 0) {
1267
		DRM_DEBUG("copy %d exec entries failed %d\n",
1267
		DRM_DEBUG("copy %d exec entries failed %d\n",
1268
			  args->buffer_count, ret);
1268
			  args->buffer_count, ret);
1269
        kfree(exec2_list);
1269
        kfree(exec2_list);
Line 1273... Line 1273...
1273
 
1273
 
1274
	ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list,
1274
	ret = i915_gem_do_execbuffer(dev, data, file, args, exec2_list,
1275
				     &dev_priv->gtt.base);
1275
				     &dev_priv->gtt.base);
1276
	if (!ret) {
1276
	if (!ret) {
1277
		/* Copy the new buffer offsets back to the user's exec list. */
1277
		/* Copy the new buffer offsets back to the user's exec list. */
1278
		ret = copy_to_user((void __user *)(uintptr_t)args->buffers_ptr,
1278
		ret = copy_to_user(to_user_ptr(args->buffers_ptr),
1279
				   exec2_list,
1279
				   exec2_list,
1280
				   sizeof(*exec2_list) * args->buffer_count);
1280
				   sizeof(*exec2_list) * args->buffer_count);
1281
		if (ret) {
1281
		if (ret) {
1282
			ret = -EFAULT;
1282
			ret = -EFAULT;