From 9370bb92b2d16684ee45cf24e879c93c509162da Mon Sep 17 00:00:00 2001 From: hc <hc@nodka.com> Date: Thu, 19 Dec 2024 01:47:39 +0000 Subject: [PATCH] add wifi6 8852be driver --- kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h | 161 ++++++++++++++++++++++++++++++++++++++++++++++------- 1 files changed, 139 insertions(+), 22 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h index c7b2ab6..518927e 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvdec2_link.h @@ -10,9 +10,21 @@ #include "mpp_rkvdec2.h" +#define RKVDEC_REG_IMPORTANT_BASE 0x2c +#define RKVDEC_REG_IMPORTANT_INDEX 11 +#define RKVDEC_SOFTREST_EN BIT(20) + #define RKVDEC_REG_SECOND_EN_BASE 0x30 #define RKVDEC_REG_SECOND_EN_INDEX 12 #define RKVDEC_WAIT_RESET_EN BIT(7) + +#define RKVDEC_REG_EN_MODE_SET 13 + +#define RKVDEC_REG_DEBUG_INT_BASE 0x440 +#define RKVDEC_REG_DEBUG_INT_INDEX 272 +#define RKVDEC_BIT_BUS_IDLE BIT(0) + +#define RKVDEC_REG_TIMEOUT_THRESHOLD 32 /* define for link hardware */ #define RKVDEC_LINK_ADD_CFG_NUM 1 @@ -21,6 +33,8 @@ #define RKVDEC_LINK_BIT_IRQ_DIS BIT(2) #define RKVDEC_LINK_BIT_IRQ BIT(8) #define RKVDEC_LINK_BIT_IRQ_RAW BIT(9) +#define RKVDEC_LINK_BIT_CORE_WORK_MODE BIT(16) +#define RKVDEC_LINK_BIT_CCU_WORK_MODE BIT(17) #define RKVDEC_LINK_CFG_ADDR_BASE 0x004 @@ -43,6 +57,76 @@ #define RKVDEC_LINK_REG_CYCLE_CNT 179 +/* define for ccu link hardware */ +#define RKVDEC_CCU_CTRL_BASE 0x000 +#define RKVDEC_CCU_BIT_AUTOGATE BIT(0) +#define RKVDEC_CCU_BIT_FIX_RCB BIT(20) + +#define RKVDEC_CCU_CFG_ADDR_BASE 0x004 +#define RKVDEC_CCU_LINK_MODE_BASE 0x008 +#define RKVDEC_CCU_BIT_ADD_MODE BIT(31) + +#define RKVDEC_CCU_CFG_DONE_BASE 0x00c +#define RKVDEC_CCU_BIT_CFG_DONE BIT(0) + +#define RKVDEC_CCU_DEC_NUM_BASE 0x010 +#define RKVDEC_CCU_TOTAL_NUM_BASE 0x014 + +#define RKVDEC_CCU_WORK_BASE 0x018 +#define RKVDEC_CCU_BIT_WORK_EN BIT(0) + +#define RKVDEC_CCU_SEND_NUM_BASE 0x024 +#define RKVDEC_CCU_WORK_MODE_BASE 0x040 +#define RKVDEC_CCU_BIT_WORK_MODE BIT(0) + +#define RKVDEC_CCU_CORE_WORK_BASE 0x044 +#define RKVDEC_CCU_CORE_STA_BASE 0x048 +#define RKVDEC_CCU_CORE_IDLE_BASE 0x04c +#define RKVDEC_CCU_CORE_ERR_BASE 0x054 + +#define RKVDEC_CCU_CORE_RW_MASK 0x30000 + +#define RKVDEC_MAX_WRITE_PART 6 +#define RKVDEC_MAX_READ_PART 2 + +struct rkvdec_link_part { + /* register offset of table buffer */ + u32 tb_reg_off; + /* start idx of task register */ + u32 reg_start; + /* number of task register */ + u32 reg_num; +}; + +struct rkvdec_link_status { + u32 dec_num_mask; + u32 err_flag_base; + u32 err_flag_bit; +}; + +struct rkvdec_link_info { + dma_addr_t iova; + /* total register for link table buffer */ + u32 tb_reg_num; + /* next link table addr in table buffer */ + u32 tb_reg_next; + /* current read back addr in table buffer */ + u32 tb_reg_r; + /* secondary enable in table buffer */ + u32 tb_reg_second_en; + u32 part_w_num; + u32 part_r_num; + + struct rkvdec_link_part part_w[RKVDEC_MAX_WRITE_PART]; + struct rkvdec_link_part part_r[RKVDEC_MAX_READ_PART]; + + /* interrupt read back in table buffer */ + u32 tb_reg_int; + u32 tb_reg_cycle; + bool hack_setup; + struct rkvdec_link_status reg_status; +}; + struct rkvdec_link_dev { struct device *dev; struct mpp_dev *mpp; @@ -56,35 +140,16 @@ u32 decoded; u32 total; u32 error; - u32 stuff_err; - u32 stuff_total; - u32 stuff_on_error; + u32 hack_task_running; struct rkvdec_link_info *info; struct mpp_dma_buffer *table; u32 link_node_size; u32 link_reg_count; - struct mpp_task **tasks_hw; - u32 task_capacity; - s32 task_total; - s32 task_decoded; - s32 task_size; - s32 task_count; - s32 task_write; - s32 task_read; - s32 task_send; - s32 task_recv; - /* taskqueue variables */ u32 task_running; - u32 task_prepared; - s32 task_to_run; - u32 task_on_timeout; - - /* taskqueue trigger variables */ - u32 task_irq; - u32 task_irq_prev; + atomic_t task_pending; /* timeout can be trigger in different thread so atomic is needed */ atomic_t task_timeout; u32 task_timeout_prev; @@ -99,10 +164,44 @@ u32 task_cnt; u64 stuff_cycle_sum; u32 stuff_cnt; + + /* link info */ + u32 task_capacity; + struct mpp_dma_buffer *table_array; + struct list_head unused_list; + struct list_head used_list; }; -extern struct rkvdec_link_info rkvdec_link_rk3568_hw_info; +enum RKVDEC2_CCU_MODE { + RKVDEC2_CCU_MODE_NULL = 0, + RKVDEC2_CCU_TASK_SOFT = 1, + RKVDEC2_CCU_TASK_HARD = 2, + RKVDEC2_CCU_MODE_BUTT, +}; + +struct rkvdec2_ccu { + struct device *dev; + /* register base */ + void __iomem *reg_base; + + atomic_t power_enabled; + struct mpp_clk_info aclk_info; +#ifdef CONFIG_ROCKCHIP_MPP_PROC_FS + struct proc_dir_entry *procfs; +#endif + struct reset_control *rst_a; + enum RKVDEC2_CCU_MODE ccu_mode; + u32 ccu_core_work_mode; + + struct mpp_dma_buffer *table_array; + struct list_head unused_list; + struct list_head used_list; + u32 timeout_flag; +}; + +extern struct rkvdec_link_info rkvdec_link_rk356x_hw_info; extern struct rkvdec_link_info rkvdec_link_v2_hw_info; +extern struct rkvdec_link_info rkvdec_link_vdpu382_hw_info; int rkvdec_link_dump(struct mpp_dev *mpp); @@ -118,4 +217,22 @@ void rkvdec2_link_worker(struct kthread_work *work_s); void rkvdec2_link_session_deinit(struct mpp_session *session); +/* for ccu link */ +int rkvdec2_attach_ccu(struct device *dev, struct rkvdec2_dev *dec); +int rkvdec2_ccu_link_init(struct platform_device *pdev, struct rkvdec2_dev *dec); +void *rkvdec2_ccu_alloc_task(struct mpp_session *session, struct mpp_task_msgs *msgs); +int rkvdec2_soft_ccu_iommu_fault_handle(struct iommu_domain *iommu, + struct device *iommu_dev, + unsigned long iova, int status, void *arg); +irqreturn_t rkvdec2_soft_ccu_irq(int irq, void *param); +void rkvdec2_soft_ccu_worker(struct kthread_work *work_s); + +int rkvdec2_ccu_alloc_table(struct rkvdec2_dev *dec, + struct rkvdec_link_dev *link_dec); +irqreturn_t rkvdec2_hard_ccu_irq(int irq, void *param); +void rkvdec2_hard_ccu_worker(struct kthread_work *work_s); +int rkvdec2_hard_ccu_iommu_fault_handle(struct iommu_domain *iommu, + struct device *iommu_dev, + unsigned long iova, int status, void *arg); + #endif -- Gitblit v1.6.2