mbox series

[RFC,v6,0/6] Create common DPLL/clock configuration API

Message ID 20230312022807.278528-1-vadfed@meta.com (mailing list archive)
Headers show
Series Create common DPLL/clock configuration API | expand

Message

Vadim Fedorenko March 12, 2023, 2:28 a.m. UTC
Implement common API for clock/DPLL configuration and status reporting.
The API utilises netlink interface as transport for commands and event
notifications. This API aim to extend current pin configuration and
make it flexible and easy to cover special configurations.

v5 -> v6:
 * rework pin part to better fit shared pins use cases
 * add YAML spec to easy generate user-space apps
 * simple implementation in ptp_ocp is back again
v4 -> v5:
 * fix code issues found during last reviews:
   - replace cookie with clock id
	 - follow one naming schema in dpll subsys
	 - move function comments to dpll_core.c, fix exports
	 - remove single-use helper functions
	 - merge device register with alloc
   - lock and unlock mutex on dpll device release
   - move dpll_type to uapi header
   - rename DPLLA_DUMP_FILTER to DPLLA_FILTER
   - rename dpll_pin_state to dpll_pin_mode
   - rename DPLL_MODE_FORCED to DPLL_MODE_MANUAL
   - remove DPLL_CHANGE_PIN_TYPE enum value
 * rewrite framework once again (Arkadiusz)
   - add clock class:
     Provide userspace with clock class value of DPLL with dpll device dump
     netlink request. Clock class is assigned by driver allocating a dpll
     device. Clock class values are defined as specified in:
     ITU-T G.8273.2/Y.1368.2 recommendation.
   - dpll device naming schema use new pattern:
	   "dpll_%s_%d_%d", where:
       - %s - dev_name(parent) of parent device,
       - %d (1) - enum value of dpll type,
       - %d (2) - device index provided by parent device.
   - new muxed/shared pin registration:
	   Let the kernel module to register a shared or muxed pin without finding
     it or its parent. Instead use a parent/shared pin description to find
     correct pin internally in dpll_core, simplifing a dpll API
 * Implement complex DPLL design in ice driver (Arkadiusz)
 * Remove ptp_ocp driver from the series for now
v3 -> v4:
 * redesign framework to make pins dynamically allocated (Arkadiusz)
 * implement shared pins (Arkadiusz)
v2 -> v3:
 * implement source select mode (Arkadiusz)
 * add documentation
 * implementation improvements (Jakub)
v1 -> v2:
 * implement returning supported input/output types
 * ptp_ocp: follow suggestions from Jonathan
 * add linux-clk mailing list
v0 -> v1:
 * fix code style and errors
 * add linux-arm mailing list

Arkadiusz Kubalewski (3):
  dpll: spec: Add Netlink spec in YAML
  ice: add admin commands to access cgu configuration
  ice: implement dpll interface to control cgu

Vadim Fedorenko (3):
  dpll: Add DPLL framework base functions
  dpll: documentation on DPLL subsystem interface
  ptp_ocp: implement DPLL ops

 Documentation/netlink/specs/dpll.yaml         |  514 +++++
 Documentation/networking/dpll.rst             |  347 ++++
 Documentation/networking/index.rst            |    1 +
 MAINTAINERS                                   |    9 +
 drivers/Kconfig                               |    2 +
 drivers/Makefile                              |    1 +
 drivers/dpll/Kconfig                          |    7 +
 drivers/dpll/Makefile                         |   10 +
 drivers/dpll/dpll_core.c                      |  835 ++++++++
 drivers/dpll/dpll_core.h                      |   99 +
 drivers/dpll/dpll_netlink.c                   | 1065 ++++++++++
 drivers/dpll/dpll_netlink.h                   |   30 +
 drivers/dpll/dpll_nl.c                        |  126 ++
 drivers/dpll/dpll_nl.h                        |   42 +
 drivers/net/ethernet/intel/Kconfig            |    1 +
 drivers/net/ethernet/intel/ice/Makefile       |    3 +-
 drivers/net/ethernet/intel/ice/ice.h          |    5 +
 .../net/ethernet/intel/ice/ice_adminq_cmd.h   |  240 ++-
 drivers/net/ethernet/intel/ice/ice_common.c   |  467 +++++
 drivers/net/ethernet/intel/ice/ice_common.h   |   43 +
 drivers/net/ethernet/intel/ice/ice_dpll.c     | 1845 +++++++++++++++++
 drivers/net/ethernet/intel/ice/ice_dpll.h     |   96 +
 drivers/net/ethernet/intel/ice/ice_lib.c      |   17 +-
 drivers/net/ethernet/intel/ice/ice_main.c     |    7 +
 drivers/net/ethernet/intel/ice/ice_ptp_hw.c   |  411 ++++
 drivers/net/ethernet/intel/ice/ice_ptp_hw.h   |  240 +++
 drivers/net/ethernet/intel/ice/ice_type.h     |    1 +
 drivers/ptp/Kconfig                           |    1 +
 drivers/ptp/ptp_ocp.c                         |  206 +-
 include/linux/dpll.h                          |  284 +++
 include/uapi/linux/dpll.h                     |  196 ++
 31 files changed, 7135 insertions(+), 16 deletions(-)
 create mode 100644 Documentation/netlink/specs/dpll.yaml
 create mode 100644 Documentation/networking/dpll.rst
 create mode 100644 drivers/dpll/Kconfig
 create mode 100644 drivers/dpll/Makefile
 create mode 100644 drivers/dpll/dpll_core.c
 create mode 100644 drivers/dpll/dpll_core.h
 create mode 100644 drivers/dpll/dpll_netlink.c
 create mode 100644 drivers/dpll/dpll_netlink.h
 create mode 100644 drivers/dpll/dpll_nl.c
 create mode 100644 drivers/dpll/dpll_nl.h
 create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.c
 create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.h
 create mode 100644 include/linux/dpll.h
 create mode 100644 include/uapi/linux/dpll.h

