Lines Matching refs:rcb
103 struct drm_reservation_cb *rcb = rfcb->parent; in reservation_cb_fence_cb() local
105 if (atomic_dec_and_test(&rcb->count)) in reservation_cb_fence_cb()
106 schedule_work(&rcb->work); in reservation_cb_fence_cb()
110 reservation_cb_cleanup(struct drm_reservation_cb *rcb) in reservation_cb_cleanup() argument
114 for (cb = 0; cb < rcb->num_fence_cbs; cb++) { in reservation_cb_cleanup()
115 if (rcb->fence_cbs[cb]) { in reservation_cb_cleanup()
116 fence_remove_callback(rcb->fence_cbs[cb]->fence, in reservation_cb_cleanup()
117 &rcb->fence_cbs[cb]->base); in reservation_cb_cleanup()
118 fence_put(rcb->fence_cbs[cb]->fence); in reservation_cb_cleanup()
119 kfree(rcb->fence_cbs[cb]); in reservation_cb_cleanup()
120 rcb->fence_cbs[cb] = NULL; in reservation_cb_cleanup()
123 kfree(rcb->fence_cbs); in reservation_cb_cleanup()
124 rcb->fence_cbs = NULL; in reservation_cb_cleanup()
125 rcb->num_fence_cbs = 0; in reservation_cb_cleanup()
130 struct drm_reservation_cb *rcb = in reservation_cb_work() local
136 reservation_cb_cleanup(rcb); in reservation_cb_work()
137 rcb->func(rcb, rcb->context); in reservation_cb_work()
141 reservation_cb_add_fence_cb(struct drm_reservation_cb *rcb, struct fence *fence) in reservation_cb_add_fence_cb() argument
147 new_fence_cbs = krealloc(rcb->fence_cbs, in reservation_cb_add_fence_cb()
148 (rcb->num_fence_cbs + 1) in reservation_cb_add_fence_cb()
153 rcb->fence_cbs = new_fence_cbs; in reservation_cb_add_fence_cb()
165 fence_cb->parent = rcb; in reservation_cb_add_fence_cb()
166 rcb->fence_cbs[rcb->num_fence_cbs] = fence_cb; in reservation_cb_add_fence_cb()
167 atomic_inc(&rcb->count); in reservation_cb_add_fence_cb()
172 atomic_dec(&rcb->count); in reservation_cb_add_fence_cb()
177 atomic_dec(&rcb->count); in reservation_cb_add_fence_cb()
182 rcb->num_fence_cbs++; in reservation_cb_add_fence_cb()
188 drm_reservation_cb_init(struct drm_reservation_cb *rcb, in drm_reservation_cb_init() argument
191 INIT_WORK(&rcb->work, reservation_cb_work); in drm_reservation_cb_init()
192 atomic_set(&rcb->count, 1); in drm_reservation_cb_init()
193 rcb->num_fence_cbs = 0; in drm_reservation_cb_init()
194 rcb->fence_cbs = NULL; in drm_reservation_cb_init()
195 rcb->func = func; in drm_reservation_cb_init()
196 rcb->context = context; in drm_reservation_cb_init()
201 drm_reservation_cb_add(struct drm_reservation_cb *rcb, in drm_reservation_cb_add() argument
216 ret = reservation_cb_add_fence_cb(rcb, fence); in drm_reservation_cb_add()
218 reservation_cb_cleanup(rcb); in drm_reservation_cb_add()
225 ret = reservation_cb_add_fence_cb(rcb, in drm_reservation_cb_add()
228 reservation_cb_cleanup(rcb); in drm_reservation_cb_add()
247 drm_reservation_cb_done(struct drm_reservation_cb *rcb) in drm_reservation_cb_done() argument
254 if (atomic_dec_and_test(&rcb->count)) { in drm_reservation_cb_done()
261 schedule_work(&rcb->work); in drm_reservation_cb_done()
267 drm_reservation_cb_fini(struct drm_reservation_cb *rcb) in drm_reservation_cb_fini() argument
270 atomic_set(&rcb->count, 0); in drm_reservation_cb_fini()
271 cancel_work_sync(&rcb->work); in drm_reservation_cb_fini()
272 reservation_cb_cleanup(rcb); in drm_reservation_cb_fini()