1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* Copyright 2019 Collabora ltd. */ 3 4 #ifndef __PANFROST_JOB_H__ 5 #define __PANFROST_JOB_H__ 6 7 #include <uapi/drm/panfrost_drm.h> 8 #include <drm/gpu_scheduler.h> 9 10 struct panfrost_device; 11 struct panfrost_gem_object; 12 struct panfrost_file_priv; 13 14 struct panfrost_job { 15 struct drm_sched_job base; 16 17 struct kref refcount; 18 19 struct panfrost_device *pfdev; 20 struct panfrost_mmu *mmu; 21 struct panfrost_jm_ctx *ctx; 22 23 /* Fence to be signaled by IRQ handler when the job is complete. */ 24 struct dma_fence *done_fence; 25 26 __u64 jc; 27 __u32 requirements; 28 __u32 flush_id; 29 30 struct panfrost_gem_mapping **mappings; 31 struct drm_gem_object **bos; 32 u32 bo_count; 33 34 /* Fence to be signaled by drm-sched once its done with the job */ 35 struct dma_fence *render_done_fence; 36 37 struct panfrost_engine_usage *engine_usage; 38 bool is_profiled; 39 ktime_t start_time; 40 u64 start_cycles; 41 }; 42 43 struct panfrost_js_ctx { 44 struct drm_sched_entity sched_entity; 45 bool enabled; 46 }; 47 48 #define NUM_JOB_SLOTS 3 49 50 struct panfrost_jm_ctx { 51 struct kref refcnt; 52 bool destroyed; 53 struct drm_sched_entity slot_entity[NUM_JOB_SLOTS]; 54 }; 55 56 extern const char * const panfrost_engine_names[]; 57 58 int panfrost_jm_ctx_create(struct drm_file *file, 59 struct drm_panfrost_jm_ctx_create *args); 60 int panfrost_jm_ctx_destroy(struct drm_file *file, u32 handle); 61 void panfrost_jm_ctx_put(struct panfrost_jm_ctx *jm_ctx); 62 struct panfrost_jm_ctx *panfrost_jm_ctx_get(struct panfrost_jm_ctx *jm_ctx); 63 struct panfrost_jm_ctx *panfrost_jm_ctx_from_handle(struct drm_file *file, u32 handle); 64 65 int panfrost_jm_init(struct panfrost_device *pfdev); 66 void panfrost_jm_fini(struct panfrost_device *pfdev); 67 int panfrost_jm_open(struct drm_file *file); 68 void panfrost_jm_close(struct drm_file *file); 69 void panfrost_jm_reset_interrupts(struct panfrost_device *pfdev); 70 void panfrost_jm_enable_interrupts(struct panfrost_device *pfdev); 71 void panfrost_jm_suspend_irq(struct panfrost_device *pfdev); 72 int panfrost_jm_is_idle(struct panfrost_device *pfdev); 73 int panfrost_job_get_slot(struct panfrost_job *job); 74 int panfrost_job_push(struct panfrost_job *job); 75 void panfrost_job_put(struct panfrost_job *job); 76 77 #endif 78