Subversion Repositories Kolibri OS

Rev

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

Rev 4246 Rev 4371
Line 35... Line 35...
35
 
35
 
36
#define I915_EXEC_SECURE        (1<<9)
36
#define I915_EXEC_SECURE        (1<<9)
37
#define I915_EXEC_IS_PINNED     (1<<10)
37
#define I915_EXEC_IS_PINNED     (1<<10)
Line 38... Line -...
38
#define I915_EXEC_VEBOX         (4<<0)
-
 
Line 39... Line 38...
39
 
38
#define I915_EXEC_VEBOX         (4<<0)
Line 40... Line 39...
40
#define wmb() asm volatile ("sfence")
39
 
Line 204... Line 203...
204
		!obj->map_and_fenceable ||
203
		!obj->map_and_fenceable ||
205
		obj->cache_level != I915_CACHE_NONE);
204
		obj->cache_level != I915_CACHE_NONE);
206
}
205
}
Line 207... Line 206...
207
 
206
 
-
 
207
static int
-
 
208
relocate_entry_cpu(struct drm_i915_gem_object *obj,
-
 
209
		   struct drm_i915_gem_relocation_entry *reloc)
-
 
210
{
-
 
211
	uint32_t page_offset = offset_in_page(reloc->offset);
-
 
212
	char *vaddr;
-
 
213
	int ret = -EINVAL;
-
 
214
 
-
 
215
	ret = i915_gem_object_set_to_cpu_domain(obj, 1);
-
 
216
	if (ret)
-
 
217
		return ret;
-
 
218
 
-
 
219
    vaddr = (char *)MapIoMem((addr_t)i915_gem_object_get_page(obj,
-
 
220
                                 reloc->offset >> PAGE_SHIFT), 4096, 3);
-
 
221
	*(uint32_t *)(vaddr + page_offset) = reloc->delta;
-
 
222
    FreeKernelSpace(vaddr);
-
 
223
 
-
 
224
	return 0;
-
 
225
}
-
 
226
 
-
 
227
static int
-
 
228
relocate_entry_gtt(struct drm_i915_gem_object *obj,
-
 
229
		   struct drm_i915_gem_relocation_entry *reloc)
-
 
230
{
-
 
231
	struct drm_device *dev = obj->base.dev;
-
 
232
	struct drm_i915_private *dev_priv = dev->dev_private;
-
 
233
	uint32_t __iomem *reloc_entry;
-
 
234
	void __iomem *reloc_page;
-
 
235
	int ret = -EINVAL;
-
 
236
 
-
 
237
	ret = i915_gem_object_set_to_gtt_domain(obj, true);
-
 
238
	if (ret)
-
 
239
		return ret;
-
 
240
 
-
 
241
	ret = i915_gem_object_put_fence(obj);
-
 
242
	if (ret)
-
 
243
		return ret;
-
 
244
 
-
 
245
	/* Map the page containing the relocation we're going to perform.  */
-
 
246
	reloc->offset += i915_gem_obj_ggtt_offset(obj);
-
 
247
    reloc_page = (void*)MapIoMem(dev_priv->gtt.mappable_base +
-
 
248
                                 (reloc->offset & PAGE_MASK), 4096, 0x18|3);
-
 
249
	reloc_entry = (uint32_t __iomem *)
-
 
250
		(reloc_page + offset_in_page(reloc->offset));
-
 
251
	iowrite32(reloc->delta, reloc_entry);
-
 
252
    FreeKernelSpace(reloc_page);
-
 
253
 
-
 
254
	return 0;
-
 
255
}
-
 
256
 
208
static int
257
static int
209
i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
258
i915_gem_execbuffer_relocate_entry(struct drm_i915_gem_object *obj,
210
				   struct eb_objects *eb,
259
				   struct eb_objects *eb,
211
				   struct drm_i915_gem_relocation_entry *reloc,
260
				   struct drm_i915_gem_relocation_entry *reloc,
212
				   struct i915_address_space *vm)
261
				   struct i915_address_space *vm)
Line 285... Line 334...
285
	}
334
	}
Line 286... Line 335...
286
 
335
 
Line 287... Line 336...
287
	/* We can't wait for rendering with pagefaults disabled */
336
	/* We can't wait for rendering with pagefaults disabled */
288
 
337
 
289
	reloc->delta += target_offset;
-
 
290
	if (use_cpu_reloc(obj)) {
-
 
291
		uint32_t page_offset = reloc->offset & ~PAGE_MASK;
-
 
292
		char *vaddr;
338
	reloc->delta += target_offset;
293
 
-
 
294
		ret = i915_gem_object_set_to_cpu_domain(obj, 1);
-
 
295
		if (ret)
-
 
296
			return ret;
-
 
297
 
-
 
298
        vaddr = (char *)MapIoMem((addr_t)i915_gem_object_get_page(obj,
-
 
299
                                 reloc->offset >> PAGE_SHIFT), 4096, 3);
-
 
300
		*(uint32_t *)(vaddr + page_offset) = reloc->delta;
339
	if (use_cpu_reloc(obj))
301
        FreeKernelSpace(vaddr);
-
 
302
	} else {
340
		ret = relocate_entry_cpu(obj, reloc);
303
		struct drm_i915_private *dev_priv = dev->dev_private;
-
 
Line 304... Line -...
304
		uint32_t __iomem *reloc_entry;
-
 
305
		void __iomem *reloc_page;
341
	else
306
 
342
		ret = relocate_entry_gtt(obj, reloc);
Line 307... Line -...
307
		ret = i915_gem_object_set_to_gtt_domain(obj, true);
-
 
308
		if (ret)
-
 
309
			return ret;
-
 
310
 
-
 
311
		ret = i915_gem_object_put_fence(obj);
-
 
312
		if (ret)
-
 
313
			return ret;
-
 
314
 
-
 
315
		/* Map the page containing the relocation we're going to perform.  */
-
 
316
        reloc->offset += i915_gem_obj_ggtt_offset(obj);
-
 
317
        reloc_page = (void*)MapIoMem(reloc->offset & PAGE_MASK, 4096, 3);
-
 
318
		reloc_entry = (uint32_t __iomem *)
-
 
319
			(reloc_page + (reloc->offset & ~PAGE_MASK));
-
 
320
		iowrite32(reloc->delta, reloc_entry);
343
 
321
        FreeKernelSpace(reloc_page);
344
		if (ret)
Line 322... Line 345...
322
	}
345
			return ret;
323
 
346