Skip to content

Commit 9179f8b

Browse files
3V3RYONEmathieupoirier
authored andcommitted
remoteproc: k3: Refactor .da_to_va rproc ops into common driver
The .da_to_va rproc ops implementations in TI K3 R5, DSP and M4 remoteproc drivers return the Kernel virtual address for a corresponding rproc device address. Refactor the implementations into the ti_k3_common.c driver as k3_rproc_da_to_va and use this common function for address translation of DDR and internal memory regions in R5, DSP and M4 drivers. Note: The R5 SRAM memory translations are still handled in the .da_to_va ops of the R5 remoteproc driver. Signed-off-by: Beleswar Padhi <[email protected]> Tested-by: Judith Mendez <[email protected]> Reviewed-by: Andrew Davis <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Mathieu Poirier <[email protected]>
1 parent 1d7f38d commit 9179f8b

File tree

5 files changed

+65
-154
lines changed

5 files changed

+65
-154
lines changed

drivers/remoteproc/ti_k3_common.c

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -351,5 +351,62 @@ struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
351351
}
352352
EXPORT_SYMBOL_GPL(k3_get_loaded_rsc_table);
353353

354+
/*
355+
* Custom function to translate a remote processor device address (internal
356+
* RAMs only) to a kernel virtual address. The remote processors can access
357+
* their RAMs at either an internal address visible only from a remote
358+
* processor, or at the SoC-level bus address. Both these addresses need to be
359+
* looked through for translation. The translated addresses can be used either
360+
* by the remoteproc core for loading (when using kernel remoteproc loader), or
361+
* by any rpmsg bus drivers.
362+
*/
363+
void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
364+
{
365+
struct k3_rproc *kproc = rproc->priv;
366+
void __iomem *va = NULL;
367+
phys_addr_t bus_addr;
368+
u32 dev_addr, offset;
369+
size_t size;
370+
int i;
371+
372+
if (len == 0)
373+
return NULL;
374+
375+
for (i = 0; i < kproc->num_mems; i++) {
376+
bus_addr = kproc->mem[i].bus_addr;
377+
dev_addr = kproc->mem[i].dev_addr;
378+
size = kproc->mem[i].size;
379+
380+
/* handle rproc-view addresses */
381+
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
382+
offset = da - dev_addr;
383+
va = kproc->mem[i].cpu_addr + offset;
384+
return (__force void *)va;
385+
}
386+
387+
/* handle SoC-view addresses */
388+
if (da >= bus_addr && (da + len) <= (bus_addr + size)) {
389+
offset = da - bus_addr;
390+
va = kproc->mem[i].cpu_addr + offset;
391+
return (__force void *)va;
392+
}
393+
}
394+
395+
/* handle static DDR reserved memory regions */
396+
for (i = 0; i < kproc->num_rmems; i++) {
397+
dev_addr = kproc->rmem[i].dev_addr;
398+
size = kproc->rmem[i].size;
399+
400+
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
401+
offset = da - dev_addr;
402+
va = kproc->rmem[i].cpu_addr + offset;
403+
return (__force void *)va;
404+
}
405+
}
406+
407+
return NULL;
408+
}
409+
EXPORT_SYMBOL_GPL(k3_rproc_da_to_va);
410+
354411
MODULE_LICENSE("GPL");
355412
MODULE_DESCRIPTION("TI K3 common Remoteproc code");

drivers/remoteproc/ti_k3_common.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,8 @@
2121
#ifndef REMOTEPROC_TI_K3_COMMON_H
2222
#define REMOTEPROC_TI_K3_COMMON_H
2323

24+
#define KEYSTONE_RPROC_LOCAL_ADDRESS_MASK (SZ_16M - 1)
25+
2426
/**
2527
* struct k3_rproc_mem - internal memory structure
2628
* @cpu_addr: MPU virtual address of the memory region
@@ -106,4 +108,6 @@ int k3_rproc_attach(struct rproc *rproc);
106108
int k3_rproc_detach(struct rproc *rproc);
107109
struct resource_table *k3_get_loaded_rsc_table(struct rproc *rproc,
108110
size_t *rsc_table_sz);
111+
void *k3_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len,
112+
bool *is_iomem);
109113
#endif /* REMOTEPROC_TI_K3_COMMON_H */

drivers/remoteproc/ti_k3_dsp_remoteproc.c

Lines changed: 1 addition & 62 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@
2222
#include "ti_sci_proc.h"
2323
#include "ti_k3_common.h"
2424

25-
#define KEYSTONE_RPROC_LOCAL_ADDRESS_MASK (SZ_16M - 1)
26-
2725
/*
2826
* Power up the DSP remote processor.
2927
*
@@ -58,72 +56,13 @@ static int k3_dsp_rproc_start(struct rproc *rproc)
5856
return 0;
5957
}
6058

61-
/*
62-
* Custom function to translate a DSP device address (internal RAMs only) to a
63-
* kernel virtual address. The DSPs can access their RAMs at either an internal
64-
* address visible only from a DSP, or at the SoC-level bus address. Both these
65-
* addresses need to be looked through for translation. The translated addresses
66-
* can be used either by the remoteproc core for loading (when using kernel
67-
* remoteproc loader), or by any rpmsg bus drivers.
68-
*/
69-
static void *k3_dsp_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
70-
{
71-
struct k3_rproc *kproc = rproc->priv;
72-
void __iomem *va = NULL;
73-
phys_addr_t bus_addr;
74-
u32 dev_addr, offset;
75-
size_t size;
76-
int i;
77-
78-
if (len == 0)
79-
return NULL;
80-
81-
for (i = 0; i < kproc->num_mems; i++) {
82-
bus_addr = kproc->mem[i].bus_addr;
83-
dev_addr = kproc->mem[i].dev_addr;
84-
size = kproc->mem[i].size;
85-
86-
if (da < KEYSTONE_RPROC_LOCAL_ADDRESS_MASK) {
87-
/* handle DSP-view addresses */
88-
if (da >= dev_addr &&
89-
((da + len) <= (dev_addr + size))) {
90-
offset = da - dev_addr;
91-
va = kproc->mem[i].cpu_addr + offset;
92-
return (__force void *)va;
93-
}
94-
} else {
95-
/* handle SoC-view addresses */
96-
if (da >= bus_addr &&
97-
(da + len) <= (bus_addr + size)) {
98-
offset = da - bus_addr;
99-
va = kproc->mem[i].cpu_addr + offset;
100-
return (__force void *)va;
101-
}
102-
}
103-
}
104-
105-
/* handle static DDR reserved memory regions */
106-
for (i = 0; i < kproc->num_rmems; i++) {
107-
dev_addr = kproc->rmem[i].dev_addr;
108-
size = kproc->rmem[i].size;
109-
110-
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
111-
offset = da - dev_addr;
112-
va = kproc->rmem[i].cpu_addr + offset;
113-
return (__force void *)va;
114-
}
115-
}
116-
117-
return NULL;
118-
}
119-
12059
static const struct rproc_ops k3_dsp_rproc_ops = {
12160
.start = k3_dsp_rproc_start,
12261
.stop = k3_rproc_stop,
12362
.attach = k3_rproc_attach,
12463
.detach = k3_rproc_detach,
12564
.kick = k3_rproc_kick,
126-
.da_to_va = k3_dsp_rproc_da_to_va,
65+
.da_to_va = k3_rproc_da_to_va,
12766
.get_loaded_rsc_table = k3_get_loaded_rsc_table,
12867
};
12968

drivers/remoteproc/ti_k3_m4_remoteproc.c

Lines changed: 1 addition & 57 deletions
Original file line numberDiff line numberDiff line change
@@ -21,62 +21,6 @@
2121
#include "ti_sci_proc.h"
2222
#include "ti_k3_common.h"
2323

