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_vdpp.c | 29 +++++++++++++++++++++++++---- 1 files changed, 25 insertions(+), 4 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c index 9369615..c0dc382 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpp.c @@ -27,6 +27,8 @@ #define VDPP_DRIVER_NAME "mpp_vdpp" #define VDPP_SESSION_MAX_BUFFERS 15 +#define VDPP_REG_WORK_MODE 0x0008 +#define VDPP_REG_VDPP_MODE BIT(1) #define to_vdpp_info(info) \ container_of(info, struct vdpp_hw_info, hw) @@ -307,6 +309,7 @@ struct vdpp_dev *vdpp = to_vdpp_dev(mpp); struct vdpp_task *task = to_vdpp_task(mpp_task); struct vdpp_hw_info *hw_info = vdpp->hw_info; + u32 timing_en = mpp->srv->timing_en; mpp_debug_enter(); @@ -332,11 +335,18 @@ } } + /* flush tlb before starting hardware */ + mpp_iommu_flush_tlb(mpp->iommu_info); + /* init current task */ mpp->cur_task = mpp_task; + + mpp_task_run_begin(mpp_task, timing_en, MPP_WORK_TIMEOUT_DELAY); /* Flush the register before the start the device */ wmb(); mpp_write(mpp, hw_info->start_base, task->reg[reg_en]); + + mpp_task_run_end(mpp_task, timing_en); mpp_debug_leave(); @@ -546,12 +556,18 @@ { struct vdpp_dev *vdpp = to_vdpp_dev(mpp); struct vdpp_hw_info *hw_info = vdpp->hw_info; + u32 work_mode = mpp_read(mpp, VDPP_REG_WORK_MODE); + if (!(work_mode & VDPP_REG_VDPP_MODE)) + return IRQ_NONE; mpp->irq_status = mpp_read(mpp, hw_info->int_sta_base); if (!(mpp->irq_status & hw_info->int_mask)) return IRQ_NONE; mpp_write(mpp, hw_info->int_en_base, 0); mpp_write(mpp, hw_info->int_clr_base, mpp->irq_status); + + /* ensure hardware is being off status */ + mpp_write(mpp, hw_info->start_base, 0); return IRQ_WAKE_THREAD; } @@ -590,7 +606,7 @@ mpp_debug(DEBUG_RESET, "reset in\n"); /* Don't skip this or iommu won't work after reset */ - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(vdpp->rst_a); mpp_safe_reset(vdpp->rst_h); mpp_safe_reset(vdpp->rst_s); @@ -598,7 +614,7 @@ mpp_safe_unreset(vdpp->rst_a); mpp_safe_unreset(vdpp->rst_h); mpp_safe_unreset(vdpp->rst_s); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); mpp_debug(DEBUG_RESET, "reset out\n"); } @@ -617,14 +633,17 @@ mpp_write(mpp, hw_info->cfg_base, hw_info->bit_rst_en); ret = readl_relaxed_poll_timeout(mpp->reg_base + hw_info->rst_sta_base, rst_status, - !(rst_status & hw_info->bit_rst_done), - 0, 2); + rst_status & hw_info->bit_rst_done, + 0, 5); if (ret) { mpp_err("soft reset timeout, use cru reset\n"); return _vdpp_reset(mpp, vdpp); } mpp_write(mpp, hw_info->rst_sta_base, 0); + + /* ensure hardware is being off status */ + mpp_write(mpp, hw_info->start_base, 0); return 0; } @@ -684,6 +703,7 @@ match = of_match_node(mpp_vdpp_dt_match, pdev->dev.of_node); if (match) mpp->var = (struct mpp_dev_var *)match->data; + mpp->core_id = -1; } ret = mpp_dev_probe(mpp, pdev); @@ -710,6 +730,7 @@ dev_err(dev, "register interrupter runtime failed\n"); return -EINVAL; } + mpp->session_max_buffers = VDPP_SESSION_MAX_BUFFERS; vdpp->hw_info = to_vdpp_info(mpp->var->hw_info); vdpp_procfs_init(mpp); -- Gitblit v1.6.2