Comments

Jiri Pirko March 13, 2023, 12:20 p.m. UTC | #1
Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>Implement common API for clock/DPLL configuration and status reporting.
>The API utilises netlink interface as transport for commands and event
>notifications. This API aim to extend current pin configuration and
>make it flexible and easy to cover special configurations.

Could you please put here some command line examples to work with this?


>
>v5 -> v6:
> * rework pin part to better fit shared pins use cases
> * add YAML spec to easy generate user-space apps
> * simple implementation in ptp_ocp is back again
>v4 -> v5:
> * fix code issues found during last reviews:
>   - replace cookie with clock id
>	 - follow one naming schema in dpll subsys
>	 - move function comments to dpll_core.c, fix exports
>	 - remove single-use helper functions
>	 - merge device register with alloc
>   - lock and unlock mutex on dpll device release
>   - move dpll_type to uapi header
>   - rename DPLLA_DUMP_FILTER to DPLLA_FILTER
>   - rename dpll_pin_state to dpll_pin_mode
>   - rename DPLL_MODE_FORCED to DPLL_MODE_MANUAL
>   - remove DPLL_CHANGE_PIN_TYPE enum value
> * rewrite framework once again (Arkadiusz)
>   - add clock class:
>     Provide userspace with clock class value of DPLL with dpll device dump
>     netlink request. Clock class is assigned by driver allocating a dpll
>     device. Clock class values are defined as specified in:
>     ITU-T G.8273.2/Y.1368.2 recommendation.
>   - dpll device naming schema use new pattern:
>	   "dpll_%s_%d_%d", where:
>       - %s - dev_name(parent) of parent device,
>       - %d (1) - enum value of dpll type,
>       - %d (2) - device index provided by parent device.
>   - new muxed/shared pin registration:
>	   Let the kernel module to register a shared or muxed pin without finding
>     it or its parent. Instead use a parent/shared pin description to find
>     correct pin internally in dpll_core, simplifing a dpll API
> * Implement complex DPLL design in ice driver (Arkadiusz)
> * Remove ptp_ocp driver from the series for now
>v3 -> v4:
> * redesign framework to make pins dynamically allocated (Arkadiusz)
> * implement shared pins (Arkadiusz)
>v2 -> v3:
> * implement source select mode (Arkadiusz)
> * add documentation
> * implementation improvements (Jakub)
>v1 -> v2:
> * implement returning supported input/output types
> * ptp_ocp: follow suggestions from Jonathan
> * add linux-clk mailing list
>v0 -> v1:
> * fix code style and errors
> * add linux-arm mailing list
>
>Arkadiusz Kubalewski (3):
>  dpll: spec: Add Netlink spec in YAML
>  ice: add admin commands to access cgu configuration
>  ice: implement dpll interface to control cgu
>
>Vadim Fedorenko (3):
>  dpll: Add DPLL framework base functions
>  dpll: documentation on DPLL subsystem interface
>  ptp_ocp: implement DPLL ops
>
> Documentation/netlink/specs/dpll.yaml         |  514 +++++
> Documentation/networking/dpll.rst             |  347 ++++
> Documentation/networking/index.rst            |    1 +
> MAINTAINERS                                   |    9 +
> drivers/Kconfig                               |    2 +
> drivers/Makefile                              |    1 +
> drivers/dpll/Kconfig                          |    7 +
> drivers/dpll/Makefile                         |   10 +
> drivers/dpll/dpll_core.c                      |  835 ++++++++
> drivers/dpll/dpll_core.h                      |   99 +
> drivers/dpll/dpll_netlink.c                   | 1065 ++++++++++
> drivers/dpll/dpll_netlink.h                   |   30 +
> drivers/dpll/dpll_nl.c                        |  126 ++
> drivers/dpll/dpll_nl.h                        |   42 +
> drivers/net/ethernet/intel/Kconfig            |    1 +
> drivers/net/ethernet/intel/ice/Makefile       |    3 +-
> drivers/net/ethernet/intel/ice/ice.h          |    5 +
> .../net/ethernet/intel/ice/ice_adminq_cmd.h   |  240 ++-
> drivers/net/ethernet/intel/ice/ice_common.c   |  467 +++++
> drivers/net/ethernet/intel/ice/ice_common.h   |   43 +
> drivers/net/ethernet/intel/ice/ice_dpll.c     | 1845 +++++++++++++++++
> drivers/net/ethernet/intel/ice/ice_dpll.h     |   96 +
> drivers/net/ethernet/intel/ice/ice_lib.c      |   17 +-
> drivers/net/ethernet/intel/ice/ice_main.c     |    7 +
> drivers/net/ethernet/intel/ice/ice_ptp_hw.c   |  411 ++++
> drivers/net/ethernet/intel/ice/ice_ptp_hw.h   |  240 +++
> drivers/net/ethernet/intel/ice/ice_type.h     |    1 +
> drivers/ptp/Kconfig                           |    1 +
> drivers/ptp/ptp_ocp.c                         |  206 +-
> include/linux/dpll.h                          |  284 +++
> include/uapi/linux/dpll.h                     |  196 ++
> 31 files changed, 7135 insertions(+), 16 deletions(-)
> create mode 100644 Documentation/netlink/specs/dpll.yaml
> create mode 100644 Documentation/networking/dpll.rst
> create mode 100644 drivers/dpll/Kconfig
> create mode 100644 drivers/dpll/Makefile
> create mode 100644 drivers/dpll/dpll_core.c
> create mode 100644 drivers/dpll/dpll_core.h
> create mode 100644 drivers/dpll/dpll_netlink.c
> create mode 100644 drivers/dpll/dpll_netlink.h
> create mode 100644 drivers/dpll/dpll_nl.c
> create mode 100644 drivers/dpll/dpll_nl.h
> create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.c
> create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.h
> create mode 100644 include/linux/dpll.h
> create mode 100644 include/uapi/linux/dpll.h
>
>-- 
>2.34.1
>
Vadim Fedorenko March 13, 2023, 3:33 p.m. UTC | #2
On 13/03/2023 12:20, Jiri Pirko wrote:
> Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>> Implement common API for clock/DPLL configuration and status reporting.
>> The API utilises netlink interface as transport for commands and event
>> notifications. This API aim to extend current pin configuration and
>> make it flexible and easy to cover special configurations.
> 
> Could you please put here some command line examples to work with this?

