diff --git a/drivers/rknpu/include/rknpu_drv.h b/drivers/rknpu/include/rknpu_drv.h index 0e7ad2d7ddb05..ffb902856260b 100644 --- a/drivers/rknpu/include/rknpu_drv.h +++ b/drivers/rknpu/include/rknpu_drv.h @@ -29,10 +29,10 @@ #define DRIVER_NAME "rknpu" #define DRIVER_DESC "RKNPU driver" -#define DRIVER_DATE "20240129" +#define DRIVER_DATE "20240226" #define DRIVER_MAJOR 0 #define DRIVER_MINOR 9 -#define DRIVER_PATCHLEVEL 4 +#define DRIVER_PATCHLEVEL 5 #define LOG_TAG "RKNPU" @@ -58,11 +58,6 @@ struct rknpu_irqs_data { irqreturn_t (*irq_hdl)(int irq, void *ctx); }; -struct rknpu_reset_data { - const char *srst_a_name; - const char *srst_h_name; -}; - struct rknpu_amount_data { uint16_t offset_clr_all; uint16_t offset_dt_wr; @@ -80,9 +75,7 @@ struct rknpu_config { __u32 pc_task_status_offset; __u32 pc_dma_ctrl; const struct rknpu_irqs_data *irqs; - const struct rknpu_reset_data *resets; int num_irqs; - int num_resets; __u64 nbuf_phyaddr; __u64 nbuf_size; __u64 max_submit_number; @@ -132,8 +125,8 @@ struct rknpu_device { void __iomem *bw_priority_base; struct rknpu_fence_context *fence_ctx; bool iommu_en; - struct reset_control *srst_a[RKNPU_MAX_CORES]; - struct reset_control *srst_h[RKNPU_MAX_CORES]; + struct reset_control **srsts; + int num_srsts; struct clk_bulk_data *clks; int num_clks; struct regulator *vdd; diff --git a/drivers/rknpu/rknpu_devfreq.c b/drivers/rknpu/rknpu_devfreq.c index a2a83a9ccd9e3..9c5f9b3d256ae 100644 --- a/drivers/rknpu/rknpu_devfreq.c +++ b/drivers/rknpu/rknpu_devfreq.c @@ -162,7 +162,6 @@ static int rk3588_npu_set_read_margin(struct device *dev, struct rockchip_opp_info *opp_info, u32 rm) { - struct rknpu_device *rknpu_dev = dev_get_drvdata(dev); u32 offset = 0, val = 0; int i, ret = 0; @@ -174,7 +173,7 @@ static int rk3588_npu_set_read_margin(struct device *dev, LOG_DEV_DEBUG(dev, "set rm to %d\n", rm); - for (i = 0; i < rknpu_dev->config->num_irqs; i++) { + for (i = 0; i < 3; i++) { ret = regmap_read(opp_info->grf, offset, &val); if (ret < 0) { LOG_DEV_ERROR(dev, "failed to get rm from 0x%x\n", diff --git a/drivers/rknpu/rknpu_drv.c b/drivers/rknpu/rknpu_drv.c index c5c41fef56781..88783bec35f50 100644 --- a/drivers/rknpu/rknpu_drv.c +++ b/drivers/rknpu/rknpu_drv.c @@ -81,15 +81,6 @@ static const struct rknpu_irqs_data rk3588_npu_irqs[] = { { "npu2_irq", rknpu_core2_irq_handler } }; -static const struct rknpu_reset_data rknpu_resets[] = { { "srst_a", - "srst_h" } }; - -static const struct rknpu_reset_data rk3588_npu_resets[] = { - { "srst_a0", "srst_h0" }, - { "srst_a1", "srst_h1" }, - { "srst_a2", "srst_h2" } -}; - static const struct rknpu_amount_data rknpu_old_top_amount = { .offset_clr_all = 0x8010, .offset_dt_wr = 0x8034, @@ -121,9 +112,7 @@ static const struct rknpu_config rk356x_rknpu_config = { .pc_task_status_offset = 0x3c, .pc_dma_ctrl = 0, .irqs = rknpu_irqs, - .resets = rknpu_resets, .num_irqs = ARRAY_SIZE(rknpu_irqs), - .num_resets = ARRAY_SIZE(rknpu_resets), .nbuf_phyaddr = 0, .nbuf_size = 0, .max_submit_number = (1 << 12) - 1, @@ -142,9 +131,7 @@ static const struct rknpu_config rk3588_rknpu_config = { .pc_task_status_offset = 0x3c, .pc_dma_ctrl = 0, .irqs = rk3588_npu_irqs, - .resets = rk3588_npu_resets, .num_irqs = ARRAY_SIZE(rk3588_npu_irqs), - .num_resets = ARRAY_SIZE(rk3588_npu_resets), .nbuf_phyaddr = 0, .nbuf_size = 0, .max_submit_number = (1 << 12) - 1, @@ -163,9 +150,7 @@ static const struct rknpu_config rk3583_rknpu_config = { .pc_task_status_offset = 0x3c, .pc_dma_ctrl = 0, .irqs = rk3588_npu_irqs, - .resets = rk3588_npu_resets, .num_irqs = 2, - .num_resets = 2, .nbuf_phyaddr = 0, .nbuf_size = 0, .max_submit_number = (1 << 12) - 1, @@ -184,9 +169,7 @@ static const struct rknpu_config rv1106_rknpu_config = { .pc_task_status_offset = 0x3c, .pc_dma_ctrl = 0, .irqs = rknpu_irqs, - .resets = rknpu_resets, .num_irqs = ARRAY_SIZE(rknpu_irqs), - .num_resets = ARRAY_SIZE(rknpu_resets), .nbuf_phyaddr = 0, .nbuf_size = 0, .max_submit_number = (1 << 16) - 1, @@ -205,9 +188,7 @@ static const struct rknpu_config rk3562_rknpu_config = { .pc_task_status_offset = 0x48, .pc_dma_ctrl = 1, .irqs = rknpu_irqs, - .resets = rknpu_resets, .num_irqs = ARRAY_SIZE(rknpu_irqs), - .num_resets = ARRAY_SIZE(rknpu_resets), .nbuf_phyaddr = 0xfe400000, .nbuf_size = 256 * 1024, .max_submit_number = (1 << 16) - 1, diff --git a/drivers/rknpu/rknpu_job.c b/drivers/rknpu/rknpu_job.c index fadd8e3b24139..e13488dfc6b36 100644 --- a/drivers/rknpu/rknpu_job.c +++ b/drivers/rknpu/rknpu_job.c @@ -128,6 +128,7 @@ static inline struct rknpu_job *rknpu_job_alloc(struct rknpu_device *rknpu_dev, struct rknpu_submit *args) { struct rknpu_job *job = NULL; + int i = 0; #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM struct rknpu_gem_object *task_obj = NULL; #endif @@ -143,6 +144,8 @@ static inline struct rknpu_job *rknpu_job_alloc(struct rknpu_device *rknpu_dev, ((args->core_mask & RKNPU_CORE2_MASK) >> 2); atomic_set(&job->run_count, job->use_core_num); atomic_set(&job->interrupt_count, job->use_core_num); + for (i = 0; i < rknpu_dev->config->num_irqs; i++) + atomic_set(&job->submit_count[i], 0); #ifdef CONFIG_ROCKCHIP_RKNPU_DRM_GEM task_obj = (struct rknpu_gem_object *)(uintptr_t)args->task_obj_addr; if (task_obj) diff --git a/drivers/rknpu/rknpu_reset.c b/drivers/rknpu/rknpu_reset.c index 91c9b75d68e77..36657a7852feb 100644 --- a/drivers/rknpu/rknpu_reset.c +++ b/drivers/rknpu/rknpu_reset.c @@ -28,27 +28,34 @@ static inline struct reset_control *rknpu_reset_control_get(struct device *dev, int rknpu_reset_get(struct rknpu_device *rknpu_dev) { #ifndef FPGA_PLATFORM - struct reset_control *srst_a = NULL; - struct reset_control *srst_h = NULL; int i = 0; + int num_srsts = 0; - for (i = 0; i < rknpu_dev->config->num_resets; i++) { - srst_a = rknpu_reset_control_get( - rknpu_dev->dev, - rknpu_dev->config->resets[i].srst_a_name); - if (IS_ERR(srst_a)) - return PTR_ERR(srst_a); + num_srsts = of_count_phandle_with_args(rknpu_dev->dev->of_node, + "resets", "#reset-cells"); + if (num_srsts <= 0) { + LOG_DEV_ERROR(rknpu_dev->dev, + "failed to get rknpu resets from dtb\n"); + return num_srsts; + } - rknpu_dev->srst_a[i] = srst_a; + rknpu_dev->srsts = devm_kcalloc(rknpu_dev->dev, num_srsts, + sizeof(*rknpu_dev->srsts), GFP_KERNEL); + if (!rknpu_dev->srsts) + return -ENOMEM; + + for (i = 0; i < num_srsts; ++i) { + rknpu_dev->srsts[i] = devm_reset_control_get_exclusive_by_index( + rknpu_dev->dev, i); + if (IS_ERR(rknpu_dev->srsts[i])) { + rknpu_dev->num_srsts = i; + return PTR_ERR(rknpu_dev->srsts[i]); + } + } - srst_h = rknpu_reset_control_get( - rknpu_dev->dev, - rknpu_dev->config->resets[i].srst_h_name); - if (IS_ERR(srst_h)) - return PTR_ERR(srst_h); + rknpu_dev->num_srsts = num_srsts; - rknpu_dev->srst_h[i] = srst_h; - } + return num_srsts; #endif return 0; @@ -93,7 +100,7 @@ int rknpu_soft_reset(struct rknpu_device *rknpu_dev) #ifndef FPGA_PLATFORM struct iommu_domain *domain = NULL; struct rknpu_subcore_data *subcore_data = NULL; - int ret = -EINVAL, i = 0; + int ret = 0, i = 0; if (rknpu_dev->bypass_soft_reset) { LOG_WARN("bypass soft reset\n"); @@ -112,17 +119,17 @@ int rknpu_soft_reset(struct rknpu_device *rknpu_dev) wake_up(&subcore_data->job_done_wq); } - LOG_INFO("soft reset\n"); + LOG_INFO("soft reset, num: %d\n", rknpu_dev->num_srsts); - for (i = 0; i < rknpu_dev->config->num_resets; i++) { - ret = rknpu_reset_assert(rknpu_dev->srst_a[i]); - ret |= rknpu_reset_assert(rknpu_dev->srst_h[i]); + for (i = 0; i < rknpu_dev->num_srsts; ++i) + ret |= rknpu_reset_assert(rknpu_dev->srsts[i]); - udelay(10); + udelay(10); - ret |= rknpu_reset_deassert(rknpu_dev->srst_a[i]); - ret |= rknpu_reset_deassert(rknpu_dev->srst_h[i]); - } + for (i = 0; i < rknpu_dev->num_srsts; ++i) + ret |= rknpu_reset_deassert(rknpu_dev->srsts[i]); + + udelay(10); if (ret) { LOG_DEV_ERROR(rknpu_dev->dev,