From: Jerin Jacob <jerinjacobk@gmail.com>
To: Subrahmanyam Nilla <snilla@marvell.com>
Cc: dpdk-dev <dev@dpdk.org>, Jerin Jacob <jerinj@marvell.com>,
shallyv@marvell.com, venkatn@marvell.com, mchalla@marvell.com
Subject: Re: [dpdk-dev] [PATCH v1 1/1] net/octeontx2: add SDP interface support
Date: Wed, 6 Nov 2019 12:15:50 +0530 [thread overview]
Message-ID: <CALBAE1NkdjCQ=OVVuY5McTVSD9WJh7qnvBDATV_1u3HXDL6cww@mail.gmail.com> (raw)
In-Reply-To: <20191030140821.7860-1-snilla@marvell.com>
On Wed, Oct 30, 2019 at 7:38 PM Subrahmanyam Nilla <snilla@marvell.com> wrote:
>
> System DPI Packet Interface Unit (SDP) is a co-processor
> of OCTEON TX2 which provides PCIe endpoint support for a
> remote host to DMA packets into and out of the OCTEON TX2 SoC.
> SDP interface comes in to live only when it is connected in
> EP mode. It exposes input and output queue pairs to remote host
> for instruction input and packet output. It can be used as
> a communication channel between remote host and OCTEON TX2.
> Host machine needs to use corresponding user/kernel mode
> driver to communicate with SDP interface on OCTEON TX2 SoC.
>
> SDP interface support is limited to SDP PF device now.
> No SDP VF support.
>
> Signed-off-by: Subrahmanyam Nilla <snilla@marvell.com>
> Signed-off-by: Venkateshwarlu Nalla <venkatn@marvell.com>
This change looks good to me.
Could rebase the patch to dpdk-next-net-mrvl.git.
Applying: net/octeontx2: add SDP interface support
Using index info to reconstruct a base tree...
M doc/guides/nics/octeontx2.rst
M drivers/net/octeontx2/otx2_ethdev.c
M drivers/net/octeontx2/otx2_flow_ctrl.c
M drivers/net/octeontx2/otx2_ptp.c
Falling back to patching base and 3-way merge...
Auto-merging drivers/net/octeontx2/otx2_ptp.c
Auto-merging drivers/net/octeontx2/otx2_flow_ctrl.c
CONFLICT (content): Merge conflict in drivers/net/octeontx2/otx2_flow_ctrl.c
Auto-merging drivers/net/octeontx2/otx2_ethdev.c
Auto-merging doc/guides/nics/octeontx2.rst
error: Failed to merge in the changes.
Patch failed at 0001 net/octeontx2: add SDP interface support
hint: Use 'git am --show-current-patch' to see the failed patch
When you have resolved this problem, run "git am --continue".
If you prefer to skip this patch, run "git am --skip" instead.
To restore the original branch and stop patching, run "git am --abort".
HEAD is now at b7ce8bb35 net/octeontx2: fix compilation with x86-x32
git am failed /tmp/r//v1-1-1-net-octeontx2-add-SDP-interface-support
> ---
> doc/guides/nics/octeontx2.rst | 4 ++++
> doc/guides/platform/octeontx2.rst | 21 +++++++++++++++++++++
> drivers/common/octeontx2/otx2_common.h | 2 ++
> drivers/common/octeontx2/otx2_dev.c | 1 +
> drivers/common/octeontx2/otx2_dev.h | 4 ++++
> drivers/net/octeontx2/otx2_ethdev.c | 31 ++++++++++++++++++++++++++-----
> drivers/net/octeontx2/otx2_ethdev.h | 1 +
> drivers/net/octeontx2/otx2_ethdev_ops.c | 6 +++++-
> drivers/net/octeontx2/otx2_flow_ctrl.c | 6 ++++++
> drivers/net/octeontx2/otx2_link.c | 6 +++---
> drivers/net/octeontx2/otx2_mac.c | 8 ++++----
> drivers/net/octeontx2/otx2_ptp.c | 6 +++---
> drivers/net/octeontx2/otx2_tm.c | 18 ++++++++++++------
> 13 files changed, 92 insertions(+), 22 deletions(-)
>
> diff --git a/doc/guides/nics/octeontx2.rst b/doc/guides/nics/octeontx2.rst
> index fc8a130fb..7e901cec1 100644
> --- a/doc/guides/nics/octeontx2.rst
> +++ b/doc/guides/nics/octeontx2.rst
> @@ -200,6 +200,10 @@ Multicast MAC filtering
> ``net_octeontx2`` pmd supports multicast mac filtering feature only on physical
> function devices.
>
> +SDP interface support
> +~~~~~~~~~~~~~~~~~~~~~
> +OCTEON TX2 SDP interface support is limited to PF device, No VF support.
> +
> Debugging Options
> -----------------
>
> diff --git a/doc/guides/platform/octeontx2.rst b/doc/guides/platform/octeontx2.rst
> index 1c7d98f73..15b1641cf 100644
> --- a/doc/guides/platform/octeontx2.rst
> +++ b/doc/guides/platform/octeontx2.rst
> @@ -64,6 +64,8 @@ DPDK subsystem.
> +---+-----+--------------------------------------------------------------+
> | 8 | DPI | rte_rawdev |
> +---+-----+--------------------------------------------------------------+
> + | 9 | SDP | rte_ethdev |
> + +---+-----+--------------------------------------------------------------+
>
> PF0 is called the administrative / admin function (AF) and has exclusive
> privileges to provision RVU functional block's LFs to each of the PF/VF.
> @@ -102,6 +104,25 @@ Typical application usage models are,
> #. Exception path to Linux kernel from DPDK application as SW ``KNI`` replacement.
> #. Communication between two different DPDK applications.
>
> +SDP interface
> +-------------
> +
> +System DPI Packet Interface unit(SDP) provides PCIe endpoint support for remote host
> +to DMA packets into and out of OCTEON TX2 SoC. SDP interface comes in to live only when
> +OCTEON TX2 SoC is connected in PCIe endpoint mode. It can be used to send/receive
> +packets to/from remote host machine using input/output queue pairs exposed to it.
> +SDP interface receives input packets from remote host from NIX-RX and sends packets
> +to remote host using NIX-TX. Remote host machine need to use corresponding driver
> +(kernel/user mode) to communicate with SDP interface on OCTEON TX2 SoC. SDP supports
> +single PCIe SRIOV physical function(PF) and multiple virtual functions(VF's). Users
> +can bind PF or VF to use SDP interface and it will be enumerated as ethdev ports.
> +
> +The primary use case for SDP is to enable the smart NIC use case. Typical usage models are,
> +
> +#. Communication channel between remote host and OCTEON TX2 SoC over PCIe.
> +#. Transfer packets received from network interface to remote host over PCIe and
> + vice-versa.
> +
> OCTEON TX2 packet flow
> ----------------------
>
> diff --git a/drivers/common/octeontx2/otx2_common.h b/drivers/common/octeontx2/otx2_common.h
> index 0d0b87ee6..f62c45deb 100644
> --- a/drivers/common/octeontx2/otx2_common.h
> +++ b/drivers/common/octeontx2/otx2_common.h
> @@ -121,6 +121,8 @@ extern int otx2_logtype_dpi;
> #define PCI_DEVID_OCTEONTX2_RVU_CPT_VF 0xA0FE
> #define PCI_DEVID_OCTEONTX2_RVU_AF_VF 0xA0f8
> #define PCI_DEVID_OCTEONTX2_DPI_VF 0xA081
> +#define PCI_DEVID_OCTEONTX2_RVU_SDP_PF 0xA0f6
> +#define PCI_DEVID_OCTEONTX2_RVU_SDP_VF 0xA0f7
>
> /* Subsystem Device ID */
> #define PCI_SUBSYS_DEVID_96XX_95XX 0xB200
> diff --git a/drivers/common/octeontx2/otx2_dev.c b/drivers/common/octeontx2/otx2_dev.c
> index 910270975..0fc799e4a 100644
> --- a/drivers/common/octeontx2/otx2_dev.c
> +++ b/drivers/common/octeontx2/otx2_dev.c
> @@ -885,6 +885,7 @@ otx2_update_vf_hwcap(struct rte_pci_device *pci_dev, struct otx2_dev *dev)
> case PCI_DEVID_OCTEONTX2_RVU_CPT_VF:
> case PCI_DEVID_OCTEONTX2_RVU_AF_VF:
> case PCI_DEVID_OCTEONTX2_RVU_VF:
> + case PCI_DEVID_OCTEONTX2_RVU_SDP_VF:
> dev->hwcap |= OTX2_HWCAP_F_VF;
> break;
> }
> diff --git a/drivers/common/octeontx2/otx2_dev.h b/drivers/common/octeontx2/otx2_dev.h
> index 5fd05fa17..7d9839c33 100644
> --- a/drivers/common/octeontx2/otx2_dev.h
> +++ b/drivers/common/octeontx2/otx2_dev.h
> @@ -19,6 +19,10 @@
> #define otx2_dev_is_lbk(dev) ((dev->hwcap & OTX2_HWCAP_F_VF) && \
> (dev->tx_chan_base < 0x700))
> #define otx2_dev_revid(dev) (dev->hwcap & 0xFF)
> +#define otx2_dev_is_sdp(dev) (dev->sdp_link)
> +
> +#define otx2_dev_is_vf_or_sdp(dev) \
> + (otx2_dev_is_vf(dev) || otx2_dev_is_sdp(dev))
>
> #define otx2_dev_is_A0(dev) \
> ((RVU_PCI_REV_MAJOR(otx2_dev_revid(dev)) == 0x0) && \
> diff --git a/drivers/net/octeontx2/otx2_ethdev.c b/drivers/net/octeontx2/otx2_ethdev.c
> index 62291c698..b476b5ffb 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.c
> +++ b/drivers/net/octeontx2/otx2_ethdev.c
> @@ -120,7 +120,7 @@ otx2_cgx_rxtx_start(struct otx2_eth_dev *dev)
> {
> struct otx2_mbox *mbox = dev->mbox;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return 0;
>
> otx2_mbox_alloc_msg_cgx_start_rxtx(mbox);
> @@ -133,7 +133,7 @@ otx2_cgx_rxtx_stop(struct otx2_eth_dev *dev)
> {
> struct otx2_mbox *mbox = dev->mbox;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return 0;
>
> otx2_mbox_alloc_msg_cgx_stop_rxtx(mbox);
> @@ -166,7 +166,7 @@ nix_cgx_start_link_event(struct otx2_eth_dev *dev)
> {
> struct otx2_mbox *mbox = dev->mbox;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return 0;
>
> otx2_mbox_alloc_msg_cgx_start_linkevents(mbox);
> @@ -179,7 +179,7 @@ cgx_intlbk_enable(struct otx2_eth_dev *dev, bool en)
> {
> struct otx2_mbox *mbox = dev->mbox;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return 0;
>
> if (en)
> @@ -195,7 +195,7 @@ nix_cgx_stop_link_event(struct otx2_eth_dev *dev)
> {
> struct otx2_mbox *mbox = dev->mbox;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return 0;
>
> otx2_mbox_alloc_msg_cgx_stop_linkevents(mbox);
> @@ -2056,6 +2056,15 @@ otx2_eth_dev_lf_detach(struct otx2_mbox *mbox)
> return otx2_mbox_process(mbox);
> }
>
> +static bool
> +otx2_eth_dev_is_sdp(struct rte_pci_device *pci_dev)
> +{
> + if (pci_dev->id.device_id == PCI_DEVID_OCTEONTX2_RVU_SDP_PF ||
> + pci_dev->id.device_id == PCI_DEVID_OCTEONTX2_RVU_SDP_VF)
> + return true;
> + return false;
> +}
> +
> static int
> otx2_eth_dev_init(struct rte_eth_dev *eth_dev)
> {
> @@ -2099,6 +2108,10 @@ otx2_eth_dev_init(struct rte_eth_dev *eth_dev)
> goto error;
> }
> }
> + if (otx2_eth_dev_is_sdp(pci_dev))
> + dev->sdp_link = true;
> + else
> + dev->sdp_link = false;
> /* Device generic callbacks */
> dev->ops = &otx2_dev_ops;
> dev->eth_dev = eth_dev;
> @@ -2387,6 +2400,14 @@ static const struct rte_pci_id pci_nix_map[] = {
> PCI_DEVID_OCTEONTX2_RVU_AF_VF)
> },
> {
> + RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
> + PCI_DEVID_OCTEONTX2_RVU_SDP_PF)
> + },
> + {
> + RTE_PCI_DEVICE(PCI_VENDOR_ID_CAVIUM,
> + PCI_DEVID_OCTEONTX2_RVU_SDP_VF)
> + },
> + {
> .vendor_id = 0,
> },
> };
> diff --git a/drivers/net/octeontx2/otx2_ethdev.h b/drivers/net/octeontx2/otx2_ethdev.h
> index 4d9ed4870..b49e309fd 100644
> --- a/drivers/net/octeontx2/otx2_ethdev.h
> +++ b/drivers/net/octeontx2/otx2_ethdev.h
> @@ -321,6 +321,7 @@ struct otx2_eth_dev {
> uint64_t clk_delta;
> bool mc_tbl_set;
> struct otx2_nix_mc_filter_tbl mc_fltr_tbl;
> + bool sdp_link; /* SDP flag */
> } __rte_cache_aligned;
>
> struct otx2_eth_txq {
> diff --git a/drivers/net/octeontx2/otx2_ethdev_ops.c b/drivers/net/octeontx2/otx2_ethdev_ops.c
> index fc0fbd9f2..d1e77c324 100644
> --- a/drivers/net/octeontx2/otx2_ethdev_ops.c
> +++ b/drivers/net/octeontx2/otx2_ethdev_ops.c
> @@ -36,6 +36,8 @@ otx2_nix_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
>
> req = otx2_mbox_alloc_msg_nix_set_hw_frs(mbox);
> req->update_smq = true;
> + if (otx2_dev_is_sdp(dev))
> + req->sdp_link = true;
> /* FRS HW config should exclude FCS but include NPC VTAG insert size */
> req->maxlen = frame_size - RTE_ETHER_CRC_LEN + NIX_MAX_VTAG_ACT_SIZE;
>
> @@ -46,6 +48,8 @@ otx2_nix_mtu_set(struct rte_eth_dev *eth_dev, uint16_t mtu)
> /* Now just update Rx MAXLEN */
> req = otx2_mbox_alloc_msg_nix_set_hw_frs(mbox);
> req->maxlen = frame_size - RTE_ETHER_CRC_LEN;
> + if (otx2_dev_is_sdp(dev))
> + req->sdp_link = true;
>
> rc = otx2_mbox_process(mbox);
> if (rc)
> @@ -98,7 +102,7 @@ nix_cgx_promisc_config(struct rte_eth_dev *eth_dev, int en)
> struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
> struct otx2_mbox *mbox = dev->mbox;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return;
>
> if (en)
> diff --git a/drivers/net/octeontx2/otx2_flow_ctrl.c b/drivers/net/octeontx2/otx2_flow_ctrl.c
> index 1d00e4687..0e725493b 100644
> --- a/drivers/net/octeontx2/otx2_flow_ctrl.c
> +++ b/drivers/net/octeontx2/otx2_flow_ctrl.c
> @@ -14,6 +14,9 @@ otx2_nix_rxchan_bpid_cfg(struct rte_eth_dev *eth_dev, bool enb)
> struct nix_bp_cfg_rsp *rsp;
> int rc;
>
> + if (otx2_dev_is_sdp(dev))
> + return 0;
> +
> if (enb) {
> req = otx2_mbox_alloc_msg_nix_bp_enable(mbox);
> req->chan_base = 0;
> @@ -189,6 +192,9 @@ otx2_nix_update_flow_ctrl_mode(struct rte_eth_dev *eth_dev)
> struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
> struct rte_eth_fc_conf fc_conf;
>
> + if (otx2_dev_is_sdp(dev))
> + return 0;
> +
> memset(&fc_conf, 0, sizeof(struct rte_eth_fc_conf));
> /* Both Rx & Tx flow ctrl get enabled(RTE_FC_FULL) in HW
> * by AF driver, update those info in PMD structure.
> diff --git a/drivers/net/octeontx2/otx2_link.c b/drivers/net/octeontx2/otx2_link.c
> index 725b793d4..f5679b06e 100644
> --- a/drivers/net/octeontx2/otx2_link.c
> +++ b/drivers/net/octeontx2/otx2_link.c
> @@ -93,7 +93,7 @@ otx2_nix_link_update(struct rte_eth_dev *eth_dev, int wait_to_complete)
>
> RTE_SET_USED(wait_to_complete);
>
> - if (otx2_dev_is_lbk(dev))
> + if (otx2_dev_is_lbk(dev) || otx2_dev_is_sdp(dev))
> return 0;
>
> otx2_mbox_alloc_msg_cgx_get_linkinfo(mbox);
> @@ -129,7 +129,7 @@ otx2_nix_dev_set_link_up(struct rte_eth_dev *eth_dev)
> struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
> int rc, i;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return -ENOTSUP;
>
> rc = nix_dev_set_link_state(eth_dev, 1);
> @@ -150,7 +150,7 @@ otx2_nix_dev_set_link_down(struct rte_eth_dev *eth_dev)
> struct otx2_eth_dev *dev = otx2_eth_pmd_priv(eth_dev);
> int i;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return -ENOTSUP;
>
> /* Stop tx queues */
> diff --git a/drivers/net/octeontx2/otx2_mac.c b/drivers/net/octeontx2/otx2_mac.c
> index b4bcc61f8..262d185e5 100644
> --- a/drivers/net/octeontx2/otx2_mac.c
> +++ b/drivers/net/octeontx2/otx2_mac.c
> @@ -15,7 +15,7 @@ otx2_cgx_mac_addr_set(struct rte_eth_dev *eth_dev, struct rte_ether_addr *addr)
> struct otx2_mbox *mbox = dev->mbox;
> int rc;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return -ENOTSUP;
>
> if (otx2_dev_active_vfs(dev))
> @@ -38,7 +38,7 @@ otx2_cgx_mac_max_entries_get(struct otx2_eth_dev *dev)
> struct otx2_mbox *mbox = dev->mbox;
> int rc;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return 0;
>
> otx2_mbox_alloc_msg_cgx_mac_max_entries_get(mbox);
> @@ -59,7 +59,7 @@ otx2_nix_mac_addr_add(struct rte_eth_dev *eth_dev, struct rte_ether_addr *addr,
> struct cgx_mac_addr_add_rsp *rsp;
> int rc;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return -ENOTSUP;
>
> if (otx2_dev_active_vfs(dev))
> @@ -89,7 +89,7 @@ otx2_nix_mac_addr_del(struct rte_eth_dev *eth_dev, uint32_t index)
> struct cgx_mac_addr_del_req *req;
> int rc;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return;
>
> req = otx2_mbox_alloc_msg_cgx_mac_addr_del(mbox);
> diff --git a/drivers/net/octeontx2/otx2_ptp.c b/drivers/net/octeontx2/otx2_ptp.c
> index fd13c2678..4cd1cc8e5 100644
> --- a/drivers/net/octeontx2/otx2_ptp.c
> +++ b/drivers/net/octeontx2/otx2_ptp.c
> @@ -104,7 +104,7 @@ nix_ptp_config(struct rte_eth_dev *eth_dev, int en)
> struct otx2_mbox *mbox = dev->mbox;
> uint8_t rc = -EINVAL;
>
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return rc;
>
> if (en) {
> @@ -168,7 +168,7 @@ otx2_nix_timesync_enable(struct rte_eth_dev *eth_dev)
> }
>
> /* If we are VF, no further action can be taken */
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return -EINVAL;
>
> if (!(dev->rx_offload_flags & NIX_RX_OFFLOAD_PTYPE_F)) {
> @@ -222,7 +222,7 @@ otx2_nix_timesync_disable(struct rte_eth_dev *eth_dev)
> }
>
> /* If we are VF, nothing else can be done */
> - if (otx2_dev_is_vf(dev))
> + if (otx2_dev_is_vf_or_sdp(dev))
> return -EINVAL;
>
> dev->rx_offloads &= ~DEV_RX_OFFLOAD_TIMESTAMP;
> diff --git a/drivers/net/octeontx2/otx2_tm.c b/drivers/net/octeontx2/otx2_tm.c
> index 12903ec1b..ba615cebc 100644
> --- a/drivers/net/octeontx2/otx2_tm.c
> +++ b/drivers/net/octeontx2/otx2_tm.c
> @@ -410,6 +410,12 @@ populate_tm_registers(struct otx2_eth_dev *dev,
> *regval++ = shaper2regval(&cir) | 1;
> req->num_regs++;
> }
> + /* Configure TL4 to send to SDP channel instead of CGX/LBK */
> + if (otx2_dev_is_sdp(dev)) {
> + *reg++ = NIX_AF_TL4X_SDP_LINK_CFG(schq);
> + *regval++ = BIT_ULL(12);
> + req->num_regs++;
> + }
>
> rc = send_tm_reqval(mbox, req);
> if (rc)
> @@ -465,9 +471,12 @@ populate_tm_registers(struct otx2_eth_dev *dev,
> else
> *regval++ = (strict_schedul_prio << 24) | rr_quantum;
> req->num_regs++;
> - *reg++ = NIX_AF_TL3_TL2X_LINKX_CFG(schq, nix_get_link(dev));
> - *regval++ = BIT_ULL(12) | nix_get_relchan(dev);
> - req->num_regs++;
> + if (!otx2_dev_is_sdp(dev)) {
> + *reg++ = NIX_AF_TL3_TL2X_LINKX_CFG(schq,
> + nix_get_link(dev));
> + *regval++ = BIT_ULL(12) | nix_get_relchan(dev);
> + req->num_regs++;
> + }
> if (pir.rate && pir.burst) {
> *reg++ = NIX_AF_TL2X_PIR(schq);
> *regval++ = shaper2regval(&pir) | 1;
> @@ -522,9 +531,6 @@ nix_tm_txsch_reg_config(struct otx2_eth_dev *dev)
> uint32_t lvl;
> int rc = 0;
>
> - if (nix_get_link(dev) == 13)
> - return -EPERM;
> -
> for (lvl = 0; lvl < (uint32_t)dev->otx2_tm_root_lvl + 1; lvl++) {
> TAILQ_FOREACH(tm_node, &dev->node_list, node) {
> if (tm_node->hw_lvl_id == lvl) {
> --
> 2.13.6
>
prev parent reply other threads:[~2019-11-06 6:46 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2019-10-30 14:08 Subrahmanyam Nilla
2019-11-06 6:45 ` Jerin Jacob [this message]
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to='CALBAE1NkdjCQ=OVVuY5McTVSD9WJh7qnvBDATV_1u3HXDL6cww@mail.gmail.com' \
--to=jerinjacobk@gmail.com \
--cc=dev@dpdk.org \
--cc=jerinj@marvell.com \
--cc=mchalla@marvell.com \
--cc=shallyv@marvell.com \
--cc=snilla@marvell.com \
--cc=venkatn@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).