Lines Matching refs:group
19 struct xe_hw_engine_group *group = container_of(w, struct xe_hw_engine_group, resume_work); in hw_engine_group_resume_lr_jobs_func() local
23 err = xe_hw_engine_group_get_mode(group, EXEC_MODE_LR, &previous_mode); in hw_engine_group_resume_lr_jobs_func()
30 list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) { in hw_engine_group_resume_lr_jobs_func()
38 xe_hw_engine_group_put(group); in hw_engine_group_resume_lr_jobs_func()
44 struct xe_hw_engine_group *group; in hw_engine_group_alloc() local
47 group = drmm_kzalloc(&xe->drm, sizeof(*group), GFP_KERNEL); in hw_engine_group_alloc()
48 if (!group) in hw_engine_group_alloc()
51 group->resume_wq = alloc_workqueue("xe-resume-lr-jobs-wq", 0, 0); in hw_engine_group_alloc()
52 if (!group->resume_wq) in hw_engine_group_alloc()
55 err = drmm_add_action_or_reset(&xe->drm, __drmm_workqueue_release, group->resume_wq); in hw_engine_group_alloc()
59 init_rwsem(&group->mode_sem); in hw_engine_group_alloc()
60 INIT_WORK(&group->resume_work, hw_engine_group_resume_lr_jobs_func); in hw_engine_group_alloc()
61 INIT_LIST_HEAD(&group->exec_queue_list); in hw_engine_group_alloc()
63 return group; in hw_engine_group_alloc()
122 int xe_hw_engine_group_add_exec_queue(struct xe_hw_engine_group *group, struct xe_exec_queue *q) in xe_hw_engine_group_add_exec_queue() argument
127 xe_assert(xe, group); in xe_hw_engine_group_add_exec_queue()
134 err = down_write_killable(&group->mode_sem); in xe_hw_engine_group_add_exec_queue()
138 if (xe_vm_in_fault_mode(q->vm) && group->cur_mode == EXEC_MODE_DMA_FENCE) { in xe_hw_engine_group_add_exec_queue()
144 xe_hw_engine_group_resume_faulting_lr_jobs(group); in xe_hw_engine_group_add_exec_queue()
147 list_add(&q->hw_engine_group_link, &group->exec_queue_list); in xe_hw_engine_group_add_exec_queue()
148 up_write(&group->mode_sem); in xe_hw_engine_group_add_exec_queue()
153 up_write(&group->mode_sem); in xe_hw_engine_group_add_exec_queue()
163 void xe_hw_engine_group_del_exec_queue(struct xe_hw_engine_group *group, struct xe_exec_queue *q) in xe_hw_engine_group_del_exec_queue() argument
167 xe_assert(xe, group); in xe_hw_engine_group_del_exec_queue()
170 down_write(&group->mode_sem); in xe_hw_engine_group_del_exec_queue()
175 up_write(&group->mode_sem); in xe_hw_engine_group_del_exec_queue()
183 void xe_hw_engine_group_resume_faulting_lr_jobs(struct xe_hw_engine_group *group) in xe_hw_engine_group_resume_faulting_lr_jobs() argument
185 queue_work(group->resume_wq, &group->resume_work); in xe_hw_engine_group_resume_faulting_lr_jobs()
194 static int xe_hw_engine_group_suspend_faulting_lr_jobs(struct xe_hw_engine_group *group) in xe_hw_engine_group_suspend_faulting_lr_jobs() argument
200 lockdep_assert_held_write(&group->mode_sem); in xe_hw_engine_group_suspend_faulting_lr_jobs()
202 list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) { in xe_hw_engine_group_suspend_faulting_lr_jobs()
210 list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) { in xe_hw_engine_group_suspend_faulting_lr_jobs()
220 xe_hw_engine_group_resume_faulting_lr_jobs(group); in xe_hw_engine_group_suspend_faulting_lr_jobs()
225 up_write(&group->mode_sem); in xe_hw_engine_group_suspend_faulting_lr_jobs()
239 static int xe_hw_engine_group_wait_for_dma_fence_jobs(struct xe_hw_engine_group *group) in xe_hw_engine_group_wait_for_dma_fence_jobs() argument
245 lockdep_assert_held_write(&group->mode_sem); in xe_hw_engine_group_wait_for_dma_fence_jobs()
247 list_for_each_entry(q, &group->exec_queue_list, hw_engine_group_link) { in xe_hw_engine_group_wait_for_dma_fence_jobs()
262 static int switch_mode(struct xe_hw_engine_group *group) in switch_mode() argument
267 lockdep_assert_held_write(&group->mode_sem); in switch_mode()
269 switch (group->cur_mode) { in switch_mode()
272 err = xe_hw_engine_group_suspend_faulting_lr_jobs(group); in switch_mode()
276 err = xe_hw_engine_group_wait_for_dma_fence_jobs(group); in switch_mode()
283 group->cur_mode = new_mode; in switch_mode()
296 int xe_hw_engine_group_get_mode(struct xe_hw_engine_group *group, in xe_hw_engine_group_get_mode() argument
299 __acquires(&group->mode_sem) in xe_hw_engine_group_get_mode()
301 int err = down_read_interruptible(&group->mode_sem); in xe_hw_engine_group_get_mode()
306 *previous_mode = group->cur_mode; in xe_hw_engine_group_get_mode()
308 if (new_mode != group->cur_mode) { in xe_hw_engine_group_get_mode()
309 up_read(&group->mode_sem); in xe_hw_engine_group_get_mode()
310 err = down_write_killable(&group->mode_sem); in xe_hw_engine_group_get_mode()
314 if (new_mode != group->cur_mode) { in xe_hw_engine_group_get_mode()
315 err = switch_mode(group); in xe_hw_engine_group_get_mode()
317 up_write(&group->mode_sem); in xe_hw_engine_group_get_mode()
321 downgrade_write(&group->mode_sem); in xe_hw_engine_group_get_mode()
331 void xe_hw_engine_group_put(struct xe_hw_engine_group *group) in xe_hw_engine_group_put() argument
332 __releases(&group->mode_sem) in xe_hw_engine_group_put()
334 up_read(&group->mode_sem); in xe_hw_engine_group_put()