dpaa2-eth: add APIs of 1588 single step timestamping

This patch is to add APIs of 1588 single step timestamping.

- dpni_set_single_step_cfg
- dpni_get_single_step_cfg

Signed-off-by: Yangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
This commit is contained in:
Yangbo Lu 2020-09-18 17:07:58 +08:00 committed by David S. Miller
parent 7b066d173b
commit 23cd4f27f1
3 changed files with 131 additions and 0 deletions

View File

@ -1,6 +1,7 @@
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
/* Copyright 2013-2016 Freescale Semiconductor Inc.
* Copyright 2016 NXP
* Copyright 2020 NXP
*/
#ifndef _FSL_DPNI_CMD_H
#define _FSL_DPNI_CMD_H
@ -90,6 +91,9 @@
#define DPNI_CMDID_SET_RX_HASH_DIST DPNI_CMD(0x274)
#define DPNI_CMDID_GET_LINK_CFG DPNI_CMD(0x278)
#define DPNI_CMDID_SET_SINGLE_STEP_CFG DPNI_CMD(0x279)
#define DPNI_CMDID_GET_SINGLE_STEP_CFG DPNI_CMD(0x27a)
/* Macros for accessing command fields smaller than 1byte */
#define DPNI_MASK(field) \
GENMASK(DPNI_##field##_SHIFT + DPNI_##field##_SIZE - 1, \
@ -639,4 +643,21 @@ struct dpni_cmd_set_tx_shaping {
u8 coupled;
};
#define DPNI_PTP_ENABLE_SHIFT 0
#define DPNI_PTP_ENABLE_SIZE 1
#define DPNI_PTP_CH_UPDATE_SHIFT 1
#define DPNI_PTP_CH_UPDATE_SIZE 1
struct dpni_cmd_single_step_cfg {
__le16 flags;
__le16 offset;
__le32 peer_delay;
};
struct dpni_rsp_single_step_cfg {
__le16 flags;
__le16 offset;
__le32 peer_delay;
};
#endif /* _FSL_DPNI_CMD_H */

View File

@ -1,6 +1,7 @@
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
/* Copyright 2013-2016 Freescale Semiconductor Inc.
* Copyright 2016 NXP
* Copyright 2020 NXP
*/
#include <linux/kernel.h>
#include <linux/errno.h>
@ -1999,3 +2000,81 @@ int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
/* send command to mc*/
return mc_send_command(mc_io, &cmd);
}
/**
* dpni_get_single_step_cfg() - return current configuration for
* single step PTP
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @ptp_cfg: ptp single step configuration
*
* Return: '0' on Success; Error code otherwise.
*
*/
int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io,
u32 cmd_flags,
u16 token,
struct dpni_single_step_cfg *ptp_cfg)
{
struct dpni_rsp_single_step_cfg *rsp_params;
struct fsl_mc_command cmd = { 0 };
int err;
/* prepare command */
cmd.header = mc_encode_cmd_header(DPNI_CMDID_GET_SINGLE_STEP_CFG,
cmd_flags, token);
/* send command to mc*/
err = mc_send_command(mc_io, &cmd);
if (err)
return err;
/* read command response */
rsp_params = (struct dpni_rsp_single_step_cfg *)cmd.params;
ptp_cfg->offset = le16_to_cpu(rsp_params->offset);
ptp_cfg->en = dpni_get_field(le16_to_cpu(rsp_params->flags),
PTP_ENABLE) ? 1 : 0;
ptp_cfg->ch_update = dpni_get_field(le16_to_cpu(rsp_params->flags),
PTP_CH_UPDATE) ? 1 : 0;
ptp_cfg->peer_delay = le32_to_cpu(rsp_params->peer_delay);
return err;
}
/**
* dpni_set_single_step_cfg() - enable/disable and configure single step PTP
* @mc_io: Pointer to MC portal's I/O object
* @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
* @token: Token of DPNI object
* @ptp_cfg: ptp single step configuration
*
* Return: '0' on Success; Error code otherwise.
*
* The function has effect only when dpni object is connected to a dpmac
* object. If the dpni is not connected to a dpmac the configuration will
* be stored inside and applied when connection is made.
*/
int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io,
u32 cmd_flags,
u16 token,
struct dpni_single_step_cfg *ptp_cfg)
{
struct dpni_cmd_single_step_cfg *cmd_params;
struct fsl_mc_command cmd = { 0 };
u16 flags;
/* prepare command */
cmd.header = mc_encode_cmd_header(DPNI_CMDID_SET_SINGLE_STEP_CFG,
cmd_flags, token);
cmd_params = (struct dpni_cmd_single_step_cfg *)cmd.params;
cmd_params->offset = cpu_to_le16(ptp_cfg->offset);
cmd_params->peer_delay = cpu_to_le32(ptp_cfg->peer_delay);
flags = le16_to_cpu(cmd_params->flags);
dpni_set_field(flags, PTP_ENABLE, !!ptp_cfg->en);
dpni_set_field(flags, PTP_CH_UPDATE, !!ptp_cfg->ch_update);
cmd_params->flags = cpu_to_le16(flags);
/* send command to mc*/
return mc_send_command(mc_io, &cmd);
}

View File

@ -1,6 +1,7 @@
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
/* Copyright 2013-2016 Freescale Semiconductor Inc.
* Copyright 2016 NXP
* Copyright 2020 NXP
*/
#ifndef __FSL_DPNI_H
#define __FSL_DPNI_H
@ -1079,4 +1080,34 @@ int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
const struct dpni_tx_shaping_cfg *tx_er_shaper,
int coupled);
/**
* struct dpni_single_step_cfg - configure single step PTP (IEEE 1588)
* @en: enable single step PTP. When enabled the PTPv1 functionality
* will not work. If the field is zero, offset and ch_update
* parameters will be ignored
* @offset: start offset from the beginning of the frame where
* timestamp field is found. The offset must respect all MAC
* headers, VLAN tags and other protocol headers
* @ch_update: when set UDP checksum will be updated inside packet
* @peer_delay: For peer-to-peer transparent clocks add this value to the
* correction field in addition to the transient time update.
* The value expresses nanoseconds.
*/
struct dpni_single_step_cfg {
u8 en;
u8 ch_update;
u16 offset;
u32 peer_delay;
};
int dpni_set_single_step_cfg(struct fsl_mc_io *mc_io,
u32 cmd_flags,
u16 token,
struct dpni_single_step_cfg *ptp_cfg);
int dpni_get_single_step_cfg(struct fsl_mc_io *mc_io,
u32 cmd_flags,
u16 token,
struct dpni_single_step_cfg *ptp_cfg);
#endif /* __FSL_DPNI_H */