119 lines · c
1/* SPDX-License-Identifier: MIT */2 3#ifndef NOUVEAU_SCHED_H4#define NOUVEAU_SCHED_H5 6#include <linux/types.h>7 8#include <drm/drm_gpuvm.h>9#include <drm/gpu_scheduler.h>10 11#include "nouveau_drv.h"12 13#define to_nouveau_job(sched_job) \14 container_of((sched_job), struct nouveau_job, base)15 16struct nouveau_job_ops;17 18enum nouveau_job_state {19 NOUVEAU_JOB_UNINITIALIZED = 0,20 NOUVEAU_JOB_INITIALIZED,21 NOUVEAU_JOB_SUBMIT_SUCCESS,22 NOUVEAU_JOB_SUBMIT_FAILED,23 NOUVEAU_JOB_RUN_SUCCESS,24 NOUVEAU_JOB_RUN_FAILED,25};26 27struct nouveau_job_args {28 struct drm_file *file_priv;29 struct nouveau_sched *sched;30 u32 credits;31 32 enum dma_resv_usage resv_usage;33 bool sync;34 35 struct {36 struct drm_nouveau_sync *s;37 u32 count;38 } in_sync;39 40 struct {41 struct drm_nouveau_sync *s;42 u32 count;43 } out_sync;44 45 const struct nouveau_job_ops *ops;46};47 48struct nouveau_job {49 struct drm_sched_job base;50 51 enum nouveau_job_state state;52 53 struct nouveau_sched *sched;54 struct list_head entry;55 56 struct drm_file *file_priv;57 struct nouveau_cli *cli;58 59 enum dma_resv_usage resv_usage;60 struct dma_fence *done_fence;61 62 bool sync;63 64 struct {65 struct drm_nouveau_sync *data;66 u32 count;67 } in_sync;68 69 struct {70 struct drm_nouveau_sync *data;71 struct drm_syncobj **objs;72 struct dma_fence_chain **chains;73 u32 count;74 } out_sync;75 76 const struct nouveau_job_ops {77 /* If .submit() returns without any error, it is guaranteed that78 * armed_submit() is called.79 */80 int (*submit)(struct nouveau_job *, struct drm_gpuvm_exec *);81 void (*armed_submit)(struct nouveau_job *, struct drm_gpuvm_exec *);82 struct dma_fence *(*run)(struct nouveau_job *);83 void (*free)(struct nouveau_job *);84 enum drm_gpu_sched_stat (*timeout)(struct nouveau_job *);85 } *ops;86};87 88int nouveau_job_ucopy_syncs(struct nouveau_job_args *args,89 u32 inc, u64 ins,90 u32 outc, u64 outs);91 92int nouveau_job_init(struct nouveau_job *job,93 struct nouveau_job_args *args);94void nouveau_job_fini(struct nouveau_job *job);95int nouveau_job_submit(struct nouveau_job *job);96void nouveau_job_done(struct nouveau_job *job);97void nouveau_job_free(struct nouveau_job *job);98 99struct nouveau_sched {100 struct drm_gpu_scheduler base;101 struct drm_sched_entity entity;102 struct workqueue_struct *wq;103 struct mutex mutex;104 105 struct {106 struct {107 struct list_head head;108 spinlock_t lock;109 } list;110 struct wait_queue_head wq;111 } job;112};113 114int nouveau_sched_create(struct nouveau_sched **psched, struct nouveau_drm *drm,115 struct workqueue_struct *wq, u32 credit_limit);116void nouveau_sched_destroy(struct nouveau_sched **psched);117 118#endif119