aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c
diff options
context:
space:
mode:
authorJakub Kicinski <jakub.kicinski@netronome.com>2018-08-28 13:20:46 -0700
committerDavid S. Miller <davem@davemloft.net>2018-08-28 16:01:47 -0700
commit640917dd81b622ac1c6e66b80be6a4174cbe3710 (patch)
tree1e8e0e44e3d526bcd1c2cfa8925a4825a997c047 /drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c
parentnfp: convert all RTsym users to use new read/write helpers (diff)
downloadlinux-dev-640917dd81b622ac1c6e66b80be6a4174cbe3710.tar.xz
linux-dev-640917dd81b622ac1c6e66b80be6a4174cbe3710.zip
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>
Diffstat (limited to '')
-rw-r--r--drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c42
1 files changed, 38 insertions, 4 deletions
diff --git a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c
index 28e5ed0bb31d..108ce8c5e68e 100644
--- a/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c
+++ b/drivers/net/ethernet/netronome/nfp/nfpcore/nfp_rtsym.c
@@ -233,10 +233,32 @@ nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name)
return NULL;
}
+u64 nfp_rtsym_size(const struct nfp_rtsym *sym)
+{
+ switch (sym->type) {
+ case NFP_RTSYM_TYPE_NONE:
+ pr_err("rtsym type NONE\n");
+ return 0;
+ default:
+ pr_warn("Unknown rtsym type: %d\n", sym->type);
+ /* fall through */
+ case NFP_RTSYM_TYPE_OBJECT:
+ case NFP_RTSYM_TYPE_FUNCTION:
+ return sym->size;
+ case NFP_RTSYM_TYPE_ABS:
+ return sizeof(u64);
+ }
+}
+
static int
nfp_rtsym_to_dest(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
u8 action, u8 token, u64 off, u32 *cpp_id, u64 *addr)
{
+ if (sym->type != NFP_RTSYM_TYPE_OBJECT) {
+ nfp_err(cpp, "Direct access attempt to non-object rtsym\n");
+ return -EINVAL;
+ }
+
*addr = sym->addr + off;
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,
u64 addr;
int err;
+ if (sym->type == NFP_RTSYM_TYPE_ABS) {
+ __le64 tmp = cpu_to_le64(sym->addr);
+
+ len = min(len, sizeof(tmp));
+ memcpy(buf, &tmp, len);
+
+ return len;
+ }
+
err = nfp_rtsym_to_dest(cpp, sym, action, token, off, &cpp_id, &addr);
if (err)
return err;
@@ -306,6 +337,9 @@ int __nfp_rtsym_readq(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
u64 addr;
int err;
+ if (sym->type == NFP_RTSYM_TYPE_ABS)
+ return sym->addr;
+
err = nfp_rtsym_to_dest(cpp, sym, action, token, off, &cpp_id, &addr);
if (err)
return err;
@@ -405,7 +439,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
goto exit;
}
- switch (sym->size) {
+ switch (nfp_rtsym_size(sym)) {
case 4:
err = nfp_rtsym_readl(rtbl->cpp, sym, 0, &val32);
val = val32;
@@ -416,7 +450,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
default:
nfp_err(rtbl->cpp,
"rtsym '%s' unsupported or non-scalar size: %lld\n",
- name, sym->size);
+ name, nfp_rtsym_size(sym));
err = -EINVAL;
break;
}
@@ -452,7 +486,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
if (!sym)
return -ENOENT;
- switch (sym->size) {
+ switch (nfp_rtsym_size(sym)) {
case 4:
err = nfp_rtsym_writel(rtbl->cpp, sym, 0, value);
break;
@@ -462,7 +496,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
default:
nfp_err(rtbl->cpp,
"rtsym '%s' unsupported or non-scalar size: %lld\n",
- name, sym->size);
+ name, nfp_rtsym_size(sym));
err = -EINVAL;
break;
}