Commit a680581f authored by Ivan Vecera's avatar Ivan Vecera Committed by Jakub Kicinski
Browse files

dpll: add phase-offset-avg-factor device attribute to netlink spec



Add dpll device level attribute DPLL_A_PHASE_OFFSET_AVG_FACTOR to allow
control over a calculation of reported phase offset value. Attribute is
present, if the driver provides such capability, otherwise attribute
shall not be present.

Signed-off-by: default avatarIvan Vecera <ivecera@redhat.com>
Reviewed-by: default avatarVadim Fedorenko <vadim.fedorenko@linux.dev>
Link: https://patch.msgid.link/20250927084912.2343597-2-ivecera@redhat.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 377ea331
Loading
Loading
Loading
Loading
+17 −1
Original line number Diff line number Diff line
@@ -179,7 +179,23 @@ Phase offset measurement and adjustment
Device may provide ability to measure a phase difference between signals
on a pin and its parent dpll device. If pin-dpll phase offset measurement
is supported, it shall be provided with ``DPLL_A_PIN_PHASE_OFFSET``
attribute for each parent dpll device.
attribute for each parent dpll device. The reported phase offset may be
computed as the average of prior values and the current measurement, using
the following formula:

.. math::
   curr\_avg = prev\_avg * \frac{2^N-1}{2^N} + new\_val * \frac{1}{2^N}

where `curr_avg` is the current reported phase offset, `prev_avg` is the
previously reported value, `new_val` is the current measurement, and `N` is
the averaging factor. Configured averaging factor value is provided with
``DPLL_A_PHASE_OFFSET_AVG_FACTOR`` attribute of a device and value change can
be requested with the same attribute with ``DPLL_CMD_DEVICE_SET`` command.

  ================================== ======================================
  ``DPLL_A_PHASE_OFFSET_AVG_FACTOR`` attr configured value of phase offset
                                     averaging factor
  ================================== ======================================

Device may also provide ability to adjust a signal phase on a pin.
If pin phase adjustment is supported, minimal and maximal values that pin
+6 −0
Original line number Diff line number Diff line
@@ -315,6 +315,10 @@ attribute-sets:
          If enabled, dpll device shall monitor and notify all currently
          available inputs for changes of their phase offset against the
          dpll device.
      -
        name: phase-offset-avg-factor
        type: u32
        doc: Averaging factor applied to calculation of reported phase offset.
  -
    name: pin
    enum-name: dpll_a_pin
@@ -523,6 +527,7 @@ operations:
            - clock-id
            - type
            - phase-offset-monitor
            - phase-offset-avg-factor

      dump:
        reply: *dev-attrs
@@ -540,6 +545,7 @@ operations:
          attributes:
            - id
            - phase-offset-monitor
            - phase-offset-avg-factor
    -
      name: device-create-ntf
      doc: Notification about device appearing
+3 −2
Original line number Diff line number Diff line
@@ -42,9 +42,10 @@ static const struct nla_policy dpll_device_get_nl_policy[DPLL_A_ID + 1] = {
};

/* DPLL_CMD_DEVICE_SET - do */
static const struct nla_policy dpll_device_set_nl_policy[DPLL_A_PHASE_OFFSET_MONITOR + 1] = {
static const struct nla_policy dpll_device_set_nl_policy[DPLL_A_PHASE_OFFSET_AVG_FACTOR + 1] = {
	[DPLL_A_ID] = { .type = NLA_U32, },
	[DPLL_A_PHASE_OFFSET_MONITOR] = NLA_POLICY_MAX(NLA_U32, 1),
	[DPLL_A_PHASE_OFFSET_AVG_FACTOR] = { .type = NLA_U32, },
};

/* DPLL_CMD_PIN_ID_GET - do */
@@ -112,7 +113,7 @@ static const struct genl_split_ops dpll_nl_ops[] = {
		.doit		= dpll_nl_device_set_doit,
		.post_doit	= dpll_post_doit,
		.policy		= dpll_device_set_nl_policy,
		.maxattr	= DPLL_A_PHASE_OFFSET_MONITOR,
		.maxattr	= DPLL_A_PHASE_OFFSET_AVG_FACTOR,
		.flags		= GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
	},
	{
+1 −0
Original line number Diff line number Diff line
@@ -216,6 +216,7 @@ enum dpll_a {
	DPLL_A_LOCK_STATUS_ERROR,
	DPLL_A_CLOCK_QUALITY_LEVEL,
	DPLL_A_PHASE_OFFSET_MONITOR,
	DPLL_A_PHASE_OFFSET_AVG_FACTOR,

	__DPLL_A_MAX,
	DPLL_A_MAX = (__DPLL_A_MAX - 1)