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_vdpu2.c | 108 +++++++++++++++++------------------------------------- 1 files changed, 34 insertions(+), 74 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c b/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c index 1e58094..d5a6a30 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_vdpu2.c @@ -20,8 +20,6 @@ #include <linux/uaccess.h> #include <linux/regmap.h> #include <linux/proc_fs.h> -#include <linux/mfd/syscon.h> -#include <linux/rockchip/cpu.h> #include <soc/rockchip/pm_domains.h> #include "mpp_debug.h" @@ -113,7 +111,6 @@ #endif struct reset_control *rst_a; struct reset_control *rst_h; - struct regmap *grf; }; static struct mpp_hw_info vdpu_v2_hw_info = { @@ -230,8 +227,11 @@ offset = task->reg[idx] >> 10 << 4; } mem_region = mpp_task_attach_fd(&task->mpp_task, fd); - if (IS_ERR(mem_region)) + if (IS_ERR(mem_region)) { + mpp_err("reg[%3d]: %08x fd %d attach failed\n", + idx, task->reg[idx], fd); return -EFAULT; + } iova = mem_region->iova; mpp_debug(DEBUG_IOMMU, "DMV[%3d]: %3d => %pad + offset %10d\n", @@ -380,6 +380,13 @@ mpp_debug_leave(); return 0; +} + +static int vdpu_px30_run(struct mpp_dev *mpp, + struct mpp_task *mpp_task) +{ + mpp_iommu_flush_tlb(mpp->iommu_info); + return vdpu_run(mpp, mpp_task); } static int vdpu_finish(struct mpp_dev *mpp, @@ -619,12 +626,12 @@ static int vdpu_soft_reset(struct mpp_dev *mpp) { u32 val; + u32 ret; mpp_write(mpp, VDPU2_REG_SOFT_RESET, 1); - udelay(2); - val = mpp_read(mpp, VDPU2_REG_SOFT_RESET); - - return val; + ret = readl_relaxed_poll_timeout(mpp->reg_base + VDPU2_REG_SOFT_RESET, + val, !val, 0, 5); + return ret; } static int vdpu_reset(struct mpp_dev *mpp) @@ -639,6 +646,7 @@ ret = vdpu_soft_reset(mpp); if (ret && dec->rst_a && dec->rst_h) { /* Don't skip this or iommu won't work after reset */ + mpp_err("soft reset failed, use cru reset!\n"); mpp_debug(DEBUG_RESET, "reset in\n"); mpp_pmu_idle_request(mpp, true); mpp_safe_reset(dec->rst_a); @@ -682,6 +690,16 @@ .free_task = vdpu_free_task, }; +static struct mpp_dev_ops vdpu_px30_dev_ops = { + .alloc_task = vdpu_alloc_task, + .run = vdpu_px30_run, + .irq = vdpu_irq, + .isr = vdpu_isr, + .finish = vdpu_finish, + .result = vdpu_result, + .free_task = vdpu_free_task, +}; + static const struct mpp_dev_var vdpu_v2_data = { .device_type = MPP_DEVICE_VDPU2, .hw_info = &vdpu_v2_hw_info, @@ -695,7 +713,7 @@ .hw_info = &vdpu_v2_hw_info, .trans_info = vdpu_v2_trans, .hw_ops = &vdpu_px30_hw_ops, - .dev_ops = &vdpu_v2_dev_ops, + .dev_ops = &vdpu_px30_dev_ops, }; static const struct of_device_id mpp_vdpu2_dt_match[] = { @@ -724,15 +742,16 @@ dec = devm_kzalloc(dev, sizeof(struct vdpu_dev), GFP_KERNEL); if (!dec) return -ENOMEM; - platform_set_drvdata(pdev, dec); - mpp = &dec->mpp; + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_vdpu2_dt_match, pdev->dev.of_node); if (match) mpp->var = (struct mpp_dev_var *)match->data; + + mpp->core_id = of_alias_get_id(pdev->dev.of_node, "vdpu"); } ret = mpp_dev_probe(mpp, pdev); @@ -768,80 +787,21 @@ static int vdpu_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct vdpu_dev *dec = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&dec->mpp); - vdpu_procfs_remove(&dec->mpp); + mpp_dev_remove(mpp); + vdpu_procfs_remove(mpp); return 0; } - -static void vdpu_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct vdpu_dev *dec = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &dec->mpp; - - dev_info(dev, "shutdown device\n"); - - atomic_inc(&mpp->srv->shutdown_request); - ret = readx_poll_timeout(atomic_read, - &mpp->task_count, - val, val == 0, 20000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); -} - -static int vdpu_runtime_suspend(struct device *dev) -{ - struct mpp_dev *mpp = dev_get_drvdata(dev); - struct mpp_grf_info *info = mpp->grf_info; - struct mpp_taskqueue *queue = mpp->queue; - - if (cpu_is_rk3528() && info && info->mem_offset) { - mutex_lock(&queue->ref_lock); - if (!atomic_dec_if_positive(&queue->runtime_cnt)) { - regmap_write(info->grf, info->mem_offset, - info->val_mem_off); - } - mutex_unlock(&queue->ref_lock); - } - - return 0; -} - -static int vdpu_runtime_resume(struct device *dev) -{ - struct mpp_dev *mpp = dev_get_drvdata(dev); - struct mpp_grf_info *info = mpp->grf_info; - struct mpp_taskqueue *queue = mpp->queue; - - if (cpu_is_rk3528() && info && info->mem_offset) { - mutex_lock(&queue->ref_lock); - regmap_write(info->grf, info->mem_offset, - info->val_mem_on); - atomic_inc(&queue->runtime_cnt); - mutex_unlock(&queue->ref_lock); - } - - return 0; -} - -static const struct dev_pm_ops vdpu_pm_ops = { - .runtime_suspend = vdpu_runtime_suspend, - .runtime_resume = vdpu_runtime_resume, -}; struct platform_driver rockchip_vdpu2_driver = { .probe = vdpu_probe, .remove = vdpu_remove, - .shutdown = vdpu_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = VDPU2_DRIVER_NAME, - .pm = &vdpu_pm_ops, .of_match_table = of_match_ptr(mpp_vdpu2_dt_match), }, }; -- Gitblit v1.6.2