183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
2872d48a7SPrabhakar Kushwaha /*
3872d48a7SPrabhakar Kushwaha * Freescale Layerscape MC I/O wrapper
4872d48a7SPrabhakar Kushwaha *
5*a6f2a6eaSYogesh Gaur * Copyright 2015-2016 Freescale Semiconductor, Inc.
62557c5a9SYogesh Gaur * Copyright 2017 NXP
7872d48a7SPrabhakar Kushwaha * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
8872d48a7SPrabhakar Kushwaha */
9872d48a7SPrabhakar Kushwaha
10872d48a7SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_sys.h>
11872d48a7SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_cmd.h>
12872d48a7SPrabhakar Kushwaha #include <fsl-mc/fsl_dpmac.h>
13872d48a7SPrabhakar Kushwaha
dpmac_open(struct fsl_mc_io * mc_io,uint32_t cmd_flags,int dpmac_id,uint16_t * token)14872d48a7SPrabhakar Kushwaha int dpmac_open(struct fsl_mc_io *mc_io,
15872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
16872d48a7SPrabhakar Kushwaha int dpmac_id,
17872d48a7SPrabhakar Kushwaha uint16_t *token)
18872d48a7SPrabhakar Kushwaha {
19872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
20872d48a7SPrabhakar Kushwaha int err;
21872d48a7SPrabhakar Kushwaha
22872d48a7SPrabhakar Kushwaha /* prepare command */
23872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_OPEN,
24872d48a7SPrabhakar Kushwaha cmd_flags,
25872d48a7SPrabhakar Kushwaha 0);
26872d48a7SPrabhakar Kushwaha DPMAC_CMD_OPEN(cmd, dpmac_id);
27872d48a7SPrabhakar Kushwaha
28872d48a7SPrabhakar Kushwaha /* send command to mc*/
29872d48a7SPrabhakar Kushwaha err = mc_send_command(mc_io, &cmd);
30872d48a7SPrabhakar Kushwaha if (err)
31872d48a7SPrabhakar Kushwaha return err;
32872d48a7SPrabhakar Kushwaha
33872d48a7SPrabhakar Kushwaha /* retrieve response parameters */
34872d48a7SPrabhakar Kushwaha *token = MC_CMD_HDR_READ_TOKEN(cmd.header);
35872d48a7SPrabhakar Kushwaha
36872d48a7SPrabhakar Kushwaha return err;
37872d48a7SPrabhakar Kushwaha }
38872d48a7SPrabhakar Kushwaha
dpmac_close(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)39872d48a7SPrabhakar Kushwaha int dpmac_close(struct fsl_mc_io *mc_io,
40872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
41872d48a7SPrabhakar Kushwaha uint16_t token)
42872d48a7SPrabhakar Kushwaha {
43872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
44872d48a7SPrabhakar Kushwaha
45872d48a7SPrabhakar Kushwaha /* prepare command */
46872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CLOSE, cmd_flags,
47872d48a7SPrabhakar Kushwaha token);
48872d48a7SPrabhakar Kushwaha
49872d48a7SPrabhakar Kushwaha /* send command to mc*/
50872d48a7SPrabhakar Kushwaha return mc_send_command(mc_io, &cmd);
51872d48a7SPrabhakar Kushwaha }
52872d48a7SPrabhakar Kushwaha
dpmac_create(struct fsl_mc_io * mc_io,uint16_t dprc_token,uint32_t cmd_flags,const struct dpmac_cfg * cfg,uint32_t * obj_id)53872d48a7SPrabhakar Kushwaha int dpmac_create(struct fsl_mc_io *mc_io,
542557c5a9SYogesh Gaur uint16_t dprc_token,
55872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
56872d48a7SPrabhakar Kushwaha const struct dpmac_cfg *cfg,
572557c5a9SYogesh Gaur uint32_t *obj_id)
58872d48a7SPrabhakar Kushwaha {
59872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
60872d48a7SPrabhakar Kushwaha int err;
61872d48a7SPrabhakar Kushwaha
62872d48a7SPrabhakar Kushwaha /* prepare command */
63872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CREATE,
64872d48a7SPrabhakar Kushwaha cmd_flags,
652557c5a9SYogesh Gaur dprc_token);
66872d48a7SPrabhakar Kushwaha DPMAC_CMD_CREATE(cmd, cfg);
67872d48a7SPrabhakar Kushwaha
68872d48a7SPrabhakar Kushwaha /* send command to mc*/
69872d48a7SPrabhakar Kushwaha err = mc_send_command(mc_io, &cmd);
70872d48a7SPrabhakar Kushwaha if (err)
71872d48a7SPrabhakar Kushwaha return err;
72872d48a7SPrabhakar Kushwaha
73872d48a7SPrabhakar Kushwaha /* retrieve response parameters */
742557c5a9SYogesh Gaur MC_CMD_READ_OBJ_ID(cmd, *obj_id);
75872d48a7SPrabhakar Kushwaha
76872d48a7SPrabhakar Kushwaha return 0;
77872d48a7SPrabhakar Kushwaha }
78872d48a7SPrabhakar Kushwaha
dpmac_destroy(struct fsl_mc_io * mc_io,uint16_t dprc_token,uint32_t cmd_flags,uint32_t obj_id)79872d48a7SPrabhakar Kushwaha int dpmac_destroy(struct fsl_mc_io *mc_io,
802557c5a9SYogesh Gaur uint16_t dprc_token,
81872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
822557c5a9SYogesh Gaur uint32_t obj_id)
83872d48a7SPrabhakar Kushwaha {
84872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
85872d48a7SPrabhakar Kushwaha
86872d48a7SPrabhakar Kushwaha /* prepare command */
87872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_DESTROY,
88872d48a7SPrabhakar Kushwaha cmd_flags,
892557c5a9SYogesh Gaur dprc_token);
902557c5a9SYogesh Gaur
912557c5a9SYogesh Gaur /* set object id to destroy */
922557c5a9SYogesh Gaur CMD_DESTROY_SET_OBJ_ID_PARAM0(cmd, obj_id);
93872d48a7SPrabhakar Kushwaha
94872d48a7SPrabhakar Kushwaha /* send command to mc*/
95872d48a7SPrabhakar Kushwaha return mc_send_command(mc_io, &cmd);
96872d48a7SPrabhakar Kushwaha }
97872d48a7SPrabhakar Kushwaha
dpmac_get_attributes(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_attr * attr)98872d48a7SPrabhakar Kushwaha int dpmac_get_attributes(struct fsl_mc_io *mc_io,
99872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
100872d48a7SPrabhakar Kushwaha uint16_t token,
101872d48a7SPrabhakar Kushwaha struct dpmac_attr *attr)
102872d48a7SPrabhakar Kushwaha {
103872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
104872d48a7SPrabhakar Kushwaha int err;
105872d48a7SPrabhakar Kushwaha
106872d48a7SPrabhakar Kushwaha /* prepare command */
107872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_ATTR,
108872d48a7SPrabhakar Kushwaha cmd_flags,
109872d48a7SPrabhakar Kushwaha token);
110872d48a7SPrabhakar Kushwaha
111872d48a7SPrabhakar Kushwaha /* send command to mc*/
112872d48a7SPrabhakar Kushwaha err = mc_send_command(mc_io, &cmd);
113872d48a7SPrabhakar Kushwaha if (err)
114872d48a7SPrabhakar Kushwaha return err;
115872d48a7SPrabhakar Kushwaha
116872d48a7SPrabhakar Kushwaha /* retrieve response parameters */
117872d48a7SPrabhakar Kushwaha DPMAC_RSP_GET_ATTRIBUTES(cmd, attr);
118872d48a7SPrabhakar Kushwaha
119872d48a7SPrabhakar Kushwaha return 0;
120872d48a7SPrabhakar Kushwaha }
121872d48a7SPrabhakar Kushwaha
dpmac_mdio_read(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_mdio_cfg * cfg)122872d48a7SPrabhakar Kushwaha int dpmac_mdio_read(struct fsl_mc_io *mc_io,
123872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
124872d48a7SPrabhakar Kushwaha uint16_t token,
125872d48a7SPrabhakar Kushwaha struct dpmac_mdio_cfg *cfg)
126872d48a7SPrabhakar Kushwaha {
127872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
128872d48a7SPrabhakar Kushwaha int err;
129872d48a7SPrabhakar Kushwaha
130872d48a7SPrabhakar Kushwaha /* prepare command */
131872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_READ,
132872d48a7SPrabhakar Kushwaha cmd_flags,
133872d48a7SPrabhakar Kushwaha token);
134872d48a7SPrabhakar Kushwaha DPMAC_CMD_MDIO_READ(cmd, cfg);
135872d48a7SPrabhakar Kushwaha
136872d48a7SPrabhakar Kushwaha /* send command to mc*/
137872d48a7SPrabhakar Kushwaha err = mc_send_command(mc_io, &cmd);
138872d48a7SPrabhakar Kushwaha if (err)
139872d48a7SPrabhakar Kushwaha return err;
140872d48a7SPrabhakar Kushwaha
141872d48a7SPrabhakar Kushwaha /* retrieve response parameters */
142872d48a7SPrabhakar Kushwaha DPMAC_RSP_MDIO_READ(cmd, cfg->data);
143872d48a7SPrabhakar Kushwaha
144872d48a7SPrabhakar Kushwaha return 0;
145872d48a7SPrabhakar Kushwaha }
146872d48a7SPrabhakar Kushwaha
dpmac_mdio_write(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_mdio_cfg * cfg)147872d48a7SPrabhakar Kushwaha int dpmac_mdio_write(struct fsl_mc_io *mc_io,
148872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
149872d48a7SPrabhakar Kushwaha uint16_t token,
150872d48a7SPrabhakar Kushwaha struct dpmac_mdio_cfg *cfg)
151872d48a7SPrabhakar Kushwaha {
152872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
153872d48a7SPrabhakar Kushwaha
154872d48a7SPrabhakar Kushwaha /* prepare command */
155872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_WRITE,
156872d48a7SPrabhakar Kushwaha cmd_flags,
157872d48a7SPrabhakar Kushwaha token);
158872d48a7SPrabhakar Kushwaha DPMAC_CMD_MDIO_WRITE(cmd, cfg);
159872d48a7SPrabhakar Kushwaha
160872d48a7SPrabhakar Kushwaha /* send command to mc*/
161872d48a7SPrabhakar Kushwaha return mc_send_command(mc_io, &cmd);
162872d48a7SPrabhakar Kushwaha }
163872d48a7SPrabhakar Kushwaha
dpmac_get_link_cfg(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_link_cfg * cfg)164872d48a7SPrabhakar Kushwaha int dpmac_get_link_cfg(struct fsl_mc_io *mc_io,
165872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
166872d48a7SPrabhakar Kushwaha uint16_t token,
167872d48a7SPrabhakar Kushwaha struct dpmac_link_cfg *cfg)
168872d48a7SPrabhakar Kushwaha {
169872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
170872d48a7SPrabhakar Kushwaha int err = 0;
171872d48a7SPrabhakar Kushwaha
172872d48a7SPrabhakar Kushwaha /* prepare command */
173872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_LINK_CFG,
174872d48a7SPrabhakar Kushwaha cmd_flags,
175872d48a7SPrabhakar Kushwaha token);
176872d48a7SPrabhakar Kushwaha
177872d48a7SPrabhakar Kushwaha /* send command to mc*/
178872d48a7SPrabhakar Kushwaha err = mc_send_command(mc_io, &cmd);
179872d48a7SPrabhakar Kushwaha if (err)
180872d48a7SPrabhakar Kushwaha return err;
181872d48a7SPrabhakar Kushwaha
182872d48a7SPrabhakar Kushwaha DPMAC_RSP_GET_LINK_CFG(cmd, cfg);
183872d48a7SPrabhakar Kushwaha
184872d48a7SPrabhakar Kushwaha return 0;
185872d48a7SPrabhakar Kushwaha }
186872d48a7SPrabhakar Kushwaha
dpmac_set_link_state(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_link_state * link_state)187872d48a7SPrabhakar Kushwaha int dpmac_set_link_state(struct fsl_mc_io *mc_io,
188872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
189872d48a7SPrabhakar Kushwaha uint16_t token,
190872d48a7SPrabhakar Kushwaha struct dpmac_link_state *link_state)
191872d48a7SPrabhakar Kushwaha {
192872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
193872d48a7SPrabhakar Kushwaha
194872d48a7SPrabhakar Kushwaha /* prepare command */
195872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_SET_LINK_STATE,
196872d48a7SPrabhakar Kushwaha cmd_flags,
197872d48a7SPrabhakar Kushwaha token);
198872d48a7SPrabhakar Kushwaha DPMAC_CMD_SET_LINK_STATE(cmd, link_state);
199872d48a7SPrabhakar Kushwaha
200872d48a7SPrabhakar Kushwaha /* send command to mc*/
201872d48a7SPrabhakar Kushwaha return mc_send_command(mc_io, &cmd);
202872d48a7SPrabhakar Kushwaha }
203872d48a7SPrabhakar Kushwaha
dpmac_get_counter(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,enum dpmac_counter type,uint64_t * counter)204872d48a7SPrabhakar Kushwaha int dpmac_get_counter(struct fsl_mc_io *mc_io,
205872d48a7SPrabhakar Kushwaha uint32_t cmd_flags,
206872d48a7SPrabhakar Kushwaha uint16_t token,
207872d48a7SPrabhakar Kushwaha enum dpmac_counter type,
208872d48a7SPrabhakar Kushwaha uint64_t *counter)
209872d48a7SPrabhakar Kushwaha {
210872d48a7SPrabhakar Kushwaha struct mc_command cmd = { 0 };
211872d48a7SPrabhakar Kushwaha int err = 0;
212872d48a7SPrabhakar Kushwaha
213872d48a7SPrabhakar Kushwaha /* prepare command */
214872d48a7SPrabhakar Kushwaha cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_COUNTER,
215872d48a7SPrabhakar Kushwaha cmd_flags,
216872d48a7SPrabhakar Kushwaha token);
217872d48a7SPrabhakar Kushwaha DPMAC_CMD_GET_COUNTER(cmd, type);
218872d48a7SPrabhakar Kushwaha
219872d48a7SPrabhakar Kushwaha /* send command to mc*/
220872d48a7SPrabhakar Kushwaha err = mc_send_command(mc_io, &cmd);
221872d48a7SPrabhakar Kushwaha if (err)
222872d48a7SPrabhakar Kushwaha return err;
223872d48a7SPrabhakar Kushwaha
224872d48a7SPrabhakar Kushwaha DPMAC_RSP_GET_COUNTER(cmd, *counter);
225872d48a7SPrabhakar Kushwaha
226872d48a7SPrabhakar Kushwaha return 0;
227872d48a7SPrabhakar Kushwaha }
2282557c5a9SYogesh Gaur
dpmac_get_api_version(struct fsl_mc_io * mc_io,u32 cmd_flags,u16 * major_ver,u16 * minor_ver)2292557c5a9SYogesh Gaur int dpmac_get_api_version(struct fsl_mc_io *mc_io,
2302557c5a9SYogesh Gaur u32 cmd_flags,
2312557c5a9SYogesh Gaur u16 *major_ver,
2322557c5a9SYogesh Gaur u16 *minor_ver)
2332557c5a9SYogesh Gaur {
2342557c5a9SYogesh Gaur struct mc_command cmd = { 0 };
2352557c5a9SYogesh Gaur int err;
2362557c5a9SYogesh Gaur
2372557c5a9SYogesh Gaur /* prepare command */
2382557c5a9SYogesh Gaur cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_API_VERSION,
2392557c5a9SYogesh Gaur cmd_flags, 0);
2402557c5a9SYogesh Gaur
2412557c5a9SYogesh Gaur /* send command to mc */
2422557c5a9SYogesh Gaur err = mc_send_command(mc_io, &cmd);
2432557c5a9SYogesh Gaur if (err)
2442557c5a9SYogesh Gaur return err;
2452557c5a9SYogesh Gaur
2462557c5a9SYogesh Gaur /* retrieve response parameters */
2472557c5a9SYogesh Gaur mc_cmd_read_api_version(&cmd, major_ver, minor_ver);
2482557c5a9SYogesh Gaur
2492557c5a9SYogesh Gaur return 0;
2502557c5a9SYogesh Gaur }
251