1b88baab8SDanilo Krummrich /* SPDX-License-Identifier: MIT */ 2b88baab8SDanilo Krummrich 3b88baab8SDanilo Krummrich #ifndef __NOUVEAU_EXEC_H__ 4b88baab8SDanilo Krummrich #define __NOUVEAU_EXEC_H__ 5b88baab8SDanilo Krummrich 6b88baab8SDanilo Krummrich #include <drm/drm_exec.h> 7b88baab8SDanilo Krummrich 8b88baab8SDanilo Krummrich #include "nouveau_drv.h" 9b88baab8SDanilo Krummrich #include "nouveau_sched.h" 10b88baab8SDanilo Krummrich 11b88baab8SDanilo Krummrich struct nouveau_exec_job_args { 12b88baab8SDanilo Krummrich struct drm_file *file_priv; 13b88baab8SDanilo Krummrich struct nouveau_sched_entity *sched_entity; 14b88baab8SDanilo Krummrich 15b88baab8SDanilo Krummrich struct drm_exec exec; 16b88baab8SDanilo Krummrich struct nouveau_channel *chan; 17b88baab8SDanilo Krummrich 18b88baab8SDanilo Krummrich struct { 19b88baab8SDanilo Krummrich struct drm_nouveau_sync *s; 20b88baab8SDanilo Krummrich u32 count; 21b88baab8SDanilo Krummrich } in_sync; 22b88baab8SDanilo Krummrich 23b88baab8SDanilo Krummrich struct { 24b88baab8SDanilo Krummrich struct drm_nouveau_sync *s; 25b88baab8SDanilo Krummrich u32 count; 26b88baab8SDanilo Krummrich } out_sync; 27b88baab8SDanilo Krummrich 28b88baab8SDanilo Krummrich struct { 29b88baab8SDanilo Krummrich struct drm_nouveau_exec_push *s; 30b88baab8SDanilo Krummrich u32 count; 31b88baab8SDanilo Krummrich } push; 32b88baab8SDanilo Krummrich }; 33b88baab8SDanilo Krummrich 34b88baab8SDanilo Krummrich struct nouveau_exec_job { 35b88baab8SDanilo Krummrich struct nouveau_job base; 36b88baab8SDanilo Krummrich struct nouveau_fence *fence; 37b88baab8SDanilo Krummrich struct nouveau_channel *chan; 38b88baab8SDanilo Krummrich 39b88baab8SDanilo Krummrich struct { 40b88baab8SDanilo Krummrich struct drm_nouveau_exec_push *s; 41b88baab8SDanilo Krummrich u32 count; 42b88baab8SDanilo Krummrich } push; 43b88baab8SDanilo Krummrich }; 44b88baab8SDanilo Krummrich 45b88baab8SDanilo Krummrich #define to_nouveau_exec_job(job) \ 46b88baab8SDanilo Krummrich container_of((job), struct nouveau_exec_job, base) 47b88baab8SDanilo Krummrich 48b88baab8SDanilo Krummrich int nouveau_exec_job_init(struct nouveau_exec_job **job, 49b88baab8SDanilo Krummrich struct nouveau_exec_job_args *args); 50b88baab8SDanilo Krummrich 51e39701e3SDanilo Krummrich int nouveau_exec_ioctl_exec(struct drm_device *dev, void *data, 52b88baab8SDanilo Krummrich struct drm_file *file_priv); 53b88baab8SDanilo Krummrich 54*d59e75eeSDanilo Krummrich static inline unsigned int nouveau_exec_push_max_from_ib_max(int ib_max)55*d59e75eeSDanilo Krummrichnouveau_exec_push_max_from_ib_max(int ib_max) 56*d59e75eeSDanilo Krummrich { 57*d59e75eeSDanilo Krummrich /* Limit the number of IBs per job to half the size of the ring in order 58*d59e75eeSDanilo Krummrich * to avoid the ring running dry between submissions and preserve one 59*d59e75eeSDanilo Krummrich * more slot for the job's HW fence. 60*d59e75eeSDanilo Krummrich */ 61*d59e75eeSDanilo Krummrich return ib_max > 1 ? ib_max / 2 - 1 : 0; 62*d59e75eeSDanilo Krummrich } 63*d59e75eeSDanilo Krummrich 64b88baab8SDanilo Krummrich #endif 65