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_service.c | 141 +++++++++++++++++++++++++++++++++------------- 1 files changed, 100 insertions(+), 41 deletions(-) diff --git a/kernel/drivers/video/rockchip/mpp/mpp_service.c b/kernel/drivers/video/rockchip/mpp/mpp_service.c index 67ef213..c04d6fb 100644 --- a/kernel/drivers/video/rockchip/mpp/mpp_service.c +++ b/kernel/drivers/video/rockchip/mpp/mpp_service.c @@ -19,7 +19,6 @@ #include <linux/slab.h> #include <linux/nospec.h> #include <linux/mfd/syscon.h> -#include <linux/regmap.h> #include "mpp_debug.h" #include "mpp_common.h" @@ -28,8 +27,22 @@ #define MPP_CLASS_NAME "mpp_class" #define MPP_SERVICE_NAME "mpp_service" -#define MPP_REGISTER_DRIVER(srv, X, x) {\ - if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_##X))\ +#define HAS_RKVDEC IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVDEC) +#define HAS_RKVENC IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVENC) +#define HAS_VDPU1 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPU1) +#define HAS_VEPU1 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU1) +#define HAS_VDPU2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPU2) +#define HAS_VEPU2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU2) +#define HAS_VEPU22 IS_ENABLED(CONFIG_ROCKCHIP_MPP_VEPU22) +#define HAS_IEP2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_IEP2) +#define HAS_JPGDEC IS_ENABLED(CONFIG_ROCKCHIP_MPP_JPGDEC) +#define HAS_RKVDEC2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVDEC2) +#define HAS_RKVENC2 IS_ENABLED(CONFIG_ROCKCHIP_MPP_RKVENC2) +#define HAS_AV1DEC IS_ENABLED(CONFIG_ROCKCHIP_MPP_AV1DEC) +#define HAS_VDPP IS_ENABLED(CONFIG_ROCKCHIP_MPP_VDPP) + +#define MPP_REGISTER_DRIVER(srv, flag, X, x) {\ + if (flag)\ mpp_add_driver(srv, MPP_DRIVER_##X, &rockchip_##x##_driver, "grf_"#x);\ } @@ -43,47 +56,34 @@ struct mpp_grf_info *grf_info, const char *grf_name) { + int ret; int index; u32 grf_offset = 0; u32 grf_value = 0; - u32 mem_offset = 0; - u32 val_mem_on = 0; - u32 val_mem_off = 0; struct regmap *grf; grf = syscon_regmap_lookup_by_phandle(np, "rockchip,grf"); if (IS_ERR_OR_NULL(grf)) return -EINVAL; + ret = of_property_read_u32(np, "rockchip,grf-offset", &grf_offset); + if (ret) + return -ENODATA; + index = of_property_match_string(np, "rockchip,grf-names", grf_name); if (index < 0) return -ENODATA; - of_property_read_u32(np, "rockchip,grf-offset", &grf_offset); - of_property_read_u32_index(np, "rockchip,grf-values", - index, &grf_value); - of_property_read_u32_index(np, "rockchip,grf-mem-offset", - index, &mem_offset); - of_property_read_u32_index(np, "rockchip,grf-mem-on-values", - index, &val_mem_on); - of_property_read_u32_index(np, "rockchip,grf-mem-off-values", - index, &val_mem_off); - + ret = of_property_read_u32_index(np, "rockchip,grf-values", + index, &grf_value); + if (ret) + return -ENODATA; grf_info->grf = grf; grf_info->offset = grf_offset; grf_info->val = grf_value; - grf_info->mem_offset = mem_offset; - grf_info->val_mem_on = val_mem_on; - grf_info->val_mem_off = val_mem_off; - - if (grf_info->offset && grf_info->val) - mpp_set_grf(grf_info); - - if (grf_info->mem_offset && grf_info->val_mem_off) - regmap_write(grf_info->grf, grf_info->mem_offset, - grf_info->val_mem_off); + mpp_set_grf(grf_info); return 0; } @@ -99,7 +99,10 @@ &srv->grf_infos[type], grf_name); - ret = platform_driver_register(driver); + if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_AV1DEC) && type == MPP_DRIVER_AV1DEC) + ret = av1dec_driver_register(driver); + else + ret = platform_driver_register(driver); if (ret) return ret; @@ -111,8 +114,12 @@ static int mpp_remove_driver(struct mpp_service *srv, int i) { if (srv && srv->sub_drivers[i]) { - mpp_set_grf(&srv->grf_infos[i]); - platform_driver_unregister(srv->sub_drivers[i]); + if (i != MPP_DRIVER_AV1DEC) { + mpp_set_grf(&srv->grf_infos[i]); + platform_driver_unregister(srv->sub_drivers[i]); + } else if (IS_ENABLED(CONFIG_ROCKCHIP_MPP_AV1DEC)) { + av1dec_driver_unregister(srv->sub_drivers[i]); + } srv->sub_drivers[i] = NULL; } @@ -176,6 +183,55 @@ return 0; } +static int mpp_dump_session(struct mpp_session *session, struct seq_file *s) +{ + struct mpp_dma_session *dma = session->dma; + struct mpp_dma_buffer *n; + struct mpp_dma_buffer *buffer; + phys_addr_t end; + unsigned long z = 0, t = 0; + int i = 0; +#define K(size) ((unsigned long)((size) >> 10)) + + if (!dma) + return 0; + + seq_puts(s, "session iova range dump:\n"); + + mutex_lock(&dma->list_mutex); + list_for_each_entry_safe(buffer, n, &dma->used_list, link) { + end = buffer->iova + buffer->size - 1; + z = (unsigned long)buffer->size; + t += z; + + seq_printf(s, "%4d: ", i++); + seq_printf(s, "%pa..%pa (%10lu %s)\n", &buffer->iova, &end, + (z >= 1024) ? (K(z)) : z, + (z >= 1024) ? "KiB" : "Bytes"); + } + i = 0; + list_for_each_entry_safe(buffer, n, &dma->unused_list, link) { + if (!buffer->dmabuf) + continue; + + end = buffer->iova + buffer->size - 1; + z = (unsigned long)buffer->size; + t += z; + + seq_printf(s, "%4d: ", i++); + seq_printf(s, "%pa..%pa (%10lu %s)\n", &buffer->iova, &end, + (z >= 1024) ? (K(z)) : z, + (z >= 1024) ? "KiB" : "Bytes"); + } + + mutex_unlock(&dma->list_mutex); + seq_printf(s, "session: pid=%d index=%d\n", session->pid, session->index); + seq_printf(s, " device: %s\n", dev_name(session->mpp->dev)); + seq_printf(s, " memory: %lu MiB\n", K(K(t))); + + return 0; +} + static int mpp_show_session_summary(struct seq_file *seq, void *offset) { struct mpp_session *session = NULL, *n; @@ -193,6 +249,8 @@ if (!session->mpp) continue; mpp = session->mpp; + + mpp_dump_session(session, seq); if (mpp->dev_ops->dump_session) mpp->dev_ops->dump_session(session, seq); @@ -364,18 +422,19 @@ mpp_procfs_init(srv); /* register sub drivers */ - MPP_REGISTER_DRIVER(srv, RKVDEC, rkvdec); - MPP_REGISTER_DRIVER(srv, RKVENC, rkvenc); - MPP_REGISTER_DRIVER(srv, VDPU1, vdpu1); - MPP_REGISTER_DRIVER(srv, VEPU1, vepu1); - MPP_REGISTER_DRIVER(srv, VDPU2, vdpu2); - MPP_REGISTER_DRIVER(srv, VEPU2, vepu2); - MPP_REGISTER_DRIVER(srv, VEPU22, vepu22); - MPP_REGISTER_DRIVER(srv, IEP2, iep2); - MPP_REGISTER_DRIVER(srv, JPGDEC, jpgdec); - MPP_REGISTER_DRIVER(srv, RKVDEC2, rkvdec2); - MPP_REGISTER_DRIVER(srv, VDPP, vdpp); - MPP_REGISTER_DRIVER(srv, RKVENC2, rkvenc2); + MPP_REGISTER_DRIVER(srv, HAS_RKVDEC, RKVDEC, rkvdec); + MPP_REGISTER_DRIVER(srv, HAS_RKVENC, RKVENC, rkvenc); + MPP_REGISTER_DRIVER(srv, HAS_VDPU1, VDPU1, vdpu1); + MPP_REGISTER_DRIVER(srv, HAS_VEPU1, VEPU1, vepu1); + MPP_REGISTER_DRIVER(srv, HAS_VDPU2, VDPU2, vdpu2); + MPP_REGISTER_DRIVER(srv, HAS_VEPU2, VEPU2, vepu2); + MPP_REGISTER_DRIVER(srv, HAS_VEPU22, VEPU22, vepu22); + MPP_REGISTER_DRIVER(srv, HAS_IEP2, IEP2, iep2); + MPP_REGISTER_DRIVER(srv, HAS_JPGDEC, JPGDEC, jpgdec); + MPP_REGISTER_DRIVER(srv, HAS_RKVDEC2, RKVDEC2, rkvdec2); + MPP_REGISTER_DRIVER(srv, HAS_RKVENC2, RKVENC2, rkvenc2); + MPP_REGISTER_DRIVER(srv, HAS_AV1DEC, AV1DEC, av1dec); + MPP_REGISTER_DRIVER(srv, HAS_VDPP, VDPP, vdpp); dev_info(dev, "probe success\n"); -- Gitblit v1.6.2