xref: /dpdk/drivers/bus/dpaa/base/fman/netcfg_layer.c (revision d81734caccade4dc17d24d2ffd8b71244d35a69f)
1 /* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
2  *
3  * Copyright 2010-2016 Freescale Semiconductor Inc.
4  * Copyright 2017 NXP
5  *
6  */
7 #include <inttypes.h>
8 #include <of.h>
9 #include <net/if.h>
10 #include <sys/ioctl.h>
11 #include <error.h>
12 #include <net/if_arp.h>
13 #include <assert.h>
14 #include <unistd.h>
15 
16 #include <rte_malloc.h>
17 
18 #include <rte_dpaa_logs.h>
19 #include <netcfg.h>
20 
21 /* Structure contains information about all the interfaces given by user
22  * on command line.
23  */
24 struct netcfg_interface *netcfg_interface;
25 
26 /* This data structure contaings all configurations information
27  * related to usages of DPA devices.
28  */
29 struct netcfg_info *netcfg;
30 /* fd to open a socket for making ioctl request to disable/enable shared
31  *  interfaces.
32  */
33 static int skfd = -1;
34 
35 #ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
36 void
37 dump_netcfg(struct netcfg_info *cfg_ptr)
38 {
39 	int i;
40 
41 	printf("..........  DPAA Configuration  ..........\n\n");
42 
43 	/* Network interfaces */
44 	printf("Network interfaces: %d\n", cfg_ptr->num_ethports);
45 	for (i = 0; i < cfg_ptr->num_ethports; i++) {
46 		struct fman_if_bpool *bpool;
47 		struct fm_eth_port_cfg *p_cfg = &cfg_ptr->port_cfg[i];
48 		struct fman_if *__if = p_cfg->fman_if;
49 
50 		printf("\n+ Fman %d, MAC %d (%s);\n",
51 		       __if->fman_idx, __if->mac_idx,
52 		       (__if->mac_type == fman_mac_1g) ? "1G" : "10G");
53 
54 		printf("\tmac_addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
55 		       (&__if->mac_addr)->addr_bytes[0],
56 		       (&__if->mac_addr)->addr_bytes[1],
57 		       (&__if->mac_addr)->addr_bytes[2],
58 		       (&__if->mac_addr)->addr_bytes[3],
59 		       (&__if->mac_addr)->addr_bytes[4],
60 		       (&__if->mac_addr)->addr_bytes[5]);
61 
62 		printf("\ttx_channel_id: 0x%02x\n",
63 		       __if->tx_channel_id);
64 
65 		printf("\tfqid_rx_def: 0x%x\n", p_cfg->rx_def);
66 		printf("\tfqid_rx_err: 0x%x\n", __if->fqid_rx_err);
67 
68 		printf("\tfqid_tx_err: 0x%x\n", __if->fqid_tx_err);
69 		printf("\tfqid_tx_confirm: 0x%x\n", __if->fqid_tx_confirm);
70 		fman_if_for_each_bpool(bpool, __if)
71 			printf("\tbuffer pool: (bpid=%d, count=%"PRId64
72 			       " size=%"PRId64", addr=0x%"PRIx64")\n",
73 			       bpool->bpid, bpool->count, bpool->size,
74 			       bpool->addr);
75 	}
76 }
77 #endif /* RTE_LIBRTE_DPAA_DEBUG_DRIVER */
78 
79 static inline int
80 get_num_netcfg_interfaces(char *str)
81 {
82 	char *pch;
83 	uint8_t count = 0;
84 
85 	if (str == NULL)
86 		return -EINVAL;
87 	pch = strtok(str, ",");
88 	while (pch != NULL) {
89 		count++;
90 		pch = strtok(NULL, ",");
91 	}
92 	return count;
93 }
94 
95 struct netcfg_info *
96 netcfg_acquire(void)
97 {
98 	struct fman_if *__if;
99 	int _errno, idx = 0;
100 	uint8_t num_ports = 0;
101 	uint8_t num_cfg_ports = 0;
102 	size_t size;
103 
104 	/* Extract dpa configuration from fman driver and FMC configuration
105 	 * for command-line interfaces.
106 	 */
107 
108 	/* Open a basic socket to enable/disable shared
109 	 * interfaces.
110 	 */
111 	skfd = socket(AF_PACKET, SOCK_RAW, 0);
112 	if (unlikely(skfd < 0)) {
113 		error(0, errno, "%s(): open(SOCK_RAW)", __func__);
114 		return NULL;
115 	}
116 
117 	/* Initialise the Fman driver */
118 	_errno = fman_init();
119 	if (_errno) {
120 		DPAA_BUS_LOG(ERR, "FMAN driver init failed (%d)", errno);
121 		close(skfd);
122 		skfd = -1;
123 		return NULL;
124 	}
125 
126 	/* Number of MAC ports */
127 	list_for_each_entry(__if, fman_if_list, node)
128 		num_ports++;
129 
130 	if (!num_ports) {
131 		DPAA_BUS_LOG(ERR, "FMAN ports not available");
132 		return NULL;
133 	}
134 	/* Allocate space for all enabled mac ports */
135 	size = sizeof(*netcfg) +
136 		(num_ports * sizeof(struct fm_eth_port_cfg));
137 
138 	netcfg = calloc(1, size);
139 	if (unlikely(netcfg == NULL)) {
140 		DPAA_BUS_LOG(ERR, "Unable to allocat mem for netcfg");
141 		goto error;
142 	}
143 
144 	netcfg->num_ethports = num_ports;
145 
146 	list_for_each_entry(__if, fman_if_list, node) {
147 		struct fm_eth_port_cfg *cfg = &netcfg->port_cfg[idx];
148 		/* Hook in the fman driver interface */
149 		cfg->fman_if = __if;
150 		cfg->rx_def = __if->fqid_rx_def;
151 		num_cfg_ports++;
152 		idx++;
153 	}
154 
155 	if (!num_cfg_ports) {
156 		DPAA_BUS_LOG(ERR, "No FMAN ports found");
157 		goto error;
158 	} else if (num_ports != num_cfg_ports)
159 		netcfg->num_ethports = num_cfg_ports;
160 
161 	return netcfg;
162 
163 error:
164 	if (netcfg) {
165 		free(netcfg);
166 		netcfg = NULL;
167 	}
168 
169 	return NULL;
170 }
171 
172 void
173 netcfg_release(struct netcfg_info *cfg_ptr)
174 {
175 	free(cfg_ptr);
176 	/* Close socket for shared interfaces */
177 	if (skfd >= 0) {
178 		close(skfd);
179 		skfd = -1;
180 	}
181 }
182