<div dir="ltr"><div dir="ltr"><div>Hi Ferruh,</div><div>We had looked at providing this patch as an LTS backport, but there are some ties to FPGA firmware which complicate its application. As this is a uncommon net/ark feature we support users on an as-needed basis.</div><div>Thanks.</div><div>Ed.<br></div></div><br><div class="gmail_quote"><div dir="ltr" class="gmail_attr">On Mon, Feb 20, 2023 at 9:54 AM Ferruh Yigit <<a href="mailto:ferruh.yigit@amd.com">ferruh.yigit@amd.com</a>> wrote:<br></div><blockquote class="gmail_quote" style="margin:0px 0px 0px 0.8ex;border-left:1px solid rgb(204,204,204);padding-left:1ex">On 2/17/2023 9:59 PM, Ed Czeck wrote:<br>
> allows the creation of multiple ports from one ark device via<br>
> the use of ark pmd extension, though the splitting of queues<br>
<br>
Hi Ed,<br>
<br>
As far as I can see "single function with multiple port" support was<br>
already there but this commit is fixing queue index usage for it, if<br>
correct can you please update commit log accordingly? (with fixes line<br>
etc..)<br>
This also helps the fix to be backported to LTS versions.<br>
<br>
<br>
btw, how this feature was working until now, when queue ids "0 to<br>
ark_api_num_queues_per_port()" used for each port?<br>
Was it not tested at all, or is there something changed in FW causing<br>
this issue, if so is there any FW version dependency to this change?<br>
<br>
><br>
> Add unique dev_private data for each port<br>
> <br>
<br>
Please check comment below related to this one.<br>
<br>
><br>
> Signed-off-by: Ed Czeck <<a href="mailto:ed.czeck@atomicrules.com" target="_blank">ed.czeck@atomicrules.com</a>><br>
> ---<br>
> drivers/net/ark/ark_ethdev.c | 14 +++++++++++++-<br>
> drivers/net/ark/ark_ethdev_rx.c | 6 +++---<br>
> drivers/net/ark/ark_ethdev_tx.c | 2 +-<br>
> drivers/net/ark/ark_global.h | 4 ++++<br>
> 4 files changed, 21 insertions(+), 5 deletions(-)<br>
> <br>
> diff --git a/drivers/net/ark/ark_ethdev.c b/drivers/net/ark/ark_ethdev.c<br>
> index d237e80cf4..96d0c2b0f0 100644<br>
> --- a/drivers/net/ark/ark_ethdev.c<br>
> +++ b/drivers/net/ark/ark_ethdev.c<br>
> @@ -432,6 +432,7 @@ eth_ark_dev_init(struct rte_eth_dev *dev)<br>
> ark->user_ext.dev_get_port_count(dev,<br>
> ark->user_data[dev->data->port_id]);<br>
> ark->num_ports = port_count;<br>
> + ark->num_queues = ark_api_num_queues_per_port(ark->mpurx.v, port_count);<br>
> <br>
> for (p = 0; p < port_count; p++) {<br>
> struct rte_eth_dev *eth_dev;<br>
> @@ -457,7 +458,18 @@ eth_ark_dev_init(struct rte_eth_dev *dev)<br>
> }<br>
> <br>
> eth_dev->device = &pci_dev->device;<br>
> - eth_dev->data->dev_private = ark;<br>
> + /* Device requires new dev_private data */<br>
> + eth_dev->data->dev_private =<br>
> + rte_zmalloc_socket(name,<br>
> + sizeof(struct ark_adapter),<br>
> + RTE_CACHE_LINE_SIZE,<br>
> + rte_socket_id());<br>
> +<br>
> + memcpy(eth_dev->data->dev_private, ark,<br>
> + sizeof(struct ark_adapter))> + ark = eth_dev->data->dev_private;<br>
> + ark->qbase = p * ark->num_queues;<br>
> +<br>
<br>
These each are a new eth_dev, so nothing wrong for each to allocate<br>
device private data, but if the only difference in private data is<br>
'ark->qbase', it is possible to use 'eth_dev->process_private' for it,<br>
which is per eth_dev. It is up to you.<br>
<br>
<br>
Btw, how there are handled in the secondary process? (previous patch)<br>
Since this code just creates new eth_dev, shouldn't secondary process<br>
needs some code to find and re-use them?<br>
<br>
> eth_dev->dev_ops = ark->eth_dev->dev_ops;<br>
> eth_dev->tx_pkt_burst = ark->eth_dev->tx_pkt_burst;<br>
> eth_dev->rx_pkt_burst = ark->eth_dev->rx_pkt_burst;<br>
> diff --git a/drivers/net/ark/ark_ethdev_rx.c b/drivers/net/ark/ark_ethdev_rx.c<br>
> index cbc0416bc2..38bc69dff4 100644<br>
> --- a/drivers/net/ark/ark_ethdev_rx.c<br>
> +++ b/drivers/net/ark/ark_ethdev_rx.c<br>
> @@ -68,7 +68,7 @@ struct ark_rx_queue {<br>
> static int<br>
> eth_ark_rx_hw_setup(struct rte_eth_dev *dev,<br>
> struct ark_rx_queue *queue,<br>
> - uint16_t rx_queue_id __rte_unused, uint16_t rx_queue_idx)<br>
> + uint16_t rx_queue_idx)<br>
> {<br>
> rte_iova_t queue_base;<br>
> rte_iova_t phys_addr_q_base;<br>
> @@ -124,7 +124,7 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev,<br>
> uint32_t i;<br>
> int status;<br>
> <br>
> - int qidx = queue_idx;<br>
> + int qidx = ark->qbase + queue_idx;<br>
> <br>
> /* We may already be setup, free memory prior to re-allocation */<br>
> if (dev->data->rx_queues[queue_idx] != NULL) {<br>
> @@ -215,7 +215,7 @@ eth_ark_dev_rx_queue_setup(struct rte_eth_dev *dev,<br>
> }<br>
> /* MPU Setup */<br>
> if (status == 0)<br>
> - status = eth_ark_rx_hw_setup(dev, queue, qidx, queue_idx);<br>
> + status = eth_ark_rx_hw_setup(dev, queue, queue_idx);<br>
> <br>
> if (unlikely(status != 0)) {<br>
> struct rte_mbuf **mbuf;<br>
> diff --git a/drivers/net/ark/ark_ethdev_tx.c b/drivers/net/ark/ark_ethdev_tx.c<br>
> index 5940a592a2..4792754f19 100644<br>
> --- a/drivers/net/ark/ark_ethdev_tx.c<br>
> +++ b/drivers/net/ark/ark_ethdev_tx.c<br>
> @@ -229,7 +229,7 @@ eth_ark_tx_queue_setup(struct rte_eth_dev *dev,<br>
> struct ark_tx_queue *queue;<br>
> int status;<br>
> <br>
> - int qidx = queue_idx;<br>
> + int qidx = ark->qbase + queue_idx;<br>
> <br>
> if (!rte_is_power_of_2(nb_desc)) {<br>
> ARK_PMD_LOG(ERR,<br>
> diff --git a/drivers/net/ark/ark_global.h b/drivers/net/ark/ark_global.h<br>
> index 71d0b53e03..176fbcda17 100644<br>
> --- a/drivers/net/ark/ark_global.h<br>
> +++ b/drivers/net/ark/ark_global.h<br>
> @@ -112,7 +112,11 @@ struct ark_adapter {<br>
> ark_pkt_chkr_t pc;<br>
> ark_pkt_dir_t pd;<br>
> <br>
> + /* For single function, multiple ports */<br>
> int num_ports;<br>
> + uint16_t qbase;<br>
> + uint16_t num_queues;<br>
<br>
<br>
it looks like 'num_queues' only used locally and not needed to be part<br>
of device data, unless there is some more usage planned for future.<br>
<br>
> +<br>
> bool isvf;<br>
> <br>
> /* Packet generator/checker args */<br>
<br>
</blockquote></div></div>