24-
/*
25-
* Custom function to translate a remote processor device address (internal
26-
* RAMs only) to a kernel virtual address. The remote processors can access
27-
* their RAMs at either an internal address visible only from a remote
28-
* processor, or at the SoC-level bus address. Both these addresses need to be
29-
* looked through for translation. The translated addresses can be used either
30-
* by the remoteproc core for loading (when using kernel remoteproc loader), or
31-
* by any rpmsg bus drivers.
32-
*/
33-
static void *k3_m4_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool *is_iomem)
34-
{
35-
struct k3_rproc *kproc = rproc->priv;
36-
void __iomem *va = NULL;
37-
phys_addr_t bus_addr;
38-
u32 dev_addr, offset;
39-
size_t size;
40-
int i;
41-
42-
if (len == 0)
43-
return NULL;
44-
45-
for (i = 0; i < kproc->num_mems; i++) {
46-
bus_addr = kproc->mem[i].bus_addr;
47-
dev_addr = kproc->mem[i].dev_addr;
48-
size = kproc->mem[i].size;
49-
50-
/* handle M4-view addresses */
51-
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
52-
offset = da - dev_addr;
53-
va = kproc->mem[i].cpu_addr + offset;
54-
return (__force void *)va;
55-
}
56-
57-
/* handle SoC-view addresses */
58-
if (da >= bus_addr && ((da + len) <= (bus_addr + size))) {
59-
offset = da - bus_addr;
60-
va = kproc->mem[i].cpu_addr + offset;
61-
return (__force void *)va;
62-
}
63-
}
64-
65-
/* handle static DDR reserved memory regions */
66-
for (i = 0; i < kproc->num_rmems; i++) {
67-
dev_addr = kproc->rmem[i].dev_addr;
68-
size = kproc->rmem[i].size;
69-
70-
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
71-
offset = da - dev_addr;
72-
va = kproc->rmem[i].cpu_addr + offset;
73-
return (__force void *)va;
74-
}
75-
}
76-
77-
return NULL;
78-
}
79-
8024
static int k3_m4_rproc_of_get_memories(struct platform_device *pdev,
8125
struct k3_rproc *kproc)
8226
{
@@ -220,7 +164,7 @@ static const struct rproc_ops k3_m4_rproc_ops = {
220164
.attach = k3_rproc_attach,
221165
.detach = k3_rproc_detach,
222166
.kick = k3_rproc_kick,
223-
.da_to_va = k3_m4_rproc_da_to_va,
167+
.da_to_va = k3_rproc_da_to_va,
224168
.get_loaded_rsc_table = k3_get_loaded_rsc_table,
225169
};
226170

drivers/remoteproc/ti_k3_r5_remoteproc.c

Lines changed: 2 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -572,35 +572,13 @@ static void *k3_r5_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool
572572
struct k3_rproc *kproc = rproc->priv;
573573
struct k3_r5_core *core = kproc->priv;
574574
void __iomem *va = NULL;
575-
phys_addr_t bus_addr;
576575
u32 dev_addr, offset;
577576
size_t size;
578577
int i;
579578

580579
if (len == 0)
581580
return NULL;
582581

583-
/* handle both R5 and SoC views of ATCM and BTCM */
584-
for (i = 0; i < kproc->num_mems; i++) {
585-
bus_addr = kproc->mem[i].bus_addr;
586-
dev_addr = kproc->mem[i].dev_addr;
587-
size = kproc->mem[i].size;
588-
589-
/* handle R5-view addresses of TCMs */
590-
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
591-
offset = da - dev_addr;
592-
va = kproc->mem[i].cpu_addr + offset;
593-
return (__force void *)va;
594-
}
595-
596-
/* handle SoC-view addresses of TCMs */
597-
if (da >= bus_addr && ((da + len) <= (bus_addr + size))) {
598-
offset = da - bus_addr;
599-
va = kproc->mem[i].cpu_addr + offset;
600-
return (__force void *)va;
601-
}
602-
}
603-
604582
/* handle any SRAM regions using SoC-view addresses */
605583
for (i = 0; i < core->num_sram; i++) {
606584
dev_addr = core->sram[i].dev_addr;
@@ -613,19 +591,8 @@ static void *k3_r5_rproc_da_to_va(struct rproc *rproc, u64 da, size_t len, bool
613591
}
614592
}
615593

616-
/* handle static DDR reserved memory regions */
617-
for (i = 0; i < kproc->num_rmems; i++) {
618-
dev_addr = kproc->rmem[i].dev_addr;
619-
size = kproc->rmem[i].size;
620-
621-
if (da >= dev_addr && ((da + len) <= (dev_addr + size))) {
622-
offset = da - dev_addr;
623-
va = kproc->rmem[i].cpu_addr + offset;
624-
return (__force void *)va;
625-
}
626-
}
627-
628-
return NULL;
594+
/* handle both TCM and DDR memory regions */
595+
return k3_rproc_da_to_va(rproc, da, len, is_iomem);
629596
}
630597

631598
static const struct rproc_ops k3_r5_rproc_ops = {

0 commit comments

Comments
 (0)