Skip to content

Commit 4e59532

Browse files
Jakub Kicinskidavem330
authored andcommitted
nfp: don't depend on compiler constant propagation
Matthias reports: nfp_eth_set_bit_config() is marked as __always_inline to allow gcc to identify the 'mask' parameter as known to be constant at compile time, which is required to use the FIELD_GET() macro. The forced inlining does the trick for gcc, but for kernel builds with clang it results in undefined symbols: drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.o: In function `__nfp_eth_set_aneg': drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c:(.text+0x787): undefined reference to `__compiletime_assert_492' drivers/net/ethernet/netronome/nfp/nfpcore/nfp_nsp_eth.c:(.text+0x7b1): undefined reference to `__compiletime_assert_496' These __compiletime_assert_xyx() calls would have been optimized away if the compiler had seen 'mask' as a constant. Add a macro to extract the mask and shift and pass those to nfp_eth_set_bit_config() separately. Reported-by: Matthias Kaehlcke <[email protected]> Signed-off-by: Jakub Kicinski <[email protected]> Tested-by: Dirk van der Merwe <[email protected]> Signed-off-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 1f25569 commit 4e59532

File tree

1 file changed

+15
-8
lines changed

1 file changed

+15
-8
lines changed

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

Lines changed: 15 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -469,10 +469,10 @@ int nfp_eth_set_configured(struct nfp_cpp *cpp, unsigned int idx, bool configed)
469469
return nfp_eth_config_commit_end(nsp);
470470
}
471471

472-
/* Force inline, FIELD_* macroes require masks to be compilation-time known */
473-
static __always_inline int
472+
static int
474473
nfp_eth_set_bit_config(struct nfp_nsp *nsp, unsigned int raw_idx,
475-
const u64 mask, unsigned int val, const u64 ctrl_bit)
474+
const u64 mask, const unsigned int shift,
475+
unsigned int val, const u64 ctrl_bit)
476476
{
477477
union eth_table_entry *entries = nfp_nsp_config_entries(nsp);
478478
unsigned int idx = nfp_nsp_config_idx(nsp);
@@ -489,11 +489,11 @@ nfp_eth_set_bit_config(struct nfp_nsp *nsp, unsigned int raw_idx,
489489

490490
/* Check if we are already in requested state */
491491
reg = le64_to_cpu(entries[idx].raw[raw_idx]);
492-
if (val == FIELD_GET(mask, reg))
492+
if (val == (reg & mask) >> shift)
493493
return 0;
494494

495495
reg &= ~mask;
496-
reg |= FIELD_PREP(mask, val);
496+
reg |= (val << shift) & mask;
497497
entries[idx].raw[raw_idx] = cpu_to_le64(reg);
498498

499499
entries[idx].control |= cpu_to_le64(ctrl_bit);
@@ -503,6 +503,13 @@ nfp_eth_set_bit_config(struct nfp_nsp *nsp, unsigned int raw_idx,
503503
return 0;
504504
}
505505

506+
#define NFP_ETH_SET_BIT_CONFIG(nsp, raw_idx, mask, val, ctrl_bit) \
507+
({ \
508+
__BF_FIELD_CHECK(mask, 0ULL, val, "NFP_ETH_SET_BIT_CONFIG: "); \
509+
nfp_eth_set_bit_config(nsp, raw_idx, mask, __bf_shf(mask), \
510+
val, ctrl_bit); \
511+
})
512+
506513
/**
507514
* __nfp_eth_set_aneg() - set PHY autonegotiation control bit
508515
* @nsp: NFP NSP handle returned from nfp_eth_config_start()
@@ -515,7 +522,7 @@ nfp_eth_set_bit_config(struct nfp_nsp *nsp, unsigned int raw_idx,
515522
*/
516523
int __nfp_eth_set_aneg(struct nfp_nsp *nsp, enum nfp_eth_aneg mode)
517524
{
518-
return nfp_eth_set_bit_config(nsp, NSP_ETH_RAW_STATE,
525+
return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_STATE,
519526
NSP_ETH_STATE_ANEG, mode,
520527
NSP_ETH_CTRL_SET_ANEG);
521528
}
@@ -544,7 +551,7 @@ int __nfp_eth_set_speed(struct nfp_nsp *nsp, unsigned int speed)
544551
return -EINVAL;
545552
}
546553

547-
return nfp_eth_set_bit_config(nsp, NSP_ETH_RAW_STATE,
554+
return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_STATE,
548555
NSP_ETH_STATE_RATE, rate,
549556
NSP_ETH_CTRL_SET_RATE);
550557
}
@@ -561,6 +568,6 @@ int __nfp_eth_set_speed(struct nfp_nsp *nsp, unsigned int speed)
561568
*/
562569
int __nfp_eth_set_split(struct nfp_nsp *nsp, unsigned int lanes)
563570
{
564-
return nfp_eth_set_bit_config(nsp, NSP_ETH_RAW_PORT, NSP_ETH_PORT_LANES,
571+
return NFP_ETH_SET_BIT_CONFIG(nsp, NSP_ETH_RAW_PORT, NSP_ETH_PORT_LANES,
565572
lanes, NSP_ETH_CTRL_SET_LANES);
566573
}

0 commit comments

Comments
 (0)