aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/bus/dpaa/base/fman/netcfg_layer.c
blob: 6b5224203a63e1316ac5b62354058e47e59e2b26 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
/* SPDX-License-Identifier: (BSD-3-Clause OR GPL-2.0)
 *
 * Copyright 2010-2016 Freescale Semiconductor Inc.
 * Copyright 2017 NXP
 *
 */
#include <inttypes.h>
#include <of.h>
#include <net/if.h>
#include <sys/ioctl.h>
#include <error.h>
#include <net/if_arp.h>
#include <assert.h>
#include <unistd.h>

#include <rte_malloc.h>

#include <rte_dpaa_logs.h>
#include <netcfg.h>

/* This data structure contaings all configurations information
 * related to usages of DPA devices.
 */
static struct netcfg_info *netcfg;
/* fd to open a socket for making ioctl request to disable/enable shared
 *  interfaces.
 */
static int skfd = -1;

#ifdef RTE_LIBRTE_DPAA_DEBUG_DRIVER
void
dump_netcfg(struct netcfg_info *cfg_ptr)
{
	int i;

	printf("..........  DPAA Configuration  ..........\n\n");

	/* Network interfaces */
	printf("Network interfaces: %d\n", cfg_ptr->num_ethports);
	for (i = 0; i < cfg_ptr->num_ethports; i++) {
		struct fman_if_bpool *bpool;
		struct fm_eth_port_cfg *p_cfg = &cfg_ptr->port_cfg[i];
		struct fman_if *__if = p_cfg->fman_if;

		printf("\n+ Fman %d, MAC %d (%s);\n",
		       __if->fman_idx, __if->mac_idx,
		       (__if->mac_type == fman_mac_1g) ? "1G" : "10G");

		printf("\tmac_addr: %02x:%02x:%02x:%02x:%02x:%02x\n",
		       (&__if->mac_addr)->addr_bytes[0],
		       (&__if->mac_addr)->addr_bytes[1],
		       (&__if->mac_addr)->addr_bytes[2],
		       (&__if->mac_addr)->addr_bytes[3],
		       (&__if->mac_addr)->addr_bytes[4],
		       (&__if->mac_addr)->addr_bytes[5]);

		printf("\ttx_channel_id: 0x%02x\n",
		       __if->tx_channel_id);

		printf("\tfqid_rx_def: 0x%x\n", p_cfg->rx_def);
		printf("\tfqid_rx_err: 0x%x\n", __if->fqid_rx_err);

		printf("\tfqid_tx_err: 0x%x\n", __if->fqid_tx_err);
		printf("\tfqid_tx_confirm: 0x%x\n", __if->fqid_tx_confirm);
		fman_if_for_each_bpool(bpool, __if)
			printf("\tbuffer pool: (bpid=%d, count=%"PRId64
			       " size=%"PRId64", addr=0x%"PRIx64")\n",
			       bpool->bpid, bpool->count, bpool->size,
			       bpool->addr);
	}
}
#endif /* RTE_LIBRTE_DPAA_DEBUG_DRIVER */

struct netcfg_info *
netcfg_acquire(void)
{
	struct fman_if *__if;
	int _errno, idx = 0;
	uint8_t num_ports = 0;
	uint8_t num_cfg_ports = 0;
	size_t size;

	/* Extract dpa configuration from fman driver and FMC configuration
	 * for command-line interfaces.
	 */

	/* Open a basic socket to enable/disable shared
	 * interfaces.
	 */
	skfd = socket(AF_PACKET, SOCK_RAW, 0);
	if (unlikely(skfd < 0)) {
		error(0, errno, "%s(): open(SOCK_RAW)", __func__);
		return NULL;
	}

	/* Initialise the Fman driver */
	_errno = fman_init();
	if (_errno) {
		DPAA_BUS_LOG(ERR, "FMAN driver init failed (%d)", errno);
		close(skfd);
		skfd = -1;
		return NULL;
	}

	/* Number of MAC ports */
	list_for_each_entry(__if, fman_if_list, node)
		num_ports++;

	if (!num_ports) {
		DPAA_BUS_LOG(ERR, "FMAN ports not available");
		return NULL;
	}
	/* Allocate space for all enabled mac ports */
	size = sizeof(*netcfg) +
		(num_ports * sizeof(struct fm_eth_port_cfg));

	netcfg = calloc(1, size);
	if (unlikely(netcfg == NULL)) {
		DPAA_BUS_LOG(ERR, "Unable to allocat mem for netcfg");
		goto error;
	}

	netcfg->num_ethports = num_ports;

	list_for_each_entry(__if, fman_if_list, node) {
		struct fm_eth_port_cfg *cfg = &netcfg->port_cfg[idx];
		/* Hook in the fman driver interface */
		cfg->fman_if = __if;
		cfg->rx_def = __if->fqid_rx_def;
		num_cfg_ports++;
		idx++;
	}

	if (!num_cfg_ports) {
		DPAA_BUS_LOG(ERR, "No FMAN ports found");
		goto error;
	} else if (num_ports != num_cfg_ports)
		netcfg->num_ethports = num_cfg_ports;

	return netcfg;

error:
	if (netcfg) {
		free(netcfg);
		netcfg = NULL;
	}

	return NULL;
}

void
netcfg_release(struct netcfg_info *cfg_ptr)
{
	free(cfg_ptr);
	/* Close socket for shared interfaces */
	if (skfd >= 0) {
		close(skfd);
		skfd = -1;
	}
}