1# SPDX-License-Identifier: BSD-3-Clause 2# Copyright 2018 6WIND S.A. 3# Copyright 2018 Mellanox Technologies, Ltd 4 5pmd_dlopen = get_option('enable_driver_mlx_glue') 6LIB_GLUE_BASE = 'librte_pmd_mlx5_glue.so' 7LIB_GLUE_VERSION = '18.11.0' 8LIB_GLUE = LIB_GLUE_BASE + '.' + LIB_GLUE_VERSION 9if pmd_dlopen 10 dpdk_conf.set('RTE_LIBRTE_MLX5_DLOPEN_DEPS', 1) 11 cflags += [ 12 '-DMLX5_GLUE="@0@"'.format(LIB_GLUE), 13 '-DMLX5_GLUE_VERSION="@0@"'.format(LIB_GLUE_VERSION), 14 ] 15endif 16libs = [ 17 cc.find_library('mnl', required:false), 18 cc.find_library('mlx5', required:false), 19 cc.find_library('ibverbs', required:false), 20] 21build = true 22foreach lib:libs 23 if not lib.found() 24 build = false 25 endif 26endforeach 27if build 28 allow_experimental_apis = true 29 ext_deps += libs 30 sources = files( 31 'mlx5.c', 32 'mlx5_ethdev.c', 33 'mlx5_flow.c', 34 'mlx5_flow_dv.c', 35 'mlx5_flow_tcf.c', 36 'mlx5_flow_verbs.c', 37 'mlx5_mac.c', 38 'mlx5_mr.c', 39 'mlx5_nl.c', 40 'mlx5_rss.c', 41 'mlx5_rxmode.c', 42 'mlx5_rxq.c', 43 'mlx5_rxtx.c', 44 'mlx5_socket.c', 45 'mlx5_stats.c', 46 'mlx5_trigger.c', 47 'mlx5_txq.c', 48 'mlx5_vlan.c', 49 ) 50 if dpdk_conf.has('RTE_ARCH_X86_64') or dpdk_conf.has('RTE_ARCH_ARM64') 51 sources += files('mlx5_rxtx_vec.c') 52 endif 53 if not pmd_dlopen 54 sources += files('mlx5_glue.c') 55 endif 56 cflags_options = [ 57 '-Wextra', 58 '-std=c11', 59 '-Wno-strict-prototypes', 60 '-D_BSD_SOURCE', 61 '-D_DEFAULT_SOURCE', 62 '-D_XOPEN_SOURCE=600' 63 ] 64 foreach option:cflags_options 65 if cc.has_argument(option) 66 cflags += option 67 endif 68 endforeach 69 if get_option('buildtype').contains('debug') 70 cflags += [ '-pedantic', '-UNDEBUG', '-DPEDANTIC' ] 71 else 72 cflags += [ '-DNDEBUG', '-UPEDANTIC' ] 73 endif 74 # To maintain the compatibility with the make build system 75 # mlx5_autoconf.h file is still generated. 76 # input array for meson member search: 77 # [ "MACRO to define if found", "header for the search", 78 # "symbol to search", "struct member to search" ] 79 has_member_args = [ 80 [ 'HAVE_IBV_MLX5_MOD_SWP', 'infiniband/mlx5dv.h', 81 'struct mlx5dv_sw_parsing_caps', 'sw_parsing_offloads' ], 82 [ 'HAVE_IBV_DEVICE_COUNTERS_SET_V42', 'infiniband/verbs.h', 83 'struct ibv_counter_set_init_attr', 'counter_set_id' ], 84 [ 'HAVE_IBV_DEVICE_COUNTERS_SET_V45', 'infiniband/verbs.h', 85 'struct ibv_counters_init_attr', 'comp_mask' ], 86 ] 87 # input array for meson symbol search: 88 # [ "MACRO to define if found", "header for the search", 89 # "symbol to search" ] 90 has_sym_args = [ 91 [ 'HAVE_IBV_DEVICE_STRIDING_RQ_SUPPORT', 'infiniband/mlx5dv.h', 92 'MLX5DV_CQE_RES_FORMAT_CSUM_STRIDX' ], 93 [ 'HAVE_IBV_DEVICE_TUNNEL_SUPPORT', 'infiniband/mlx5dv.h', 94 'MLX5DV_CONTEXT_MASK_TUNNEL_OFFLOADS' ], 95 [ 'HAVE_IBV_MLX5_MOD_MPW', 'infiniband/mlx5dv.h', 96 'MLX5DV_CONTEXT_FLAGS_MPW_ALLOWED' ], 97 [ 'HAVE_IBV_MLX5_MOD_CQE_128B_COMP', 'infiniband/mlx5dv.h', 98 'MLX5DV_CONTEXT_FLAGS_CQE_128B_COMP' ], 99 [ 'HAVE_IBV_MLX5_MOD_CQE_128B_PAD', 'infiniband/mlx5dv.h', 100 'MLX5DV_CQ_INIT_ATTR_FLAGS_CQE_PAD' ], 101 [ 'HAVE_IBV_FLOW_DV_SUPPORT', 'infiniband/mlx5dv.h', 102 'mlx5dv_create_flow_action_packet_reformat' ], 103 [ 'HAVE_IBV_DEVICE_MPLS_SUPPORT', 'infiniband/verbs.h', 104 'IBV_FLOW_SPEC_MPLS' ], 105 [ 'HAVE_IBV_WQ_FLAGS_PCI_WRITE_END_PADDING', 'infiniband/verbs.h', 106 'IBV_WQ_FLAGS_PCI_WRITE_END_PADDING' ], 107 [ 'HAVE_IBV_WQ_FLAG_RX_END_PADDING', 'infiniband/verbs.h', 108 'IBV_WQ_FLAG_RX_END_PADDING' ], 109 [ 'HAVE_SUPPORTED_40000baseKR4_Full', 'linux/ethtool.h', 110 'SUPPORTED_40000baseKR4_Full' ], 111 [ 'HAVE_SUPPORTED_40000baseCR4_Full', 'linux/ethtool.h', 112 'SUPPORTED_40000baseCR4_Full' ], 113 [ 'HAVE_SUPPORTED_40000baseSR4_Full', 'linux/ethtool.h', 114 'SUPPORTED_40000baseSR4_Full' ], 115 [ 'HAVE_SUPPORTED_40000baseLR4_Full', 'linux/ethtool.h', 116 'SUPPORTED_40000baseLR4_Full' ], 117 [ 'HAVE_SUPPORTED_56000baseKR4_Full', 'linux/ethtool.h', 118 'SUPPORTED_56000baseKR4_Full' ], 119 [ 'HAVE_SUPPORTED_56000baseCR4_Full', 'linux/ethtool.h', 120 'SUPPORTED_56000baseCR4_Full' ], 121 [ 'HAVE_SUPPORTED_56000baseSR4_Full', 'linux/ethtool.h', 122 'SUPPORTED_56000baseSR4_Full' ], 123 [ 'HAVE_SUPPORTED_56000baseLR4_Full', 'linux/ethtool.h', 124 'SUPPORTED_56000baseLR4_Full' ], 125 [ 'HAVE_ETHTOOL_LINK_MODE_25G', 'linux/ethtool.h', 126 'ETHTOOL_LINK_MODE_25000baseCR_Full_BIT' ], 127 [ 'HAVE_ETHTOOL_LINK_MODE_50G', 'linux/ethtool.h', 128 'ETHTOOL_LINK_MODE_50000baseCR2_Full_BIT' ], 129 [ 'HAVE_ETHTOOL_LINK_MODE_100G', 'linux/ethtool.h', 130 'ETHTOOL_LINK_MODE_100000baseKR4_Full_BIT' ], 131 [ 'HAVE_IFLA_PHYS_SWITCH_ID', 'linux/if_link.h', 132 'IFLA_PHYS_SWITCH_ID' ], 133 [ 'HAVE_IFLA_PHYS_PORT_NAME', 'linux/if_link.h', 134 'IFLA_PHYS_PORT_NAME' ], 135 [ 'HAVE_IFLA_VXLAN_COLLECT_METADATA', 'linux/if_link.h', 136 'IFLA_VXLAN_COLLECT_METADATA' ], 137 [ 'HAVE_TCA_CHAIN', 'linux/rtnetlink.h', 138 'TCA_CHAIN' ], 139 [ 'HAVE_TCA_FLOWER_ACT', 'linux/pkt_cls.h', 140 'TCA_FLOWER_ACT' ], 141 [ 'HAVE_TCA_FLOWER_FLAGS', 'linux/pkt_cls.h', 142 'TCA_FLOWER_FLAGS' ], 143 [ 'HAVE_TCA_FLOWER_KEY_ETH_TYPE', 'linux/pkt_cls.h', 144 'TCA_FLOWER_KEY_ETH_TYPE' ], 145 [ 'HAVE_TCA_FLOWER_KEY_ETH_DST', 'linux/pkt_cls.h', 146 'TCA_FLOWER_KEY_ETH_DST' ], 147 [ 'HAVE_TCA_FLOWER_KEY_ETH_DST_MASK', 'linux/pkt_cls.h', 148 'TCA_FLOWER_KEY_ETH_DST_MASK' ], 149 [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC', 'linux/pkt_cls.h', 150 'TCA_FLOWER_KEY_ETH_SRC' ], 151 [ 'HAVE_TCA_FLOWER_KEY_ETH_SRC_MASK', 'linux/pkt_cls.h', 152 'TCA_FLOWER_KEY_ETH_SRC_MASK' ], 153 [ 'HAVE_TCA_FLOWER_KEY_IP_PROTO', 'linux/pkt_cls.h', 154 'TCA_FLOWER_KEY_IP_PROTO' ], 155 [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC', 'linux/pkt_cls.h', 156 'TCA_FLOWER_KEY_IPV4_SRC' ], 157 [ 'HAVE_TCA_FLOWER_KEY_IPV4_SRC_MASK', 'linux/pkt_cls.h', 158 'TCA_FLOWER_KEY_IPV4_SRC_MASK' ], 159 [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST', 'linux/pkt_cls.h', 160 'TCA_FLOWER_KEY_IPV4_DST' ], 161 [ 'HAVE_TCA_FLOWER_KEY_IPV4_DST_MASK', 'linux/pkt_cls.h', 162 'TCA_FLOWER_KEY_IPV4_DST_MASK' ], 163 [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC', 'linux/pkt_cls.h', 164 'TCA_FLOWER_KEY_IPV6_SRC' ], 165 [ 'HAVE_TCA_FLOWER_KEY_IPV6_SRC_MASK', 'linux/pkt_cls.h', 166 'TCA_FLOWER_KEY_IPV6_SRC_MASK' ], 167 [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST', 'linux/pkt_cls.h', 168 'TCA_FLOWER_KEY_IPV6_DST' ], 169 [ 'HAVE_TCA_FLOWER_KEY_IPV6_DST_MASK', 'linux/pkt_cls.h', 170 'TCA_FLOWER_KEY_IPV6_DST_MASK' ], 171 [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC', 'linux/pkt_cls.h', 172 'TCA_FLOWER_KEY_TCP_SRC' ], 173 [ 'HAVE_TCA_FLOWER_KEY_TCP_SRC_MASK', 'linux/pkt_cls.h', 174 'TCA_FLOWER_KEY_TCP_SRC_MASK' ], 175 [ 'HAVE_TCA_FLOWER_KEY_TCP_DST', 'linux/pkt_cls.h', 176 'TCA_FLOWER_KEY_TCP_DST' ], 177 [ 'HAVE_TCA_FLOWER_KEY_TCP_DST_MASK', 'linux/pkt_cls.h', 178 'TCA_FLOWER_KEY_TCP_DST_MASK' ], 179 [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC', 'linux/pkt_cls.h', 180 'TCA_FLOWER_KEY_UDP_SRC' ], 181 [ 'HAVE_TCA_FLOWER_KEY_UDP_SRC_MASK', 'linux/pkt_cls.h', 182 'TCA_FLOWER_KEY_UDP_SRC_MASK' ], 183 [ 'HAVE_TCA_FLOWER_KEY_UDP_DST', 'linux/pkt_cls.h', 184 'TCA_FLOWER_KEY_UDP_DST' ], 185 [ 'HAVE_TCA_FLOWER_KEY_UDP_DST_MASK', 'linux/pkt_cls.h', 186 'TCA_FLOWER_KEY_UDP_DST_MASK' ], 187 [ 'HAVE_TCA_FLOWER_KEY_VLAN_ID', 'linux/pkt_cls.h', 188 'TCA_FLOWER_KEY_VLAN_ID' ], 189 [ 'HAVE_TCA_FLOWER_KEY_VLAN_PRIO', 'linux/pkt_cls.h', 190 'TCA_FLOWER_KEY_VLAN_PRIO' ], 191 [ 'HAVE_TCA_FLOWER_KEY_VLAN_ETH_TYPE', 'linux/pkt_cls.h', 192 'TCA_FLOWER_KEY_VLAN_ETH_TYPE' ], 193 [ 'HAVE_TCA_FLOWER_KEY_TCP_FLAGS', 'linux/pkt_cls.h', 194 'TCA_FLOWER_KEY_TCP_FLAGS' ], 195 [ 'HAVE_TCA_FLOWER_KEY_TCP_FLAGS_MASK', 'linux/pkt_cls.h', 196 'TCA_FLOWER_KEY_TCP_FLAGS_MASK' ], 197 [ 'HAVE_TC_ACT_GOTO_CHAIN', 'linux/pkt_cls.h', 198 'TC_ACT_GOTO_CHAIN' ], 199 [ 'HAVE_TC_ACT_VLAN', 'linux/tc_act/tc_vlan.h', 200 'TCA_VLAN_PUSH_VLAN_PRIORITY' ], 201 [ 'HAVE_TCA_FLOWER_KEY_ENC_KEY_ID', 'linux/pkt_cls.h', 202 'TCA_FLOWER_KEY_ENC_KEY_ID' ], 203 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV4_SRC', 'linux/pkt_cls.h', 204 'TCA_FLOWER_KEY_ENC_IPV4_SRC' ], 205 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK', 'linux/pkt_cls.h', 206 'TCA_FLOWER_KEY_ENC_IPV4_SRC_MASK' ], 207 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV4_DST', 'linux/pkt_cls.h', 208 'TCA_FLOWER_KEY_ENC_IPV4_DST' ], 209 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV4_DST_MASK', 'linux/pkt_cls.h', 210 'TCA_FLOWER_KEY_ENC_IPV4_DST_MASK' ], 211 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV6_SRC', 'linux/pkt_cls.h', 212 'TCA_FLOWER_KEY_ENC_IPV6_SRC' ], 213 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK', 'linux/pkt_cls.h', 214 'TCA_FLOWER_KEY_ENC_IPV6_SRC_MASK' ], 215 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV6_DST', 'linux/pkt_cls.h', 216 'TCA_FLOWER_KEY_ENC_IPV6_DST' ], 217 [ 'HAVE_TCA_FLOWER_KEY_ENC_IPV6_DST_MASK', 'linux/pkt_cls.h', 218 'TCA_FLOWER_KEY_ENC_IPV6_DST_MASK' ], 219 [ 'HAVE_TCA_FLOWER_KEY_ENC_UDP_SRC_PORT', 'linux/pkt_cls.h', 220 'TCA_FLOWER_KEY_ENC_UDP_SRC_PORT' ], 221 [ 'HAVE_TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK', 'linux/pkt_cls.h', 222 'TCA_FLOWER_KEY_ENC_UDP_SRC_PORT_MASK' ], 223 [ 'HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT', 'linux/pkt_cls.h', 224 'TCA_FLOWER_KEY_ENC_UDP_DST_PORT' ], 225 [ 'HAVE_TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK', 'linux/pkt_cls.h', 226 'TCA_FLOWER_KEY_ENC_UDP_DST_PORT_MASK' ], 227 [ 'HAVE_TC_ACT_TUNNEL_KEY', 'linux/tc_act/tc_tunnel_key.h', 228 'TCA_ACT_TUNNEL_KEY' ], 229 [ 'HAVE_TCA_TUNNEL_KEY_ENC_DST_PORT', 'linux/tc_act/tc_tunnel_key.h', 230 'TCA_TUNNEL_KEY_ENC_DST_PORT' ], 231 [ 'HAVE_TCA_TUNNEL_KEY_NO_CSUM', 'linux/tc_act/tc_tunnel_key.h', 232 'TCA_TUNNEL_KEY_NO_CSUM' ], 233 [ 'HAVE_TC_ACT_PEDIT', 'linux/tc_act/tc_pedit.h', 234 'TCA_PEDIT_KEY_EX_HDR_TYPE_UDP' ], 235 [ 'HAVE_RDMA_NL_NLDEV', 'rdma/rdma_netlink.h', 236 'RDMA_NL_NLDEV' ], 237 [ 'HAVE_RDMA_NLDEV_CMD_GET', 'rdma/rdma_netlink.h', 238 'RDMA_NLDEV_CMD_GET' ], 239 [ 'HAVE_RDMA_NLDEV_CMD_PORT_GET', 'rdma/rdma_netlink.h', 240 'RDMA_NLDEV_CMD_PORT_GET' ], 241 [ 'HAVE_RDMA_NLDEV_ATTR_DEV_INDEX', 'rdma/rdma_netlink.h', 242 'RDMA_NLDEV_ATTR_DEV_INDEX' ], 243 [ 'HAVE_RDMA_NLDEV_ATTR_DEV_NAME', 'rdma/rdma_netlink.h', 244 'RDMA_NLDEV_ATTR_DEV_NAME' ], 245 [ 'HAVE_RDMA_NLDEV_ATTR_PORT_INDEX', 'rdma/rdma_netlink.h', 246 'RDMA_NLDEV_ATTR_PORT_INDEX' ], 247 [ 'HAVE_RDMA_NLDEV_ATTR_NDEV_INDEX', 'rdma/rdma_netlink.h', 248 'RDMA_NLDEV_ATTR_NDEV_INDEX' ], 249 ] 250 config = configuration_data() 251 foreach arg:has_sym_args 252 config.set(arg[0], cc.has_header_symbol(arg[1], arg[2])) 253 endforeach 254 foreach arg:has_member_args 255 file_prefix = '#include<' + arg[1] + '>' 256 config.set(arg[0], cc.has_member(arg[2], arg[3], 257 prefix : file_prefix)) 258 endforeach 259 configure_file(output : 'mlx5_autoconf.h', configuration : config) 260endif 261# Build Glue Library 262if pmd_dlopen and build 263 dlopen_name = 'mlx5_glue' 264 dlopen_lib_name = driver_name_fmt.format(dlopen_name) 265 dlopen_so_version = LIB_GLUE_VERSION 266 dlopen_sources = files('mlx5_glue.c') 267 dlopen_install_dir = [ eal_pmd_path + '-glue' ] 268 shared_lib = shared_library( 269 dlopen_lib_name, 270 dlopen_sources, 271 include_directories: global_inc, 272 c_args: cflags, 273 dependencies: libs, 274 link_args: [ 275 '-Wl,-export-dynamic', 276 '-Wl,-h,@0@'.format(LIB_GLUE), 277 ], 278 soversion: dlopen_so_version, 279 install: true, 280 install_dir: dlopen_install_dir, 281 ) 282endif 283