Skip to content

Commit 4bc1659

Browse files
ymlbaiywt
authored andcommitted
RK3588: NPU: Update to 0.9.6 version
1 parent 7a4b7c9 commit 4bc1659

File tree

14 files changed

+527
-156
lines changed

14 files changed

+527
-156
lines changed
Binary file not shown.

drivers/rknpu/include/rknpu_drv.h

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
#include <linux/completion.h>
1111
#include <linux/device.h>
1212
#include <linux/kref.h>
13+
#include <linux/irq.h>
1314
#include <linux/platform_device.h>
1415
#include <linux/spinlock.h>
1516
#include <linux/regulator/consumer.h>
@@ -28,10 +29,10 @@
2829

2930
#define DRIVER_NAME "rknpu"
3031
#define DRIVER_DESC "RKNPU driver"
31-
#define DRIVER_DATE "20231121"
32+
#define DRIVER_DATE "20240322"
3233
#define DRIVER_MAJOR 0
3334
#define DRIVER_MINOR 9
34-
#define DRIVER_PATCHLEVEL 3
35+
#define DRIVER_PATCHLEVEL 6
3536

3637
#define LOG_TAG "RKNPU"
3738

@@ -52,9 +53,18 @@
5253
#define LOG_DEV_DEBUG(dev, fmt, args...) dev_dbg(dev, LOG_TAG ": " fmt, ##args)
5354
#define LOG_DEV_ERROR(dev, fmt, args...) dev_err(dev, LOG_TAG ": " fmt, ##args)
5455

