Commit cbb8a12c authored by Mintz, Yuval's avatar Mintz, Yuval Committed by David S. Miller

qed: VF XDP support

The final addition on the qed front -
 - VFs would now require their PFs to provide multiple CIDs
 - Based on the availability of connections from PF, determine whether
   XDP is feasible and share it with qede via dev_info.
Signed-off-by: default avatarYuval Mintz <Yuval.Mintz@cavium.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 1a850bfc
...@@ -2119,15 +2119,26 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev, ...@@ -2119,15 +2119,26 @@ static int qed_fill_eth_dev_info(struct qed_dev *cdev,
ether_addr_copy(info->port_mac, ether_addr_copy(info->port_mac,
cdev->hwfns[0].hw_info.hw_mac_addr); cdev->hwfns[0].hw_info.hw_mac_addr);
info->xdp_supported = true;
} else { } else {
qed_vf_get_num_rxqs(QED_LEADING_HWFN(cdev), &info->num_queues); u16 total_cids = 0;
if (cdev->num_hwfns > 1) {
u8 queues = 0; /* Determine queues & XDP support */
for_each_hwfn(cdev, i) {
struct qed_hwfn *p_hwfn = &cdev->hwfns[i];
u8 queues, cids;
qed_vf_get_num_rxqs(&cdev->hwfns[1], &queues); qed_vf_get_num_cids(p_hwfn, &cids);
qed_vf_get_num_rxqs(p_hwfn, &queues);
info->num_queues += queues; info->num_queues += queues;
total_cids += cids;
} }
/* Enable VF XDP in case PF guarntees sufficient connections */
if (total_cids >= info->num_queues * 3)
info->xdp_supported = true;
qed_vf_get_num_vlan_filters(&cdev->hwfns[0], qed_vf_get_num_vlan_filters(&cdev->hwfns[0],
(u8 *)&info->num_vlan_filters); (u8 *)&info->num_vlan_filters);
qed_vf_get_num_mac_filters(&cdev->hwfns[0], qed_vf_get_num_mac_filters(&cdev->hwfns[0],
......
...@@ -291,9 +291,11 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn) ...@@ -291,9 +291,11 @@ static int qed_vf_pf_acquire(struct qed_hwfn *p_hwfn)
req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_100G; req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_100G;
/* If we've mapped the doorbell bar, try using queue qids */ /* If we've mapped the doorbell bar, try using queue qids */
if (p_iov->b_doorbell_bar) if (p_iov->b_doorbell_bar) {
req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_PHYSICAL_BAR | req->vfdev_info.capabilities |= VFPF_ACQUIRE_CAP_PHYSICAL_BAR |
VFPF_ACQUIRE_CAP_QUEUE_QIDS; VFPF_ACQUIRE_CAP_QUEUE_QIDS;
p_resc->num_cids = QED_ETH_VF_MAX_NUM_CIDS;
}
/* pf 2 vf bulletin board address */ /* pf 2 vf bulletin board address */
req->bulletin_addr = p_iov->bulletin.phys; req->bulletin_addr = p_iov->bulletin.phys;
...@@ -884,8 +886,8 @@ qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn, ...@@ -884,8 +886,8 @@ qed_vf_pf_txq_start(struct qed_hwfn *p_hwfn,
} }
DP_VERBOSE(p_hwfn, QED_MSG_IOV, DP_VERBOSE(p_hwfn, QED_MSG_IOV,
"Txq[0x%02x]: doorbell at %p [offset 0x%08x]\n", "Txq[0x%02x.%02x]: doorbell at %p [offset 0x%08x]\n",
qid, *pp_doorbell, resp->offset); qid, p_cid->qid_usage_idx, *pp_doorbell, resp->offset);
exit: exit:
qed_vf_pf_req_end(p_hwfn, rc); qed_vf_pf_req_end(p_hwfn, rc);
...@@ -1478,6 +1480,11 @@ void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs) ...@@ -1478,6 +1480,11 @@ void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs)
*num_txqs = p_hwfn->vf_iov_info->acquire_resp.resc.num_txqs; *num_txqs = p_hwfn->vf_iov_info->acquire_resp.resc.num_txqs;
} }
void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids)
{
*num_cids = p_hwfn->vf_iov_info->acquire_resp.resc.num_cids;
}
void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac) void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
{ {
memcpy(port_mac, memcpy(port_mac,
......
...@@ -731,6 +731,14 @@ void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs); ...@@ -731,6 +731,14 @@ void qed_vf_get_num_rxqs(struct qed_hwfn *p_hwfn, u8 *num_rxqs);
*/ */
void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs); void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs);
/**
* @brief Get number of available connections [both Rx and Tx] for VF
*
* @param p_hwfn
* @param num_cids - allocated number of connections
*/
void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids);
/** /**
* @brief Get port mac address for VF * @brief Get port mac address for VF
* *
...@@ -1010,6 +1018,10 @@ static inline void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs) ...@@ -1010,6 +1018,10 @@ static inline void qed_vf_get_num_txqs(struct qed_hwfn *p_hwfn, u8 *num_txqs)
{ {
} }
static inline void qed_vf_get_num_cids(struct qed_hwfn *p_hwfn, u8 *num_cids)
{
}
static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac) static inline void qed_vf_get_port_mac(struct qed_hwfn *p_hwfn, u8 *port_mac)
{ {
} }
......
...@@ -73,6 +73,9 @@ struct qed_dev_eth_info { ...@@ -73,6 +73,9 @@ struct qed_dev_eth_info {
/* Legacy VF - this affects the datapath, so qede has to know */ /* Legacy VF - this affects the datapath, so qede has to know */
bool is_legacy; bool is_legacy;
/* Might depend on available resources [in case of VF] */
bool xdp_supported;
}; };
struct qed_update_vport_rss_params { struct qed_update_vport_rss_params {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment