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