162306a36Sopenharmony_ci// SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
262306a36Sopenharmony_ci/*
362306a36Sopenharmony_ci * Copyright 2013-2016 Freescale Semiconductor Inc.
462306a36Sopenharmony_ci * Copyright 2017-2018 NXP
562306a36Sopenharmony_ci */
662306a36Sopenharmony_ci
762306a36Sopenharmony_ci#include <linux/fsl/mc.h>
862306a36Sopenharmony_ci#include "dpseci.h"
962306a36Sopenharmony_ci#include "dpseci_cmd.h"
1062306a36Sopenharmony_ci
1162306a36Sopenharmony_ci/**
1262306a36Sopenharmony_ci * dpseci_open() - Open a control session for the specified object
1362306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
1462306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
1562306a36Sopenharmony_ci * @dpseci_id:	DPSECI unique ID
1662306a36Sopenharmony_ci * @token:	Returned token; use in subsequent API calls
1762306a36Sopenharmony_ci *
1862306a36Sopenharmony_ci * This function can be used to open a control session for an already created
1962306a36Sopenharmony_ci * object; an object may have been declared statically in the DPL
2062306a36Sopenharmony_ci * or created dynamically.
2162306a36Sopenharmony_ci * This function returns a unique authentication token, associated with the
2262306a36Sopenharmony_ci * specific object ID and the specific MC portal; this token must be used in all
2362306a36Sopenharmony_ci * subsequent commands for this specific object.
2462306a36Sopenharmony_ci *
2562306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
2662306a36Sopenharmony_ci */
2762306a36Sopenharmony_ciint dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id,
2862306a36Sopenharmony_ci		u16 *token)
2962306a36Sopenharmony_ci{
3062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
3162306a36Sopenharmony_ci	struct dpseci_cmd_open *cmd_params;
3262306a36Sopenharmony_ci	int err;
3362306a36Sopenharmony_ci
3462306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_OPEN,
3562306a36Sopenharmony_ci					  cmd_flags,
3662306a36Sopenharmony_ci					  0);
3762306a36Sopenharmony_ci	cmd_params = (struct dpseci_cmd_open *)cmd.params;
3862306a36Sopenharmony_ci	cmd_params->dpseci_id = cpu_to_le32(dpseci_id);
3962306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
4062306a36Sopenharmony_ci	if (err)
4162306a36Sopenharmony_ci		return err;
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_ci	*token = mc_cmd_hdr_read_token(&cmd);
4462306a36Sopenharmony_ci
4562306a36Sopenharmony_ci	return 0;
4662306a36Sopenharmony_ci}
4762306a36Sopenharmony_ci
4862306a36Sopenharmony_ci/**
4962306a36Sopenharmony_ci * dpseci_close() - Close the control session of the object
5062306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
5162306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
5262306a36Sopenharmony_ci * @token:	Token of DPSECI object
5362306a36Sopenharmony_ci *
5462306a36Sopenharmony_ci * After this function is called, no further operations are allowed on the
5562306a36Sopenharmony_ci * object without opening a new control session.
5662306a36Sopenharmony_ci *
5762306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
5862306a36Sopenharmony_ci */
5962306a36Sopenharmony_ciint dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
6062306a36Sopenharmony_ci{
6162306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
6262306a36Sopenharmony_ci
6362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_CLOSE,
6462306a36Sopenharmony_ci					  cmd_flags,
6562306a36Sopenharmony_ci					  token);
6662306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
6762306a36Sopenharmony_ci}
6862306a36Sopenharmony_ci
6962306a36Sopenharmony_ci/**
7062306a36Sopenharmony_ci * dpseci_enable() - Enable the DPSECI, allow sending and receiving frames
7162306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
7262306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
7362306a36Sopenharmony_ci * @token:	Token of DPSECI object
7462306a36Sopenharmony_ci *
7562306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
7662306a36Sopenharmony_ci */
7762306a36Sopenharmony_ciint dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
7862306a36Sopenharmony_ci{
7962306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
8062306a36Sopenharmony_ci
8162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_ENABLE,
8262306a36Sopenharmony_ci					  cmd_flags,
8362306a36Sopenharmony_ci					  token);
8462306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
8562306a36Sopenharmony_ci}
8662306a36Sopenharmony_ci
8762306a36Sopenharmony_ci/**
8862306a36Sopenharmony_ci * dpseci_disable() - Disable the DPSECI, stop sending and receiving frames
8962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
9062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
9162306a36Sopenharmony_ci * @token:	Token of DPSECI object
9262306a36Sopenharmony_ci *
9362306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
9462306a36Sopenharmony_ci */
9562306a36Sopenharmony_ciint dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
9662306a36Sopenharmony_ci{
9762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
9862306a36Sopenharmony_ci
9962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_DISABLE,
10062306a36Sopenharmony_ci					  cmd_flags,
10162306a36Sopenharmony_ci					  token);
10262306a36Sopenharmony_ci
10362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
10462306a36Sopenharmony_ci}
10562306a36Sopenharmony_ci
10662306a36Sopenharmony_ci/**
10762306a36Sopenharmony_ci * dpseci_reset() - Reset the DPSECI, returns the object to initial state
10862306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
10962306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
11062306a36Sopenharmony_ci * @token:	Token of DPSECI object
11162306a36Sopenharmony_ci *
11262306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
11362306a36Sopenharmony_ci */
11462306a36Sopenharmony_ciint dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
11562306a36Sopenharmony_ci{
11662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
11762306a36Sopenharmony_ci
11862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET,
11962306a36Sopenharmony_ci					  cmd_flags,
12062306a36Sopenharmony_ci					  token);
12162306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
12262306a36Sopenharmony_ci}
12362306a36Sopenharmony_ci
12462306a36Sopenharmony_ci/**
12562306a36Sopenharmony_ci * dpseci_is_enabled() - Check if the DPSECI is enabled.
12662306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
12762306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
12862306a36Sopenharmony_ci * @token:	Token of DPSECI object
12962306a36Sopenharmony_ci * @en:		Returns '1' if object is enabled; '0' otherwise
13062306a36Sopenharmony_ci *
13162306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
13262306a36Sopenharmony_ci */
13362306a36Sopenharmony_ciint dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
13462306a36Sopenharmony_ci		      int *en)
13562306a36Sopenharmony_ci{
13662306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
13762306a36Sopenharmony_ci	struct dpseci_rsp_is_enabled *rsp_params;
13862306a36Sopenharmony_ci	int err;
13962306a36Sopenharmony_ci
14062306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_IS_ENABLED,
14162306a36Sopenharmony_ci					  cmd_flags,
14262306a36Sopenharmony_ci					  token);
14362306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
14462306a36Sopenharmony_ci	if (err)
14562306a36Sopenharmony_ci		return err;
14662306a36Sopenharmony_ci
14762306a36Sopenharmony_ci	rsp_params = (struct dpseci_rsp_is_enabled *)cmd.params;
14862306a36Sopenharmony_ci	*en = dpseci_get_field(rsp_params->is_enabled, ENABLE);
14962306a36Sopenharmony_ci
15062306a36Sopenharmony_ci	return 0;
15162306a36Sopenharmony_ci}
15262306a36Sopenharmony_ci
15362306a36Sopenharmony_ci/**
15462306a36Sopenharmony_ci * dpseci_get_attributes() - Retrieve DPSECI attributes
15562306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
15662306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
15762306a36Sopenharmony_ci * @token:	Token of DPSECI object
15862306a36Sopenharmony_ci * @attr:	Returned object's attributes
15962306a36Sopenharmony_ci *
16062306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
16162306a36Sopenharmony_ci */
16262306a36Sopenharmony_ciint dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
16362306a36Sopenharmony_ci			  struct dpseci_attr *attr)
16462306a36Sopenharmony_ci{
16562306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
16662306a36Sopenharmony_ci	struct dpseci_rsp_get_attributes *rsp_params;
16762306a36Sopenharmony_ci	int err;
16862306a36Sopenharmony_ci
16962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_ATTR,
17062306a36Sopenharmony_ci					  cmd_flags,
17162306a36Sopenharmony_ci					  token);
17262306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
17362306a36Sopenharmony_ci	if (err)
17462306a36Sopenharmony_ci		return err;
17562306a36Sopenharmony_ci
17662306a36Sopenharmony_ci	rsp_params = (struct dpseci_rsp_get_attributes *)cmd.params;
17762306a36Sopenharmony_ci	attr->id = le32_to_cpu(rsp_params->id);
17862306a36Sopenharmony_ci	attr->num_tx_queues = rsp_params->num_tx_queues;
17962306a36Sopenharmony_ci	attr->num_rx_queues = rsp_params->num_rx_queues;
18062306a36Sopenharmony_ci	attr->options = le32_to_cpu(rsp_params->options);
18162306a36Sopenharmony_ci
18262306a36Sopenharmony_ci	return 0;
18362306a36Sopenharmony_ci}
18462306a36Sopenharmony_ci
18562306a36Sopenharmony_ci/**
18662306a36Sopenharmony_ci * dpseci_set_rx_queue() - Set Rx queue configuration
18762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
18862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
18962306a36Sopenharmony_ci * @token:	Token of DPSECI object
19062306a36Sopenharmony_ci * @queue:	Select the queue relative to number of priorities configured at
19162306a36Sopenharmony_ci *		DPSECI creation; use DPSECI_ALL_QUEUES to configure all
19262306a36Sopenharmony_ci *		Rx queues identically.
19362306a36Sopenharmony_ci * @cfg:	Rx queue configuration
19462306a36Sopenharmony_ci *
19562306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
19662306a36Sopenharmony_ci */
19762306a36Sopenharmony_ciint dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
19862306a36Sopenharmony_ci			u8 queue, const struct dpseci_rx_queue_cfg *cfg)
19962306a36Sopenharmony_ci{
20062306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
20162306a36Sopenharmony_ci	struct dpseci_cmd_queue *cmd_params;
20262306a36Sopenharmony_ci
20362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_SET_RX_QUEUE,
20462306a36Sopenharmony_ci					  cmd_flags,
20562306a36Sopenharmony_ci					  token);
20662306a36Sopenharmony_ci	cmd_params = (struct dpseci_cmd_queue *)cmd.params;
20762306a36Sopenharmony_ci	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
20862306a36Sopenharmony_ci	cmd_params->priority = cfg->dest_cfg.priority;
20962306a36Sopenharmony_ci	cmd_params->queue = queue;
21062306a36Sopenharmony_ci	dpseci_set_field(cmd_params->dest_type, DEST_TYPE,
21162306a36Sopenharmony_ci			 cfg->dest_cfg.dest_type);
21262306a36Sopenharmony_ci	cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
21362306a36Sopenharmony_ci	cmd_params->options = cpu_to_le32(cfg->options);
21462306a36Sopenharmony_ci	dpseci_set_field(cmd_params->order_preservation_en, ORDER_PRESERVATION,
21562306a36Sopenharmony_ci			 cfg->order_preservation_en);
21662306a36Sopenharmony_ci
21762306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
21862306a36Sopenharmony_ci}
21962306a36Sopenharmony_ci
22062306a36Sopenharmony_ci/**
22162306a36Sopenharmony_ci * dpseci_get_rx_queue() - Retrieve Rx queue attributes
22262306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
22362306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
22462306a36Sopenharmony_ci * @token:	Token of DPSECI object
22562306a36Sopenharmony_ci * @queue:	Select the queue relative to number of priorities configured at
22662306a36Sopenharmony_ci *		DPSECI creation
22762306a36Sopenharmony_ci * @attr:	Returned Rx queue attributes
22862306a36Sopenharmony_ci *
22962306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
23062306a36Sopenharmony_ci */
23162306a36Sopenharmony_ciint dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
23262306a36Sopenharmony_ci			u8 queue, struct dpseci_rx_queue_attr *attr)
23362306a36Sopenharmony_ci{
23462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
23562306a36Sopenharmony_ci	struct dpseci_cmd_queue *cmd_params;
23662306a36Sopenharmony_ci	int err;
23762306a36Sopenharmony_ci
23862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE,
23962306a36Sopenharmony_ci					  cmd_flags,
24062306a36Sopenharmony_ci					  token);
24162306a36Sopenharmony_ci	cmd_params = (struct dpseci_cmd_queue *)cmd.params;
24262306a36Sopenharmony_ci	cmd_params->queue = queue;
24362306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
24462306a36Sopenharmony_ci	if (err)
24562306a36Sopenharmony_ci		return err;
24662306a36Sopenharmony_ci
24762306a36Sopenharmony_ci	attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id);
24862306a36Sopenharmony_ci	attr->dest_cfg.priority = cmd_params->priority;
24962306a36Sopenharmony_ci	attr->dest_cfg.dest_type = dpseci_get_field(cmd_params->dest_type,
25062306a36Sopenharmony_ci						    DEST_TYPE);
25162306a36Sopenharmony_ci	attr->user_ctx = le64_to_cpu(cmd_params->user_ctx);
25262306a36Sopenharmony_ci	attr->fqid = le32_to_cpu(cmd_params->fqid);
25362306a36Sopenharmony_ci	attr->order_preservation_en =
25462306a36Sopenharmony_ci		dpseci_get_field(cmd_params->order_preservation_en,
25562306a36Sopenharmony_ci				 ORDER_PRESERVATION);
25662306a36Sopenharmony_ci
25762306a36Sopenharmony_ci	return 0;
25862306a36Sopenharmony_ci}
25962306a36Sopenharmony_ci
26062306a36Sopenharmony_ci/**
26162306a36Sopenharmony_ci * dpseci_get_tx_queue() - Retrieve Tx queue attributes
26262306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
26362306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
26462306a36Sopenharmony_ci * @token:	Token of DPSECI object
26562306a36Sopenharmony_ci * @queue:	Select the queue relative to number of priorities configured at
26662306a36Sopenharmony_ci *		DPSECI creation
26762306a36Sopenharmony_ci * @attr:	Returned Tx queue attributes
26862306a36Sopenharmony_ci *
26962306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
27062306a36Sopenharmony_ci */
27162306a36Sopenharmony_ciint dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
27262306a36Sopenharmony_ci			u8 queue, struct dpseci_tx_queue_attr *attr)
27362306a36Sopenharmony_ci{
27462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
27562306a36Sopenharmony_ci	struct dpseci_cmd_queue *cmd_params;
27662306a36Sopenharmony_ci	struct dpseci_rsp_get_tx_queue *rsp_params;
27762306a36Sopenharmony_ci	int err;
27862306a36Sopenharmony_ci
27962306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE,
28062306a36Sopenharmony_ci					  cmd_flags,
28162306a36Sopenharmony_ci					  token);
28262306a36Sopenharmony_ci	cmd_params = (struct dpseci_cmd_queue *)cmd.params;
28362306a36Sopenharmony_ci	cmd_params->queue = queue;
28462306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
28562306a36Sopenharmony_ci	if (err)
28662306a36Sopenharmony_ci		return err;
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci	rsp_params = (struct dpseci_rsp_get_tx_queue *)cmd.params;
28962306a36Sopenharmony_ci	attr->fqid = le32_to_cpu(rsp_params->fqid);
29062306a36Sopenharmony_ci	attr->priority = rsp_params->priority;
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci	return 0;
29362306a36Sopenharmony_ci}
29462306a36Sopenharmony_ci
29562306a36Sopenharmony_ci/**
29662306a36Sopenharmony_ci * dpseci_get_sec_attr() - Retrieve SEC accelerator attributes
29762306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
29862306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
29962306a36Sopenharmony_ci * @token:	Token of DPSECI object
30062306a36Sopenharmony_ci * @attr:	Returned SEC attributes
30162306a36Sopenharmony_ci *
30262306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
30362306a36Sopenharmony_ci */
30462306a36Sopenharmony_ciint dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
30562306a36Sopenharmony_ci			struct dpseci_sec_attr *attr)
30662306a36Sopenharmony_ci{
30762306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
30862306a36Sopenharmony_ci	struct dpseci_rsp_get_sec_attr *rsp_params;
30962306a36Sopenharmony_ci	int err;
31062306a36Sopenharmony_ci
31162306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_SEC_ATTR,
31262306a36Sopenharmony_ci					  cmd_flags,
31362306a36Sopenharmony_ci					  token);
31462306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
31562306a36Sopenharmony_ci	if (err)
31662306a36Sopenharmony_ci		return err;
31762306a36Sopenharmony_ci
31862306a36Sopenharmony_ci	rsp_params = (struct dpseci_rsp_get_sec_attr *)cmd.params;
31962306a36Sopenharmony_ci	attr->ip_id = le16_to_cpu(rsp_params->ip_id);
32062306a36Sopenharmony_ci	attr->major_rev = rsp_params->major_rev;
32162306a36Sopenharmony_ci	attr->minor_rev = rsp_params->minor_rev;
32262306a36Sopenharmony_ci	attr->era = rsp_params->era;
32362306a36Sopenharmony_ci	attr->deco_num = rsp_params->deco_num;
32462306a36Sopenharmony_ci	attr->zuc_auth_acc_num = rsp_params->zuc_auth_acc_num;
32562306a36Sopenharmony_ci	attr->zuc_enc_acc_num = rsp_params->zuc_enc_acc_num;
32662306a36Sopenharmony_ci	attr->snow_f8_acc_num = rsp_params->snow_f8_acc_num;
32762306a36Sopenharmony_ci	attr->snow_f9_acc_num = rsp_params->snow_f9_acc_num;
32862306a36Sopenharmony_ci	attr->crc_acc_num = rsp_params->crc_acc_num;
32962306a36Sopenharmony_ci	attr->pk_acc_num = rsp_params->pk_acc_num;
33062306a36Sopenharmony_ci	attr->kasumi_acc_num = rsp_params->kasumi_acc_num;
33162306a36Sopenharmony_ci	attr->rng_acc_num = rsp_params->rng_acc_num;
33262306a36Sopenharmony_ci	attr->md_acc_num = rsp_params->md_acc_num;
33362306a36Sopenharmony_ci	attr->arc4_acc_num = rsp_params->arc4_acc_num;
33462306a36Sopenharmony_ci	attr->des_acc_num = rsp_params->des_acc_num;
33562306a36Sopenharmony_ci	attr->aes_acc_num = rsp_params->aes_acc_num;
33662306a36Sopenharmony_ci	attr->ccha_acc_num = rsp_params->ccha_acc_num;
33762306a36Sopenharmony_ci	attr->ptha_acc_num = rsp_params->ptha_acc_num;
33862306a36Sopenharmony_ci
33962306a36Sopenharmony_ci	return 0;
34062306a36Sopenharmony_ci}
34162306a36Sopenharmony_ci
34262306a36Sopenharmony_ci/**
34362306a36Sopenharmony_ci * dpseci_get_api_version() - Get Data Path SEC Interface API version
34462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
34562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
34662306a36Sopenharmony_ci * @major_ver:	Major version of data path sec API
34762306a36Sopenharmony_ci * @minor_ver:	Minor version of data path sec API
34862306a36Sopenharmony_ci *
34962306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
35062306a36Sopenharmony_ci */
35162306a36Sopenharmony_ciint dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
35262306a36Sopenharmony_ci			   u16 *major_ver, u16 *minor_ver)
35362306a36Sopenharmony_ci{
35462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
35562306a36Sopenharmony_ci	struct dpseci_rsp_get_api_version *rsp_params;
35662306a36Sopenharmony_ci	int err;
35762306a36Sopenharmony_ci
35862306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_API_VERSION,
35962306a36Sopenharmony_ci					  cmd_flags, 0);
36062306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
36162306a36Sopenharmony_ci	if (err)
36262306a36Sopenharmony_ci		return err;
36362306a36Sopenharmony_ci
36462306a36Sopenharmony_ci	rsp_params = (struct dpseci_rsp_get_api_version *)cmd.params;
36562306a36Sopenharmony_ci	*major_ver = le16_to_cpu(rsp_params->major);
36662306a36Sopenharmony_ci	*minor_ver = le16_to_cpu(rsp_params->minor);
36762306a36Sopenharmony_ci
36862306a36Sopenharmony_ci	return 0;
36962306a36Sopenharmony_ci}
37062306a36Sopenharmony_ci
37162306a36Sopenharmony_ci/**
37262306a36Sopenharmony_ci * dpseci_set_congestion_notification() - Set congestion group
37362306a36Sopenharmony_ci *	notification configuration
37462306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
37562306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
37662306a36Sopenharmony_ci * @token:	Token of DPSECI object
37762306a36Sopenharmony_ci * @cfg:	congestion notification configuration
37862306a36Sopenharmony_ci *
37962306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
38062306a36Sopenharmony_ci */
38162306a36Sopenharmony_ciint dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
38262306a36Sopenharmony_ci	u16 token, const struct dpseci_congestion_notification_cfg *cfg)
38362306a36Sopenharmony_ci{
38462306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
38562306a36Sopenharmony_ci	struct dpseci_cmd_congestion_notification *cmd_params;
38662306a36Sopenharmony_ci
38762306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(
38862306a36Sopenharmony_ci			DPSECI_CMDID_SET_CONGESTION_NOTIFICATION,
38962306a36Sopenharmony_ci			cmd_flags,
39062306a36Sopenharmony_ci			token);
39162306a36Sopenharmony_ci	cmd_params = (struct dpseci_cmd_congestion_notification *)cmd.params;
39262306a36Sopenharmony_ci	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
39362306a36Sopenharmony_ci	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
39462306a36Sopenharmony_ci	cmd_params->priority = cfg->dest_cfg.priority;
39562306a36Sopenharmony_ci	dpseci_set_field(cmd_params->options, CGN_DEST_TYPE,
39662306a36Sopenharmony_ci			 cfg->dest_cfg.dest_type);
39762306a36Sopenharmony_ci	dpseci_set_field(cmd_params->options, CGN_UNITS, cfg->units);
39862306a36Sopenharmony_ci	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
39962306a36Sopenharmony_ci	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
40062306a36Sopenharmony_ci	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
40162306a36Sopenharmony_ci	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
40262306a36Sopenharmony_ci
40362306a36Sopenharmony_ci	return mc_send_command(mc_io, &cmd);
40462306a36Sopenharmony_ci}
40562306a36Sopenharmony_ci
40662306a36Sopenharmony_ci/**
40762306a36Sopenharmony_ci * dpseci_get_congestion_notification() - Get congestion group notification
40862306a36Sopenharmony_ci *	configuration
40962306a36Sopenharmony_ci * @mc_io:	Pointer to MC portal's I/O object
41062306a36Sopenharmony_ci * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
41162306a36Sopenharmony_ci * @token:	Token of DPSECI object
41262306a36Sopenharmony_ci * @cfg:	congestion notification configuration
41362306a36Sopenharmony_ci *
41462306a36Sopenharmony_ci * Return:	'0' on success, error code otherwise
41562306a36Sopenharmony_ci */
41662306a36Sopenharmony_ciint dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
41762306a36Sopenharmony_ci	u16 token, struct dpseci_congestion_notification_cfg *cfg)
41862306a36Sopenharmony_ci{
41962306a36Sopenharmony_ci	struct fsl_mc_command cmd = { 0 };
42062306a36Sopenharmony_ci	struct dpseci_cmd_congestion_notification *rsp_params;
42162306a36Sopenharmony_ci	int err;
42262306a36Sopenharmony_ci
42362306a36Sopenharmony_ci	cmd.header = mc_encode_cmd_header(
42462306a36Sopenharmony_ci			DPSECI_CMDID_GET_CONGESTION_NOTIFICATION,
42562306a36Sopenharmony_ci			cmd_flags,
42662306a36Sopenharmony_ci			token);
42762306a36Sopenharmony_ci	err = mc_send_command(mc_io, &cmd);
42862306a36Sopenharmony_ci	if (err)
42962306a36Sopenharmony_ci		return err;
43062306a36Sopenharmony_ci
43162306a36Sopenharmony_ci	rsp_params = (struct dpseci_cmd_congestion_notification *)cmd.params;
43262306a36Sopenharmony_ci	cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
43362306a36Sopenharmony_ci	cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
43462306a36Sopenharmony_ci	cfg->dest_cfg.priority = rsp_params->priority;
43562306a36Sopenharmony_ci	cfg->dest_cfg.dest_type = dpseci_get_field(rsp_params->options,
43662306a36Sopenharmony_ci						   CGN_DEST_TYPE);
43762306a36Sopenharmony_ci	cfg->units = dpseci_get_field(rsp_params->options, CGN_UNITS);
43862306a36Sopenharmony_ci	cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
43962306a36Sopenharmony_ci	cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
44062306a36Sopenharmony_ci	cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
44162306a36Sopenharmony_ci	cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
44262306a36Sopenharmony_ci
44362306a36Sopenharmony_ci	return 0;
44462306a36Sopenharmony_ci}
445