Commit 23cd4f27 authored by Yangbo Lu's avatar Yangbo Lu Committed by David S. Miller
Browse files

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: default avatarYangbo Lu <yangbo.lu@nxp.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 7b066d17
Loading
Loading
Loading
Loading
+21 −0
Original line number Diff line number Diff line
/* 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 */
+79 −0
Original line number Diff line number Diff line
// 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);
}
+31 −0
Original line number Diff line number Diff line
/* 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 */