mirror of
https://github.com/hardkernel/linux.git
synced 2026-06-07 19:30:30 +09:00
driver: rknpu: Update rknpu driver, version: 0.9.5
* 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
This commit is contained in:
@@ -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;
|
||||
|
||||
@@ -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",
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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);
|
||||
|
||||
rknpu_dev->srst_a[i] = srst_a;
|
||||
|
||||
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->srst_h[i] = srst_h;
|
||||
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->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]);
|
||||
}
|
||||
}
|
||||
|
||||
rknpu_dev->num_srsts = num_srsts;
|
||||
|
||||
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,
|
||||
|
||||
Reference in New Issue
Block a user