On Thu, May 9, 2024 at 10:02 PM Wei Huang <wei.huang2@xxxxxxx> wrote: > > From: Manoj Panicker <manoj.panicker2@xxxxxxx> > > As a usage example, this patch implements TPH support in Broadcom BNXT > device driver by invoking pcie_tph_set_st() function when interrupt > affinity is changed. > > Reviewed-by: Ajit Khaparde <ajit.khaparde@xxxxxxxxxxxx> > Reviewed-by: Andy Gospodarek <andrew.gospodarek@xxxxxxxxxxxx> > Reviewed-by: Wei Huang <wei.huang2@xxxxxxx> > Signed-off-by: Manoj Panicker <manoj.panicker2@xxxxxxx> > --- > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 51 +++++++++++++++++++++++ > drivers/net/ethernet/broadcom/bnxt/bnxt.h | 4 ++ > 2 files changed, 55 insertions(+) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > index 2c2ee79c4d77..be9c17566fb4 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > @@ -55,6 +55,7 @@ > #include <net/page_pool/helpers.h> > #include <linux/align.h> > #include <net/netdev_queues.h> > +#include <linux/pci-tph.h> > > #include "bnxt_hsi.h" > #include "bnxt.h" > @@ -10491,6 +10492,7 @@ static void bnxt_free_irq(struct bnxt *bp) > free_cpumask_var(irq->cpu_mask); > irq->have_cpumask = 0; > } > + irq_set_affinity_notifier(irq->vector, NULL); > free_irq(irq->vector, bp->bnapi[i]); > } > > @@ -10498,6 +10500,45 @@ static void bnxt_free_irq(struct bnxt *bp) > } > } > > +static void bnxt_rtnl_lock_sp(struct bnxt *bp); > +static void bnxt_rtnl_unlock_sp(struct bnxt *bp); > +static void bnxt_irq_affinity_notify(struct irq_affinity_notify *notify, > + const cpumask_t *mask) > +{ > + struct bnxt_irq *irq; > + > + irq = container_of(notify, struct bnxt_irq, affinity_notify); > + cpumask_copy(irq->cpu_mask, mask); > + > + if (!pcie_tph_set_st(irq->bp->pdev, irq->msix_nr, > + cpumask_first(irq->cpu_mask), > + TPH_MEM_TYPE_VM, PCI_TPH_REQ_TPH_ONLY)) > + pr_err("error in configuring steering tag\n"); > + > + if (netif_running(irq->bp->dev)) { > + rtnl_lock(); > + bnxt_close_nic(irq->bp, false, false); > + bnxt_open_nic(irq->bp, false, false); > + rtnl_unlock(); > + } > +} > + > +static void bnxt_irq_affinity_release(struct kref __always_unused *ref) > +{ > +} > + > +static inline void __bnxt_register_notify_irqchanges(struct bnxt_irq *irq) > +{ > + struct irq_affinity_notify *notify; > + > + notify = &irq->affinity_notify; > + notify->irq = irq->vector; > + notify->notify = bnxt_irq_affinity_notify; > + notify->release = bnxt_irq_affinity_release; > + > + irq_set_affinity_notifier(irq->vector, notify); > +} > + > static int bnxt_request_irq(struct bnxt *bp) > { > int i, j, rc = 0; > @@ -10543,6 +10584,7 @@ static int bnxt_request_irq(struct bnxt *bp) > int numa_node = dev_to_node(&bp->pdev->dev); > > irq->have_cpumask = 1; > + irq->msix_nr = map_idx; > cpumask_set_cpu(cpumask_local_spread(i, numa_node), > irq->cpu_mask); > rc = irq_set_affinity_hint(irq->vector, irq->cpu_mask); > @@ -10552,6 +10594,15 @@ static int bnxt_request_irq(struct bnxt *bp) > irq->vector); > break; > } > + > + if (!pcie_tph_set_st(bp->pdev, i, > + cpumask_first(irq->cpu_mask), > + TPH_MEM_TYPE_VM, PCI_TPH_REQ_TPH_ONLY)) { > + netdev_err(bp->dev, "error in setting steering tag\n"); > + } else { > + irq->bp = bp; > + __bnxt_register_notify_irqchanges(irq); > + } > } > } > return rc; > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h > index dd849e715c9b..0d3442590bb4 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h > @@ -1195,6 +1195,10 @@ struct bnxt_irq { > u8 have_cpumask:1; > char name[IFNAMSIZ + 2]; > cpumask_var_t cpu_mask; > + > + int msix_nr; > + struct bnxt *bp; > + struct irq_affinity_notify affinity_notify; > }; > > #define HWRM_RING_ALLOC_TX 0x1 > -- > 2.44.0 > > Reviewed-by: Somnath Kotur <somnath.kotur@xxxxxxxxxxxx>
Attachment:
smime.p7s
Description: S/MIME Cryptographic Signature