Skip to content

Commit 640917d

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: support access to absolute RTsyms
Add support in nfpcore for reading the absolute RTsyms. Signed-off-by: Jakub Kicinski <jakub.kicinski@netronome.com> Reviewed-by: Francois H. Theron <francois.theron@netronome.com> Signed-off-by: David S. Miller <davem@davemloft.net>
1 parent 1240989 commit 640917d

File tree

2 files changed

+46
-9
lines changed

2 files changed

+46
-9
lines changed

drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nffw.h

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -61,10 +61,12 @@ void nfp_mip_strtab(const struct nfp_mip *mip, u32 *addr, u32 *size);
6161

6262
/* Implemented in nfp_rtsym.c */
6363

64-
#define NFP_RTSYM_TYPE_NONE 0
65-
#define NFP_RTSYM_TYPE_OBJECT 1
66-
#define NFP_RTSYM_TYPE_FUNCTION 2
67-
#define NFP_RTSYM_TYPE_ABS 3
64+
enum nfp_rtsym_type {
65+
NFP_RTSYM_TYPE_NONE = 0,
66+
NFP_RTSYM_TYPE_OBJECT = 1,
67+
NFP_RTSYM_TYPE_FUNCTION = 2,
68+
NFP_RTSYM_TYPE_ABS = 3,
69+
};
6870

6971
#define NFP_RTSYM_TARGET_NONE 0
7072
#define NFP_RTSYM_TARGET_LMEM -1
@@ -83,7 +85,7 @@ struct nfp_rtsym {
8385
const char *name;
8486
u64 addr;
8587
u64 size;
86-
int type;
88+
enum nfp_rtsym_type type;
8789
int target;
8890
int domain;
8991
};
@@ -98,6 +100,7 @@ const struct nfp_rtsym *nfp_rtsym_get(struct nfp_rtsym_table *rtbl, int idx);
98100
const struct nfp_rtsym *
99101
nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name);
100102

103+
u64 nfp_rtsym_size(const struct nfp_rtsym *rtsym);
101104
int __nfp_rtsym_read(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
102105
u8 action, u8 token, u64 off, void *buf, size_t len);
103106
int nfp_rtsym_read(struct nfp_cpp *cpp, const struct nfp_rtsym *sym, u64 off,

drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c

Lines changed: 38 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -233,10 +233,32 @@ nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name)
233233
return NULL;
234234
}
235235

236+
u64 nfp_rtsym_size(const struct nfp_rtsym *sym)
237+
{
238+
switch (sym->type) {
239+
case NFP_RTSYM_TYPE_NONE:
240+
pr_err("rtsym type NONE\n");
241+
return 0;
242+
default:
243+
pr_warn("Unknown rtsym type: %d\n", sym->type);
244+
/* fall through */
245+
case NFP_RTSYM_TYPE_OBJECT:
246+
case NFP_RTSYM_TYPE_FUNCTION:
247+
return sym->size;
248+
case NFP_RTSYM_TYPE_ABS:
249+
return sizeof(u64);
250+
}
251+
}
252+
236253
static int
237254
nfp_rtsym_to_dest(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
238255
u8 action, u8 token, u64 off, u32 *cpp_id, u64 *addr)
239256
{
257+
if (sym->type != NFP_RTSYM_TYPE_OBJECT) {
258+
nfp_err(cpp, "Direct access attempt to non-object rtsym\n");
259+
return -EINVAL;
260+
}
261+
240262
*addr = sym->addr + off;
241263

242264
if (sym->target == NFP_RTSYM_TARGET_EMU_CACHE) {
@@ -266,6 +288,15 @@ int __nfp_rtsym_read(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
266288
u64 addr;
267289
int err;
268290

291+
if (sym->type == NFP_RTSYM_TYPE_ABS) {
292+
__le64 tmp = cpu_to_le64(sym->addr);
293+
294+
len = min(len, sizeof(tmp));
295+
memcpy(buf, &tmp, len);
296+
297+
return len;
298+
}
299+
269300
err = nfp_rtsym_to_dest(cpp, sym, action, token, off, &cpp_id, &addr);
270301
if (err)
271302
return err;
@@ -306,6 +337,9 @@ int __nfp_rtsym_readq(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
306337
u64 addr;
307338
int err;
308339

340+
if (sym->type == NFP_RTSYM_TYPE_ABS)
341+
return sym->addr;
342+
309343
err = nfp_rtsym_to_dest(cpp, sym, action, token, off, &cpp_id, &addr);
310344
if (err)
311345
return err;
@@ -405,7 +439,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
405439
goto exit;
406440
}
407441

408-
switch (sym->size) {
442+
switch (nfp_rtsym_size(sym)) {
409443
case 4:
410444
err = nfp_rtsym_readl(rtbl->cpp, sym, 0, &val32);
411445
val = val32;
@@ -416,7 +450,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
416450
default:
417451
nfp_err(rtbl->cpp,
418452
"rtsym '%s' unsupported or non-scalar size: %lld\n",
419-
name, sym->size);
453+
name, nfp_rtsym_size(sym));
420454
err = -EINVAL;
421455
break;
422456
}
@@ -452,7 +486,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
452486
if (!sym)
453487
return -ENOENT;
454488

455-
switch (sym->size) {
489+
switch (nfp_rtsym_size(sym)) {
456490
case 4:
457491
err = nfp_rtsym_writel(rtbl->cpp, sym, 0, value);
458492
break;
@@ -462,7 +496,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
462496
default:
463497
nfp_err(rtbl->cpp,
464498
"rtsym '%s' unsupported or non-scalar size: %lld\n",
465-
name, sym->size);
499+
name, nfp_rtsym_size(sym));
466500
err = -EINVAL;
467501
break;
468502
}

0 commit comments

Comments
 (0)