We don't have open-source tools ready right now for specific hardware, 
but with YAML spec published you can use in-kernel tool to manipulate 
the values, i.e.:

./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml 
--dump device-get
./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do 
device-get --json '{"id": 0}'
./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml 
--dump pin-get
./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do 
pin-get --json '{"id": 0, "pin-idx":1}'
./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do 
pin-set --json '{"id":0, "pin-idx":1, "pin-frequency":1}'

> 
>>
>> v5 -> v6:
>> * rework pin part to better fit shared pins use cases
>> * add YAML spec to easy generate user-space apps
>> * simple implementation in ptp_ocp is back again
>> v4 -> v5:
>> * fix code issues found during last reviews:
>>    - replace cookie with clock id
>> 	 - follow one naming schema in dpll subsys
>> 	 - move function comments to dpll_core.c, fix exports
>> 	 - remove single-use helper functions
>> 	 - merge device register with alloc
>>    - lock and unlock mutex on dpll device release
>>    - move dpll_type to uapi header
>>    - rename DPLLA_DUMP_FILTER to DPLLA_FILTER
>>    - rename dpll_pin_state to dpll_pin_mode
>>    - rename DPLL_MODE_FORCED to DPLL_MODE_MANUAL
>>    - remove DPLL_CHANGE_PIN_TYPE enum value
>> * rewrite framework once again (Arkadiusz)
>>    - add clock class:
>>      Provide userspace with clock class value of DPLL with dpll device dump
>>      netlink request. Clock class is assigned by driver allocating a dpll
>>      device. Clock class values are defined as specified in:
>>      ITU-T G.8273.2/Y.1368.2 recommendation.
>>    - dpll device naming schema use new pattern:
>> 	   "dpll_%s_%d_%d", where:
>>        - %s - dev_name(parent) of parent device,
>>        - %d (1) - enum value of dpll type,
>>        - %d (2) - device index provided by parent device.
>>    - new muxed/shared pin registration:
>> 	   Let the kernel module to register a shared or muxed pin without finding
>>      it or its parent. Instead use a parent/shared pin description to find
>>      correct pin internally in dpll_core, simplifing a dpll API
>> * Implement complex DPLL design in ice driver (Arkadiusz)
>> * Remove ptp_ocp driver from the series for now
>> v3 -> v4:
>> * redesign framework to make pins dynamically allocated (Arkadiusz)
>> * implement shared pins (Arkadiusz)
>> v2 -> v3:
>> * implement source select mode (Arkadiusz)
>> * add documentation
>> * implementation improvements (Jakub)
>> v1 -> v2:
>> * implement returning supported input/output types
>> * ptp_ocp: follow suggestions from Jonathan
>> * add linux-clk mailing list
>> v0 -> v1:
>> * fix code style and errors
>> * add linux-arm mailing list
>>
>> Arkadiusz Kubalewski (3):
>>   dpll: spec: Add Netlink spec in YAML
>>   ice: add admin commands to access cgu configuration
>>   ice: implement dpll interface to control cgu
>>
>> Vadim Fedorenko (3):
>>   dpll: Add DPLL framework base functions
>>   dpll: documentation on DPLL subsystem interface
>>   ptp_ocp: implement DPLL ops
>>
>> Documentation/netlink/specs/dpll.yaml         |  514 +++++
>> Documentation/networking/dpll.rst             |  347 ++++
>> Documentation/networking/index.rst            |    1 +
>> MAINTAINERS                                   |    9 +
>> drivers/Kconfig                               |    2 +
>> drivers/Makefile                              |    1 +
>> drivers/dpll/Kconfig                          |    7 +
>> drivers/dpll/Makefile                         |   10 +
>> drivers/dpll/dpll_core.c                      |  835 ++++++++
>> drivers/dpll/dpll_core.h                      |   99 +
>> drivers/dpll/dpll_netlink.c                   | 1065 ++++++++++
>> drivers/dpll/dpll_netlink.h                   |   30 +
>> drivers/dpll/dpll_nl.c                        |  126 ++
>> drivers/dpll/dpll_nl.h                        |   42 +
>> drivers/net/ethernet/intel/Kconfig            |    1 +
>> drivers/net/ethernet/intel/ice/Makefile       |    3 +-
>> drivers/net/ethernet/intel/ice/ice.h          |    5 +
>> .../net/ethernet/intel/ice/ice_adminq_cmd.h   |  240 ++-
>> drivers/net/ethernet/intel/ice/ice_common.c   |  467 +++++
>> drivers/net/ethernet/intel/ice/ice_common.h   |   43 +
>> drivers/net/ethernet/intel/ice/ice_dpll.c     | 1845 +++++++++++++++++
>> drivers/net/ethernet/intel/ice/ice_dpll.h     |   96 +
>> drivers/net/ethernet/intel/ice/ice_lib.c      |   17 +-
>> drivers/net/ethernet/intel/ice/ice_main.c     |    7 +
>> drivers/net/ethernet/intel/ice/ice_ptp_hw.c   |  411 ++++
>> drivers/net/ethernet/intel/ice/ice_ptp_hw.h   |  240 +++
>> drivers/net/ethernet/intel/ice/ice_type.h     |    1 +
>> drivers/ptp/Kconfig                           |    1 +
>> drivers/ptp/ptp_ocp.c                         |  206 +-
>> include/linux/dpll.h                          |  284 +++
>> include/uapi/linux/dpll.h                     |  196 ++
>> 31 files changed, 7135 insertions(+), 16 deletions(-)
>> create mode 100644 Documentation/netlink/specs/dpll.yaml
>> create mode 100644 Documentation/networking/dpll.rst
>> create mode 100644 drivers/dpll/Kconfig
>> create mode 100644 drivers/dpll/Makefile
>> create mode 100644 drivers/dpll/dpll_core.c
>> create mode 100644 drivers/dpll/dpll_core.h
>> create mode 100644 drivers/dpll/dpll_netlink.c
>> create mode 100644 drivers/dpll/dpll_netlink.h
>> create mode 100644 drivers/dpll/dpll_nl.c
>> create mode 100644 drivers/dpll/dpll_nl.h
>> create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.c
>> create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.h
>> create mode 100644 include/linux/dpll.h
>> create mode 100644 include/uapi/linux/dpll.h
>>
>> -- 
>> 2.34.1
>>
Jiri Pirko March 13, 2023, 4:22 p.m. UTC | #3
Mon, Mar 13, 2023 at 04:33:13PM CET, vadim.fedorenko@linux.dev wrote:
>On 13/03/2023 12:20, Jiri Pirko wrote:
>> Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>> > Implement common API for clock/DPLL configuration and status reporting.
>> > The API utilises netlink interface as transport for commands and event
>> > notifications. This API aim to extend current pin configuration and
>> > make it flexible and easy to cover special configurations.
>> 
>> Could you please put here some command line examples to work with this?
>
>We don't have open-source tools ready right now for specific hardware, but
>with YAML spec published you can use in-kernel tool to manipulate the values,
>i.e.:
>
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump
>device-get
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>device-get --json '{"id": 0}'
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump
>pin-get
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>pin-get --json '{"id": 0, "pin-idx":1}'
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>pin-set --json '{"id":0, "pin-idx":1, "pin-frequency":1}'

