xref: /OK3568_Linux_fs/kernel/drivers/bus/fsl-mc/dpbp.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  *
5*4882a593Smuzhiyun  */
6*4882a593Smuzhiyun #include <linux/kernel.h>
7*4882a593Smuzhiyun #include <linux/fsl/mc.h>
8*4882a593Smuzhiyun 
9*4882a593Smuzhiyun #include "fsl-mc-private.h"
10*4882a593Smuzhiyun 
11*4882a593Smuzhiyun /**
12*4882a593Smuzhiyun  * dpbp_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  * @dpbp_id:	DPBP 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
19*4882a593Smuzhiyun  * already created object; an object may have been declared in
20*4882a593Smuzhiyun  * the DPL or by calling the dpbp_create function.
21*4882a593Smuzhiyun  * This function returns a unique authentication token,
22*4882a593Smuzhiyun  * associated with the specific object ID and the specific MC
23*4882a593Smuzhiyun  * portal; this token must be used in all subsequent commands for
24*4882a593Smuzhiyun  * this specific object
25*4882a593Smuzhiyun  *
26*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
27*4882a593Smuzhiyun  */
dpbp_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpbp_id,u16 * token)28*4882a593Smuzhiyun int dpbp_open(struct fsl_mc_io *mc_io,
29*4882a593Smuzhiyun 	      u32 cmd_flags,
30*4882a593Smuzhiyun 	      int dpbp_id,
31*4882a593Smuzhiyun 	      u16 *token)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
34*4882a593Smuzhiyun 	struct dpbp_cmd_open *cmd_params;
35*4882a593Smuzhiyun 	int err;
36*4882a593Smuzhiyun 
37*4882a593Smuzhiyun 	/* prepare command */
38*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_OPEN,
39*4882a593Smuzhiyun 					  cmd_flags, 0);
40*4882a593Smuzhiyun 	cmd_params = (struct dpbp_cmd_open *)cmd.params;
41*4882a593Smuzhiyun 	cmd_params->dpbp_id = cpu_to_le32(dpbp_id);
42*4882a593Smuzhiyun 
43*4882a593Smuzhiyun 	/* send command to mc*/
44*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
45*4882a593Smuzhiyun 	if (err)
46*4882a593Smuzhiyun 		return err;
47*4882a593Smuzhiyun 
48*4882a593Smuzhiyun 	/* retrieve response parameters */
49*4882a593Smuzhiyun 	*token = mc_cmd_hdr_read_token(&cmd);
50*4882a593Smuzhiyun 
51*4882a593Smuzhiyun 	return err;
52*4882a593Smuzhiyun }
53*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpbp_open);
54*4882a593Smuzhiyun 
55*4882a593Smuzhiyun /**
56*4882a593Smuzhiyun  * dpbp_close() - Close the control session of the object
57*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
58*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
59*4882a593Smuzhiyun  * @token:	Token of DPBP object
60*4882a593Smuzhiyun  *
61*4882a593Smuzhiyun  * After this function is called, no further operations are
62*4882a593Smuzhiyun  * allowed on the object without opening a new control session.
63*4882a593Smuzhiyun  *
64*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
65*4882a593Smuzhiyun  */
dpbp_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)66*4882a593Smuzhiyun int dpbp_close(struct fsl_mc_io *mc_io,
67*4882a593Smuzhiyun 	       u32 cmd_flags,
68*4882a593Smuzhiyun 	       u16 token)
69*4882a593Smuzhiyun {
70*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
71*4882a593Smuzhiyun 
72*4882a593Smuzhiyun 	/* prepare command */
73*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_CLOSE, cmd_flags,
74*4882a593Smuzhiyun 					  token);
75*4882a593Smuzhiyun 
76*4882a593Smuzhiyun 	/* send command to mc*/
77*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
78*4882a593Smuzhiyun }
79*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpbp_close);
80*4882a593Smuzhiyun 
81*4882a593Smuzhiyun /**
82*4882a593Smuzhiyun  * dpbp_enable() - Enable the DPBP.
83*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
84*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
85*4882a593Smuzhiyun  * @token:	Token of DPBP object
86*4882a593Smuzhiyun  *
87*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
88*4882a593Smuzhiyun  */
dpbp_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)89*4882a593Smuzhiyun int dpbp_enable(struct fsl_mc_io *mc_io,
90*4882a593Smuzhiyun 		u32 cmd_flags,
91*4882a593Smuzhiyun 		u16 token)
92*4882a593Smuzhiyun {
93*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
94*4882a593Smuzhiyun 
95*4882a593Smuzhiyun 	/* prepare command */
96*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_ENABLE, cmd_flags,
97*4882a593Smuzhiyun 					  token);
98*4882a593Smuzhiyun 
99*4882a593Smuzhiyun 	/* send command to mc*/
100*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
101*4882a593Smuzhiyun }
102*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpbp_enable);
103*4882a593Smuzhiyun 
104*4882a593Smuzhiyun /**
105*4882a593Smuzhiyun  * dpbp_disable() - Disable the DPBP.
106*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
107*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
108*4882a593Smuzhiyun  * @token:	Token of DPBP object
109*4882a593Smuzhiyun  *
110*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
111*4882a593Smuzhiyun  */
dpbp_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)112*4882a593Smuzhiyun int dpbp_disable(struct fsl_mc_io *mc_io,
113*4882a593Smuzhiyun 		 u32 cmd_flags,
114*4882a593Smuzhiyun 		 u16 token)
115*4882a593Smuzhiyun {
116*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
117*4882a593Smuzhiyun 
118*4882a593Smuzhiyun 	/* prepare command */
119*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_DISABLE,
120*4882a593Smuzhiyun 					  cmd_flags, token);
121*4882a593Smuzhiyun 
122*4882a593Smuzhiyun 	/* send command to mc*/
123*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpbp_disable);
126*4882a593Smuzhiyun 
127*4882a593Smuzhiyun /**
128*4882a593Smuzhiyun  * dpbp_reset() - Reset the DPBP, returns the object to initial state.
129*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
130*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
131*4882a593Smuzhiyun  * @token:	Token of DPBP object
132*4882a593Smuzhiyun  *
133*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
134*4882a593Smuzhiyun  */
dpbp_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)135*4882a593Smuzhiyun int dpbp_reset(struct fsl_mc_io *mc_io,
136*4882a593Smuzhiyun 	       u32 cmd_flags,
137*4882a593Smuzhiyun 	       u16 token)
138*4882a593Smuzhiyun {
139*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
140*4882a593Smuzhiyun 
141*4882a593Smuzhiyun 	/* prepare command */
142*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_RESET,
143*4882a593Smuzhiyun 					  cmd_flags, token);
144*4882a593Smuzhiyun 
145*4882a593Smuzhiyun 	/* send command to mc*/
146*4882a593Smuzhiyun 	return mc_send_command(mc_io, &cmd);
147*4882a593Smuzhiyun }
148*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpbp_reset);
149*4882a593Smuzhiyun 
150*4882a593Smuzhiyun /**
151*4882a593Smuzhiyun  * dpbp_get_attributes - Retrieve DPBP attributes.
152*4882a593Smuzhiyun  *
153*4882a593Smuzhiyun  * @mc_io:	Pointer to MC portal's I/O object
154*4882a593Smuzhiyun  * @cmd_flags:	Command flags; one or more of 'MC_CMD_FLAG_'
155*4882a593Smuzhiyun  * @token:	Token of DPBP object
156*4882a593Smuzhiyun  * @attr:	Returned object's attributes
157*4882a593Smuzhiyun  *
158*4882a593Smuzhiyun  * Return:	'0' on Success; Error code otherwise.
159*4882a593Smuzhiyun  */
dpbp_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpbp_attr * attr)160*4882a593Smuzhiyun int dpbp_get_attributes(struct fsl_mc_io *mc_io,
161*4882a593Smuzhiyun 			u32 cmd_flags,
162*4882a593Smuzhiyun 			u16 token,
163*4882a593Smuzhiyun 			struct dpbp_attr *attr)
164*4882a593Smuzhiyun {
165*4882a593Smuzhiyun 	struct fsl_mc_command cmd = { 0 };
166*4882a593Smuzhiyun 	struct dpbp_rsp_get_attributes *rsp_params;
167*4882a593Smuzhiyun 	int err;
168*4882a593Smuzhiyun 
169*4882a593Smuzhiyun 	/* prepare command */
170*4882a593Smuzhiyun 	cmd.header = mc_encode_cmd_header(DPBP_CMDID_GET_ATTR,
171*4882a593Smuzhiyun 					  cmd_flags, token);
172*4882a593Smuzhiyun 
173*4882a593Smuzhiyun 	/* send command to mc*/
174*4882a593Smuzhiyun 	err = mc_send_command(mc_io, &cmd);
175*4882a593Smuzhiyun 	if (err)
176*4882a593Smuzhiyun 		return err;
177*4882a593Smuzhiyun 
178*4882a593Smuzhiyun 	/* retrieve response parameters */
179*4882a593Smuzhiyun 	rsp_params = (struct dpbp_rsp_get_attributes *)cmd.params;
180*4882a593Smuzhiyun 	attr->bpid = le16_to_cpu(rsp_params->bpid);
181*4882a593Smuzhiyun 	attr->id = le32_to_cpu(rsp_params->id);
182*4882a593Smuzhiyun 
183*4882a593Smuzhiyun 	return 0;
184*4882a593Smuzhiyun }
185*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpbp_get_attributes);
186