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:
parent
7b066d173b
commit
23cd4f27f1
|
@ -1,6 +1,7 @@
|
||||||
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
|
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
|
||||||
/* Copyright 2013-2016 Freescale Semiconductor Inc.
|
/* Copyright 2013-2016 Freescale Semiconductor Inc.
|
||||||
* Copyright 2016 NXP
|
* Copyright 2016 NXP
|
||||||
|
* Copyright 2020 NXP
|
||||||
*/
|
*/
|
||||||
#ifndef _FSL_DPNI_CMD_H
|
#ifndef _FSL_DPNI_CMD_H
|
||||||
#define _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_SET_RX_HASH_DIST DPNI_CMD(0x274)
|
||||||
#define DPNI_CMDID_GET_LINK_CFG DPNI_CMD(0x278)
|
#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 */
|
/* Macros for accessing command fields smaller than 1byte */
|
||||||
#define DPNI_MASK(field) \
|
#define DPNI_MASK(field) \
|
||||||
GENMASK(DPNI_##field##_SHIFT + DPNI_##field##_SIZE - 1, \
|
GENMASK(DPNI_##field##_SHIFT + DPNI_##field##_SIZE - 1, \
|
||||||
|
@ -639,4 +643,21 @@ struct dpni_cmd_set_tx_shaping {
|
||||||
u8 coupled;
|
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 */
|
#endif /* _FSL_DPNI_CMD_H */
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
|
||||||
/* Copyright 2013-2016 Freescale Semiconductor Inc.
|
/* Copyright 2013-2016 Freescale Semiconductor Inc.
|
||||||
* Copyright 2016 NXP
|
* Copyright 2016 NXP
|
||||||
|
* Copyright 2020 NXP
|
||||||
*/
|
*/
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
|
@ -1999,3 +2000,81 @@ int dpni_set_tx_shaping(struct fsl_mc_io *mc_io,
|
||||||
/* send command to mc*/
|
/* send command to mc*/
|
||||||
return mc_send_command(mc_io, &cmd);
|
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);
|
||||||
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
|
/* SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause) */
|
||||||
/* Copyright 2013-2016 Freescale Semiconductor Inc.
|
/* Copyright 2013-2016 Freescale Semiconductor Inc.
|
||||||
* Copyright 2016 NXP
|
* Copyright 2016 NXP
|
||||||
|
* Copyright 2020 NXP
|
||||||
*/
|
*/
|
||||||
#ifndef __FSL_DPNI_H
|
#ifndef __FSL_DPNI_H
|
||||||
#define __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,
|
const struct dpni_tx_shaping_cfg *tx_er_shaper,
|
||||||
int coupled);
|
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 */
|
#endif /* __FSL_DPNI_H */
|
||||||
|
|
Loading…
Reference in New Issue