Skip to content

Commit 164b938

Browse files
committed
manual merge with usdk419
1 parent 7afadb5 commit 164b938

File tree

7 files changed

+56
-5
lines changed

7 files changed

+56
-5
lines changed

drivers/nvdla/bdma.c

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -133,6 +133,7 @@ processor_bdma_program_slot(struct dla_bdma_surface_desc *bdma_surface,
133133
uint64_t destination_addr = 0;
134134
uint32_t high, low, reg;
135135
uint8_t bdma_free_slots = 0;
136+
uint64_t bdma_len = 0;
136137
struct dla_engine *engine = dla_get_engine();
137138

138139
dla_debug("Enter: %s\n", __func__);
@@ -196,6 +197,14 @@ processor_bdma_program_slot(struct dla_bdma_surface_desc *bdma_surface,
196197
bdma_reg_write(CFG_DST_SURF, transfer->destination_surface);
197198
bdma_reg_write(CFG_OP, FIELD_ENUM(BDMA_CFG_OP_0, EN, ENABLE));
198199

200+
#ifdef CONFIG_NVDLA_NEED_FLUSH
201+
bdma_len = (transfer->surface_repeat) * (transfer->source_surface); //???
202+
nvdla_flush_dcache((unsigned long)source_addr,bdma_len);
203+
nvdla_flush_dcache((unsigned long)destination_addr,bdma_len);
204+
dla_info("%s():surface_repeat:%#x,source_surface:%#x bdmalen:%#llx\n",__func__,transfer->surface_repeat,transfer->source_surface,bdma_len);
205+
dla_info("%s():dma_src_addr:%#llx,dma_dst_addr:%#llx \n",__func__,source_addr,destination_addr);
206+
#endif
207+
199208
dla_debug("Exit: %s\n", __func__);
200209

201210
exit:

drivers/nvdla/cache.c

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -146,6 +146,9 @@ dla_get_op_desc(struct dla_task *task, int16_t index,
146146
}
147147

148148
exit:
149+
if (desc) {
150+
nvdla_flush_dcache(dw_virt_to_phys((void *)desc), sizeof(*desc));
151+
}
149152
return desc;
150153
}
151154

drivers/nvdla/include/opendla.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,10 +29,20 @@
2929
#ifndef __OPENDLA_H_
3030
#define __OPENDLA_H_
3131

32+
#define DLA_2_CONFIG
33+
#define CONFIG_NVDLA_NEED_FLUSH
34+
3235
#ifdef DLA_2_CONFIG
3336
#include <opendla_small.h>
3437
#else
3538
#include <opendla_initial.h>
3639
#endif
3740

41+
#ifdef CONFIG_NVDLA_NEED_FLUSH
42+
#include <soc/starfive/vic7100.h>
43+
#define nvdla_flush_dcache starfive_flush_dcache
44+
#else
45+
#define nvdla_flush_dcache
46+
#endif
47+
3848
#endif

drivers/nvdla/nvdla_core_callbacks.c

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
#include <nvdla_interface.h>
5656
#include <nvdla_linux.h>
5757
#include <nvdla_ioctl.h>
58+
#include <opendla.h>
5859

5960
static struct nvdla_config nvdla_config_os_initial = {
6061
.atom_size = 32,
@@ -77,7 +78,6 @@ static struct nvdla_config nvdla_config_large = {
7778
.weight_compress_support = false,
7879
};
7980

80-
8181
void dla_debug(const char *str, ...)
8282
{
8383
va_list args;
@@ -112,7 +112,9 @@ void dla_error(const char *str, ...)
112112

113113
void *dla_memset(void *src, int ch, uint64_t len)
114114
{
115-
return memset(src, ch, len);
115+
memset(src, ch, len);
116+
nvdla_flush_dcache(dw_virt_to_phys(src),len);
117+
return src;
116118
}
117119

118120
void *dla_memcpy(void *dest, const void *src, uint64_t len)
@@ -228,7 +230,9 @@ int32_t dla_data_write(void *driver_context, void *task_data,
228230
struct dma_buf *buf;
229231
struct nvdla_mem_handle *handles;
230232
struct nvdla_task *task = (struct nvdla_task *)task_data;
233+
uint64_t dma_addr = 0;
231234

235+
dla_get_dma_address(driver_context, task_data,dst, (void *)&dma_addr, DESTINATION_DMA);
232236
handles = task->address_list;
233237
buf = dma_buf_get(handles[dst].handle);
234238
if (IS_ERR(buf)) {
@@ -250,7 +254,9 @@ int32_t dla_data_write(void *driver_context, void *task_data,
250254
}
251255

252256

257+
nvdla_flush_dcache(dw_virt_to_phys(src),size);
253258
memcpy((void *)((uint8_t *)ptr + offset), src, size);
259+
nvdla_flush_dcache(dma_addr+offset,size);
254260

255261
dma_buf_vunmap(buf, ptr);
256262

@@ -272,7 +278,9 @@ int32_t dla_data_read(void *driver_context, void *task_data,
272278
struct dma_buf *buf;
273279
struct nvdla_mem_handle *handles;
274280
struct nvdla_task *task = (struct nvdla_task *)task_data;
281+
uint64_t dma_addr = 0;
275282

283+
dla_get_dma_address(driver_context, task_data, src, (void *)&dma_addr, DESTINATION_DMA);
276284
handles = task->address_list;
277285

278286
buf = dma_buf_get(handles[src].handle);
@@ -294,7 +302,9 @@ int32_t dla_data_read(void *driver_context, void *task_data,
294302
goto end_cpu_access;
295303
}
296304

305+
nvdla_flush_dcache(dma_addr+offset,size);
297306
memcpy(dst, (void *)(((uint8_t *)ptr) + offset), size);
307+
nvdla_flush_dcache(dw_virt_to_phys(dst),size);
298308

299309
dma_buf_vunmap(buf, ptr);
300310

drivers/nvdla/nvdla_gem.c

Lines changed: 19 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -39,10 +39,12 @@
3939

4040
#include <linux/dma-mapping.h>
4141
#include <linux/dma-map-ops.h>
42+
#include <linux/of.h>
43+
#include <linux/of_address.h>
4244

4345
#include <nvdla_linux.h>
4446
#include <nvdla_ioctl.h>
45-
47+
#include <opendla.h>
4648
#define to_nvdla_obj(x) container_of(x, struct nvdla_gem_object, object)
4749

4850
struct nvdla_gem_object {
@@ -78,6 +80,7 @@ static int32_t nvdla_fill_task_desc(struct nvdla_ioctl_submit_task *local_task,
7880

7981
task->address_list = handles;
8082

83+
nvdla_flush_dcache(dw_virt_to_phys((void *)(task)),sizeof(*task));
8184
return 0;
8285
}
8386

@@ -425,6 +428,8 @@ int32_t nvdla_drm_probe(struct nvdla_device *nvdla_dev)
425428
int32_t err;
426429
struct drm_device *drm;
427430
struct drm_driver *driver = &nvdla_drm_driver;
431+
struct resource res_cma;
432+
struct device_node *node;
428433

429434
drm = drm_dev_alloc(driver, &nvdla_dev->pdev->dev);
430435
if (IS_ERR(drm))
@@ -440,8 +445,19 @@ int32_t nvdla_drm_probe(struct nvdla_device *nvdla_dev)
440445
* TODO Register separate driver for memory and use DT node to
441446
* read memory range
442447
*/
443-
err = dma_declare_coherent_memory(drm->dev, 0xD0000000, 0xD0000000,
444-
0x28000000);
448+
node = of_parse_phandle(drm->dev->of_node, "memory-region", 0);
449+
if(node ){
450+
dev_info(drm->dev, "Get mem from memory-region\n");
451+
of_address_to_resource(node, 0, &res_cma);
452+
err = dma_declare_coherent_memory(drm->dev, res_cma.start, res_cma.start,resource_size(&res_cma));
453+
} else {
454+
dev_info(drm->dev, "NVDLA using the default mem.\n");
455+
err = dma_declare_coherent_memory(drm->dev, 0xC0000000, 0xC0000000, 0x40000000);
456+
}
457+
458+
if (err < 0) {
459+
goto unref;
460+
}
445461

446462
return 0;
447463

drivers/nvdla/pdp.c

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,9 @@
3636
#include "engine_debug.h"
3737

3838
#define MAX_SPLIT_NUM 64
39+
#ifndef ARRAY_SIZE
3940
#define ARRAY_SIZE(a) (sizeof(a) / sizeof((a[0])))
41+
#endif
4042

4143
static const uint8_t map_ram[] = {
4244
FIELD_ENUM(PDP_RDMA_D_SRC_RAM_CFG_0, SRC_RAM_TYPE, MC),

drivers/nvdla/scheduler.c

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1100,6 +1100,7 @@ dla_execute_task(void *engine_context, void *task_data, void *config_data)
11001100
if (ret)
11011101
goto complete;
11021102

1103+
nvdla_flush_dcache(dw_virt_to_phys((void *)engine), sizeof(*engine));
11031104
dla_debug_address_info(engine->task);
11041105

11051106
/**

0 commit comments

Comments
 (0)