xref: /openbmc/u-boot/drivers/net/fsl-mc/dpmac.c (revision 9a66328a)
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