Skip to content

Commit

Permalink
driver: rknpu: Update rknpu driver, version: 0.9.5
Browse files Browse the repository at this point in the history
* Fix exception error caused by uninitialized atomic variables
* Improve rknpu reset function

Signed-off-by: Felix Zeng <felix.zeng@rock-chips.com>
Change-Id: I952d4a679048fa7c295d37b72da64be95be8f5ee
(cherry picked from commit d7be109)
Signed-off-by: Joshua Riek <jjriek@verizon.net>
  • Loading branch information
Felix Zeng authored and amazingfate committed Mar 18, 2024
1 parent ba25544 commit ad74c2e
Show file tree
Hide file tree
Showing 5 changed files with 40 additions and 57 deletions.
15 changes: 4 additions & 11 deletions drivers/rknpu/include/rknpu_drv.h
Original file line number Diff line number Diff line change
Expand Up @@ -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"

Expand All @@ -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;
Expand All @@ -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;
Expand Down Expand Up @@ -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;
Expand Down
3 changes: 1 addition & 2 deletions drivers/rknpu/rknpu_devfreq.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;

Expand All @@ -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",
Expand Down
19 changes: 0 additions & 19 deletions drivers/rknpu/rknpu_drv.c
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down Expand Up @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand All @@ -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,
Expand Down
3 changes: 3 additions & 0 deletions drivers/rknpu/rknpu_job.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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)
Expand Down
57 changes: 32 additions & 25 deletions drivers/rknpu/rknpu_reset.c
Original file line number Diff line number Diff line change
Expand Up @@ -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;
Expand Down Expand Up @@ -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");
Expand All @@ -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,
Expand Down

0 comments on commit ad74c2e

Please sign in to comment.