55-
struct rknpu_reset_data {
56-
const char *srst_a_name;
57-
const char *srst_h_name;
56+
#define RKNPU_MAX_IOMMU_DOMAIN_NUM 16
57+
58+
struct rknpu_irqs_data {
59+
const char *name;
60+
irqreturn_t (*irq_hdl)(int irq, void *ctx);
61+
};
62+
63+
struct rknpu_amount_data {
64+
uint16_t offset_clr_all;
65+
uint16_t offset_dt_wr;
66+
uint16_t offset_dt_rd;
67+
uint16_t offset_wt_rd;
5868
};
5969

6070
struct rknpu_config {
@@ -66,15 +76,14 @@ struct rknpu_config {
6676
__u32 pc_task_number_mask;
6777
__u32 pc_task_status_offset;
6878
__u32 pc_dma_ctrl;
69-
__u32 bw_enable;
7079
const struct rknpu_irqs_data *irqs;
71-
const struct rknpu_reset_data *resets;
7280
int num_irqs;
73-
int num_resets;
7481
__u64 nbuf_phyaddr;
7582
__u64 nbuf_size;
7683
__u64 max_submit_number;
7784
__u32 core_mask;
85+
const struct rknpu_amount_data *amount_top;
86+
const struct rknpu_amount_data *amount_core;
7887
};
7988

8089
struct rknpu_timer {
@@ -113,13 +122,14 @@ struct rknpu_device {
113122
spinlock_t irq_lock;
114123
struct mutex power_lock;
115124
struct mutex reset_lock;
125+
struct mutex domain_lock;
116126
struct rknpu_subcore_data subcore_datas[RKNPU_MAX_CORES];
117127
const struct rknpu_config *config;
118128
void __iomem *bw_priority_base;
119129
struct rknpu_fence_context *fence_ctx;
120130
bool iommu_en;
121-
struct reset_control *srst_a[RKNPU_MAX_CORES];
122-
struct reset_control *srst_h[RKNPU_MAX_CORES];
131+
struct reset_control **srsts;
132+
int num_srsts;
123133
struct clk_bulk_data *clks;
124134
int num_clks;
125135
struct regulator *vdd;
@@ -156,6 +166,10 @@ struct rknpu_device {
156166
void __iomem *nbuf_base_io;
157167
struct rknpu_mm *sram_mm;
158168
unsigned long power_put_delay;
169+
struct iommu_group *iommu_group;
170+
int iommu_domain_num;
171+
int iommu_domain_id;
172+
struct iommu_domain *iommu_domains[RKNPU_MAX_IOMMU_DOMAIN_NUM];
159173
};
160174

161175
struct rknpu_session {

drivers/rknpu/include/rknpu_gem.h

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -60,6 +60,7 @@ struct rknpu_gem_object {
6060
struct page **pages;
6161
struct sg_table *sgt;
6262
struct drm_mm_node mm_node;
63+
int iommu_domain_id;
6364
};
6465

6566
enum rknpu_cache_type {
@@ -71,7 +72,8 @@ enum rknpu_cache_type {
7172
struct rknpu_gem_object *rknpu_gem_object_create(struct drm_device *dev,
7273
unsigned int flags,
7374
unsigned long size,
74-
unsigned long sram_size);
75+
unsigned long sram_size,
76+
int iommu_domain_id);
7577

7678
/* destroy a buffer with gem object */
7779
void rknpu_gem_object_destroy(struct rknpu_gem_object *rknpu_obj);

drivers/rknpu/include/rknpu_ioctl.h

Lines changed: 10 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,11 +31,6 @@
3131
#define RKNPU_OFFSET_INT_STATUS 0x28
3232
#define RKNPU_OFFSET_INT_RAW_STATUS 0x2c
3333

34-
#define RKNPU_OFFSET_CLR_ALL_RW_AMOUNT 0x8010
35-
#define RKNPU_OFFSET_DT_WR_AMOUNT 0x8034
36-
#define RKNPU_OFFSET_DT_RD_AMOUNT 0x8038
37-
#define RKNPU_OFFSET_WT_RD_AMOUNT 0x803c
38-
3934
#define RKNPU_OFFSET_ENABLE_MASK 0xf008
4035

4136
#define RKNPU_INT_CLEAR 0x1ffff
@@ -134,6 +129,8 @@ enum e_rknpu_action {
134129
RKNPU_POWER_OFF = 21,
135130
RKNPU_GET_TOTAL_SRAM_SIZE = 22,
136131
RKNPU_GET_FREE_SRAM_SIZE = 23,
132+
RKNPU_GET_IOMMU_DOMAIN_ID = 24,
133+
RKNPU_SET_IOMMU_DOMAIN_ID = 25,
137134
};
138135

139136
/**
@@ -147,6 +144,8 @@ enum e_rknpu_action {
147144
* @dma_addr: dma address that access by rknpu.
148145
* @sram_size: user-desired sram memory allocation size.
149146
* - this size value would be page-aligned internally.
147+
* @iommu_domain_id: iommu domain id
148+
* @reserved: just padding to be 64-bit aligned.
150149
*/
151150
struct rknpu_mem_create {
152151
__u32 handle;
@@ -155,6 +154,8 @@ struct rknpu_mem_create {
155154
__u64 obj_addr;
156155
__u64 dma_addr;
157156
__u64 sram_size;
157+
__s32 iommu_domain_id;
158+
__u32 reserved;
158159
};
159160

160161
/**
@@ -249,7 +250,8 @@ struct rknpu_subcore_task {
249250
* @task_counter: task counter
250251
* @priority: submit priority
251252
* @task_obj_addr: address of task object
252-
* @regcfg_obj_addr: address of register config object
253+
* @iommu_domain_id: iommu domain id
254+
* @reserved: just padding to be 64-bit aligned.
253255
* @task_base_addr: task base address
254256
* @hw_elapse_time: hardware elapse time
255257
* @core_mask: core mask of rknpu
@@ -265,7 +267,8 @@ struct rknpu_submit {
265267
__u32 task_counter;
266268
__s32 priority;
267269
__u64 task_obj_addr;
268-
__u64 regcfg_obj_addr;
270+
__u32 iommu_domain_id;
271+
__u32 reserved;
269272
__u64 task_base_addr;
270273
__s64 hw_elapse_time;
271274
__u32 core_mask;

drivers/rknpu/include/rknpu_iommu.h

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,4 +37,12 @@ dma_addr_t rknpu_iommu_dma_alloc_iova(struct iommu_domain *domain, size_t size,
3737
void rknpu_iommu_dma_free_iova(struct rknpu_iommu_dma_cookie *cookie,
3838
dma_addr_t iova, size_t size);
3939

40+
int rknpu_iommu_init_domain(struct rknpu_device *rknpu_dev);
41+
int rknpu_iommu_switch_domain(struct rknpu_device *rknpu_dev, int domain_id);
42+
void rknpu_iommu_free_domains(struct rknpu_device *rknpu_dev);
43+
44+
#if KERNEL_VERSION(5, 10, 0) < LINUX_VERSION_CODE
45+
int iommu_get_dma_cookie(struct iommu_domain *domain);
46+
#endif
47+
4048
#endif

drivers/rknpu/include/rknpu_job.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ struct rknpu_job {
4848
ktime_t hw_recoder_time;
4949
ktime_t hw_elapse_time;
5050
atomic_t submit_count[RKNPU_MAX_CORES];
51+
int iommu_domain_id;
5152
};
5253

5354
irqreturn_t rknpu_core0_irq_handler(int irq, void *data);

drivers/rknpu/include/rknpu_mem.h

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -37,10 +37,10 @@ struct rknpu_mem_object {
3737
unsigned int owner;
3838
};
3939

40-
int rknpu_mem_create_ioctl(struct rknpu_device *rknpu_dev, unsigned long data,
41-
struct file *file);
42-
int rknpu_mem_destroy_ioctl(struct rknpu_device *rknpu_dev, unsigned long data,
43-
struct file *file);
40+
int rknpu_mem_create_ioctl(struct rknpu_device *rknpu_dev, struct file *file,
41+
unsigned int cmd, unsigned long data);
42+
int rknpu_mem_destroy_ioctl(struct rknpu_device *rknpu_dev, struct file *file,
43+
unsigned long data);
4444
int rknpu_mem_sync_ioctl(struct rknpu_device *rknpu_dev, unsigned long data);
4545

4646
#endif

drivers/rknpu/rknpu_devfreq.c

Lines changed: 32 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,6 +75,25 @@ static struct devfreq_governor devfreq_rknpu_ondemand = {
7575
.event_handler = devfreq_rknpu_ondemand_handler,
7676
};
7777

78+
static int rk3576_npu_set_read_margin(struct device *dev,
79+
struct rockchip_opp_info *opp_info,
80+
u32 rm)
81+
{
82+
if (!opp_info->grf || !opp_info->volt_rm_tbl)
83+
return 0;
84+
85+
if (rm == opp_info->current_rm || rm == UINT_MAX)
86+
return 0;
87+
88+
LOG_DEV_DEBUG(dev, "set rm to %d\n", rm);
89+
90+
regmap_write(opp_info->grf, 0x08, 0x001c0000 | (rm << 2));
91+
regmap_write(opp_info->grf, 0x0c, 0x003c0000 | (rm << 2));
92+
regmap_write(opp_info->grf, 0x10, 0x001c0000 | (rm << 2));
93+
94+
return 0;
95+
}
96+
7897
static int rk3588_npu_get_soc_info(struct device *dev, struct device_node *np,
7998
int *bin, int *process)
8099
{
@@ -162,7 +181,6 @@ static int rk3588_npu_set_read_margin(struct device *dev,
162181
struct rockchip_opp_info *opp_info,
163182
u32 rm)
164183
{
165-
struct rknpu_device *rknpu_dev = dev_get_drvdata(dev);
166184
u32 offset = 0, val = 0;
167185
int i, ret = 0;
168186

@@ -174,7 +192,7 @@ static int rk3588_npu_set_read_margin(struct device *dev,
174192

175193
LOG_DEV_DEBUG(dev, "set rm to %d\n", rm);
176194

177-
for (i = 0; i < rknpu_dev->config->num_irqs; i++) {
195+
for (i = 0; i < 3; i++) {
178196
ret = regmap_read(opp_info->grf, offset, &val);
179197
if (ret < 0) {
180198
LOG_DEV_ERROR(dev, "failed to get rm from 0x%x\n",
@@ -214,6 +232,14 @@ static int npu_opp_config_clks(struct device *dev, struct opp_table *opp_table,
214232
}
215233
#endif
216234

235+
static const struct rockchip_opp_data rk3576_npu_opp_data = {
236+
.set_read_margin = rk3576_npu_set_read_margin,
237+
#if KERNEL_VERSION(6, 1, 0) <= LINUX_VERSION_CODE
238+
.config_regulators = npu_opp_config_regulators,
239+
.config_clks = npu_opp_config_clks,
240+
#endif
241+
};
242+
217243
static const struct rockchip_opp_data rk3588_npu_opp_data = {
218244
.get_soc_info = rk3588_npu_get_soc_info,
219245
.set_soc_info = rk3588_npu_set_soc_info,
@@ -225,6 +251,10 @@ static const struct rockchip_opp_data rk3588_npu_opp_data = {
225251
};
226252

227253
static const struct of_device_id rockchip_npu_of_match[] = {
254+
{
255+
.compatible = "rockchip,rk3576",
256+
.data = (void *)&rk3576_npu_opp_data,
257+
},
228258
{
229259
.compatible = "rockchip,rk3588",
230260
.data = (void *)&rk3588_npu_opp_data,

0 commit comments

Comments
 (0)