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 * dpcon_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 * @dpcon_id: DPCON 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 dpcon_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 */
dpcon_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpcon_id,u16 * token)28*4882a593Smuzhiyun int dpcon_open(struct fsl_mc_io *mc_io,
29*4882a593Smuzhiyun u32 cmd_flags,
30*4882a593Smuzhiyun int dpcon_id,
31*4882a593Smuzhiyun u16 *token)
32*4882a593Smuzhiyun {
33*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
34*4882a593Smuzhiyun struct dpcon_cmd_open *dpcon_cmd;
35*4882a593Smuzhiyun int err;
36*4882a593Smuzhiyun
37*4882a593Smuzhiyun /* prepare command */
38*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_OPEN,
39*4882a593Smuzhiyun cmd_flags,
40*4882a593Smuzhiyun 0);
41*4882a593Smuzhiyun dpcon_cmd = (struct dpcon_cmd_open *)cmd.params;
42*4882a593Smuzhiyun dpcon_cmd->dpcon_id = cpu_to_le32(dpcon_id);
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* send command to mc*/
45*4882a593Smuzhiyun err = mc_send_command(mc_io, &cmd);
46*4882a593Smuzhiyun if (err)
47*4882a593Smuzhiyun return err;
48*4882a593Smuzhiyun
49*4882a593Smuzhiyun /* retrieve response parameters */
50*4882a593Smuzhiyun *token = mc_cmd_hdr_read_token(&cmd);
51*4882a593Smuzhiyun
52*4882a593Smuzhiyun return 0;
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_open);
55*4882a593Smuzhiyun
56*4882a593Smuzhiyun /**
57*4882a593Smuzhiyun * dpcon_close() - Close the control session of the object
58*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
59*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
60*4882a593Smuzhiyun * @token: Token of DPCON object
61*4882a593Smuzhiyun *
62*4882a593Smuzhiyun * After this function is called, no further operations are
63*4882a593Smuzhiyun * allowed on the object without opening a new control session.
64*4882a593Smuzhiyun *
65*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise.
66*4882a593Smuzhiyun */
dpcon_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)67*4882a593Smuzhiyun int dpcon_close(struct fsl_mc_io *mc_io,
68*4882a593Smuzhiyun u32 cmd_flags,
69*4882a593Smuzhiyun u16 token)
70*4882a593Smuzhiyun {
71*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
72*4882a593Smuzhiyun
73*4882a593Smuzhiyun /* prepare command */
74*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_CLOSE,
75*4882a593Smuzhiyun cmd_flags,
76*4882a593Smuzhiyun token);
77*4882a593Smuzhiyun
78*4882a593Smuzhiyun /* send command to mc*/
79*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
80*4882a593Smuzhiyun }
81*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_close);
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /**
84*4882a593Smuzhiyun * dpcon_enable() - Enable the DPCON
85*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
86*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
87*4882a593Smuzhiyun * @token: Token of DPCON object
88*4882a593Smuzhiyun *
89*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
90*4882a593Smuzhiyun */
dpcon_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)91*4882a593Smuzhiyun int dpcon_enable(struct fsl_mc_io *mc_io,
92*4882a593Smuzhiyun u32 cmd_flags,
93*4882a593Smuzhiyun u16 token)
94*4882a593Smuzhiyun {
95*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
96*4882a593Smuzhiyun
97*4882a593Smuzhiyun /* prepare command */
98*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_ENABLE,
99*4882a593Smuzhiyun cmd_flags,
100*4882a593Smuzhiyun token);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun /* send command to mc*/
103*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
104*4882a593Smuzhiyun }
105*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_enable);
106*4882a593Smuzhiyun
107*4882a593Smuzhiyun /**
108*4882a593Smuzhiyun * dpcon_disable() - Disable the DPCON
109*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
110*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
111*4882a593Smuzhiyun * @token: Token of DPCON object
112*4882a593Smuzhiyun *
113*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
114*4882a593Smuzhiyun */
dpcon_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)115*4882a593Smuzhiyun int dpcon_disable(struct fsl_mc_io *mc_io,
116*4882a593Smuzhiyun u32 cmd_flags,
117*4882a593Smuzhiyun u16 token)
118*4882a593Smuzhiyun {
119*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
120*4882a593Smuzhiyun
121*4882a593Smuzhiyun /* prepare command */
122*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_DISABLE,
123*4882a593Smuzhiyun cmd_flags,
124*4882a593Smuzhiyun token);
125*4882a593Smuzhiyun
126*4882a593Smuzhiyun /* send command to mc*/
127*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
128*4882a593Smuzhiyun }
129*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_disable);
130*4882a593Smuzhiyun
131*4882a593Smuzhiyun /**
132*4882a593Smuzhiyun * dpcon_reset() - Reset the DPCON, returns the object to initial state.
133*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
134*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
135*4882a593Smuzhiyun * @token: Token of DPCON object
136*4882a593Smuzhiyun *
137*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise.
138*4882a593Smuzhiyun */
dpcon_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)139*4882a593Smuzhiyun int dpcon_reset(struct fsl_mc_io *mc_io,
140*4882a593Smuzhiyun u32 cmd_flags,
141*4882a593Smuzhiyun u16 token)
142*4882a593Smuzhiyun {
143*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /* prepare command */
146*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_RESET,
147*4882a593Smuzhiyun cmd_flags, token);
148*4882a593Smuzhiyun
149*4882a593Smuzhiyun /* send command to mc*/
150*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
151*4882a593Smuzhiyun }
152*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_reset);
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /**
155*4882a593Smuzhiyun * dpcon_get_attributes() - Retrieve DPCON attributes.
156*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
157*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
158*4882a593Smuzhiyun * @token: Token of DPCON object
159*4882a593Smuzhiyun * @attr: Object's attributes
160*4882a593Smuzhiyun *
161*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise.
162*4882a593Smuzhiyun */
dpcon_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpcon_attr * attr)163*4882a593Smuzhiyun int dpcon_get_attributes(struct fsl_mc_io *mc_io,
164*4882a593Smuzhiyun u32 cmd_flags,
165*4882a593Smuzhiyun u16 token,
166*4882a593Smuzhiyun struct dpcon_attr *attr)
167*4882a593Smuzhiyun {
168*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
169*4882a593Smuzhiyun struct dpcon_rsp_get_attr *dpcon_rsp;
170*4882a593Smuzhiyun int err;
171*4882a593Smuzhiyun
172*4882a593Smuzhiyun /* prepare command */
173*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_GET_ATTR,
174*4882a593Smuzhiyun cmd_flags,
175*4882a593Smuzhiyun token);
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun /* send command to mc*/
178*4882a593Smuzhiyun err = mc_send_command(mc_io, &cmd);
179*4882a593Smuzhiyun if (err)
180*4882a593Smuzhiyun return err;
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun /* retrieve response parameters */
183*4882a593Smuzhiyun dpcon_rsp = (struct dpcon_rsp_get_attr *)cmd.params;
184*4882a593Smuzhiyun attr->id = le32_to_cpu(dpcon_rsp->id);
185*4882a593Smuzhiyun attr->qbman_ch_id = le16_to_cpu(dpcon_rsp->qbman_ch_id);
186*4882a593Smuzhiyun attr->num_priorities = dpcon_rsp->num_priorities;
187*4882a593Smuzhiyun
188*4882a593Smuzhiyun return 0;
189*4882a593Smuzhiyun }
190*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_get_attributes);
191*4882a593Smuzhiyun
192*4882a593Smuzhiyun /**
193*4882a593Smuzhiyun * dpcon_set_notification() - Set DPCON notification destination
194*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
195*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
196*4882a593Smuzhiyun * @token: Token of DPCON object
197*4882a593Smuzhiyun * @cfg: Notification parameters
198*4882a593Smuzhiyun *
199*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
200*4882a593Smuzhiyun */
dpcon_set_notification(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpcon_notification_cfg * cfg)201*4882a593Smuzhiyun int dpcon_set_notification(struct fsl_mc_io *mc_io,
202*4882a593Smuzhiyun u32 cmd_flags,
203*4882a593Smuzhiyun u16 token,
204*4882a593Smuzhiyun struct dpcon_notification_cfg *cfg)
205*4882a593Smuzhiyun {
206*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
207*4882a593Smuzhiyun struct dpcon_cmd_set_notification *dpcon_cmd;
208*4882a593Smuzhiyun
209*4882a593Smuzhiyun /* prepare command */
210*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPCON_CMDID_SET_NOTIFICATION,
211*4882a593Smuzhiyun cmd_flags,
212*4882a593Smuzhiyun token);
213*4882a593Smuzhiyun dpcon_cmd = (struct dpcon_cmd_set_notification *)cmd.params;
214*4882a593Smuzhiyun dpcon_cmd->dpio_id = cpu_to_le32(cfg->dpio_id);
215*4882a593Smuzhiyun dpcon_cmd->priority = cfg->priority;
216*4882a593Smuzhiyun dpcon_cmd->user_ctx = cpu_to_le64(cfg->user_ctx);
217*4882a593Smuzhiyun
218*4882a593Smuzhiyun /* send command to mc*/
219*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
220*4882a593Smuzhiyun }
221*4882a593Smuzhiyun EXPORT_SYMBOL_GPL(dpcon_set_notification);
222