diff mbox series

[net-next,v3,1/2] dpll: add clock quality level attribute and op

Message ID 20241014081133.15366-2-jiri@resnulli.us (mailing list archive)
State Changes Requested
Delegated to: Netdev Maintainers
Headers show
Series dpll: expose clock quality level | expand

Checks

Context Check Description
netdev/series_format success Posting correctly formatted
netdev/tree_selection success Clearly marked for net-next
netdev/ynl success Generated files up to date; no warnings/errors; GEN HAS DIFF 2 files changed, 20 insertions(+);
netdev/fixes_present success Fixes tag not required for -next series
netdev/header_inline success No static functions without inline keyword in header files
netdev/build_32bit success Errors and warnings before: 5 this patch: 5
netdev/build_tools success Errors and warnings before: 0 (+1) this patch: 0 (+1)
netdev/cc_maintainers success CCed 8 of 8 maintainers
netdev/build_clang success Errors and warnings before: 3 this patch: 3
netdev/verify_signedoff success Signed-off-by tag matches author and committer
netdev/deprecated_api success None detected
netdev/check_selftest success No net selftest shell script
netdev/verify_fixes success No Fixes tag
netdev/build_allmodconfig_warn success Errors and warnings before: 6 this patch: 6
netdev/checkpatch success total: 0 errors, 0 warnings, 0 checks, 129 lines checked
netdev/build_clang_rust success No Rust files in patch. Skipping build
netdev/kdoc fail Errors and warnings before: 0 this patch: 8
netdev/source_inline success Was 0 now: 0

Commit Message

Jiri Pirko Oct. 14, 2024, 8:11 a.m. UTC
From: Jiri Pirko <jiri@nvidia.com>

In order to allow driver expose quality level of the clock it is
running, introduce a new netlink attr with enum to carry it to the
userspace. Also, introduce an op the dpll netlink code calls into the
driver to obtain the value.

Signed-off-by: Jiri Pirko <jiri@nvidia.com>
---
v2->v3:
- changed "itu" prefix to "itu-opt1"
- changed driver op to pass bitmap to allow to set multiple qualities
  and pass it to user over multiple attrs
- enhanced the documentation a bit
v1->v2:
- extended quality enum documentation
- added "itu" prefix to the enum values
---
 Documentation/netlink/specs/dpll.yaml | 35 +++++++++++++++++++++++++++
 drivers/dpll/dpll_netlink.c           | 24 ++++++++++++++++++
 include/linux/dpll.h                  |  4 +++
 include/uapi/linux/dpll.h             | 24 ++++++++++++++++++
 4 files changed, 87 insertions(+)

Comments

