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 2016 NXP
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun */
7*4882a593Smuzhiyun #include <linux/kernel.h>
8*4882a593Smuzhiyun #include <linux/fsl/mc.h>
9*4882a593Smuzhiyun
10*4882a593Smuzhiyun #include "dpio.h"
11*4882a593Smuzhiyun #include "dpio-cmd.h"
12*4882a593Smuzhiyun
13*4882a593Smuzhiyun /*
14*4882a593Smuzhiyun * Data Path I/O Portal API
15*4882a593Smuzhiyun * Contains initialization APIs and runtime control APIs for DPIO
16*4882a593Smuzhiyun */
17*4882a593Smuzhiyun
18*4882a593Smuzhiyun /**
19*4882a593Smuzhiyun * dpio_open() - Open a control session for the specified object
20*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
21*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
22*4882a593Smuzhiyun * @dpio_id: DPIO unique ID
23*4882a593Smuzhiyun * @token: Returned token; use in subsequent API calls
24*4882a593Smuzhiyun *
25*4882a593Smuzhiyun * This function can be used to open a control session for an
26*4882a593Smuzhiyun * already created object; an object may have been declared in
27*4882a593Smuzhiyun * the DPL or by calling the dpio_create() function.
28*4882a593Smuzhiyun * This function returns a unique authentication token,
29*4882a593Smuzhiyun * associated with the specific object ID and the specific MC
30*4882a593Smuzhiyun * portal; this token must be used in all subsequent commands for
31*4882a593Smuzhiyun * this specific object.
32*4882a593Smuzhiyun *
33*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise.
34*4882a593Smuzhiyun */
dpio_open(struct fsl_mc_io * mc_io,u32 cmd_flags,int dpio_id,u16 * token)35*4882a593Smuzhiyun int dpio_open(struct fsl_mc_io *mc_io,
36*4882a593Smuzhiyun u32 cmd_flags,
37*4882a593Smuzhiyun int dpio_id,
38*4882a593Smuzhiyun u16 *token)
39*4882a593Smuzhiyun {
40*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
41*4882a593Smuzhiyun struct dpio_cmd_open *dpio_cmd;
42*4882a593Smuzhiyun int err;
43*4882a593Smuzhiyun
44*4882a593Smuzhiyun /* prepare command */
45*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_OPEN,
46*4882a593Smuzhiyun cmd_flags,
47*4882a593Smuzhiyun 0);
48*4882a593Smuzhiyun dpio_cmd = (struct dpio_cmd_open *)cmd.params;
49*4882a593Smuzhiyun dpio_cmd->dpio_id = cpu_to_le32(dpio_id);
50*4882a593Smuzhiyun
51*4882a593Smuzhiyun err = mc_send_command(mc_io, &cmd);
52*4882a593Smuzhiyun if (err)
53*4882a593Smuzhiyun return err;
54*4882a593Smuzhiyun
55*4882a593Smuzhiyun /* retrieve response parameters */
56*4882a593Smuzhiyun *token = mc_cmd_hdr_read_token(&cmd);
57*4882a593Smuzhiyun
58*4882a593Smuzhiyun return 0;
59*4882a593Smuzhiyun }
60*4882a593Smuzhiyun
61*4882a593Smuzhiyun /**
62*4882a593Smuzhiyun * dpio_close() - Close the control session of the object
63*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
64*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
65*4882a593Smuzhiyun * @token: Token of DPIO object
66*4882a593Smuzhiyun *
67*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise.
68*4882a593Smuzhiyun */
dpio_close(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)69*4882a593Smuzhiyun int dpio_close(struct fsl_mc_io *mc_io,
70*4882a593Smuzhiyun u32 cmd_flags,
71*4882a593Smuzhiyun u16 token)
72*4882a593Smuzhiyun {
73*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
74*4882a593Smuzhiyun
75*4882a593Smuzhiyun /* prepare command */
76*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_CLOSE,
77*4882a593Smuzhiyun cmd_flags,
78*4882a593Smuzhiyun token);
79*4882a593Smuzhiyun
80*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
81*4882a593Smuzhiyun }
82*4882a593Smuzhiyun
83*4882a593Smuzhiyun /**
84*4882a593Smuzhiyun * dpio_enable() - Enable the DPIO, allow I/O portal operations.
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 DPIO object
88*4882a593Smuzhiyun *
89*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
90*4882a593Smuzhiyun */
dpio_enable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)91*4882a593Smuzhiyun int dpio_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(DPIO_CMDID_ENABLE,
99*4882a593Smuzhiyun cmd_flags,
100*4882a593Smuzhiyun token);
101*4882a593Smuzhiyun
102*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
105*4882a593Smuzhiyun /**
106*4882a593Smuzhiyun * dpio_disable() - Disable the DPIO, stop any I/O portal operation.
107*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
108*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
109*4882a593Smuzhiyun * @token: Token of DPIO object
110*4882a593Smuzhiyun *
111*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
112*4882a593Smuzhiyun */
dpio_disable(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)113*4882a593Smuzhiyun int dpio_disable(struct fsl_mc_io *mc_io,
114*4882a593Smuzhiyun u32 cmd_flags,
115*4882a593Smuzhiyun u16 token)
116*4882a593Smuzhiyun {
117*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
118*4882a593Smuzhiyun
119*4882a593Smuzhiyun /* prepare command */
120*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_DISABLE,
121*4882a593Smuzhiyun cmd_flags,
122*4882a593Smuzhiyun token);
123*4882a593Smuzhiyun
124*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
125*4882a593Smuzhiyun }
126*4882a593Smuzhiyun
127*4882a593Smuzhiyun /**
128*4882a593Smuzhiyun * dpio_get_attributes() - Retrieve DPIO attributes
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 DPIO object
132*4882a593Smuzhiyun * @attr: Returned object's attributes
133*4882a593Smuzhiyun *
134*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
135*4882a593Smuzhiyun */
dpio_get_attributes(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,struct dpio_attr * attr)136*4882a593Smuzhiyun int dpio_get_attributes(struct fsl_mc_io *mc_io,
137*4882a593Smuzhiyun u32 cmd_flags,
138*4882a593Smuzhiyun u16 token,
139*4882a593Smuzhiyun struct dpio_attr *attr)
140*4882a593Smuzhiyun {
141*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
142*4882a593Smuzhiyun struct dpio_rsp_get_attr *dpio_rsp;
143*4882a593Smuzhiyun int err;
144*4882a593Smuzhiyun
145*4882a593Smuzhiyun /* prepare command */
146*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_ATTR,
147*4882a593Smuzhiyun cmd_flags,
148*4882a593Smuzhiyun token);
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun err = mc_send_command(mc_io, &cmd);
151*4882a593Smuzhiyun if (err)
152*4882a593Smuzhiyun return err;
153*4882a593Smuzhiyun
154*4882a593Smuzhiyun /* retrieve response parameters */
155*4882a593Smuzhiyun dpio_rsp = (struct dpio_rsp_get_attr *)cmd.params;
156*4882a593Smuzhiyun attr->id = le32_to_cpu(dpio_rsp->id);
157*4882a593Smuzhiyun attr->qbman_portal_id = le16_to_cpu(dpio_rsp->qbman_portal_id);
158*4882a593Smuzhiyun attr->num_priorities = dpio_rsp->num_priorities;
159*4882a593Smuzhiyun attr->channel_mode = dpio_rsp->channel_mode & DPIO_CHANNEL_MODE_MASK;
160*4882a593Smuzhiyun attr->qbman_portal_ce_offset =
161*4882a593Smuzhiyun le64_to_cpu(dpio_rsp->qbman_portal_ce_addr);
162*4882a593Smuzhiyun attr->qbman_portal_ci_offset =
163*4882a593Smuzhiyun le64_to_cpu(dpio_rsp->qbman_portal_ci_addr);
164*4882a593Smuzhiyun attr->qbman_version = le32_to_cpu(dpio_rsp->qbman_version);
165*4882a593Smuzhiyun
166*4882a593Smuzhiyun return 0;
167*4882a593Smuzhiyun }
168*4882a593Smuzhiyun
dpio_set_stashing_destination(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token,u8 sdest)169*4882a593Smuzhiyun int dpio_set_stashing_destination(struct fsl_mc_io *mc_io,
170*4882a593Smuzhiyun u32 cmd_flags,
171*4882a593Smuzhiyun u16 token,
172*4882a593Smuzhiyun u8 sdest)
173*4882a593Smuzhiyun {
174*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
175*4882a593Smuzhiyun struct dpio_stashing_dest *dpio_cmd;
176*4882a593Smuzhiyun
177*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_SET_STASHING_DEST,
178*4882a593Smuzhiyun cmd_flags, token);
179*4882a593Smuzhiyun dpio_cmd = (struct dpio_stashing_dest *)cmd.params;
180*4882a593Smuzhiyun dpio_cmd->sdest = sdest;
181*4882a593Smuzhiyun
182*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
183*4882a593Smuzhiyun }
184*4882a593Smuzhiyun
185*4882a593Smuzhiyun /**
186*4882a593Smuzhiyun * dpio_get_api_version - Get Data Path I/O API version
187*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's DPIO object
188*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
189*4882a593Smuzhiyun * @major_ver: Major version of DPIO API
190*4882a593Smuzhiyun * @minor_ver: Minor version of DPIO API
191*4882a593Smuzhiyun *
192*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise
193*4882a593Smuzhiyun */
dpio_get_api_version(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 * major_ver,u16 * minor_ver)194*4882a593Smuzhiyun int dpio_get_api_version(struct fsl_mc_io *mc_io,
195*4882a593Smuzhiyun u32 cmd_flags,
196*4882a593Smuzhiyun u16 *major_ver,
197*4882a593Smuzhiyun u16 *minor_ver)
198*4882a593Smuzhiyun {
199*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
200*4882a593Smuzhiyun int err;
201*4882a593Smuzhiyun
202*4882a593Smuzhiyun /* prepare command */
203*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_GET_API_VERSION,
204*4882a593Smuzhiyun cmd_flags, 0);
205*4882a593Smuzhiyun
206*4882a593Smuzhiyun err = mc_send_command(mc_io, &cmd);
207*4882a593Smuzhiyun if (err)
208*4882a593Smuzhiyun return err;
209*4882a593Smuzhiyun
210*4882a593Smuzhiyun /* retrieve response parameters */
211*4882a593Smuzhiyun mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
212*4882a593Smuzhiyun
213*4882a593Smuzhiyun return 0;
214*4882a593Smuzhiyun }
215*4882a593Smuzhiyun
216*4882a593Smuzhiyun /**
217*4882a593Smuzhiyun * dpio_reset() - Reset the DPIO, returns the object to initial state.
218*4882a593Smuzhiyun * @mc_io: Pointer to MC portal's I/O object
219*4882a593Smuzhiyun * @cmd_flags: Command flags; one or more of 'MC_CMD_FLAG_'
220*4882a593Smuzhiyun * @token: Token of DPIO object
221*4882a593Smuzhiyun *
222*4882a593Smuzhiyun * Return: '0' on Success; Error code otherwise.
223*4882a593Smuzhiyun */
dpio_reset(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 token)224*4882a593Smuzhiyun int dpio_reset(struct fsl_mc_io *mc_io,
225*4882a593Smuzhiyun u32 cmd_flags,
226*4882a593Smuzhiyun u16 token)
227*4882a593Smuzhiyun {
228*4882a593Smuzhiyun struct fsl_mc_command cmd = { 0 };
229*4882a593Smuzhiyun
230*4882a593Smuzhiyun /* prepare command */
231*4882a593Smuzhiyun cmd.header = mc_encode_cmd_header(DPIO_CMDID_RESET,
232*4882a593Smuzhiyun cmd_flags,
233*4882a593Smuzhiyun token);
234*4882a593Smuzhiyun
235*4882a593Smuzhiyun /* send command to mc*/
236*4882a593Smuzhiyun return mc_send_command(mc_io, &cmd);
237*4882a593Smuzhiyun }
238