From: Wei Fang <wei.fang@nxp.com>
To: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, robh@kernel.org, krzk+dt@kernel.org,
conor+dt@kernel.org, vladimir.oltean@nxp.com,
claudiu.manoil@nxp.com, xiaoning.wang@nxp.com, Frank.Li@nxp.com,
christophe.leroy@csgroup.eu, linux@armlinux.org.uk,
bhelgaas@google.com
Cc: imx@lists.linux.dev, netdev@vger.kernel.org,
devicetree@vger.kernel.org, linux-kernel@vger.kernel.org,
linux-pci@vger.kernel.org
Subject: [PATCH net-next 06/11] net: enetc: only enable ERR050089 workaround on LS1028A
Date: Wed, 9 Oct 2024 17:51:11 +0800 [thread overview]
Message-ID: <20241009095116.147412-7-wei.fang@nxp.com> (raw)
In-Reply-To: <20241009095116.147412-1-wei.fang@nxp.com>
From: Vladimir Oltean <vladimir.oltean@nxp.com>
There are performance issues associated with the ERR050089 workaround,
as well as potential functional issues (RCU stalls) under certain
workloads. There is no reason why new SoCs like i.MX95 should even do
anything in enetc_lock_mdio() and enetc_unlock_mdio(), so just use a
static key so that they're compiled out at runtime.
Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
Signed-off-by: Wei Fang <wei.fang@nxp.com>
---
.../net/ethernet/freescale/enetc/enetc_hw.h | 34 +++++++++++++------
.../ethernet/freescale/enetc/enetc_pci_mdio.c | 17 ++++++++++
2 files changed, 41 insertions(+), 10 deletions(-)
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_hw.h b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
index 1619943fb263..6a7b9b75d660 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_hw.h
+++ b/drivers/net/ethernet/freescale/enetc/enetc_hw.h
@@ -396,18 +396,22 @@ struct enetc_hw {
*/
extern rwlock_t enetc_mdio_lock;
+DECLARE_STATIC_KEY_FALSE(enetc_has_err050089);
+
/* use this locking primitive only on the fast datapath to
* group together multiple non-MDIO register accesses to
* minimize the overhead of the lock
*/
static inline void enetc_lock_mdio(void)
{
- read_lock(&enetc_mdio_lock);
+ if (static_branch_unlikely(&enetc_has_err050089))
+ read_lock(&enetc_mdio_lock);
}
static inline void enetc_unlock_mdio(void)
{
- read_unlock(&enetc_mdio_lock);
+ if (static_branch_unlikely(&enetc_has_err050089))
+ read_unlock(&enetc_mdio_lock);
}
/* use these accessors only on the fast datapath under
@@ -416,14 +420,16 @@ static inline void enetc_unlock_mdio(void)
*/
static inline u32 enetc_rd_reg_hot(void __iomem *reg)
{
- lockdep_assert_held(&enetc_mdio_lock);
+ if (static_branch_unlikely(&enetc_has_err050089))
+ lockdep_assert_held(&enetc_mdio_lock);
return ioread32(reg);
}
static inline void enetc_wr_reg_hot(void __iomem *reg, u32 val)
{
- lockdep_assert_held(&enetc_mdio_lock);
+ if (static_branch_unlikely(&enetc_has_err050089))
+ lockdep_assert_held(&enetc_mdio_lock);
iowrite32(val, reg);
}
@@ -452,9 +458,13 @@ static inline u32 _enetc_rd_mdio_reg_wa(void __iomem *reg)
unsigned long flags;
u32 val;
- write_lock_irqsave(&enetc_mdio_lock, flags);
- val = ioread32(reg);
- write_unlock_irqrestore(&enetc_mdio_lock, flags);
+ if (static_branch_unlikely(&enetc_has_err050089)) {
+ write_lock_irqsave(&enetc_mdio_lock, flags);
+ val = ioread32(reg);
+ write_unlock_irqrestore(&enetc_mdio_lock, flags);
+ } else {
+ val = ioread32(reg);
+ }
return val;
}
@@ -463,9 +473,13 @@ static inline void _enetc_wr_mdio_reg_wa(void __iomem *reg, u32 val)
{
unsigned long flags;
- write_lock_irqsave(&enetc_mdio_lock, flags);
- iowrite32(val, reg);
- write_unlock_irqrestore(&enetc_mdio_lock, flags);
+ if (static_branch_unlikely(&enetc_has_err050089)) {
+ write_lock_irqsave(&enetc_mdio_lock, flags);
+ iowrite32(val, reg);
+ write_unlock_irqrestore(&enetc_mdio_lock, flags);
+ } else {
+ iowrite32(val, reg);
+ }
}
#ifdef ioread64
diff --git a/drivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c b/drivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c
index a1b595bd7993..2445e35a764a 100644
--- a/drivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c
+++ b/drivers/net/ethernet/freescale/enetc/enetc_pci_mdio.c
@@ -9,6 +9,9 @@
#define ENETC_MDIO_BUS_NAME ENETC_MDIO_DEV_NAME " Bus"
#define ENETC_MDIO_DRV_NAME ENETC_MDIO_DEV_NAME " driver"
+DEFINE_STATIC_KEY_FALSE(enetc_has_err050089);
+EXPORT_SYMBOL_GPL(enetc_has_err050089);
+
static int enetc_pci_mdio_probe(struct pci_dev *pdev,
const struct pci_device_id *ent)
{
@@ -62,6 +65,12 @@ static int enetc_pci_mdio_probe(struct pci_dev *pdev,
goto err_pci_mem_reg;
}
+ if (pdev->vendor == PCI_VENDOR_ID_FREESCALE &&
+ pdev->device == ENETC_MDIO_DEV_ID) {
+ static_branch_inc(&enetc_has_err050089);
+ dev_info(&pdev->dev, "Enabled ERR050089 workaround\n");
+ }
+
err = of_mdiobus_register(bus, dev->of_node);
if (err)
goto err_mdiobus_reg;
@@ -88,6 +97,14 @@ static void enetc_pci_mdio_remove(struct pci_dev *pdev)
struct enetc_mdio_priv *mdio_priv;
mdiobus_unregister(bus);
+
+ if (pdev->vendor == PCI_VENDOR_ID_FREESCALE &&
+ pdev->device == ENETC_MDIO_DEV_ID) {
+ static_branch_dec(&enetc_has_err050089);
+ if (!static_key_enabled(&enetc_has_err050089.key))
+ dev_info(&pdev->dev, "Disabled ERR050089 workaround\n");
+ }
+
mdio_priv = bus->priv;
iounmap(mdio_priv->hw->port);
pci_release_region(pdev, 0);
--
2.34.1
next prev parent reply other threads:[~2024-10-09 10:06 UTC|newest]
Thread overview: 45+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-09 9:51 [PATCH net-next 00/11] add basic support for i.MX95 NETC Wei Fang
2024-10-09 9:51 ` [PATCH net-next 01/11] dt-bindings: net: add compatible string for i.MX95 EMDIO Wei Fang
2024-10-09 16:26 ` Frank Li
2024-10-10 1:42 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 02/11] dt-bindings: net: add i.MX95 ENETC support Wei Fang
2024-10-09 16:29 ` Frank Li
2024-10-09 20:53 ` Rob Herring
2024-10-10 2:14 ` Wei Fang
2024-10-10 15:16 ` Frank Li
2024-10-11 1:56 ` Wei Fang
2024-10-10 2:00 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 03/11] dt-bindings: net: add bindings for NETC blocks control Wei Fang
2024-10-09 16:36 ` Frank Li
2024-10-10 2:10 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 04/11] net: enetc: add initial netc-blk-ctrl driver support Wei Fang
2024-10-09 17:02 ` Frank Li
2024-10-10 2:31 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 05/11] net: enetc: add enetc-pf-common " Wei Fang
2024-10-09 17:16 ` Frank Li
2024-10-10 3:19 ` Wei Fang
2024-10-10 14:16 ` kernel test robot
2024-10-10 17:10 ` kernel test robot
2024-10-13 2:27 ` kernel test robot
2024-10-09 9:51 ` Wei Fang [this message]
2024-10-09 9:51 ` [PATCH net-next 07/11] PCI: Add NXP NETC vendor ID and device IDs Wei Fang
2024-10-10 19:34 ` Bjorn Helgaas
2024-10-11 2:06 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 08/11] net: enetc: add i.MX95 EMDIO support Wei Fang
2024-10-09 9:51 ` [PATCH net-next 09/11] net: enetc: optimize the allocation of tx_bdr Wei Fang
2024-10-09 17:25 ` Frank Li
2024-10-10 3:25 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 10/11] net: enetc: add preliminary support for i.MX95 ENETC PF Wei Fang
2024-10-09 17:41 ` Frank Li
2024-10-10 4:59 ` Wei Fang
2024-10-10 15:22 ` Frank Li
2024-10-11 2:02 ` Wei Fang
2024-10-11 4:11 ` Frank Li
2024-10-11 7:16 ` Wei Fang
2024-10-14 9:06 ` Simon Horman
2024-10-14 9:13 ` Wei Fang
2024-10-09 9:51 ` [PATCH net-next 11/11] MAINTAINERS: update ENETC driver files and maintainers Wei Fang
2024-10-10 19:20 ` Frank Li
2024-10-11 2:05 ` Wei Fang
2024-10-11 4:13 ` Frank Li
2024-10-11 7:29 ` Wei Fang
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=20241009095116.147412-7-wei.fang@nxp.com \
--to=wei.fang@nxp.com \
--cc=Frank.Li@nxp.com \
--cc=bhelgaas@google.com \
--cc=christophe.leroy@csgroup.eu \
--cc=claudiu.manoil@nxp.com \
--cc=conor+dt@kernel.org \
--cc=davem@davemloft.net \
--cc=devicetree@vger.kernel.org \
--cc=edumazet@google.com \
--cc=imx@lists.linux.dev \
--cc=krzk+dt@kernel.org \
--cc=kuba@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-pci@vger.kernel.org \
--cc=linux@armlinux.org.uk \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=robh@kernel.org \
--cc=vladimir.oltean@nxp.com \
--cc=xiaoning.wang@nxp.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).