Branch data Line data Source code
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
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 *
71 : 0 : 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 : 0 : skfd = socket(AF_PACKET, SOCK_RAW, 0);
87 [ # # ]: 0 : if (unlikely(skfd < 0)) {
88 : 0 : err(0, "%s(): open(SOCK_RAW)", __func__);
89 : : return NULL;
90 : : }
91 : :
92 : : /* Initialise the Fman driver */
93 : 0 : _errno = fman_init();
94 [ # # ]: 0 : if (_errno) {
95 : 0 : DPAA_BUS_LOG(ERR, "FMAN driver init failed (%d)", errno);
96 : 0 : close(skfd);
97 : 0 : skfd = -1;
98 : 0 : return NULL;
99 : : }
100 : :
101 : : /* Number of MAC ports */
102 [ # # ]: 0 : list_for_each_entry(__if, fman_if_list, node)
103 : 0 : num_ports++;
104 : :
105 [ # # ]: 0 : if (!num_ports) {
106 : 0 : DPAA_BUS_LOG(ERR, "FMAN ports not available");
107 : 0 : return NULL;
108 : : }
109 : : /* Allocate space for all enabled mac ports */
110 : 0 : size = sizeof(*netcfg) +
111 : 0 : (num_ports * sizeof(struct fm_eth_port_cfg));
112 : :
113 : 0 : netcfg = rte_calloc(NULL, 1, size, 0);
114 [ # # ]: 0 : if (unlikely(netcfg == NULL)) {
115 : 0 : DPAA_BUS_LOG(ERR, "Unable to allocat mem for netcfg");
116 : 0 : goto error;
117 : : }
118 : :
119 : 0 : netcfg->num_ethports = num_ports;
120 : :
121 [ # # ]: 0 : 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 : 0 : cfg->fman_if = __if;
125 : 0 : cfg->rx_def = __if->fqid_rx_def;
126 : 0 : num_cfg_ports++;
127 : 0 : idx++;
128 : : }
129 : :
130 [ # # ]: 0 : if (!num_cfg_ports) {
131 : 0 : DPAA_BUS_LOG(ERR, "No FMAN ports found");
132 : 0 : goto error;
133 [ # # ]: 0 : } else if (num_ports != num_cfg_ports)
134 : 0 : netcfg->num_ethports = num_cfg_ports;
135 : :
136 : : return netcfg;
137 : :
138 : 0 : error:
139 [ # # ]: 0 : if (netcfg) {
140 : 0 : rte_free(netcfg);
141 : 0 : netcfg = NULL;
142 : : }
143 : :
144 : : return NULL;
145 : : }
146 : :
147 : : void
148 : 0 : netcfg_release(struct netcfg_info *cfg_ptr)
149 : : {
150 : 0 : rte_free(cfg_ptr);
151 : : /* Close socket for shared interfaces */
152 [ # # ]: 0 : if (skfd >= 0) {
153 : 0 : close(skfd);
154 : 0 : skfd = -1;
155 : : }
156 : 0 : }
|