Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 640917dd authored by Jakub Kicinski's avatar Jakub Kicinski Committed by David S. Miller
Browse files

nfp: support access to absolute RTsyms



Add support in nfpcore for reading the absolute RTsyms.

Signed-off-by: default avatarJakub Kicinski <jakub.kicinski@netronome.com>
Reviewed-by: default avatarFrancois H. Theron <francois.theron@netronome.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1240989c
Loading
Loading
Loading
Loading
+8 −5
Original line number Diff line number Diff line
@@ -61,10 +61,12 @@ void nfp_mip_strtab(const struct nfp_mip *mip, u32 *addr, u32 *size);

/* Implemented in nfp_rtsym.c */

#define NFP_RTSYM_TYPE_NONE		0
#define NFP_RTSYM_TYPE_OBJECT		1
#define NFP_RTSYM_TYPE_FUNCTION		2
#define NFP_RTSYM_TYPE_ABS		3
enum nfp_rtsym_type {
	NFP_RTSYM_TYPE_NONE	= 0,
	NFP_RTSYM_TYPE_OBJECT	= 1,
	NFP_RTSYM_TYPE_FUNCTION	= 2,
	NFP_RTSYM_TYPE_ABS	= 3,
};

#define NFP_RTSYM_TARGET_NONE		0
#define NFP_RTSYM_TARGET_LMEM		-1
@@ -83,7 +85,7 @@ struct nfp_rtsym {
	const char *name;
	u64 addr;
	u64 size;
	int type;
	enum nfp_rtsym_type type;
	int target;
	int domain;
};
@@ -98,6 +100,7 @@ const struct nfp_rtsym *nfp_rtsym_get(struct nfp_rtsym_table *rtbl, int idx);
const struct nfp_rtsym *
nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name);

u64 nfp_rtsym_size(const struct nfp_rtsym *rtsym);
int __nfp_rtsym_read(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
		     u8 action, u8 token, u64 off, void *buf, size_t len);
int nfp_rtsym_read(struct nfp_cpp *cpp, const struct nfp_rtsym *sym, u64 off,
+38 −4
Original line number Diff line number Diff line
@@ -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;
	}