@@ -233,10 +233,32 @@ nfp_rtsym_lookup(struct nfp_rtsym_table *rtbl, const char *name)
233
233
return NULL ;
234
234
}
235
235
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
+
236
253
static int
237
254
nfp_rtsym_to_dest (struct nfp_cpp * cpp , const struct nfp_rtsym * sym ,
238
255
u8 action , u8 token , u64 off , u32 * cpp_id , u64 * addr )
239
256
{
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
+
240
262
* addr = sym -> addr + off ;
241
263
242
264
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,
266
288
u64 addr ;
267
289
int err ;
268
290
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
+
269
300
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
270
301
if (err )
271
302
return err ;
@@ -306,6 +337,9 @@ int __nfp_rtsym_readq(struct nfp_cpp *cpp, const struct nfp_rtsym *sym,
306
337
u64 addr ;
307
338
int err ;
308
339
340
+ if (sym -> type == NFP_RTSYM_TYPE_ABS )
341
+ return sym -> addr ;
342
+
309
343
err = nfp_rtsym_to_dest (cpp , sym , action , token , off , & cpp_id , & addr );
310
344
if (err )
311
345
return err ;
@@ -405,7 +439,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
405
439
goto exit ;
406
440
}
407
441
408
- switch (sym -> size ) {
442
+ switch (nfp_rtsym_size ( sym ) ) {
409
443
case 4 :
410
444
err = nfp_rtsym_readl (rtbl -> cpp , sym , 0 , & val32 );
411
445
val = val32 ;
@@ -416,7 +450,7 @@ u64 nfp_rtsym_read_le(struct nfp_rtsym_table *rtbl, const char *name,
416
450
default :
417
451
nfp_err (rtbl -> cpp ,
418
452
"rtsym '%s' unsupported or non-scalar size: %lld\n" ,
419
- name , sym -> size );
453
+ name , nfp_rtsym_size ( sym ) );
420
454
err = - EINVAL ;
421
455
break ;
422
456
}
@@ -452,7 +486,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
452
486
if (!sym )
453
487
return - ENOENT ;
454
488
455
- switch (sym -> size ) {
489
+ switch (nfp_rtsym_size ( sym ) ) {
456
490
case 4 :
457
491
err = nfp_rtsym_writel (rtbl -> cpp , sym , 0 , value );
458
492
break ;
@@ -462,7 +496,7 @@ int nfp_rtsym_write_le(struct nfp_rtsym_table *rtbl, const char *name,
462
496
default :
463
497
nfp_err (rtbl -> cpp ,
464
498
"rtsym '%s' unsupported or non-scalar size: %lld\n" ,
465
- name , sym -> size );
499
+ name , nfp_rtsym_size ( sym ) );
466
500
err = - EINVAL ;
467
501
break ;
468
502
}
0 commit comments