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_rkvenc.c | 82 ++++++++++++++++++++--------------------- 1 files changed, 40 insertions(+), 42 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c index 5bc2449..c71c03f 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_rkvenc.c @@ -28,6 +28,7 @@ #include <linux/nospec.h> #include <linux/workqueue.h> #include <soc/rockchip/pm_domains.h> +#include <soc/rockchip/rockchip_iommu.h> #include <soc/rockchip/rockchip_ipa.h> #include <soc/rockchip/rockchip_opp_select.h> #include <soc/rockchip/rockchip_system_monitor.h> @@ -439,6 +440,7 @@ int i; struct mpp_request *req; u32 reg_en = mpp_task->hw_info->reg_en; + u32 timing_en = mpp->srv->timing_en; /* * Tips: ensure osd plt clock is 0 before setting register, @@ -466,11 +468,20 @@ rkvenc_write_req_backward(mpp, task->reg, s, e, reg_en); } } + + /* 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, RKVENC_ENC_START_BASE, task->reg[reg_en]); + + mpp_task_run_end(mpp_task, timing_en); } break; case RKVENC_MODE_LINKTABLE_FIX: case RKVENC_MODE_LINKTABLE_UPDATE: @@ -494,7 +505,6 @@ mpp_write(mpp, RKVENC_INT_MSK_BASE, 0x100); mpp_write(mpp, RKVENC_INT_CLR_BASE, 0xffffffff); - udelay(5); mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0); mpp_debug_leave(); @@ -524,11 +534,10 @@ if (task->irq_status & RKVENC_INT_ERROR_BITS) { atomic_inc(&mpp->reset_request); - /* dump register */ if (mpp_debug_unlikely(DEBUG_DUMP_ERR_REG)) { - mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n", - task->irq_status); - mpp_task_dump_hw_reg(mpp, mpp_task); + /* dump error register */ + mpp_debug(DEBUG_DUMP_ERR_REG, "irq_status: %08x\n", task->irq_status); + mpp_task_dump_hw_reg(mpp); } } @@ -746,7 +755,7 @@ } seq_puts(seq, "\n"); /* item data*/ - seq_printf(seq, "|%8p|", session); + seq_printf(seq, "|%8d|", session->index); seq_printf(seq, "%8s|", mpp_device_name[session->device_type]); for (i = ENC_INFO_BASE; i < ENC_INFO_BUTT; i++) { u32 flag = priv->codec_info[i].flag; @@ -779,7 +788,7 @@ mutex_lock(&mpp->srv->session_lock); list_for_each_entry_safe(session, n, &mpp->srv->session_list, - session_link) { + service_link) { if (session->device_type != MPP_DEVICE_RKVENC) continue; if (!session->priv) @@ -802,6 +811,10 @@ enc->procfs = NULL; return -EIO; } + + /* for common mpp_dev options */ + mpp_procfs_create_common(enc->procfs, mpp); + /* for debug */ mpp_procfs_create_u32("aclk", 0644, enc->procfs, &enc->aclk_info.debug_rate_hz); @@ -956,7 +969,7 @@ }; static struct monitor_dev_profile enc_mdevp = { - .type = MONITOR_TPYE_DEV, + .type = MONITOR_TYPE_DEV, .low_temp_adjust = rockchip_monitor_dev_low_temp_adjust, .high_temp_adjust = rockchip_monitor_dev_high_temp_adjust, }; @@ -985,15 +998,19 @@ return ret; } +static const struct rockchip_opp_data __maybe_unused rv1126_rkvenc_opp_data = { + .get_soc_info = rv1126_get_soc_info, +}; + static const struct of_device_id rockchip_rkvenc_of_match[] = { #ifdef CONFIG_CPU_RV1126 { .compatible = "rockchip,rv1109", - .data = (void *)&rv1126_get_soc_info, + .data = (void *)&rv1126_rkvenc_opp_data, }, { .compatible = "rockchip,rv1126", - .data = (void *)&rv1126_get_soc_info, + .data = (void *)&rv1126_rkvenc_opp_data, }, #endif {}, @@ -1004,6 +1021,7 @@ struct rkvenc_dev *enc = to_rkvenc_dev(mpp); struct clk *clk_core = enc->core_clk_info.clk; struct devfreq_cooling_power *venc_dcp = &venc_cooling_power_data; + struct rockchip_opp_info opp_info = {0}; int ret = 0; if (!clk_core) @@ -1021,8 +1039,8 @@ return 0; } - ret = rockchip_init_opp_table(mpp->dev, rockchip_rkvenc_of_match, - "leakage", "venc"); + rockchip_get_opp_data(rockchip_rkvenc_of_match, &opp_info); + ret = rockchip_init_opp_table(mpp->dev, &opp_info, "leakage", "venc"); if (ret) { dev_err(mpp->dev, "failed to init_opp_table\n"); return ret; @@ -1132,7 +1150,7 @@ else enc->aux_iova = page_iova; - rk_iommu_unmask_irq(mpp->dev); + rockchip_iommu_unmask_irq(mpp->dev); mpp_iommu_up_write(mpp->iommu_info); mpp_debug_leave(); @@ -1149,7 +1167,7 @@ mpp_debug(DEBUG_IOMMU, "IOMMU_GET_BUS_ID(status)=%d\n", IOMMU_GET_BUS_ID(status)); if (IOMMU_GET_BUS_ID(status)) { enc->fault_iova = iova; - rk_iommu_mask_irq(mpp->dev); + rockchip_iommu_mask_irq(mpp->dev); queue_work(enc->iommu_wq, &enc->iommu_work); } mpp_debug_leave(); @@ -1214,7 +1232,7 @@ } INIT_WORK(&enc->iommu_work, rkvenc_iommu_handle_work); - mpp->iommu_info->hdl = rkvenc_iommu_fault_handle; + mpp->fault_handler = rkvenc_iommu_fault_handle; return ret; } @@ -1264,7 +1282,7 @@ mpp_write(mpp, RKVENC_INT_STATUS_BASE, 0); /* cru reset */ if (enc->rst_a && enc->rst_h && enc->rst_core) { - rockchip_pmu_idle_request(mpp->dev, true); + mpp_pmu_idle_request(mpp, true); mpp_safe_reset(enc->rst_a); mpp_safe_reset(enc->rst_h); mpp_safe_reset(enc->rst_core); @@ -1272,7 +1290,7 @@ mpp_safe_unreset(enc->rst_a); mpp_safe_unreset(enc->rst_h); mpp_safe_unreset(enc->rst_core); - rockchip_pmu_idle_request(mpp->dev, false); + mpp_pmu_idle_request(mpp, false); } #ifdef CONFIG_PM_DEVFREQ if (enc->devfreq) @@ -1429,7 +1447,7 @@ if (!enc) return -ENOMEM; mpp = &enc->mpp; - platform_set_drvdata(pdev, enc); + platform_set_drvdata(pdev, mpp); if (pdev->dev.of_node) { match = of_match_node(mpp_rkvenc_dt_match, pdev->dev.of_node); @@ -1468,39 +1486,19 @@ static int rkvenc_remove(struct platform_device *pdev) { struct device *dev = &pdev->dev; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); + struct mpp_dev *mpp = dev_get_drvdata(dev); dev_info(dev, "remove device\n"); - mpp_dev_remove(&enc->mpp); - rkvenc_procfs_remove(&enc->mpp); + mpp_dev_remove(mpp); + rkvenc_procfs_remove(mpp); return 0; -} - -static void rkvenc_shutdown(struct platform_device *pdev) -{ - int ret; - int val; - struct device *dev = &pdev->dev; - struct rkvenc_dev *enc = platform_get_drvdata(pdev); - struct mpp_dev *mpp = &enc->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, 1000, 200000); - if (ret == -ETIMEDOUT) - dev_err(dev, "wait total running time out\n"); - - dev_info(dev, "shutdown success\n"); } struct platform_driver rockchip_rkvenc_driver = { .probe = rkvenc_probe, .remove = rkvenc_remove, - .shutdown = rkvenc_shutdown, + .shutdown = mpp_dev_shutdown, .driver = { .name = RKVENC_DRIVER_NAME, .of_match_table = of_match_ptr(mpp_rkvenc_dt_match), -- Gitblit v1.6.2