From: Jiri Pirko <jiri@resnulli.us>
To: netdev@vger.kernel.org
Cc: davem@davemloft.net, edumazet@google.com, kuba@kernel.org,
pabeni@redhat.com, donald.hunter@gmail.com,
vadim.fedorenko@linux.dev, arkadiusz.kubalewski@intel.com,
saeedm@nvidia.com, leon@kernel.org, tariqt@nvidia.com
Subject: [PATCH net-next 2/2] net/mlx5: DPLL, Add clock quality level op implementation
Date: Wed, 9 Oct 2024 14:25:47 +0200 [thread overview]
Message-ID: <20241009122547.296829-3-jiri@resnulli.us> (raw)
In-Reply-To: <20241009122547.296829-1-jiri@resnulli.us>
From: Jiri Pirko <jiri@nvidia.com>
Use MSECQ register to query clock quality from firmware. Implement the
dpll op and fill-up the quality level value properly.
Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
.../net/ethernet/mellanox/mlx5/core/dpll.c | 82 +++++++++++++++++++
1 file changed, 82 insertions(+)
diff --git a/drivers/net/ethernet/mellanox/mlx5/core/dpll.c b/drivers/net/ethernet/mellanox/mlx5/core/dpll.c
index 904e08de852e..3b901b47903c 100644
--- a/drivers/net/ethernet/mellanox/mlx5/core/dpll.c
+++ b/drivers/net/ethernet/mellanox/mlx5/core/dpll.c
@@ -166,9 +166,91 @@ static int mlx5_dpll_device_mode_get(const struct dpll_device *dpll,
return 0;
}
+enum {
+ MLX5_DPLL_SSM_CODE_PRC = 0b0010,
+ MLX5_DPLL_SSM_CODE_SSU_A = 0b0100,
+ MLX5_DPLL_SSM_CODE_SSU_B = 0b1000,
+ MLX5_DPLL_SSM_CODE_EEC1 = 0b1011,
+ MLX5_DPLL_SSM_CODE_PRTC = 0b0010,
+ MLX5_DPLL_SSM_CODE_EPRTC = 0b0010,
+ MLX5_DPLL_SSM_CODE_EEEC = 0b1011,
+ MLX5_DPLL_SSM_CODE_EPRC = 0b0010,
+};
+
+enum {
+ MLX5_DPLL_ENHANCED_SSM_CODE_PRC = 0xff,
+ MLX5_DPLL_ENHANCED_SSM_CODE_SSU_A = 0xff,
+ MLX5_DPLL_ENHANCED_SSM_CODE_SSU_B = 0xff,
+ MLX5_DPLL_ENHANCED_SSM_CODE_EEC1 = 0xff,
+ MLX5_DPLL_ENHANCED_SSM_CODE_PRTC = 0x20,
+ MLX5_DPLL_ENHANCED_SSM_CODE_EPRTC = 0x21,
+ MLX5_DPLL_ENHANCED_SSM_CODE_EEEC = 0x22,
+ MLX5_DPLL_ENHANCED_SSM_CODE_EPRC = 0x23,
+};
+
+#define __MLX5_DPLL_SSM_COMBINED_CODE(ssm_code, enhanced_ssm_code) \
+ ((ssm_code) | ((enhanced_ssm_code) << 8))
+
+#define MLX5_DPLL_SSM_COMBINED_CODE(type) \
+ __MLX5_DPLL_SSM_COMBINED_CODE(MLX5_DPLL_SSM_CODE_##type, \
+ MLX5_DPLL_ENHANCED_SSM_CODE_##type)
+
+static int mlx5_dpll_clock_quality_level_get(const struct dpll_device *dpll,
+ void *priv,
+ enum dpll_clock_quality_level *ql,
+ struct netlink_ext_ack *extack)
+{
+ u8 network_option, ssm_code, enhanced_ssm_code;
+ u32 out[MLX5_ST_SZ_DW(msecq_reg)] = {};
+ u32 in[MLX5_ST_SZ_DW(msecq_reg)] = {};
+ struct mlx5_dpll *mdpll = priv;
+ int err;
+
+ err = mlx5_core_access_reg(mdpll->mdev, in, sizeof(in),
+ out, sizeof(out), MLX5_REG_MSECQ, 0, 0);
+ if (err)
+ return err;
+ network_option = MLX5_GET(msecq_reg, out, network_option);
+ if (network_option != 1)
+ goto errout;
+ ssm_code = MLX5_GET(msecq_reg, out, local_ssm_code);
+ enhanced_ssm_code = MLX5_GET(msecq_reg, out, local_enhanced_ssm_code);
+
+ switch (__MLX5_DPLL_SSM_COMBINED_CODE(ssm_code, enhanced_ssm_code)) {
+ case MLX5_DPLL_SSM_COMBINED_CODE(PRC):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_PRC;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(SSU_A):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_SSU_A;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(SSU_B):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_SSU_B;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(EEC1):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_EEC1;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(PRTC):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_PRTC;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(EPRTC):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_EPRTC;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(EEEC):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_EEEC;
+ return 0;
+ case MLX5_DPLL_SSM_COMBINED_CODE(EPRC):
+ *ql = DPLL_CLOCK_QUALITY_LEVEL_EPRC;
+ return 0;
+ }
+errout:
+ NL_SET_ERR_MSG_MOD(extack, "Invalid clock quality level obtained from firmware\n");
+ return -EINVAL;
+}
+
static const struct dpll_device_ops mlx5_dpll_device_ops = {
.lock_status_get = mlx5_dpll_device_lock_status_get,
.mode_get = mlx5_dpll_device_mode_get,
+ .clock_quality_level_get = mlx5_dpll_clock_quality_level_get,
};
static int mlx5_dpll_pin_direction_get(const struct dpll_pin *pin,
--
2.46.1
prev parent reply other threads:[~2024-10-09 12:26 UTC|newest]
Thread overview: 16+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-10-09 12:25 [PATCH net-next 0/2] dpll: expose clock quality level Jiri Pirko
2024-10-09 12:25 ` [PATCH net-next 1/2] dpll: add clock quality level attribute and op Jiri Pirko
2024-10-09 13:33 ` Vadim Fedorenko
2024-10-09 13:39 ` Jiri Pirko
2024-10-09 13:38 ` Kubalewski, Arkadiusz
2024-10-09 14:06 ` Jiri Pirko
2024-10-10 9:53 ` Kubalewski, Arkadiusz
2024-10-10 11:36 ` Jiri Pirko
2024-10-10 13:48 ` Kubalewski, Arkadiusz
2024-10-10 14:36 ` Jiri Pirko
2024-10-10 16:02 ` Kubalewski, Arkadiusz
2024-10-11 6:45 ` Jiri Pirko
2024-10-11 14:25 ` Kubalewski, Arkadiusz
2024-10-11 15:57 ` Jiri Pirko
2024-10-11 19:50 ` Kubalewski, Arkadiusz
2024-10-09 12:25 ` Jiri Pirko [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=20241009122547.296829-3-jiri@resnulli.us \
--to=jiri@resnulli.us \
--cc=arkadiusz.kubalewski@intel.com \
--cc=davem@davemloft.net \
--cc=donald.hunter@gmail.com \
--cc=edumazet@google.com \
--cc=kuba@kernel.org \
--cc=leon@kernel.org \
--cc=netdev@vger.kernel.org \
--cc=pabeni@redhat.com \
--cc=saeedm@nvidia.com \
--cc=tariqt@nvidia.com \
--cc=vadim.fedorenko@linux.dev \
/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