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