Commit 060ce503 authored by Andrei Botila's avatar Andrei Botila Committed by Herbert Xu
Browse files

crypto: caam/qi2 - add support for dpseci_reset()



Add support for dpseci_reset() command for DPSECI objects.
For DPSECI DPAA2 objects with version lower than v5.4 reset command
was broken in MC f/w.

Signed-off-by: default avatarAndrei Botila <andrei.botila@nxp.com>
Reviewed-by: default avatarHoria Geantă <horia.geanta@nxp.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 7f94adf2
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -4697,6 +4697,13 @@ static void dpaa2_dpseci_free(struct dpaa2_caam_priv *priv)
{
	struct device *dev = priv->dev;
	struct fsl_mc_device *ls_dev = to_fsl_mc_device(dev);
	int err;

	if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) {
		err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle);
		if (err)
			dev_err(dev, "dpseci_reset() failed\n");
	}

	dpaa2_dpseci_congestion_free(priv);
	dpseci_close(priv->mc_io, 0, ls_dev->mc_handle);
@@ -4894,6 +4901,14 @@ static int __cold dpaa2_dpseci_setup(struct fsl_mc_device *ls_dev)

	dev_info(dev, "dpseci v%d.%d\n", priv->major_ver, priv->minor_ver);

	if (DPSECI_VER(priv->major_ver, priv->minor_ver) > DPSECI_VER(5, 3)) {
		err = dpseci_reset(priv->mc_io, 0, ls_dev->mc_handle);
		if (err) {
			dev_err(dev, "dpseci_reset() failed\n");
			goto err_get_vers;
		}
	}

	err = dpseci_get_attributes(priv->mc_io, 0, ls_dev->mc_handle,
				    &priv->dpseci_attr);
	if (err) {
+18 −0
Original line number Diff line number Diff line
@@ -103,6 +103,24 @@ int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
	return mc_send_command(mc_io, &cmd);
}

/**
 * dpseci_reset() - Reset the DPSECI, returns the object to initial state
 * @mc_io:	Pointer to MC portal's I/O object
 * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
 * @token:	Token of DPSECI object
 *
 * Return:	'0' on success, error code otherwise
 */
int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
{
	struct fsl_mc_command cmd = { 0 };

	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET,
					  cmd_flags,
					  token);
	return mc_send_command(mc_io, &cmd);
}

/**
 * dpseci_is_enabled() - Check if the DPSECI is enabled.
 * @mc_io:	Pointer to MC portal's I/O object
+2 −0
Original line number Diff line number Diff line
@@ -59,6 +59,8 @@ int dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);

int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);

int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token);

int dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
		      int *en);

+1 −0
Original line number Diff line number Diff line
@@ -33,6 +33,7 @@
#define DPSECI_CMDID_ENABLE				DPSECI_CMD_V1(0x002)
#define DPSECI_CMDID_DISABLE				DPSECI_CMD_V1(0x003)
#define DPSECI_CMDID_GET_ATTR				DPSECI_CMD_V1(0x004)
#define DPSECI_CMDID_RESET				DPSECI_CMD_V1(0x005)
#define DPSECI_CMDID_IS_ENABLED				DPSECI_CMD_V1(0x006)

#define DPSECI_CMDID_SET_RX_QUEUE			DPSECI_CMD_V1(0x194)