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 |