Commit 8a6286c1 authored by Jiri Pirko's avatar Jiri Pirko Committed by Jakub Kicinski

dpll: expose fractional frequency offset value to user

Add a new netlink attribute to expose fractional frequency offset value
for a pin. Add an op to get the value from the driver.
Signed-off-by: default avatarJiri Pirko <jiri@nvidia.com>
Acked-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Acked-by: default avatarArkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
Link: https://lore.kernel.org/r/20240103132838.1501801-2-jiri@resnulli.usSigned-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 82e7b22f
...@@ -296,6 +296,16 @@ attribute-sets: ...@@ -296,6 +296,16 @@ attribute-sets:
- -
name: phase-offset name: phase-offset
type: s64 type: s64
-
name: fractional-frequency-offset
type: sint
doc: |
The FFO (Fractional Frequency Offset) between the RX and TX
symbol rate on the media associated with the pin:
(rx_frequency-tx_frequency)/rx_frequency
Value is in PPM (parts per million).
This may be implemented for example for pin of type
PIN_TYPE_SYNCE_ETH_PORT.
- -
name: pin-parent-device name: pin-parent-device
subset-of: pin subset-of: pin
...@@ -460,6 +470,7 @@ operations: ...@@ -460,6 +470,7 @@ operations:
- phase-adjust-min - phase-adjust-min
- phase-adjust-max - phase-adjust-max
- phase-adjust - phase-adjust
- fractional-frequency-offset
dump: dump:
pre: dpll-lock-dumpit pre: dpll-lock-dumpit
......
...@@ -263,6 +263,27 @@ dpll_msg_add_phase_offset(struct sk_buff *msg, struct dpll_pin *pin, ...@@ -263,6 +263,27 @@ dpll_msg_add_phase_offset(struct sk_buff *msg, struct dpll_pin *pin,
return 0; return 0;
} }
static int dpll_msg_add_ffo(struct sk_buff *msg, struct dpll_pin *pin,
struct dpll_pin_ref *ref,
struct netlink_ext_ack *extack)
{
const struct dpll_pin_ops *ops = dpll_pin_ops(ref);
struct dpll_device *dpll = ref->dpll;
s64 ffo;
int ret;
if (!ops->ffo_get)
return 0;
ret = ops->ffo_get(pin, dpll_pin_on_dpll_priv(dpll, pin),
dpll, dpll_priv(dpll), &ffo, extack);
if (ret) {
if (ret == -ENODATA)
return 0;
return ret;
}
return nla_put_sint(msg, DPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET, ffo);
}
static int static int
dpll_msg_add_pin_freq(struct sk_buff *msg, struct dpll_pin *pin, dpll_msg_add_pin_freq(struct sk_buff *msg, struct dpll_pin *pin,
struct dpll_pin_ref *ref, struct netlink_ext_ack *extack) struct dpll_pin_ref *ref, struct netlink_ext_ack *extack)
...@@ -440,6 +461,9 @@ dpll_cmd_pin_get_one(struct sk_buff *msg, struct dpll_pin *pin, ...@@ -440,6 +461,9 @@ dpll_cmd_pin_get_one(struct sk_buff *msg, struct dpll_pin *pin,
prop->phase_range.max)) prop->phase_range.max))
return -EMSGSIZE; return -EMSGSIZE;
ret = dpll_msg_add_pin_phase_adjust(msg, pin, ref, extack); ret = dpll_msg_add_pin_phase_adjust(msg, pin, ref, extack);
if (ret)
return ret;
ret = dpll_msg_add_ffo(msg, pin, ref, extack);
if (ret) if (ret)
return ret; return ret;
if (xa_empty(&pin->parent_refs)) if (xa_empty(&pin->parent_refs))
......
...@@ -77,6 +77,9 @@ struct dpll_pin_ops { ...@@ -77,6 +77,9 @@ struct dpll_pin_ops {
const struct dpll_device *dpll, void *dpll_priv, const struct dpll_device *dpll, void *dpll_priv,
const s32 phase_adjust, const s32 phase_adjust,
struct netlink_ext_ack *extack); struct netlink_ext_ack *extack);
int (*ffo_get)(const struct dpll_pin *pin, void *pin_priv,
const struct dpll_device *dpll, void *dpll_priv,
s64 *ffo, struct netlink_ext_ack *extack);
}; };
struct dpll_pin_frequency { struct dpll_pin_frequency {
......
...@@ -179,6 +179,7 @@ enum dpll_a_pin { ...@@ -179,6 +179,7 @@ enum dpll_a_pin {
DPLL_A_PIN_PHASE_ADJUST_MAX, DPLL_A_PIN_PHASE_ADJUST_MAX,
DPLL_A_PIN_PHASE_ADJUST, DPLL_A_PIN_PHASE_ADJUST,
DPLL_A_PIN_PHASE_OFFSET, DPLL_A_PIN_PHASE_OFFSET,
DPLL_A_PIN_FRACTIONAL_FREQUENCY_OFFSET,
__DPLL_A_PIN_MAX, __DPLL_A_PIN_MAX,
DPLL_A_PIN_MAX = (__DPLL_A_PIN_MAX - 1) DPLL_A_PIN_MAX = (__DPLL_A_PIN_MAX - 1)
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment