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: %02x:%02x:%02x:%02x:%02x:%02x\n", 51 (&__if->mac_addr)->addr_bytes[0], 52 (&__if->mac_addr)->addr_bytes[1], 53 (&__if->mac_addr)->addr_bytes[2], 54 (&__if->mac_addr)->addr_bytes[3], 55 (&__if->mac_addr)->addr_bytes[4], 56 (&__if->mac_addr)->addr_bytes[5]); 57 58 printf("\ttx_channel_id: 0x%02x\n", 59 __if->tx_channel_id); 60 61 printf("\tfqid_rx_def: 0x%x\n", p_cfg->rx_def); 62 printf("\tfqid_rx_err: 0x%x\n", __if->fqid_rx_err); 63 64 printf("\tfqid_tx_err: 0x%x\n", __if->fqid_tx_err); 65 printf("\tfqid_tx_confirm: 0x%x\n", __if->fqid_tx_confirm); 66 fman_if_for_each_bpool(bpool, __if) 67 printf("\tbuffer pool: (bpid=%d, count=%"PRId64 68 " size=%"PRId64", addr=0x%"PRIx64")\n", 69 bpool->bpid, bpool->count, bpool->size, 70 bpool->addr); 71 } 72 } 73 #endif /* RTE_LIBRTE_DPAA_DEBUG_DRIVER */ 74 75 struct netcfg_info * 76 netcfg_acquire(void) 77 { 78 struct fman_if *__if; 79 int _errno, idx = 0; 80 uint8_t num_ports = 0; 81 uint8_t num_cfg_ports = 0; 82 size_t size; 83 84 /* Extract dpa configuration from fman driver and FMC configuration 85 * for command-line interfaces. 86 */ 87 88 /* Open a basic socket to enable/disable shared 89 * interfaces. 90 */ 91 skfd = socket(AF_PACKET, SOCK_RAW, 0); 92 if (unlikely(skfd < 0)) { 93 err(0, "%s(): open(SOCK_RAW)", __func__); 94 return NULL; 95 } 96 97 /* Initialise the Fman driver */ 98 _errno = fman_init(); 99 if (_errno) { 100 DPAA_BUS_LOG(ERR, "FMAN driver init failed (%d)", errno); 101 close(skfd); 102 skfd = -1; 103 return NULL; 104 } 105 106 /* Number of MAC ports */ 107 list_for_each_entry(__if, fman_if_list, node) 108 num_ports++; 109 110 if (!num_ports) { 111 DPAA_BUS_LOG(ERR, "FMAN ports not available"); 112 return NULL; 113 } 114 /* Allocate space for all enabled mac ports */ 115 size = sizeof(*netcfg) + 116 (num_ports * sizeof(struct fm_eth_port_cfg)); 117 118 netcfg = rte_calloc(NULL, 1, size, 0); 119 if (unlikely(netcfg == NULL)) { 120 DPAA_BUS_LOG(ERR, "Unable to allocat mem for netcfg"); 121 goto error; 122 } 123 124 netcfg->num_ethports = num_ports; 125 126 list_for_each_entry(__if, fman_if_list, node) { 127 struct fm_eth_port_cfg *cfg = &netcfg->port_cfg[idx]; 128 /* Hook in the fman driver interface */ 129 cfg->fman_if = __if; 130 cfg->rx_def = __if->fqid_rx_def; 131 num_cfg_ports++; 132 idx++; 133 } 134 135 if (!num_cfg_ports) { 136 DPAA_BUS_LOG(ERR, "No FMAN ports found"); 137 goto error; 138 } else if (num_ports != num_cfg_ports) 139 netcfg->num_ethports = num_cfg_ports; 140 141 return netcfg; 142 143 error: 144 if (netcfg) { 145 rte_free(netcfg); 146 netcfg = NULL; 147 } 148 149 return NULL; 150 } 151 152 void 153 netcfg_release(struct netcfg_info *cfg_ptr) 154 { 155 rte_free(cfg_ptr); 156 /* Close socket for shared interfaces */ 157 if (skfd >= 0) { 158 close(skfd); 159 skfd = -1; 160 } 161 } 162