Arkadiusz Kubalewski Oct. 14, 2024, 8:54 a.m. UTC | #1
>From: Jiri Pirko <jiri@resnulli.us>
>Sent: Monday, October 14, 2024 10:12 AM
>To: netdev@vger.kernel.org
>
>From: Jiri Pirko <jiri@nvidia.com>
>
>In order to allow driver expose quality level of the clock it is
>running, introduce a new netlink attr with enum to carry it to the
>userspace. Also, introduce an op the dpll netlink code calls into the
>driver to obtain the value.
>
>Signed-off-by: Jiri Pirko <jiri@nvidia.com>
>---
>v2->v3:
>- changed "itu" prefix to "itu-opt1"
>- changed driver op to pass bitmap to allow to set multiple qualities
>  and pass it to user over multiple attrs
>- enhanced the documentation a bit
>v1->v2:
>- extended quality enum documentation
>- added "itu" prefix to the enum values
>---
> Documentation/netlink/specs/dpll.yaml | 35 +++++++++++++++++++++++++++
> drivers/dpll/dpll_netlink.c           | 24 ++++++++++++++++++
> include/linux/dpll.h                  |  4 +++
> include/uapi/linux/dpll.h             | 24 ++++++++++++++++++
> 4 files changed, 87 insertions(+)
>
>diff --git a/Documentation/netlink/specs/dpll.yaml
>b/Documentation/netlink/specs/dpll.yaml
>index f2894ca35de8..0bd708e136ff 100644
>--- a/Documentation/netlink/specs/dpll.yaml
>+++ b/Documentation/netlink/specs/dpll.yaml
>@@ -85,6 +85,36 @@ definitions:
>           This may happen for example if dpll device was previously
>           locked on an input pin of type PIN_TYPE_SYNCE_ETH_PORT.
>     render-max: true
>+  -
>+    type: enum
>+    name: clock-quality-level
>+    doc: |
>+      level of quality of a clock device. This mainly applies when
>+      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>+      The current list is defined according to the table 11-7 contained
>+      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>+      by other ITU-T defined clock qualities, or different ones defined
>+      by another standardization body (for those, please use
>+      different prefix).
>+    entries:
>+      -
>+        name: itu-opt1-prc
>+        value: 1
>+      -
>+        name: itu-opt1-ssu-a
>+      -
>+        name: itu-opt1-ssu-b
>+      -
>+        name: itu-opt1-eec1
>+      -
>+        name: itu-opt1-prtc
>+      -
>+        name: itu-opt1-eprtc
>+      -
>+        name: itu-opt1-eeec
>+      -
>+        name: itu-opt1-eprc
>+    render-max: true
>   -
>     type: const
>     name: temp-divider
>@@ -252,6 +282,11 @@ attribute-sets:
>         name: lock-status-error
>         type: u32
>         enum: lock-status-error
>+      -
>+        name: clock-quality-level
>+        type: u32
>+        enum: clock-quality-level
>+        multi-attr: true
>   -
>     name: pin
>     enum-name: dpll_a_pin
>diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c
>index fc0280dcddd1..c130f87147fa 100644
>--- a/drivers/dpll/dpll_netlink.c
>+++ b/drivers/dpll/dpll_netlink.c
>@@ -169,6 +169,27 @@ dpll_msg_add_temp(struct sk_buff *msg, struct dpll_device
>*dpll,
> 	return 0;
> }
>
>+static int
>+dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device
>*dpll,
>+				 struct netlink_ext_ack *extack)
>+{
>+	const struct dpll_device_ops *ops = dpll_device_ops(dpll);
>+	DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 };
>+	enum dpll_clock_quality_level ql;
>+	int ret;
>+
>+	if (!ops->clock_quality_level_get)
>+		return 0;
>+	ret = ops->clock_quality_level_get(dpll, dpll_priv(dpll), qls, extack);
>+	if (ret)
>+		return ret;
>+	for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX)
>+		if (nla_put_u32(msg, DPLL_A_CLOCK_QUALITY_LEVEL, ql))
>+			return -EMSGSIZE;
>+
>+	return 0;
>+}
>+
> static int
> dpll_msg_add_pin_prio(struct sk_buff *msg, struct dpll_pin *pin,
> 		      struct dpll_pin_ref *ref,
>@@ -557,6 +578,9 @@ dpll_device_get_one(struct dpll_device *dpll, struct
>sk_buff *msg,
> 	if (ret)
> 		return ret;
> 	ret = dpll_msg_add_lock_status(msg, dpll, extack);
>+	if (ret)
>+		return ret;
>+	ret = dpll_msg_add_clock_quality_level(msg, dpll, extack);
> 	if (ret)
> 		return ret;
> 	ret = dpll_msg_add_mode(msg, dpll, extack);
>diff --git a/include/linux/dpll.h b/include/linux/dpll.h
>index 81f7b623d0ba..5e4f9ab1cf75 100644
>--- a/include/linux/dpll.h
>+++ b/include/linux/dpll.h
>@@ -26,6 +26,10 @@ struct dpll_device_ops {
> 			       struct netlink_ext_ack *extack);
> 	int (*temp_get)(const struct dpll_device *dpll, void *dpll_priv,
> 			s32 *temp, struct netlink_ext_ack *extack);
>+	int (*clock_quality_level_get)(const struct dpll_device *dpll,
>+				       void *dpll_priv,
>+				       unsigned long *qls,
>+				       struct netlink_ext_ack *extack);
> };
>
> struct dpll_pin_ops {
>diff --git a/include/uapi/linux/dpll.h b/include/uapi/linux/dpll.h
>index b0654ade7b7e..4b37542eace3 100644
>--- a/include/uapi/linux/dpll.h
>+++ b/include/uapi/linux/dpll.h
>@@ -79,6 +79,29 @@ enum dpll_lock_status_error {
> 	DPLL_LOCK_STATUS_ERROR_MAX = (__DPLL_LOCK_STATUS_ERROR_MAX - 1)
> };
>
>+/**
>+ * enum dpll_clock_quality_level - level of quality of a clock device. This
>+ *   mainly applies when the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>+ *   The current list is defined according to the table 11-7 contained in
>ITU-T
>+ *   G.8264/Y.1364 document. One may extend this list freely by other ITU-T
>+ *   defined clock qualities, or different ones defined by another
>+ *   standardization body (for those, please use different prefix).
>+ */
>+enum dpll_clock_quality_level {
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_PRC = 1,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_SSU_A,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_SSU_B,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EEC1,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_PRTC,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRTC,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EEEC,
>+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRC,
>+
>+	/* private: */
>+	__DPLL_CLOCK_QUALITY_LEVEL_MAX,
>+	DPLL_CLOCK_QUALITY_LEVEL_MAX = (__DPLL_CLOCK_QUALITY_LEVEL_MAX - 1)
>+};
>+
> #define DPLL_TEMP_DIVIDER	1000
>
> /**
>@@ -180,6 +203,7 @@ enum dpll_a {
> 	DPLL_A_TEMP,
> 	DPLL_A_TYPE,
> 	DPLL_A_LOCK_STATUS_ERROR,
>+	DPLL_A_CLOCK_QUALITY_LEVEL,
>
> 	__DPLL_A_MAX,
> 	DPLL_A_MAX = (__DPLL_A_MAX - 1)
>--
>2.47.0

LGTM, Thank you!
Reviewed-by: Arkadiusz Kubalewski <arkadiusz.kubalewski@intel.com>
Jakub Kicinski Oct. 15, 2024, 2:26 p.m. UTC | #2
On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:
> +    type: enum
> +    name: clock-quality-level
> +    doc: |
> +      level of quality of a clock device. This mainly applies when
> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
> +      The current list is defined according to the table 11-7 contained
> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
> +      by other ITU-T defined clock qualities, or different ones defined
> +      by another standardization body (for those, please use
> +      different prefix).

uAPI extensibility aside - doesn't this belong to clock info?
I'm slightly worried we're stuffing this attr into DPLL because
we have netlink for DPLL but no good way to extend clock info.

> +    entries:
> +      -
> +        name: itu-opt1-prc
> +        value: 1
> +      -
> +        name: itu-opt1-ssu-a
> +      -
> +        name: itu-opt1-ssu-b
> +      -
> +        name: itu-opt1-eec1
> +      -
> +        name: itu-opt1-prtc
> +      -
> +        name: itu-opt1-eprtc
> +      -
> +        name: itu-opt1-eeec
> +      -
> +        name: itu-opt1-eprc
> +    render-max: true

Why render max? Just to align with other unnecessary max defines in
the file?
Jiri Pirko Oct. 15, 2024, 2:38 p.m. UTC | #3
Tue, Oct 15, 2024 at 04:26:38PM CEST, kuba@kernel.org wrote:
>On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:
>> +    type: enum
>> +    name: clock-quality-level
>> +    doc: |
>> +      level of quality of a clock device. This mainly applies when
>> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>> +      The current list is defined according to the table 11-7 contained
>> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>> +      by other ITU-T defined clock qualities, or different ones defined
>> +      by another standardization body (for those, please use
>> +      different prefix).
>
>uAPI extensibility aside - doesn't this belong to clock info?
>I'm slightly worried we're stuffing this attr into DPLL because
>we have netlink for DPLL but no good way to extend clock info.

Not sure what do you mean by "clock info". Dpll device and clock is kind
of the same thing. The dpll device is identified by clock-id. I see no
other attributes on the way this direction to more extend dpll attr
namespace.


>
>> +    entries:
>> +      -
>> +        name: itu-opt1-prc
>> +        value: 1
>> +      -
>> +        name: itu-opt1-ssu-a
>> +      -
>> +        name: itu-opt1-ssu-b
>> +      -
>> +        name: itu-opt1-eec1
>> +      -
>> +        name: itu-opt1-prtc
>> +      -
>> +        name: itu-opt1-eprtc
>> +      -
>> +        name: itu-opt1-eeec
>> +      -
>> +        name: itu-opt1-eprc
>> +    render-max: true
>
>Why render max? Just to align with other unnecessary max defines in
>the file?

Yeah, why not?
Vadim Fedorenko Oct. 15, 2024, 2:50 p.m. UTC | #4
On 15/10/2024 15:26, Jakub Kicinski wrote:
> On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:
>> +    type: enum
>> +    name: clock-quality-level
>> +    doc: |
>> +      level of quality of a clock device. This mainly applies when
>> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>> +      The current list is defined according to the table 11-7 contained
>> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>> +      by other ITU-T defined clock qualities, or different ones defined
>> +      by another standardization body (for those, please use
>> +      different prefix).
> 
> uAPI extensibility aside - doesn't this belong to clock info?
> I'm slightly worried we're stuffing this attr into DPLL because
> we have netlink for DPLL but no good way to extend clock info.

There is a work going on by Maciek Machnikowski about extending clock
info. But the progress is kinda slow..

>> +    entries:
>> +      -
>> +        name: itu-opt1-prc
>> +        value: 1
>> +      -
>> +        name: itu-opt1-ssu-a
>> +      -
>> +        name: itu-opt1-ssu-b
>> +      -
>> +        name: itu-opt1-eec1
>> +      -
>> +        name: itu-opt1-prtc
>> +      -
>> +        name: itu-opt1-eprtc
>> +      -
>> +        name: itu-opt1-eeec
>> +      -
>> +        name: itu-opt1-eprc
>> +    render-max: true
> 
> Why render max? Just to align with other unnecessary max defines in
> the file?
Jiri Pirko Oct. 15, 2024, 2:56 p.m. UTC | #5
Tue, Oct 15, 2024 at 04:50:41PM CEST, vadim.fedorenko@linux.dev wrote:
>On 15/10/2024 15:26, Jakub Kicinski wrote:
>> On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:
>> > +    type: enum
>> > +    name: clock-quality-level
>> > +    doc: |
>> > +      level of quality of a clock device. This mainly applies when
>> > +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>> > +      The current list is defined according to the table 11-7 contained
>> > +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>> > +      by other ITU-T defined clock qualities, or different ones defined
>> > +      by another standardization body (for those, please use
>> > +      different prefix).
>> 
>> uAPI extensibility aside - doesn't this belong to clock info?
>> I'm slightly worried we're stuffing this attr into DPLL because
>> we have netlink for DPLL but no good way to extend clock info.
>
>There is a work going on by Maciek Machnikowski about extending clock
>info. But the progress is kinda slow..

Do you have some info about this? A list of attrs at least would help.

>
>> > +    entries:
>> > +      -
>> > +        name: itu-opt1-prc
>> > +        value: 1
>> > +      -
>> > +        name: itu-opt1-ssu-a
>> > +      -
>> > +        name: itu-opt1-ssu-b
>> > +      -
>> > +        name: itu-opt1-eec1
>> > +      -
>> > +        name: itu-opt1-prtc
>> > +      -
>> > +        name: itu-opt1-eprtc
>> > +      -
>> > +        name: itu-opt1-eeec
>> > +      -
>> > +        name: itu-opt1-eprc
>> > +    render-max: true
>> 
>> Why render max? Just to align with other unnecessary max defines in
>> the file?
>
Jakub Kicinski Oct. 15, 2024, 3:01 p.m. UTC | #6
On Tue, 15 Oct 2024 16:38:52 +0200 Jiri Pirko wrote:
> Tue, Oct 15, 2024 at 04:26:38PM CEST, kuba@kernel.org wrote:
> >On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:  
> >> +    type: enum
> >> +    name: clock-quality-level
> >> +    doc: |
> >> +      level of quality of a clock device. This mainly applies when
> >> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
> >> +      The current list is defined according to the table 11-7 contained
> >> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
> >> +      by other ITU-T defined clock qualities, or different ones defined
> >> +      by another standardization body (for those, please use
> >> +      different prefix).  
> >
> >uAPI extensibility aside - doesn't this belong to clock info?
> >I'm slightly worried we're stuffing this attr into DPLL because
> >we have netlink for DPLL but no good way to extend clock info.  
> 
> Not sure what do you mean by "clock info". Dpll device and clock is kind
> of the same thing. The dpll device is identified by clock-id. I see no
> other attributes on the way this direction to more extend dpll attr
> namespace.

I'm not an expert but I think the standard definition of a DPLL
does not include a built-in oscillator, if that's what you mean.

> >> +    entries:
> >> +      -
> >> +        name: itu-opt1-prc
> >> +        value: 1
> >> +      -
> >> +        name: itu-opt1-ssu-a
> >> +      -
> >> +        name: itu-opt1-ssu-b
> >> +      -
> >> +        name: itu-opt1-eec1
> >> +      -
> >> +        name: itu-opt1-prtc
> >> +      -
> >> +        name: itu-opt1-eprtc
> >> +      -
> >> +        name: itu-opt1-eeec
> >> +      -
> >> +        name: itu-opt1-eprc
> >> +    render-max: true  
> >
> >Why render max? Just to align with other unnecessary max defines in
> >the file?  
> 
> Yeah, why not?

If it wasn't pointless it would be the default for our code gen.
Please remove it unless you can point at some code that will likely
need it. We can always add it later, we can't remove it.
Vadim Fedorenko Oct. 15, 2024, 3:01 p.m. UTC | #7
On 15/10/2024 15:56, Jiri Pirko wrote:
> Tue, Oct 15, 2024 at 04:50:41PM CEST, vadim.fedorenko@linux.dev wrote:
>> On 15/10/2024 15:26, Jakub Kicinski wrote:
>>> On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:
>>>> +    type: enum
>>>> +    name: clock-quality-level
>>>> +    doc: |
>>>> +      level of quality of a clock device. This mainly applies when
>>>> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>>>> +      The current list is defined according to the table 11-7 contained
>>>> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>>>> +      by other ITU-T defined clock qualities, or different ones defined
>>>> +      by another standardization body (for those, please use
>>>> +      different prefix).
>>>
>>> uAPI extensibility aside - doesn't this belong to clock info?
>>> I'm slightly worried we're stuffing this attr into DPLL because
>>> we have netlink for DPLL but no good way to extend clock info.
>>
>> There is a work going on by Maciek Machnikowski about extending clock
>> info. But the progress is kinda slow..
> 
> Do you have some info about this? A list of attrs at least would help.

The mailing list conversation started in this thread:
https://lore.kernel.org/netdev/20240813125602.155827-1-maciek@machnikowski.net/

But the idea was presented back at the latest Netdevconf:
https://netdevconf.org/0x18/sessions/tutorial/introduction-to-ptp-on-linux-apis.html

>>
>>>> +    entries:
>>>> +      -
>>>> +        name: itu-opt1-prc
>>>> +        value: 1
>>>> +      -
>>>> +        name: itu-opt1-ssu-a
>>>> +      -
>>>> +        name: itu-opt1-ssu-b
>>>> +      -
>>>> +        name: itu-opt1-eec1
>>>> +      -
>>>> +        name: itu-opt1-prtc
>>>> +      -
>>>> +        name: itu-opt1-eprtc
>>>> +      -
>>>> +        name: itu-opt1-eeec
>>>> +      -
>>>> +        name: itu-opt1-eprc
>>>> +    render-max: true
>>>
>>> Why render max? Just to align with other unnecessary max defines in
>>> the file?
>>
Jiri Pirko Oct. 16, 2024, 8:17 a.m. UTC | #8
Tue, Oct 15, 2024 at 05:01:12PM CEST, vadim.fedorenko@linux.dev wrote:
>On 15/10/2024 15:56, Jiri Pirko wrote:
>> Tue, Oct 15, 2024 at 04:50:41PM CEST, vadim.fedorenko@linux.dev wrote:
>> > On 15/10/2024 15:26, Jakub Kicinski wrote:
>> > > On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:
>> > > > +    type: enum
>> > > > +    name: clock-quality-level
>> > > > +    doc: |
>> > > > +      level of quality of a clock device. This mainly applies when
>> > > > +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>> > > > +      The current list is defined according to the table 11-7 contained
>> > > > +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>> > > > +      by other ITU-T defined clock qualities, or different ones defined
>> > > > +      by another standardization body (for those, please use
>> > > > +      different prefix).
>> > > 
>> > > uAPI extensibility aside - doesn't this belong to clock info?
>> > > I'm slightly worried we're stuffing this attr into DPLL because
>> > > we have netlink for DPLL but no good way to extend clock info.
>> > 
>> > There is a work going on by Maciek Machnikowski about extending clock
>> > info. But the progress is kinda slow..
>> 
>> Do you have some info about this? A list of attrs at least would help.
>
>The mailing list conversation started in this thread:
>https://lore.kernel.org/netdev/20240813125602.155827-1-maciek@machnikowski.net/

What's the relation to ptp? I'm missing something here.

>
>But the idea was presented back at the latest Netdevconf:
>https://netdevconf.org/0x18/sessions/tutorial/introduction-to-ptp-on-linux-apis.html
>
>> > 
>> > > > +    entries:
>> > > > +      -
>> > > > +        name: itu-opt1-prc
>> > > > +        value: 1
>> > > > +      -
>> > > > +        name: itu-opt1-ssu-a
>> > > > +      -
>> > > > +        name: itu-opt1-ssu-b
>> > > > +      -
>> > > > +        name: itu-opt1-eec1
>> > > > +      -
>> > > > +        name: itu-opt1-prtc
>> > > > +      -
>> > > > +        name: itu-opt1-eprtc
>> > > > +      -
>> > > > +        name: itu-opt1-eeec
>> > > > +      -
>> > > > +        name: itu-opt1-eprc
>> > > > +    render-max: true
>> > > 
>> > > Why render max? Just to align with other unnecessary max defines in
>> > > the file?
>> > 
>
Jiri Pirko Oct. 16, 2024, 8:19 a.m. UTC | #9
Tue, Oct 15, 2024 at 05:01:08PM CEST, kuba@kernel.org wrote:
>On Tue, 15 Oct 2024 16:38:52 +0200 Jiri Pirko wrote:
>> Tue, Oct 15, 2024 at 04:26:38PM CEST, kuba@kernel.org wrote:
>> >On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:  
>> >> +    type: enum
>> >> +    name: clock-quality-level
>> >> +    doc: |
>> >> +      level of quality of a clock device. This mainly applies when
>> >> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>> >> +      The current list is defined according to the table 11-7 contained
>> >> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>> >> +      by other ITU-T defined clock qualities, or different ones defined
>> >> +      by another standardization body (for those, please use
>> >> +      different prefix).  
>> >
>> >uAPI extensibility aside - doesn't this belong to clock info?
>> >I'm slightly worried we're stuffing this attr into DPLL because
>> >we have netlink for DPLL but no good way to extend clock info.  
>> 
>> Not sure what do you mean by "clock info". Dpll device and clock is kind
>> of the same thing. The dpll device is identified by clock-id. I see no
>> other attributes on the way this direction to more extend dpll attr
>> namespace.
>
>I'm not an expert but I think the standard definition of a DPLL
>does not include a built-in oscillator, if that's what you mean.

Okay. Then the clock-id we have also does not make much sense.
Anyway, what is your desire exactly? Do you want to have a nest attr
clock-info to contain this quality-level attr? Or something else?


>
>> >> +    entries:
>> >> +      -
>> >> +        name: itu-opt1-prc
>> >> +        value: 1
>> >> +      -
>> >> +        name: itu-opt1-ssu-a
>> >> +      -
>> >> +        name: itu-opt1-ssu-b
>> >> +      -
>> >> +        name: itu-opt1-eec1
>> >> +      -
>> >> +        name: itu-opt1-prtc
>> >> +      -
>> >> +        name: itu-opt1-eprtc
>> >> +      -
>> >> +        name: itu-opt1-eeec
>> >> +      -
>> >> +        name: itu-opt1-eprc
>> >> +    render-max: true  
>> >
>> >Why render max? Just to align with other unnecessary max defines in
>> >the file?  
>> 
>> Yeah, why not?
>
>If it wasn't pointless it would be the default for our code gen.
>Please remove it unless you can point at some code that will likely
>need it. We can always add it later, we can't remove it.

Ok
Jiri Pirko Oct. 16, 2024, 8:21 a.m. UTC | #10
Tue, Oct 15, 2024 at 05:01:08PM CEST, kuba@kernel.org wrote:
>On Tue, 15 Oct 2024 16:38:52 +0200 Jiri Pirko wrote:
>> Tue, Oct 15, 2024 at 04:26:38PM CEST, kuba@kernel.org wrote:
>> >On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:  
>> >> +    type: enum
>> >> +    name: clock-quality-level
>> >> +    doc: |
>> >> +      level of quality of a clock device. This mainly applies when
>> >> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>> >> +      The current list is defined according to the table 11-7 contained
>> >> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>> >> +      by other ITU-T defined clock qualities, or different ones defined
>> >> +      by another standardization body (for those, please use
>> >> +      different prefix).  
>> >
>> >uAPI extensibility aside - doesn't this belong to clock info?
>> >I'm slightly worried we're stuffing this attr into DPLL because
>> >we have netlink for DPLL but no good way to extend clock info.  
>> 
>> Not sure what do you mean by "clock info". Dpll device and clock is kind
>> of the same thing. The dpll device is identified by clock-id. I see no
>> other attributes on the way this direction to more extend dpll attr
>> namespace.
>
>I'm not an expert but I think the standard definition of a DPLL
>does not include a built-in oscillator, if that's what you mean.
>
>> >> +    entries:
>> >> +      -
>> >> +        name: itu-opt1-prc
>> >> +        value: 1
>> >> +      -
>> >> +        name: itu-opt1-ssu-a
>> >> +      -
>> >> +        name: itu-opt1-ssu-b
>> >> +      -
>> >> +        name: itu-opt1-eec1
>> >> +      -
>> >> +        name: itu-opt1-prtc
>> >> +      -
>> >> +        name: itu-opt1-eprtc
>> >> +      -
>> >> +        name: itu-opt1-eeec
>> >> +      -
>> >> +        name: itu-opt1-eprc
>> >> +    render-max: true  
>> >
>> >Why render max? Just to align with other unnecessary max defines in
>> >the file?  
>> 
>> Yeah, why not?
>
>If it wasn't pointless it would be the default for our code gen.
>Please remove it unless you can point at some code that will likely
>need it. We can always add it later, we can't remove it.

Well, I use it internally to define the length of bitmap. Does that
justify? I mean, it would be very odd to define the bitmap length
differently.

Thanks!
Jiri Pirko Oct. 18, 2024, 7:07 a.m. UTC | #11
Wed, Oct 16, 2024 at 10:19:57AM CEST, jiri@resnulli.us wrote:
>Tue, Oct 15, 2024 at 05:01:08PM CEST, kuba@kernel.org wrote:
>>On Tue, 15 Oct 2024 16:38:52 +0200 Jiri Pirko wrote:
>>> Tue, Oct 15, 2024 at 04:26:38PM CEST, kuba@kernel.org wrote:
>>> >On Mon, 14 Oct 2024 10:11:32 +0200 Jiri Pirko wrote:  
>>> >> +    type: enum
>>> >> +    name: clock-quality-level
>>> >> +    doc: |
>>> >> +      level of quality of a clock device. This mainly applies when
>>> >> +      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
>>> >> +      The current list is defined according to the table 11-7 contained
>>> >> +      in ITU-T G.8264/Y.1364 document. One may extend this list freely
>>> >> +      by other ITU-T defined clock qualities, or different ones defined
>>> >> +      by another standardization body (for those, please use
>>> >> +      different prefix).  
>>> >
>>> >uAPI extensibility aside - doesn't this belong to clock info?
>>> >I'm slightly worried we're stuffing this attr into DPLL because
>>> >we have netlink for DPLL but no good way to extend clock info.  
>>> 
>>> Not sure what do you mean by "clock info". Dpll device and clock is kind
>>> of the same thing. The dpll device is identified by clock-id. I see no
>>> other attributes on the way this direction to more extend dpll attr
>>> namespace.
>>
>>I'm not an expert but I think the standard definition of a DPLL
>>does not include a built-in oscillator, if that's what you mean.
>
>Okay. Then the clock-id we have also does not make much sense.
>Anyway, what is your desire exactly? Do you want to have a nest attr
>clock-info to contain this quality-level attr? Or something else?

Jakub? What's your wish?
Jakub Kicinski Oct. 28, 2024, 5:14 p.m. UTC | #12
On Wed, 16 Oct 2024 10:19:57 +0200 Jiri Pirko wrote:
> >> Not sure what do you mean by "clock info". Dpll device and clock is kind
> >> of the same thing. The dpll device is identified by clock-id. I see no
> >> other attributes on the way this direction to more extend dpll attr
> >> namespace.  
> >
> >I'm not an expert but I think the standard definition of a DPLL
> >does not include a built-in oscillator, if that's what you mean.  
> 
> Okay. Then the clock-id we have also does not make much sense.
> Anyway, what is your desire exactly? Do you want to have a nest attr
> clock-info to contain this quality-level attr? Or something else?

I thought clock-id is basically clockid_t, IOW a reference.
I wish that the information about timekeepers was exposed 
by the time subsystem rather than DPLL. Something like clock_getres().
Jiri Pirko Oct. 29, 2024, 12:52 p.m. UTC | #13
Mon, Oct 28, 2024 at 06:14:03PM CET, kuba@kernel.org wrote:
>On Wed, 16 Oct 2024 10:19:57 +0200 Jiri Pirko wrote:
>> >> Not sure what do you mean by "clock info". Dpll device and clock is kind
>> >> of the same thing. The dpll device is identified by clock-id. I see no
>> >> other attributes on the way this direction to more extend dpll attr
>> >> namespace.  
>> >
>> >I'm not an expert but I think the standard definition of a DPLL
>> >does not include a built-in oscillator, if that's what you mean.  
>> 
>> Okay. Then the clock-id we have also does not make much sense.
>> Anyway, what is your desire exactly? Do you want to have a nest attr
>> clock-info to contain this quality-level attr? Or something else?
>
>I thought clock-id is basically clockid_t, IOW a reference.
>I wish that the information about timekeepers was exposed 
>by the time subsystem rather than DPLL. Something like clock_getres().

Hmm. From what I understand, the quality of the clock as it is defined
by the ITU standard is an attribute of the DPLL device. DPLL device
in our model is basically a board, which might combine oscillator,
synchronizer and possibly other devices. The clock quality is determined
by this combination and I understand that the ITU certification is also
applied to this device.

That's why it makes sense to have the clock quality as the DPLL
attribute. Makes sense?
Jakub Kicinski Oct. 29, 2024, 1:51 p.m. UTC | #14
On Tue, 29 Oct 2024 13:52:12 +0100 Jiri Pirko wrote:
> >I thought clock-id is basically clockid_t, IOW a reference.
> >I wish that the information about timekeepers was exposed 
> >by the time subsystem rather than DPLL. Something like clock_getres().  
> 
> Hmm. From what I understand, the quality of the clock as it is defined
> by the ITU standard is an attribute of the DPLL device. DPLL device
> in our model is basically a board, which might combine oscillator,
> synchronizer and possibly other devices. The clock quality is determined
> by this combination and I understand that the ITU certification is also
> applied to this device.
> 
> That's why it makes sense to have the clock quality as the DPLL
> attribute. Makes sense?

Hm, reading more carefully sounds like it's the quality of the holdover
clock. Can we say that in the documentation? "This mainly applies when
the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED" is a bit of a mouthful.
I think I missed the "not" first time reading it.

Is it marked as multi-attr in case non-ITU clock quality is defined
later? Or is it legit to set to ITU bits at once?
Jiri Pirko Oct. 29, 2024, 2:41 p.m. UTC | #15
Tue, Oct 29, 2024 at 02:51:29PM CET, kuba@kernel.org wrote:
>On Tue, 29 Oct 2024 13:52:12 +0100 Jiri Pirko wrote:
>> >I thought clock-id is basically clockid_t, IOW a reference.
>> >I wish that the information about timekeepers was exposed 
>> >by the time subsystem rather than DPLL. Something like clock_getres().  
>> 
>> Hmm. From what I understand, the quality of the clock as it is defined
>> by the ITU standard is an attribute of the DPLL device. DPLL device
>> in our model is basically a board, which might combine oscillator,
>> synchronizer and possibly other devices. The clock quality is determined
>> by this combination and I understand that the ITU certification is also
>> applied to this device.
>> 
>> That's why it makes sense to have the clock quality as the DPLL
>> attribute. Makes sense?
>
>Hm, reading more carefully sounds like it's the quality of the holdover
>clock. Can we say that in the documentation? "This mainly applies when

Yes.


>the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED" is a bit of a mouthful.
>I think I missed the "not" first time reading it.

Okay, will try to re-phrase to avoid confusion.


>
>Is it marked as multi-attr in case non-ITU clock quality is defined
>later? Or is it legit to set to ITU bits at once?

For non-ITU as well as for possibly advertizing quality of different ITU
options (option 1 and option 2).
diff mbox series

Patch

diff --git a/Documentation/netlink/specs/dpll.yaml b/Documentation/netlink/specs/dpll.yaml
index f2894ca35de8..0bd708e136ff 100644
--- a/Documentation/netlink/specs/dpll.yaml
+++ b/Documentation/netlink/specs/dpll.yaml
@@ -85,6 +85,36 @@  definitions:
           This may happen for example if dpll device was previously
           locked on an input pin of type PIN_TYPE_SYNCE_ETH_PORT.
     render-max: true
+  -
+    type: enum
+    name: clock-quality-level
+    doc: |
+      level of quality of a clock device. This mainly applies when
+      the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
+      The current list is defined according to the table 11-7 contained
+      in ITU-T G.8264/Y.1364 document. One may extend this list freely
+      by other ITU-T defined clock qualities, or different ones defined
+      by another standardization body (for those, please use
+      different prefix).
+    entries:
+      -
+        name: itu-opt1-prc
+        value: 1
+      -
+        name: itu-opt1-ssu-a
+      -
+        name: itu-opt1-ssu-b
+      -
+        name: itu-opt1-eec1
+      -
+        name: itu-opt1-prtc
+      -
+        name: itu-opt1-eprtc
+      -
+        name: itu-opt1-eeec
+      -
+        name: itu-opt1-eprc
+    render-max: true
   -
     type: const
     name: temp-divider
@@ -252,6 +282,11 @@  attribute-sets:
         name: lock-status-error
         type: u32
         enum: lock-status-error
+      -
+        name: clock-quality-level
+        type: u32
+        enum: clock-quality-level
+        multi-attr: true
   -
     name: pin
     enum-name: dpll_a_pin
diff --git a/drivers/dpll/dpll_netlink.c b/drivers/dpll/dpll_netlink.c
index fc0280dcddd1..c130f87147fa 100644
--- a/drivers/dpll/dpll_netlink.c
+++ b/drivers/dpll/dpll_netlink.c
@@ -169,6 +169,27 @@  dpll_msg_add_temp(struct sk_buff *msg, struct dpll_device *dpll,
 	return 0;
 }
 
+static int
+dpll_msg_add_clock_quality_level(struct sk_buff *msg, struct dpll_device *dpll,
+				 struct netlink_ext_ack *extack)
+{
+	const struct dpll_device_ops *ops = dpll_device_ops(dpll);
+	DECLARE_BITMAP(qls, DPLL_CLOCK_QUALITY_LEVEL_MAX) = { 0 };
+	enum dpll_clock_quality_level ql;
+	int ret;
+
+	if (!ops->clock_quality_level_get)
+		return 0;
+	ret = ops->clock_quality_level_get(dpll, dpll_priv(dpll), qls, extack);
+	if (ret)
+		return ret;
+	for_each_set_bit(ql, qls, DPLL_CLOCK_QUALITY_LEVEL_MAX)
+		if (nla_put_u32(msg, DPLL_A_CLOCK_QUALITY_LEVEL, ql))
+			return -EMSGSIZE;
+
+	return 0;
+}
+
 static int
 dpll_msg_add_pin_prio(struct sk_buff *msg, struct dpll_pin *pin,
 		      struct dpll_pin_ref *ref,
@@ -557,6 +578,9 @@  dpll_device_get_one(struct dpll_device *dpll, struct sk_buff *msg,
 	if (ret)
 		return ret;
 	ret = dpll_msg_add_lock_status(msg, dpll, extack);
+	if (ret)
+		return ret;
+	ret = dpll_msg_add_clock_quality_level(msg, dpll, extack);
 	if (ret)
 		return ret;
 	ret = dpll_msg_add_mode(msg, dpll, extack);
diff --git a/include/linux/dpll.h b/include/linux/dpll.h
index 81f7b623d0ba..5e4f9ab1cf75 100644
--- a/include/linux/dpll.h
+++ b/include/linux/dpll.h
@@ -26,6 +26,10 @@  struct dpll_device_ops {
 			       struct netlink_ext_ack *extack);
 	int (*temp_get)(const struct dpll_device *dpll, void *dpll_priv,
 			s32 *temp, struct netlink_ext_ack *extack);
+	int (*clock_quality_level_get)(const struct dpll_device *dpll,
+				       void *dpll_priv,
+				       unsigned long *qls,
+				       struct netlink_ext_ack *extack);
 };
 
 struct dpll_pin_ops {
diff --git a/include/uapi/linux/dpll.h b/include/uapi/linux/dpll.h
index b0654ade7b7e..4b37542eace3 100644
--- a/include/uapi/linux/dpll.h
+++ b/include/uapi/linux/dpll.h
@@ -79,6 +79,29 @@  enum dpll_lock_status_error {
 	DPLL_LOCK_STATUS_ERROR_MAX = (__DPLL_LOCK_STATUS_ERROR_MAX - 1)
 };
 
+/**
+ * enum dpll_clock_quality_level - level of quality of a clock device. This
+ *   mainly applies when the dpll lock-status is not DPLL_LOCK_STATUS_LOCKED.
+ *   The current list is defined according to the table 11-7 contained in ITU-T
+ *   G.8264/Y.1364 document. One may extend this list freely by other ITU-T
+ *   defined clock qualities, or different ones defined by another
+ *   standardization body (for those, please use different prefix).
+ */
+enum dpll_clock_quality_level {
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_PRC = 1,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_SSU_A,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_SSU_B,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EEC1,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_PRTC,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRTC,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EEEC,
+	DPLL_CLOCK_QUALITY_LEVEL_ITU_OPT1_EPRC,
+
+	/* private: */
+	__DPLL_CLOCK_QUALITY_LEVEL_MAX,
+	DPLL_CLOCK_QUALITY_LEVEL_MAX = (__DPLL_CLOCK_QUALITY_LEVEL_MAX - 1)
+};
+
 #define DPLL_TEMP_DIVIDER	1000
 
 /**
@@ -180,6 +203,7 @@  enum dpll_a {
 	DPLL_A_TEMP,
 	DPLL_A_TYPE,
 	DPLL_A_LOCK_STATUS_ERROR,
+	DPLL_A_CLOCK_QUALITY_LEVEL,
 
 	__DPLL_A_MAX,
 	DPLL_A_MAX = (__DPLL_A_MAX - 1)