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