brintos

brintos / linux-shallow public Read only

0
0
Text · 2.5 KiB · 20cd1da Raw
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