Yep, that is exactly what I was asking for. Thanks.
Please try to extend it a bit and add to the cover letter. Gives people
better understanding of how this works.


>
>> 
>> > 
>> > v5 -> v6:
>> > * rework pin part to better fit shared pins use cases
>> > * add YAML spec to easy generate user-space apps
>> > * simple implementation in ptp_ocp is back again
>> > v4 -> v5:
>> > * fix code issues found during last reviews:
>> >    - replace cookie with clock id
>> > 	 - follow one naming schema in dpll subsys
>> > 	 - move function comments to dpll_core.c, fix exports
>> > 	 - remove single-use helper functions
>> > 	 - merge device register with alloc
>> >    - lock and unlock mutex on dpll device release
>> >    - move dpll_type to uapi header
>> >    - rename DPLLA_DUMP_FILTER to DPLLA_FILTER
>> >    - rename dpll_pin_state to dpll_pin_mode
>> >    - rename DPLL_MODE_FORCED to DPLL_MODE_MANUAL
>> >    - remove DPLL_CHANGE_PIN_TYPE enum value
>> > * rewrite framework once again (Arkadiusz)
>> >    - add clock class:
>> >      Provide userspace with clock class value of DPLL with dpll device dump
>> >      netlink request. Clock class is assigned by driver allocating a dpll
>> >      device. Clock class values are defined as specified in:
>> >      ITU-T G.8273.2/Y.1368.2 recommendation.
>> >    - dpll device naming schema use new pattern:
>> > 	   "dpll_%s_%d_%d", where:
>> >        - %s - dev_name(parent) of parent device,
>> >        - %d (1) - enum value of dpll type,
>> >        - %d (2) - device index provided by parent device.
>> >    - new muxed/shared pin registration:
>> > 	   Let the kernel module to register a shared or muxed pin without finding
>> >      it or its parent. Instead use a parent/shared pin description to find
>> >      correct pin internally in dpll_core, simplifing a dpll API
>> > * Implement complex DPLL design in ice driver (Arkadiusz)
>> > * Remove ptp_ocp driver from the series for now
>> > v3 -> v4:
>> > * redesign framework to make pins dynamically allocated (Arkadiusz)
>> > * implement shared pins (Arkadiusz)
>> > v2 -> v3:
>> > * implement source select mode (Arkadiusz)
>> > * add documentation
>> > * implementation improvements (Jakub)
>> > v1 -> v2:
>> > * implement returning supported input/output types
>> > * ptp_ocp: follow suggestions from Jonathan
>> > * add linux-clk mailing list
>> > v0 -> v1:
>> > * fix code style and errors
>> > * add linux-arm mailing list
>> > 
>> > Arkadiusz Kubalewski (3):
>> >   dpll: spec: Add Netlink spec in YAML
>> >   ice: add admin commands to access cgu configuration
>> >   ice: implement dpll interface to control cgu
>> > 
>> > Vadim Fedorenko (3):
>> >   dpll: Add DPLL framework base functions
>> >   dpll: documentation on DPLL subsystem interface
>> >   ptp_ocp: implement DPLL ops
>> > 
>> > Documentation/netlink/specs/dpll.yaml         |  514 +++++
>> > Documentation/networking/dpll.rst             |  347 ++++
>> > Documentation/networking/index.rst            |    1 +
>> > MAINTAINERS                                   |    9 +
>> > drivers/Kconfig                               |    2 +
>> > drivers/Makefile                              |    1 +
>> > drivers/dpll/Kconfig                          |    7 +
>> > drivers/dpll/Makefile                         |   10 +
>> > drivers/dpll/dpll_core.c                      |  835 ++++++++
>> > drivers/dpll/dpll_core.h                      |   99 +
>> > drivers/dpll/dpll_netlink.c                   | 1065 ++++++++++
>> > drivers/dpll/dpll_netlink.h                   |   30 +
>> > drivers/dpll/dpll_nl.c                        |  126 ++
>> > drivers/dpll/dpll_nl.h                        |   42 +
>> > drivers/net/ethernet/intel/Kconfig            |    1 +
>> > drivers/net/ethernet/intel/ice/Makefile       |    3 +-
>> > drivers/net/ethernet/intel/ice/ice.h          |    5 +
>> > .../net/ethernet/intel/ice/ice_adminq_cmd.h   |  240 ++-
>> > drivers/net/ethernet/intel/ice/ice_common.c   |  467 +++++
>> > drivers/net/ethernet/intel/ice/ice_common.h   |   43 +
>> > drivers/net/ethernet/intel/ice/ice_dpll.c     | 1845 +++++++++++++++++
>> > drivers/net/ethernet/intel/ice/ice_dpll.h     |   96 +
>> > drivers/net/ethernet/intel/ice/ice_lib.c      |   17 +-
>> > drivers/net/ethernet/intel/ice/ice_main.c     |    7 +
>> > drivers/net/ethernet/intel/ice/ice_ptp_hw.c   |  411 ++++
>> > drivers/net/ethernet/intel/ice/ice_ptp_hw.h   |  240 +++
>> > drivers/net/ethernet/intel/ice/ice_type.h     |    1 +
>> > drivers/ptp/Kconfig                           |    1 +
>> > drivers/ptp/ptp_ocp.c                         |  206 +-
>> > include/linux/dpll.h                          |  284 +++
>> > include/uapi/linux/dpll.h                     |  196 ++
>> > 31 files changed, 7135 insertions(+), 16 deletions(-)
>> > create mode 100644 Documentation/netlink/specs/dpll.yaml
>> > create mode 100644 Documentation/networking/dpll.rst
>> > create mode 100644 drivers/dpll/Kconfig
>> > create mode 100644 drivers/dpll/Makefile
>> > create mode 100644 drivers/dpll/dpll_core.c
>> > create mode 100644 drivers/dpll/dpll_core.h
>> > create mode 100644 drivers/dpll/dpll_netlink.c
>> > create mode 100644 drivers/dpll/dpll_netlink.h
>> > create mode 100644 drivers/dpll/dpll_nl.c
>> > create mode 100644 drivers/dpll/dpll_nl.h
>> > create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.c
>> > create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.h
>> > create mode 100644 include/linux/dpll.h
>> > create mode 100644 include/uapi/linux/dpll.h
>> > 
>> > -- 
>> > 2.34.1
>> > 
>
Vadim Fedorenko March 13, 2023, 4:31 p.m. UTC | #4
On 13/03/2023 16:22, Jiri Pirko wrote:
> Mon, Mar 13, 2023 at 04:33:13PM CET, vadim.fedorenko@linux.dev wrote:
>> On 13/03/2023 12:20, Jiri Pirko wrote:
>>> Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>>>> Implement common API for clock/DPLL configuration and status reporting.
>>>> The API utilises netlink interface as transport for commands and event
>>>> notifications. This API aim to extend current pin configuration and
>>>> make it flexible and easy to cover special configurations.
>>>
>>> Could you please put here some command line examples to work with this?
>>
>> We don't have open-source tools ready right now for specific hardware, but
>> with YAML spec published you can use in-kernel tool to manipulate the values,
>> i.e.:
>>
>> ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump
>> device-get
>> ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>> device-get --json '{"id": 0}'
>> ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump
>> pin-get
>> ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>> pin-get --json '{"id": 0, "pin-idx":1}'
>> ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>> pin-set --json '{"id":0, "pin-idx":1, "pin-frequency":1}'
> 
> Yep, that is exactly what I was asking for. Thanks.
> Please try to extend it a bit and add to the cover letter. Gives people
> better understanding of how this works.

Sure, will extend the cover letter in the next version, thanks!

> 
>>
>>>
>>>>
>>>> v5 -> v6:
>>>> * rework pin part to better fit shared pins use cases
>>>> * add YAML spec to easy generate user-space apps
>>>> * simple implementation in ptp_ocp is back again
>>>> v4 -> v5:
>>>> * fix code issues found during last reviews:
>>>>     - replace cookie with clock id
>>>> 	 - follow one naming schema in dpll subsys
>>>> 	 - move function comments to dpll_core.c, fix exports
>>>> 	 - remove single-use helper functions
>>>> 	 - merge device register with alloc
>>>>     - lock and unlock mutex on dpll device release
>>>>     - move dpll_type to uapi header
>>>>     - rename DPLLA_DUMP_FILTER to DPLLA_FILTER
>>>>     - rename dpll_pin_state to dpll_pin_mode
>>>>     - rename DPLL_MODE_FORCED to DPLL_MODE_MANUAL
>>>>     - remove DPLL_CHANGE_PIN_TYPE enum value
>>>> * rewrite framework once again (Arkadiusz)
>>>>     - add clock class:
>>>>       Provide userspace with clock class value of DPLL with dpll device dump
>>>>       netlink request. Clock class is assigned by driver allocating a dpll
>>>>       device. Clock class values are defined as specified in:
>>>>       ITU-T G.8273.2/Y.1368.2 recommendation.
>>>>     - dpll device naming schema use new pattern:
>>>> 	   "dpll_%s_%d_%d", where:
>>>>         - %s - dev_name(parent) of parent device,
>>>>         - %d (1) - enum value of dpll type,
>>>>         - %d (2) - device index provided by parent device.
>>>>     - new muxed/shared pin registration:
>>>> 	   Let the kernel module to register a shared or muxed pin without finding
>>>>       it or its parent. Instead use a parent/shared pin description to find
>>>>       correct pin internally in dpll_core, simplifing a dpll API
>>>> * Implement complex DPLL design in ice driver (Arkadiusz)
>>>> * Remove ptp_ocp driver from the series for now
>>>> v3 -> v4:
>>>> * redesign framework to make pins dynamically allocated (Arkadiusz)
>>>> * implement shared pins (Arkadiusz)
>>>> v2 -> v3:
>>>> * implement source select mode (Arkadiusz)
>>>> * add documentation
>>>> * implementation improvements (Jakub)
>>>> v1 -> v2:
>>>> * implement returning supported input/output types
>>>> * ptp_ocp: follow suggestions from Jonathan
>>>> * add linux-clk mailing list
>>>> v0 -> v1:
>>>> * fix code style and errors
>>>> * add linux-arm mailing list
>>>>
>>>> Arkadiusz Kubalewski (3):
>>>>    dpll: spec: Add Netlink spec in YAML
>>>>    ice: add admin commands to access cgu configuration
>>>>    ice: implement dpll interface to control cgu
>>>>
>>>> Vadim Fedorenko (3):
>>>>    dpll: Add DPLL framework base functions
>>>>    dpll: documentation on DPLL subsystem interface
>>>>    ptp_ocp: implement DPLL ops
>>>>
>>>> Documentation/netlink/specs/dpll.yaml         |  514 +++++
>>>> Documentation/networking/dpll.rst             |  347 ++++
>>>> Documentation/networking/index.rst            |    1 +
>>>> MAINTAINERS                                   |    9 +
>>>> drivers/Kconfig                               |    2 +
>>>> drivers/Makefile                              |    1 +
>>>> drivers/dpll/Kconfig                          |    7 +
>>>> drivers/dpll/Makefile                         |   10 +
>>>> drivers/dpll/dpll_core.c                      |  835 ++++++++
>>>> drivers/dpll/dpll_core.h                      |   99 +
>>>> drivers/dpll/dpll_netlink.c                   | 1065 ++++++++++
>>>> drivers/dpll/dpll_netlink.h                   |   30 +
>>>> drivers/dpll/dpll_nl.c                        |  126 ++
>>>> drivers/dpll/dpll_nl.h                        |   42 +
>>>> drivers/net/ethernet/intel/Kconfig            |    1 +
>>>> drivers/net/ethernet/intel/ice/Makefile       |    3 +-
>>>> drivers/net/ethernet/intel/ice/ice.h          |    5 +
>>>> .../net/ethernet/intel/ice/ice_adminq_cmd.h   |  240 ++-
>>>> drivers/net/ethernet/intel/ice/ice_common.c   |  467 +++++
>>>> drivers/net/ethernet/intel/ice/ice_common.h   |   43 +
>>>> drivers/net/ethernet/intel/ice/ice_dpll.c     | 1845 +++++++++++++++++
>>>> drivers/net/ethernet/intel/ice/ice_dpll.h     |   96 +
>>>> drivers/net/ethernet/intel/ice/ice_lib.c      |   17 +-
>>>> drivers/net/ethernet/intel/ice/ice_main.c     |    7 +
>>>> drivers/net/ethernet/intel/ice/ice_ptp_hw.c   |  411 ++++
>>>> drivers/net/ethernet/intel/ice/ice_ptp_hw.h   |  240 +++
>>>> drivers/net/ethernet/intel/ice/ice_type.h     |    1 +
>>>> drivers/ptp/Kconfig                           |    1 +
>>>> drivers/ptp/ptp_ocp.c                         |  206 +-
>>>> include/linux/dpll.h                          |  284 +++
>>>> include/uapi/linux/dpll.h                     |  196 ++
>>>> 31 files changed, 7135 insertions(+), 16 deletions(-)
>>>> create mode 100644 Documentation/netlink/specs/dpll.yaml
>>>> create mode 100644 Documentation/networking/dpll.rst
>>>> create mode 100644 drivers/dpll/Kconfig
>>>> create mode 100644 drivers/dpll/Makefile
>>>> create mode 100644 drivers/dpll/dpll_core.c
>>>> create mode 100644 drivers/dpll/dpll_core.h
>>>> create mode 100644 drivers/dpll/dpll_netlink.c
>>>> create mode 100644 drivers/dpll/dpll_netlink.h
>>>> create mode 100644 drivers/dpll/dpll_nl.c
>>>> create mode 100644 drivers/dpll/dpll_nl.h
>>>> create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.c
>>>> create mode 100644 drivers/net/ethernet/intel/ice/ice_dpll.h
>>>> create mode 100644 include/linux/dpll.h
>>>> create mode 100644 include/uapi/linux/dpll.h
>>>>
>>>> -- 
>>>> 2.34.1
>>>>
>>
Jiri Pirko March 17, 2023, 4:10 p.m. UTC | #5
Mon, Mar 13, 2023 at 04:33:13PM CET, vadim.fedorenko@linux.dev wrote:
>On 13/03/2023 12:20, Jiri Pirko wrote:
>> Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>> > Implement common API for clock/DPLL configuration and status reporting.
>> > The API utilises netlink interface as transport for commands and event
>> > notifications. This API aim to extend current pin configuration and
>> > make it flexible and easy to cover special configurations.
>> 
>> Could you please put here some command line examples to work with this?
>
>We don't have open-source tools ready right now for specific hardware, but
>with YAML spec published you can use in-kernel tool to manipulate the values,
>i.e.:
>
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump
>device-get
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>device-get --json '{"id": 0}'
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --dump
>pin-get
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>pin-get --json '{"id": 0, "pin-idx":1}'
>./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do
>pin-set --json '{"id":0, "pin-idx":1, "pin-frequency":1}'

