Skip to content

Commit 9ed0343

Browse files
Geetha sowjanyadavem330
authored andcommitted
octeontx2-pf: Add devlink port support
Register devlink port for the rvu representors. Signed-off-by: Geetha sowjanya <[email protected]> Reviewed-by: Simon Horman <[email protected]> Signed-off-by: David S. Miller <[email protected]>
1 parent 2f7f33a commit 9ed0343

File tree

4 files changed

+98
-0
lines changed

4 files changed

+98
-0
lines changed

drivers/net/ethernet/marvell/octeontx2/af/mbox.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1583,6 +1583,7 @@ struct rep_evt_data {
15831583
u16 rx_mode;
15841584
u16 rx_flags;
15851585
u16 mtu;
1586+
u8 mac[ETH_ALEN];
15861587
u64 rsvd[5];
15871588
};
15881589

@@ -1593,6 +1594,7 @@ struct rep_event {
15931594
#define RVU_EVENT_PFVF_STATE BIT_ULL(1)
15941595
#define RVU_EVENT_MTU_CHANGE BIT_ULL(2)
15951596
#define RVU_EVENT_RX_MODE_CHANGE BIT_ULL(3)
1597+
#define RVU_EVENT_MAC_ADDR_CHANGE BIT_ULL(4)
15961598
u16 event;
15971599
struct rep_evt_data evt_data;
15981600
};

drivers/net/ethernet/marvell/octeontx2/af/rvu_rep.c

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,11 +35,15 @@ MBOX_UP_REP_MESSAGES
3535

3636
static int rvu_rep_up_notify(struct rvu *rvu, struct rep_event *event)
3737
{
38+
struct rvu_pfvf *pfvf = rvu_get_pfvf(rvu, event->pcifunc);
3839
struct rep_event *msg;
3940
int pf;
4041

4142
pf = rvu_get_pf(event->pcifunc);
4243

44+
if (event->event & RVU_EVENT_MAC_ADDR_CHANGE)
45+
ether_addr_copy(pfvf->mac_addr, event->evt_data.mac);
46+
4347
mutex_lock(&rvu->mbox_lock);
4448
msg = otx2_mbox_alloc_msg_rep_event_up_notify(rvu, pf);
4549
if (!msg) {

drivers/net/ethernet/marvell/octeontx2/nic/rep.c

Lines changed: 90 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,89 @@ MODULE_DESCRIPTION(DRV_STRING);
2828
MODULE_LICENSE("GPL");
2929
MODULE_DEVICE_TABLE(pci, rvu_rep_id_table);
3030

31+
static int rvu_rep_notify_pfvf(struct otx2_nic *priv, u16 event,
32+
struct rep_event *data);
33+
34+
static int rvu_rep_dl_port_fn_hw_addr_get(struct devlink_port *port,
35+
u8 *hw_addr, int *hw_addr_len,
36+
struct netlink_ext_ack *extack)
37+
{
38+
struct rep_dev *rep = container_of(port, struct rep_dev, dl_port);
39+
40+
ether_addr_copy(hw_addr, rep->mac);
41+
*hw_addr_len = ETH_ALEN;
42+
return 0;
43+
}
44+
45+
static int rvu_rep_dl_port_fn_hw_addr_set(struct devlink_port *port,
46+
const u8 *hw_addr, int hw_addr_len,
47+
struct netlink_ext_ack *extack)
48+
{
49+
struct rep_dev *rep = container_of(port, struct rep_dev, dl_port);
50+
struct otx2_nic *priv = rep->mdev;
51+
struct rep_event evt = {0};
52+
53+
eth_hw_addr_set(rep->netdev, hw_addr);
54+
ether_addr_copy(rep->mac, hw_addr);
55+
56+
ether_addr_copy(evt.evt_data.mac, hw_addr);
57+
evt.pcifunc = rep->pcifunc;
58+
rvu_rep_notify_pfvf(priv, RVU_EVENT_MAC_ADDR_CHANGE, &evt);
59+
return 0;
60+
}
61+
62+
static const struct devlink_port_ops rvu_rep_dl_port_ops = {
63+
.port_fn_hw_addr_get = rvu_rep_dl_port_fn_hw_addr_get,
64+
.port_fn_hw_addr_set = rvu_rep_dl_port_fn_hw_addr_set,
65+
};
66+
67+
static void
68+
rvu_rep_devlink_set_switch_id(struct otx2_nic *priv,
69+
struct netdev_phys_item_id *ppid)
70+
{
71+
struct pci_dev *pdev = priv->pdev;
72+
u64 id;
73+
74+
id = pci_get_dsn(pdev);
75+
76+
ppid->id_len = sizeof(id);
77+
put_unaligned_be64(id, &ppid->id);
78+
}
79+
80+
static void rvu_rep_devlink_port_unregister(struct rep_dev *rep)
81+
{
82+
devlink_port_unregister(&rep->dl_port);
83+
}
84+
85+
static int rvu_rep_devlink_port_register(struct rep_dev *rep)
86+
{
87+
struct devlink_port_attrs attrs = {};
88+
struct otx2_nic *priv = rep->mdev;
89+
struct devlink *dl = priv->dl->dl;
90+
int err;
91+
92+
if (!(rep->pcifunc & RVU_PFVF_FUNC_MASK)) {
93+
attrs.flavour = DEVLINK_PORT_FLAVOUR_PHYSICAL;
94+
attrs.phys.port_number = rvu_get_pf(rep->pcifunc);
95+
} else {
96+
attrs.flavour = DEVLINK_PORT_FLAVOUR_PCI_VF;
97+
attrs.pci_vf.pf = rvu_get_pf(rep->pcifunc);
98+
attrs.pci_vf.vf = rep->pcifunc & RVU_PFVF_FUNC_MASK;
99+
}
100+
101+
rvu_rep_devlink_set_switch_id(priv, &attrs.switch_id);
102+
devlink_port_attrs_set(&rep->dl_port, &attrs);
103+
104+
err = devl_port_register_with_ops(dl, &rep->dl_port, rep->rep_id,
105+
&rvu_rep_dl_port_ops);
106+
if (err) {
107+
dev_err(rep->mdev->dev, "devlink_port_register failed: %d\n",
108+
err);
109+
return err;
110+
}
111+
return 0;
112+
}
113+
31114
static int rvu_rep_get_repid(struct otx2_nic *priv, u16 pcifunc)
32115
{
33116
int rep_id;
@@ -386,6 +469,7 @@ void rvu_rep_destroy(struct otx2_nic *priv)
386469
for (rep_id = 0; rep_id < priv->rep_cnt; rep_id++) {
387470
rep = priv->reps[rep_id];
388471
unregister_netdev(rep->netdev);
472+
rvu_rep_devlink_port_unregister(rep);
389473
free_netdev(rep->netdev);
390474
}
391475
kfree(priv->reps);
@@ -439,6 +523,11 @@ int rvu_rep_create(struct otx2_nic *priv, struct netlink_ext_ack *extack)
439523

440524
ndev->features |= ndev->hw_features;
441525
eth_hw_addr_random(ndev);
526+
err = rvu_rep_devlink_port_register(rep);
527+
if (err)
528+
goto exit;
529+
530+
SET_NETDEV_DEVLINK_PORT(ndev, &rep->dl_port);
442531
err = register_netdev(ndev);
443532
if (err) {
444533
NL_SET_ERR_MSG_MOD(extack,
@@ -459,6 +548,7 @@ int rvu_rep_create(struct otx2_nic *priv, struct netlink_ext_ack *extack)
459548
while (--rep_id >= 0) {
460549
rep = priv->reps[rep_id];
461550
unregister_netdev(rep->netdev);
551+
rvu_rep_devlink_port_unregister(rep);
462552
free_netdev(rep->netdev);
463553
}
464554
kfree(priv->reps);

drivers/net/ethernet/marvell/octeontx2/nic/rep.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,10 +34,12 @@ struct rep_dev {
3434
struct net_device *netdev;
3535
struct rep_stats stats;
3636
struct delayed_work stats_wrk;
37+
struct devlink_port dl_port;
3738
#define RVU_REP_VF_INITIALIZED BIT_ULL(0)
3839
u64 flags;
3940
u16 rep_id;
4041
u16 pcifunc;
42+
u8 mac[ETH_ALEN];
4143
};
4244

4345
static inline bool otx2_rep_dev(struct pci_dev *pdev)

0 commit comments

Comments
 (0)