xref: /rk3399_rockchip-uboot/drivers/net/fsl-mc/dpmac.c (revision 1670c8c219f6e47de624b4ed557b5a995265cd40)
1*872d48a7SPrabhakar Kushwaha /*
2*872d48a7SPrabhakar Kushwaha  * Freescale Layerscape MC I/O wrapper
3*872d48a7SPrabhakar Kushwaha  *
4*872d48a7SPrabhakar Kushwaha  * Copyright (C) 2015 Freescale Semiconductor, Inc.
5*872d48a7SPrabhakar Kushwaha  * Author: Prabhakar Kushwaha <prabhakar@freescale.com>
6*872d48a7SPrabhakar Kushwaha  *
7*872d48a7SPrabhakar Kushwaha  * SPDX-License-Identifier:	GPL-2.0+
8*872d48a7SPrabhakar Kushwaha  */
9*872d48a7SPrabhakar Kushwaha 
10*872d48a7SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_sys.h>
11*872d48a7SPrabhakar Kushwaha #include <fsl-mc/fsl_mc_cmd.h>
12*872d48a7SPrabhakar Kushwaha #include <fsl-mc/fsl_dpmac.h>
13*872d48a7SPrabhakar Kushwaha 
dpmac_open(struct fsl_mc_io * mc_io,uint32_t cmd_flags,int dpmac_id,uint16_t * token)14*872d48a7SPrabhakar Kushwaha int dpmac_open(struct fsl_mc_io *mc_io,
15*872d48a7SPrabhakar Kushwaha 	       uint32_t cmd_flags,
16*872d48a7SPrabhakar Kushwaha 	       int dpmac_id,
17*872d48a7SPrabhakar Kushwaha 	       uint16_t *token)
18*872d48a7SPrabhakar Kushwaha {
19*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
20*872d48a7SPrabhakar Kushwaha 	int err;
21*872d48a7SPrabhakar Kushwaha 
22*872d48a7SPrabhakar Kushwaha 	/* prepare command */
23*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_OPEN,
24*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
25*872d48a7SPrabhakar Kushwaha 					  0);
26*872d48a7SPrabhakar Kushwaha 	DPMAC_CMD_OPEN(cmd, dpmac_id);
27*872d48a7SPrabhakar Kushwaha 
28*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
29*872d48a7SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
30*872d48a7SPrabhakar Kushwaha 	if (err)
31*872d48a7SPrabhakar Kushwaha 		return err;
32*872d48a7SPrabhakar Kushwaha 
33*872d48a7SPrabhakar Kushwaha 	/* retrieve response parameters */
34*872d48a7SPrabhakar Kushwaha 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
35*872d48a7SPrabhakar Kushwaha 
36*872d48a7SPrabhakar Kushwaha 	return err;
37*872d48a7SPrabhakar Kushwaha }
38*872d48a7SPrabhakar Kushwaha 
dpmac_close(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)39*872d48a7SPrabhakar Kushwaha int dpmac_close(struct fsl_mc_io *mc_io,
40*872d48a7SPrabhakar Kushwaha 		uint32_t cmd_flags,
41*872d48a7SPrabhakar Kushwaha 		uint16_t token)
42*872d48a7SPrabhakar Kushwaha {
43*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
44*872d48a7SPrabhakar Kushwaha 
45*872d48a7SPrabhakar Kushwaha 	/* prepare command */
46*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CLOSE, cmd_flags,
47*872d48a7SPrabhakar Kushwaha 					  token);
48*872d48a7SPrabhakar Kushwaha 
49*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
50*872d48a7SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
51*872d48a7SPrabhakar Kushwaha }
52*872d48a7SPrabhakar Kushwaha 
dpmac_create(struct fsl_mc_io * mc_io,uint32_t cmd_flags,const struct dpmac_cfg * cfg,uint16_t * token)53*872d48a7SPrabhakar Kushwaha int dpmac_create(struct fsl_mc_io *mc_io,
54*872d48a7SPrabhakar Kushwaha 		 uint32_t cmd_flags,
55*872d48a7SPrabhakar Kushwaha 		 const struct dpmac_cfg *cfg,
56*872d48a7SPrabhakar Kushwaha 		 uint16_t *token)
57*872d48a7SPrabhakar Kushwaha {
58*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
59*872d48a7SPrabhakar Kushwaha 	int err;
60*872d48a7SPrabhakar Kushwaha 
61*872d48a7SPrabhakar Kushwaha 	/* prepare command */
62*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_CREATE,
63*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
64*872d48a7SPrabhakar Kushwaha 					  0);
65*872d48a7SPrabhakar Kushwaha 	DPMAC_CMD_CREATE(cmd, cfg);
66*872d48a7SPrabhakar Kushwaha 
67*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
68*872d48a7SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
69*872d48a7SPrabhakar Kushwaha 	if (err)
70*872d48a7SPrabhakar Kushwaha 		return err;
71*872d48a7SPrabhakar Kushwaha 
72*872d48a7SPrabhakar Kushwaha 	/* retrieve response parameters */
73*872d48a7SPrabhakar Kushwaha 	*token = MC_CMD_HDR_READ_TOKEN(cmd.header);
74*872d48a7SPrabhakar Kushwaha 
75*872d48a7SPrabhakar Kushwaha 	return 0;
76*872d48a7SPrabhakar Kushwaha }
77*872d48a7SPrabhakar Kushwaha 
dpmac_destroy(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token)78*872d48a7SPrabhakar Kushwaha int dpmac_destroy(struct fsl_mc_io *mc_io,
79*872d48a7SPrabhakar Kushwaha 		  uint32_t cmd_flags,
80*872d48a7SPrabhakar Kushwaha 		  uint16_t token)
81*872d48a7SPrabhakar Kushwaha {
82*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
83*872d48a7SPrabhakar Kushwaha 
84*872d48a7SPrabhakar Kushwaha 	/* prepare command */
85*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_DESTROY,
86*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
87*872d48a7SPrabhakar Kushwaha 					  token);
88*872d48a7SPrabhakar Kushwaha 
89*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
90*872d48a7SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
91*872d48a7SPrabhakar Kushwaha }
92*872d48a7SPrabhakar Kushwaha 
dpmac_get_attributes(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_attr * attr)93*872d48a7SPrabhakar Kushwaha int dpmac_get_attributes(struct fsl_mc_io *mc_io,
94*872d48a7SPrabhakar Kushwaha 			 uint32_t cmd_flags,
95*872d48a7SPrabhakar Kushwaha 			 uint16_t token,
96*872d48a7SPrabhakar Kushwaha 			 struct dpmac_attr *attr)
97*872d48a7SPrabhakar Kushwaha {
98*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
99*872d48a7SPrabhakar Kushwaha 	int err;
100*872d48a7SPrabhakar Kushwaha 
101*872d48a7SPrabhakar Kushwaha 	/* prepare command */
102*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_ATTR,
103*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
104*872d48a7SPrabhakar Kushwaha 					  token);
105*872d48a7SPrabhakar Kushwaha 
106*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
107*872d48a7SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
108*872d48a7SPrabhakar Kushwaha 	if (err)
109*872d48a7SPrabhakar Kushwaha 		return err;
110*872d48a7SPrabhakar Kushwaha 
111*872d48a7SPrabhakar Kushwaha 	/* retrieve response parameters */
112*872d48a7SPrabhakar Kushwaha 	DPMAC_RSP_GET_ATTRIBUTES(cmd, attr);
113*872d48a7SPrabhakar Kushwaha 
114*872d48a7SPrabhakar Kushwaha 	return 0;
115*872d48a7SPrabhakar Kushwaha }
116*872d48a7SPrabhakar Kushwaha 
dpmac_mdio_read(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_mdio_cfg * cfg)117*872d48a7SPrabhakar Kushwaha int dpmac_mdio_read(struct fsl_mc_io *mc_io,
118*872d48a7SPrabhakar Kushwaha 		    uint32_t cmd_flags,
119*872d48a7SPrabhakar Kushwaha 		    uint16_t token,
120*872d48a7SPrabhakar Kushwaha 		    struct dpmac_mdio_cfg *cfg)
121*872d48a7SPrabhakar Kushwaha {
122*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
123*872d48a7SPrabhakar Kushwaha 	int err;
124*872d48a7SPrabhakar Kushwaha 
125*872d48a7SPrabhakar Kushwaha 	/* prepare command */
126*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_READ,
127*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
128*872d48a7SPrabhakar Kushwaha 					  token);
129*872d48a7SPrabhakar Kushwaha 	DPMAC_CMD_MDIO_READ(cmd, cfg);
130*872d48a7SPrabhakar Kushwaha 
131*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
132*872d48a7SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
133*872d48a7SPrabhakar Kushwaha 	if (err)
134*872d48a7SPrabhakar Kushwaha 		return err;
135*872d48a7SPrabhakar Kushwaha 
136*872d48a7SPrabhakar Kushwaha 	/* retrieve response parameters */
137*872d48a7SPrabhakar Kushwaha 	DPMAC_RSP_MDIO_READ(cmd, cfg->data);
138*872d48a7SPrabhakar Kushwaha 
139*872d48a7SPrabhakar Kushwaha 	return 0;
140*872d48a7SPrabhakar Kushwaha }
141*872d48a7SPrabhakar Kushwaha 
dpmac_mdio_write(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_mdio_cfg * cfg)142*872d48a7SPrabhakar Kushwaha int dpmac_mdio_write(struct fsl_mc_io *mc_io,
143*872d48a7SPrabhakar Kushwaha 		     uint32_t cmd_flags,
144*872d48a7SPrabhakar Kushwaha 		     uint16_t token,
145*872d48a7SPrabhakar Kushwaha 		     struct dpmac_mdio_cfg *cfg)
146*872d48a7SPrabhakar Kushwaha {
147*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
148*872d48a7SPrabhakar Kushwaha 
149*872d48a7SPrabhakar Kushwaha 	/* prepare command */
150*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_MDIO_WRITE,
151*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
152*872d48a7SPrabhakar Kushwaha 					  token);
153*872d48a7SPrabhakar Kushwaha 	DPMAC_CMD_MDIO_WRITE(cmd, cfg);
154*872d48a7SPrabhakar Kushwaha 
155*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
156*872d48a7SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
157*872d48a7SPrabhakar Kushwaha }
158*872d48a7SPrabhakar Kushwaha 
dpmac_get_link_cfg(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_link_cfg * cfg)159*872d48a7SPrabhakar Kushwaha int dpmac_get_link_cfg(struct fsl_mc_io *mc_io,
160*872d48a7SPrabhakar Kushwaha 		       uint32_t cmd_flags,
161*872d48a7SPrabhakar Kushwaha 		       uint16_t token,
162*872d48a7SPrabhakar Kushwaha 		       struct dpmac_link_cfg *cfg)
163*872d48a7SPrabhakar Kushwaha {
164*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
165*872d48a7SPrabhakar Kushwaha 	int err = 0;
166*872d48a7SPrabhakar Kushwaha 
167*872d48a7SPrabhakar Kushwaha 	/* prepare command */
168*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_LINK_CFG,
169*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
170*872d48a7SPrabhakar Kushwaha 					  token);
171*872d48a7SPrabhakar Kushwaha 
172*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
173*872d48a7SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
174*872d48a7SPrabhakar Kushwaha 	if (err)
175*872d48a7SPrabhakar Kushwaha 		return err;
176*872d48a7SPrabhakar Kushwaha 
177*872d48a7SPrabhakar Kushwaha 	DPMAC_RSP_GET_LINK_CFG(cmd, cfg);
178*872d48a7SPrabhakar Kushwaha 
179*872d48a7SPrabhakar Kushwaha 	return 0;
180*872d48a7SPrabhakar Kushwaha }
181*872d48a7SPrabhakar Kushwaha 
dpmac_set_link_state(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,struct dpmac_link_state * link_state)182*872d48a7SPrabhakar Kushwaha int dpmac_set_link_state(struct fsl_mc_io *mc_io,
183*872d48a7SPrabhakar Kushwaha 			 uint32_t cmd_flags,
184*872d48a7SPrabhakar Kushwaha 			 uint16_t token,
185*872d48a7SPrabhakar Kushwaha 			 struct dpmac_link_state *link_state)
186*872d48a7SPrabhakar Kushwaha {
187*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
188*872d48a7SPrabhakar Kushwaha 
189*872d48a7SPrabhakar Kushwaha 	/* prepare command */
190*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_SET_LINK_STATE,
191*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
192*872d48a7SPrabhakar Kushwaha 					  token);
193*872d48a7SPrabhakar Kushwaha 	DPMAC_CMD_SET_LINK_STATE(cmd, link_state);
194*872d48a7SPrabhakar Kushwaha 
195*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
196*872d48a7SPrabhakar Kushwaha 	return mc_send_command(mc_io, &cmd);
197*872d48a7SPrabhakar Kushwaha }
198*872d48a7SPrabhakar Kushwaha 
dpmac_get_counter(struct fsl_mc_io * mc_io,uint32_t cmd_flags,uint16_t token,enum dpmac_counter type,uint64_t * counter)199*872d48a7SPrabhakar Kushwaha int dpmac_get_counter(struct fsl_mc_io *mc_io,
200*872d48a7SPrabhakar Kushwaha 		      uint32_t cmd_flags,
201*872d48a7SPrabhakar Kushwaha 		      uint16_t token,
202*872d48a7SPrabhakar Kushwaha 		      enum dpmac_counter type,
203*872d48a7SPrabhakar Kushwaha 		      uint64_t *counter)
204*872d48a7SPrabhakar Kushwaha {
205*872d48a7SPrabhakar Kushwaha 	struct mc_command cmd = { 0 };
206*872d48a7SPrabhakar Kushwaha 	int err = 0;
207*872d48a7SPrabhakar Kushwaha 
208*872d48a7SPrabhakar Kushwaha 	/* prepare command */
209*872d48a7SPrabhakar Kushwaha 	cmd.header = mc_encode_cmd_header(DPMAC_CMDID_GET_COUNTER,
210*872d48a7SPrabhakar Kushwaha 					  cmd_flags,
211*872d48a7SPrabhakar Kushwaha 					  token);
212*872d48a7SPrabhakar Kushwaha 	DPMAC_CMD_GET_COUNTER(cmd, type);
213*872d48a7SPrabhakar Kushwaha 
214*872d48a7SPrabhakar Kushwaha 	/* send command to mc*/
215*872d48a7SPrabhakar Kushwaha 	err = mc_send_command(mc_io, &cmd);
216*872d48a7SPrabhakar Kushwaha 	if (err)
217*872d48a7SPrabhakar Kushwaha 		return err;
218*872d48a7SPrabhakar Kushwaha 
219*872d48a7SPrabhakar Kushwaha 	DPMAC_RSP_GET_COUNTER(cmd, *counter);
220*872d48a7SPrabhakar Kushwaha 
221*872d48a7SPrabhakar Kushwaha 	return 0;
222*872d48a7SPrabhakar Kushwaha }
223