f-stack/dpdk/config/riscv/meson.build

129 lines
3.6 KiB
Meson

# SPDX-License-Identifier: BSD-3-Clause
# Copyright(c) 2017 Intel Corporation.
# Copyright(c) 2017 Cavium, Inc
# Copyright(c) 2021 PANTHEON.tech s.r.o.
# Copyright(c) 2022 StarFive
# Copyright(c) 2022 SiFive
# Copyright(c) 2022 Semihalf
if not is_linux
error('Only Linux is supported at this point in time.')
endif
if not dpdk_conf.get('RTE_ARCH_64')
error('Only 64-bit compiles are supported for this platform type')
endif
dpdk_conf.set('RTE_ARCH', 'riscv')
dpdk_conf.set('RTE_ARCH_RISCV', 1)
dpdk_conf.set('RTE_FORCE_INTRINSICS', 1)
# common flags to all riscv builds, with lowest priority
flags_common = [
['RTE_ARCH_RISCV', true],
['RTE_CACHE_LINE_SIZE', 64],
# Manually set wall time clock frequency for the target. If 0, then it is
# read from /proc/device-tree/cpus/timebase-frequency. This property is
# guaranteed on Linux, as riscv time_init() requires it.
['RTE_RISCV_TIME_FREQ', 0],
]
## SoC-specific options.
# The priority is like this: arch > vendor > common.
#
# Note that currently there's no way of getting vendor/microarchitecture id
# values in userspace which is why the logic of choosing the right flag
# combination is strictly based on the values passed from a cross-file.
vendor_generic = {
'description': 'Generic RISC-V',
'flags': [
['RTE_MACHINE', '"riscv"'],
['RTE_USE_C11_MEM_MODEL', true],
['RTE_MAX_LCORE', 128],
['RTE_MAX_NUMA_NODES', 2]
],
'arch_config': {
'generic': {'machine_args': ['-march=rv64gc']}
}
}
arch_config_riscv = {
'0x8000000000000007': {
'machine_args': ['-march=rv64gc', '-mtune=sifive-7-series'],
'flags': []
},
}
vendor_sifive = {
'description': 'SiFive',
'flags': [
['RTE_MACHINE', '"riscv"'],
['RTE_USE_C11_MEM_MODEL', true],
['RTE_MAX_LCORE', 4],
['RTE_MAX_NUMA_NODES', 1],
],
'arch_config': arch_config_riscv
}
vendors = {
'generic': vendor_generic,
'0x489': vendor_sifive
}
# Native/cross vendor/arch detection
if not meson.is_cross_build()
if machine == 'default'
# default build
vendor_id = 'generic'
arch_id = 'generic'
message('generic RISC-V')
else
vendor_id = 'generic'
arch_id = 'generic'
warning('RISC-V arch discovery not available, using generic!')
endif
else
# cross build
vendor_id = meson.get_cross_property('vendor_id')
arch_id = meson.get_cross_property('arch_id')
endif
if not vendors.has_key(vendor_id)
error('Unsupported RISC-V vendor: @0@. '.format(vendor_id) +
'Please add support for it or use the generic ' +
'(-Dmachine=generic) build.')
endif
vendor_config = vendors[vendor_id]
message('RISC-V vendor: ' + vendor_config['description'])
message('RISC-V architecture id: ' + arch_id)
arch_config = vendor_config['arch_config']
if not arch_config.has_key(arch_id)
# unknown micro-architecture id
error('Unsupported architecture @0@ of vendor @1@. '
.format(arch_id, vendor_id) +
'Please add support for it or use the generic ' +
'(-Dmachine=generic) build.')
endif
arch_config = arch_config[arch_id]
# Concatenate flags respecting priorities.
dpdk_flags = flags_common + vendor_config['flags'] + arch_config.get('flags', [])
# apply supported machine args
machine_args = [] # Clear previous machine args
foreach flag: arch_config['machine_args']
if cc.has_argument(flag)
machine_args += flag
endif
endforeach
# apply flags
foreach flag: dpdk_flags
if flag.length() > 0
dpdk_conf.set(flag[0], flag[1])
endif
endforeach
message('Using machine args: @0@'.format(machine_args))