Interesting, is this working for you?
I'm experiencing some issue with cmd value. Example:
./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do device-get --json '{"id": 0}'
this should send DPLL_CMD_DEVICE_GET which is 1.
In kernel genl_family_rcv_msg() the hdr->cmd is 2
Any idea what might be wrong?
Jakub Kicinski March 18, 2023, 5:01 a.m. UTC | #6
On Fri, 17 Mar 2023 17:10:04 +0100 Jiri Pirko wrote:
> Interesting, is this working for you?
> I'm experiencing some issue with cmd value. Example:
> ./tools/net/ynl/cli.py --spec Documentation/netlink/specs/dpll.yaml --do device-get --json '{"id": 0}'
> this should send DPLL_CMD_DEVICE_GET which is 1.
> In kernel genl_family_rcv_msg() the hdr->cmd is 2
> Any idea what might be wrong?

I changed the default value for the first element of an attribute set
from 0 to 1 to avoid having to add all those (pointless?)

+      -
+        name: unspec
+        doc: unspecified value

at the start. So delete those or explicitly set them to value: 0.

See commit ad4fafcde5bc ("tools: ynl: use 1 as the default for first
entry in attrs/ops").
Jiri Pirko March 23, 2023, 11:21 a.m. UTC | #7
Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>Implement common API for clock/DPLL configuration and status reporting.
>The API utilises netlink interface as transport for commands and event
>notifications. This API aim to extend current pin configuration and
>make it flexible and easy to cover special configurations.
>
>v5 -> v6:
> * rework pin part to better fit shared pins use cases
> * add YAML spec to easy generate user-space apps
> * simple implementation in ptp_ocp is back again


Vadim, Arkadiusz.

I have couple of patches on top of this one and mlx5 implementation.
I would like to send it to you until Sunday. Could you include those to
the next rfc?

I will not review this version more now. Lets do the changes, I will
continue with the review on the next version of rfc.

Thanks!
Vadim Fedorenko March 23, 2023, 6 p.m. UTC | #8
On 23/03/2023 11:21, Jiri Pirko wrote:
> Sun, Mar 12, 2023 at 03:28:01AM CET, vadfed@meta.com wrote:
>> Implement common API for clock/DPLL configuration and status reporting.
>> The API utilises netlink interface as transport for commands and event
>> notifications. This API aim to extend current pin configuration and
>> make it flexible and easy to cover special configurations.
>>
>> v5 -> v6:
>> * rework pin part to better fit shared pins use cases
>> * add YAML spec to easy generate user-space apps
>> * simple implementation in ptp_ocp is back again
> 
> 
> Vadim, Arkadiusz.
> 
> I have couple of patches on top of this one and mlx5 implementation.
> I would like to send it to you until Sunday. Could you include those to
> the next rfc?
> 
> I will not review this version more now. Lets do the changes, I will
> continue with the review on the next version of rfc.
> 
> Thanks!

Hi Jiri!

I'm going to spend Friday and weekend polishing the series to address as 
much comments as I can and publish v7 next week. You can send your 
patches prepared on top of github version, that would be the best way to 
have them ready for the next round.

Thanks,
Vadim