From: Heinrich Schuchardt <heinrich.schuchardt@canonical.com>
To: Stanislaw Kardach <kda@semihalf.com>,
Thomas Monjalon <thomas@monjalon.net>
Cc: Michal Mazurek <maz@semihalf.com>,
dev@dpdk.org, Frank Zhao <Frank.Zhao@starfivetech.com>,
Sam Grove <sam.grove@sifive.com>,
mw@semihalf.com, upstream@semihalf.com
Subject: Re: [PATCH v3 1/8] eal: add initial support for RISC-V architecture
Date: Fri, 13 May 2022 08:50:34 +0200 [thread overview]
Message-ID: <7bc97240-10c7-c437-9f31-b97dc2b418c6@canonical.com> (raw)
In-Reply-To: <20220510154849.530872-2-kda@semihalf.com>
On 5/10/22 17:48, Stanislaw Kardach wrote:
> From: Michal Mazurek <maz@semihalf.com>
>
> Add all necessary elements for DPDK to compile and run EAL on SiFive
> Freedom U740 SoC which is based on SiFive U74-MC (ISA: rv64imafdc)
> core complex.
>
> This includes:
>
> - EAL library implementation for rv64imafdc ISA.
> - meson build structure for 'riscv' architecture. RTE_ARCH_RISCV define
> is added for architecture identification.
> - xmm_t structure operation stubs as there is no vector support in the
> U74 core.
>
> Compilation was tested on Ubuntu and Arch Linux using riscv64 toolchain.
> Clang compilation currently not supported due to issues with missing
> relocation relaxation.
>
> Two rte_rdtsc() schemes are provided: stable low-resolution using rdtime
> (default) and unstable high-resolution using rdcycle. User can override
> the scheme by defining RTE_RISCV_RDTSC_USE_HPM=1 during compile time of
> both DPDK and the application. The reasoning for this is as follows.
> The RISC-V ISA mandates that clock read by rdtime has to be of constant
> period and synchronized between all hardware threads within 1 tick
> (chapter 10.1 in version 20191213 of RISC-V spec).
> However this clock may not be of high-enough frequency for dataplane
> uses. I.e. on HiFive Unmatched (FU740) it is 1MHz.
> There is a high-resolution alternative in form of rdcycle which is
> clocked at the core clock frequency. The drawbacks are that it may be
> disabled during sleep (WFI) and its frequency might change due to DVFS.
>
> The platform is currently marked as linux-only because rte_cycles
> implementation uses the timebase-frequency device-tree node read through
> the proc file system. Such approach was chosen because Linux kernel
> depends on the presence of this device-tree node.
>
> The i40e PMD driver is disabled on RISC-V as the rv64gc ISA has no vector
> operations.
>
> The compilation of following modules has been disabled by this commit
> and will be re-enabled in later commits as fixes are introduced:
> net/ixgbe, net/memif, net/tap, example/l3fwd.
>
> Known checkpatch errors/warnings:
>
> - ERROR:COMPLEX_MACRO in rte_atomic.h and rte_cycles.h due to inline
> assembly declarations.
> - vector_size compiler attribute used in rte_vect.h directly.
> - rte_*mb() used directly in rte_atomic.h to reduce code duplication.
> - __atomic_thread_fence() used to implement rte_atomic_thread_fence().
>
> Sponsored-by: Frank Zhao <Frank.Zhao@starfivetech.com>
> Sponsored-by: Sam Grove <sam.grove@sifive.com>
> Signed-off-by: Michal Mazurek <maz@semihalf.com>
> Signed-off-by: Stanislaw Kardach <kda@semihalf.com>
> ---
> Depends-on: series-22867 ("test/ring: remove excessive inlining")
> Depends-on: series-22868 ("lpm: add a scalar version of lookupx4 function")
> Depends-on: series-22869 ("examples/l3fwd: fix scalar LPM compilation")
> ---
> MAINTAINERS | 6 +
> app/test/test_xmmt_ops.h | 16 ++
> config/meson.build | 2 +
> config/riscv/meson.build | 143 ++++++++++++++++++
> config/riscv/riscv64_linux_gcc | 17 +++
> config/riscv/riscv64_sifive_u740_linux_gcc | 19 +++
> doc/guides/contributing/design.rst | 2 +-
> .../linux_gsg/cross_build_dpdk_for_riscv.rst | 125 +++++++++++++++
> doc/guides/linux_gsg/index.rst | 1 +
> doc/guides/nics/features.rst | 5 +
> doc/guides/nics/features/default.ini | 1 +
> doc/guides/rel_notes/release_22_07.rst | 8 +
> drivers/net/i40e/meson.build | 6 +
> drivers/net/ixgbe/meson.build | 6 +
> drivers/net/memif/meson.build | 5 +
> drivers/net/tap/meson.build | 5 +
> examples/l3fwd/meson.build | 6 +
> lib/eal/riscv/include/meson.build | 23 +++
> lib/eal/riscv/include/rte_atomic.h | 52 +++++++
> lib/eal/riscv/include/rte_byteorder.h | 44 ++++++
> lib/eal/riscv/include/rte_cpuflags.h | 55 +++++++
> lib/eal/riscv/include/rte_cycles.h | 105 +++++++++++++
> lib/eal/riscv/include/rte_io.h | 21 +++
> lib/eal/riscv/include/rte_mcslock.h | 18 +++
> lib/eal/riscv/include/rte_memcpy.h | 63 ++++++++
> lib/eal/riscv/include/rte_pause.h | 31 ++++
> lib/eal/riscv/include/rte_pflock.h | 17 +++
> lib/eal/riscv/include/rte_power_intrinsics.h | 22 +++
> lib/eal/riscv/include/rte_prefetch.h | 50 ++++++
> lib/eal/riscv/include/rte_rwlock.h | 44 ++++++
> lib/eal/riscv/include/rte_spinlock.h | 67 ++++++++
> lib/eal/riscv/include/rte_ticketlock.h | 21 +++
> lib/eal/riscv/include/rte_vect.h | 55 +++++++
> lib/eal/riscv/meson.build | 11 ++
> lib/eal/riscv/rte_cpuflags.c | 122 +++++++++++++++
> lib/eal/riscv/rte_cycles.c | 77 ++++++++++
> lib/eal/riscv/rte_hypervisor.c | 13 ++
> lib/eal/riscv/rte_power_intrinsics.c | 56 +++++++
> meson.build | 2 +
> 39 files changed, 1341 insertions(+), 1 deletion(-)
> create mode 100644 config/riscv/meson.build
> create mode 100644 config/riscv/riscv64_linux_gcc
> create mode 100644 config/riscv/riscv64_sifive_u740_linux_gcc
> create mode 100644 doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
> create mode 100644 lib/eal/riscv/include/meson.build
> create mode 100644 lib/eal/riscv/include/rte_atomic.h
> create mode 100644 lib/eal/riscv/include/rte_byteorder.h
> create mode 100644 lib/eal/riscv/include/rte_cpuflags.h
> create mode 100644 lib/eal/riscv/include/rte_cycles.h
> create mode 100644 lib/eal/riscv/include/rte_io.h
> create mode 100644 lib/eal/riscv/include/rte_mcslock.h
> create mode 100644 lib/eal/riscv/include/rte_memcpy.h
> create mode 100644 lib/eal/riscv/include/rte_pause.h
> create mode 100644 lib/eal/riscv/include/rte_pflock.h
> create mode 100644 lib/eal/riscv/include/rte_power_intrinsics.h
> create mode 100644 lib/eal/riscv/include/rte_prefetch.h
> create mode 100644 lib/eal/riscv/include/rte_rwlock.h
> create mode 100644 lib/eal/riscv/include/rte_spinlock.h
> create mode 100644 lib/eal/riscv/include/rte_ticketlock.h
> create mode 100644 lib/eal/riscv/include/rte_vect.h
> create mode 100644 lib/eal/riscv/meson.build
> create mode 100644 lib/eal/riscv/rte_cpuflags.c
> create mode 100644 lib/eal/riscv/rte_cycles.c
> create mode 100644 lib/eal/riscv/rte_hypervisor.c
> create mode 100644 lib/eal/riscv/rte_power_intrinsics.c
>
> diff --git a/MAINTAINERS b/MAINTAINERS
> index 8f4e9c3479..7fb6dccc41 100644
> --- a/MAINTAINERS
> +++ b/MAINTAINERS
> @@ -296,6 +296,12 @@ F: drivers/*/*/*_altivec.*
> F: app/*/*_altivec.*
> F: examples/*/*_altivec.*
>
> +RISC-V
> +M: Stanislaw Kardach <kda@semihalf.com>
> +F: config/riscv/
> +F: doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
> +F: lib/eal/riscv/
> +
> Intel x86
> M: Bruce Richardson <bruce.richardson@intel.com>
> M: Konstantin Ananyev <konstantin.v.ananyev@yandex.ru>
> diff --git a/app/test/test_xmmt_ops.h b/app/test/test_xmmt_ops.h
> index 3a82d5ecac..55f256599e 100644
> --- a/app/test/test_xmmt_ops.h
> +++ b/app/test/test_xmmt_ops.h
> @@ -1,5 +1,8 @@
> /* SPDX-License-Identifier: BSD-3-Clause
> * Copyright(c) 2015 Cavium, Inc
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> */
>
> #ifndef _TEST_XMMT_OPS_H_
> @@ -49,6 +52,19 @@ vect_set_epi32(int i3, int i2, int i1, int i0)
> return data;
> }
>
> +#elif defined(RTE_ARCH_RISCV)
> +
> +#define vect_loadu_sil128(p) vect_load_128(p)
> +
> +/* sets the 4 signed 32-bit integer values and returns the xmm_t variable */
> +static __rte_always_inline xmm_t
> +vect_set_epi32(int i3, int i2, int i1, int i0)
> +{
> + xmm_t data = (xmm_t){i0, i1, i2, i3};
> +
> + return data;
> +}
> +
> #endif
>
> #endif /* _TEST_XMMT_OPS_H_ */
> diff --git a/config/meson.build b/config/meson.build
> index 7134e80e8d..7f7b6c92fd 100644
> --- a/config/meson.build
> +++ b/config/meson.build
> @@ -121,6 +121,8 @@ if cpu_instruction_set == 'generic'
> cpu_instruction_set = 'generic'
> elif host_machine.cpu_family().startswith('ppc')
> cpu_instruction_set = 'power8'
> + elif host_machine.cpu_family().startswith('riscv')
> + cpu_instruction_set = 'riscv'
> endif
> endif
>
> diff --git a/config/riscv/meson.build b/config/riscv/meson.build
> new file mode 100644
> index 0000000000..0c16c31fc2
> --- /dev/null
> +++ b/config/riscv/meson.build
> @@ -0,0 +1,143 @@
> +# 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],
> + # Set this to true if target emulates U-mode TIME CSR via M or S mode trap.
> + # This allows to remove a FENCE on rte_rdtsc_precise() as trap effectively
> + # acts as one.
> + ['RTE_RISCV_EMU_UTIME', false],
> + # Set this to true if target emulates U-mode CYCLE CSR via M or S mode trap.
> + # This allows to remove a FENCE on rte_rdtsc_precise() as trap effectively
> + # acts as one.
> + ['RTE_RISCV_EMU_UCYCLE', false],
> + # 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': [
> + ['RTE_RISCV_EMU_UTIME', true],
> + ['RTE_RISCV_EMU_UCYCLE', true]
> + ]
> + },
> +}
> +
> +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 vendors.has_key(vendor_id)
> + vendor_config = vendors[vendor_id]
> +else
> + error('Unsupported RISC-V vendor: @0@. '.format(vendor_id) +
> + 'Please add support for it or use the generic ' +
> + '(-Dmachine=generic) build.')
> +endif
> +
> +message('RISC-V vendor: ' + vendor_config['description'])
> +message('RISC-V architecture id: ' + arch_id)
> +
> +arch_config = vendor_config['arch_config']
> +if arch_config.has_key(arch_id)
> + # use the specified arch_id machine args if found
> + arch_config = arch_config[arch_id]
> +else
> + # 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
> +
> +# 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))
> +
> diff --git a/config/riscv/riscv64_linux_gcc b/config/riscv/riscv64_linux_gcc
> new file mode 100644
> index 0000000000..04248d7ecb
> --- /dev/null
> +++ b/config/riscv/riscv64_linux_gcc
> @@ -0,0 +1,17 @@
> +[binaries]
> +c = 'riscv64-linux-gnu-gcc'
> +cpp = 'riscv64-linux-gnu-g++'
> +ar = 'riscv64-linux-gnu-ar'
> +strip = 'riscv64-linux-gnu-strip'
> +pcap-config = ''
> +pkgconfig = 'riscv64-linux-gnu-pkg-config'
> +
> +[host_machine]
> +system = 'linux'
> +cpu_family = 'riscv64'
> +cpu = 'rv64gc'
> +endian = 'little'
> +
> +[properties]
> +vendor_id = 'generic'
> +arch_id = 'generic'
> diff --git a/config/riscv/riscv64_sifive_u740_linux_gcc b/config/riscv/riscv64_sifive_u740_linux_gcc
> new file mode 100644
> index 0000000000..7b5ad2562d
> --- /dev/null
> +++ b/config/riscv/riscv64_sifive_u740_linux_gcc
> @@ -0,0 +1,19 @@
> +[binaries]
> +c = 'riscv64-unknown-linux-gnu-gcc'
> +cpp = 'riscv64-unknown-linux-gnu-g++'
> +ar = 'riscv64-unknown-linux-gnu-ar'
> +strip = 'riscv64-unknown-linux-gnu-strip'
> +pcap-config = ''
> +pkgconfig = 'riscv64-unknown-linux-gnu-pkg-config'
> +
> +[host_machine]
> +system = 'linux'
> +cpu_family = 'riscv64'
> +cpu = 'rv64gc'
> +endian = 'little'
> +
> +[properties]
> +vendor_id = '0x489'
> +arch_id = '0x8000000000000007'
> +max_lcores = 4
> +max_numa_nodes = 1
> diff --git a/doc/guides/contributing/design.rst b/doc/guides/contributing/design.rst
> index d5ca8b4d9c..0383afe5c8 100644
> --- a/doc/guides/contributing/design.rst
> +++ b/doc/guides/contributing/design.rst
> @@ -42,7 +42,7 @@ Per Architecture Sources
> The following macro options can be used:
>
> * ``RTE_ARCH`` is a string that contains the name of the architecture.
> -* ``RTE_ARCH_I686``, ``RTE_ARCH_X86_64``, ``RTE_ARCH_X86_X32``, ``RTE_ARCH_PPC_64``, ``RTE_ARCH_ARM``, ``RTE_ARCH_ARMv7`` or ``RTE_ARCH_ARM64`` are defined only if we are building for those architectures.
> +* ``RTE_ARCH_I686``, ``RTE_ARCH_X86_64``, ``RTE_ARCH_X86_X32``, ``RTE_ARCH_PPC_64``, ``RTE_ARCH_RISCV``, ``RTE_ARCH_ARM``, ``RTE_ARCH_ARMv7`` or ``RTE_ARCH_ARM64`` are defined only if we are building for those architectures.
>
> Per Execution Environment Sources
> ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> diff --git a/doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst b/doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
> new file mode 100644
> index 0000000000..9907b35a1d
> --- /dev/null
> +++ b/doc/guides/linux_gsg/cross_build_dpdk_for_riscv.rst
> @@ -0,0 +1,125 @@
> +.. SPDX-License-Identifier: BSD-3-Clause
> + Copyright(c) 2020 ARM Corporation.
> + Copyright(c) 2022 StarFive
> + Copyright(c) 2022 SiFive
> + Copyright(c) 2022 Semihalf
> +
> +Cross compiling DPDK for RISC-V
> +===============================
> +
> +This chapter describes how to cross compile DPDK for RISC-V from x86 build
> +hosts.
> +
> +.. note::
> +
> + While it's possible to compile DPDK natively on a RISC-V host, it is
> + currently recommended to cross-compile as Linux kernel does not offer any
> + way for userspace to discover the vendor and architecture identifiers of the
> + CPU and therefore any per-chip optimization options have to be chosen via
> + a cross-file or ``c_args``.
> +
> +
> +Prerequisites
> +-------------
> +
> +
> +Linux kernel
> +~~~~~~~~~~~~
> +
> +It is recommended to use Linux kernel built from
> +`SiFive Freedom Unleashed SDK <https://github.com/sifive/freedom-u-sdk>`_.
How would the Unleashed SDK help on a later board or a board from a
different vendor?
Why wouldn't an upstream kernel work?
I suggest to eliminate this misleading section.
> +
> +
> +Meson prerequisites
> +~~~~~~~~~~~~~~~~~~~
> +
> +Meson depends on pkgconfig to find the dependencies.
> +The package ``pkg-config-riscv64-linux-gnu`` is required for RISC-V.
> +To install it in Ubuntu::
> +
> + sudo apt install pkg-config-riscv64-linux-gnu
This package does not exist in the current Ubuntu LTS (22.04, Jammy).
Setting environment variables PKG_CONFIG_LIBDIR, PKG_CONFIG_PATH,
PKG_CONFIG_SYSROOT_DIR properly should do the job with the normal
pkg-config.
> +
> +
> +GNU toolchain
> +-------------
> +
> +
> +Obtain the cross toolchain
> +~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +The build process was tested using:
> +
> +* Ubuntu toolchain (the ``crossbuild-essential-riscv64`` package).
> +
> +* Latest `RISC-V GNU toolchain
> + <https://github.com/riscv/riscv-gnu-toolchain/releases>`_ on Ubuntu or Arch
> + Linux.
> +
> +Alternatively the toolchain may be built straight from the source, to do that
> +follow the instructions on the riscv-gnu-toolchain github page.
> +
> +
> +Unzip and add into the PATH
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +This step is only required for the riscv-gnu-toolchain. The Ubuntu toolchain is
> +in the PATH already.
> +
> +.. code-block:: console
> +
> + tar -xvf riscv64-glibc-ubuntu-20.04-<version>.tar.gz
You can install the glibc package with apt-get after adding the
architecture with sudo dpkg --add-architecture riscv64. See
https://wiki.debian.org/CrossCompiling.
> + export PATH=$PATH:<cross_install_dir>/riscv/bin
> +
> +
> +Cross Compiling DPDK with GNU toolchain using Meson
> +~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
> +
> +To cross-compile DPDK for a desired target machine use the following command::
> +
> + meson cross-build --cross-file <target_machine_configuration>
> + ninja -C cross-build
> +
> +For example if the target machine is a generic rv64gc RISC-V, use the following
> +command::
> +
> + meson riscv64-build-gcc --cross-file config/riscv/riscv64_linux_gcc
> + ninja -C riscv64-build-gcc
> +
> +If riscv-gnu-toolchain is used, binary names should be updated to match. Update the following lines in the cross-file:
> +
> +.. code-block:: console
> +
> + [binaries]
> + c = 'riscv64-unknown-linux-gnu-gcc'
> + cpp = 'riscv64-unknown-linux-gnu-g++'
> + ar = 'riscv64-unknown-linux-gnu-ar'
> + strip = 'riscv64-unknown-linux-gnu-strip'
> + ...
> +
> +Some toolchains (such as freedom-u-sdk one) require also setting ``--sysroot``,
> +otherwise include paths might not be resolved. To do so, add the appropriate
> +paths to the cross-file:
> +
> +.. code-block:: console
> +
> + [properties]
> + ...
> + c_args = ['--sysroot', '<path/to/toolchain/sysroot>']
> + cpp_args = c_args
> + c_link_args = ['--sysroot', '<path/to/toolchain/sysroot>']
> + cpp_link_args = c_link_args
> + ...
> +
> +
> +Supported cross-compilation targets
> +-----------------------------------
> +
> +Currently the following targets are supported:
> +
> +* Generic rv64gc ISA: ``config/riscv/riscv64_linux_gcc``
> +
> +* SiFive U740 SoC: ``config/riscv/riscv64_sifive_u740_linux_gcc``
Why do we need a special config for the Unmatched board that is not sold
anymore? Doesn't the Unmatched board work with the genenric config?
I assume a single configuriation file for the generic target is enough.
Best regards
Heinrich
> +
> +To add a new target support, ``config/riscv/meson.build`` has to be modified by
> +adding a new vendor/architecture id and a corresponding cross-file has to be
> +added to ``config/riscv`` directory.
> diff --git a/doc/guides/linux_gsg/index.rst b/doc/guides/linux_gsg/index.rst
> index 16a9a67260..747552c385 100644
> --- a/doc/guides/linux_gsg/index.rst
> +++ b/doc/guides/linux_gsg/index.rst
> @@ -14,6 +14,7 @@ Getting Started Guide for Linux
> sys_reqs
> build_dpdk
> cross_build_dpdk_for_arm64
> + cross_build_dpdk_for_riscv
> linux_drivers
> build_sample_apps
> linux_eal_parameters
> diff --git a/doc/guides/nics/features.rst b/doc/guides/nics/features.rst
> index 21bedb743f..6c4fa74bc7 100644
> --- a/doc/guides/nics/features.rst
> +++ b/doc/guides/nics/features.rst
> @@ -855,6 +855,11 @@ x86-64
>
> Support 64bits x86 architecture.
>
> +rv64
> +----
> +
> +Support 64-bit RISC-V architecture.
> +
>
> .. _nic_features_usage_doc:
>
> diff --git a/doc/guides/nics/features/default.ini b/doc/guides/nics/features/default.ini
> index b1d18ac62c..02198682c6 100644
> --- a/doc/guides/nics/features/default.ini
> +++ b/doc/guides/nics/features/default.ini
> @@ -74,6 +74,7 @@ ARMv8 =
> Power8 =
> x86-32 =
> x86-64 =
> +rv64 =
> Usage doc =
> Design doc =
> Perf doc =
> diff --git a/doc/guides/rel_notes/release_22_07.rst b/doc/guides/rel_notes/release_22_07.rst
> index 4ae91dd94d..e014247bc0 100644
> --- a/doc/guides/rel_notes/release_22_07.rst
> +++ b/doc/guides/rel_notes/release_22_07.rst
> @@ -55,6 +55,14 @@ New Features
> Also, make sure to start the actual text at the margin.
> =======================================================
>
> +* **Added initial RISC-V architecture support.***
> +
> + Added EAL implementation for RISC-V architecture. The initial device the
> + porting was tested on is a HiFive Unmatched development board based on the
> + SiFive Freedom U740 SoC. In theory this implementation should work with any
> + ``rv64gc`` ISA compatible implementation with MMU supporting a reasonable
> + address space size (U740 uses sv39 MMU).
> +
> * **Updated Intel iavf driver.**
>
> * Added Tx QoS queue rate limitation support.
> diff --git a/drivers/net/i40e/meson.build b/drivers/net/i40e/meson.build
> index efc5f93e35..a4c1c9079a 100644
> --- a/drivers/net/i40e/meson.build
> +++ b/drivers/net/i40e/meson.build
> @@ -1,6 +1,12 @@
> # SPDX-License-Identifier: BSD-3-Clause
> # Copyright(c) 2017 Intel Corporation
>
> +if arch_subdir == 'riscv'
> + build = false
> + reason = 'riscv arch not supported'
> + subdir_done()
> +endif
> +
> cflags += ['-DPF_DRIVER',
> '-DVF_DRIVER',
> '-DINTEGRATED_VF',
> diff --git a/drivers/net/ixgbe/meson.build b/drivers/net/ixgbe/meson.build
> index 162f8d5f46..88539e97d5 100644
> --- a/drivers/net/ixgbe/meson.build
> +++ b/drivers/net/ixgbe/meson.build
> @@ -1,6 +1,12 @@
> # SPDX-License-Identifier: BSD-3-Clause
> # Copyright(c) 2017 Intel Corporation
>
> +if arch_subdir == 'riscv'
> + build = false
> + reason = 'riscv arch not supported'
> + subdir_done()
> +endif
> +
> cflags += ['-DRTE_LIBRTE_IXGBE_BYPASS']
>
> subdir('base')
> diff --git a/drivers/net/memif/meson.build b/drivers/net/memif/meson.build
> index 680bc8631c..9afb495953 100644
> --- a/drivers/net/memif/meson.build
> +++ b/drivers/net/memif/meson.build
> @@ -5,6 +5,11 @@ if not is_linux
> build = false
> reason = 'only supported on Linux'
> endif
> +if arch_subdir == 'riscv'
> + build = false
> + reason = 'riscv arch not supported'
> + subdir_done()
> +endif
>
> sources = files(
> 'memif_socket.c',
> diff --git a/drivers/net/tap/meson.build b/drivers/net/tap/meson.build
> index c09713a67b..3efac9ac07 100644
> --- a/drivers/net/tap/meson.build
> +++ b/drivers/net/tap/meson.build
> @@ -5,6 +5,11 @@ if not is_linux
> build = false
> reason = 'only supported on Linux'
> endif
> +if arch_subdir == 'riscv'
> + build = false
> + reason = 'riscv arch not supported'
> + subdir_done()
> +endif
> sources = files(
> 'rte_eth_tap.c',
> 'tap_bpf_api.c',
> diff --git a/examples/l3fwd/meson.build b/examples/l3fwd/meson.build
> index 0830b3eb31..75fa19b7fe 100644
> --- a/examples/l3fwd/meson.build
> +++ b/examples/l3fwd/meson.build
> @@ -6,6 +6,12 @@
> # To build this example as a standalone application with an already-installed
> # DPDK instance, use 'make'
>
> +if dpdk_conf.has('RTE_ARCH_RISCV')
> + build = false
> + reason = 'riscv arch not supported'
> + subdir_done()
> +endif
> +
> allow_experimental_apis = true
> deps += ['hash', 'lpm', 'fib', 'eventdev']
> sources = files(
> diff --git a/lib/eal/riscv/include/meson.build b/lib/eal/riscv/include/meson.build
> new file mode 100644
> index 0000000000..7f6e4a5b1e
> --- /dev/null
> +++ b/lib/eal/riscv/include/meson.build
> @@ -0,0 +1,23 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright(c) 2022 StarFive
> +# Copyright(c) 2022 SiFive
> +# Copyright(c) 2022 Semihalf
> +
> +arch_headers = files(
> + 'rte_atomic.h',
> + 'rte_byteorder.h',
> + 'rte_cpuflags.h',
> + 'rte_cycles.h',
> + 'rte_io.h',
> + 'rte_mcslock.h',
> + 'rte_memcpy.h',
> + 'rte_pause.h',
> + 'rte_pflock.h',
> + 'rte_power_intrinsics.h',
> + 'rte_prefetch.h',
> + 'rte_rwlock.h',
> + 'rte_spinlock.h',
> + 'rte_ticketlock.h',
> + 'rte_vect.h',
> +)
> +install_headers(arch_headers, subdir: get_option('include_subdir_arch'))
> diff --git a/lib/eal/riscv/include/rte_atomic.h b/lib/eal/riscv/include/rte_atomic.h
> new file mode 100644
> index 0000000000..4b4633c914
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_atomic.h
> @@ -0,0 +1,52 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + * All rights reserved.
> + */
> +
> +#ifndef RTE_ATOMIC_RISCV_H
> +#define RTE_ATOMIC_RISCV_H
> +
> +#ifndef RTE_FORCE_INTRINSICS
> +# error Platform must be built with RTE_FORCE_INTRINSICS
> +#endif
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <stdint.h>
> +#include <rte_common.h>
> +#include <rte_config.h>
> +#include "generic/rte_atomic.h"
> +
> +#define rte_mb() asm volatile("fence rw, rw" : : : "memory")
> +
> +#define rte_wmb() asm volatile("fence w, w" : : : "memory")
> +
> +#define rte_rmb() asm volatile("fence r, r" : : : "memory")
> +
> +#define rte_smp_mb() rte_mb()
> +
> +#define rte_smp_wmb() rte_wmb()
> +
> +#define rte_smp_rmb() rte_rmb()
> +
> +#define rte_io_mb() asm volatile("fence iorw, iorw" : : : "memory")
> +
> +#define rte_io_wmb() asm volatile("fence orw, ow" : : : "memory")
> +
> +#define rte_io_rmb() asm volatile("fence ir, ir" : : : "memory")
> +
> +static __rte_always_inline void
> +rte_atomic_thread_fence(int memorder)
> +{
> + __atomic_thread_fence(memorder);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_ATOMIC_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_byteorder.h b/lib/eal/riscv/include/rte_byteorder.h
> new file mode 100644
> index 0000000000..21893505d6
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_byteorder.h
> @@ -0,0 +1,44 @@
> +/*
> + * SPDX-License-Identifier: BSD-3-Clause
> + * Inspired from FreeBSD src/sys/powerpc/include/endian.h
> + * Copyright(c) 1987, 1991, 1993
> + * The Regents of the University of California. All rights reserved.
> + */
> +
> +#ifndef RTE_BYTEORDER_RISCV_H
> +#define RTE_BYTEORDER_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <stdint.h>
> +#include <rte_common.h>
> +#include "generic/rte_byteorder.h"
> +
> +#ifndef RTE_BYTE_ORDER
> +#define RTE_BYTE_ORDER RTE_LITTLE_ENDIAN
> +#endif
> +
> +#define rte_cpu_to_le_16(x) (x)
> +#define rte_cpu_to_le_32(x) (x)
> +#define rte_cpu_to_le_64(x) (x)
> +
> +#define rte_cpu_to_be_16(x) rte_bswap16(x)
> +#define rte_cpu_to_be_32(x) rte_bswap32(x)
> +#define rte_cpu_to_be_64(x) rte_bswap64(x)
> +
> +#define rte_le_to_cpu_16(x) (x)
> +#define rte_le_to_cpu_32(x) (x)
> +#define rte_le_to_cpu_64(x) (x)
> +
> +#define rte_be_to_cpu_16(x) rte_bswap16(x)
> +#define rte_be_to_cpu_32(x) rte_bswap32(x)
> +#define rte_be_to_cpu_64(x) rte_bswap64(x)
> +
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_BYTEORDER_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_cpuflags.h b/lib/eal/riscv/include/rte_cpuflags.h
> new file mode 100644
> index 0000000000..66e787f898
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_cpuflags.h
> @@ -0,0 +1,55 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2014 IBM Corporation
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_CPUFLAGS_RISCV_H
> +#define RTE_CPUFLAGS_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +/**
> + * Enumeration of all CPU features supported
> + */
> +enum rte_cpu_flag_t {
> + RTE_CPUFLAG_RISCV_ISA_A, /* Atomic */
> + RTE_CPUFLAG_RISCV_ISA_B, /* Bit-Manipulation */
> + RTE_CPUFLAG_RISCV_ISA_C, /* Compressed instruction */
> + RTE_CPUFLAG_RISCV_ISA_D, /* Double precision floating-point */
> + RTE_CPUFLAG_RISCV_ISA_E, /* RV32E ISA */
> + RTE_CPUFLAG_RISCV_ISA_F, /* Single precision floating-point */
> + RTE_CPUFLAG_RISCV_ISA_G, /* Extension pack (IMAFD, Zicsr, Zifencei) */
> + RTE_CPUFLAG_RISCV_ISA_H, /* Hypervisor */
> + RTE_CPUFLAG_RISCV_ISA_I, /* RV32I/RV64I/IRV128I base ISA */
> + RTE_CPUFLAG_RISCV_ISA_J, /* Dynamic Translation Language */
> + RTE_CPUFLAG_RISCV_ISA_K, /* Reserved */
> + RTE_CPUFLAG_RISCV_ISA_L, /* Decimal Floating-Point */
> + RTE_CPUFLAG_RISCV_ISA_M, /* Integer Multiply/Divide */
> + RTE_CPUFLAG_RISCV_ISA_N, /* User-level interrupts */
> + RTE_CPUFLAG_RISCV_ISA_O, /* Reserved */
> + RTE_CPUFLAG_RISCV_ISA_P, /* Packed-SIMD */
> + RTE_CPUFLAG_RISCV_ISA_Q, /* Quad-precision floating-points */
> + RTE_CPUFLAG_RISCV_ISA_R, /* Reserved */
> + RTE_CPUFLAG_RISCV_ISA_S, /* Supervisor mode */
> + RTE_CPUFLAG_RISCV_ISA_T, /* Transactional memory */
> + RTE_CPUFLAG_RISCV_ISA_U, /* User mode */
> + RTE_CPUFLAG_RISCV_ISA_V, /* Vector */
> + RTE_CPUFLAG_RISCV_ISA_W, /* Reserved */
> + RTE_CPUFLAG_RISCV_ISA_X, /* Non-standard extension present */
> + RTE_CPUFLAG_RISCV_ISA_Y, /* Reserved */
> + RTE_CPUFLAG_RISCV_ISA_Z, /* Reserved */
> + /* The last item */
> + RTE_CPUFLAG_NUMFLAGS,/**< This should always be the last! */
> +};
> +
> +#include "generic/rte_cpuflags.h"
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_CPUFLAGS_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_cycles.h b/lib/eal/riscv/include/rte_cycles.h
> new file mode 100644
> index 0000000000..8353cea853
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_cycles.h
> @@ -0,0 +1,105 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2015 Cavium, Inc
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_CYCLES_RISCV_H
> +#define RTE_CYCLES_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_cycles.h"
> +
> +#ifndef RTE_RISCV_RDTSC_USE_HPM
> +#define RTE_RISCV_RDTSC_USE_HPM 0
> +#endif
> +
> +#define RV64_CSRR(reg, value) \
> + asm volatile("csrr %0, " #reg : "=r" (value) : : "memory")
> +
> +/** Read wall time counter */
> +static __rte_always_inline uint64_t
> +__rte_riscv_rdtime(void)
> +{
> + uint64_t tsc;
> + RV64_CSRR(time, tsc);
> + return tsc;
> +}
> +
> +/** Read wall time counter ensuring no re-ordering */
> +static __rte_always_inline uint64_t
> +__rte_riscv_rdtime_precise(void)
> +{
> +#if !defined(RTE_RISCV_EMU_UTIME)
> + asm volatile("fence" : : : "memory");
> +#endif
> + return __rte_riscv_rdtime();
> +}
> +
> +/** Read hart cycle counter */
> +static __rte_always_inline uint64_t
> +__rte_riscv_rdcycle(void)
> +{
> + uint64_t tsc;
> + RV64_CSRR(cycle, tsc);
> + return tsc;
> +}
> +
> +/** Read hart cycle counter ensuring no re-ordering */
> +static __rte_always_inline uint64_t
> +__rte_riscv_rdcycle_precise(void)
> +{
> +#if !defined(RTE_RISCV_EMU_UCYCLE)
> + asm volatile("fence" : : : "memory");
> +#endif
> + return __rte_riscv_rdcycle();
> +}
> +
> +/**
> + * Read the time base register.
> + *
> + * @return
> + * The time base for this lcore.
> + */
> +static __rte_always_inline uint64_t
> +rte_rdtsc(void)
> +{
> + /**
> + * By default TIME userspace counter is used. Although it's frequency
> + * may not be enough for all applications.
> + */
> + if (!RTE_RISCV_RDTSC_USE_HPM)
> + return __rte_riscv_rdtime();
> + /**
> + * Alternatively HPM's CYCLE counter may be used. However this counter
> + * is not guaranteed by ISA to either be stable frequency or always
> + * enabled for userspace access (it may trap to kernel or firmware).
> + */
> + return __rte_riscv_rdcycle();
> +}
> +
> +static inline uint64_t
> +rte_rdtsc_precise(void)
> +{
> + if (!RTE_RISCV_RDTSC_USE_HPM)
> + return __rte_riscv_rdtime_precise();
> + return __rte_riscv_rdcycle_precise();
> +}
> +
> +static __rte_always_inline uint64_t
> +rte_get_tsc_cycles(void)
> +{
> + return rte_rdtsc();
> +}
> +
> +#undef RV64_CSRR
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_CYCLES_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_io.h b/lib/eal/riscv/include/rte_io.h
> new file mode 100644
> index 0000000000..29659c9590
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_io.h
> @@ -0,0 +1,21 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2016 Cavium, Inc
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_IO_RISCV_H
> +#define RTE_IO_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_io.h"
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_IO_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_mcslock.h b/lib/eal/riscv/include/rte_mcslock.h
> new file mode 100644
> index 0000000000..b517cd5fc5
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_mcslock.h
> @@ -0,0 +1,18 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2019 Arm Limited
> + */
> +
> +#ifndef RTE_MCSLOCK_RISCV_H
> +#define RTE_MCSLOCK_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_mcslock.h"
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_MCSLOCK_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_memcpy.h b/lib/eal/riscv/include/rte_memcpy.h
> new file mode 100644
> index 0000000000..e34f19396e
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_memcpy.h
> @@ -0,0 +1,63 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_MEMCPY_RISCV_H
> +#define RTE_MEMCPY_RISCV_H
> +
> +#include <stdint.h>
> +#include <string.h>
> +
> +#include "rte_common.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_memcpy.h"
> +
> +static inline void
> +rte_mov16(uint8_t *dst, const uint8_t *src)
> +{
> + memcpy(dst, src, 16);
> +}
> +
> +static inline void
> +rte_mov32(uint8_t *dst, const uint8_t *src)
> +{
> + memcpy(dst, src, 32);
> +}
> +
> +static inline void
> +rte_mov48(uint8_t *dst, const uint8_t *src)
> +{
> + memcpy(dst, src, 48);
> +}
> +
> +static inline void
> +rte_mov64(uint8_t *dst, const uint8_t *src)
> +{
> + memcpy(dst, src, 64);
> +}
> +
> +static inline void
> +rte_mov128(uint8_t *dst, const uint8_t *src)
> +{
> + memcpy(dst, src, 128);
> +}
> +
> +static inline void
> +rte_mov256(uint8_t *dst, const uint8_t *src)
> +{
> + memcpy(dst, src, 256);
> +}
> +
> +#define rte_memcpy(d, s, n) memcpy((d), (s), (n))
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_MEMCPY_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_pause.h b/lib/eal/riscv/include/rte_pause.h
> new file mode 100644
> index 0000000000..c24c1f32e8
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_pause.h
> @@ -0,0 +1,31 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_PAUSE_RISCV_H
> +#define RTE_PAUSE_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "rte_atomic.h"
> +
> +#include "generic/rte_pause.h"
> +
> +static inline void rte_pause(void)
> +{
> + /* Insert pause hint directly to be compatible with old compilers.
> + * This will work even on platforms without Zihintpause extension
> + * because this is a FENCE hint instruction which evaluates to NOP then.
> + */
> + asm volatile(".int 0x0100000F"::: "memory");
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_PAUSE_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_pflock.h b/lib/eal/riscv/include/rte_pflock.h
> new file mode 100644
> index 0000000000..ce6ca02aca
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_pflock.h
> @@ -0,0 +1,17 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2021 Microsoft Corporation
> + */
> +#ifndef RTE_PFLOCK_RISCV_H
> +#define RTE_PFLOCK_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_pflock.h"
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_PFLOCK_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_power_intrinsics.h b/lib/eal/riscv/include/rte_power_intrinsics.h
> new file mode 100644
> index 0000000000..636e58e71f
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_power_intrinsics.h
> @@ -0,0 +1,22 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_POWER_INTRINSIC_RISCV_H
> +#define RTE_POWER_INTRINSIC_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <rte_common.h>
> +
> +#include "generic/rte_power_intrinsics.h"
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_POWER_INTRINSIC_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_prefetch.h b/lib/eal/riscv/include/rte_prefetch.h
> new file mode 100644
> index 0000000000..966d9e2687
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_prefetch.h
> @@ -0,0 +1,50 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2014 IBM Corporation
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_PREFETCH_RISCV_H
> +#define RTE_PREFETCH_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <rte_common.h>
> +#include "generic/rte_prefetch.h"
> +
> +static inline void rte_prefetch0(const volatile void *p)
> +{
> + RTE_SET_USED(p);
> +}
> +
> +static inline void rte_prefetch1(const volatile void *p)
> +{
> + RTE_SET_USED(p);
> +}
> +
> +static inline void rte_prefetch2(const volatile void *p)
> +{
> + RTE_SET_USED(p);
> +}
> +
> +static inline void rte_prefetch_non_temporal(const volatile void *p)
> +{
> + /* non-temporal version not available, fallback to rte_prefetch0 */
> + rte_prefetch0(p);
> +}
> +
> +__rte_experimental
> +static inline void
> +rte_cldemote(const volatile void *p)
> +{
> + RTE_SET_USED(p);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_PREFETCH_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_rwlock.h b/lib/eal/riscv/include/rte_rwlock.h
> new file mode 100644
> index 0000000000..9cdaf1b0ef
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_rwlock.h
> @@ -0,0 +1,44 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_RWLOCK_RISCV_H
> +#define RTE_RWLOCK_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_rwlock.h"
> +
> +static inline void
> +rte_rwlock_read_lock_tm(rte_rwlock_t *rwl)
> +{
> + rte_rwlock_read_lock(rwl);
> +}
> +
> +static inline void
> +rte_rwlock_read_unlock_tm(rte_rwlock_t *rwl)
> +{
> + rte_rwlock_read_unlock(rwl);
> +}
> +
> +static inline void
> +rte_rwlock_write_lock_tm(rte_rwlock_t *rwl)
> +{
> + rte_rwlock_write_lock(rwl);
> +}
> +
> +static inline void
> +rte_rwlock_write_unlock_tm(rte_rwlock_t *rwl)
> +{
> + rte_rwlock_write_unlock(rwl);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_RWLOCK_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_spinlock.h b/lib/eal/riscv/include/rte_spinlock.h
> new file mode 100644
> index 0000000000..6af430735c
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_spinlock.h
> @@ -0,0 +1,67 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2015 RehiveTech. All rights reserved.
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_SPINLOCK_RISCV_H
> +#define RTE_SPINLOCK_RISCV_H
> +
> +#ifndef RTE_FORCE_INTRINSICS
> +# error Platform must be built with RTE_FORCE_INTRINSICS
> +#endif
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include <rte_common.h>
> +#include "generic/rte_spinlock.h"
> +
> +static inline int rte_tm_supported(void)
> +{
> + return 0;
> +}
> +
> +static inline void
> +rte_spinlock_lock_tm(rte_spinlock_t *sl)
> +{
> + rte_spinlock_lock(sl); /* fall-back */
> +}
> +
> +static inline int
> +rte_spinlock_trylock_tm(rte_spinlock_t *sl)
> +{
> + return rte_spinlock_trylock(sl);
> +}
> +
> +static inline void
> +rte_spinlock_unlock_tm(rte_spinlock_t *sl)
> +{
> + rte_spinlock_unlock(sl);
> +}
> +
> +static inline void
> +rte_spinlock_recursive_lock_tm(rte_spinlock_recursive_t *slr)
> +{
> + rte_spinlock_recursive_lock(slr); /* fall-back */
> +}
> +
> +static inline void
> +rte_spinlock_recursive_unlock_tm(rte_spinlock_recursive_t *slr)
> +{
> + rte_spinlock_recursive_unlock(slr);
> +}
> +
> +static inline int
> +rte_spinlock_recursive_trylock_tm(rte_spinlock_recursive_t *slr)
> +{
> + return rte_spinlock_recursive_trylock(slr);
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_SPINLOCK_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_ticketlock.h b/lib/eal/riscv/include/rte_ticketlock.h
> new file mode 100644
> index 0000000000..b8d2a4f937
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_ticketlock.h
> @@ -0,0 +1,21 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2019 Arm Limited
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_TICKETLOCK_RISCV_H
> +#define RTE_TICKETLOCK_RISCV_H
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#include "generic/rte_ticketlock.h"
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_TICKETLOCK_RISCV_H */
> diff --git a/lib/eal/riscv/include/rte_vect.h b/lib/eal/riscv/include/rte_vect.h
> new file mode 100644
> index 0000000000..4600521c20
> --- /dev/null
> +++ b/lib/eal/riscv/include/rte_vect.h
> @@ -0,0 +1,55 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#ifndef RTE_VECT_RISCV_H
> +#define RTE_VECT_RISCV_H
> +
> +#include <stdint.h>
> +#include "generic/rte_vect.h"
> +#include "rte_common.h"
> +
> +#ifdef __cplusplus
> +extern "C" {
> +#endif
> +
> +#define RTE_VECT_DEFAULT_SIMD_BITWIDTH RTE_VECT_SIMD_DISABLED
> +
> +typedef int32_t xmm_t __attribute__((vector_size(16)));
> +
> +#define XMM_SIZE (sizeof(xmm_t))
> +#define XMM_MASK (XMM_SIZE - 1)
> +
> +typedef union rte_xmm {
> + xmm_t x;
> + uint8_t u8[XMM_SIZE / sizeof(uint8_t)];
> + uint16_t u16[XMM_SIZE / sizeof(uint16_t)];
> + uint32_t u32[XMM_SIZE / sizeof(uint32_t)];
> + uint64_t u64[XMM_SIZE / sizeof(uint64_t)];
> + double pd[XMM_SIZE / sizeof(double)];
> +} __rte_aligned(8) rte_xmm_t;
> +
> +static inline xmm_t
> +vect_load_128(void *p)
> +{
> + xmm_t ret = *((xmm_t *)p);
> + return ret;
> +}
> +
> +static inline xmm_t
> +vect_and(xmm_t data, xmm_t mask)
> +{
> + rte_xmm_t ret = (rte_xmm_t)data;
> + rte_xmm_t m = (rte_xmm_t)mask;
> + ret.u64[0] &= m.u64[0];
> + ret.u64[1] &= m.u64[1];
> + return ret.x;
> +}
> +
> +#ifdef __cplusplus
> +}
> +#endif
> +
> +#endif /* RTE_VECT_RISCV_H */
> diff --git a/lib/eal/riscv/meson.build b/lib/eal/riscv/meson.build
> new file mode 100644
> index 0000000000..dca1106aae
> --- /dev/null
> +++ b/lib/eal/riscv/meson.build
> @@ -0,0 +1,11 @@
> +# SPDX-License-Identifier: BSD-3-Clause
> +# Copyright(c) 2017 Intel Corporation.
> +
> +subdir('include')
> +
> +sources += files(
> + 'rte_cpuflags.c',
> + 'rte_cycles.c',
> + 'rte_hypervisor.c',
> + 'rte_power_intrinsics.c',
> +)
> diff --git a/lib/eal/riscv/rte_cpuflags.c b/lib/eal/riscv/rte_cpuflags.c
> new file mode 100644
> index 0000000000..4f6d29b947
> --- /dev/null
> +++ b/lib/eal/riscv/rte_cpuflags.c
> @@ -0,0 +1,122 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#include "rte_cpuflags.h"
> +
> +#include <elf.h>
> +#include <fcntl.h>
> +#include <assert.h>
> +#include <unistd.h>
> +#include <string.h>
> +
> +#ifndef AT_HWCAP
> +#define AT_HWCAP 16
> +#endif
> +
> +#ifndef AT_HWCAP2
> +#define AT_HWCAP2 26
> +#endif
> +
> +#ifndef AT_PLATFORM
> +#define AT_PLATFORM 15
> +#endif
> +
> +enum cpu_register_t {
> + REG_NONE = 0,
> + REG_HWCAP,
> + REG_HWCAP2,
> + REG_PLATFORM,
> + REG_MAX
> +};
> +
> +typedef uint32_t hwcap_registers_t[REG_MAX];
> +
> +/**
> + * Struct to hold a processor feature entry
> + */
> +struct feature_entry {
> + uint32_t reg;
> + uint32_t bit;
> +#define CPU_FLAG_NAME_MAX_LEN 64
> + char name[CPU_FLAG_NAME_MAX_LEN];
> +};
> +
> +#define FEAT_DEF(name, reg, bit) \
> + [RTE_CPUFLAG_##name] = {reg, bit, #name},
> +
> +typedef Elf64_auxv_t _Elfx_auxv_t;
> +
> +const struct feature_entry rte_cpu_feature_table[] = {
> + FEAT_DEF(RISCV_ISA_A, REG_HWCAP, 0)
> + FEAT_DEF(RISCV_ISA_B, REG_HWCAP, 1)
> + FEAT_DEF(RISCV_ISA_C, REG_HWCAP, 2)
> + FEAT_DEF(RISCV_ISA_D, REG_HWCAP, 3)
> + FEAT_DEF(RISCV_ISA_E, REG_HWCAP, 4)
> + FEAT_DEF(RISCV_ISA_F, REG_HWCAP, 5)
> + FEAT_DEF(RISCV_ISA_G, REG_HWCAP, 6)
> + FEAT_DEF(RISCV_ISA_H, REG_HWCAP, 7)
> + FEAT_DEF(RISCV_ISA_I, REG_HWCAP, 8)
> + FEAT_DEF(RISCV_ISA_J, REG_HWCAP, 9)
> + FEAT_DEF(RISCV_ISA_K, REG_HWCAP, 10)
> + FEAT_DEF(RISCV_ISA_L, REG_HWCAP, 11)
> + FEAT_DEF(RISCV_ISA_M, REG_HWCAP, 12)
> + FEAT_DEF(RISCV_ISA_N, REG_HWCAP, 13)
> + FEAT_DEF(RISCV_ISA_O, REG_HWCAP, 14)
> + FEAT_DEF(RISCV_ISA_P, REG_HWCAP, 15)
> + FEAT_DEF(RISCV_ISA_Q, REG_HWCAP, 16)
> + FEAT_DEF(RISCV_ISA_R, REG_HWCAP, 17)
> + FEAT_DEF(RISCV_ISA_S, REG_HWCAP, 18)
> + FEAT_DEF(RISCV_ISA_T, REG_HWCAP, 19)
> + FEAT_DEF(RISCV_ISA_U, REG_HWCAP, 20)
> + FEAT_DEF(RISCV_ISA_V, REG_HWCAP, 21)
> + FEAT_DEF(RISCV_ISA_W, REG_HWCAP, 22)
> + FEAT_DEF(RISCV_ISA_X, REG_HWCAP, 23)
> + FEAT_DEF(RISCV_ISA_Y, REG_HWCAP, 24)
> + FEAT_DEF(RISCV_ISA_Z, REG_HWCAP, 25)
> +};
> +/*
> + * Read AUXV software register and get cpu features for ARM
> + */
> +static void
> +rte_cpu_get_features(hwcap_registers_t out)
> +{
> + out[REG_HWCAP] = rte_cpu_getauxval(AT_HWCAP);
> + out[REG_HWCAP2] = rte_cpu_getauxval(AT_HWCAP2);
> +}
> +
> +/*
> + * Checks if a particular flag is available on current machine.
> + */
> +int
> +rte_cpu_get_flag_enabled(enum rte_cpu_flag_t feature)
> +{
> + const struct feature_entry *feat;
> + hwcap_registers_t regs = {0};
> +
> + if (feature >= RTE_CPUFLAG_NUMFLAGS)
> + return -ENOENT;
> +
> + feat = &rte_cpu_feature_table[feature];
> + if (feat->reg == REG_NONE)
> + return -EFAULT;
> +
> + rte_cpu_get_features(regs);
> + return (regs[feat->reg] >> feat->bit) & 1;
> +}
> +
> +const char *
> +rte_cpu_get_flag_name(enum rte_cpu_flag_t feature)
> +{
> + if (feature >= RTE_CPUFLAG_NUMFLAGS)
> + return NULL;
> + return rte_cpu_feature_table[feature].name;
> +}
> +
> +void
> +rte_cpu_get_intrinsics_support(struct rte_cpu_intrinsics *intrinsics)
> +{
> + memset(intrinsics, 0, sizeof(*intrinsics));
> +}
> diff --git a/lib/eal/riscv/rte_cycles.c b/lib/eal/riscv/rte_cycles.c
> new file mode 100644
> index 0000000000..358f271311
> --- /dev/null
> +++ b/lib/eal/riscv/rte_cycles.c
> @@ -0,0 +1,77 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2015 Cavium, Inc
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#include <stdio.h>
> +
> +#include "eal_private.h"
> +#include "rte_byteorder.h"
> +#include "rte_cycles.h"
> +#include "rte_log.h"
> +
> +/** Read generic counter frequency */
> +static uint64_t
> +__rte_riscv_timefrq(void)
> +{
> +#define TIMEBASE_FREQ_SIZE 8
> + if (RTE_RISCV_TIME_FREQ > 0)
> + return RTE_RISCV_TIME_FREQ;
> + uint8_t buf[TIMEBASE_FREQ_SIZE];
> + ssize_t cnt;
> + FILE *file;
> +
> + file = fopen("/proc/device-tree/cpus/timebase-frequency", "rb");
> + if (!file)
> + goto fail;
> +
> + cnt = fread(buf, 1, TIMEBASE_FREQ_SIZE, file);
> + fclose(file);
> + switch (cnt) {
> + case 8:
> + return rte_be_to_cpu_64(*(uint64_t *)buf);
> + case 4:
> + return rte_be_to_cpu_32(*(uint32_t *)buf);
> + default:
> + break;
> + }
> +fail:
> + RTE_LOG(WARNING, EAL, "Unable to read timebase-frequency from FDT.\n");
> + return 0;
> +}
> +
> +uint64_t
> +get_tsc_freq_arch(void)
> +{
> + RTE_LOG(NOTICE, EAL, "TSC using RISC-V %s.\n",
> + RTE_RISCV_RDTSC_USE_HPM ? "rdcycle" : "rdtime");
> + if (!RTE_RISCV_RDTSC_USE_HPM)
> + return __rte_riscv_timefrq();
> +#define CYC_PER_1MHZ 1E6
> + /*
> + * Use real time clock to estimate current cycle frequency
> + */
> + uint64_t ticks, frq;
> + uint64_t start_ticks, cur_ticks;
> + uint64_t start_cycle, end_cycle;
> +
> + /* Do not proceed unless clock frequency can be obtained. */
> + frq = __rte_riscv_timefrq();
> + if (!frq)
> + return 0;
> +
> + /* Number of ticks for 1/10 second */
> + ticks = frq / 10;
> +
> + start_ticks = __rte_riscv_rdtime_precise();
> + start_cycle = rte_rdtsc_precise();
> + do {
> + cur_ticks = __rte_riscv_rdtime();
> + } while ((cur_ticks - start_ticks) < ticks);
> + end_cycle = rte_rdtsc_precise();
> +
> + /* Adjust the cycles to next 1Mhz */
> + return RTE_ALIGN_MUL_CEIL((end_cycle - start_cycle) * 10, CYC_PER_1MHZ);
> +}
> diff --git a/lib/eal/riscv/rte_hypervisor.c b/lib/eal/riscv/rte_hypervisor.c
> new file mode 100644
> index 0000000000..92b5435993
> --- /dev/null
> +++ b/lib/eal/riscv/rte_hypervisor.c
> @@ -0,0 +1,13 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#include "rte_hypervisor.h"
> +
> +enum rte_hypervisor
> +rte_hypervisor_get(void)
> +{
> + return RTE_HYPERVISOR_UNKNOWN;
> +}
> diff --git a/lib/eal/riscv/rte_power_intrinsics.c b/lib/eal/riscv/rte_power_intrinsics.c
> new file mode 100644
> index 0000000000..240e7b6b87
> --- /dev/null
> +++ b/lib/eal/riscv/rte_power_intrinsics.c
> @@ -0,0 +1,56 @@
> +/* SPDX-License-Identifier: BSD-3-Clause
> + * Copyright(c) 2022 StarFive
> + * Copyright(c) 2022 SiFive
> + * Copyright(c) 2022 Semihalf
> + */
> +
> +#include "rte_power_intrinsics.h"
> +
> +/**
> + * This function is not supported on RISC-V 64
> + */
> +int
> +rte_power_monitor(const struct rte_power_monitor_cond *pmc,
> + const uint64_t tsc_timestamp)
> +{
> + RTE_SET_USED(pmc);
> + RTE_SET_USED(tsc_timestamp);
> +
> + return -ENOTSUP;
> +}
> +
> +/**
> + * This function is not supported on RISC-V 64
> + */
> +int
> +rte_power_pause(const uint64_t tsc_timestamp)
> +{
> + RTE_SET_USED(tsc_timestamp);
> +
> + return -ENOTSUP;
> +}
> +
> +/**
> + * This function is not supported on RISC-V 64
> + */
> +int
> +rte_power_monitor_wakeup(const unsigned int lcore_id)
> +{
> + RTE_SET_USED(lcore_id);
> +
> + return -ENOTSUP;
> +}
> +
> +/**
> + * This function is not supported on RISC-V 64
> + */
> +int
> +rte_power_monitor_multi(const struct rte_power_monitor_cond pmc[],
> + const uint32_t num, const uint64_t tsc_timestamp)
> +{
> + RTE_SET_USED(pmc);
> + RTE_SET_USED(num);
> + RTE_SET_USED(tsc_timestamp);
> +
> + return -ENOTSUP;
> +}
> diff --git a/meson.build b/meson.build
> index 937f6110c0..a8db04a1ee 100644
> --- a/meson.build
> +++ b/meson.build
> @@ -50,6 +50,8 @@ elif host_machine.cpu_family().startswith('arm') or host_machine.cpu_family().st
> arch_subdir = 'arm'
> elif host_machine.cpu_family().startswith('ppc')
> arch_subdir = 'ppc'
> +elif host_machine.cpu_family().startswith('riscv')
> + arch_subdir = 'riscv'
> endif
>
> # configure the build, and make sure configs here and in config folder are
next prev parent reply other threads:[~2022-05-13 6:50 UTC|newest]
Thread overview: 64+ messages / expand[flat|nested] mbox.gz Atom feed top
2022-05-05 17:29 [PATCH 00/11] Introduce " Stanislaw Kardach
2022-05-05 17:29 ` [PATCH 01/11] lpm: add a scalar version of lookupx4 function Stanislaw Kardach
2022-05-05 17:29 ` [PATCH 02/11] examples/l3fwd: fix scalar LPM compilation Stanislaw Kardach
2022-05-05 17:39 ` Stephen Hemminger
2022-05-05 17:49 ` Stanisław Kardach
2022-05-05 18:09 ` Stephen Hemminger
2022-05-05 17:29 ` [PATCH 03/11] eal: add initial support for RISC-V architecture Stanislaw Kardach
2022-05-05 17:29 ` [PATCH 04/11] net/ixgbe: enable vector stubs for RISC-V Stanislaw Kardach
2022-05-05 17:29 ` [PATCH 05/11] net/memif: set memfd syscall ID on RISC-V Stanislaw Kardach
2022-05-05 17:29 ` [PATCH 06/11] net/tap: set BPF syscall ID for RISC-V Stanislaw Kardach
2022-05-05 17:29 ` [PATCH 07/11] examples/l3fwd: enable RISC-V operation Stanislaw Kardach
2022-05-05 17:30 ` [PATCH 08/11] test/cpuflags: add test for RISC-V cpu flag Stanislaw Kardach
2022-05-05 17:30 ` [PATCH 09/11] test/ring: disable problematic tests for RISC-V Stanislaw Kardach
2022-05-05 17:35 ` Stephen Hemminger
2022-05-05 17:43 ` Stanisław Kardach
2022-05-05 18:06 ` Stephen Hemminger
2022-05-10 23:28 ` Honnappa Nagarahalli
2022-05-11 10:07 ` Stanisław Kardach
2022-05-05 17:30 ` [PATCH 10/11] devtools: add RISC-V to test-meson-builds.sh Stanislaw Kardach
2022-05-05 17:30 ` [PATCH 11/11] test/hash: report non HTM numbers for single r/w Stanislaw Kardach
2022-05-06 9:13 ` [PATCH 00/11] Introduce support for RISC-V architecture David Marchand
2022-05-09 12:24 ` Stanisław Kardach
2022-05-09 12:30 ` Thomas Monjalon
2022-05-11 8:09 ` Morten Brørup
2022-05-11 10:28 ` Stanisław Kardach
2022-05-11 11:06 ` Thomas Monjalon
2022-05-09 14:30 ` David Marchand
2022-05-10 11:21 ` Stanisław Kardach
2022-05-10 12:31 ` Thomas Monjalon
2022-05-10 14:00 ` Stanisław Kardach
2022-05-10 14:23 ` Thomas Monjalon
2022-05-10 15:07 ` [PATCH v2 0/8] " Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 1/8] eal: add initial " Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 2/8] net/ixgbe: enable vector stubs for RISC-V Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 3/8] net/memif: set memfd syscall ID on RISC-V Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 4/8] net/tap: set BPF syscall ID for RISC-V Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 5/8] examples/l3fwd: enable RISC-V operation Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 6/8] test/cpuflags: add test for RISC-V cpu flag Stanislaw Kardach
2022-05-10 15:07 ` [PATCH v2 7/8] devtools: add RISC-V to test-meson-builds.sh Stanislaw Kardach
2022-05-10 15:35 ` Stanisław Kardach
2022-05-10 15:07 ` [PATCH v2 8/8] ci: add RISCV64 cross compilation job Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 0/8] Introduce support for RISC-V architecture Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 1/8] eal: add initial " Stanislaw Kardach
2022-05-13 6:50 ` Heinrich Schuchardt [this message]
2022-05-13 8:42 ` Stanisław Kardach
2022-05-13 10:51 ` Heinrich Schuchardt
2022-05-13 11:47 ` Stanisław Kardach
2022-05-13 15:37 ` Stephen Hemminger
2022-05-16 8:00 ` Stanisław Kardach
2022-05-10 15:48 ` [PATCH v3 2/8] net/ixgbe: enable vector stubs for RISC-V Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 3/8] net/memif: set memfd syscall ID on RISC-V Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 4/8] net/tap: set BPF syscall ID for RISC-V Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 5/8] examples/l3fwd: enable RISC-V operation Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 6/8] test/cpuflags: add test for RISC-V cpu flag Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 7/8] devtools: add RISC-V to test-meson-builds.sh Stanislaw Kardach
2022-05-10 15:48 ` [PATCH v3 8/8] ci: add RISCV64 cross compilation job Stanislaw Kardach
2022-05-12 15:47 ` Aaron Conole
2022-05-12 16:07 ` Stanisław Kardach
2022-05-13 14:33 ` Aaron Conole
2022-05-12 8:04 ` [PATCH 00/11] Introduce support for RISC-V architecture Heinrich Schuchardt
2022-05-12 8:35 ` Stanisław Kardach
2022-05-12 9:46 ` Heinrich Schuchardt
2022-05-12 13:56 ` Stanisław Kardach
2022-05-12 21:06 ` Heinrich Schuchardt
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=7bc97240-10c7-c437-9f31-b97dc2b418c6@canonical.com \
--to=heinrich.schuchardt@canonical.com \
--cc=Frank.Zhao@starfivetech.com \
--cc=dev@dpdk.org \
--cc=kda@semihalf.com \
--cc=maz@semihalf.com \
--cc=mw@semihalf.com \
--cc=sam.grove@sifive.com \
--cc=thomas@monjalon.net \
--cc=upstream@semihalf.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).