Branch data Line data Source code
1 : : /* 2 : : * SPDX-License-Identifier: MIT 3 : : * 4 : : * Copyright © 2019 Intel Corporation 5 : : */ 6 : : 7 : : #include "i915_drv.h" 8 : : #include "i915_gem_object.h" 9 : : 10 : : struct stub_fence { 11 : : struct dma_fence dma; 12 : : struct i915_sw_fence chain; 13 : : }; 14 : : 15 : : static int __i915_sw_fence_call 16 : 0 : stub_notify(struct i915_sw_fence *fence, enum i915_sw_fence_notify state) 17 : : { 18 : 0 : struct stub_fence *stub = container_of(fence, typeof(*stub), chain); 19 : : 20 [ # # # ]: 0 : switch (state) { 21 : 0 : case FENCE_COMPLETE: 22 : 0 : dma_fence_signal(&stub->dma); 23 : 0 : break; 24 : : 25 : 0 : case FENCE_FREE: 26 : 0 : dma_fence_put(&stub->dma); 27 : 0 : break; 28 : : } 29 : : 30 : 0 : return NOTIFY_DONE; 31 : : } 32 : : 33 : 0 : static const char *stub_driver_name(struct dma_fence *fence) 34 : : { 35 : 0 : return DRIVER_NAME; 36 : : } 37 : : 38 : 0 : static const char *stub_timeline_name(struct dma_fence *fence) 39 : : { 40 : 0 : return "object"; 41 : : } 42 : : 43 : 0 : static void stub_release(struct dma_fence *fence) 44 : : { 45 : 0 : struct stub_fence *stub = container_of(fence, typeof(*stub), dma); 46 : : 47 : 0 : i915_sw_fence_fini(&stub->chain); 48 : : 49 : 0 : BUILD_BUG_ON(offsetof(typeof(*stub), dma)); 50 : 0 : dma_fence_free(&stub->dma); 51 : 0 : } 52 : : 53 : : static const struct dma_fence_ops stub_fence_ops = { 54 : : .get_driver_name = stub_driver_name, 55 : : .get_timeline_name = stub_timeline_name, 56 : : .release = stub_release, 57 : : }; 58 : : 59 : : struct dma_fence * 60 : 0 : i915_gem_object_lock_fence(struct drm_i915_gem_object *obj) 61 : : { 62 : 0 : struct stub_fence *stub; 63 : : 64 : 0 : assert_object_held(obj); 65 : : 66 : 0 : stub = kmalloc(sizeof(*stub), GFP_KERNEL); 67 [ # # ]: 0 : if (!stub) 68 : : return NULL; 69 : : 70 : 0 : i915_sw_fence_init(&stub->chain, stub_notify); 71 : 0 : dma_fence_init(&stub->dma, &stub_fence_ops, &stub->chain.wait.lock, 72 : : 0, 0); 73 : : 74 [ # # ]: 0 : if (i915_sw_fence_await_reservation(&stub->chain, 75 : : obj->base.resv, NULL, 76 : : true, I915_FENCE_TIMEOUT, 77 : : I915_FENCE_GFP) < 0) 78 : 0 : goto err; 79 : : 80 : 0 : dma_resv_add_excl_fence(obj->base.resv, &stub->dma); 81 : : 82 : 0 : return &stub->dma; 83 : : 84 : : err: 85 : 0 : stub_release(&stub->dma); 86 : 0 : return NULL; 87 : : } 88 : : 89 : 0 : void i915_gem_object_unlock_fence(struct drm_i915_gem_object *obj, 90 : : struct dma_fence *fence) 91 : : { 92 : 0 : struct stub_fence *stub = container_of(fence, typeof(*stub), dma); 93 : : 94 : 0 : i915_sw_fence_commit(&stub->chain); 95 : 0 : }