1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0 */ 2*4882a593Smuzhiyun /* Copyright 2019 Collabora ltd. */ 3*4882a593Smuzhiyun 4*4882a593Smuzhiyun #ifndef __PANFROST_JOB_H__ 5*4882a593Smuzhiyun #define __PANFROST_JOB_H__ 6*4882a593Smuzhiyun 7*4882a593Smuzhiyun #include <uapi/drm/panfrost_drm.h> 8*4882a593Smuzhiyun #include <drm/gpu_scheduler.h> 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun struct panfrost_device; 11*4882a593Smuzhiyun struct panfrost_gem_object; 12*4882a593Smuzhiyun struct panfrost_file_priv; 13*4882a593Smuzhiyun 14*4882a593Smuzhiyun struct panfrost_job { 15*4882a593Smuzhiyun struct drm_sched_job base; 16*4882a593Smuzhiyun 17*4882a593Smuzhiyun struct kref refcount; 18*4882a593Smuzhiyun 19*4882a593Smuzhiyun struct panfrost_device *pfdev; 20*4882a593Smuzhiyun struct panfrost_file_priv *file_priv; 21*4882a593Smuzhiyun 22*4882a593Smuzhiyun /* Optional fences userspace can pass in for the job to depend on. */ 23*4882a593Smuzhiyun struct dma_fence **in_fences; 24*4882a593Smuzhiyun u32 in_fence_count; 25*4882a593Smuzhiyun 26*4882a593Smuzhiyun /* Fence to be signaled by IRQ handler when the job is complete. */ 27*4882a593Smuzhiyun struct dma_fence *done_fence; 28*4882a593Smuzhiyun 29*4882a593Smuzhiyun __u64 jc; 30*4882a593Smuzhiyun __u32 requirements; 31*4882a593Smuzhiyun __u32 flush_id; 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun /* Exclusive fences we have taken from the BOs to wait for */ 34*4882a593Smuzhiyun struct dma_fence **implicit_fences; 35*4882a593Smuzhiyun struct panfrost_gem_mapping **mappings; 36*4882a593Smuzhiyun struct drm_gem_object **bos; 37*4882a593Smuzhiyun u32 bo_count; 38*4882a593Smuzhiyun 39*4882a593Smuzhiyun /* Fence to be signaled by drm-sched once its done with the job */ 40*4882a593Smuzhiyun struct dma_fence *render_done_fence; 41*4882a593Smuzhiyun }; 42*4882a593Smuzhiyun 43*4882a593Smuzhiyun int panfrost_job_init(struct panfrost_device *pfdev); 44*4882a593Smuzhiyun void panfrost_job_fini(struct panfrost_device *pfdev); 45*4882a593Smuzhiyun int panfrost_job_open(struct panfrost_file_priv *panfrost_priv); 46*4882a593Smuzhiyun void panfrost_job_close(struct panfrost_file_priv *panfrost_priv); 47*4882a593Smuzhiyun int panfrost_job_push(struct panfrost_job *job); 48*4882a593Smuzhiyun void panfrost_job_put(struct panfrost_job *job); 49*4882a593Smuzhiyun void panfrost_job_enable_interrupts(struct panfrost_device *pfdev); 50*4882a593Smuzhiyun int panfrost_job_is_idle(struct panfrost_device *pfdev); 51*4882a593Smuzhiyun 52*4882a593Smuzhiyun #endif 53