xref: /OK3568_Linux_fs/kernel/drivers/crypto/caam/dpseci.c (revision 4882a59341e53eb6f0b4789bf948001014eff981)
1*4882a593Smuzhiyun // SPDX-License-Identifier: (GPL-2.0+ OR BSD-3-Clause)
2*4882a593Smuzhiyun /*
3*4882a593Smuzhiyun  * Copyright 2013-2016 Freescale Semiconductor Inc.
4*4882a593Smuzhiyun  * Copyright 2017-2018 NXP
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun 
7*4882a593Smuzhiyun #include <linux/fsl/mc.h>
8*4882a593Smuzhiyun #include "dpseci.h"
9*4882a593Smuzhiyun #include "dpseci_cmd.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /**
12*4882a593Smuzhiyun  * dpseci_open() - Open a control session for the specified object
13*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
14*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
15*4882a593Smuzhiyun  * @dpseci_id:	DPSECI unique ID
16*4882a593Smuzhiyun  * @token:	Returned token; use in subsequent API calls
17*4882a593Smuzhiyun  *
18*4882a593Smuzhiyun  * This function can be used to open a control session for an already created
19*4882a593Smuzhiyun  * object; an object may have been declared statically in the DPL
20*4882a593Smuzhiyun  * or created dynamically.
21*4882a593Smuzhiyun  * This function returns a unique authentication token, associated with the
22*4882a593Smuzhiyun  * specific object ID and the specific MC portal; this token must be used in all
23*4882a593Smuzhiyun  * subsequent commands for this specific object.
24*4882a593Smuzhiyun  *
25*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
26*4882a593Smuzhiyun  */
dpseci_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpseci_id,u16 * token)27*4882a593Smuzhiyun int dpseci_open(struct fsl_mc_io *mc_io, u32 cmd_flags, int dpseci_id,
28*4882a593Smuzhiyun 		u16 *token)
29*4882a593Smuzhiyun {
30*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
31*4882a593Smuzhiyun 	struct dpseci_cmd_open *cmd_params;
32*4882a593Smuzhiyun 	int err;
33*4882a593Smuzhiyun 
34*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_OPEN,
35*4882a593Smuzhiyun 					  cmd_flags,
36*4882a593Smuzhiyun 					  0);
37*4882a593Smuzhiyun 	cmd_params = (struct dpseci_cmd_open *)cmd.params;
38*4882a593Smuzhiyun 	cmd_params->dpseci_id = cpu_to_le32(dpseci_id);
39*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
40*4882a593Smuzhiyun 	if (err)
41*4882a593Smuzhiyun 		return err;
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	*token = mc_cmd_hdr_read_token(&cmd);
44*4882a593Smuzhiyun 
45*4882a593Smuzhiyun 	return 0;
46*4882a593Smuzhiyun }
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun /**
49*4882a593Smuzhiyun  * dpseci_close() - Close the control session of the object
50*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
51*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
52*4882a593Smuzhiyun  * @token:	Token of DPSECI object
53*4882a593Smuzhiyun  *
54*4882a593Smuzhiyun  * After this function is called, no further operations are allowed on the
55*4882a593Smuzhiyun  * object without opening a new control session.
56*4882a593Smuzhiyun  *
57*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
58*4882a593Smuzhiyun  */
dpseci_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)59*4882a593Smuzhiyun int dpseci_close(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
60*4882a593Smuzhiyun {
61*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
62*4882a593Smuzhiyun 
63*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_CLOSE,
64*4882a593Smuzhiyun 					  cmd_flags,
65*4882a593Smuzhiyun 					  token);
66*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
67*4882a593Smuzhiyun }
68*4882a593Smuzhiyun 
69*4882a593Smuzhiyun /**
70*4882a593Smuzhiyun  * dpseci_enable() - Enable the DPSECI, allow sending and receiving frames
71*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
72*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
73*4882a593Smuzhiyun  * @token:	Token of DPSECI object
74*4882a593Smuzhiyun  *
75*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
76*4882a593Smuzhiyun  */
dpseci_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)77*4882a593Smuzhiyun int dpseci_enable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
78*4882a593Smuzhiyun {
79*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_ENABLE,
82*4882a593Smuzhiyun 					  cmd_flags,
83*4882a593Smuzhiyun 					  token);
84*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun 
87*4882a593Smuzhiyun /**
88*4882a593Smuzhiyun  * dpseci_disable() - Disable the DPSECI, stop sending and receiving frames
89*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
90*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
91*4882a593Smuzhiyun  * @token:	Token of DPSECI object
92*4882a593Smuzhiyun  *
93*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
94*4882a593Smuzhiyun  */
dpseci_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)95*4882a593Smuzhiyun int dpseci_disable(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
96*4882a593Smuzhiyun {
97*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_DISABLE,
100*4882a593Smuzhiyun 					  cmd_flags,
101*4882a593Smuzhiyun 					  token);
102*4882a593Smuzhiyun 
103*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun 
106*4882a593Smuzhiyun /**
107*4882a593Smuzhiyun  * dpseci_reset() - Reset the DPSECI, returns the object to initial state
108*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
109*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
110*4882a593Smuzhiyun  * @token:	Token of DPSECI object
111*4882a593Smuzhiyun  *
112*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
113*4882a593Smuzhiyun  */
dpseci_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)114*4882a593Smuzhiyun int dpseci_reset(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_RESET,
119*4882a593Smuzhiyun 					  cmd_flags,
120*4882a593Smuzhiyun 					  token);
121*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
122*4882a593Smuzhiyun }
123*4882a593Smuzhiyun 
124*4882a593Smuzhiyun /**
125*4882a593Smuzhiyun  * dpseci_is_enabled() - Check if the DPSECI is enabled.
126*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
127*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
128*4882a593Smuzhiyun  * @token:	Token of DPSECI object
129*4882a593Smuzhiyun  * @en:		Returns '1' if object is enabled; '0' otherwise
130*4882a593Smuzhiyun  *
131*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
132*4882a593Smuzhiyun  */
dpseci_is_enabled(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,int * en)133*4882a593Smuzhiyun int dpseci_is_enabled(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
134*4882a593Smuzhiyun 		      int *en)
135*4882a593Smuzhiyun {
136*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
137*4882a593Smuzhiyun 	struct dpseci_rsp_is_enabled *rsp_params;
138*4882a593Smuzhiyun 	int err;
139*4882a593Smuzhiyun 
140*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_IS_ENABLED,
141*4882a593Smuzhiyun 					  cmd_flags,
142*4882a593Smuzhiyun 					  token);
143*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
144*4882a593Smuzhiyun 	if (err)
145*4882a593Smuzhiyun 		return err;
146*4882a593Smuzhiyun 
147*4882a593Smuzhiyun 	rsp_params = (struct dpseci_rsp_is_enabled *)cmd.params;
148*4882a593Smuzhiyun 	*en = dpseci_get_field(rsp_params->is_enabled, ENABLE);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun 	return 0;
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun 
153*4882a593Smuzhiyun /**
154*4882a593Smuzhiyun  * dpseci_get_attributes() - Retrieve DPSECI attributes
155*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
156*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
157*4882a593Smuzhiyun  * @token:	Token of DPSECI object
158*4882a593Smuzhiyun  * @attr:	Returned object's attributes
159*4882a593Smuzhiyun  *
160*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
161*4882a593Smuzhiyun  */
dpseci_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpseci_attr * attr)162*4882a593Smuzhiyun int dpseci_get_attributes(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
163*4882a593Smuzhiyun 			  struct dpseci_attr *attr)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
166*4882a593Smuzhiyun 	struct dpseci_rsp_get_attributes *rsp_params;
167*4882a593Smuzhiyun 	int err;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_ATTR,
170*4882a593Smuzhiyun 					  cmd_flags,
171*4882a593Smuzhiyun 					  token);
172*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
173*4882a593Smuzhiyun 	if (err)
174*4882a593Smuzhiyun 		return err;
175*4882a593Smuzhiyun 
176*4882a593Smuzhiyun 	rsp_params = (struct dpseci_rsp_get_attributes *)cmd.params;
177*4882a593Smuzhiyun 	attr->id = le32_to_cpu(rsp_params->id);
178*4882a593Smuzhiyun 	attr->num_tx_queues = rsp_params->num_tx_queues;
179*4882a593Smuzhiyun 	attr->num_rx_queues = rsp_params->num_rx_queues;
180*4882a593Smuzhiyun 	attr->options = le32_to_cpu(rsp_params->options);
181*4882a593Smuzhiyun 
182*4882a593Smuzhiyun 	return 0;
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun 
185*4882a593Smuzhiyun /**
186*4882a593Smuzhiyun  * dpseci_set_rx_queue() - Set Rx queue configuration
187*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
188*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
189*4882a593Smuzhiyun  * @token:	Token of DPSECI object
190*4882a593Smuzhiyun  * @queue:	Select the queue relative to number of priorities configured at
191*4882a593Smuzhiyun  *		DPSECI creation; use DPSECI_ALL_QUEUES to configure all
192*4882a593Smuzhiyun  *		Rx queues identically.
193*4882a593Smuzhiyun  * @cfg:	Rx queue configuration
194*4882a593Smuzhiyun  *
195*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
196*4882a593Smuzhiyun  */
dpseci_set_rx_queue(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 queue,const struct dpseci_rx_queue_cfg * cfg)197*4882a593Smuzhiyun int dpseci_set_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
198*4882a593Smuzhiyun 			u8 queue, const struct dpseci_rx_queue_cfg *cfg)
199*4882a593Smuzhiyun {
200*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
201*4882a593Smuzhiyun 	struct dpseci_cmd_queue *cmd_params;
202*4882a593Smuzhiyun 
203*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_SET_RX_QUEUE,
204*4882a593Smuzhiyun 					  cmd_flags,
205*4882a593Smuzhiyun 					  token);
206*4882a593Smuzhiyun 	cmd_params = (struct dpseci_cmd_queue *)cmd.params;
207*4882a593Smuzhiyun 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
208*4882a593Smuzhiyun 	cmd_params->priority = cfg->dest_cfg.priority;
209*4882a593Smuzhiyun 	cmd_params->queue = queue;
210*4882a593Smuzhiyun 	dpseci_set_field(cmd_params->dest_type, DEST_TYPE,
211*4882a593Smuzhiyun 			 cfg->dest_cfg.dest_type);
212*4882a593Smuzhiyun 	cmd_params->user_ctx = cpu_to_le64(cfg->user_ctx);
213*4882a593Smuzhiyun 	cmd_params->options = cpu_to_le32(cfg->options);
214*4882a593Smuzhiyun 	dpseci_set_field(cmd_params->order_preservation_en, ORDER_PRESERVATION,
215*4882a593Smuzhiyun 			 cfg->order_preservation_en);
216*4882a593Smuzhiyun 
217*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
218*4882a593Smuzhiyun }
219*4882a593Smuzhiyun 
220*4882a593Smuzhiyun /**
221*4882a593Smuzhiyun  * dpseci_get_rx_queue() - Retrieve Rx queue attributes
222*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
223*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
224*4882a593Smuzhiyun  * @token:	Token of DPSECI object
225*4882a593Smuzhiyun  * @queue:	Select the queue relative to number of priorities configured at
226*4882a593Smuzhiyun  *		DPSECI creation
227*4882a593Smuzhiyun  * @attr:	Returned Rx queue attributes
228*4882a593Smuzhiyun  *
229*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
230*4882a593Smuzhiyun  */
dpseci_get_rx_queue(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 queue,struct dpseci_rx_queue_attr * attr)231*4882a593Smuzhiyun int dpseci_get_rx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
232*4882a593Smuzhiyun 			u8 queue, struct dpseci_rx_queue_attr *attr)
233*4882a593Smuzhiyun {
234*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
235*4882a593Smuzhiyun 	struct dpseci_cmd_queue *cmd_params;
236*4882a593Smuzhiyun 	int err;
237*4882a593Smuzhiyun 
238*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_RX_QUEUE,
239*4882a593Smuzhiyun 					  cmd_flags,
240*4882a593Smuzhiyun 					  token);
241*4882a593Smuzhiyun 	cmd_params = (struct dpseci_cmd_queue *)cmd.params;
242*4882a593Smuzhiyun 	cmd_params->queue = queue;
243*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
244*4882a593Smuzhiyun 	if (err)
245*4882a593Smuzhiyun 		return err;
246*4882a593Smuzhiyun 
247*4882a593Smuzhiyun 	attr->dest_cfg.dest_id = le32_to_cpu(cmd_params->dest_id);
248*4882a593Smuzhiyun 	attr->dest_cfg.priority = cmd_params->priority;
249*4882a593Smuzhiyun 	attr->dest_cfg.dest_type = dpseci_get_field(cmd_params->dest_type,
250*4882a593Smuzhiyun 						    DEST_TYPE);
251*4882a593Smuzhiyun 	attr->user_ctx = le64_to_cpu(cmd_params->user_ctx);
252*4882a593Smuzhiyun 	attr->fqid = le32_to_cpu(cmd_params->fqid);
253*4882a593Smuzhiyun 	attr->order_preservation_en =
254*4882a593Smuzhiyun 		dpseci_get_field(cmd_params->order_preservation_en,
255*4882a593Smuzhiyun 				 ORDER_PRESERVATION);
256*4882a593Smuzhiyun 
257*4882a593Smuzhiyun 	return 0;
258*4882a593Smuzhiyun }
259*4882a593Smuzhiyun 
260*4882a593Smuzhiyun /**
261*4882a593Smuzhiyun  * dpseci_get_tx_queue() - Retrieve Tx queue attributes
262*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
263*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
264*4882a593Smuzhiyun  * @token:	Token of DPSECI object
265*4882a593Smuzhiyun  * @queue:	Select the queue relative to number of priorities configured at
266*4882a593Smuzhiyun  *		DPSECI creation
267*4882a593Smuzhiyun  * @attr:	Returned Tx queue attributes
268*4882a593Smuzhiyun  *
269*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
270*4882a593Smuzhiyun  */
dpseci_get_tx_queue(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 queue,struct dpseci_tx_queue_attr * attr)271*4882a593Smuzhiyun int dpseci_get_tx_queue(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
272*4882a593Smuzhiyun 			u8 queue, struct dpseci_tx_queue_attr *attr)
273*4882a593Smuzhiyun {
274*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
275*4882a593Smuzhiyun 	struct dpseci_cmd_queue *cmd_params;
276*4882a593Smuzhiyun 	struct dpseci_rsp_get_tx_queue *rsp_params;
277*4882a593Smuzhiyun 	int err;
278*4882a593Smuzhiyun 
279*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_TX_QUEUE,
280*4882a593Smuzhiyun 					  cmd_flags,
281*4882a593Smuzhiyun 					  token);
282*4882a593Smuzhiyun 	cmd_params = (struct dpseci_cmd_queue *)cmd.params;
283*4882a593Smuzhiyun 	cmd_params->queue = queue;
284*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
285*4882a593Smuzhiyun 	if (err)
286*4882a593Smuzhiyun 		return err;
287*4882a593Smuzhiyun 
288*4882a593Smuzhiyun 	rsp_params = (struct dpseci_rsp_get_tx_queue *)cmd.params;
289*4882a593Smuzhiyun 	attr->fqid = le32_to_cpu(rsp_params->fqid);
290*4882a593Smuzhiyun 	attr->priority = rsp_params->priority;
291*4882a593Smuzhiyun 
292*4882a593Smuzhiyun 	return 0;
293*4882a593Smuzhiyun }
294*4882a593Smuzhiyun 
295*4882a593Smuzhiyun /**
296*4882a593Smuzhiyun  * dpseci_get_sec_attr() - Retrieve SEC accelerator attributes
297*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
298*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
299*4882a593Smuzhiyun  * @token:	Token of DPSECI object
300*4882a593Smuzhiyun  * @attr:	Returned SEC attributes
301*4882a593Smuzhiyun  *
302*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
303*4882a593Smuzhiyun  */
dpseci_get_sec_attr(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpseci_sec_attr * attr)304*4882a593Smuzhiyun int dpseci_get_sec_attr(struct fsl_mc_io *mc_io, u32 cmd_flags, u16 token,
305*4882a593Smuzhiyun 			struct dpseci_sec_attr *attr)
306*4882a593Smuzhiyun {
307*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
308*4882a593Smuzhiyun 	struct dpseci_rsp_get_sec_attr *rsp_params;
309*4882a593Smuzhiyun 	int err;
310*4882a593Smuzhiyun 
311*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_SEC_ATTR,
312*4882a593Smuzhiyun 					  cmd_flags,
313*4882a593Smuzhiyun 					  token);
314*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
315*4882a593Smuzhiyun 	if (err)
316*4882a593Smuzhiyun 		return err;
317*4882a593Smuzhiyun 
318*4882a593Smuzhiyun 	rsp_params = (struct dpseci_rsp_get_sec_attr *)cmd.params;
319*4882a593Smuzhiyun 	attr->ip_id = le16_to_cpu(rsp_params->ip_id);
320*4882a593Smuzhiyun 	attr->major_rev = rsp_params->major_rev;
321*4882a593Smuzhiyun 	attr->minor_rev = rsp_params->minor_rev;
322*4882a593Smuzhiyun 	attr->era = rsp_params->era;
323*4882a593Smuzhiyun 	attr->deco_num = rsp_params->deco_num;
324*4882a593Smuzhiyun 	attr->zuc_auth_acc_num = rsp_params->zuc_auth_acc_num;
325*4882a593Smuzhiyun 	attr->zuc_enc_acc_num = rsp_params->zuc_enc_acc_num;
326*4882a593Smuzhiyun 	attr->snow_f8_acc_num = rsp_params->snow_f8_acc_num;
327*4882a593Smuzhiyun 	attr->snow_f9_acc_num = rsp_params->snow_f9_acc_num;
328*4882a593Smuzhiyun 	attr->crc_acc_num = rsp_params->crc_acc_num;
329*4882a593Smuzhiyun 	attr->pk_acc_num = rsp_params->pk_acc_num;
330*4882a593Smuzhiyun 	attr->kasumi_acc_num = rsp_params->kasumi_acc_num;
331*4882a593Smuzhiyun 	attr->rng_acc_num = rsp_params->rng_acc_num;
332*4882a593Smuzhiyun 	attr->md_acc_num = rsp_params->md_acc_num;
333*4882a593Smuzhiyun 	attr->arc4_acc_num = rsp_params->arc4_acc_num;
334*4882a593Smuzhiyun 	attr->des_acc_num = rsp_params->des_acc_num;
335*4882a593Smuzhiyun 	attr->aes_acc_num = rsp_params->aes_acc_num;
336*4882a593Smuzhiyun 	attr->ccha_acc_num = rsp_params->ccha_acc_num;
337*4882a593Smuzhiyun 	attr->ptha_acc_num = rsp_params->ptha_acc_num;
338*4882a593Smuzhiyun 
339*4882a593Smuzhiyun 	return 0;
340*4882a593Smuzhiyun }
341*4882a593Smuzhiyun 
342*4882a593Smuzhiyun /**
343*4882a593Smuzhiyun  * dpseci_get_api_version() - Get Data Path SEC Interface API version
344*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
345*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
346*4882a593Smuzhiyun  * @major_ver:	Major version of data path sec API
347*4882a593Smuzhiyun  * @minor_ver:	Minor version of data path sec API
348*4882a593Smuzhiyun  *
349*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
350*4882a593Smuzhiyun  */
dpseci_get_api_version(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 * major_ver,u16 * minor_ver)351*4882a593Smuzhiyun int dpseci_get_api_version(struct fsl_mc_io *mc_io, u32 cmd_flags,
352*4882a593Smuzhiyun 			   u16 *major_ver, u16 *minor_ver)
353*4882a593Smuzhiyun {
354*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
355*4882a593Smuzhiyun 	struct dpseci_rsp_get_api_version *rsp_params;
356*4882a593Smuzhiyun 	int err;
357*4882a593Smuzhiyun 
358*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPSECI_CMDID_GET_API_VERSION,
359*4882a593Smuzhiyun 					  cmd_flags, 0);
360*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
361*4882a593Smuzhiyun 	if (err)
362*4882a593Smuzhiyun 		return err;
363*4882a593Smuzhiyun 
364*4882a593Smuzhiyun 	rsp_params = (struct dpseci_rsp_get_api_version *)cmd.params;
365*4882a593Smuzhiyun 	*major_ver = le16_to_cpu(rsp_params->major);
366*4882a593Smuzhiyun 	*minor_ver = le16_to_cpu(rsp_params->minor);
367*4882a593Smuzhiyun 
368*4882a593Smuzhiyun 	return 0;
369*4882a593Smuzhiyun }
370*4882a593Smuzhiyun 
371*4882a593Smuzhiyun /**
372*4882a593Smuzhiyun  * dpseci_set_congestion_notification() - Set congestion group
373*4882a593Smuzhiyun  *	notification configuration
374*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
375*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
376*4882a593Smuzhiyun  * @token:	Token of DPSECI object
377*4882a593Smuzhiyun  * @cfg:	congestion notification configuration
378*4882a593Smuzhiyun  *
379*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
380*4882a593Smuzhiyun  */
dpseci_set_congestion_notification(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,const struct dpseci_congestion_notification_cfg * cfg)381*4882a593Smuzhiyun int dpseci_set_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
382*4882a593Smuzhiyun 	u16 token, const struct dpseci_congestion_notification_cfg *cfg)
383*4882a593Smuzhiyun {
384*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
385*4882a593Smuzhiyun 	struct dpseci_cmd_congestion_notification *cmd_params;
386*4882a593Smuzhiyun 
387*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(
388*4882a593Smuzhiyun 			DPSECI_CMDID_SET_CONGESTION_NOTIFICATION,
389*4882a593Smuzhiyun 			cmd_flags,
390*4882a593Smuzhiyun 			token);
391*4882a593Smuzhiyun 	cmd_params = (struct dpseci_cmd_congestion_notification *)cmd.params;
392*4882a593Smuzhiyun 	cmd_params->dest_id = cpu_to_le32(cfg->dest_cfg.dest_id);
393*4882a593Smuzhiyun 	cmd_params->notification_mode = cpu_to_le16(cfg->notification_mode);
394*4882a593Smuzhiyun 	cmd_params->priority = cfg->dest_cfg.priority;
395*4882a593Smuzhiyun 	dpseci_set_field(cmd_params->options, CGN_DEST_TYPE,
396*4882a593Smuzhiyun 			 cfg->dest_cfg.dest_type);
397*4882a593Smuzhiyun 	dpseci_set_field(cmd_params->options, CGN_UNITS, cfg->units);
398*4882a593Smuzhiyun 	cmd_params->message_iova = cpu_to_le64(cfg->message_iova);
399*4882a593Smuzhiyun 	cmd_params->message_ctx = cpu_to_le64(cfg->message_ctx);
400*4882a593Smuzhiyun 	cmd_params->threshold_entry = cpu_to_le32(cfg->threshold_entry);
401*4882a593Smuzhiyun 	cmd_params->threshold_exit = cpu_to_le32(cfg->threshold_exit);
402*4882a593Smuzhiyun 
403*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
404*4882a593Smuzhiyun }
405*4882a593Smuzhiyun 
406*4882a593Smuzhiyun /**
407*4882a593Smuzhiyun  * dpseci_get_congestion_notification() - Get congestion group notification
408*4882a593Smuzhiyun  *	configuration
409*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
410*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
411*4882a593Smuzhiyun  * @token:	Token of DPSECI object
412*4882a593Smuzhiyun  * @cfg:	congestion notification configuration
413*4882a593Smuzhiyun  *
414*4882a593Smuzhiyun  * Return:	'0' on success, error code otherwise
415*4882a593Smuzhiyun  */
dpseci_get_congestion_notification(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpseci_congestion_notification_cfg * cfg)416*4882a593Smuzhiyun int dpseci_get_congestion_notification(struct fsl_mc_io *mc_io, u32 cmd_flags,
417*4882a593Smuzhiyun 	u16 token, struct dpseci_congestion_notification_cfg *cfg)
418*4882a593Smuzhiyun {
419*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
420*4882a593Smuzhiyun 	struct dpseci_cmd_congestion_notification *rsp_params;
421*4882a593Smuzhiyun 	int err;
422*4882a593Smuzhiyun 
423*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(
424*4882a593Smuzhiyun 			DPSECI_CMDID_GET_CONGESTION_NOTIFICATION,
425*4882a593Smuzhiyun 			cmd_flags,
426*4882a593Smuzhiyun 			token);
427*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
428*4882a593Smuzhiyun 	if (err)
429*4882a593Smuzhiyun 		return err;
430*4882a593Smuzhiyun 
431*4882a593Smuzhiyun 	rsp_params = (struct dpseci_cmd_congestion_notification *)cmd.params;
432*4882a593Smuzhiyun 	cfg->dest_cfg.dest_id = le32_to_cpu(rsp_params->dest_id);
433*4882a593Smuzhiyun 	cfg->notification_mode = le16_to_cpu(rsp_params->notification_mode);
434*4882a593Smuzhiyun 	cfg->dest_cfg.priority = rsp_params->priority;
435*4882a593Smuzhiyun 	cfg->dest_cfg.dest_type = dpseci_get_field(rsp_params->options,
436*4882a593Smuzhiyun 						   CGN_DEST_TYPE);
437*4882a593Smuzhiyun 	cfg->units = dpseci_get_field(rsp_params->options, CGN_UNITS);
438*4882a593Smuzhiyun 	cfg->message_iova = le64_to_cpu(rsp_params->message_iova);
439*4882a593Smuzhiyun 	cfg->message_ctx = le64_to_cpu(rsp_params->message_ctx);
440*4882a593Smuzhiyun 	cfg->threshold_entry = le32_to_cpu(rsp_params->threshold_entry);
441*4882a593Smuzhiyun 	cfg->threshold_exit = le32_to_cpu(rsp_params->threshold_exit);
442*4882a593Smuzhiyun 
443*4882a593Smuzhiyun 	return 0;
444*4882a593Smuzhiyun }
445