1 /* SPDX-License-Identifier: GPL-2.0 */ 2 /* 3 * Copyright (C) Rockchip Electronics Co.Ltd 4 * Author: Felix Zeng <felix.zeng@rock-chips.com> 5 */ 6 7 #ifndef __LINUX_RKNPU_JOB_H_ 8 #define __LINUX_RKNPU_JOB_H_ 9 10 #include <linux/spinlock.h> 11 #include <linux/dma-fence.h> 12 #include <linux/irq.h> 13 14 #include <drm/drm_device.h> 15 16 #include "rknpu_ioctl.h" 17 18 #define RKNPU_MAX_CORES 3 19 20 #define RKNPU_JOB_DONE (1 << 0) 21 #define RKNPU_JOB_ASYNC (1 << 1) 22 #define RKNPU_JOB_DETACHED (1 << 2) 23 24 #define RKNPU_CORE_AUTO_MASK 0x00 25 #define RKNPU_CORE0_MASK 0x01 26 #define RKNPU_CORE1_MASK 0x02 27 #define RKNPU_CORE2_MASK 0x04 28 29 struct rknpu_job { 30 struct rknpu_device *rknpu_dev; 31 struct list_head head[RKNPU_MAX_CORES]; 32 struct work_struct cleanup_work; 33 bool in_queue[RKNPU_MAX_CORES]; 34 bool irq_entry[RKNPU_MAX_CORES]; 35 unsigned int flags; 36 int ret; 37 struct rknpu_submit *args; 38 bool args_owner; 39 struct rknpu_task *first_task; 40 struct rknpu_task *last_task; 41 uint32_t int_mask[RKNPU_MAX_CORES]; 42 uint32_t int_status[RKNPU_MAX_CORES]; 43 struct dma_fence *fence; 44 ktime_t timestamp; 45 uint32_t use_core_num; 46 atomic_t run_count; 47 atomic_t interrupt_count; 48 ktime_t hw_recoder_time; 49 }; 50 51 irqreturn_t rknpu_core0_irq_handler(int irq, void *data); 52 irqreturn_t rknpu_core1_irq_handler(int irq, void *data); 53 irqreturn_t rknpu_core2_irq_handler(int irq, void *data); 54 55 #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM 56 int rknpu_submit_ioctl(struct drm_device *dev, void *data, 57 struct drm_file *file_priv); 58 #endif 59 #ifdef CONFIG_ROCKCHIP_RKNPU_DMA_HEAP 60 int rknpu_submit_ioctl(struct rknpu_device *rknpu_dev, unsigned long data); 61 #endif 62 63 int rknpu_get_hw_version(struct rknpu_device *rknpu_dev, uint32_t *version); 64 65 int rknpu_get_bw_priority(struct rknpu_device *rknpu_dev, uint32_t *priority, 66 uint32_t *expect, uint32_t *tw); 67 68 int rknpu_set_bw_priority(struct rknpu_device *rknpu_dev, uint32_t priority, 69 uint32_t expect, uint32_t tw); 70 71 int rknpu_clear_rw_amount(struct rknpu_device *rknpu_dev); 72 73 int rknpu_get_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *dt_wr, 74 uint32_t *dt_rd, uint32_t *wd_rd); 75 76 int rknpu_get_total_rw_amount(struct rknpu_device *rknpu_dev, uint32_t *amount); 77 78 #endif /* __LINUX_RKNPU_JOB_H_ */ 79