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