diff --git a/ext/Kconfig b/ext/Kconfig index c4214c7d3b..fa9eaea3b1 100644 --- a/ext/Kconfig +++ b/ext/Kconfig @@ -14,6 +14,4 @@ source "ext/lib/crypto/Kconfig" source "ext/lib/fnmatch/Kconfig" -source "ext/lib/ipc/open-amp/Kconfig" - endmenu diff --git a/ext/lib/CMakeLists.txt b/ext/lib/CMakeLists.txt index 54f6236da1..97513aba7a 100644 --- a/ext/lib/CMakeLists.txt +++ b/ext/lib/CMakeLists.txt @@ -1,3 +1,2 @@ add_subdirectory(crypto) -add_subdirectory(ipc) add_subdirectory_ifdef(CONFIG_FNMATCH fnmatch) diff --git a/ext/lib/ipc/CMakeLists.txt b/ext/lib/ipc/CMakeLists.txt deleted file mode 100644 index 42eba529c3..0000000000 --- a/ext/lib/ipc/CMakeLists.txt +++ /dev/null @@ -1,7 +0,0 @@ -# Copyright (c) 2018 Linaro Limited -# -# SPDX-License-Identifier: Apache-2.0 -# - -add_subdirectory_ifdef(CONFIG_OPENAMP open-amp) - diff --git a/ext/lib/ipc/open-amp/CMakeLists.txt b/ext/lib/ipc/open-amp/CMakeLists.txt deleted file mode 100644 index 9b06afa559..0000000000 --- a/ext/lib/ipc/open-amp/CMakeLists.txt +++ /dev/null @@ -1,14 +0,0 @@ -# -# Copyright (c) 2018 Linaro Limited -# -# SPDX-License-Identifier: Apache-2.0 -# - -set(WITH_ZEPHYR 1) -set(WITH_ZEPHYR_LIB 1) -set(WITH_LIBMETAL_FIND OFF CACHE BOOL "" FORCE) -set(WITH_PROXY OFF CACHE BOOL "" FORCE) -set(LIBMETAL_INCLUDE_DIR ${ZEPHYR_BINARY_DIR}/ext/hal/libmetal/lib/include) -set(LIBMETAL_LIB ${ZEPHYR_BINARY_DIR}/ext/hal/libmetal/lib) - -add_subdirectory(${CONFIG_OPENAMP_SRC_PATH} open-amp) diff --git a/ext/lib/ipc/open-amp/Kconfig b/ext/lib/ipc/open-amp/Kconfig deleted file mode 100644 index 4b2041095d..0000000000 --- a/ext/lib/ipc/open-amp/Kconfig +++ /dev/null @@ -1,18 +0,0 @@ -# -# Copyright (c) 2018 Linaro Limited -# -# SPDX-License-Identifier: Apache-2.0 -# - -config OPENAMP - bool "OpenAMP Support" - select LIBMETAL - help - This option enables the OpenAMP IPC library - -config OPENAMP_SRC_PATH - string "OpenAMP library source path" - default "open-amp" - depends on OPENAMP - help - This option specifies the path to the source for the open-amp library diff --git a/ext/lib/ipc/open-amp/README b/ext/lib/ipc/open-amp/README deleted file mode 100644 index c6cf54fac3..0000000000 --- a/ext/lib/ipc/open-amp/README +++ /dev/null @@ -1,53 +0,0 @@ -OpenAMP -##################### - -Origin: - https://github.com/OpenAMP/open-amp - -Status: - db6de3ffb0a43b50e3a10af23a3d80eebd6db008 - - When we import open-amp we removed the apps dir to reduce the amount of - code imported. -Purpose: - IPC layer that implements rpmsg communication between cores. - -Description: - -This repository is the home for the Open Asymmetric Multi Processing (OpenAMP) -framework project. The OpenAMP framework provides software components that -enable development of software applications for Asymmetric Multiprocessing -(AMP) systems. The framework provides the following key capabilities. - -* Provides Life Cycle Management, and Inter Processor Communication capabilities - for management of remote compute resources and their associated software - contexts. -* Provides a stand alone library usable with RTOS and Baremetal software - environments -* Compatibility with upstream Linux remoteproc and rpmsg components -* Following AMP configurations supported: - a. Linux master/Generic(Baremetal) remote - b. Generic(Baremetal) master/Linux remote -* Proxy infrastructure and supplied demos showcase ability of proxy on master - to handle printf, scanf, open, close, read, write calls from Bare metal - based remote contexts. - -Dependencies: - libmetal (https://github.com/OpenAMP/libmetal) - provides HAL layer - between OpenAMP and RTOS or OS environment. - -URL: - https://github.com/OpenAMP/open-amp/ - -commit: - db6de3ffb0a43b50e3a10af23a3d80eebd6db008 - -Maintained-by: - External - -License: - BSD-3-Clause - BSD-2-Clause - -License Link: - https://github.com/OpenAMP/open-amp/blob/master/LICENSE.md diff --git a/ext/lib/ipc/open-amp/open-amp/.gitignore b/ext/lib/ipc/open-amp/open-amp/.gitignore deleted file mode 100644 index 3678ab7abd..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/.gitignore +++ /dev/null @@ -1,15 +0,0 @@ -*.o -*~ -!libs/system/zc702evk/linux/lib/*/*.a -*.bin -*.map -*.out -*.log -*.d - -/tags -/TAGS - -# cscope files -cscope.* -ncscope.* diff --git a/ext/lib/ipc/open-amp/open-amp/CMakeLists.txt b/ext/lib/ipc/open-amp/open-amp/CMakeLists.txt deleted file mode 100644 index 46fd8ebc99..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/CMakeLists.txt +++ /dev/null @@ -1,38 +0,0 @@ -cmake_minimum_required (VERSION 2.6) -if (POLICY CMP0048) - cmake_policy(SET CMP0048 NEW) -endif() - -# The version number -set (OPENAMP_VERSION_MAJOR 1) -set (OPENAMP_VERSION_MINOR 0) - -list (APPEND CMAKE_MODULE_PATH - "${CMAKE_CURRENT_SOURCE_DIR}/cmake" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/modules" - "${CMAKE_CURRENT_SOURCE_DIR}/cmake/platforms") - -include (syscheck) -project (open_amp C) - -include (CheckIncludeFiles) -include (CheckCSourceCompiles) -include (collect) -include (options) -include (depends) -enable_testing () - -set (OPENAMP_ROOT_DIR "${CMAKE_CURRENT_SOURCE_DIR}") -set (OPENAMP_BIN_ROOT "${CMAKE_CURRENT_BINARY_DIR}") - -if (WITH_OBSOLETE) - add_subdirectory (obsolete) -endif (WITH_OBSOLETE) - -add_subdirectory (lib) - -if (WITH_APPS) - add_subdirectory (apps) -endif (WITH_APPS) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/LICENSE.md b/ext/lib/ipc/open-amp/open-amp/LICENSE.md deleted file mode 100644 index 41a8b8ad44..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/LICENSE.md +++ /dev/null @@ -1,69 +0,0 @@ -Software License Agreement (BSD 3-Clause License) -======================================== - -Copyright (c) 2014, Mentor Graphics Corporation. All rights reserved. -Copyright (c) 2015 - 2016 Xilinx, Inc. All rights reserved. -Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, - this list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -3. Neither the name of nor the names of its contributors - may be used to endorse or promote products derived from this software - without specific prior written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE -ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE -LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR -CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF -SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS -INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN -CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) -ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE -POSSIBILITY OF SUCH DAMAGE. - -BSD 2-Clause License -------------------------- - -Copyright (c) . All rights reserved. - -Redistribution and use in source and binary forms, with or without -modification, are permitted provided that the following conditions are met: - -1. Redistributions of source code must retain the above copyright notice, this - list of conditions and the following disclaimer. - -2. Redistributions in binary form must reproduce the above copyright notice, - this list of conditions and the following disclaimer in the documentation - and/or other materials provided with the distribution. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE -FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL -DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR -SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER -CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, -OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - -Notes -========================================= -Use the following tag instead of the full license text in the individual files: - - SPDX-License-Identifier: BSD-3-Clause - SPDX-License-Identifier: BSD-2-Clause - -This enables machine processing of license information based on the SPDX -License Identifiers that are here available: http://spdx.org/licenses/ - diff --git a/ext/lib/ipc/open-amp/open-amp/MAINTAINERS.md b/ext/lib/ipc/open-amp/open-amp/MAINTAINERS.md deleted file mode 100644 index 69372fd981..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/MAINTAINERS.md +++ /dev/null @@ -1,22 +0,0 @@ -# OpenAMP Maintainers - -OpenAMP project is maintained by the OpenAMP open source community. Everyone -is encouraged to submit issues and changes to improve OpenAMP. - -The intention of this file is to provide a set of names that developers can -consult when they have a question about OpenAMP and to provide a a set of -names to be CC'd when submitting a patch. - - -## Project Administration -Wendy Liang - -### All patches CC here -open-amp@googlegroups.com - -## Machines -### Xilinx Platform - Zynq-7000 -Wendy Liang - -### Xilinx Platform - Zynq UltraScale+ MPSoC -Wendy Liang diff --git a/ext/lib/ipc/open-amp/open-amp/README.md b/ext/lib/ipc/open-amp/open-amp/README.md deleted file mode 100644 index a2c1583659..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/README.md +++ /dev/null @@ -1,242 +0,0 @@ -# open-amp -This repository is the home for the Open Asymmetric Multi Processing (OpenAMP) -framework project. The OpenAMP framework provides software components that -enable development of software applications for Asymmetric Multiprocessing -(AMP) systems. The framework provides the following key capabilities. - -1. Provides Life Cycle Management, and Inter Processor Communication - capabilities for management of remote compute resources and their associated - software contexts. -2. Provides a stand alone library usable with RTOS and Baremetal software - environments -3. Compatibility with upstream Linux remoteproc and rpmsg components -4. Following AMP configurations supported - a. Linux master/Generic(Baremetal) remote - b. Generic(Baremetal) master/Linux remote -5. Proxy infrastructure and supplied demos showcase ability of proxy on master - to handle printf, scanf, open, close, read, write calls from Bare metal - based remote contexts. - -## OpenAMP Source Structure -``` -|- lib/ -| |- common/ # common helper functions -| |- virtio/ # virtio implementation -| |- rpmsg/ # rpmsg implementation -| |- remoteproc/ # remoteproc implementation -| | |- drivers # remoteproc drivers -| |- proxy/ # implement one processor access device on the -| | # other processor with file operations -|- apps/ # demonstration/testing applications -| |- machine/ # common files for machine can be shared by applications -| # It is up to each app to decide whether to use these files. -| |- system/ # common files for system can be shared by applications -| # It is up to each app to decide whether to use these files. -|- obsolete # It is used to build libs which may also required when -| # building the apps. It will be removed in future since -| # user can specify which libs to use when compiling the apps. -|- cmake # CMake files -``` - -OpenAMP library libopen_amp is composed of the following directories in `lib/`: -* `common/` -* `virtio/` -* `rpmsg/` -* `remoteproc/` -* `proxy/` - -OpenAMP system/machine support has been moved to libmetal, the system/machine -layer in the `apps/` directory is for system application initialization, and -resource table definition. - -### libmetal APIs used in OpenAMP -Here are the libmetal APIs used by OpenAMP, if you want to port OpenAMP for your -system, you will need to implement the following libmetal APIs in the libmetal's -`lib/system/` directory: -* alloc, for memory allocation and memory free -* cache, for flushing cache and invalidating cache -* io, for memory mapping. OpenAMP required memory mapping in order to access - vrings and carved out memory. -* irq, for IRQ handler registration, IRQ disable/enable and global IRQ handling. -* mutex -* shmem (For RTOS, you can usually use the implementation from - `lib/system/generic/`) -* sleep, at the moment, OpenAMP only requires microseconds sleep as when OpenAMP - fails to get a buffer to send messages, it will call this function to sleep and - then try again. -* time, for timestamp -* init, for libmetal initialization. -* atomic - -Please refer to `lib/system/generic` when you port libmetal for your system. - -If you a different compiler to GNU gcc, please refer to `lib/compiler/gcc/` to -port libmetal for your compiler. At the moment, OpenAMP needs the atomic -operations defined in `lib/compiler/gcc/atomic.h`. - -## OpenAMP Compilation -OpenAMP uses CMake for library and demonstration application compilation. -OpenAMP requires libmetal library. For now, you will need to download and -compile libmetal library separately before you compiling OpenAMP library. -In future, we will try to make libmetal as a submodule to OpenAMP to make this -flow easier. - -### Example to compile OpenAMP for Zephyr -You can compile OpenAMP library for Zephyr. -As OpenAMP uses libmetal, please refer to libmetal README to build libmetal -for Zephyr before building OpenAMP library for Zephyr. -As Zephyr uses CMake, we build OpenAMP library as a target of Zephyr CMake -project. Here is how to build libmetal for Zephyr: -``` - $ export ZEPHRY_GCC_VARIANT=zephyr - $ export ZEPHRY_SDK_INSTALL_DIR= - $ source /zephyr-env.sh - - $ cmake \ - -DWITH_ZEPHYR=on -DBOARD=qemu_cortex_m3 \ - -DCMAKE_INCLUDE_PATH="/lib/include" \ - -DCMAKE_LIBRARY_PATH="/lib" \ - $ make VERBOSE=1 all -``` - -### Example to compile OpenAMP for communication between Linux processes: -* Install libsysfs devel and libhugetlbfs devel packages on your Linux host. -* build libmetal library on your host as follows: - - ``` - $ mkdir -p build-libmetal - $ cd build-libmetal - $ cmake - $ make VERBOSE=1 DESTDIR= install - ``` - -* build OpenAMP library on your host as follows: - - $ mkdir -p build-openamp - $ cd build-openamp - $ cmake -DCMAKE_INCLUDE_PATH= \ - -DCMAKE_LIBRARY_PATH= [-DWITH_APPS=ON] - $ make VERBOSE=1 DESTDIR=$(pwd) install - -The OpenAMP library will be generated to `build/usr/local/lib` directory, -headers will be generated to `build/usr/local/include` directory, and the -applications executable will be generated to `build/usr/local/bin` -directory. - -* cmake option `-DWITH_APPS=ON` is to build the demonstration applications. -* If you have used `-DWITH_APPS=ON` to build the demos, you can try them on - your Linux host as follows: - - ``` - # Start echo test server to wait for message to echo - $ sudo LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib \ - build/usr/local/bin/rpmsg-echo-shared - # Run echo test to send message to echo test server - $ sudo LD_LIBRARY_PATH=/usr/local/lib:/usr/local/lib \ - build/usr/local/bin/rpmsg-echo-ping-shared 1 - ``` - -### Example to compile Zynq UltraScale+ MPSoC R5 generic(baremetal) remote: -* build libmetal library on your host as follows: - * Create your on cmake toolchain file to compile libmetal for your generic - (baremetal) platform. Here is the example of the toolchain file: - - ``` - set (CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "") - set (MACHINE "zynqmp_r5" CACHE STRING "") - - set (CROSS_PREFIX "armr5-none-eabi-" CACHE STRING "") - set (CMAKE_C_FLAGS "-mfloat-abi=soft -mcpu=cortex-r5 -Wall -Werror -Wextra \ - -flto -Os -I/ws/xsdk/r5_0_bsp/psu_cortexr5_0/include" CACHE STRING "") - - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") - SET(CMAKE_AR "gcc-ar" CACHE STRING "") - SET(CMAKE_C_ARCHIVE_CREATE " qcs ") - SET(CMAKE_C_ARCHIVE_FINISH true) - - include (cross-generic-gcc) - ``` - - * Compile libmetal library: - - ``` - $ mkdir -p build-libmetal - $ cd build-libmetal - $ cmake -DCMAKE_TOOLCHAIN_FILE= - $ make VERBOSE=1 DESTDIR= install - ``` - -* build OpenAMP library on your host as follows: - * Create your on cmake toolchain file to compile openamp for your generic - (baremetal) platform. Here is the example of the toolchain file: - ``` - set (CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "") - set (MACHINE "zynqmp_r5" CACHE STRING "") - set (CROSS_PREFIX "armr5-none-eabi-" CACHE STRING "") - set (CMAKE_C_FLAGS "-mfloat-abi=soft -mcpu=cortex-r5 -Os -flto \ - -I/ws/libmetal-r5-generic/usr/local/include \ - -I/ws/xsdk/r5_0_bsp/psu_cortexr5_0/include" CACHE STRING "") - set (CMAKE_ASM_FLAGS "-mfloat-abi=soft -mcpu=cortex-r5" CACHE STRING "") - set (PLATFORM_LIB_DEPS "-lxil -lc -lm" CACHE STRING "") - SET(CMAKE_EXE_LINKER_FLAGS "${CMAKE_EXE_LINKER_FLAGS} -flto") - SET(CMAKE_AR "gcc-ar" CACHE STRING "") - SET(CMAKE_C_ARCHIVE_CREATE " qcs ") - SET(CMAKE_C_ARCHIVE_FINISH true) - set (CMAKE_FIND_ROOT_PATH /ws/libmetal-r5-generic/usr/local/lib \ - /ws/xsdk/r5_bsp/psu_cortexr5_0/lib ) - - include (cross_generic_gcc) - ``` - - * We use cmake `find_path` and `find_library` to check if libmetal includes - and libmetal library is in the includes and library search paths. However, - for non-linux system, it doesn't work with `CMAKE_INCLUDE_PATH` and - `CMAKE_LIBRARY_PATH` variables, and thus, we need to specify those paths - in the toolchain file with `CMAKE_C_FLAGS` and `CMAKE_FIND_ROOT_PATH`. -* Compile the OpenAMP library: - - ``` - $ mkdir -p build-openamp - $ cd build-openamp - $ cmake -DCMAKE_TOOLCHAIN_FILE= - $ make VERBOSE=1 DESTDIR=$(pwd) install - ``` - -The OpenAMP library will be generated to `build/usr/local/lib` directory, -headers will be generated to `build/usr/local/include` directory, and the -applications executable will be generated to `build/usr/local/bin` -directory. - - -### Example to compile OpenAMP Linux Userspace for Zynq UltraScale+ MPSoC -We can use yocto to build the OpenAMP Linux userspace library and application. -open-amp and libmetal recipes are in this yocto layer: -https://github.com/OpenAMP/meta-openamp -* Add the `meta-openamp` layer to your layers in your yocto build project's `bblayers.conf` file. -* Add `libmetal` and `open-amp` to your packages list. E.g. add `libmetal` and `open-amp` to the - `IMAGE_INSTALL_append` in the `local.conf` file. -* You can also add OpenAMP demos Linux applications packages to your yocto packages list. OpenAMP - demo examples recipes are also in `meta-openamp`: - https://github.com/OpenAMP/meta-openamp/tree/master/recipes-openamp/openamp-examples - -In order to user OpenAMP(RPMsg) in Linux userspace, you will need to have put the IPI device, - vring memory and shared buffer memory to your Linux kernel device tree. The device tree example - can be found here: - https://github.com/OpenAMP/open-amp/blob/master/apps/machine/zynqmp/openamp-linux-userspace.dtsi - -## Supported System and Machines -For now, it supports: -* Zynq generic slave -* Zynq UltraScale+ MPSoC R5 generic slave -* Linux host OpenAMP between Linux userspace processes -* Linux userspace OpenAMP RPMsg master -* Linux userspace OpenAMP RPMsg slave - -## Known Limitations: -1. In case of OpenAMP on Linux userspace for inter processors communication, - it only supports static vrings and shared buffers. -2. `sudo` is required to run the OpenAMP demos between Linux processes, as - it doesn't work on some systems if you are normal users. - -For using the framework please refer to the wiki of the OpenAMP repo. -Subscribe to the open-amp mailing list at https://groups.google.com/group/open-amp. diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/collect.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/collect.cmake deleted file mode 100644 index d1bd17814c..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/collect.cmake +++ /dev/null @@ -1,40 +0,0 @@ -function (collector_create name base) - set_property (GLOBAL PROPERTY "COLLECT_${name}_LIST") - set_property (GLOBAL PROPERTY "COLLECT_${name}_BASE" "${base}") -endfunction (collector_create) - -function (collector_list var name) - get_property (_list GLOBAL PROPERTY "COLLECT_${name}_LIST") - set (${var} "${_list}" PARENT_SCOPE) -endfunction (collector_list) - -function (collector_base var name) - get_property (_base GLOBAL PROPERTY "COLLECT_${name}_BASE") - set (${var} "${_base}" PARENT_SCOPE) -endfunction (collector_base) - -function (collect name) - collector_base (_base ${name}) - string(COMPARE NOTEQUAL "${_base}" "" _is_rel) - set (_list) - foreach (s IN LISTS ARGN) - if (_is_rel) - get_filename_component (s "${s}" ABSOLUTE) - file (RELATIVE_PATH s "${_base}" "${s}") - else (_is_rel) - get_filename_component (ts "${s}" ABSOLUTE) - if (EXISTS "${ts}") - set (s "${ts}") - endif (EXISTS "${ts}") - endif (_is_rel) - list (APPEND _list "${s}") - endforeach () - set_property (GLOBAL APPEND PROPERTY "COLLECT_${name}_LIST" "${_list}") -endfunction (collect) - -# Create global collectors -collector_create (PROJECT_INC_DIRS "") -collector_create (PROJECT_LIB_DIRS "") -collector_create (PROJECT_LIB_DEPS "") - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/depends.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/depends.cmake deleted file mode 100644 index db27a60ee2..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/depends.cmake +++ /dev/null @@ -1,23 +0,0 @@ -if (WITH_LIBMETAL_FIND) - find_package (Libmetal REQUIRED) - collect (PROJECT_INC_DIRS "${LIBMETAL_INCLUDE_DIR}") - collect (PROJECT_LIB_DIRS "${LIBMETAL_LIB_DIR}") - collect (PROJECT_LIB_DEPS "${LIBMETAL_LIB}") -endif (WITH_LIBMETAL_FIND) - -if ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") - check_include_files (stdatomic.h HAVE_STDATOMIC_H) - check_include_files (fcntl.h HAVE_FCNTL_H) -else ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") - set (_saved_cmake_required_flags ${CMAKE_REQUIRED_FLAGS}) - set (CMAKE_REQUIRED_FLAGS "-c") - check_include_files (stdatomic.h HAVE_STDATOMIC_H) - check_include_files (fcntl.h HAVE_FCNTL_H) - set (CMAKE_REQUIRED_FLAGS ${_saved_cmake_required_flags}) -endif ("${CMAKE_SYSTEM_NAME}" STREQUAL "Linux") - -if (NOT HAVE_FCNTL_H) - unset (WITH_PROXY CACHE) -endif (NOT HAVE_FCNTL_H) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/modules/FindLibmetal.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/modules/FindLibmetal.cmake deleted file mode 100644 index 01699bce31..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/modules/FindLibmetal.cmake +++ /dev/null @@ -1,31 +0,0 @@ -# FindLibmetal -# -------- -# -# Find Libmetal -# -# Find the native Libmetal includes and library this module defines -# -# :: -# -# LIBMETAL_INCLUDE_DIR, where to find metal/sysfs.h, etc. -# LIBSYSFS_LIB_DIR, where to find libmetal library. - -# FIX ME, CMAKE_FIND_ROOT_PATH doesn't work -# even use the following -# set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY BOTH) -# set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE BOTH) -# set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM BOTH) -find_path(LIBMETAL_INCLUDE_DIR NAMES metal/sys.h PATHS ${CMAKE_FIND_ROOT_PATH}) -find_library(LIBMETAL_LIB NAMES metal PATHS ${CMAKE_FIND_ROOT_PATH}) -get_filename_component(LIBMETAL_LIB_DIR ${LIBMETAL_LIB} DIRECTORY) - -# handle the QUIETLY and REQUIRED arguments and set HUGETLBFS_FOUND to TRUE if -# all listed variables are TRUE -include (FindPackageHandleStandardArgs) -FIND_PACKAGE_HANDLE_STANDARD_ARGS (LIBMETAL DEFAULT_MSG LIBMETAL_LIB LIBMETAL_INCLUDE_DIR) - -if (LIBMETAL_FOUND) - set (LIBMETAL_LIBS ${LIBMETAL_LIB}) -endif (LIBMETAL_FOUND) - -mark_as_advanced (LIBMETAL_LIB LIBMETAL_INCLUDE_DIR LIBMETAL_LIB_DIR) diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/options.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/options.cmake deleted file mode 100644 index 42762b1243..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/options.cmake +++ /dev/null @@ -1,73 +0,0 @@ -set (PROJECT_VER_MAJOR 0) -set (PROJECT_VER_MINOR 1) -set (PROJECT_VER_PATCH 0) -set (PROJECT_VER 0.1.0) - -if (NOT CMAKE_BUILD_TYPE) - set (CMAKE_BUILD_TYPE Debug) -endif (NOT CMAKE_BUILD_TYPE) - -if (NOT CMAKE_INSTALL_LIBDIR) - set (CMAKE_INSTALL_LIBDIR "lib") -endif (NOT CMAKE_INSTALL_LIBDIR) - -if (NOT CMAKE_INSTALL_BINDIR) - set (CMAKE_INSTALL_BINDIR "bin") -endif (NOT CMAKE_INSTALL_BINDIR) - -set (_host "${CMAKE_HOST_SYSTEM_NAME}/${CMAKE_HOST_SYSTEM_PROCESSOR}") -message ("-- Host: ${_host}") - -set (_target "${CMAKE_SYSTEM_NAME}/${CMAKE_SYSTEM_PROCESSOR}") -message ("-- Target: ${_target}") - -if (NOT DEFINED MACHINE) - set (MACHINE "Generic") -endif (NOT DEFINED MACHINE) -message ("-- Machine: ${MACHINE}") - -string (TOLOWER ${CMAKE_SYSTEM_NAME} PROJECT_SYSTEM) -string (TOUPPER ${CMAKE_SYSTEM_NAME} PROJECT_SYSTEM_UPPER) -string (TOLOWER ${CMAKE_SYSTEM_PROCESSOR} PROJECT_PROCESSOR) -string (TOUPPER ${CMAKE_SYSTEM_PROCESSOR} PROJECT_PROCESSOR_UPPER) -string (TOLOWER ${MACHINE} PROJECT_MACHINE) -string (TOUPPER ${MACHINE} PROJECT_MACHINE_UPPER) - -# Select which components are in the openamp lib -option (WITH_PROXY "Build with proxy(access device controlled by other processor)" ON) -option (WITH_APPS "Build with sample applicaitons" OFF) -option (WITH_PROXY_APPS "Build with proxy sample applicaitons" OFF) -if (WITH_APPS) - if (WITH_PROXY) - set (WITH_PROXY_APPS ON) - endif (WITH_PROXY) -endif (WITH_APPS) - -option (WITH_VIRTIO_MASTER "Build with virtio master enabled" ON) -option (WITH_VIRTIO_SLAVE "Build with virtio slave enabled" ON) - -if (NOT WITH_VIRTIO_MASTER) - add_definitions(-DVIRTIO_SLAVE_ONLY) -endif (NOT WITH_VIRTIO_MASTER) - -if (NOT WITH_VIRTIO_SLAVE) - add_definitions(-DVIRTIO_MASTER_ONLY) -endif (NOT WITH_VIRTIO_SLAVE) - -# Set the complication flags -set (CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -Wall -Wextra") - -option (WITH_STATIC_LIB "Build with a static library" ON) - -if ("${PROJECT_SYSTEM}" STREQUAL "linux") - option (WITH_SHARED_LIB "Build with a shared library" ON) -endif ("${PROJECT_SYSTEM}" STREQUAL "linux") - -if (WITH_ZEPHYR) - option (WITH_ZEPHYR_LIB "Build open-amp as a zephyr library" OFF) -endif (WITH_ZEPHYR) - -option (WITH_LIBMETAL_FIND "Check Libmetal library can be found" ON) - -message ("-- C_FLAGS : ${CMAKE_C_FLAGS}") -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/cross_generic_gcc.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/cross_generic_gcc.cmake deleted file mode 100644 index 99a0d713c9..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/cross_generic_gcc.cmake +++ /dev/null @@ -1,12 +0,0 @@ -set (CMAKE_SYSTEM_NAME "Generic" CACHE STRING "") - -include (CMakeForceCompiler) - -CMAKE_FORCE_C_COMPILER ("${CROSS_PREFIX}gcc" GNU) -CMAKE_FORCE_CXX_COMPILER ("${CROSS_PREFIX}g++" GNU) - -set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER CACHE STRING "") -set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER CACHE STRING "") -set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER CACHE STRING "") - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/cross_linux_gcc.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/cross_linux_gcc.cmake deleted file mode 100644 index a7e2f6f851..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/cross_linux_gcc.cmake +++ /dev/null @@ -1,9 +0,0 @@ -set (CMAKE_SYSTEM_NAME "Linux") -set (CMAKE_C_COMPILER "${CROSS_PREFIX}gcc") -set (CMAKE_CXX_COMPILER "${CROSS_PREFIX}g++") - -set (CMAKE_FIND_ROOT_PATH_MODE_PROGRAM NEVER) -set (CMAKE_FIND_ROOT_PATH_MODE_LIBRARY NEVER) -set (CMAKE_FIND_ROOT_PATH_MODE_INCLUDE NEVER) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynq7_generic.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynq7_generic.cmake deleted file mode 100644 index a42219604e..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynq7_generic.cmake +++ /dev/null @@ -1,8 +0,0 @@ -set (CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "") -set (MACHINE "zynq7" CACHE STRING "") -set (CROSS_PREFIX "arm-none-eabi-" CACHE STRING "") -set (CMAKE_C_FLAGS "-mcpu=cortex-a9 -mfpu=vfpv3 -mfloat-abi=hard" CACHE STRING "") - -include (cross_generic_gcc) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynq7_linux.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynq7_linux.cmake deleted file mode 100644 index 9a69973c9c..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynq7_linux.cmake +++ /dev/null @@ -1,6 +0,0 @@ -set (CMAKE_SYSTEM_PROCESSOR "arm") -set (CROSS_PREFIX "arm-xilinx-linux-gnueabi-") - -include (cross-linux-gcc) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_a53_generic.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_a53_generic.cmake deleted file mode 100644 index 8ece0cc6a2..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_a53_generic.cmake +++ /dev/null @@ -1,6 +0,0 @@ -set (CMAKE_SYSTEM_PROCESSOR "arm64") -set (CROSS_PREFIX "aarch64-none-elf-") - -include (cross_generic_gcc) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_linux.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_linux.cmake deleted file mode 100644 index bed0928e83..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_linux.cmake +++ /dev/null @@ -1,7 +0,0 @@ -set (CMAKE_SYSTEM_PROCESSOR "arm64") -set (CROSS_PREFIX "aarch64-linux-gnu-") -set (MACHINE "zynqmp" CACHE STRING "") - -include (cross_linux_gcc) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_r5_generic.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_r5_generic.cmake deleted file mode 100644 index 5806a0dc50..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/platforms/zynqmp_r5_generic.cmake +++ /dev/null @@ -1,10 +0,0 @@ -set (CMAKE_SYSTEM_PROCESSOR "arm" CACHE STRING "") -set (MACHINE "zynqmp_r5" CACHE STRING "") -set (CROSS_PREFIX "armr5-none-eabi-" CACHE STRING "") - -# Xilinx SDK version earlier than 2017.2 use mfloat-abi=soft by default to generat libxil -set (CMAKE_C_FLAGS "-mfloat-abi=hard -mfpu=vfpv3-d16 -mcpu=cortex-r5" CACHE STRING "") - -include (cross_generic_gcc) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/cmake/syscheck.cmake b/ext/lib/ipc/open-amp/open-amp/cmake/syscheck.cmake deleted file mode 100644 index b503b69289..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/cmake/syscheck.cmake +++ /dev/null @@ -1,13 +0,0 @@ -# use "Generic" as CMAKE_SYSTEM_NAME - -if (WITH_ZEPHYR) - set (CMAKE_SYSTEM_NAME "Generic" CACHE STRING "") - string (TOLOWER "Zephyr" PROJECT_SYSTEM) - string (TOUPPER "Zephyr" PROJECT_SYSTEM_UPPER) - if (NOT WITH_ZEPHYR_LIB) - include($ENV{ZEPHYR_BASE}/cmake/app/boilerplate.cmake NO_POLICY_SCOPE) - endif () - if (CONFIG_CPU_CORTEX_M) - set (MACHINE "cortexm" CACHE STRING "") - endif (CONFIG_CPU_CORTEX_M) -endif (WITH_ZEPHYR) diff --git a/ext/lib/ipc/open-amp/open-amp/docs/apps/echo_test/README.md b/ext/lib/ipc/open-amp/open-amp/docs/apps/echo_test/README.md deleted file mode 100644 index a004bbfdf8..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/apps/echo_test/README.md +++ /dev/null @@ -1,58 +0,0 @@ - -# echo_test -This readme is about the OpenAMP echo_test demo. -The echo_test is about one processor sends message to the other one, and the other one echo back the message. The processor which sends the message will verify the echo message. - -For now, it implements Linux sends the message, and the baremetal echos back. - -## Compilation - -### Baremetal Compilation -Option `WITH_ECHO_TEST` is to control if the application will be built. -By default this option is `ON` when `WITH_APPS` is on. - -Here is an example: - -``` -$ cmake ../open-amp -DCMAKE_TOOLCHAIN_FILE=zynq7_generic -DWITH_OBSOLETE=on -DWITH_APPS=ON -``` - -### Linux Compilation - -#### Linux Kernel Compilation -You will need to manually compile the following kernel modules with your Linux kernel (Please refer to Linux kernel documents for how to add kernel module): - -* Your machine's remoteproc kernel driver -* `obsolete/apps/echo_test/system/linux/kernelspace/rpmsg_user_dev_driver` if you want to run the echo_test app in Linux user space. -* `obsolete/system/linux/kernelspace/rpmsg_echo_test_kern_app` if you want to run the echo_test app in Linux kernel space. - -#### Linux Userspace Compliation -* Compile `obsolete/apps/echo_test/system/linux/userspace/echo_test` into your Linux OS. -* If you are running generic(baremetal) system as remoteproc slave, and Linux as remoteproc master, please also add the built generic `echo_test` executable to the firmware of your Linux OS. - -## Run the Demo - -### Load the Demo -After Linux boots, -* Load the machine remoteproc. If Linux runs as remoteproc master, you will need to pass the other processor's echo_test binary as firmware arguement to the remoteproc module. -* If you run the Linux kernel application demo, load the `rpmsg_echo_test_kern_app` module. You will see the kernel application send the message to remote and the remote reply back and the kernel application will verify the result. -* If you run the userspace application demo, load the `rpmsg_user_dev_driver` module. -* If you run the userspace application demo, you will see the similar output on the console: -``` -**************************************** - Please enter command and press enter key - **************************************** - 1 - Send data to remote core, retrieve the echo and validate its integrity .. - 2 - Quit this application .. - CMD> -``` -* Input `1` to send packages. -* Input `2` to exit the application. - -After you run the demo, you will need to unload the kernel modules. - -### Unload the Demo -* If you run the userspace application demo, unload the `rpmsg_user_dev_driver` module. -* If you run the kernelspace application demo, unload the `rpmsg_echo_test_kern_app` module. -* Unload the machine remoteproc driver. - diff --git a/ext/lib/ipc/open-amp/open-amp/docs/apps/matrix_multiply/README.md b/ext/lib/ipc/open-amp/open-amp/docs/apps/matrix_multiply/README.md deleted file mode 100644 index ea4b08c5c9..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/apps/matrix_multiply/README.md +++ /dev/null @@ -1,59 +0,0 @@ - -# matrix_multiply -This readme is about the OpenAMP matrix_multiply demo. -The matrix_multiply is about one processor generates two matrices, and send them to the one, and the other one calcuate the matrix multiplicaiton and return the result matrix. - -For now, it implements Linux generates the matrices, and the baremetal calculate the matrix mulitplication and send back the result. - -## Compilation - -### Baremetal Compilation -Option `WITH_MATRIX_MULTIPLY` is to control if the application will be built. -By default this option is `ON` when `WITH_APPS` is on. - -Here is an example: - -``` -$ cmake ../open-amp -DCMAKE_TOOLCHAIN_FILE=zynq7_generic -DWITH_OBSOLETE=on -DWITH_APPS=ON -``` - -### Linux Compilation - -#### Linux Kernel Compilation -You will need to manually compile the following kernel modules with your Linux kernel (Please refer to Linux kernel documents for how to add kernel module): - -* Your machine's remoteproc kernel driver -* `obsolete/system/linux/kernelspace/rpmsg_user_dev_driver` if you want to run the matrix_multiply app in Linux user space. -* `obsolete/apps/matrix_multiply/system/linux/kernelspace/rpmsg_mat_mul_kern_app` if you want to run the matrix_multiply app in Linux kernel space. - -#### Linux Userspace Compliation -* Compile `obsolete/apps/matrix_multiply/system/linux/userspace/mat_mul_demo` into your Linux OS. -* If you are running generic(baremetal) system as remoteproc slave, and Linux as remoteproc master, please also add the built generic `matrix_multiply` executable to the firmware of your Linux OS. - -## Run the Demo - -### Load the Demo -After Linux boots, -* Load the machine remoteproc. If Linux runs as remoteproc master, you will need to pass the other processor's matrix_multiply binary as firmware arguement to the remoteproc module. -* If you run the Linux kernel application demo, load the `rpmsg_mat_mul_kern_app` module, you will see the kernel app will generate two matrices to the other processor, and output the result matrix returned by the other processor. -* If you run the userspace application demo, load the `rpmsg_user_dev_driver` module. -* If you run the userspace application demo `mat_mul_demo`, you will see the similar output on the console: -``` -**************************************** -Please enter command and press enter key -**************************************** -1 - Generates random 6x6 matrices and transmits them to remote core over rpmsg -.. -2 - Quit this application .. -CMD> -``` -* Input `1` to run the matrix multiplication. -* Input `2` to exit the application. - -After you run the demo, you will need to unload the kernel modules. - -### Unload the Demo -* If you run the userspace application demo, unload the `rpmsg_user_dev_driver` module. -* If you run the kernelspace application demo, unload the `rpmsg_mat_mul_kern_app` module. -* Unload the machine remoteproc driver. - diff --git a/ext/lib/ipc/open-amp/open-amp/docs/apps/rpc_demo/README.md b/ext/lib/ipc/open-amp/open-amp/docs/apps/rpc_demo/README.md deleted file mode 100644 index d3939188f5..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/apps/rpc_demo/README.md +++ /dev/null @@ -1,38 +0,0 @@ - -# rpc_demo -This readme is about the OpenAMP rpc_demo demo. -The rpc_demo is about one processor uses the UART on the other processor and create file on the other processor's filesystem with file operations. - -For now, It implements the processor running generic(baremetal) applicaiton access the devices on the Linux. - -## Compilation - -### Baremetal Compilation -Option `WITH_RPC_DEMO` is to control if the application will be built. -By default this option is `ON` when `WITH_APPS` is on. - -Here is an example: - -``` -$ cmake ../open-amp -DCMAKE_TOOLCHAIN_FILE=zynq7_generic -DWITH_OBSOLETE=on -DWITH_APPS=ON -``` - -### Linux Compilation - -#### Linux Kernel Compilation -You will need to manually compile the following kernel modules with your Linux kernel (Please refer to Linux kernel documents for how to add kernel module): - -* Your machine's remoteproc kernel driver -* `obsolete/apps/rpc_demo/system/linux/kernelspace/rpmsg_proxy_dev_driver` - -#### Linux Userspace Compliation -* Compile `obsolete/apps/rpc_demo/system/linux/userspace/proxy_app` into your Linux OS. -* Add the built generic `rpc_demo` executable to the firmware of your Linux OS. - -## Run the Demo -After Linux boots, run `proxy_app` as follows: -``` -# proxy_app [-m REMOTEPROC_MODULE] [-f PATH_OF_THE_RPC_DEMO_FIRMWARE] -``` - -The demo application will load the remoteproc module, then the proxy rpmsg module, will output message sent from the other processor, send the console input back to the other processor. When the demo application exits, it will unload the kernel modules. diff --git a/ext/lib/ipc/open-amp/open-amp/docs/data-structure.md b/ext/lib/ipc/open-amp/open-amp/docs/data-structure.md deleted file mode 100644 index 4ea6197d7c..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/data-structure.md +++ /dev/null @@ -1,168 +0,0 @@ -Libmetal helper data struct -=========================== -``` -struct metal_io_region { - char name[64]; /**< I/O region name */ - void *virt; /**< base virtual address */ - const metal_phys_addr_t *physmap; /**< table of base physical address - of each of the pages in the I/O - region */ - size_t size; /**< size of the I/O region */ - unsigned long page_shift; /**< page shift of I/O region */ - metal_phys_addr_t page_mask; /**< page mask of I/O region */ - unsigned int mem_flags; /**< memory attribute of the - I/O region */ - struct metal_io_ops ops; /**< I/O region operations */ -}; - - -/** Libmetal device structure. */ -struct metal_device { - const char *name; /**< Device name */ - struct metal_bus *bus; /**< Bus that contains device */ - unsigned num_regions; /**< Number of I/O regions in - device */ - struct metal_io_region regions[METAL_MAX_DEVICE_REGIONS]; /**< Array of - I/O regions in device*/ - struct metal_list node; /**< Node on bus' list of devices */ - int irq_num; /**< Number of IRQs per device */ - void *irq_info; /**< IRQ ID */ -}; -``` - -Remoteproc data struct -=========================== -``` -struct remoteproc { - struct metal_device dev; /**< Each remoteproc has a device, each device knows its memories regions */ - metal_mutex_t lock; /**< mutex lock */ - void *rsc_table; /**< pointer to resource table */ - size_t rsc_len; /**< length of the resoruce table */ - struct remoteproc_ops *ops; /**< pointer to remoteproc operation */ - metal_phys_addr_t bootaddr; /**< boot address */ - struct loader_ops *loader_ops; /**< image loader operation */ - unsigned int state; /**< remoteproc state */ - struct metal_list vdevs; /**< list of vdevs (can we limited to one for code size but linux and resource table supports multiple */ - void *priv; /**< remoteproc private data */ -}; - -struct remoteproc_vdev { - struct metal_list node; /**< node */ - struct remoteproc *rproc; /**< pointer to the remoteproc instance */ - struct virtio_dev; /**< virtio device */ - uint32_t notify_id; /**< virtio device notification ID */ - void *vdev_rsc; /**< pointer to the vdev space in resource table */ - struct metal_io_region *vdev_io; /**< pointer to the vdev space I/O region */ - int vrings_num; /**< number of vrings */ - struct rproc_vrings[1]; /**< vrings array */ -}; - -struct remoteproc_vring { - struct remoteproc_vdev *rpvdev; /**< pointer to the remoteproc vdev */ - uint32_t notify_id; /**< vring notify id */ - size_t len; /**< vring length */ - uint32_t alignment; /**< vring alignment */ - void *va; /**< vring start virtual address */ - struct metal_io_region *io; /**< pointer to the vring I/O region */ -}; -``` - -Virtio Data struct -=========================== -``` -struct virtio_dev { - int index; /**< unique position on the virtio bus */ - struct virtio_device_id id; /**< the device type identification (used to match it with a driver). */ - struct metal_device *dev; /**< do we need this in virtio device ? */ - metal_spinlock lock; /**< spin lock */ - uint64_t features; /**< the features supported by both ends. */ - unsigned int role; /**< if it is virtio backend or front end. */ - void (*rst_cb)(struct virtio_dev *vdev); /**< user registered virtio device callback */ - void *priv; /**< pointer to virtio_dev private data */ - int vrings_num; /**< number of vrings */ - struct virtqueue vqs[1]; /**< array of virtqueues */ -}; - -struct virtqueue { - char vq_name[VIRTQUEUE_MAX_NAME_SZ]; /**< virtqueue name */ - struct virtio_device *vdev; /**< pointer to virtio device */ - uint16_t vq_queue_index; - uint16_t vq_nentries; - uint32_t vq_flags; - int vq_alignment; - int vq_ring_size; - boolean vq_inuse; - void *vq_ring_mem; - void (*callback) (struct virtqueue * vq); /**< virtqueue callback */ - void (*notify) (struct virtqueue * vq); /**< virtqueue notify remote function */ - int vq_max_indirect_size; - int vq_indirect_mem_size; - struct vring vq_ring; - uint16_t vq_free_cnt; - uint16_t vq_queued_cnt; - struct metal_io_region *buffers_io; /**< buffers shared memory */ - - /* - * Head of the free chain in the descriptor table. If - * there are no free descriptors, this will be set to - * VQ_RING_DESC_CHAIN_END. - */ - uint16_t vq_desc_head_idx; - - /* - * Last consumed descriptor in the used table, - * trails vq_ring.used->idx. - */ - uint16_t vq_used_cons_idx; - - /* - * Last consumed descriptor in the available table - - * used by the consumer side. - */ - uint16_t vq_available_idx; - - uint8_t padd; - /* - * Used by the host side during callback. Cookie - * holds the address of buffer received from other side. - * Other fields in this structure are not used currently. - * Do we needed??/ - struct vq_desc_extra { - void *cookie; - struct vring_desc *indirect; - uint32_t indirect_paddr; - uint16_t ndescs; - } vq_descx[0]; -}; - -struct vring { - unsigned int num; /**< number of buffers of the vring */ - struct vring_desc *desc; - struct vring_avail *avail; - struct vring_used *used; -}; -``` -RPMsg Data struct -=========================== -``` -struct rpmsg_virtio_device { - struct virtio_dev *vdev; /**< pointer to the virtio device */ - struct virtqueue *rvq; /**< pointer to receive virtqueue */ - struct virtqueue *svq; /**< pointer to send virtqueue */ - int buffers_number; /**< number of shared buffers */ - struct metal_io_region *shbuf_io; /**< pointer to the shared buffer I/O region */ - void *shbuf; - int (*new_endpoint_cb)(const char *name, uint32_t addr); /**< name service announcement user designed callback which is used for when there is a name service announcement, there is no local endpoints waiting to bind */ - struct metal_list endpoints; /**< list of endpoints */ -}; - -struct rpmsg_endpoint { - char name[SERVICE_NAME_SIZE]; - struct rpmsg_virtio_dev *rvdev; /**< pointer to the RPMsg virtio device */ - uint32_t addr; /**< endpoint local address */ - uint32_t dest_addr; /**< endpoint default target address */ - int (*cb)(struct rpmsg_endpoint *ept, void *data, struct metal_io_region *io, size_t len, uint32_t addr); /**< endpoint callback */ - void (*destroy)(struct rpmsg_endpoint *ept); /**< user registerd endpoint destory callback */ - /* Whether we need another callback for ack ns announcement? */ -}; -``` diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-ns-dynamic.gv b/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-ns-dynamic.gv deleted file mode 100644 index 6058f10469..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-ns-dynamic.gv +++ /dev/null @@ -1,97 +0,0 @@ -// RPMsg dynamic endpoint creation - -digraph G { - rankdir="LR"; - - subgraph roles { - node [style="filled", fillcolor="lightblue"]; - master [label="Master"]; - slave [label="Slave"]; - } - - subgraph m_comment_nodes { - node [group=m_comment, shape="note", style="filled", fillcolor="yellow"]; - rank="same"; - m_remoteproc_init_comment [label="this is initialize rproc call"]; - m_remoteproc_boot_comment [label="it will setup vdev before booting the remote"]; - m_rpmsg_vdev_init_comment [label="\l* It will initialize vrings with the shared memory\l* If vdev supports name service, it will create name service endpoint;\l* it sets vdev status to DRVIER_READY, And will notify remote.\l"]; - m_rpmsg_create_ep_comment [label="\if vdev supports name service,\lit will send out name service.\l"]; - m_rpmsg_send_comment [label="\lIf endpoint hasn't binded, it fail\lreturn failure to indicate ep hasn't been binded.\l"]; - - } - - subgraph m_flow_nodes { - node [shape="box"]; - rank="same"; - m_remoteproc_init [label="rproc = remoteproc_init(&remoteproc_ops, &arg);"] - m_remoteproc_load [label="calls remoteproc_load() to load applicaiton"]; - m_remoteproc_boot [shape="box", label="ret=remoteproc_boot(&rproc)"]; - m_remoteproc_get_vdev [label="vdev=remoteproc_create_virtio(rproc, rpmsg_vdev_id, MASTER, NULL);"]; - m_rpmsg_shmpool_init[label="rpmsg_virtio_init_shm_pool(shpool, shbuf, shbuf_pool_size);"]; - m_rpmsg_vdev_init [label="rpdev=rpmsg_init_vdev(rpvdev, vdev, ns_bind_cb, &shm_io, shpool);"]; - m_rpmsg_ns_cb [label="\lrpmsg_ns_callback() will see if there is a local ep registered.\lIf yes, bind the ep; otherwise, call ns_bind_cb.\l"]; - m_rpmsg_create_ep [label="\lept=rpmsg_create_ept(ept, rdev, ept_name, ept_addr, dest_addr, \lendpoint_cb, ns_unbind_cb);\l"]; - m_rpmsg_send [label="rpmsg_send(ept,data)"]; - m_rpmsg_rx_cb [label="rpmsg_rx_callback()"]; - m_ep_cb [label="endpoint_cb(ept, data, size, src_addr)"]; - m_rpmsg_destroy_ep [label="rpmsg_destroy_endpoint(ept)"]; - - m_remoteproc_init -> m_remoteproc_load -> m_remoteproc_boot -> m_remoteproc_get_vdev -> - m_rpmsg_shmpool_init -> m_rpmsg_vdev_init -> m_rpmsg_create_ep -> m_rpmsg_ns_cb -> m_rpmsg_send; - m_rpmsg_send -> m_rpmsg_rx_cb -> m_ep_cb -> - m_rpmsg_destroy_ep [dir="none", style="dashed"]; - } - - subgraph s_flow_nodes { - rank="same"; - node [shape="box"]; - s_remoteproc_init [label="rproc = remoteproc_init(&remoteproc_ops, &arg);"]; - - s_remoteproc_parse_rsc [label="ret = remoteproc_set_rsc_table(rproc, &rsc_table, rsc_size)"]; - s_remoteproc_get_vdev [label="vdev=remoteproc_create_virtio(rproc, rpmsg_vdev_id, SLAVE, rst_cb);"]; - s_rpmsg_vdev_init [label="rpdev=rpmsg_init_vdev(rpvdev, vdev, ns_bind_cb, &shm_io, NULL);"]; - s_rpmsg_ns_cb [label="\lrpmsg_ns_callback() will see if there is a local ep registered.\lIf yes, bind the ep; otherwise, it will call ns_bind_cb()."]; - s_rpmsg_ns_bind_cb [label="s_rpsmg_ns_bind_cb(ept_name, remote_addr)"]; - s_rpmsg_create_ep [label="\lept=rpmsg_create_endpoint(ept, rdev, ept_name, ept_addr, remote_addr,\lendpoint_cb, ns_unbind_cb);\l"]; - s_rpmsg_send [label="rpmsg_send(ept,data)"]; - s_rpmsg_rx_cb [label="rpmsg_rx_callback()"]; - s_ep_cb [label="endpoint_cb(ept, data, size, src_addr)"]; - s_rpmsg_ns_unbind_cb [label="\lrpmsg_ns_callback() will call the previous\lregistered endpoint unbind callback\l"]; - - s_remoteproc_init -> s_remoteproc_parse_rsc -> s_remoteproc_get_vdev -> - s_rpmsg_vdev_init -> s_rpmsg_ns_cb -> s_rpmsg_ns_bind_cb -> - s_rpmsg_create_ep; - s_rpmsg_create_ep-> s_rpmsg_rx_cb -> s_ep_cb -> s_rpmsg_send -> - s_rpmsg_ns_unbind_cb [dir="none", style="dash"]; - - } - - subgraph s_comment_nodes { - node [group=s_comment, shape="note", style="filled", fillcolor="yellow"]; - rank="same"; - s_rpmsg_vdev_init_comment [label="\l* If vdev supports name service, it will create name service endpoint;\l* It will not return until the master set status to DRIVER READY\l"]; - s_rpmsg_rx_cb_comment [label="\l* It will look for the endpoint which matches the destination address.\lIf the two endpoints hasn't binded yet,\lit will set the local endpoint's destination address with the source address in the message\l"]; - } - - master -> m_remoteproc_init [dir="none"]; - slave -> s_remoteproc_init [dir="none"]; - s_rpmsg_create_ep -> m_rpmsg_ns_cb [label="NS annoucement"]; - m_rpmsg_create_ep -> s_rpmsg_ns_cb [label="NS annoucement"]; - m_rpmsg_send -> s_rpmsg_rx_cb [label="RPMsg data"]; - s_rpmsg_send -> m_rpmsg_rx_cb [label="RPMsg data"]; - m_rpmsg_destroy_ep -> s_rpmsg_ns_unbind_cb [label="Endpoint destroy NS"]; - - m_remoteproc_init_comment -> m_remoteproc_init [dir="none"]; - m_remoteproc_boot_comment -> m_remoteproc_boot [dir="none"]; - m_rpmsg_vdev_init_comment -> m_rpmsg_vdev_init [dir="none"]; - m_rpmsg_create_ep_comment -> m_rpmsg_create_ep [dir="none"]; - m_rpmsg_send_comment -> m_rpmsg_send [dir="none"]; - - s_rpmsg_vdev_init -> s_rpmsg_vdev_init_comment [dir="none"]; - s_rpmsg_rx_cb -> s_rpmsg_rx_cb_comment [dir="none"]; - - {rank=same; master; m_remoteproc_init} - {rank=same; slave; s_remoteproc_init} - -} - diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-ns.gv b/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-ns.gv deleted file mode 100644 index 6c9e10f3b1..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-ns.gv +++ /dev/null @@ -1,95 +0,0 @@ -// RPMsg dynamic endpoints binding - -digraph G { - rankdir="LR"; - - subgraph roles { - node [style="filled", fillcolor="lightblue"]; - master [label="Master"]; - slave [label="Slave"]; - } - - subgraph m_comment_nodes { - node [group=m_comment, shape="note", style="filled", fillcolor="yellow"]; - rank="same"; - m_remoteproc_init_comment [label="this is initialize rproc call"]; - m_remoteproc_boot_comment [label="it will setup vdev before booting the remote"]; - m_rpmsg_vdev_init_comment [label="\l* It will initialize vrings with the shared memory\l* As vdev doesn't support name service, it will not create name service endpoint;\l* it sets vdev status to DRVIER_READY, And will notify remote.\l"]; - m_rpmsg_create_ep_comment [label="\lIf vdev supports name service,\lit will send out name service.\l"]; - m_rpmsg_send_comment [label="\lIf endpoint hasn't binded, it fail\lreturn failure to indicate ep hasn't been binded.\l"]; - - } - - subgraph m_flow_nodes { - node [shape="box"]; - rank="same"; - m_remoteproc_init [label="rproc = remoteproc_init(&remoteproc_ops, &arg);"] - m_remoteproc_load [label="calls remoteproc_load() to load applicaiton"]; - m_remoteproc_boot [shape="box", label="ret=remoteproc_boot(&rproc)"]; - m_remoteproc_get_vdev [label="vdev=remoteproc_create_virtio(rproc, rpmsg_vdev_id, MASTER, NULL);"]; - m_rpmsg_shmpool_init[label="rpmsg_virtio_init_shm_pool(shpool, shbuf, shbuf_pool_size);"]; - m_rpmsg_vdev_init [label="rpdev=rpmsg_init_vdev(rpvdev, vdev, ns_bind_cb, &shm_io, shpool);"]; - m_rpmsg_ns_cb [label="\lrpmsg_ns_callback() will see if there is a local ep registered.\lIf yes, bind the ep; otherwise, call ns_bind_cb.\l"]; - m_rpmsg_create_ep [label="\lept=rpmsg_create_ept(ept, rdev, ept_name, ept_addr, dest_addr, \lendpoint_cb, ns_unbind_cb);\l"]; - m_rpmsg_send [label="rpmsg_send(ept,data)"]; - m_rpmsg_rx_cb [label="rpmsg_rx_callback()"]; - m_ep_cb [label="endpoint_cb(ept, data, size, src_addr)"]; - m_rpmsg_destroy_ep [label="rpmsg_destroy_endpoint(ept)"]; - - m_remoteproc_init -> m_remoteproc_load -> m_remoteproc_boot -> m_remoteproc_get_vdev -> - m_rpmsg_shmpool_init -> m_rpmsg_vdev_init -> m_rpmsg_ns_cb -> m_rpmsg_create_ep -> m_rpmsg_send; - m_rpmsg_send -> m_rpmsg_rx_cb -> m_ep_cb -> - m_rpmsg_destroy_ep [dir="none", style="dashed"]; - } - - subgraph s_flow_nodes { - rank="same"; - node [shape="box"]; - s_remoteproc_init [label="rproc = remoteproc_init(&remoteproc_ops, &arg);"]; - - s_remoteproc_parse_rsc [label="ret = remoteproc_set_rsc_table(rproc, &rsc_table, rsc_size)"]; - s_remoteproc_get_vdev [label="vdev=remoteproc_create_virtio(rproc, rpmsg_vdev_id, SLAVE, rst_cb);"]; - s_rpmsg_vdev_init [label="rpdev=rpmsg_init_vdev(rpvdev, vdev, ns_bind_cb, &shm_io, NULL);"]; - s_rpmsg_create_ep [label="\lept=rpmsg_create_ept(ept, rdev, ept_name, ept_addr, dest_addr, \lendpoint_cb, ns_unbind_cb);\l"]; - s_rpmsg_ns_cb [label="\lrpmsg_ns_callback() will see if there is a local ep registered.\lIf yes, bind the ep; otherwise, call ns_binc_cb.\l"]; - s_rpmsg_send [label="rpmsg_send(ept,data)"]; - s_rpmsg_rx_cb [label="rpmsg_rx_callback()"]; - s_ep_cb [label="endpoint_cb(ept, data, size, src_addr)"]; - s_rpmsg_ns_unbind_cb [label="\lrpmsg_ns_callback() will call the previous\lregistered endpoint unbind callback\l"]; - - s_remoteproc_init -> s_remoteproc_parse_rsc -> s_remoteproc_get_vdev -> - s_rpmsg_vdev_init -> s_rpmsg_create_ep; - s_rpmsg_create_ep -> s_rpmsg_ns_cb -> s_rpmsg_rx_cb -> - s_ep_cb -> s_rpmsg_send -> s_rpmsg_ns_unbind_cb [dir="none", style="dash"]; - - } - - subgraph s_comment_nodes { - node [group=s_comment, shape="note", style="filled", fillcolor="yellow"]; - rank="same"; - s_rpmsg_vdev_init_comment [label="\l* If vdev supports name service, it will create name service endpoint;\l* It will not return until the master set status to DRIVER READY\l"]; - s_rpmsg_rx_cb_comment [label="\l* It will look for the endpoint which matches the destination address.\lIf the two endpoints hasn't binded yet,\lit will set the local endpoint's destination address with the source address in the message\l"]; - } - - master -> m_remoteproc_init [dir="none"]; - slave -> s_remoteproc_init [dir="none"]; - s_rpmsg_create_ep -> m_rpmsg_ns_cb [label="NS annoucement"]; - m_rpmsg_create_ep -> s_rpmsg_ns_cb [label="NS annoucement"]; - m_rpmsg_send -> s_rpmsg_rx_cb [label="RPMsg data"]; - s_rpmsg_send -> m_rpmsg_rx_cb [label="RPMsg data"]; - m_rpmsg_destroy_ep -> s_rpmsg_ns_unbind_cb [label="Endpoint destroy NS"]; - - m_remoteproc_init_comment -> m_remoteproc_init [dir="none"]; - m_remoteproc_boot_comment -> m_remoteproc_boot [dir="none"]; - m_rpmsg_vdev_init_comment -> m_rpmsg_vdev_init [dir="none"]; - m_rpmsg_create_ep_comment -> m_rpmsg_create_ep [dir="none"]; - m_rpmsg_send_comment -> m_rpmsg_send [dir="none"]; - - s_rpmsg_vdev_init -> s_rpmsg_vdev_init_comment [dir="none"]; - s_rpmsg_rx_cb -> s_rpmsg_rx_cb_comment [dir="none"]; - - {rank=same; master; m_remoteproc_init} - {rank=same; slave; s_remoteproc_init} - -} - diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-static-ep.gv b/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-static-ep.gv deleted file mode 100644 index ec95744ace..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/img-src/coprocessor-rpmsg-static-ep.gv +++ /dev/null @@ -1,87 +0,0 @@ -// RPMsg static endpoints - -digraph G { - rankdir="LR"; - - subgraph roles { - node [style="filled", fillcolor="lightblue"]; - master [label="Master"]; - slave [label="Slave"]; - } - - subgraph m_comment_nodes { - node [group=m_comment, shape="note", style="filled", fillcolor="yellow"]; - rank="same"; - m_remoteproc_init_comment [label="this is initialize rproc call"]; - m_remoteproc_boot_comment [label="it will setup vdev before booting the remote"]; - m_rpmsg_vdev_init_comment [label="\l* It will initialize vrings with the shared memory\l* As vdev doesn't support name service, it will not create name service endpoint;\l* it sets vdev status to DRVIER_READY, And will notify remote.\l"]; - m_rpmsg_create_ep_comment [label="\lAs vdev doesn't supports name service,\lit will not send out name service.\l"]; - } - - subgraph m_flow_nodes { - node [shape="box"]; - rank="same"; - m_remoteproc_init [label="rproc = remoteproc_init(&remoteproc_ops, &arg);"]; - m_remoteproc_load [label="calls remoteproc_load() to load applicaiton"]; - m_remoteproc_boot [shape="box", label="ret=remoteproc_boot(&rproc)"]; - m_remoteproc_get_vdev [label="vdev=remoteproc_create_virtio(rproc, rpmsg_vdev_id, MASTER, NULL);"]; - m_rpmsg_shmpool_init[label="rpmsg_virtio_init_shm_pool(shpool, shbuf, shbuf_pool_size);"]; - m_rpmsg_vdev_init [label="rpdev=rpmsg_init_vdev(rpvdev, vdev, ns_bind_cb, &shm_io, shpool);"]; - m_rpmsg_create_ep [label="\lept=rpmsg_create_ept(ept, rdev, ept_name, ept_addr, dest_addr, \lendpoint_cb, ns_unbind_cb);\l"]; - m_rpmsg_send [label="rpmsg_send(ept,data)"]; - m_rpmsg_rx_cb [label="rpmsg_rx_callback()"]; - m_ep_cb [label="endpoint_cb(ept, data, size, src_addr)"]; - m_rpmsg_destroy_ep [label="rpmsg_destroy_endpoint(ept)"]; - - m_remoteproc_init -> m_remoteproc_load -> m_remoteproc_boot -> m_remoteproc_get_vdev -> - m_rpmsg_shmpool_init -> m_rpmsg_vdev_init -> m_rpmsg_create_ep -> m_rpmsg_send; - m_rpmsg_send -> m_rpmsg_rx_cb -> m_ep_cb -> - m_rpmsg_destroy_ep [dir="none", style="dashed"]; - } - - subgraph s_flow_nodes { - rank="same"; - node [shape="box"]; - s_remoteproc_init [label="rproc = remoteproc_init(&remoteproc_ops, &arg);"]; - - s_remoteproc_parse_rsc [label="ret = remoteproc_set_rsc_table(rproc, &rsc_table, rsc_size)"]; - s_remoteproc_get_vdev [label="vdev=remoteproc_create_virtio(rproc, rpmsg_vdev_id, SLAVE, rst_cb);"]; - s_rpmsg_vdev_init [label="rpdev=rpmsg_init_vdev(rpvdev, vdev, ns_bind_cb, &shm_io, NULL);"]; - s_rpmsg_create_ep [label="\lept=rpmsg_create_ept(ept, rdev, ept_name, ept_addr, dest_addr, \lendpoint_cb, ns_unbind_cb);\l"]; - s_rpmsg_send [label="rpmsg_send(ept,data)"]; - s_rpmsg_rx_cb [label="rpmsg_rx_callback()"]; - s_ep_cb [label="endpoint_cb(ept, data, size, src_addr)"]; - s_rpmsg_destroy_ep [label="rpmsg_destroy_endpoint(ept)"]; - - s_remoteproc_init -> s_remoteproc_parse_rsc -> s_remoteproc_get_vdev -> - s_rpmsg_vdev_init -> s_rpmsg_create_ep; - s_rpmsg_create_ep -> s_rpmsg_rx_cb -> - s_ep_cb -> s_rpmsg_send -> s_rpmsg_destroy_ep [dir="none", style="dash"]; - - } - - subgraph s_comment_nodes { - node [group=s_comment, shape="note", style="filled", fillcolor="yellow"]; - rank="same"; - s_rpmsg_vdev_init_comment [label="\l* As vdev doesn't support name service, it will not create name service endpoint;\l* It will not return until the master set status to DRIVER READY\l"]; - s_rpmsg_rx_cb_comment [label="\l* It will look for the endpoint which matches the destination address.\lIf no endpoint has found, it will drop the message.\l"]; - } - - master -> m_remoteproc_init [dir="none"]; - slave -> s_remoteproc_init [dir="none"]; - m_rpmsg_send -> s_rpmsg_rx_cb [label="RPMsg data"]; - s_rpmsg_send -> m_rpmsg_rx_cb [label="RPMsg data"]; - - m_remoteproc_init_comment -> m_remoteproc_init [dir="none"]; - m_remoteproc_boot_comment -> m_remoteproc_boot [dir="none"]; - m_rpmsg_vdev_init_comment -> m_rpmsg_vdev_init [dir="none"]; - m_rpmsg_create_ep_comment -> m_rpmsg_create_ep [dir="none"]; - - s_rpmsg_vdev_init -> s_rpmsg_vdev_init_comment [dir="none"]; - s_rpmsg_rx_cb -> s_rpmsg_rx_cb_comment [dir="none"]; - - {rank=same; master; m_remoteproc_init} - {rank=same; slave; s_remoteproc_init} - -} - diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img-src/gen-graph.py b/ext/lib/ipc/open-amp/open-amp/docs/img-src/gen-graph.py deleted file mode 100644 index 481f1d3055..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/img-src/gen-graph.py +++ /dev/null @@ -1,55 +0,0 @@ -import argparse -import os -import pydot -import sys -import warnings - -def gen_graph_from_gv(ifile, odir, oformat="png"): - (graph,) = pydot.graph_from_dot_file(ifile) - gen_graph_func = getattr(graph, "write_" + oformat) - filename = os.path.basename(ifile) - ofile = odir + "/" + os.path.splitext(filename)[0] + "." + oformat - gen_graph_func(ofile) - -parser = argparse.ArgumentParser(description='Process some integers.') -parser.add_argument('-i', "--infile", action="append", - help="graphviz file path") -parser.add_argument('-o', '--outdir', - help='sum the integers (default: find the max)') -parser.add_argument('-f', '--outformat', default="png", - help='output image format (default: png)') - -args = parser.parse_args() - -# Image source directory -img_src_dir = os.path.dirname(os.path.realpath(sys.argv[0])) - -img_files = [] -if args.infile: - for f in args.infile: - if not os.path.isfile(f): - f = img_src_dir + "/" + f - if not os.path.isfile(f): - warnings.warn("Input file: " + f + " doesn't exist.") - else: - img_files.append(f) -else: - for f in os.listdir(img_src_dir): - if f.endswith(".gv"): - img_files.append(img_src_dir + "/" + f) - -if not img_files: - sys.exit("ERROR: no found image files.") - -oformat = args.outformat - -if args.outdir: - odir = args.outdir - if not os.path.isdir(odir): - sys.exit("--outdir " + odir + "doesn't exist") -else: - odir = os.path.dirname(img_src_dir) + "/img" - -for f in img_files: - print("Generating " + oformat + " for " + f + " ...") - gen_graph_from_gv(f, odir, oformat) diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img-src/rproc-lcm-state-machine.gv b/ext/lib/ipc/open-amp/open-amp/docs/img-src/rproc-lcm-state-machine.gv deleted file mode 100644 index 1faab82842..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/img-src/rproc-lcm-state-machine.gv +++ /dev/null @@ -1,19 +0,0 @@ -// Remoteproc Life Cycle Management State Machine - -digraph G { - rankdir="LR" - st_offline [label="Offline"] - st_configured [label="Configured"] - st_ready [label="Ready"] - st_running [label="Running"] - st_stopped [label="Stopped"] - - st_offline -> st_configured - st_configured -> st_ready - st_ready -> st_running - st_ready -> st_stopped - st_stopped -> st_offline - st_running -> st_stopped - - {rank=same; st_configured; st_ready; st_running} -} diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-ns-dynamic.png b/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-ns-dynamic.png deleted file mode 100644 index 7fe1602486..0000000000 Binary files a/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-ns-dynamic.png and /dev/null differ diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-ns.png b/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-ns.png deleted file mode 100644 index 4c330d065a..0000000000 Binary files a/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-ns.png and /dev/null differ diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-static-ep.png b/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-static-ep.png deleted file mode 100644 index 473206991f..0000000000 Binary files a/ext/lib/ipc/open-amp/open-amp/docs/img/coprocessor-rpmsg-static-ep.png and /dev/null differ diff --git a/ext/lib/ipc/open-amp/open-amp/docs/img/rproc-lcm-state-machine.png b/ext/lib/ipc/open-amp/open-amp/docs/img/rproc-lcm-state-machine.png deleted file mode 100644 index 7e8a9d25a1..0000000000 Binary files a/ext/lib/ipc/open-amp/open-amp/docs/img/rproc-lcm-state-machine.png and /dev/null differ diff --git a/ext/lib/ipc/open-amp/open-amp/docs/openamp_ref.pdf b/ext/lib/ipc/open-amp/open-amp/docs/openamp_ref.pdf deleted file mode 100755 index eb94849763..0000000000 Binary files a/ext/lib/ipc/open-amp/open-amp/docs/openamp_ref.pdf and /dev/null differ diff --git a/ext/lib/ipc/open-amp/open-amp/docs/remoteproc-design.md b/ext/lib/ipc/open-amp/open-amp/docs/remoteproc-design.md deleted file mode 100644 index e93f8d5c76..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/remoteproc-design.md +++ /dev/null @@ -1,103 +0,0 @@ -# Remoteproc Design Document -Remoteproc provides abstraction to manage the life cycle of a remote -application. For now, it only provides APIs on bringing up and -tearing down the remote application, and parsing resource table. -It will extend to crash detection, suspend and resume. - -## Remoteproc LCM States -| State | State Description | -|:------|:------------------| -| Offline | Initial state of a remoteproc instance. The remote presented by the remoteproc instance and its resource has been powered off. | -| Configured | The remote presented by the remoteproc instance has been configured. And ready to load applicaiton. | -| Ready | The remote presented by the remoteproc instance has applicaiton loaded, and ready to run. | -| Stopped | The remote presented by the remoteproc instance has stopped from running. But the remote is still powered on. And the remote's resource hasn't been released. | - -![Rproc LCM States](img/rproc-lcm-state-machine.png) - -### State Transition -| State Transition | Transition Trigger | -|:-----------------|:-------------------| -| Offline -> Configured | Configure the remote to make it able to load application;
`remoteproc_configure(&rproc, &config_data)`| -| Configured -> Ready | load firmware ;
`remoteproc_load(&rproc, &path, &image_store, &image_store_ops, &image_info)` | -| Ready -> Running | start the processor;
`remoteproc_start(&rproc)` | -| Ready -> Stopped | stop the processor;
`remoteproc_stop(&rproc)`;
`remoteproc_shutdown(&rproc)`(Stopped is the intermediate state of shutdown operation) | -| Running -> Stopped | stop the processor;
`remoteproc_stop(&rproc)`;
`remoteproc_shutdown(&rproc)` | -| Stopped -> Offline | shutdown the processor;
`remoteproc_shutdown(&rproc)` | - -## Remote User APIs -* Initialize remoteproc instance: - ``` - struct remoteproc *remoteproc_init(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *priv) - ``` -* Release remoteproc instance: - ``` - int remoteproc_remove(struct remoteproc *rproc) - ``` -* Add memory to remoteproc: - ``` - void remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem) - ``` -* Get memory libmetal I/O region from remoteproc specifying memory name: - ``` - struct metal_io_region *remoteproc_get_io_with_name(struct remoteproc *rproc, const char *name) - ``` -* Get memory libmetal I/O region from remoteproc specifying physical address: - ``` - struct metal_io_region *remoteproc_get_io_with_pa(struct remoteproc *rproc, metal_phys_addr_t pa); - ``` -* Get memory libmetal I/O region from remoteproc specifying virtual address: - ``` - struct metal_io_region *remoteproc_get_io_with_va(struct remoteproc *rproc, void *va); - ``` -* Map memory and add the memory to the remoteproc instance: - ``` - void *remoteproc_mmap(struct remoteproc *rproc, - metal_phys_addr_t *pa, metal_phys_addr_t *da, - size_t size, unsigned int attribute, - struct metal_io_region **io); - ``` -* Set resource table to remoteproc: - ``` - int remoteproc_set_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size) - ``` -* Configure the remote presented by the remoteproc instance to make it able - to load applicaiton: - ``` - int remoteproc_config(struct remoteproc *rproc, void *data) - ``` -* Load application to the remote presented by the remoteproc instance to make - it ready to run: - ``` - int remoteproc_load(struct remoteproc *rproc, const char *path, - void *store, struct image_store_ops *store_ops, - void **img_info) - ``` -* Run application on the remote presented by the remoteproc instance: - ``` - int remoteproc_start(struct remoteproc *rproc) - ``` -* Stop application on remote presented by the remoteproc instance: - ``` - int remoteproc_stop(struct remoteproc *rproc) - ``` -* Shutdown the remote presented by the remoteproc instance: - ``` - int remoteproc_shutdown(struct remoteproc *rproc) - ``` -* Create virtio device from the resource table vdev resource, and add it to the - remoteproc instance: - ``` - struct virtio_device *remoteproc_create_virtio(struct remoteproc *rproc, - int vdev_id, unsigned int role, - void (*rst_cb)(struct virtio_device *vdev)) - ``` -* Remove virtio device from the remoteproc instance: - ``` - void remoteproc_remove_virtio(struct remoteproc *rproc, - struct virtio_device *vdev) - ``` - - diff --git a/ext/lib/ipc/open-amp/open-amp/docs/rpmsg-design.md b/ext/lib/ipc/open-amp/open-amp/docs/rpmsg-design.md deleted file mode 100644 index 206ee020ab..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/docs/rpmsg-design.md +++ /dev/null @@ -1,109 +0,0 @@ -# RPMsg Design Document -RPMsg is a framework to allow communication between two processors. -RPMsg implementation in OpenAMP library is based on virtio. It complies -the RPMsg Linux kernel implementation. It defines the handshaking on -setting up and tearing down the communication between applicaitons -running on two processors. - -## RPMsg User API Flow Chats -### RPMsg Static Endpoint -![Static Endpoint](img/coprocessor-rpmsg-static-ep.png) -### Binding Endpoint Dynamically with Name Service -![Binding Endpoint Dynamically with Name Service](img/coprocessor-rpmsg-ns.png) -### Creating Endpoint Dynamically with Name Service -![Creating Endpoint Dynamically with Name Service](img/coprocessor-rpmsg-ns-dynamic.png) - -## RPMsg User APIs -* RPMsg virtio master to initialize the shared buffers pool(RPMsg virtio slave - doesn't need to use this API): - ``` - void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, - void *shbuf, size_t size) - ``` -* Initialize RPMsg virtio device: - ``` - int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, - struct virtio_device *vdev, - rpmsg_ns_bind_cb ns_bind_cb, - struct metal_io_region *shm_io, - struct rpmsg_virtio_shm_pool *shpool) - ``` -* Deinitialize RPMsg virtio device: - ``` - void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev)` - ``` -* Get RPMsg device from RPMsg virtio device: - ``` - struct rpmsg_device *rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev) - ``` -* Create RPMsg endpoint: - ``` - int rpmsg_create_ept(struct rpmsg_endpoint *ept, - struct rpmsg_device *rdev, - const char *name, uint32_t src, uint32_t dest, - rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb) - ``` -* Destroy RPMsg endpoint: - ``` - void rpmsg_destroy_ept(struct rpsmg_endpoint *ept) - ``` -* Check if the local RPMsg endpoint is binded to the remote, and ready to send - message: - ``` - int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept) - ``` -* Send message with RPMsg endpoint default binding: - ``` - int rpmsg_send(struct rpmsg_endpoint *ept, const void *data, int len) - ``` -* Send message with RPMsg endpoint, specify destination address: - ``` - int rpmsg_sendto(struct rpmsg_endpoint *ept, void *data, int len, - uint32_t dst) - ``` -* Send message with RPMsg endpoint using explicit source and destination - addresses: - ``` - int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, - uint32_t src, uint32_t dst, - const void *data, int len) - ``` -* Try to send message with RPMsg endpoint default binding, if no buffer - available, returns: - ``` - int rpmsg_trysend(struct rpmsg_endpoint *ept, const void *data, - int len) - ``` -* Try to send message with RPMsg endpoint, specify destination address, - if no buffer available, returns: - ``` - int rpmsg_trysendto(struct rpmsg_endpoint *ept, void *data, int len, - uint32_t dst) - ``` -* Try to send message with RPMsg endpoint using explicit source and destination - addresses, if no buffer available, returns: - ``` - int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, - uint32_t src, uint32_t dst, - const void *data, int len)` - ``` -## RPMsg User Defined Callbacks -* RPMsg endpoint message received callback: - ``` - int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv) - ``` -* RPMsg name service binding callback. If user defines such callback, when - there is a name service announcement arrives, if there is no registered - endpoint found to bind to this name service, it will call this callback. - If this callback is not defined, it will drop this name service.: - ``` - void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev, - const char *name, uint32_t dest) - ``` -* RPMsg endpoint name service unbind callback. If user defines such callback, - when there is name service destroy arrives, it will call this callback to - notify the user application about the remote has destroyed the service.: - ``` - void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept) - ``` diff --git a/ext/lib/ipc/open-amp/open-amp/lib/CMakeLists.txt b/ext/lib/ipc/open-amp/open-amp/lib/CMakeLists.txt deleted file mode 100644 index 16f818db75..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/CMakeLists.txt +++ /dev/null @@ -1,65 +0,0 @@ - -set_property (GLOBAL PROPERTY "PROJECT_LIB_EXTRA_CFLAGS") - -collector_create (PROJECT_LIB_SOURCES "${CMAKE_CURRENT_SOURCE_DIR}") -collect (PROJECT_LIB_DIRS "${CMAKE_CURRENT_BINARY_DIR}") -collect (PROJECT_INC_DIRS "${CMAKE_CURRENT_SOURCE_DIR}/include") - - -add_subdirectory (virtio) -add_subdirectory (rpmsg) -add_subdirectory (remoteproc) - -if (WITH_PROXY) - add_subdirectory (proxy) -endif (WITH_PROXY) - -set (OPENAMP_LIB open_amp) - -if (NOT CMAKE_INSTALL_LIBDIR) - set (CMAKE_INSTALL_LIBDIR "lib") -endif (NOT CMAKE_INSTALL_LIBDIR) - -collector_list (_include PROJECT_INC_DIRS) -include_directories (${_include}) - -collector_list (_deps PROJECT_LIB_DEPS) - -get_property (_ecflags GLOBAL PROPERTY "PROJECT_LIB_EXTRA_CFLAGS") - -collector_list (_sources PROJECT_LIB_SOURCES) -set_property (SOURCE ${_sources} - APPEND_STRING PROPERTY COMPILE_FLAGS " ${_ecflags}") - -# Build a shared library if so configured. -if (WITH_ZEPHYR) - zephyr_library_named(${OPENAMP_LIB}) - add_dependencies(${OPENAMP_LIB} ${OFFSETS_H_TARGET}) - target_sources (${OPENAMP_LIB} PRIVATE ${_sources}) - zephyr_include_directories(${CMAKE_CURRENT_SOURCE_DIR}/include) -else (WITH_ZEPHYR) - if (WITH_SHARED_LIB) - set (_lib ${OPENAMP_LIB}-shared) - add_library (${_lib} SHARED ${_sources}) - target_link_libraries (${_lib} ${_deps}) - install (TARGETS ${_lib} LIBRARY DESTINATION ${CMAKE_INSTALL_LIBDIR}) - set_target_properties (${_lib} PROPERTIES - OUTPUT_NAME "${OPENAMP_LIB}" - VERSION "${PROJECT_VER}" - SOVERSION "${PROJECT_VER_MAJOR}" - ) - endif (WITH_SHARED_LIB) - - if (WITH_STATIC_LIB) - set (_lib ${OPENAMP_LIB}-static) - add_library (${_lib} STATIC ${_sources}) - install (TARGETS ${_lib} ARCHIVE DESTINATION ${CMAKE_INSTALL_LIBDIR}) - set_target_properties (${_lib} PROPERTIES - OUTPUT_NAME "${OPENAMP_LIB}" - ) - endif (WITH_STATIC_LIB) -endif (WITH_ZEPHYR) - -install (DIRECTORY "${CMAKE_CURRENT_SOURCE_DIR}/include/openamp" DESTINATION include) - -# vim: expandtab:ts=2:sw=2:smartindent diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/compiler.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/compiler.h deleted file mode 100644 index acb4c9b369..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/compiler.h +++ /dev/null @@ -1,71 +0,0 @@ -#ifndef _COMPILER_H_ -#define _COMPILER_H_ - -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/************************************************************************** - * FILE NAME - * - * compiler.h - * - * DESCRIPTION - * - * This file defines compiler-specific macros. - * - ***************************************************************************/ -#if defined __cplusplus -extern "C" { -#endif - -/* IAR ARM build tools */ -#if defined(__ICCARM__) - -#ifndef OPENAMP_PACKED_BEGIN -#define OPENAMP_PACKED_BEGIN __packed -#endif - -#ifndef OPENAMP_PACKED_END -#define OPENAMP_PACKED_END -#endif - -/* GNUC */ -#elif defined(__GNUC__) - -#ifndef OPENAMP_PACKED_BEGIN -#define OPENAMP_PACKED_BEGIN -#endif - -#ifndef OPENAMP_PACKED_END -#define OPENAMP_PACKED_END __attribute__((__packed__)) -#endif - -/* ARM GCC */ -#elif defined(__CC_ARM) - -#ifndef OPENAMP_PACKED_BEGIN -#define OPENAMP_PACKED_BEGIN _Pragma("pack(1U)") -#endif - -#ifndef OPENAMP_PACKED_END -#define OPENAMP_PACKED_END _Pragma("pack()") -#endif - -#else -/* - * There is no default definition here to avoid wrong structures packing in case - * of not supported compiler - */ -#error Please implement the structure packing macros for your compiler here! -#endif - -#if defined __cplusplus -} -#endif - -#endif /* _COMPILER_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/elf_loader.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/elf_loader.h deleted file mode 100644 index 3c6ec4af15..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/elf_loader.h +++ /dev/null @@ -1,428 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef ELF_LOADER_H_ -#define ELF_LOADER_H_ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* ELF32 base types - 32-bit. */ -typedef uint32_t Elf32_Addr; -typedef uint16_t Elf32_Half; -typedef uint32_t Elf32_Off; -typedef int32_t Elf32_Sword; -typedef uint32_t Elf32_Word; - -/* ELF64 base types - 64-bit. */ -typedef uint64_t Elf64_Addr; -typedef uint16_t Elf64_Half; -typedef uint64_t Elf64_Off; -typedef int32_t Elf64_Sword; -typedef uint32_t Elf64_Word; -typedef uint64_t Elf64_Xword; -typedef int64_t Elf64_Sxword; - -/* Size of ELF identifier field in the ELF file header. */ -#define EI_NIDENT 16 - -/* ELF32 file header */ -typedef struct { - unsigned char e_ident[EI_NIDENT]; - Elf32_Half e_type; - Elf32_Half e_machine; - Elf32_Word e_version; - Elf32_Addr e_entry; - Elf32_Off e_phoff; - Elf32_Off e_shoff; - Elf32_Word e_flags; - Elf32_Half e_ehsize; - Elf32_Half e_phentsize; - Elf32_Half e_phnum; - Elf32_Half e_shentsize; - Elf32_Half e_shnum; - Elf32_Half e_shstrndx; -} Elf32_Ehdr; - -/* ELF64 file header */ -typedef struct { - unsigned char e_ident[EI_NIDENT]; - Elf64_Half e_type; - Elf64_Half e_machine; - Elf64_Word e_version; - Elf64_Addr e_entry; - Elf64_Off e_phoff; - Elf64_Off e_shoff; - Elf64_Word e_flags; - Elf64_Half e_ehsize; - Elf64_Half e_phentsize; - Elf64_Half e_phnum; - Elf64_Half e_shentsize; - Elf64_Half e_shnum; - Elf64_Half e_shstrndx; -} Elf64_Ehdr; - -/* e_ident */ -#define ET_NONE 0 -#define ET_REL 1 /* Re-locatable file */ -#define ET_EXEC 2 /* Executable file */ -#define ET_DYN 3 /* Shared object file */ -#define ET_CORE 4 /* Core file */ -#define ET_LOOS 0xfe00 /* Operating system-specific */ -#define ET_HIOS 0xfeff /* Operating system-specific */ -#define ET_LOPROC 0xff00 /* remote_proc-specific */ -#define ET_HIPROC 0xffff /* remote_proc-specific */ - -/* e_machine */ -#define EM_ARM 40 /* ARM/Thumb Architecture */ - -/* e_version */ -#define EV_CURRENT 1 /* Current version */ - -/* e_ident[] Identification Indexes */ -#define EI_MAG0 0 /* File identification */ -#define EI_MAG1 1 /* File identification */ -#define EI_MAG2 2 /* File identification */ -#define EI_MAG3 3 /* File identification */ -#define EI_CLASS 4 /* File class */ -#define EI_DATA 5 /* Data encoding */ -#define EI_VERSION 6 /* File version */ -#define EI_OSABI 7 /* Operating system/ABI identification */ -#define EI_ABIVERSION 8 /* ABI version */ -#define EI_PAD 9 /* Start of padding bytes */ -#define EI_NIDENT 16 /* Size of e_ident[] */ - -/* - * EI_MAG0 to EI_MAG3 - A file's first 4 bytes hold amagic number, identifying - * the file as an ELF object file - */ -#define ELFMAG0 0x7f /* e_ident[EI_MAG0] */ -#define ELFMAG1 'E' /* e_ident[EI_MAG1] */ -#define ELFMAG2 'L' /* e_ident[EI_MAG2] */ -#define ELFMAG3 'F' /* e_ident[EI_MAG3] */ -#define ELFMAG "\177ELF" -#define SELFMAG 4 - -/* - * EI_CLASS - The next byte, e_ident[EI_CLASS], identifies the file's class, or - * capacity. - */ -#define ELFCLASSNONE 0 /* Invalid class */ -#define ELFCLASS32 1 /* 32-bit objects */ -#define ELFCLASS64 2 /* 64-bit objects */ - -/* - * EI_DATA - Byte e_ident[EI_DATA] specifies the data encoding of the - * remote_proc-specific data in the object file. The following encodings are - * currently defined. - */ -#define ELFDATANONE 0 /* Invalid data encoding */ -#define ELFDATA2LSB 1 /* See Data encodings, below */ -#define ELFDATA2MSB 2 /* See Data encodings, below */ - -/* EI_OSABI - We do not define an OS specific ABI */ -#define ELFOSABI_NONE 0 - -/* ELF32 program header */ -typedef struct elf32_phdr{ - Elf32_Word p_type; - Elf32_Off p_offset; - Elf32_Addr p_vaddr; - Elf32_Addr p_paddr; - Elf32_Word p_filesz; - Elf32_Word p_memsz; - Elf32_Word p_flags; - Elf32_Word p_align; -} Elf32_Phdr; - -/* ELF64 program header */ -typedef struct elf64_phdr { - Elf64_Word p_type; - Elf64_Word p_flags; - Elf64_Off p_offset; - Elf64_Addr p_vaddr; - Elf64_Addr p_paddr; - Elf64_Xword p_filesz; - Elf64_Xword p_memsz; - Elf64_Xword p_align; -} Elf64_Phdr; - -/* segment types */ -#define PT_NULL 0 -#define PT_LOAD 1 -#define PT_DYNAMIC 2 -#define PT_INTERP 3 -#define PT_NOTE 4 -#define PT_SHLIB 5 -#define PT_PHDR 6 -#define PT_TLS 7 /* Thread local storage segment */ -#define PT_LOOS 0x60000000 /* OS-specific */ -#define PT_HIOS 0x6fffffff /* OS-specific */ -#define PT_LOPROC 0x70000000 -#define PT_HIPROC 0x7fffffff - -/* ELF32 section header. */ -typedef struct { - Elf32_Word sh_name; - Elf32_Word sh_type; - Elf32_Word sh_flags; - Elf32_Addr sh_addr; - Elf32_Off sh_offset; - Elf32_Word sh_size; - Elf32_Word sh_link; - Elf32_Word sh_info; - Elf32_Word sh_addralign; - Elf32_Word sh_entsize; -} Elf32_Shdr; - -/* ELF64 section header. */ -typedef struct { - Elf64_Word sh_name; - Elf64_Word sh_type; - Elf64_Xword sh_flags; - Elf64_Addr sh_addr; - Elf64_Off sh_offset; - Elf64_Xword sh_size; - Elf64_Word sh_link; - Elf64_Word sh_info; - Elf64_Xword sh_addralign; - Elf64_Xword sh_entsize; -} Elf64_Shdr; - -/* sh_type */ -#define SHT_NULL 0 -#define SHT_PROGBITS 1 -#define SHT_SYMTAB 2 -#define SHT_STRTAB 3 -#define SHT_RELA 4 -#define SHT_HASH 5 -#define SHT_DYNAMIC 6 -#define SHT_NOTE 7 -#define SHT_NOBITS 8 -#define SHT_REL 9 -#define SHT_SHLIB 10 -#define SHT_DYNSYM 11 -#define SHT_INIT_ARRAY 14 -#define SHT_FINI_ARRAY 15 -#define SHT_PREINIT_ARRAY 16 -#define SHT_GROUP 17 -#define SHT_SYMTAB_SHNDX 18 -#define SHT_LOOS 0x60000000 -#define SHT_HIOS 0x6fffffff -#define SHT_LOPROC 0x70000000 -#define SHT_HIPROC 0x7fffffff -#define SHT_LOUSER 0x80000000 -#define SHT_HIUSER 0xffffffff - -/* sh_flags */ -#define SHF_WRITE 0x1 -#define SHF_ALLOC 0x2 -#define SHF_EXECINSTR 0x4 -#define SHF_MASKPROC 0xf0000000 - -/* Relocation entry (without addend) */ -typedef struct { - Elf32_Addr r_offset; - Elf32_Word r_info; - -} Elf32_Rel; - -typedef struct { - Elf64_Addr r_offset; - Elf64_Xword r_info; - -} Elf64_Rel; - -/* Relocation entry with addend */ -typedef struct { - Elf32_Addr r_offset; - Elf32_Word r_info; - Elf32_Sword r_addend; - -} Elf32_Rela; - -typedef struct elf64_rela { - Elf64_Addr r_offset; - Elf64_Xword r_info; - Elf64_Sxword r_addend; -} Elf64_Rela; - -/* Macros to extract information from 'r_info' field of relocation entries */ -#define ELF32_R_SYM(i) ((i) >> 8) -#define ELF32_R_TYPE(i) ((unsigned char)(i)) -#define ELF64_R_SYM(i) ((i) >> 32) -#define ELF64_R_TYPE(i) ((i) & 0xffffffff) - -/* Symbol table entry */ -typedef struct { - Elf32_Word st_name; - Elf32_Addr st_value; - Elf32_Word st_size; - unsigned char st_info; - unsigned char st_other; - Elf32_Half st_shndx; - -} Elf32_Sym; - -typedef struct elf64_sym { - Elf64_Word st_name; - unsigned char st_info; - unsigned char st_other; - Elf64_Half st_shndx; - Elf64_Addr st_value; - Elf64_Xword st_size; -} Elf64_Sym; - -/* ARM specific dynamic relocation codes */ -#define R_ARM_GLOB_DAT 21 /* 0x15 */ -#define R_ARM_JUMP_SLOT 22 /* 0x16 */ -#define R_ARM_RELATIVE 23 /* 0x17 */ -#define R_ARM_ABS32 2 /* 0x02 */ - -/* ELF decoding information */ -struct elf32_info { - Elf32_Ehdr ehdr; - unsigned int load_state; - Elf32_Phdr *phdrs; - Elf32_Shdr *shdrs; - void *shstrtab; -}; - -struct elf64_info { - Elf64_Ehdr ehdr; - unsigned int load_state; - Elf64_Phdr *phdrs; - Elf64_Shdr *shdrs; - void *shstrtab; -}; - -#define ELF_STATE_INIT 0x0UL -#define ELF_STATE_WAIT_FOR_PHDRS 0x100UL -#define ELF_STATE_WAIT_FOR_SHDRS 0x200UL -#define ELF_STATE_WAIT_FOR_SHSTRTAB 0x400UL -#define ELF_STATE_HDRS_COMPLETE 0x800UL -#define ELF_STATE_MASK 0xFF00UL -#define ELF_NEXT_SEGMENT_MASK 0x00FFUL - -extern struct loader_ops elf_ops; - -/** - * elf_identify - check if it is an ELF file - * - * It will check if the input image header is an ELF header. - * - * @img_data: firmware private data which will be passed to user defined loader - * operations - * @len: firmware header length - * - * return 0 for success or negative value for failure. - */ -int elf_identify(const void *img_data, size_t len); - -/** - * elf_load_header - Load ELF headers - * - * It will get the ELF header, the program header, and the section header. - * - * @img_data: image data - * @offset: input image data offset to the start of image file - * @len: input image data length - * @img_info: pointer to store image information data - * @last_load_state: last state return by this function - * @noffset: pointer to next offset required by loading ELF header - * @nlen: pointer to next data length required by loading ELF header - * - * return ELF loading header state, or negative value for failure - */ -int elf_load_header(const void *img_data, size_t offset, size_t len, - void **img_info, int last_load_state, - size_t *noffset, size_t *nlen); - -/** - * elf_load - load ELF data - * - * It will parse the ELF image and return the target device address, - * offset to the start of the ELF image of the data to load and the - * length of the data to load. - * - * @rproc: pointer to remoteproc instance - * @img_data: image data which will passed to the function. - * it can be NULL, if image data doesn't need to be handled - * by the load function. E.g. binary data which was - * loaded to the target memory. - * @offset: last loaded image data offset to the start of image file - * @len: last loaded image data length - * @img_info: pointer to store image information data - * @last_load_state: the returned state of the last function call. - * @da: target device address, if the data to load is not for target memory - * the da will be set to ANY. - * @noffset: pointer to next offset required by loading ELF header - * @nlen: pointer to next data length required by loading ELF header - * @padding: value to pad it is possible that a size of a segment in memory - * is larger than what it is in the ELF image. e.g. a segment - * can have stack section .bss. It doesn't need to copy image file - * space, in this case, it will be packed with 0. - * @nmemsize: pointer to next data target memory size. The size of a segment - * in the target memory can be larger than the its size in the - * image file. - * - * return 0 for success, otherwise negative value for failure - */ -int elf_load(struct remoteproc *rproc, const void *img_data, - size_t offset, size_t len, - void **img_info, int last_load_state, - metal_phys_addr_t *da, - size_t *noffset, size_t *nlen, - unsigned char *padding, size_t *nmemsize); - -/** - * elf_release - Release ELF image information - * - * It will release ELF image information data. - * - * @img_info: pointer to ELF image information - */ -void elf_release(void *img_info); - -/** - * elf_get_entry - Get entry point - * - * It will return entry point specified in the ELF file. - * - * @img_info: pointer to ELF image information - * - * return entry address - */ -metal_phys_addr_t elf_get_entry(void *img_info); - -/** - * elf_locate_rsc_table - locate the resource table information - * - * It will return the length of the resource table, and the device address of - * the resource table. - * - * @img_info: pointer to ELF image information - * @da: pointer to the device address - * @offset: pointer to the offset to in the ELF image of the resource - * table section. - * @size: pointer to the size of the resource table section. - * - * return 0 if successfully locate the resource table, negative value for - * failure. - */ -int elf_locate_rsc_table(void *img_info, metal_phys_addr_t *da, - size_t *offset, size_t *size); - -#if defined __cplusplus -} -#endif - -#endif /* ELF_LOADER_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/open_amp.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/open_amp.h deleted file mode 100644 index 1a01688a9f..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/open_amp.h +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef OPEN_AMP_H_ -#define OPEN_AMP_H_ - -#include -#include -#include -#include - - -#endif /* OPEN_AMP_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc.h deleted file mode 100644 index 90d908729c..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc.h +++ /dev/null @@ -1,871 +0,0 @@ -/* - * Remoteproc Framework - * - * Copyright(c) 2018 Xilinx Ltd. - * Copyright(c) 2011 Texas Instruments, Inc. - * Copyright(c) 2011 Google, Inc. - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef REMOTEPROC_H -#define REMOTEPROC_H - -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -#define RSC_NOTIFY_ID_ANY 0xFFFFFFFFUL - -/** - * struct resource_table - firmware resource table header - * @ver: version number - * @num: number of resource entries - * @reserved: reserved (must be zero) - * @offset: array of offsets pointing at the various resource entries - * - * A resource table is essentially a list of system resources required - * by the remote remote_proc. It may also include configuration entries. - * If needed, the remote remote_proc firmware should contain this table - * as a dedicated ".resource_table" ELF section. - * - * Some resources entries are mere announcements, where the host is informed - * of specific remoteproc configuration. Other entries require the host to - * do something (e.g. allocate a system resource). Sometimes a negotiation - * is expected, where the firmware requests a resource, and once allocated, - * the host should provide back its details (e.g. address of an allocated - * memory region). - * - * The header of the resource table, as expressed by this structure, - * contains a version number (should we need to change this format in the - * future), the number of available resource entries, and their offsets - * in the table. - * - * Immediately following this header are the resource entries themselves, - * each of which begins with a resource entry header (as described below). - */ -OPENAMP_PACKED_BEGIN -struct resource_table { - uint32_t ver; - uint32_t num; - uint32_t reserved[2]; - uint32_t offset[0]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_hdr - firmware resource entry header - * @type: resource type - * @data: resource data - * - * Every resource entry begins with a 'struct fw_rsc_hdr' header providing - * its @type. The content of the entry itself will immediately follow - * this header, and it should be parsed according to the resource type. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_hdr { - uint32_t type; - uint8_t data[0]; -} OPENAMP_PACKED_END; - -/** - * enum fw_resource_type - types of resource entries - * - * @RSC_CARVEOUT: request for allocation of a physically contiguous - * memory region. - * @RSC_DEVMEM: request to iommu_map a memory-based peripheral. - * @RSC_TRACE: announces the availability of a trace buffer into which - * the remote remote_proc will be writing logs. - * @RSC_VDEV: declare support for a virtio device, and serve as its - * virtio header. - * @RSC_VENDOR_START: start of the vendor specific resource types range - * @RSC_VENDOR_END : end of the vendor specific resource types range - * @RSC_LAST: just keep this one at the end - * - * For more details regarding a specific resource type, please see its - * dedicated structure below. - * - * Please note that these values are used as indices to the rproc_handle_rsc - * lookup table, so please keep them sane. Moreover, @RSC_LAST is used to - * check the validity of an index before the lookup table is accessed, so - * please update it as needed. - */ -enum fw_resource_type { - RSC_CARVEOUT = 0, - RSC_DEVMEM = 1, - RSC_TRACE = 2, - RSC_VDEV = 3, - RSC_RPROC_MEM = 4, - RSC_FW_CHKSUM = 5, - RSC_LAST = 6, - RSC_VENDOR_START = 128, - RSC_VENDOR_END = 512, -}; - -#define FW_RSC_ADDR_ANY (0xFFFFFFFFFFFFFFFF) -#define FW_RSC_U32_ADDR_ANY (0xFFFFFFFF) - -/** - * struct fw_rsc_carveout - physically contiguous memory request - * @da: device address - * @pa: physical address - * @len: length (in bytes) - * @flags: iommu protection flags - * @reserved: reserved (must be zero) - * @name: human-readable name of the requested memory region - * - * This resource entry requests the host to allocate a physically contiguous - * memory region. - * - * These request entries should precede other firmware resource entries, - * as other entries might request placing other data objects inside - * these memory regions (e.g. data/code segments, trace resource entries, ...). - * - * Allocating memory this way helps utilizing the reserved physical memory - * (e.g. CMA) more efficiently, and also minimizes the number of TLB entries - * needed to map it (in case @rproc is using an IOMMU). Reducing the TLB - * pressure is important; it may have a substantial impact on performance. - * - * If the firmware is compiled with static addresses, then @da should specify - * the expected device address of this memory region. If @da is set to - * FW_RSC_ADDR_ANY, then the host will dynamically allocate it, and then - * overwrite @da with the dynamically allocated address. - * - * We will always use @da to negotiate the device addresses, even if it - * isn't using an iommu. In that case, though, it will obviously contain - * physical addresses. - * - * Some remote remote_procs needs to know the allocated physical address - * even if they do use an iommu. This is needed, e.g., if they control - * hardware accelerators which access the physical memory directly (this - * is the case with OMAP4 for instance). In that case, the host will - * overwrite @pa with the dynamically allocated physical address. - * Generally we don't want to expose physical addresses if we don't have to - * (remote remote_procs are generally _not_ trusted), so we might want to - * change this to happen _only_ when explicitly required by the hardware. - * - * @flags is used to provide IOMMU protection flags, and @name should - * (optionally) contain a human readable name of this carveout region - * (mainly for debugging purposes). - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_carveout { - uint32_t type; - uint32_t da; - uint32_t pa; - uint32_t len; - uint32_t flags; - uint32_t reserved; - uint8_t name[32]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_devmem - iommu mapping request - * @da: device address - * @pa: physical address - * @len: length (in bytes) - * @flags: iommu protection flags - * @reserved: reserved (must be zero) - * @name: human-readable name of the requested region to be mapped - * - * This resource entry requests the host to iommu map a physically contiguous - * memory region. This is needed in case the remote remote_proc requires - * access to certain memory-based peripherals; _never_ use it to access - * regular memory. - * - * This is obviously only needed if the remote remote_proc is accessing memory - * via an iommu. - * - * @da should specify the required device address, @pa should specify - * the physical address we want to map, @len should specify the size of - * the mapping and @flags is the IOMMU protection flags. As always, @name may - * (optionally) contain a human readable name of this mapping (mainly for - * debugging purposes). - * - * Note: at this point we just "trust" those devmem entries to contain valid - * physical addresses, but this isn't safe and will be changed: eventually we - * want remoteproc implementations to provide us ranges of physical addresses - * the firmware is allowed to request, and not allow firmwares to request - * access to physical addresses that are outside those ranges. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_devmem { - uint32_t type; - uint32_t da; - uint32_t pa; - uint32_t len; - uint32_t flags; - uint32_t reserved; - uint8_t name[32]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_trace - trace buffer declaration - * @da: device address - * @len: length (in bytes) - * @reserved: reserved (must be zero) - * @name: human-readable name of the trace buffer - * - * This resource entry provides the host information about a trace buffer - * into which the remote remote_proc will write log messages. - * - * @da specifies the device address of the buffer, @len specifies - * its size, and @name may contain a human readable name of the trace buffer. - * - * After booting the remote remote_proc, the trace buffers are exposed to the - * user via debugfs entries (called trace0, trace1, etc..). - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_trace { - uint32_t type; - uint32_t da; - uint32_t len; - uint32_t reserved; - uint8_t name[32]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_vdev_vring - vring descriptor entry - * @da: device address - * @align: the alignment between the consumer and producer parts of the vring - * @num: num of buffers supported by this vring (must be power of two) - * @notifyid is a unique rproc-wide notify index for this vring. This notify - * index is used when kicking a remote remote_proc, to let it know that this - * vring is triggered. - * @reserved: reserved (must be zero) - * - * This descriptor is not a resource entry by itself; it is part of the - * vdev resource type (see below). - * - * Note that @da should either contain the device address where - * the remote remote_proc is expecting the vring, or indicate that - * dynamically allocation of the vring's device address is supported. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_vdev_vring { - uint32_t da; - uint32_t align; - uint32_t num; - uint32_t notifyid; - uint32_t reserved; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_vdev - virtio device header - * @id: virtio device id (as in virtio_ids.h) - * @notifyid is a unique rproc-wide notify index for this vdev. This notify - * index is used when kicking a remote remote_proc, to let it know that the - * status/features of this vdev have changes. - * @dfeatures specifies the virtio device features supported by the firmware - * @gfeatures is a place holder used by the host to write back the - * negotiated features that are supported by both sides. - * @config_len is the size of the virtio config space of this vdev. The config - * space lies in the resource table immediate after this vdev header. - * @status is a place holder where the host will indicate its virtio progress. - * @num_of_vrings indicates how many vrings are described in this vdev header - * @reserved: reserved (must be zero) - * @vring is an array of @num_of_vrings entries of 'struct fw_rsc_vdev_vring'. - * - * This resource is a virtio device header: it provides information about - * the vdev, and is then used by the host and its peer remote remote_procs - * to negotiate and share certain virtio properties. - * - * By providing this resource entry, the firmware essentially asks remoteproc - * to statically allocate a vdev upon registration of the rproc (dynamic vdev - * allocation is not yet supported). - * - * Note: unlike virtualization systems, the term 'host' here means - * the Linux side which is running remoteproc to control the remote - * remote_procs. We use the name 'gfeatures' to comply with virtio's terms, - * though there isn't really any virtualized guest OS here: it's the host - * which is responsible for negotiating the final features. - * Yeah, it's a bit confusing. - * - * Note: immediately following this structure is the virtio config space for - * this vdev (which is specific to the vdev; for more info, read the virtio - * spec). the size of the config space is specified by @config_len. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_vdev { - uint32_t type; - uint32_t id; - uint32_t notifyid; - uint32_t dfeatures; - uint32_t gfeatures; - uint32_t config_len; - uint8_t status; - uint8_t num_of_vrings; - uint8_t reserved[2]; - struct fw_rsc_vdev_vring vring[0]; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_vendor - remote processor vendor specific resource - * @len: length of the resource - * - * This resource entry tells the host the vendor specific resource - * required by the remote. - * - * These request entries should precede other shared resource entries - * such as vdevs, vrings. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_vendor { - uint32_t type; - uint32_t len; -} OPENAMP_PACKED_END; - -/** - * struct fw_rsc_rproc_mem - remote processor memory - * @da: device address - * @pa: physical address - * @len: length (in bytes) - * @reserved: reserved (must be zero) - * - * This resource entry tells the host to the remote processor - * memory that the host can be used as shared memory. - * - * These request entries should precede other shared resource entries - * such as vdevs, vrings. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_rproc_mem { - uint32_t type; - uint32_t da; - uint32_t pa; - uint32_t len; - uint32_t reserved; -} OPENAMP_PACKED_END; - -/* - * struct fw_rsc_fw_chksum - firmware checksum - * @algo: algorithm to generate the cheksum - * @chksum: checksum of the firmware loadable sections. - * - * This resource entry provides checksum for the firmware loadable sections. - * It is used to check if the remote already runs with the expected firmware to - * decide if it needs to start the remote if the remote is already running. - */ -OPENAMP_PACKED_BEGIN -struct fw_rsc_fw_chksum { - uint32_t type; - uint8_t algo[16]; - uint8_t chksum[64]; -} OPENAMP_PACKED_END; - -struct loader_ops; -struct image_store_ops; -struct remoteproc_ops; - -/** - * struct remoteproc_mem - * - * This structure presents the memory used by the remote processor - * - * @da: device memory - * @pa: physical memory - * @size: size of the memory - * @io: pointer to the I/O region - * @node: list node - */ -struct remoteproc_mem { - metal_phys_addr_t da; - metal_phys_addr_t pa; - size_t size; - char name[32]; - struct metal_io_region *io; - struct metal_list node; -}; - -/** - * struct remoteproc - * - * This structure is maintained by the remoteproc to represent the remote - * processor instance. This structure acts as a prime parameter to use - * the remoteproc APIs. - * - * @bootadd: boot address - * @loader: executable loader - * @lock: mutext lock - * @ops: remoteproc operations - * @rsc_table: pointer to resource table - * @rsc_len: length of resource table - * @rsc_io: metal I/O region of resource table - * @mems: remoteproc memories - * @vdevs: remoteproc virtio devices - * @bitmap: bitmap for notify IDs for remoteproc subdevices - * @state: remote processor state - * @priv: private data - */ -struct remoteproc { - metal_mutex_t lock; - void *rsc_table; - size_t rsc_len; - struct metal_io_region *rsc_io; - struct metal_list mems; - struct metal_list vdevs; - unsigned long bitmap; - struct remoteproc_ops *ops; - metal_phys_addr_t bootaddr; - struct loader_ops *loader; - unsigned int state; - void *priv; -}; - -/** - * struct remoteproc_ops - * - * remoteproc operations needs to be implemented by each remoteproc driver - * - * @init: initialize the remoteproc instance - * @remove: remove the remoteproc instance - * @mmap: memory mapped the mempory with physical address or destination - * address as input. - * @handle_rsc: handle the vendor specific resource - * @config: configure the remoteproc to make it ready to load and run - * executable - * @start: kick the remoteproc to run application - * @stop: stop the remoteproc from running application, the resource such as - * memory may not be off. - * @shutdown: shutdown the remoteproc and release its resources. - * @notify: notify the remote - */ -struct remoteproc_ops { - struct remoteproc *(*init)(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *arg); - void (*remove)(struct remoteproc *rproc); - void *(*mmap)(struct remoteproc *rproc, - metal_phys_addr_t *pa, metal_phys_addr_t *da, - size_t size, unsigned int attribute, - struct metal_io_region **io); - int (*handle_rsc)(struct remoteproc *rproc, void *rsc, size_t len); - int (*config)(struct remoteproc *rproc, void *data); - int (*start)(struct remoteproc *rproc); - int (*stop)(struct remoteproc *rproc); - int (*shutdown)(struct remoteproc *rproc); - int (*notify)(struct remoteproc *rproc, uint32_t id); -}; - -/* Remoteproc error codes */ -#define RPROC_EBASE 0 -#define RPROC_ENOMEM (RPROC_EBASE + 1) -#define RPROC_EINVAL (RPROC_EBASE + 2) -#define RPROC_ENODEV (RPROC_EBASE + 3) -#define RPROC_EAGAIN (RPROC_EBASE + 4) -#define RPROC_ERR_RSC_TAB_TRUNC (RPROC_EBASE + 5) -#define RPROC_ERR_RSC_TAB_VER (RPROC_EBASE + 6) -#define RPROC_ERR_RSC_TAB_RSVD (RPROC_EBASE + 7) -#define RPROC_ERR_RSC_TAB_VDEV_NRINGS (RPROC_EBASE + 9) -#define RPROC_ERR_RSC_TAB_NP (RPROC_EBASE + 10) -#define RPROC_ERR_RSC_TAB_NS (RPROC_EBASE + 11) -#define RPROC_ERR_LOADER_STATE (RPROC_EBASE + 12) -#define RPROC_EMAX (RPROC_EBASE + 16) -#define RPROC_EPTR (void *)(-1) -#define RPROC_EOF (void *)(-1) - -static inline long RPROC_PTR_ERR(const void *ptr) -{ - return (long)ptr; -} - -static inline int RPROC_IS_ERR(const void *ptr) -{ - if ((unsigned long)ptr >= (unsigned long)(-RPROC_EMAX)) - return 1; - else - return 0; -} - -static inline void *RPROC_ERR_PTR(long error) -{ - return (void *)error; -} - -/** - * enum rproc_state - remote processor states - * @RPROC_OFFLINE: remote is offline - * @RPROC_READY: remote is ready to start - * @RPROC_RUNNING: remote is up and running - * @RPROC_SUSPENDED: remote is suspended - * @RPROC_ERROR: remote has error; need to recover - * @RPROC_STOPPED: remote is stopped - * @RPROC_LAST: just keep this one at the end - */ -enum remoteproc_state { - RPROC_OFFLINE = 0, - RPROC_CONFIGURED = 1, - RPROC_READY = 2, - RPROC_RUNNING = 3, - RPROC_SUSPENDED = 4, - RPROC_ERROR = 5, - RPROC_STOPPED = 6, - RPROC_LAST = 7, -}; - -/** - * remoteproc_init - * - * Initializes remoteproc resource. - * - * @rproc - pointer to remoteproc instance - * @ops - pointer to remoteproc operations - * @priv - pointer to private data - * - * @returns created remoteproc pointer - */ -struct remoteproc *remoteproc_init(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *priv); - -/** - * remoteproc_remove - * - * Remove remoteproc resource - * - * @rproc - pointer to remoteproc instance - * - * returns 0 for success, negative value for failure - */ -int remoteproc_remove(struct remoteproc *rproc); - -/** - * remoteproc_init_mem - * - * Initialize remoteproc memory - * - * @mem - pointer to remoteproc memory - * @char - memory name - * @pa - physcial address - * @da - device address - * @size - memory size - * @io - pointer to the I/O region - */ -static inline void -remoteproc_init_mem(struct remoteproc_mem *mem, const char *name, - metal_phys_addr_t pa, metal_phys_addr_t da, - size_t size, struct metal_io_region *io) -{ - if (!mem) - return; - if (name) - strncpy(mem->name, name, sizeof(mem->name)); - else - mem->name[0] = 0; - mem->pa = pa; - mem->da = da; - mem->io = io; - mem->size = size; -} - -/** - * remoteproc_add_mem - * - * Add remoteproc memory - * - * @rproc - pointer to remoteproc - * @mem - pointer to remoteproc memory - */ -static inline void -remoteproc_add_mem(struct remoteproc *rproc, struct remoteproc_mem *mem) -{ - if (!rproc || !mem) - return; - metal_list_add_tail(&rproc->mems, &mem->node); -} - -/** - * remoteproc_get_io_with_name - * - * get remoteproc memory I/O region with name - * - * @rproc - pointer to the remote processor - * @name - name of the shared memory - * @io - pointer to the pointer of the I/O region - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_name(struct remoteproc *rproc, - const char *name); - -/** - * remoteproc_get_io_with_pa - * - * get remoteproc memory I/O region with physical address - * - * @rproc - pointer to the remote processor - * @pa - physical address - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_pa(struct remoteproc *rproc, - metal_phys_addr_t pa); - -/** - * remoteproc_get_io_with_da - * - * get remoteproc memory I/O region with device address - * - * @rproc - pointer to the remote processor - * @da - device address - * @offset - I/O region offset of the device address - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_da(struct remoteproc *rproc, - metal_phys_addr_t da, - unsigned long *offset); - -/** - * remoteproc_get_io_with_va - * - * get remoteproc memory I/O region with virtual address - * - * @rproc - pointer to the remote processor - * @va - virtual address - * - * returns metal I/O region pointer, NULL for failure - */ -struct metal_io_region * -remoteproc_get_io_with_va(struct remoteproc *rproc, - void *va); - -/** - * remoteproc_mmap - * - * remoteproc mmap memory - * - * @rproc - pointer to the remote processor - * @pa - physical address pointer - * @da - device address pointer - * @size - size of the memory - * @attribute - memory attribute - * @io - pointer to the I/O region - * - * returns pointer to the memory - */ -void *remoteproc_mmap(struct remoteproc *rproc, - metal_phys_addr_t *pa, metal_phys_addr_t *da, - size_t size, unsigned int attribute, - struct metal_io_region **io); - -/** - * remoteproc_parse_rsc_table - * - * Parse resource table of remoteproc - * - * @rproc - pointer to remoteproc instance - * @rsc_table - pointer to resource table - * @rsc_size - resource table size - * - * returns 0 for success and negative value for errors - */ -int remoteproc_parse_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size); - -/** - * remoteproc_set_rsc_table - * - * Parse and set resource table of remoteproc - * - * @rproc - pointer to remoteproc instance - * @rsc_table - pointer to resource table - * @rsc_size - resource table size - * - * returns 0 for success and negative value for errors - */ -int remoteproc_set_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size); - -/** - * remoteproc_config - * - * This function configures the remote processor to get it - * ready to load and run executable. - * - * @rproc - pointer to remoteproc instance to start - * @data - configuration data - * - * returns 0 for success and negative value for errors - */ -int remoteproc_config(struct remoteproc *rproc, void *data); - -/** - * remoteproc_start - * - * This function starts the remote processor. - * It assumes the firmware is already loaded, - * - * @rproc - pointer to remoteproc instance to start - * - * returns 0 for success and negative value for errors - */ -int remoteproc_start(struct remoteproc *rproc); - -/** - * remoteproc_stop - * - * This function stops the remote processor but it - * will not release its resource. - * - * @rproc - pointer to remoteproc instance - * - * returns 0 for success and negative value for errors - */ -int remoteproc_stop(struct remoteproc *rproc); - -/** - * remoteproc_shutdown - * - * This function shutdown the remote processor and - * release its resources. - * - * @rproc - pointer to remoteproc instance - * - * returns 0 for success and negative value for errors - */ -int remoteproc_shutdown(struct remoteproc *rproc); - -/** - * remoteproc_load - * - * load executable, it expects the user application defines how to - * open the executable file and how to get data from the executable file - * and how to load data to the target memory. - * - * @rproc: pointer to the remoteproc instance - * @path: optional path to the image file - * @store: pointer to user defined image store argument - * @store_ops: pointer to image store operations - * @image_info: pointer to memory which stores image information used - * by remoteproc loader - * - * return 0 for success and negative value for failure - */ -int remoteproc_load(struct remoteproc *rproc, const char *path, - void *store, struct image_store_ops *store_ops, - void **img_info); - -/** - * remoteproc_load_noblock - * - * load executable, it expects the caller has loaded image data to local - * memory and passed to the this function. If the function needs more - * image data it will return the next expected image data offset and - * the next expected image data length. If the function requires the - * caller to download image data to the target memory, it will also - * return the target physical address besides the offset and length. - * This function can be used to load firmware in stream mode. In this - * mode, you cannot do seek to the executable file. If the executable - * is ELF, it cannot get the resource table section before it loads - * the full ELF file. Furthermore, application usually don't store - * the data which is loaded to local memory in streaming mode, and - * thus, in this mode, it will load the binrary to the target memory - * before it gets the resource table. And thus, when calling this funciton - * don't put the target exectuable memory in the resource table, as - * this function will parse the resource table after it loads the binary - * to target memory. - * - * @rproc: pointer to the remoteproc instance - * @img_data: pointer to image data for remoteproc loader to parse - * @offset: image data offset to the beginning of the image file - * @len: image data length - * @image_info: pointer to memory which stores image information used - * by remoteproc loader - * @pa: pointer to the target memory physical address. If the next expected - * data doesn't need to load to the target memory, the function will - * set it to ANY. - * @io: pointer to the target memory physical address. If the next expected - * data doesn't need to load to the target memory, the function will - * set it to ANY. - * @noffset: pointer to the next image data offset to the beginning of - * the image file needs to load to local or to the target - * memory. - * @nlen: pointer to the next image data length needs to load to local - * or to the target memory. - * @nmlen: pointer to the memory size. It is only used when the next - * expected data is going to be loaded to the target memory. E.g. - * in ELF, it is possible that loadable segment in memory is - * larger that the segment data in the ELF file. In this case, - * application will need to pad the rest of the memory with - * padding. - * @padding: pointer to the padding value. It is only used when the next - * expected data is going to be loaded to the target memory. - * and the target memory size is larger than the segment data in - * the executable file. - * - * return 0 for success and negative value for failure - */ -int remoteproc_load_noblock(struct remoteproc *rproc, - const void *img_data, size_t offset, size_t len, - void **img_info, - metal_phys_addr_t *pa, struct metal_io_region **io, - size_t *noffset, size_t *nlen, - size_t *nmlen, unsigned char *padding); - -/** - * remoteproc_allocate_id - * - * allocate notifyid for resource - * - * @rproc - pointer to the remoteproc instance - * @start - start of the id range - * @end - end of the id range - * - * return allocated notify id - */ -unsigned int remoteproc_allocate_id(struct remoteproc *rproc, - unsigned int start, - unsigned int end); - -/* remoteproc_create_virtio - * - * create virtio device, it returns pointer to the created virtio device. - * - * @rproc: pointer to the remoteproc instance - * @vdev_id: virtio device ID - * @role: virtio device role - * @rst_cb: virtio device reset callback - * - * return pointer to the created virtio device, NULL for failure. - */ -struct virtio_device * -remoteproc_create_virtio(struct remoteproc *rproc, - int vdev_id, unsigned int role, - void (*rst_cb)(struct virtio_device *vdev)); - -/* remoteproc_remove_virtio - * - * Remove virtio device - * - * @rproc: pointer to the remoteproc instance - * @vdev: pointer to the virtio device - * - */ -void remoteproc_remove_virtio(struct remoteproc *rproc, - struct virtio_device *vdev); - -/* remoteproc_get_notification - * - * remoteproc is got notified, it will check its subdevices - * for the notification - * - * @rproc - pointer to the remoteproc instance - * @notifyid - notificatin id - * - * return 0 for succeed, negative value for failure - */ -int remoteproc_get_notification(struct remoteproc *rproc, - uint32_t notifyid); -#if defined __cplusplus -} -#endif - -#endif /* REMOTEPROC_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc_loader.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc_loader.h deleted file mode 100644 index 4409a1aa7a..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc_loader.h +++ /dev/null @@ -1,108 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -/************************************************************************** - * FILE NAME - * - * remoteproc_loader.h - * - * COMPONENT - * - * OpenAMP stack. - * - * DESCRIPTION - * - * This file provides definitions for remoteproc loader - * - * - **************************************************************************/ -#ifndef REMOTEPROC_LOADER_H_ -#define REMOTEPROC_LOADER_H_ - -#include -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* Loader feature macros */ -#define SUPPORT_SEEK 1UL - -/* Remoteproc loader any address */ -#define RPROC_LOAD_ANYADDR ((metal_phys_addr_t)-1) - -/* Remoteproc loader Exectuable Image Parsing States */ -/* Remoteproc loader parser intial state */ -#define RPROC_LOADER_NOT_READY 0x0UL -/* Remoteproc loader ready to load, even it can be not finish parsing */ -#define RPROC_LOADER_READY_TO_LOAD 0x10000UL -/* Remoteproc loader post data load */ -#define RPROC_LOADER_POST_DATA_LOAD 0x20000UL -/* Remoteproc loader finished loading */ -#define RPROC_LOADER_LOAD_COMPLETE 0x40000UL -/* Remoteproc loader state mask */ -#define RPROC_LOADER_MASK 0x00FF0000UL -/* Remoteproc loader private mask */ -#define RPROC_LOADER_PRIVATE_MASK 0x0000FFFFUL -/* Remoteproc loader reserved mask */ -#define RPROC_LOADER_RESERVED_MASK 0x0F000000UL - -/** - * struct image_store_ops - user defined image store operations - * @open: user defined callback to open the "firmware" to prepare loading - * @close: user defined callback to close the "firmware" to clean up - * after loading - * @load: user defined callback to load the firmware contents to target - * memory or local memory - * @features: loader supported features. e.g. seek - */ -struct image_store_ops { - int (*open)(void *store, const char *path, const void **img_data); - void (*close)(void *store); - int (*load)(void *store, size_t offset, size_t size, - const void **data, - metal_phys_addr_t pa, - struct metal_io_region *io, char is_blocking); - unsigned int features; -}; - -/** - * struct loader_ops - loader oeprations - * @load_header: define how to get the executable headers - * @load_data: define how to load the target data - * @locate_rsc_table: define how to get the resource table target address, - * offset to the ELF image file and size of the resource - * table. - * @release: define how to release the loader - * @get_entry: get entry address - * @get_load_state: get load state from the image information - */ -struct loader_ops { - int (*load_header)(const void *img_data, size_t offset, size_t len, - void **img_info, int last_state, - size_t *noffset, size_t *nlen); - int (*load_data)(struct remoteproc *rproc, - const void *img_data, size_t offset, size_t len, - void **img_info, int last_load_state, - metal_phys_addr_t *da, - size_t *noffset, size_t *nlen, - unsigned char *padding, size_t *nmemsize); - int (*locate_rsc_table)(void *img_info, metal_phys_addr_t *da, - size_t *offset, size_t *size); - void (*release)(void *img_info); - metal_phys_addr_t (*get_entry)(void *img_info); - int (*get_load_state)(void *img_info); -}; - -#if defined __cplusplus -} -#endif - -#endif /* REMOTEPROC_LOADER_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc_virtio.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc_virtio.h deleted file mode 100644 index b06b951c4d..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/remoteproc_virtio.h +++ /dev/null @@ -1,150 +0,0 @@ -/* - * Remoteproc Virtio Framework - * - * Copyright(c) 2018 Xilinx Ltd. - * Copyright(c) 2011 Texas Instruments, Inc. - * Copyright(c) 2011 Google, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#ifndef REMOTEPROC_VIRTIO_H -#define REMOTEPROC_VIRTIO_H - -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* define vdev notification funciton user should implement */ -typedef int (*rpvdev_notify_func)(void *priv, uint32_t id); - -/** - * struct remoteproc_virtio - * @priv pointer to private data - * @notifyid notification id - * @vdev_rsc address of vdev resource - * @vdev_rsc_io metal I/O region of vdev_info, can be NULL - * @notify notification function - * @vdev virtio device - * @node list node - */ -struct remoteproc_virtio { - void *priv; - uint32_t notify_id; - void *vdev_rsc; - struct metal_io_region *vdev_rsc_io; - rpvdev_notify_func notify; - struct virtio_device vdev; - struct metal_list node; -}; - -/** - * rproc_virtio_create_vdev - * - * Create rproc virtio vdev - * - * @role: 0 - virtio master, 1 - virtio slave - * @notifyid: virtio device notification id - * @rsc: pointer to the virtio device resource - * @rsc_io: pointer to the virtio device resource I/O region - * @priv: pointer to the private data - * @notify: vdev and virtqueue notification function - * @rst_cb: reset virtio device callback - * - * return pointer to the created virtio device for success, - * NULL for failure. - */ -struct virtio_device * -rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, - void *rsc, struct metal_io_region *rsc_io, - void *priv, - rpvdev_notify_func notify, - virtio_dev_reset_cb rst_cb); - -/** - * rproc_virtio_remove_vdev - * - * Create rproc virtio vdev - * - * @vdev - pointer to the virtio device - */ -void rproc_virtio_remove_vdev(struct virtio_device *vdev); - -/** - * rproc_virtio_create_vring - * - * Create rproc virtio vring - * - * @vdev: pointer to the virtio device - * @index: vring index in the virtio device - * @notifyid: remoteproc vring notification id - * @va: vring virtual address - * @io: pointer to vring I/O region - * @num_desc: number of descriptors - * @align: vring alignment - * - * return 0 for success, negative value for failure. - */ -int rproc_virtio_init_vring(struct virtio_device *vdev, unsigned int index, - unsigned int notifyid, void *va, - struct metal_io_region *io, - unsigned int num_descs, unsigned int align); - -/** - * rproc_virtio_notified - * - * remoteproc virtio is got notified - * - * @vdev - pointer to the virtio device - * @notifyid - notify id - * - * return 0 for successful, negative value for failure - */ -int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid); - -/** - * rproc_virtio_wait_remote_ready - * - * Blocking function, waiting for the remote core is ready to start - * communications. - * - * @vdev - pointer to the virtio device - * - * return true when remote processor is ready. - */ -void rproc_virtio_wait_remote_ready(struct virtio_device *vdev); - -#if defined __cplusplus -} -#endif - -#endif /* REMOTEPROC_VIRTIO_H */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg.h deleted file mode 100644 index 6c88d19d8d..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg.h +++ /dev/null @@ -1,357 +0,0 @@ -/* - * Remote processor messaging - * - * Copyright (C) 2011 Texas Instruments, Inc. - * Copyright (C) 2011 Google, Inc. - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _RPMSG_H_ -#define _RPMSG_H_ - -#include -#include -#include -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* Configurable parameters */ -#define RPMSG_NAME_SIZE (32) -#define RPMSG_ADDR_BMP_SIZE (4) - -#define RPMSG_NS_EPT_ADDR (0x35) -#define RPMSG_ADDR_ANY 0xFFFFFFFF - -/* Error macros. */ -#define RPMSG_SUCCESS 0 -#define RPMSG_ERROR_BASE -2000 -#define RPMSG_ERR_NO_MEM (RPMSG_ERROR_BASE - 1) -#define RPMSG_ERR_NO_BUFF (RPMSG_ERROR_BASE - 2) -#define RPMSG_ERR_PARAM (RPMSG_ERROR_BASE - 3) -#define RPMSG_ERR_DEV_STATE (RPMSG_ERROR_BASE - 4) -#define RPMSG_ERR_BUFF_SIZE (RPMSG_ERROR_BASE - 5) -#define RPMSG_ERR_INIT (RPMSG_ERROR_BASE - 6) -#define RPMSG_ERR_ADDR (RPMSG_ERROR_BASE - 7) - -struct rpmsg_endpoint; -struct rpmsg_device; - -typedef int (*rpmsg_ept_cb)(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv); -typedef void (*rpmsg_ns_unbind_cb)(struct rpmsg_endpoint *ept); -typedef void (*rpmsg_ns_bind_cb)(struct rpmsg_device *rdev, - const char *name, uint32_t dest); - -/** - * struct rpmsg_endpoint - binds a local rpmsg address to its user - * @name:name of the service supported - * @rdev: pointer to the rpmsg device - * @addr: local address of the endpoint - * @dest_addr: address of the default remote endpoint binded. - * @cb: user rx callback, return value of this callback is reserved - * for future use, for now, only allow RPMSG_SUCCESS as return value. - * @ns_unbind_cb: end point service service unbind callback, called when remote - * ept is destroyed. - * @node: end point node. - * @addr: local rpmsg address - * @priv: private data for the driver's use - * - * In essence, an rpmsg endpoint represents a listener on the rpmsg bus, as - * it binds an rpmsg address with an rx callback handler. - */ -struct rpmsg_endpoint { - char name[RPMSG_NAME_SIZE]; - struct rpmsg_device *rdev; - uint32_t addr; - uint32_t dest_addr; - rpmsg_ept_cb cb; - rpmsg_ns_unbind_cb ns_unbind_cb; - struct metal_list node; - void *priv; -}; - -/** - * struct rpmsg_device_ops - RPMsg device operations - * @send_offchannel_raw: send RPMsg data - */ -struct rpmsg_device_ops { - int (*send_offchannel_raw)(struct rpmsg_device *rdev, - uint32_t src, uint32_t dst, - const void *data, int size, int wait); -}; - -/** - * struct rpmsg_device - representation of a RPMsg device - * @endpoints: list of endpoints - * @ns_ept: name service endpoint - * @bitmap: table endpoin address allocation. - * @lock: mutex lock for rpmsg management - * @ns_bind_cb: callback handler for name service announcement without local - * endpoints waiting to bind. - * @ops: RPMsg device operations - */ -struct rpmsg_device { - struct metal_list endpoints; - struct rpmsg_endpoint ns_ept; - unsigned long bitmap[RPMSG_ADDR_BMP_SIZE]; - metal_mutex_t lock; - rpmsg_ns_bind_cb ns_bind_cb; - struct rpmsg_device_ops ops; -}; - -/** - * rpmsg_send_offchannel_raw() - send a message across to the remote processor, - * specifying source and destination address. - * @ept: the rpmsg endpoint - * @data: payload of the message - * @len: length of the payload - * - * This function sends @data of length @len to the remote @dst address from - * the source @src address. - * The message will be sent to the remote processor which the channel belongs - * to. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src, - uint32_t dst, const void *data, int size, - int wait); - -/** - * rpmsg_send() - send a message across to the remote processor - * @ept: the rpmsg endpoint - * @data: payload of the message - * @len: length of the payload - * - * This function sends @data of length @len based on the @ept. - * The message will be sent to the remote processor which the channel belongs - * to, using @ept's source and destination addresses. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_send(struct rpmsg_endpoint *ept, const void *data, - int len) -{ - if (ept->dest_addr == RPMSG_ADDR_ANY) - return RPMSG_ERR_ADDR; - return rpmsg_send_offchannel_raw(ept, ept->addr, ept->dest_addr, data, - len, true); -} - -/** - * rpmsg_sendto() - send a message across to the remote processor, specify dst - * @ept: the rpmsg endpoint - * @data: payload of message - * @len: length of payload - * @dst: destination address - * - * This function sends @data of length @len to the remote @dst address. - * The message will be sent to the remote processor which the @ept - * channel belongs to, using @ept's source address. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_sendto(struct rpmsg_endpoint *ept, const void *data, - int len, uint32_t dst) -{ - return rpmsg_send_offchannel_raw(ept, ept->addr, dst, data, len, true); -} - -/** - * rpmsg_send_offchannel() - send a message using explicit src/dst addresses - * @ept: the rpmsg endpoint - * @src: source address - * @dst: destination address - * @data: payload of message - * @len: length of payload - * - * This function sends @data of length @len to the remote @dst address, - * and uses @src as the source address. - * The message will be sent to the remote processor which the @ept - * channel belongs to. - * In case there are no TX buffers available, the function will block until - * one becomes available, or a timeout of 15 seconds elapses. When the latter - * happens, -ERESTARTSYS is returned. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_send_offchannel(struct rpmsg_endpoint *ept, - uint32_t src, uint32_t dst, - const void *data, int len) -{ - return rpmsg_send_offchannel_raw(ept, src, dst, data, len, true); -} - -/** - * rpmsg_trysend() - send a message across to the remote processor - * @ept: the rpmsg endpoint - * @data: payload of message - * @len: length of payload - * - * This function sends @data of length @len on the @ept channel. - * The message will be sent to the remote processor which the @ept - * channel belongs to, using @ept's source and destination addresses. - * In case there are no TX buffers available, the function will immediately - * return -ENOMEM without waiting until one becomes available. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_trysend(struct rpmsg_endpoint *ept, const void *data, - int len) -{ - if (ept->dest_addr == RPMSG_ADDR_ANY) - return RPMSG_ERR_ADDR; - return rpmsg_send_offchannel_raw(ept, ept->addr, ept->dest_addr, data, - len, false); -} - -/** - * rpmsg_trysendto() - send a message across to the remote processor, - * specify dst - * @ept: the rpmsg endpoint - * @data: payload of message - * @len: length of payload - * @dst: destination address - * - * This function sends @data of length @len to the remote @dst address. - * The message will be sent to the remote processor which the @ept - * channel belongs to, using @ept's source address. - * In case there are no TX buffers available, the function will immediately - * return -ENOMEM without waiting until one becomes available. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_trysendto(struct rpmsg_endpoint *ept, const void *data, - int len, uint32_t dst) -{ - return rpmsg_send_offchannel_raw(ept, ept->addr, dst, data, len, false); -} - -/** - * rpmsg_trysend_offchannel() - send a message using explicit src/dst addresses - * @ept: the rpmsg endpoint - * @src: source address - * @dst: destination address - * @data: payload of message - * @len: length of payload - * - * This function sends @data of length @len to the remote @dst address, - * and uses @src as the source address. - * The message will be sent to the remote processor which the @ept - * channel belongs to. - * In case there are no TX buffers available, the function will immediately - * return -ENOMEM without waiting until one becomes available. - * - * Returns number of bytes it has sent or negative error value on failure. - */ -static inline int rpmsg_trysend_offchannel(struct rpmsg_endpoint *ept, - uint32_t src, uint32_t dst, - const void *data, int len) -{ - return rpmsg_send_offchannel_raw(ept, src, dst, data, len, false); -} - -/** - * rpmsg_init_ept - initialize rpmsg endpoint - * - * Initialize an RPMsg endpoint with a name, source address, - * remoteproc address, endpoitn callback, and destroy endpoint callback. - * - * @ept: pointer to rpmsg endpoint - * @name: service name associated to the endpoint - * @src: local address of the endpoint - * @dest: target address of the endpoint - * @cb: endpoint callback - * @ns_unbind_cb: end point service unbind callback, called when remote ept is - * destroyed. - */ -static inline void rpmsg_init_ept(struct rpmsg_endpoint *ept, - const char *name, - uint32_t src, uint32_t dest, - rpmsg_ept_cb cb, - rpmsg_ns_unbind_cb ns_unbind_cb) -{ - strncpy(ept->name, name, sizeof(ept->name)); - ept->addr = src; - ept->dest_addr = dest; - ept->cb = cb; - ept->ns_unbind_cb = ns_unbind_cb; -} - -/** - * rpmsg_create_ept - create rpmsg endpoint and register it to rpmsg device - * - * Create a RPMsg endpoint, initialize it with a name, source address, - * remoteproc address, endpoitn callback, and destroy endpoint callback, - * and register it to the RPMsg device. - * - * @ept: pointer to rpmsg endpoint - * @name: service name associated to the endpoint - * @src: local address of the endpoint - * @dest: target address of the endpoint - * @cb: endpoint callback - * @ns_unbind_cb: end point service unbind callback, called when remote ept is - * destroyed. - * - * In essence, an rpmsg endpoint represents a listener on the rpmsg bus, as - * it binds an rpmsg address with an rx callback handler. - * - * Rpmsg client should create an endpoint to discuss with remote. rpmsg client - * provide at least a channel name, a callback for message notification and by - * default endpoint source address should be set to RPMSG_ADDR_ANY. - * - * As an option Some rpmsg clients can specify an endpoint with a specific - * source address. - */ - -int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, - const char *name, uint32_t src, uint32_t dest, - rpmsg_ept_cb cb, rpmsg_ns_unbind_cb ns_unbind_cb); - -/** - * rpmsg_destroy_ept - destroy rpmsg endpoint and unregister it from rpmsg - * device - * - * @ept: pointer to the rpmsg endpoint - * - * It unregisters the rpmsg endpoint from the rpmsg device and calls the - * destroy endpoint callback if it is provided. - */ -void rpmsg_destroy_ept(struct rpmsg_endpoint *ept); - -/** - * is_rpmsg_ept_ready - check if the rpmsg endpoint ready to send - * - * @ept: pointer to rpmsg endpoint - * - * Returns 1 if the rpmsg endpoint has both local addr and destination - * addr set, 0 otherwise - */ -static inline unsigned int is_rpmsg_ept_ready(struct rpmsg_endpoint *ept) -{ - return (ept->dest_addr != RPMSG_ADDR_ANY && - ept->addr != RPMSG_ADDR_ANY); -} - -#if defined __cplusplus -} -#endif - -#endif /* _RPMSG_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg_retarget.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg_retarget.h deleted file mode 100644 index 5645e52ed6..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg_retarget.h +++ /dev/null @@ -1,119 +0,0 @@ -#ifndef RPMSG_RETARGET_H -#define RPMSG_RETARGET_H - -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* File Operations System call definitions */ -#define OPEN_SYSCALL_ID 0x1UL -#define CLOSE_SYSCALL_ID 0x2UL -#define WRITE_SYSCALL_ID 0x3UL -#define READ_SYSCALL_ID 0x4UL -#define ACK_STATUS_ID 0x5UL - -#define TERM_SYSCALL_ID 0x6UL - -#define DEFAULT_PROXY_ENDPOINT 0xFFUL - -struct rpmsg_rpc_data; - -typedef int (*rpmsg_rpc_poll)(void *arg); -typedef void (*rpmsg_rpc_shutdown_cb)(struct rpmsg_rpc_data *rpc); - -struct rpmsg_rpc_syscall_header { - int32_t int_field1; - int32_t int_field2; - uint32_t data_len; -}; - -struct rpmsg_rpc_syscall { - uint32_t id; - struct rpmsg_rpc_syscall_header args; -}; - -struct rpmsg_rpc_data { - struct rpmsg_endpoint ept; - int ept_destroyed; - atomic_int nacked; - void *respbuf; - size_t respbuf_len; - rpmsg_rpc_poll poll; - void *poll_arg; - rpmsg_rpc_shutdown_cb shutdown_cb; - metal_mutex_t lock; - struct metal_spinlock buflock; -}; - -/** - * rpmsg_rpc_init - initialize RPMsg remote procedure call - * - * This function is to intialize the remote procedure call - * global data. RPMsg RPC will send request to remote and - * wait for callback. - * - * @rpc: pointer to the global remote procedure call data - * @rdev: pointer to the rpmsg device - * @ept_name: name of the endpoint used by RPC - * @ept_addr: address of the endpoint used by RPC - * @ept_raddr: remote address of the endpoint used by RPC - * @poll_arg: pointer to poll function argument - * @poll: poll function - * @shutdown_cb: shutdown callback function - * - * return 0 for success, and negative value for failure. - */ -int rpmsg_rpc_init(struct rpmsg_rpc_data *rpc, - struct rpmsg_device *rdev, - const char *ept_name, uint32_t ept_addr, - uint32_t ept_raddr, - void *poll_arg, rpmsg_rpc_poll poll, - rpmsg_rpc_shutdown_cb shutdown_cb); - -/** - * rpmsg_rpc_release - release RPMsg remote procedure call - * - * This function is to release remoteproc procedure call - * global data. - * - * @rpc: pointer to the globacl remote procedure call - */ -void rpmsg_rpc_release(struct rpmsg_rpc_data *rpc); - -/** - * rpmsg_rpc_send - Request RPMsg RPC call - * - * This function sends RPC request it will return with the length - * of data and the response buffer. - * - * @rpc: pointer to remoteproc procedure call data struct - * @req: pointer to request buffer - * @len: length of the request data - * @resp: pointer to where store the response buffer - * @resp_len: length of the response buffer - * - * return length of the received response, negative value for failure. - */ -int rpmsg_rpc_send(struct rpmsg_rpc_data *rpc, - void *req, size_t len, - void *resp, size_t resp_len); - -/** - * rpmsg_set_default_rpc - set default RPMsg RPC data - * - * The default RPC data is used to redirect standard C file operations - * to RPMsg channels. - * - * @rpc: pointer to remoteproc procedure call data struct - */ -void rpmsg_set_default_rpc(struct rpmsg_rpc_data *rpc); - -#if defined __cplusplus -} -#endif - -#endif /* RPMSG_RETARGET_H */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg_virtio.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg_virtio.h deleted file mode 100644 index b1369cacb4..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rpmsg_virtio.h +++ /dev/null @@ -1,190 +0,0 @@ -/* - * rpmsg based on virtio - * - * Copyright (C) 2018 Linaro, Inc. - * - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef _RPMSG_VIRTIO_H_ -#define _RPMSG_VIRTIO_H_ - -#include -#include -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* Configurable parameters */ -#ifndef RPMSG_BUFFER_SIZE -#define RPMSG_BUFFER_SIZE (512) -#endif - -/* The feature bitmap for virtio rpmsg */ -#define VIRTIO_RPMSG_F_NS 0 /* RP supports name service notifications */ - -struct rpmsg_virtio_shm_pool; -/** - * struct rpmsg_virtio_shm_pool - shared memory pool used for rpmsg buffers - * @get_buffer: function to get buffer from the pool - * @base: base address of the memory pool - * @avail: available memory size - * @size: total pool size - */ -struct rpmsg_virtio_shm_pool { - void *base; - size_t avail; - size_t size; -}; - -/** - * struct rpmsg_virtio_device - representation of a rpmsg device based on virtio - * @rdev: rpmsg device, first property in the struct - * @vdev: pointer to the virtio device - * @rvq: pointer to receive virtqueue - * @svq: pointer to send virtqueue - * @shbuf_io: pointer to the shared buffer I/O region - * @shpool: pointer to the shared buffers pool - * @endpoints: list of endpoints. - */ -struct rpmsg_virtio_device { - struct rpmsg_device rdev; - struct virtio_device *vdev; - struct virtqueue *rvq; - struct virtqueue *svq; - struct metal_io_region *shbuf_io; - struct rpmsg_virtio_shm_pool *shpool; -}; - -#define RPMSG_REMOTE VIRTIO_DEV_SLAVE -#define RPMSG_MASTER VIRTIO_DEV_MASTER -static inline unsigned int - rpmsg_virtio_get_role(struct rpmsg_virtio_device *rvdev) -{ - return rvdev->vdev->role; -} - -static inline void rpmsg_virtio_set_status(struct rpmsg_virtio_device *rvdev, - uint8_t status) -{ - rvdev->vdev->func->set_status(rvdev->vdev, status); -} - -static inline uint8_t rpmsg_virtio_get_status(struct rpmsg_virtio_device *rvdev) -{ - return rvdev->vdev->func->get_status(rvdev->vdev); -} - -static inline uint32_t - rpmsg_virtio_get_features(struct rpmsg_virtio_device *rvdev) -{ - return rvdev->vdev->func->get_features(rvdev->vdev); -} - -static inline int - rpmsg_virtio_create_virtqueues(struct rpmsg_virtio_device *rvdev, - int flags, unsigned int nvqs, - const char *names[], - vq_callback * callbacks[]) -{ - return virtio_create_virtqueues(rvdev->vdev, flags, nvqs, names, - callbacks); -} - -/** - * rpmsg_virtio_get_buffer_size - get rpmsg virtio buffer size - * - * @rdev - pointer to the rpmsg device - * - * @return - next available buffer size for text, negative value for failure - */ -int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev); - -/** - * rpmsg_init_vdev - initialize rpmsg virtio device - * Master side: - * Initialize RPMsg virtio queues and shared buffers, the address of shm can be - * ANY. In this case, function will get shared memory from system shared memory - * pools. If the vdev has RPMsg name service feature, this API will create an - * name service endpoint. - * - * Slave side: - * This API will not return until the driver ready is set by the master side. - * - * @param rvdev - pointer to the rpmsg virtio device - * @param vdev - pointer to the virtio device - * @param ns_bind_cb - callback handler for name service announcement without - * local endpoints waiting to bind. - * @param shm_io - pointer to the share memory I/O region. - * @param shpool - pointer to shared memory pool. rpmsg_virtio_init_shm_pool has - * to be called first to fill this structure. - * - * @return - status of function execution - */ -int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, - struct virtio_device *vdev, - rpmsg_ns_bind_cb ns_bind_cb, - struct metal_io_region *shm_io, - struct rpmsg_virtio_shm_pool *shpool); - -/** - * rpmsg_deinit_vdev - deinitialize rpmsg virtio device - * - * @param rvdev - pointer to the rpmsg virtio device - */ -void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev); - -/** - * rpmsg_virtio_init_shm_pool - initialize default shared buffers pool - * - * RPMsg virtio has default shared buffers pool implementation. - * The memory assigned to this pool will be dedicated to the RPMsg - * virtio. This function has to be called before calling rpmsg_init_vdev, - * to initialize the rpmsg_virtio_shm_pool structure. - * - * @param shpool - pointer to the shared buffers pool structure - * @param shbuf - pointer to the beginning of shared buffers - * @param size - shared buffers total size - */ -void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, - void *shbuf, size_t size); - -/** - * rpmsg_virtio_get_rpmsg_device - get RPMsg device from RPMsg virtio device - * - * @param rvdev - pointer to RPMsg virtio device - * @return - RPMsg device pointed by RPMsg virtio device - */ -static inline struct rpmsg_device * -rpmsg_virtio_get_rpmsg_device(struct rpmsg_virtio_device *rvdev) -{ - return &rvdev->rdev; -} - -/** - * rpmsg_virtio_shm_pool_get_buffer - get buffer in the shared memory pool - * - * RPMsg virtio has default shared buffers pool implementation. - * The memory assigned to this pool will be dedicated to the RPMsg - * virtio. If you prefer to have other shared buffers allocation, - * you can implement your rpmsg_virtio_shm_pool_get_buffer function. - * - * @param shpool - pointer to the shared buffers pool - * @param size - shared buffers total size - * @return - buffer pointer if free buffer is available, NULL otherwise. - */ -metal_weak void * -rpmsg_virtio_shm_pool_get_buffer(struct rpmsg_virtio_shm_pool *shpool, - size_t size); - -#if defined __cplusplus -} -#endif - -#endif /* _RPMSG_VIRTIO_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rsc_table_parser.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rsc_table_parser.h deleted file mode 100644 index b0aa27e2d8..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/rsc_table_parser.h +++ /dev/null @@ -1,64 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#ifndef RSC_TABLE_PARSER_H -#define RSC_TABLE_PARSER_H - -#include - -#if defined __cplusplus -extern "C" { -#endif - -#define RSC_TAB_SUPPORTED_VERSION 1 -#define RSC_TAB_HEADER_SIZE 12 -#define RSC_TAB_MAX_VRINGS 2 - -/* Standard control request handling. */ -typedef int (*rsc_handler) (struct remoteproc *rproc, void *rsc); - -/** - * handle_rsc_table - * - * This function parses resource table. - * - * @param rproc - pointer to remote remoteproc - * @param rsc_table - resource table to parse - * @param size - size of rsc table - * @param io - pointer to the resource table I/O region - * It can be NULL if the resource table - * is in the local memory. - * - * @returns - execution status - * - */ -int handle_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, int len, - struct metal_io_region *io); -int handle_carve_out_rsc(struct remoteproc *rproc, void *rsc); -int handle_trace_rsc(struct remoteproc *rproc, void *rsc); -int handle_vdev_rsc(struct remoteproc *rproc, void *rsc); -int handle_vendor_rsc(struct remoteproc *rproc, void *rsc); - -/** - * find_rsc - * - * find out location of a resource type in the resource table. - * - * @rsc_table - pointer to the resource table - * @rsc_type - type of the resource - * @index - index of the resource of the specified type - * - * return the offset to the resource on success, or 0 on failure - */ -size_t find_rsc(void *rsc_table, unsigned int rsc_type, unsigned int index); - -#if defined __cplusplus -} -#endif - -#endif /* RSC_TABLE_PARSER_H */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtio.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtio.h deleted file mode 100644 index 463079bf37..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtio.h +++ /dev/null @@ -1,176 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-3-Clause - * - * $FreeBSD$ - */ - -#ifndef _VIRTIO_H_ -#define _VIRTIO_H_ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -/* TODO: define this as compiler flags */ -#ifndef VIRTIO_MAX_NUM_VRINGS -#define VIRTIO_MAX_NUM_VRINGS 2 -#endif - -/* VirtIO device IDs. */ -#define VIRTIO_ID_NETWORK 0x01UL -#define VIRTIO_ID_BLOCK 0x02UL -#define VIRTIO_ID_CONSOLE 0x03UL -#define VIRTIO_ID_ENTROPY 0x04UL -#define VIRTIO_ID_BALLOON 0x05UL -#define VIRTIO_ID_IOMEMORY 0x06UL -#define VIRTIO_ID_RPMSG 0x07UL /* remote processor messaging */ -#define VIRTIO_ID_SCSI 0x08UL -#define VIRTIO_ID_9P 0x09UL -#define VIRTIO_DEV_ANY_ID (-1)UL - -/* Status byte for guest to report progress. */ -#define VIRTIO_CONFIG_STATUS_ACK 0x01 -#define VIRTIO_CONFIG_STATUS_DRIVER 0x02 -#define VIRTIO_CONFIG_STATUS_DRIVER_OK 0x04 -#define VIRTIO_CONFIG_STATUS_NEEDS_RESET 0x40 -#define VIRTIO_CONFIG_STATUS_FAILED 0x80 - -/* Virtio device role */ -#define VIRTIO_DEV_MASTER 0UL -#define VIRTIO_DEV_SLAVE 1UL - -struct virtio_device_id { - uint32_t device; - uint32_t vendor; -}; - -/* - * Generate interrupt when the virtqueue ring is - * completely used, even if we've suppressed them. - */ -#define VIRTIO_F_NOTIFY_ON_EMPTY (1 << 24) - -/* - * The guest should never negotiate this feature; it - * is used to detect faulty drivers. - */ -#define VIRTIO_F_BAD_FEATURE (1 << 30) - -/* - * Some VirtIO feature bits (currently bits 28 through 31) are - * reserved for the transport being used (eg. virtio_ring), the - * rest are per-device feature bits. - */ -#define VIRTIO_TRANSPORT_F_START 28 -#define VIRTIO_TRANSPORT_F_END 32 - -typedef void (*virtio_dev_reset_cb)(struct virtio_device *vdev); - -struct virtio_dispatch; - -struct virtio_feature_desc { - uint32_t vfd_val; - const char *vfd_str; -}; - -/** - * struct proc_shm - * - * This structure is maintained by hardware interface layer for - * shared memory information. The shared memory provides buffers - * for use by the vring to exchange messages between the cores. - * - */ -struct virtio_buffer_info { - /* Start address of shared memory used for buffers. */ - void *vaddr; - /* Start physical address of shared memory used for buffers. */ - metal_phys_addr_t paddr; - /* sharmed memory I/O region */ - struct metal_io_region *io; - /* Size of shared memory. */ - unsigned long size; -}; - -/** - * struct remoteproc_vring - remoteproc vring structure - * @vq virtio queue - * @va logical address - * @notifyid vring notify id - * @num_descs number of descriptors - * @align vring alignment - * @io metal I/O region of the vring memory, can be NULL - */ -struct virtio_vring_info { - struct virtqueue *vq; - struct vring_alloc_info info; - uint32_t notifyid; - struct metal_io_region *io; -}; - -/* - * Structure definition for virtio devices for use by the - * applications/drivers - */ - -struct virtio_device { - uint32_t index; /**< unique position on the virtio bus */ - struct virtio_device_id id; /**< the device type identification - * (used to match it with a driver - */ - uint64_t features; /**< the features supported by both ends. */ - unsigned int role; /**< if it is virtio backend or front end. */ - virtio_dev_reset_cb reset_cb; /**< user registered device callback */ - const struct virtio_dispatch *func; /**< Virtio dispatch table */ - void *priv; /**< TODO: remove pointer to virtio_device private data */ - unsigned int vrings_num; /**< number of vrings */ - struct virtio_vring_info *vrings_info; -}; - -/* - * Helper functions. - */ -const char *virtio_dev_name(uint16_t devid); -void virtio_describe(struct virtio_device *dev, const char *msg, - uint32_t features, - struct virtio_feature_desc *feature_desc); - -/* - * Functions for virtio device configuration as defined in Rusty Russell's - * paper. - * Drivers are expected to implement these functions in their respective codes. - */ - -struct virtio_dispatch { - uint8_t (*get_status)(struct virtio_device *dev); - void (*set_status)(struct virtio_device *dev, uint8_t status); - uint32_t (*get_features)(struct virtio_device *dev); - void (*set_features)(struct virtio_device *dev, uint32_t feature); - uint32_t (*negotiate_features)(struct virtio_device *dev, - uint32_t features); - - /* - * Read/write a variable amount from the device specific (ie, network) - * configuration region. This region is encoded in the same endian as - * the guest. - */ - void (*read_config)(struct virtio_device *dev, uint32_t offset, - void *dst, int length); - void (*write_config)(struct virtio_device *dev, uint32_t offset, - void *src, int length); - void (*reset_device)(struct virtio_device *dev); - void (*notify)(struct virtqueue *vq); -}; - -int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, - unsigned int nvqs, const char *names[], - vq_callback *callbacks[]); - -#if defined __cplusplus -} -#endif - -#endif /* _VIRTIO_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtio_ring.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtio_ring.h deleted file mode 100644 index 14e7b6b571..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtio_ring.h +++ /dev/null @@ -1,152 +0,0 @@ -/* - * Copyright Rusty Russell IBM Corporation 2007. - * - * SPDX-License-Identifier: BSD-3-Clause - * - * $FreeBSD$ - */ - -#ifndef VIRTIO_RING_H -#define VIRTIO_RING_H - -#if defined __cplusplus -extern "C" { -#endif - -/* This marks a buffer as continuing via the next field. */ -#define VRING_DESC_F_NEXT 1 -/* This marks a buffer as write-only (otherwise read-only). */ -#define VRING_DESC_F_WRITE 2 -/* This means the buffer contains a list of buffer descriptors. */ -#define VRING_DESC_F_INDIRECT 4 - -/* The Host uses this in used->flags to advise the Guest: don't kick me - * when you add a buffer. It's unreliable, so it's simply an - * optimization. Guest will still kick if it's out of buffers. - */ -#define VRING_USED_F_NO_NOTIFY 1 -/* The Guest uses this in avail->flags to advise the Host: don't - * interrupt me when you consume a buffer. It's unreliable, so it's - * simply an optimization. - */ -#define VRING_AVAIL_F_NO_INTERRUPT 1 - -/* VirtIO ring descriptors: 16 bytes. - * These can chain together via "next". - */ -struct vring_desc { - /* Address (guest-physical). */ - uint64_t addr; - /* Length. */ - uint32_t len; - /* The flags as indicated above. */ - uint16_t flags; - /* We chain unused descriptors via this, too. */ - uint16_t next; -}; - -struct vring_avail { - uint16_t flags; - uint16_t idx; - uint16_t ring[0]; -}; - -/* uint32_t is used here for ids for padding reasons. */ -struct vring_used_elem { - /* Index of start of used descriptor chain. */ - uint32_t id; - /* Total length of the descriptor chain which was written to. */ - uint32_t len; -}; - -struct vring_used { - uint16_t flags; - uint16_t idx; - struct vring_used_elem ring[0]; -}; - -struct vring { - unsigned int num; - - struct vring_desc *desc; - struct vring_avail *avail; - struct vring_used *used; -}; - -/* The standard layout for the ring is a continuous chunk of memory which - * looks like this. We assume num is a power of 2. - * - * struct vring { - * // The actual descriptors (16 bytes each) - * struct vring_desc desc[num]; - * - * // A ring of available descriptor heads with free-running index. - * __u16 avail_flags; - * __u16 avail_idx; - * __u16 available[num]; - * __u16 used_event_idx; - * - * // Padding to the next align boundary. - * char pad[]; - * - * // A ring of used descriptor heads with free-running index. - * __u16 used_flags; - * __u16 used_idx; - * struct vring_used_elem used[num]; - * __u16 avail_event_idx; - * }; - * - * NOTE: for VirtIO PCI, align is 4096. - */ - -/* - * We publish the used event index at the end of the available ring, and vice - * versa. They are at the end for backwards compatibility. - */ -#define vring_used_event(vr) ((vr)->avail->ring[(vr)->num]) -#define vring_avail_event(vr) ((vr)->used->ring[(vr)->num].id & 0xFFFF) - -static inline int vring_size(unsigned int num, unsigned long align) -{ - int size; - - size = num * sizeof(struct vring_desc); - size += sizeof(struct vring_avail) + (num * sizeof(uint16_t)) + - sizeof(uint16_t); - size = (size + align - 1) & ~(align - 1); - size += sizeof(struct vring_used) + - (num * sizeof(struct vring_used_elem)) + sizeof(uint16_t); - - return size; -} - -static inline void -vring_init(struct vring *vr, unsigned int num, uint8_t *p, unsigned long align) -{ - vr->num = num; - vr->desc = (struct vring_desc *)p; - vr->avail = (struct vring_avail *)(p + num * sizeof(struct vring_desc)); - vr->used = (struct vring_used *) - (((unsigned long)&vr->avail->ring[num] + sizeof(uint16_t) + - align - 1) & ~(align - 1)); -} - -/* - * The following is used with VIRTIO_RING_F_EVENT_IDX. - * - * Assuming a given event_idx value from the other size, if we have - * just incremented index from old to new_idx, should we trigger an - * event? - */ -static inline int -vring_need_event(uint16_t event_idx, uint16_t new_idx, uint16_t old) -{ - return (uint16_t)(new_idx - event_idx - 1) < - (uint16_t)(new_idx - old); -} - -#if defined __cplusplus -} -#endif - -#endif /* VIRTIO_RING_H */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtqueue.h b/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtqueue.h deleted file mode 100644 index ad24749062..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/include/openamp/virtqueue.h +++ /dev/null @@ -1,236 +0,0 @@ -#ifndef VIRTQUEUE_H_ -#define VIRTQUEUE_H_ - -/*- - * Copyright (c) 2011, Bryan Venteicher - * All rights reserved. - * - * SPDX-License-Identifier: BSD-2-Clause - * - * $FreeBSD$ - */ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -typedef uint8_t boolean; - -#include -#include -#include - -/*Error Codes*/ -#define VQ_ERROR_BASE -3000 -#define ERROR_VRING_FULL (VQ_ERROR_BASE - 1) -#define ERROR_INVLD_DESC_IDX (VQ_ERROR_BASE - 2) -#define ERROR_EMPTY_RING (VQ_ERROR_BASE - 3) -#define ERROR_NO_MEM (VQ_ERROR_BASE - 4) -#define ERROR_VRING_MAX_DESC (VQ_ERROR_BASE - 5) -#define ERROR_VRING_ALIGN (VQ_ERROR_BASE - 6) -#define ERROR_VRING_NO_BUFF (VQ_ERROR_BASE - 7) -#define ERROR_VQUEUE_INVLD_PARAM (VQ_ERROR_BASE - 8) - -#define VQUEUE_SUCCESS 0 - -/* The maximum virtqueue size is 2^15. Use that value as the end of - * descriptor chain terminator since it will never be a valid index - * in the descriptor table. This is used to verify we are correctly - * handling vq_free_cnt. - */ -#define VQ_RING_DESC_CHAIN_END 32768 -#define VIRTQUEUE_FLAG_INDIRECT 0x0001 -#define VIRTQUEUE_FLAG_EVENT_IDX 0x0002 -#define VIRTQUEUE_MAX_NAME_SZ 32 - -/* Support for indirect buffer descriptors. */ -#define VIRTIO_RING_F_INDIRECT_DESC (1 << 28) - -/* Support to suppress interrupt until specific index is reached. */ -#define VIRTIO_RING_F_EVENT_IDX (1 << 29) - -struct virtqueue_buf { - void *buf; - int len; -}; - -struct virtqueue { - struct virtio_device *vq_dev; - const char *vq_name; - uint16_t vq_queue_index; - uint16_t vq_nentries; - uint32_t vq_flags; - void (*callback)(struct virtqueue *vq); - void (*notify)(struct virtqueue *vq); - struct vring vq_ring; - uint16_t vq_free_cnt; - uint16_t vq_queued_cnt; - void *shm_io; /* opaque pointer to data needed to allow v2p & p2v */ - - /* - * Head of the free chain in the descriptor table. If - * there are no free descriptors, this will be set to - * VQ_RING_DESC_CHAIN_END. - */ - uint16_t vq_desc_head_idx; - - /* - * Last consumed descriptor in the used table, - * trails vq_ring.used->idx. - */ - uint16_t vq_used_cons_idx; - - /* - * Last consumed descriptor in the available table - - * used by the consumer side. - */ - uint16_t vq_available_idx; - -#ifdef VQUEUE_DEBUG - boolean vq_inuse; -#endif - - /* - * Used by the host side during callback. Cookie - * holds the address of buffer received from other side. - * Other fields in this structure are not used currently. - */ - - struct vq_desc_extra { - void *cookie; - uint16_t ndescs; - } vq_descx[0]; -}; - -/* struct to hold vring specific information */ -struct vring_alloc_info { - void *vaddr; - uint32_t align; - uint16_t num_descs; - uint16_t pad; -}; - -typedef void vq_callback(struct virtqueue *); -typedef void vq_notify(struct virtqueue *); - -#ifdef VQUEUE_DEBUG -#include -#include - -#define VQASSERT(_vq, _exp, _msg) \ - do { \ - if (!(_exp)) { \ - metal_log(METAL_LOG_EMERGENCY, \ - "%s: %s - _msg", __func__, (_vq)->vq_name); \ - metal_assert(_exp); \ - } \ - } while (0) - -#define VQ_RING_ASSERT_VALID_IDX(_vq, _idx) \ - VQASSERT((_vq), (_idx) < (_vq)->vq_nentries, "invalid ring index") - -#define VQ_RING_ASSERT_CHAIN_TERM(_vq) \ - VQASSERT((_vq), (_vq)->vq_desc_head_idx == \ - VQ_RING_DESC_CHAIN_END, \ - "full ring terminated incorrectly: invalid head") - -#define VQ_PARAM_CHK(condition, status_var, status_err) \ - do { \ - if (((status_var) == 0) && (condition)) { \ - status_var = status_err; \ - } \ - } while (0) - -#define VQUEUE_BUSY(vq) \ - do { \ - if (!(vq)->vq_inuse) \ - (vq)->vq_inuse = true; \ - else \ - VQASSERT(vq, !(vq)->vq_inuse,\ - "VirtQueue already in use") \ - } while (0) - -#define VQUEUE_IDLE(vq) ((vq)->vq_inuse = false) - -#else - -#define KASSERT(cond, str) -#define VQASSERT(_vq, _exp, _msg) -#define VQ_RING_ASSERT_VALID_IDX(_vq, _idx) -#define VQ_RING_ASSERT_CHAIN_TERM(_vq) -#define VQ_PARAM_CHK(condition, status_var, status_err) -#define VQUEUE_BUSY(vq) -#define VQUEUE_IDLE(vq) - -#endif - -int virtqueue_create(struct virtio_device *device, unsigned short id, - const char *name, struct vring_alloc_info *ring, - void (*callback)(struct virtqueue *vq), - void (*notify)(struct virtqueue *vq), - struct virtqueue *v_queue); - -/* - * virtqueue_set_shmem_io - * - * set virtqueue shared memory I/O region - * - * @vq - virt queue - * @io - pointer to the shared memory I/O region - */ -static inline void virtqueue_set_shmem_io(struct virtqueue *vq, - struct metal_io_region *io) -{ - vq->shm_io = io; -} - -int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, - int readable, int writable, void *cookie); - -void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx); - -void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, - uint32_t *len); - -int virtqueue_add_consumed_buffer(struct virtqueue *vq, uint16_t head_idx, - uint32_t len); - -void virtqueue_disable_cb(struct virtqueue *vq); - -int virtqueue_enable_cb(struct virtqueue *vq); - -void virtqueue_kick(struct virtqueue *vq); - -static inline struct virtqueue *virtqueue_allocate(unsigned int num_desc_extra) -{ - struct virtqueue *vqs; - uint32_t vq_size = sizeof(struct virtqueue) + - num_desc_extra * sizeof(struct vq_desc_extra); - - vqs = (struct virtqueue *)metal_allocate_memory(vq_size); - - if (vqs) { - memset(vqs, 0x00, vq_size); - } - - return vqs; -} - -void virtqueue_free(struct virtqueue *vq); - -void virtqueue_dump(struct virtqueue *vq); - -void virtqueue_notification(struct virtqueue *vq); - -uint32_t virtqueue_get_desc_size(struct virtqueue *vq); - -uint32_t virtqueue_get_buffer_length(struct virtqueue *vq, uint16_t idx); - -#if defined __cplusplus -} -#endif - -#endif /* VIRTQUEUE_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/proxy/CMakeLists.txt b/ext/lib/ipc/open-amp/open-amp/lib/proxy/CMakeLists.txt deleted file mode 100644 index 4cbc5995a1..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/proxy/CMakeLists.txt +++ /dev/null @@ -1 +0,0 @@ -collect (PROJECT_LIB_SOURCES rpmsg_retarget.c) diff --git a/ext/lib/ipc/open-amp/open-amp/lib/proxy/rpmsg_retarget.c b/ext/lib/ipc/open-amp/open-amp/lib/proxy/rpmsg_retarget.c deleted file mode 100644 index 9035db2299..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/proxy/rpmsg_retarget.c +++ /dev/null @@ -1,343 +0,0 @@ -#include -#include -#include -#include -#include -#include -#include -#include - -/************************************************************************* - * Description - * This files contains rpmsg based redefinitions for C RTL system calls - * such as _open, _read, _write, _close. - *************************************************************************/ -static struct rpmsg_rpc_data *rpmsg_default_rpc; - -static int rpmsg_rpc_ept_cb(struct rpmsg_endpoint *ept, void *data, size_t len, - uint32_t src, void *priv) -{ - struct rpmsg_rpc_syscall *syscall; - - (void)priv; - (void)src; - - if (data != NULL && ept != NULL) { - syscall = data; - if (syscall->id == TERM_SYSCALL_ID) { - rpmsg_destroy_ept(ept); - } else { - struct rpmsg_rpc_data *rpc; - - rpc = metal_container_of(ept, - struct rpmsg_rpc_data, - ept); - metal_spinlock_acquire(&rpc->buflock); - if (rpc->respbuf != NULL && rpc->respbuf_len != 0) { - if (len > rpc->respbuf_len) - len = rpc->respbuf_len; - memcpy(rpc->respbuf, data, len); - } - atomic_flag_clear(&rpc->nacked); - metal_spinlock_release(&rpc->buflock); - } - } - - return RPMSG_SUCCESS; -} - -static void rpmsg_service_unbind(struct rpmsg_endpoint *ept) -{ - struct rpmsg_rpc_data *rpc; - - rpc = metal_container_of(ept, struct rpmsg_rpc_data, ept); - rpc->ept_destroyed = 1; - rpmsg_destroy_ept(ept); - atomic_flag_clear(&rpc->nacked); - if (rpc->shutdown_cb) - rpc->shutdown_cb(rpc); -} - - -int rpmsg_rpc_init(struct rpmsg_rpc_data *rpc, - struct rpmsg_device *rdev, - const char *ept_name, uint32_t ept_addr, - uint32_t ept_raddr, - void *poll_arg, rpmsg_rpc_poll poll, - rpmsg_rpc_shutdown_cb shutdown_cb) -{ - int ret; - - if (rpc == NULL || rdev == NULL) - return -EINVAL; - metal_spinlock_init(&rpc->buflock); - metal_mutex_init(&rpc->lock); - rpc->shutdown_cb = shutdown_cb; - rpc->poll_arg = poll_arg; - rpc->poll = poll; - rpc->ept_destroyed = 0; - rpc->respbuf = NULL; - rpc->respbuf_len = 0; - atomic_init(&rpc->nacked, 1); - ret = rpmsg_create_ept(&rpc->ept, rdev, - ept_name, ept_addr, ept_raddr, - rpmsg_rpc_ept_cb, rpmsg_service_unbind); - if (ret != 0) { - metal_mutex_release(&rpc->lock); - return -EINVAL; - } - while (!is_rpmsg_ept_ready(&rpc->ept)) { - if (rpc->poll) - rpc->poll(rpc->poll_arg); - } - return 0; -} - -void rpmsg_rpc_release(struct rpmsg_rpc_data *rpc) -{ - if (rpc == NULL) - return; - if (rpc->ept_destroyed == 0) - rpmsg_destroy_ept(&rpc->ept); - metal_mutex_acquire(&rpc->lock); - metal_spinlock_acquire(&rpc->buflock); - rpc->respbuf = NULL; - rpc->respbuf_len = 0; - metal_spinlock_release(&rpc->buflock); - metal_mutex_release(&rpc->lock); - metal_mutex_deinit(&rpc->lock); - - return; -} - -int rpmsg_rpc_send(struct rpmsg_rpc_data *rpc, - void *req, size_t len, - void *resp, size_t resp_len) -{ - int ret; - - if (rpc == NULL) - return -EINVAL; - metal_spinlock_acquire(&rpc->buflock); - rpc->respbuf = resp; - rpc->respbuf_len = resp_len; - metal_spinlock_release(&rpc->buflock); - (void)atomic_flag_test_and_set(&rpc->nacked); - ret = rpmsg_send(&rpc->ept, req, len); - if (ret < 0) - return -EINVAL; - if (!resp) - return ret; - while((atomic_flag_test_and_set(&rpc->nacked))) { - if (rpc->poll) - rpc->poll(rpc->poll_arg); - } - return ret; -} - -void rpmsg_set_default_rpc(struct rpmsg_rpc_data *rpc) -{ - if (rpc == NULL) - return; - rpmsg_default_rpc = rpc; -} - -/************************************************************************* - * - * FUNCTION - * - * _open - * - * DESCRIPTION - * - * Open a file. Minimal implementation - * - *************************************************************************/ -#define MAX_BUF_LEN 496UL - -int _open(const char *filename, int flags, int mode) -{ - struct rpmsg_rpc_data *rpc = rpmsg_default_rpc; - struct rpmsg_rpc_syscall *syscall; - struct rpmsg_rpc_syscall resp; - int filename_len = strlen(filename) + 1; - int payload_size = sizeof(*syscall) + filename_len; - unsigned char tmpbuf[MAX_BUF_LEN]; - int ret; - - if (filename == NULL || payload_size > (int)MAX_BUF_LEN) { - return -EINVAL; - } - - if (rpc == NULL) - return -EINVAL; - - /* Construct rpc payload */ - syscall = (struct rpmsg_rpc_syscall *)tmpbuf; - syscall->id = OPEN_SYSCALL_ID; - syscall->args.int_field1 = flags; - syscall->args.int_field2 = mode; - syscall->args.data_len = filename_len; - memcpy(tmpbuf + sizeof(*syscall), filename, filename_len); - - resp.id = 0; - ret = rpmsg_rpc_send(rpc, tmpbuf, payload_size, - (void *)&resp, sizeof(resp)); - if (ret >= 0) { - /* Obtain return args and return to caller */ - if (resp.id == OPEN_SYSCALL_ID) - ret = resp.args.int_field1; - else - ret = -EINVAL; - } - - return ret; -} - -/************************************************************************* - * - * FUNCTION - * - * _read - * - * DESCRIPTION - * - * Low level function to redirect IO to serial. - * - *************************************************************************/ -int _read(int fd, char *buffer, int buflen) -{ - struct rpmsg_rpc_syscall syscall; - struct rpmsg_rpc_syscall *resp; - struct rpmsg_rpc_data *rpc = rpmsg_default_rpc; - int payload_size = sizeof(syscall); - unsigned char tmpbuf[MAX_BUF_LEN]; - int ret; - - if (rpc == NULL || buffer == NULL || buflen == 0) - return -EINVAL; - - /* Construct rpc payload */ - syscall.id = READ_SYSCALL_ID; - syscall.args.int_field1 = fd; - syscall.args.int_field2 = buflen; - syscall.args.data_len = 0; /*not used */ - - resp = (struct rpmsg_rpc_syscall *)tmpbuf; - resp->id = 0; - ret = rpmsg_rpc_send(rpc, (void *)&syscall, payload_size, - tmpbuf, sizeof(tmpbuf)); - - /* Obtain return args and return to caller */ - if (ret >= 0) { - if (resp->id == READ_SYSCALL_ID) { - if (resp->args.int_field1 > 0) { - int tmplen = resp->args.data_len; - unsigned char *tmpptr = tmpbuf; - - tmpptr += sizeof(*resp); - if (tmplen > buflen) - tmplen = buflen; - memcpy(buffer, tmpptr, tmplen); - } - ret = resp->args.int_field1; - } else { - ret = -EINVAL; - } - } - - return ret; -} - -/************************************************************************* - * - * FUNCTION - * - * _write - * - * DESCRIPTION - * - * Low level function to redirect IO to serial. - * - *************************************************************************/ -int _write(int fd, const char *ptr, int len) -{ - int ret; - struct rpmsg_rpc_syscall *syscall; - struct rpmsg_rpc_syscall resp; - int payload_size = sizeof(*syscall) + len; - struct rpmsg_rpc_data *rpc = rpmsg_default_rpc; - unsigned char tmpbuf[MAX_BUF_LEN]; - unsigned char *tmpptr; - int null_term = 0; - - if (rpc == NULL) - return -EINVAL; - if (fd == 1) - null_term = 1; - - syscall = (struct rpmsg_rpc_syscall *)tmpbuf; - syscall->id = WRITE_SYSCALL_ID; - syscall->args.int_field1 = fd; - syscall->args.int_field2 = len; - syscall->args.data_len = len + null_term; - tmpptr = tmpbuf + sizeof(*syscall); - memcpy(tmpptr, ptr, len); - if (null_term == 1) { - *(char *)(tmpptr + len + null_term) = 0; - payload_size += 1; - } - resp.id = 0; - ret = rpmsg_rpc_send(rpc, tmpbuf, payload_size, - (void *)&resp, sizeof(resp)); - - if (ret >= 0) { - if (resp.id == WRITE_SYSCALL_ID) - ret = resp.args.int_field1; - else - ret = -EINVAL; - } - - return ret; - -} - -/************************************************************************* - * - * FUNCTION - * - * _close - * - * DESCRIPTION - * - * Close a file. Minimal implementation - * - *************************************************************************/ -int _close(int fd) -{ - int ret; - struct rpmsg_rpc_syscall syscall; - struct rpmsg_rpc_syscall resp; - int payload_size = sizeof(syscall); - struct rpmsg_rpc_data *rpc = rpmsg_default_rpc; - - if (rpc == NULL) - return -EINVAL; - syscall.id = CLOSE_SYSCALL_ID; - syscall.args.int_field1 = fd; - syscall.args.int_field2 = 0; /*not used */ - syscall.args.data_len = 0; /*not used */ - - resp.id = 0; - ret = rpmsg_rpc_send(rpc, (void*)&syscall, payload_size, - (void*)&resp, sizeof(resp)); - - if (ret >= 0) { - if (resp.id == CLOSE_SYSCALL_ID) - ret = resp.args.int_field1; - else - ret = -EINVAL; - } - - return ret; -} diff --git a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/CMakeLists.txt b/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/CMakeLists.txt deleted file mode 100644 index 158df1d16e..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/CMakeLists.txt +++ /dev/null @@ -1,4 +0,0 @@ -collect (PROJECT_LIB_SOURCES elf_loader.c) -collect (PROJECT_LIB_SOURCES remoteproc.c) -collect (PROJECT_LIB_SOURCES remoteproc_virtio.c) -collect (PROJECT_LIB_SOURCES rsc_table_parser.c) diff --git a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/elf_loader.c b/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/elf_loader.c deleted file mode 100644 index e15a7843bb..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/elf_loader.c +++ /dev/null @@ -1,711 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include - -static int elf_is_64(const void *elf_info) -{ - const unsigned char *tmp = elf_info; - - if (tmp[EI_CLASS] == ELFCLASS64) - return 1; - else - return 0; -} - -static size_t elf_ehdr_size(const void *elf_info) -{ - if (elf_info == NULL) - return sizeof(Elf64_Ehdr); - else if (elf_is_64(elf_info) != 0) - return sizeof(Elf64_Ehdr); - else - return sizeof(Elf32_Ehdr); -} - -static size_t elf_phoff(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_phoff; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_phoff; - } -} - -static size_t elf_phentsize(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_phentsize; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_phentsize; - } -} - -static int elf_phnum(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_phnum; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_phnum; - } -} - -static size_t elf_shoff(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_shoff; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_shoff; - } -} - -static size_t elf_shentsize(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_shentsize; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_shentsize; - } -} - -static int elf_shnum(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_shnum; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_shnum; - } -} - -static int elf_shstrndx(const void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Ehdr *ehdr = elf_info; - - return ehdr->e_shstrndx; - } else { - const Elf64_Ehdr *ehdr = elf_info; - - return ehdr->e_shstrndx; - } -} - -static void *elf_phtable_ptr(void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - struct elf32_info *einfo = elf_info; - - return (void *)&einfo->phdrs; - } else { - struct elf64_info *einfo = elf_info; - - return (void *)&einfo->phdrs; - } -} - -static void *elf_shtable_ptr(void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - struct elf32_info *einfo = elf_info; - - return (void *)(&einfo->shdrs); - } else { - struct elf64_info *einfo = elf_info; - - return (void *)(&einfo->shdrs); - } -} - -static void **elf_shstrtab_ptr(void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - struct elf32_info *einfo = elf_info; - - return &einfo->shstrtab; - } else { - struct elf64_info *einfo = elf_info; - - return &einfo->shstrtab; - } -} - -static unsigned int *elf_load_state(void *elf_info) -{ - if (elf_is_64(elf_info) == 0) { - struct elf32_info *einfo = elf_info; - - return &einfo->load_state; - } else { - struct elf64_info *einfo = elf_info; - - return &einfo->load_state; - } -} - -static void elf_parse_segment(void *elf_info, const void *elf_phdr, - unsigned int *p_type, size_t *p_offset, - metal_phys_addr_t *p_vaddr, - metal_phys_addr_t *p_paddr, - size_t *p_filesz, size_t *p_memsz) -{ - if (elf_is_64(elf_info) == 0) { - const Elf32_Phdr *phdr = elf_phdr; - - if (p_type != NULL) - *p_type = (unsigned int)phdr->p_type; - if (p_offset != NULL) - *p_offset = (size_t)phdr->p_offset; - if (p_vaddr != NULL) - *p_vaddr = (metal_phys_addr_t)phdr->p_vaddr; - if (p_paddr != NULL) - *p_paddr = (metal_phys_addr_t)phdr->p_paddr; - if (p_filesz != NULL) - *p_filesz = (size_t)phdr->p_filesz; - if (p_memsz != NULL) - *p_memsz = (size_t)phdr->p_memsz; - } else { - const Elf64_Phdr *phdr = elf_phdr; - - if (p_type != NULL) - *p_type = (unsigned int)phdr->p_type; - if (p_offset != NULL) - *p_offset = (size_t)phdr->p_offset; - if (p_vaddr != NULL) - if (p_vaddr != NULL) - *p_vaddr = (metal_phys_addr_t)phdr->p_vaddr; - if (p_paddr != NULL) - *p_paddr = (metal_phys_addr_t)phdr->p_paddr; - if (p_filesz != NULL) - *p_filesz = (size_t)phdr->p_filesz; - if (p_memsz != NULL) - *p_memsz = (size_t)phdr->p_memsz; - } -} - -static const void *elf_get_segment_from_index(void *elf_info, int index) -{ - if (elf_is_64(elf_info) == 0) { - const struct elf32_info *einfo = elf_info; - const Elf32_Ehdr *ehdr = &einfo->ehdr; - const Elf32_Phdr *phdrs = einfo->phdrs; - - if (phdrs == NULL) - return NULL; - if (index < 0 || index > ehdr->e_phnum) - return NULL; - return &phdrs[index]; - } else { - const struct elf64_info *einfo = elf_info; - const Elf64_Ehdr *ehdr = &einfo->ehdr; - const Elf64_Phdr *phdrs = einfo->phdrs; - - if (phdrs == NULL) - return NULL; - if (index < 0 || index > ehdr->e_phnum) - return NULL; - return &phdrs[index]; - } -} - -static void *elf_get_section_from_name(void *elf_info, const char *name) -{ - unsigned int i; - const char *name_table; - - if (elf_is_64(elf_info) == 0) { - struct elf32_info *einfo = elf_info; - Elf32_Ehdr *ehdr = &einfo->ehdr; - Elf32_Shdr *shdr = einfo->shdrs; - - name_table = einfo->shstrtab; - if (shdr == NULL || name_table == NULL) - return NULL; - for (i = 0; i < ehdr->e_shnum; i++, shdr++) { - if (strcmp(name, name_table + shdr->sh_name)) - continue; - else - return shdr; - } - } else { - struct elf64_info *einfo = elf_info; - Elf64_Ehdr *ehdr = &einfo->ehdr; - Elf64_Shdr *shdr = einfo->shdrs; - - name_table = einfo->shstrtab; - if (shdr == NULL || name_table == NULL) - return NULL; - for (i = 0; i < ehdr->e_shnum; i++, shdr++) { - if (strcmp(name, name_table + shdr->sh_name)) - continue; - else - return shdr; - } - } - return NULL; -} - -static void *elf_get_section_from_index(void *elf_info, int index) -{ - if (elf_is_64(elf_info) == 0) { - struct elf32_info *einfo = elf_info; - Elf32_Ehdr *ehdr = &einfo->ehdr; - Elf32_Shdr *shdr = einfo->shdrs; - - if (shdr == NULL) - return NULL; - if (index > ehdr->e_shnum) - return NULL; - return &einfo->shdrs[index]; - } else { - struct elf64_info *einfo = elf_info; - Elf64_Ehdr *ehdr = &einfo->ehdr; - Elf64_Shdr *shdr = einfo->shdrs; - - if (shdr == NULL) - return NULL; - if (index > ehdr->e_shnum) - return NULL; - return &einfo->shdrs[index]; - } -} - -static void elf_parse_section(void *elf_info, void *elf_shdr, - unsigned int *sh_type, unsigned int *sh_flags, - metal_phys_addr_t *sh_addr, - size_t *sh_offset, size_t *sh_size, - unsigned int *sh_link, unsigned int *sh_info, - unsigned int *sh_addralign, - size_t *sh_entsize) -{ - if (elf_is_64(elf_info) == 0) { - Elf32_Shdr *shdr = elf_shdr; - - if (sh_type != NULL) - *sh_type = shdr->sh_type; - if (sh_flags != NULL) - *sh_flags = shdr->sh_flags; - if (sh_addr != NULL) - *sh_addr = (metal_phys_addr_t)shdr->sh_addr; - if (sh_offset != NULL) - *sh_offset = shdr->sh_offset; - if (sh_size != NULL) - *sh_size = shdr->sh_size; - if (sh_link != NULL) - *sh_link = shdr->sh_link; - if (sh_info != NULL) - *sh_info = shdr->sh_info; - if (sh_addralign != NULL) - *sh_addralign = shdr->sh_addralign; - if (sh_entsize != NULL) - *sh_entsize = shdr->sh_entsize; - } else { - Elf64_Shdr *shdr = elf_shdr; - - if (sh_type != NULL) - *sh_type = shdr->sh_type; - if (sh_flags != NULL) - *sh_flags = shdr->sh_flags; - if (sh_addr != NULL) - *sh_addr = (metal_phys_addr_t)(shdr->sh_addr & - (metal_phys_addr_t)(-1)); - if (sh_offset != NULL) - *sh_offset = shdr->sh_offset; - if (sh_size != NULL) - *sh_size = shdr->sh_size; - if (sh_link != NULL) - *sh_link = shdr->sh_link; - if (sh_info != NULL) - *sh_info = shdr->sh_info; - if (sh_addralign != NULL) - *sh_addralign = shdr->sh_addralign; - if (sh_entsize != NULL) - *sh_entsize = shdr->sh_entsize; - } -} - -static const void *elf_next_load_segment(void *elf_info, int *nseg, - metal_phys_addr_t *da, - size_t *noffset, size_t *nfsize, - size_t *nmsize) -{ - const void *phdr; - unsigned int p_type = PT_NULL; - - if (elf_info == NULL || nseg == NULL) - return NULL; - while(p_type != PT_LOAD) { - phdr = elf_get_segment_from_index(elf_info, *nseg); - if (phdr == NULL) - return NULL; - elf_parse_segment(elf_info, phdr, &p_type, noffset, - da, NULL, nfsize, nmsize); - *nseg = *nseg + 1; - } - return phdr; -} - -static size_t elf_info_size(const void *img_data) -{ - if (elf_is_64(img_data) == 0) - return sizeof(struct elf32_info); - else - return sizeof(struct elf64_info); -} - -int elf_identify(const void *img_data, size_t len) -{ - if (len < SELFMAG || img_data == NULL) - return -RPROC_EINVAL; - if (memcmp(img_data, ELFMAG, SELFMAG) != 0) - return -RPROC_EINVAL; - else - return 0; -} - -int elf_load_header(const void *img_data, size_t offset, size_t len, - void **img_info, int last_load_state, - size_t *noffset, size_t *nlen) -{ - unsigned int *load_state; - - metal_assert(noffset != NULL); - metal_assert(nlen != NULL); - /* Get ELF header */ - if (last_load_state == ELF_STATE_INIT) { - size_t tmpsize; - - metal_log(METAL_LOG_DEBUG, "Loading ELF headering\r\n"); - tmpsize = elf_ehdr_size(img_data); - if (len < tmpsize) { - *noffset = 0; - *nlen = tmpsize; - return ELF_STATE_INIT; - } else { - size_t infosize = elf_info_size(img_data); - - if (*img_info == NULL) { - *img_info = metal_allocate_memory(infosize); - if (*img_info == NULL) - return -ENOMEM; - memset(*img_info, 0, infosize); - } - memcpy(*img_info, img_data, tmpsize); - load_state = elf_load_state(*img_info); - *load_state = ELF_STATE_WAIT_FOR_PHDRS; - last_load_state = ELF_STATE_WAIT_FOR_PHDRS; - } - } - metal_assert(*img_info != NULL); - load_state = elf_load_state(*img_info); - if (last_load_state != (int)*load_state) - return -RPROC_EINVAL; - /* Get ELF program headers */ - if (*load_state == ELF_STATE_WAIT_FOR_PHDRS) { - size_t phdrs_size; - size_t phdrs_offset; - char **phdrs; - const void *img_phdrs; - - metal_log(METAL_LOG_DEBUG, "Loading ELF program header.\r\n"); - phdrs_offset = elf_phoff(*img_info); - phdrs_size = elf_phnum(*img_info) * elf_phentsize(*img_info); - if (offset > phdrs_offset || - offset + len < phdrs_offset + phdrs_size) { - *noffset = phdrs_offset; - *nlen = phdrs_size; - return (int)*load_state; - } - /* caculate the programs headers offset to the image_data */ - phdrs_offset -= offset; - img_phdrs = (const void *) - ((const char *)img_data + phdrs_offset); - phdrs = (char **)elf_phtable_ptr(*img_info); - (*phdrs) = metal_allocate_memory(phdrs_size); - if (*phdrs == NULL) - return -ENOMEM; - memcpy((void *)(*phdrs), img_phdrs, phdrs_size); - *load_state = ELF_STATE_WAIT_FOR_SHDRS | - RPROC_LOADER_READY_TO_LOAD; - } - /* Get ELF Section Headers */ - if ((*load_state & ELF_STATE_WAIT_FOR_SHDRS) != 0) { - size_t shdrs_size; - size_t shdrs_offset; - char **shdrs; - const void *img_shdrs; - - metal_log(METAL_LOG_DEBUG, "Loading ELF section header.\r\n"); - shdrs_offset = elf_shoff(*img_info); - if (elf_shnum(*img_info) == 0) { - *load_state = (*load_state & (~ELF_STATE_MASK)) | - ELF_STATE_HDRS_COMPLETE; - *nlen = 0; - return (int)*load_state; - } - shdrs_size = elf_shnum(*img_info) * elf_shentsize(*img_info); - if (offset > shdrs_offset || - offset + len < shdrs_offset + shdrs_size) { - *noffset = shdrs_offset; - *nlen = shdrs_size; - return (int)*load_state; - } - /* caculate the sections headers offset to the image_data */ - shdrs_offset -= offset; - img_shdrs = (const void *) - ((const char *)img_data + shdrs_offset); - shdrs = (char **)elf_shtable_ptr(*img_info); - (*shdrs) = metal_allocate_memory(shdrs_size); - if (*shdrs == NULL) - return -ENOMEM; - memcpy((void *)*shdrs, img_shdrs, shdrs_size); - *load_state = (*load_state & (~ELF_STATE_MASK)) | - ELF_STATE_WAIT_FOR_SHSTRTAB; - metal_log(METAL_LOG_DEBUG, - "Loading ELF section header complete.\r\n"); - } - /* Get ELF SHSTRTAB section */ - if ((*load_state & ELF_STATE_WAIT_FOR_SHSTRTAB) != 0) { - size_t shstrtab_size; - size_t shstrtab_offset; - int shstrndx; - void *shdr; - void **shstrtab; - - metal_log(METAL_LOG_DEBUG, "Loading ELF shstrtab.\r\n"); - shstrndx = elf_shstrndx(*img_info); - shdr = elf_get_section_from_index(*img_info, shstrndx); - if (shdr == NULL) - return -RPROC_EINVAL; - elf_parse_section(*img_info, shdr, NULL, NULL, - NULL, &shstrtab_offset, - &shstrtab_size, NULL, NULL, - NULL, NULL); - if (offset > shstrtab_offset || - offset + len < shstrtab_offset + shstrtab_size) { - *noffset = shstrtab_offset; - *nlen = shstrtab_size; - return (int)*load_state; - } - /* Caculate shstrtab section offset to the input image data */ - shstrtab_offset -= offset; - shstrtab = elf_shstrtab_ptr(*img_info); - *shstrtab = metal_allocate_memory(shstrtab_size); - if (*shstrtab == NULL) - return -ENOMEM; - memcpy(*shstrtab, - (const void *)((const char *)img_data + shstrtab_offset), - shstrtab_size); - *load_state = (*load_state & (~ELF_STATE_MASK)) | - ELF_STATE_HDRS_COMPLETE; - *nlen = 0; - return *load_state; - } - return last_load_state; -} - -int elf_load(struct remoteproc *rproc, - const void *img_data, size_t offset, size_t len, - void **img_info, int last_load_state, - metal_phys_addr_t *da, - size_t *noffset, size_t *nlen, - unsigned char *padding, size_t *nmemsize) -{ - unsigned int *load_state; - const void *phdr; - - (void)rproc; - metal_assert(da != NULL); - metal_assert(noffset != NULL); - metal_assert(nlen != NULL); - if ((last_load_state & RPROC_LOADER_MASK) == RPROC_LOADER_NOT_READY) { - metal_log(METAL_LOG_DEBUG, - "%s, needs to load header first\r\n"); - last_load_state = elf_load_header(img_data, offset, len, - img_info, last_load_state, - noffset, nlen); - if ((last_load_state & RPROC_LOADER_MASK) == - RPROC_LOADER_NOT_READY) { - *da = RPROC_LOAD_ANYADDR; - return last_load_state; - } - } - metal_assert(img_info != NULL && *img_info != NULL); - load_state = elf_load_state(*img_info); - /* For ELF, segment padding value is 0 */ - if (padding != NULL) - *padding = 0; - if ((*load_state & RPROC_LOADER_READY_TO_LOAD) != 0) { - int nsegment; - size_t nsegmsize = 0; - size_t nsize = 0; - int phnums = 0; - - nsegment = (int)(*load_state & ELF_NEXT_SEGMENT_MASK); - phdr = elf_next_load_segment(*img_info, &nsegment, da, - noffset, &nsize, &nsegmsize); - if (phdr == NULL) { - metal_log(METAL_LOG_DEBUG, "cannot find more segement\r\n"); - *load_state = (*load_state & (~ELF_NEXT_SEGMENT_MASK)) | - (unsigned int)(nsegment & ELF_NEXT_SEGMENT_MASK); - return *load_state; - } - *nlen = nsize; - *nmemsize = nsegmsize; - phnums = elf_phnum(*img_info); - metal_log(METAL_LOG_DEBUG, "segment: %d, total segs %d\r\n", - nsegment, phnums); - if (nsegment == elf_phnum(*img_info)) { - *load_state = (*load_state & (~RPROC_LOADER_MASK)) | - RPROC_LOADER_POST_DATA_LOAD; - } - *load_state = (*load_state & (~ELF_NEXT_SEGMENT_MASK)) | - (unsigned int)(nsegment & ELF_NEXT_SEGMENT_MASK); - } else if ((*load_state & RPROC_LOADER_POST_DATA_LOAD) != 0) { - if ((*load_state & ELF_STATE_HDRS_COMPLETE) == 0) { - last_load_state = elf_load_header(img_data, offset, - len, img_info, - last_load_state, - noffset, nlen); - if (last_load_state < 0) - return last_load_state; - if ((last_load_state & ELF_STATE_HDRS_COMPLETE) != 0) { - *load_state = (*load_state & - (~RPROC_LOADER_MASK)) | - RPROC_LOADER_LOAD_COMPLETE; - *nlen = 0; - } - *da = RPROC_LOAD_ANYADDR; - } else { - /* TODO: will handle relocate later */ - *nlen = 0; - *load_state = (*load_state & - (~RPROC_LOADER_MASK)) | - RPROC_LOADER_LOAD_COMPLETE; - } - } - return *load_state; -} - -void elf_release(void *img_info) -{ - if (img_info == NULL) - return; - if (elf_is_64(img_info) == 0) { - struct elf32_info *elf_info = img_info; - - if (elf_info->phdrs != NULL) - metal_free_memory(elf_info->phdrs); - if (elf_info->shdrs != NULL) - metal_free_memory(elf_info->shdrs); - if (elf_info->shstrtab != NULL) - metal_free_memory(elf_info->shstrtab); - metal_free_memory(img_info); - - } else { - struct elf64_info *elf_info = img_info; - - if (elf_info->phdrs != NULL) - metal_free_memory(elf_info->phdrs); - if (elf_info->shdrs != NULL) - metal_free_memory(elf_info->shdrs); - if (elf_info->shstrtab != NULL) - metal_free_memory(elf_info->shstrtab); - metal_free_memory(img_info); - } -} - -metal_phys_addr_t elf_get_entry(void *elf_info) -{ - if (!elf_info) - return METAL_BAD_PHYS; - - if (elf_is_64(elf_info) == 0) { - Elf32_Ehdr *elf_ehdr = (Elf32_Ehdr *)elf_info; - Elf32_Addr e_entry; - - e_entry = elf_ehdr->e_entry; - return (metal_phys_addr_t)e_entry; - } else { - Elf64_Ehdr *elf_ehdr = (Elf64_Ehdr *)elf_info; - Elf64_Addr e_entry; - - e_entry = elf_ehdr->e_entry; - return (metal_phys_addr_t)(e_entry & (metal_phys_addr_t)(-1)); - } -} - -int elf_locate_rsc_table(void *elf_info, metal_phys_addr_t *da, - size_t *offset, size_t *size) -{ - char *sect_name = ".resource_table"; - void *shdr; - unsigned int *load_state; - - if (elf_info == NULL) - return -RPROC_EINVAL; - - load_state = elf_load_state(elf_info); - if ((*load_state & ELF_STATE_HDRS_COMPLETE) == 0) - return -RPROC_ERR_LOADER_STATE; - shdr = elf_get_section_from_name(elf_info, sect_name); - if (shdr == NULL) { - metal_assert(size != NULL); - *size = 0; - return 0; - } - elf_parse_section(elf_info, shdr, NULL, NULL, - da, offset, size, - NULL, NULL, NULL, NULL); - return 0; -} - -int elf_get_load_state(void *img_info) -{ - unsigned int *load_state; - - if (img_info == NULL) - return -RPROC_EINVAL; - load_state = elf_load_state(img_info); - return (int)(*load_state); -} - -struct loader_ops elf_ops = { - .load_header = elf_load_header, - .load_data = elf_load, - .locate_rsc_table = elf_locate_rsc_table, - .release = elf_release, - .get_entry = elf_get_entry, - .get_load_state = elf_get_load_state, -}; diff --git a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/remoteproc.c b/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/remoteproc.c deleted file mode 100644 index be9b869362..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/remoteproc.c +++ /dev/null @@ -1,963 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * Copyright (c) 2015 Xilinx, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include -#include -#include -#include - -/****************************************************************************** - * static functions - *****************************************************************************/ -static struct loader_ops * -remoteproc_check_fw_format(const void *img_data, size_t img_len) -{ - if (img_len <= 0) - return NULL; - else if (elf_identify(img_data, img_len) == 0) - return &elf_ops; - else - return NULL; -} - -static struct remoteproc_mem * -remoteproc_get_mem(struct remoteproc *rproc, const char *name, - metal_phys_addr_t pa, metal_phys_addr_t da, - void *va, size_t size) -{ - struct metal_list *node; - struct remoteproc_mem *mem; - - metal_list_for_each(&rproc->mems, node) { - mem = metal_container_of(node, struct remoteproc_mem, node); - if (name) { - if (!strncmp(name, mem->name, sizeof(mem->name))) - return mem; - } else if (pa != METAL_BAD_PHYS) { - metal_phys_addr_t pa_start, pa_end; - - pa_start = mem->pa; - pa_end = pa_start + mem->size; - if (pa >= pa_start && (pa + size) <= pa_end) - return mem; - } else if (da != METAL_BAD_PHYS) { - metal_phys_addr_t da_start, da_end; - - da_start = mem->da; - da_end = da_start + mem->size; - if (da >= da_start && (da + size) <= da_end) - return mem; - } else if (va) { - if (metal_io_virt_to_offset(mem->io, va) != - METAL_BAD_OFFSET) - return mem; - - } else { - return NULL; - } - } - return NULL; -} - -static metal_phys_addr_t -remoteproc_datopa(struct remoteproc_mem *mem, metal_phys_addr_t da) -{ - metal_phys_addr_t pa; - - pa = mem->pa + da - mem->da; - return pa; -} - -static metal_phys_addr_t -remoteproc_patoda(struct remoteproc_mem *mem, metal_phys_addr_t pa) -{ - metal_phys_addr_t da; - - da = mem->da + pa - mem->pa; - return da; -} - -static void *remoteproc_get_rsc_table(struct remoteproc *rproc, - void *store, - struct image_store_ops *store_ops, - size_t offset, - size_t len) -{ - int ret; - void *rsc_table = NULL; - const void *img_data; - - /* Copy the resource table to local memory, - * the caller should be responsible to release the memory - */ - rsc_table = metal_allocate_memory(len); - if (!rsc_table) { - return RPROC_ERR_PTR(-RPROC_ENOMEM); - } - ret = store_ops->load(store, offset, len, &img_data, RPROC_LOAD_ANYADDR, - NULL, 1); - if (ret < 0 || ret < (int)len || img_data == NULL) { - metal_log(METAL_LOG_ERROR, - "get rsc failed: 0x%llx, 0x%llx\r\n", offset, len); - rsc_table = RPROC_ERR_PTR(-RPROC_EINVAL); - goto error; - } - memcpy(rsc_table, img_data, len); - - ret = handle_rsc_table(rproc, rsc_table, len, NULL); - if (ret < 0) { - rsc_table = RPROC_ERR_PTR(ret); - goto error; - } - return rsc_table; - -error: - metal_free_memory(rsc_table); - return rsc_table; -} - -int remoteproc_parse_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size) -{ - struct metal_io_region *io; - - io = remoteproc_get_io_with_va(rproc, (void *)rsc_table); - return handle_rsc_table(rproc, rsc_table, rsc_size, io); -} - -int remoteproc_set_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, - size_t rsc_size) -{ - int ret; - struct metal_io_region *io; - - io = remoteproc_get_io_with_va(rproc, (void *)rsc_table); - if (!io) - return -EINVAL; - ret = remoteproc_parse_rsc_table(rproc, rsc_table, rsc_size); - if (!ret) { - rproc->rsc_table = rsc_table; - rproc->rsc_len = rsc_size; - rproc->rsc_io = io; - } - return ret; - -} - -struct remoteproc *remoteproc_init(struct remoteproc *rproc, - struct remoteproc_ops *ops, void *priv) -{ - if (rproc) { - memset(rproc, 0, sizeof (*rproc)); - rproc->state = RPROC_OFFLINE; - metal_mutex_init(&rproc->lock); - metal_list_init(&rproc->mems); - metal_list_init(&rproc->vdevs); - } - rproc = ops->init(rproc, ops, priv); - return rproc; -} - -int remoteproc_remove(struct remoteproc *rproc) -{ - int ret; - - if (rproc) { - metal_mutex_acquire(&rproc->lock); - if (rproc->state == RPROC_OFFLINE) - rproc->ops->remove(rproc); - else - ret = -EBUSY; - metal_mutex_release(&rproc->lock); - } else { - ret = -EINVAL; - } - return ret; -} - -int remoteproc_config(struct remoteproc *rproc, void *data) -{ - int ret = -RPROC_ENODEV; - - if (rproc) { - metal_mutex_acquire(&rproc->lock); - if (rproc->state == RPROC_OFFLINE) { - /* configure operation is allowed if the state is - * offline or ready. This function can be called - * mulitple times before start the remote. - */ - if (rproc->ops->config) - ret = rproc->ops->config(rproc, data); - rproc->state = RPROC_READY; - } else { - ret = -RPROC_EINVAL; - } - metal_mutex_release(&rproc->lock); - } - return ret; -} - -int remoteproc_start(struct remoteproc *rproc) -{ - int ret = -RPROC_ENODEV; - - if (rproc) { - metal_mutex_acquire(&rproc->lock); - if (rproc->state == RPROC_READY) { - ret = rproc->ops->start(rproc); - rproc->state = RPROC_RUNNING; - } else { - ret = -RPROC_EINVAL; - } - metal_mutex_release(&rproc->lock); - } - return ret; -} - -int remoteproc_stop(struct remoteproc *rproc) -{ - int ret = -RPROC_ENODEV; - - if (rproc) { - metal_mutex_acquire(&rproc->lock); - if (rproc->state != RPROC_STOPPED && - rproc->state != RPROC_OFFLINE) { - if (rproc->ops->stop) - ret = rproc->ops->stop(rproc); - rproc->state = RPROC_STOPPED; - } else { - ret = 0; - } - metal_mutex_release(&rproc->lock); - } - return ret; -} - -int remoteproc_shutdown(struct remoteproc *rproc) -{ - int ret = -RPROC_ENODEV; - - if (rproc) { - ret = 0; - metal_mutex_acquire(&rproc->lock); - if (rproc->state != RPROC_OFFLINE) { - if (rproc->state != RPROC_STOPPED) { - if (rproc->ops->stop) - ret = rproc->ops->stop(rproc); - } - if (!ret) { - if (rproc->ops->shutdown) - ret = rproc->ops->shutdown(rproc); - if (!ret) { - rproc->state = RPROC_OFFLINE; - } - } - } - metal_mutex_release(&rproc->lock); - } - return ret; -} - -struct metal_io_region * -remoteproc_get_io_with_name(struct remoteproc *rproc, - const char *name) -{ - struct remoteproc_mem *mem; - - mem = remoteproc_get_mem(rproc, name, - METAL_BAD_PHYS, METAL_BAD_PHYS, NULL, 0); - if (mem) - return mem->io; - else - return NULL; -} - -struct metal_io_region * -remoteproc_get_io_with_pa(struct remoteproc *rproc, - metal_phys_addr_t pa) -{ - struct remoteproc_mem *mem; - - mem = remoteproc_get_mem(rproc, NULL, pa, METAL_BAD_PHYS, NULL, 0); - if (mem) - return mem->io; - else - return NULL; -} - -struct metal_io_region * -remoteproc_get_io_with_da(struct remoteproc *rproc, - metal_phys_addr_t da, - unsigned long *offset) -{ - struct remoteproc_mem *mem; - - mem = remoteproc_get_mem(rproc, NULL, METAL_BAD_PHYS, da, NULL, 0); - if (mem) { - struct metal_io_region *io; - metal_phys_addr_t pa; - - io = mem->io; - pa = remoteproc_datopa(mem, da); - *offset = metal_io_phys_to_offset(io, pa); - return io; - } else { - return NULL; - } -} - -struct metal_io_region * -remoteproc_get_io_with_va(struct remoteproc *rproc, void *va) -{ - struct remoteproc_mem *mem; - - mem = remoteproc_get_mem(rproc, NULL, METAL_BAD_PHYS, METAL_BAD_PHYS, - va, 0); - if (mem) - return mem->io; - else - return NULL; -} - -void *remoteproc_mmap(struct remoteproc *rproc, - metal_phys_addr_t *pa, metal_phys_addr_t *da, - size_t size, unsigned int attribute, - struct metal_io_region **io) -{ - void *va = NULL; - metal_phys_addr_t lpa, lda; - struct remoteproc_mem *mem; - - if (!rproc) - return NULL; - else if (!pa && !da) - return NULL; - if (pa) - lpa = *pa; - else - lpa = METAL_BAD_PHYS; - if (da) - lda = *da; - else - lda = METAL_BAD_PHYS; - mem = remoteproc_get_mem(rproc, NULL, lpa, lda, NULL, size); - if (mem) { - if (lpa != METAL_BAD_PHYS) - lda = remoteproc_patoda(mem, lpa); - else if (lda != METAL_BAD_PHYS) - lpa = remoteproc_datopa(mem, lda); - if (io) - *io = mem->io; - va = metal_io_phys_to_virt(mem->io, lpa); - } else if (rproc->ops->mmap) { - va = rproc->ops->mmap(rproc, &lpa, &lda, size, attribute, io); - } - - if (pa) - *pa = lpa; - if (da) - *da = lda; - return va; -} - -int remoteproc_load(struct remoteproc *rproc, const char *path, - void *store, struct image_store_ops *store_ops, - void **img_info) -{ - int ret; - struct loader_ops *loader; - const void *img_data; - void *limg_info = NULL; - size_t offset, noffset; - size_t len, nlen; - int last_load_state; - metal_phys_addr_t da, rsc_da; - int rsc_len; - size_t rsc_size; - void *rsc_table = NULL; - struct metal_io_region *io = NULL; - - if (!rproc) - return -RPROC_ENODEV; - - metal_mutex_acquire(&rproc->lock); - metal_log(METAL_LOG_DEBUG, "%s: check remoteproc status\r\n", __func__); - /* If remoteproc is not in ready state, cannot load executable */ - if (rproc->state != RPROC_READY && rproc->state != RPROC_CONFIGURED) { - metal_log(METAL_LOG_ERROR, - "load failure: invalid rproc state %d.\r\n", - rproc->state); - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - - if (!store_ops) { - metal_log(METAL_LOG_ERROR, - "load failure: loader ops is not set.\r\n"); - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - - /* Open exectuable to get ready to parse */ - metal_log(METAL_LOG_DEBUG, "%s: open exectuable image\r\n", __func__); - ret = store_ops->open(store, path, &img_data); - if (ret <= 0) { - metal_log(METAL_LOG_ERROR, - "load failure: failed to open firmware %d.\n", - ret); - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - len = ret; - metal_assert(img_data != NULL); - - /* Check executable format to select a parser */ - loader = rproc->loader; - if (!loader) { - metal_log(METAL_LOG_DEBUG, "%s: check loader\r\n", __func__); - loader = remoteproc_check_fw_format(img_data, len); - if (!loader) { - metal_log(METAL_LOG_ERROR, - "load failure: failed to get store ops.\n"); - ret = -RPROC_EINVAL; - goto error1; - } - rproc->loader = loader; - } - - /* Load exectuable headers */ - metal_log(METAL_LOG_DEBUG, "%s: loading headers\r\n", __func__); - offset = 0; - last_load_state = RPROC_LOADER_NOT_READY; - while(1) { - ret = loader->load_header(img_data, offset, len, - &limg_info, last_load_state, - &noffset, &nlen); - last_load_state = (unsigned int)ret; - metal_log(METAL_LOG_DEBUG, - "%s, load header 0x%lx, 0x%x, next 0x%lx, 0x%x\r\n", - __func__, offset, len, noffset, nlen); - if (ret < 0) { - metal_log(METAL_LOG_ERROR, - "load header failed 0x%lx,%d.\r\n", - offset, len); - - goto error2; - } else if ((ret & RPROC_LOADER_READY_TO_LOAD) != 0) { - if (nlen == 0) - break; - else if ((noffset > (offset + len)) && - (store_ops->features & SUPPORT_SEEK) == 0) { - /* Required data is not continued, however - * seek is not supported, stop to load - * headers such as ELF section headers which - * is usually located to the end of image. - * Continue to load binary data to target - * memory. - */ - break; - } - } - /* Continue to load headers image data */ - img_data = NULL; - ret = store_ops->load(store, noffset, nlen, - &img_data, - RPROC_LOAD_ANYADDR, - NULL, 1); - if (ret < (int)nlen) { - metal_log(METAL_LOG_ERROR, - "load image data failed 0x%x,%d\r\n", - noffset, nlen); - goto error2; - } - offset = noffset; - len = nlen; - } - ret = elf_locate_rsc_table(limg_info, &rsc_da, &offset, &rsc_size); - if (ret == 0 && rsc_size > 0) { - /* parse resource table */ - rsc_len = (int)rsc_size; - rsc_table = remoteproc_get_rsc_table(rproc, store, store_ops, - offset, rsc_len); - } else { - rsc_len = ret; - } - - /* load executable data */ - metal_log(METAL_LOG_DEBUG, "%s: load executable data\r\n", __func__); - offset = 0; - len = 0; - ret = -EINVAL; - while(1) { - unsigned char padding; - size_t nmemsize; - metal_phys_addr_t pa; - - da = RPROC_LOAD_ANYADDR; - nlen = 0; - nmemsize = 0; - noffset = 0; - ret = loader->load_data(rproc, img_data, offset, len, - &limg_info, last_load_state, &da, - &noffset, &nlen, &padding, &nmemsize); - if (ret < 0) { - metal_log(METAL_LOG_ERROR, - "load data failed,0x%lx,%d\r\n", - noffset, nlen); - goto error3; - } - metal_log(METAL_LOG_DEBUG, - "load data: da 0x%lx, offset 0x%lx, len = 0x%lx, memsize = 0x%lx, state 0x%x\r\n", - da, noffset, nlen, nmemsize, ret); - last_load_state = ret; - if (da != RPROC_LOAD_ANYADDR) { - /* Data is supposed to be loaded to target memory */ - img_data = NULL; - /* get the I/O region from remoteproc */ - pa = METAL_BAD_PHYS; - (void)remoteproc_mmap(rproc, &pa, &da, nmemsize, 0, &io); - if (pa == METAL_BAD_PHYS || io == NULL) { - metal_log(METAL_LOG_ERROR, - "load failed, no mapping for 0x%llx.\r\n", - da); - ret = -RPROC_EINVAL; - goto error3; - } - if (nlen > 0) { - ret = store_ops->load(store, noffset, nlen, - &img_data, pa, io, 1); - if (ret != (int)nlen) { - metal_log(METAL_LOG_ERROR, - "load data failed 0x%lx, 0x%lx, 0x%x\r\n", - pa, noffset, nlen); - ret = -RPROC_EINVAL; - goto error3; - } - } - if (nmemsize > nlen) { - size_t tmpoffset; - - tmpoffset = metal_io_phys_to_offset(io, - pa + nlen); - metal_io_block_set(io, tmpoffset, - padding, (nmemsize - nlen)); - } - } else if (nlen != 0) { - ret = store_ops->load(store, noffset, nlen, - &img_data, - RPROC_LOAD_ANYADDR, - NULL, 1); - if (ret < (int)nlen) { - if ((last_load_state & - RPROC_LOADER_POST_DATA_LOAD) != 0) { - metal_log(METAL_LOG_WARNING, - "not all the headers are loaded\r\n"); - break; - } - metal_log(METAL_LOG_ERROR, - "post-load image data failed 0x%x,%d\r\n", - noffset, nlen); - goto error3; - } - offset = noffset; - len = nlen; - } else { - /* (last_load_state & RPROC_LOADER_LOAD_COMPLETE) != 0 */ - break; - } - } - - if (rsc_len < 0) { - ret = elf_locate_rsc_table(limg_info, &rsc_da, - &offset, &rsc_size); - if (ret == 0 && rsc_size > 0) { - /* parse resource table */ - rsc_len = (int)rsc_size; - rsc_table = remoteproc_get_rsc_table(rproc, store, - store_ops, - offset, - rsc_len); - } - } - - /* Update resource table */ - if (rsc_len && rsc_da != METAL_BAD_PHYS) { - void *rsc_table_cp = rsc_table; - - metal_log(METAL_LOG_DEBUG, - "%s, update resource table\r\n", __func__); - rsc_table = remoteproc_mmap(rproc, NULL, &rsc_da, - rsc_len, 0, &io); - if (rsc_table) { - size_t rsc_io_offset; - - /* Update resource table */ - rsc_io_offset = metal_io_virt_to_offset(io, rsc_table); - ret = metal_io_block_write(io, rsc_io_offset, - rsc_table_cp, rsc_len); - if (ret != rsc_len) { - metal_log(METAL_LOG_WARNING, - "load: failed to update rsc\r\n"); - } - rproc->rsc_table = rsc_table; - rproc->rsc_len = rsc_len; - } else { - metal_log(METAL_LOG_WARNING, - "load: not able to update rsc table.\n"); - } - metal_free_memory(rsc_table_cp); - /* So that the rsc_table will not get released */ - rsc_table = NULL; - } - - metal_log(METAL_LOG_DEBUG, "%s: successfully load firmware\r\n", - __func__); - /* get entry point from the firmware */ - rproc->bootaddr = loader->get_entry(limg_info); - rproc->state = RPROC_READY; - - metal_mutex_release(&rproc->lock); - if (img_info) - *img_info = limg_info; - else - loader->release(limg_info); - store_ops->close(store); - return 0; - -error3: - if (rsc_table) - metal_free_memory(rsc_table); -error2: - loader->release(limg_info); -error1: - store_ops->close(store); - metal_mutex_release(&rproc->lock); - return ret; -} - -int remoteproc_load_noblock(struct remoteproc *rproc, - const void *img_data, size_t offset, size_t len, - void **img_info, - metal_phys_addr_t *pa, struct metal_io_region **io, - size_t *noffset, size_t *nlen, - size_t *nmlen, unsigned char *padding) -{ - int ret; - struct loader_ops *loader; - void *limg_info = NULL; - int last_load_state; - metal_phys_addr_t da, rsc_da; - size_t rsc_size; - void *rsc_table = NULL, *lrsc_table = NULL; - - if (!rproc) - return -RPROC_ENODEV; - - metal_assert(pa != NULL); - metal_assert(io != NULL); - metal_assert(noffset != NULL); - metal_assert(nlen != NULL); - metal_assert(nmlen != NULL); - metal_assert(padding != NULL); - - metal_mutex_acquire(&rproc->lock); - metal_log(METAL_LOG_DEBUG, "%s: check remoteproc status\r\n", __func__); - /* If remoteproc is not in ready state, cannot load executable */ - if (rproc->state != RPROC_READY) { - metal_log(METAL_LOG_ERROR, - "load failure: invalid rproc state %d.\r\n", - rproc->state); - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - - /* Check executable format to select a parser */ - loader = rproc->loader; - if (!loader) { - metal_log(METAL_LOG_DEBUG, "%s: check loader\r\n", __func__); - if (img_data == NULL || offset != 0 || len == 0) { - metal_log(METAL_LOG_ERROR, - "load failure, invalid inputs, not able to identify image.\r\n"); - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - loader = remoteproc_check_fw_format(img_data, len); - if (!loader) { - metal_log(METAL_LOG_ERROR, - "load failure: failed to identify image.\n"); - ret = -RPROC_EINVAL; - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - rproc->loader = loader; - } - if (img_info == NULL || *img_info == NULL ) { - last_load_state = 0; - } else { - limg_info = *img_info; - last_load_state = loader->get_load_state(limg_info); - if (last_load_state < 0) { - metal_log(METAL_LOG_ERROR, - "load failure, not able get load state.\r\n"); - metal_mutex_release(&rproc->lock); - return -RPROC_EINVAL; - } - } - da = RPROC_LOAD_ANYADDR; - *nlen = 0; - if ((last_load_state & RPROC_LOADER_READY_TO_LOAD) == 0 && - (last_load_state & RPROC_LOADER_LOAD_COMPLETE) == 0) { - /* Get the mandatory executable headers */ - ret = loader->load_header(img_data, offset, len, - &limg_info, last_load_state, - noffset, nlen); - last_load_state = (unsigned int)ret; - metal_log(METAL_LOG_DEBUG, - "%s, load header 0x%lx, 0x%x, next 0x%lx, 0x%x\r\n", - __func__, offset, len, *noffset, *nlen); - if (ret < 0) { - metal_log(METAL_LOG_ERROR, - "load header failed 0x%lx,%d.\r\n", - offset, len); - - goto error1; - } - last_load_state = loader->get_load_state(limg_info); - if (*nlen != 0 && - (last_load_state & RPROC_LOADER_READY_TO_LOAD) == 0) - goto out; - } - if ((last_load_state & RPROC_LOADER_READY_TO_LOAD) != 0 || - (last_load_state & RPROC_LOADER_POST_DATA_LOAD) != 0) { - /* Enough information to know which target memory for - * which data. - */ - ret = loader->load_data(rproc, img_data, offset, len, - &limg_info, last_load_state, &da, - noffset, nlen, padding, nmlen); - metal_log(METAL_LOG_DEBUG, - "%s, load data 0x%lx, 0x%x, next 0x%lx, 0x%x\r\n", - __func__, offset, len, *noffset, *nlen); - if (ret < 0) { - metal_log(METAL_LOG_ERROR, - "load data failed,0x%lx,%d\r\n", - offset, len); - goto error1; - } - if (da != RPROC_LOAD_ANYADDR) { - /* get the I/O region from remoteproc */ - *pa = METAL_BAD_PHYS; - (void)remoteproc_mmap(rproc, pa, &da, *nmlen, 0, io); - if (*pa == METAL_BAD_PHYS || io == NULL) { - metal_log(METAL_LOG_ERROR, - "load failed, no mapping for 0x%llx.\r\n", - da); - ret = -RPROC_EINVAL; - goto error1; - } - } - if (*nlen != 0) - goto out; - else - last_load_state = loader->get_load_state(limg_info); - } - if ((last_load_state & RPROC_LOADER_LOAD_COMPLETE) != 0) { - /* Get resource table */ - size_t rsc_offset; - size_t rsc_io_offset; - - ret = elf_locate_rsc_table(limg_info, &rsc_da, - &rsc_offset, &rsc_size); - if (ret == 0 && rsc_size > 0) { - lrsc_table = metal_allocate_memory(rsc_size); - if (lrsc_table == NULL) { - ret = -RPROC_ENOMEM; - goto error1; - } - rsc_table = remoteproc_mmap(rproc, NULL, &rsc_da, - rsc_size, 0, io); - if (*io == NULL) { - metal_log(METAL_LOG_ERROR, - "load failed: failed to mmap rsc\r\n"); - metal_free_memory(lrsc_table); - goto error1; - } - rsc_io_offset = metal_io_virt_to_offset(*io, rsc_table); - ret = metal_io_block_read(*io, rsc_io_offset, - lrsc_table, (int)rsc_size); - if (ret != (int)rsc_size) { - metal_log(METAL_LOG_ERROR, - "load failed: failed to get rsc\r\n"); - metal_free_memory(lrsc_table); - goto error1; - } - /* parse resource table */ - ret = remoteproc_parse_rsc_table(rproc, lrsc_table, - rsc_size); - if (ret == (int)rsc_size) { - metal_log(METAL_LOG_ERROR, - "load failed: failed to parse rsc\r\n"); - metal_free_memory(lrsc_table); - goto error1; - } - /* Update resource table */ - ret = metal_io_block_write(*io, rsc_io_offset, - lrsc_table, (int)rsc_size); - if (ret != (int)rsc_size) { - metal_log(METAL_LOG_WARNING, - "load exectuable, failed to update rsc\r\n"); - } - rproc->rsc_table = rsc_table; - rproc->rsc_len = (int)rsc_size; - metal_free_memory(lrsc_table); - } - } -out: - if (img_info != NULL) - *img_info = limg_info; - else - loader->release(limg_info); - metal_mutex_release(&rproc->lock); - return 0; - -error1: - loader->release(limg_info); - metal_mutex_release(&rproc->lock); - return ret; -} - -unsigned int remoteproc_allocate_id(struct remoteproc *rproc, - unsigned int start, - unsigned int end) -{ - unsigned int notifyid; - - if (start == RSC_NOTIFY_ID_ANY) - start = 0; - if (end == RSC_NOTIFY_ID_ANY) - end = METAL_BITS_PER_ULONG; - notifyid = metal_bitmap_next_set_bit(&rproc->bitmap, - start, end); - if (notifyid != end) - metal_bitmap_set_bit(&rproc->bitmap, notifyid); - return notifyid; -} - -static int remoteproc_virtio_notify(void *priv, uint32_t id) -{ - struct remoteproc *rproc = priv; - - return rproc->ops->notify(rproc, id); -} - -struct virtio_device * -remoteproc_create_virtio(struct remoteproc *rproc, - int vdev_id, unsigned int role, - void (*rst_cb)(struct virtio_device *vdev)) -{ - char *rsc_table; - struct fw_rsc_vdev *vdev_rsc; - struct metal_io_region *vdev_rsc_io; - struct virtio_device *vdev; - struct remoteproc_virtio *rpvdev; - size_t vdev_rsc_offset; - unsigned int notifyid; - unsigned int num_vrings, i; - struct metal_list *node; - - metal_assert(rproc); - metal_mutex_acquire(&rproc->lock); - rsc_table = rproc->rsc_table; - vdev_rsc_io = rproc->rsc_io; - vdev_rsc_offset = find_rsc(rsc_table, RSC_VDEV, vdev_id); - if (!vdev_rsc_offset) { - metal_mutex_release(&rproc->lock); - return NULL; - } - vdev_rsc = (struct fw_rsc_vdev *)(rsc_table + vdev_rsc_offset); - notifyid = vdev_rsc->notifyid; - /* Check if the virtio device is already created */ - metal_list_for_each(&rproc->vdevs, node) { - rpvdev = metal_container_of(node, struct remoteproc_virtio, - node); - if (rpvdev->vdev.index == notifyid) - return &rpvdev->vdev; - } - vdev = rproc_virtio_create_vdev(role, notifyid, - vdev_rsc, vdev_rsc_io, rproc, - remoteproc_virtio_notify, - rst_cb); - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - metal_list_add_tail(&rproc->vdevs, &rpvdev->node); - num_vrings = vdev_rsc->num_of_vrings; - /* set the notification id for vrings */ - for (i = 0; i < num_vrings; i++) { - struct fw_rsc_vdev_vring *vring_rsc; - metal_phys_addr_t da; - unsigned int num_descs, align; - struct metal_io_region *io; - void *va; - size_t size; - int ret; - - vring_rsc = &vdev_rsc->vring[i]; - notifyid = vring_rsc->notifyid; - da = vring_rsc->da; - num_descs = vring_rsc->num; - align = vring_rsc->align; - size = vring_size(num_descs, align); - va = remoteproc_mmap(rproc, NULL, &da, size, 0, &io); - if (!va) - goto err1; - ret = rproc_virtio_init_vring(vdev, i, notifyid, - va, io, num_descs, align); - if (ret) - goto err1; - } - metal_mutex_release(&rproc->lock); - return vdev; - -err1: - remoteproc_remove_virtio(rproc, vdev); - metal_mutex_release(&rproc->lock); - return NULL; -} - -void remoteproc_remove_virtio(struct remoteproc *rproc, - struct virtio_device *vdev) -{ - struct remoteproc_virtio *rpvdev; - - (void)rproc; - metal_assert(vdev); - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - metal_list_del(&rpvdev->node); - rproc_virtio_remove_vdev(&rpvdev->vdev); -} - -int remoteproc_get_notification(struct remoteproc *rproc, uint32_t notifyid) -{ - struct remoteproc_virtio *rpvdev; - struct metal_list *node; - int ret; - - metal_list_for_each(&rproc->vdevs, node) { - rpvdev = metal_container_of(node, struct remoteproc_virtio, - node); - ret = rproc_virtio_notified(&rpvdev->vdev, notifyid); - if (ret) - return ret; - } - return 0; -} diff --git a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/remoteproc_virtio.c b/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/remoteproc_virtio.c deleted file mode 100644 index 0059718dc1..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/remoteproc_virtio.c +++ /dev/null @@ -1,330 +0,0 @@ -/* - * Remoteproc Virtio Framework Implementation - * - * Copyright(c) 2018 Xilinx Ltd. - * Copyright(c) 2011 Texas Instruments, Inc. - * Copyright(c) 2011 Google, Inc. - * All rights reserved. - * - * Redistribution and use in source and binary forms, with or without - * modification, are permitted provided that the following conditions - * are met: - * - * * Redistributions of source code must retain the above copyright - * notice, this list of conditions and the following disclaimer. - * * Redistributions in binary form must reproduce the above copyright - * notice, this list of conditions and the following disclaimer in - * the documentation and/or other materials provided with the - * distribution. - * * Neither the name Texas Instruments nor the names of its - * contributors may be used to endorse or promote products derived - * from this software without specific prior written permission. - * - * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS - * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT - * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR - * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT - * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, - * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT - * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, - * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY - * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT - * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE - * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. - */ - -#include -#include -#include -#include -#include - -static void rproc_virtio_virtqueue_notify(struct virtqueue *vq) -{ - struct remoteproc_virtio *rpvdev; - struct virtio_vring_info *vring_info; - struct virtio_device *vdev; - unsigned int vq_id = vq->vq_queue_index; - - vdev = vq->vq_dev; - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - metal_assert(vq_id <= vdev->vrings_num); - vring_info = &vdev->vrings_info[vq_id]; - rpvdev->notify(rpvdev->priv, vring_info->notifyid); -} - -static unsigned char rproc_virtio_get_status(struct virtio_device *vdev) -{ - struct remoteproc_virtio *rpvdev; - struct fw_rsc_vdev *vdev_rsc; - struct metal_io_region *io; - char status; - - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - vdev_rsc = rpvdev->vdev_rsc; - io = rpvdev->vdev_rsc_io; - status = metal_io_read8(io, - metal_io_virt_to_offset(io, &vdev_rsc->status)); - return status; -} - -#ifndef VIRTIO_SLAVE_ONLY -static void rproc_virtio_set_status(struct virtio_device *vdev, - unsigned char status) -{ - struct remoteproc_virtio *rpvdev; - struct fw_rsc_vdev *vdev_rsc; - struct metal_io_region *io; - - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - vdev_rsc = rpvdev->vdev_rsc; - io = rpvdev->vdev_rsc_io; - metal_io_write8(io, - metal_io_virt_to_offset(io, &vdev_rsc->status), - status); - rpvdev->notify(rpvdev->priv, vdev->index); -} -#endif - -static uint32_t rproc_virtio_get_features(struct virtio_device *vdev) -{ - struct remoteproc_virtio *rpvdev; - struct fw_rsc_vdev *vdev_rsc; - struct metal_io_region *io; - uint32_t features; - - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - vdev_rsc = rpvdev->vdev_rsc; - io = rpvdev->vdev_rsc_io; - /* TODO: shall we get features based on the role ? */ - features = metal_io_read32(io, - metal_io_virt_to_offset(io, &vdev_rsc->dfeatures)); - - return features; -} - -#ifndef VIRTIO_SLAVE_ONLY -static void rproc_virtio_set_features(struct virtio_device *vdev, - uint32_t features) -{ - struct remoteproc_virtio *rpvdev; - struct fw_rsc_vdev *vdev_rsc; - struct metal_io_region *io; - - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - vdev_rsc = rpvdev->vdev_rsc; - io = rpvdev->vdev_rsc_io; - /* TODO: shall we set features based on the role ? */ - metal_io_write32(io, - metal_io_virt_to_offset(io, &vdev_rsc->dfeatures), - features); - rpvdev->notify(rpvdev->priv, vdev->index); -} -#endif - -static uint32_t rproc_virtio_negotiate_features(struct virtio_device *vdev, - uint32_t features) -{ - (void)vdev; - (void)features; - - return 0; -} - -static void rproc_virtio_read_config(struct virtio_device *vdev, - uint32_t offset, void *dst, int length) -{ - (void)vdev; - (void)offset; - (void)dst; - (void)length; -} - -#ifndef VIRTIO_SLAVE_ONLY -static void rproc_virtio_write_config(struct virtio_device *vdev, - uint32_t offset, void *src, int length) -{ - (void)vdev; - (void)offset; - (void)src; - (void)length; -} - -static void rproc_virtio_reset_device(struct virtio_device *vdev) -{ - if (vdev->role == VIRTIO_DEV_MASTER) - rproc_virtio_set_status(vdev, - VIRTIO_CONFIG_STATUS_NEEDS_RESET); -} -#endif - -const struct virtio_dispatch remoteproc_virtio_dispatch_funcs = { - .get_status = rproc_virtio_get_status, - .get_features = rproc_virtio_get_features, - .read_config = rproc_virtio_read_config, - .notify = rproc_virtio_virtqueue_notify, - .negotiate_features = rproc_virtio_negotiate_features, -#ifndef VIRTIO_SLAVE_ONLY - /* - * We suppose here that the vdev is in a shared memory so that can - * be access only by one core: the master. In this case salve core has - * only read access right. - */ - .set_status = rproc_virtio_set_status, - .set_features = rproc_virtio_set_features, - .write_config = rproc_virtio_write_config, - .reset_device = rproc_virtio_reset_device, -#endif -}; - -struct virtio_device * -rproc_virtio_create_vdev(unsigned int role, unsigned int notifyid, - void *rsc, struct metal_io_region *rsc_io, - void *priv, - rpvdev_notify_func notify, - virtio_dev_reset_cb rst_cb) -{ - struct remoteproc_virtio *rpvdev; - struct virtio_vring_info *vrings_info; - struct fw_rsc_vdev *vdev_rsc = rsc; - struct virtio_device *vdev; - unsigned int num_vrings = vdev_rsc->num_of_vrings; - unsigned int i; - - rpvdev = metal_allocate_memory(sizeof(*rpvdev)); - if (!rpvdev) - return NULL; - vrings_info = metal_allocate_memory(sizeof(*vrings_info) * num_vrings); - if (!vrings_info) - goto err0; - memset(rpvdev, 0, sizeof(*rpvdev)); - memset(vrings_info, 0, sizeof(*vrings_info)); - vdev = &rpvdev->vdev; - - for (i = 0; i < num_vrings; i++) { - struct virtqueue *vq; - struct fw_rsc_vdev_vring *vring_rsc; - unsigned int num_extra_desc = 0; - - vring_rsc = &vdev_rsc->vring[i]; - if (role == VIRTIO_DEV_MASTER) { - num_extra_desc = vring_rsc->num; - } - vq = virtqueue_allocate(num_extra_desc); - if (!vq) - goto err1; - vrings_info[i].vq = vq; - } - - /* FIXME commended as seems not nedded, already stored in vdev */ - //rpvdev->notifyid = notifyid; - rpvdev->notify = notify; - rpvdev->priv = priv; - vdev->vrings_info = vrings_info; - /* Assuming the shared memory has been mapped and registered if - * necessary - */ - rpvdev->vdev_rsc = vdev_rsc; - rpvdev->vdev_rsc_io = rsc_io; - - vdev->index = notifyid; - vdev->role = role; - vdev->reset_cb = rst_cb; - vdev->vrings_num = num_vrings; - vdev->func = &remoteproc_virtio_dispatch_funcs; - /* TODO: Shall we set features here ? */ - - return &rpvdev->vdev; - -err1: - for (i = 0; i < num_vrings; i++) { - if (vrings_info[i].vq) - metal_free_memory(vrings_info[i].vq); - } - metal_free_memory(vrings_info); -err0: - metal_free_memory(rpvdev); - return NULL; -} - -void rproc_virtio_remove_vdev(struct virtio_device *vdev) -{ - struct remoteproc_virtio *rpvdev; - unsigned int i; - - if (!vdev) - return; - rpvdev = metal_container_of(vdev, struct remoteproc_virtio, vdev); - for (i = 0; i < vdev->vrings_num; i++) { - struct virtqueue *vq; - - vq = vdev->vrings_info[i].vq; - if (vq) - metal_free_memory(vq); - } - metal_free_memory(vdev->vrings_info); - metal_free_memory(rpvdev); -} - -int rproc_virtio_init_vring(struct virtio_device *vdev, unsigned int index, - unsigned int notifyid, void *va, - struct metal_io_region *io, - unsigned int num_descs, unsigned int align) -{ - struct virtio_vring_info *vring_info; - unsigned int num_vrings; - - num_vrings = vdev->vrings_num; - if (index >= num_vrings) - return -RPROC_EINVAL; - vring_info = &vdev->vrings_info[index]; - vring_info->io = io; - vring_info->notifyid = notifyid; - vring_info->info.vaddr = va; - vring_info->info.num_descs = num_descs; - vring_info->info.align = align; - - return 0; -} - -int rproc_virtio_notified(struct virtio_device *vdev, uint32_t notifyid) -{ - unsigned int num_vrings, i; - struct virtio_vring_info *vring_info; - struct virtqueue *vq; - - if (!vdev) - return -EINVAL; - /* We do nothing for vdev notification in this implementation */ - if (vdev->index == notifyid) - return 0; - num_vrings = vdev->vrings_num; - for (i = 0; i < num_vrings; i++) { - vring_info = &vdev->vrings_info[i]; - if (vring_info->notifyid == notifyid || - notifyid == RSC_NOTIFY_ID_ANY) { - vq = vring_info->vq; - virtqueue_notification(vq); - } - } - return 0; -} - -void rproc_virtio_wait_remote_ready(struct virtio_device *vdev) -{ - uint8_t status; - - /* - * No status available for slave. As Master has not to wait - * slave action, we can return. Behavior should be updated - * in future if a slave status is added. - */ - if (vdev->role == VIRTIO_DEV_MASTER) - return; - - while (1) { - status = rproc_virtio_get_status(vdev); - if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK) - return; - } -} diff --git a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/rsc_table_parser.c b/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/rsc_table_parser.c deleted file mode 100644 index 37c6478011..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/remoteproc/rsc_table_parser.c +++ /dev/null @@ -1,223 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * Copyright (c) 2018, Xilinx Inc. - * All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include - -static int handle_dummy_rsc(struct remoteproc *rproc, void *rsc); - -/* Resources handler */ -rsc_handler rsc_handler_table[] = { - handle_carve_out_rsc, /**< carved out resource */ - handle_dummy_rsc, /**< IOMMU dev mem resource */ - handle_trace_rsc, /**< trace buffer resource */ - handle_vdev_rsc, /**< virtio resource */ - handle_dummy_rsc, /**< rproc shared memory resource */ - handle_dummy_rsc, /**< firmware checksum resource */ -}; - -int handle_rsc_table(struct remoteproc *rproc, - struct resource_table *rsc_table, int size, - struct metal_io_region *io) -{ - char *rsc_start; - unsigned int rsc_type; - unsigned int idx, offset; - int status = 0; - - /* Validate rsc table header fields */ - - /* Minimum rsc table size */ - if (sizeof(struct resource_table) > (unsigned int)size) { - return -RPROC_ERR_RSC_TAB_TRUNC; - } - - /* Supported version */ - if (rsc_table->ver != RSC_TAB_SUPPORTED_VERSION) { - return -RPROC_ERR_RSC_TAB_VER; - } - - /* Offset array */ - offset = sizeof(struct resource_table) - + rsc_table->num * sizeof(rsc_table->offset[0]); - - if (offset > (unsigned int)size) { - return -RPROC_ERR_RSC_TAB_TRUNC; - } - - /* Reserved fields - must be zero */ - if ((rsc_table->reserved[0] != 0 || rsc_table->reserved[1]) != 0) { - return -RPROC_ERR_RSC_TAB_RSVD; - } - - /* Loop through the offset array and parse each resource entry */ - for (idx = 0; idx < rsc_table->num; idx++) { - rsc_start = (char *)rsc_table; - rsc_start += rsc_table->offset[idx]; - if (io && - metal_io_virt_to_offset(io, rsc_start) == METAL_BAD_OFFSET) - return -RPROC_ERR_RSC_TAB_TRUNC; - rsc_type = *((uint32_t *)rsc_start); - if (rsc_type < RSC_LAST) - status = rsc_handler_table[rsc_type](rproc, - rsc_start); - else if (rsc_type >= RSC_VENDOR_START && - rsc_type <= RSC_VENDOR_END) - status = handle_vendor_rsc(rproc, rsc_start); - if (status == -RPROC_ERR_RSC_TAB_NS) { - status = 0; - continue; - } - else if (status) - break; - } - - return status; -} - -/** - * handle_carve_out_rsc - * - * Carveout resource handler. - * - * @param rproc - pointer to remote remoteproc - * @param rsc - pointer to carveout resource - * - * @returns - 0 for success, or negative value for failure - * - */ -int handle_carve_out_rsc(struct remoteproc *rproc, void *rsc) -{ - struct fw_rsc_carveout *carve_rsc = (struct fw_rsc_carveout *)rsc; - metal_phys_addr_t da; - metal_phys_addr_t pa; - size_t size; - unsigned int attribute; - - /* Validate resource fields */ - if (!carve_rsc) { - return -RPROC_ERR_RSC_TAB_NP; - } - - if (carve_rsc->reserved) { - return -RPROC_ERR_RSC_TAB_RSVD; - } - pa = carve_rsc->pa; - da = carve_rsc->da; - size = carve_rsc->len; - attribute = carve_rsc->flags; - if (remoteproc_mmap(rproc, &pa, &da, size, attribute, NULL)) - return 0; - else - return -RPROC_EINVAL; -} - -int handle_vendor_rsc(struct remoteproc *rproc, void *rsc) -{ - if (rproc && rproc->ops->handle_rsc) { - struct fw_rsc_vendor *vend_rsc = rsc; - size_t len = vend_rsc->len; - - return rproc->ops->handle_rsc(rproc, rsc, len); - } - return -RPROC_ERR_RSC_TAB_NS; -} - -int handle_vdev_rsc(struct remoteproc *rproc, void *rsc) -{ - struct fw_rsc_vdev *vdev_rsc = (struct fw_rsc_vdev *)rsc; - unsigned int notifyid, i, num_vrings; - - /* only assign notification IDs but do not initialize vdev */ - notifyid = vdev_rsc->notifyid; - if (notifyid == RSC_NOTIFY_ID_ANY) { - notifyid = remoteproc_allocate_id(rproc, - notifyid, notifyid + 1); - vdev_rsc->notifyid = notifyid; - } - - num_vrings = vdev_rsc->num_of_vrings; - for (i = 0; i < num_vrings; i++) { - struct fw_rsc_vdev_vring *vring_rsc; - - vring_rsc = &vdev_rsc->vring[i]; - notifyid = vring_rsc->notifyid; - if (notifyid == RSC_NOTIFY_ID_ANY) { - notifyid = remoteproc_allocate_id(rproc, - notifyid, - notifyid + 1); - vdev_rsc->notifyid = notifyid; - } - } - - return 0; -} - -/** - * handle_trace_rsc - * - * trace resource handler. - * - * @param rproc - pointer to remote remoteproc - * @param rsc - pointer to trace resource - * - * @returns - no service error - * - */ -int handle_trace_rsc(struct remoteproc *rproc, void *rsc) -{ - struct fw_rsc_trace *vdev_rsc = (struct fw_rsc_trace *)rsc; - (void)rproc; - - if (vdev_rsc->da != FW_RSC_U32_ADDR_ANY && vdev_rsc->len != 0) - return 0; - /* FIXME: master should allocated a memory used by slave */ - - return -RPROC_ERR_RSC_TAB_NS; -} - -/** - * handle_dummy_rsc - * - * dummy resource handler. - * - * @param rproc - pointer to remote remoteproc - * @param rsc - pointer to trace resource - * - * @returns - no service error - * - */ -static int handle_dummy_rsc(struct remoteproc *rproc, void *rsc) -{ - (void)rproc; - (void)rsc; - - return -RPROC_ERR_RSC_TAB_NS; -} - -size_t find_rsc(void *rsc_table, unsigned int rsc_type, unsigned int index) -{ - struct resource_table *r_table = rsc_table; - unsigned int i, rsc_index; - unsigned int lrsc_type; - char *rsc_start; - - metal_assert(r_table); - /* Loop through the offset array and parse each resource entry */ - rsc_index = 0; - for (i = 0; i < r_table->num; i++) { - rsc_start = (char *)r_table; - rsc_start += r_table->offset[i]; - lrsc_type = *((uint32_t *)rsc_start); - if (lrsc_type == rsc_type) { - if (rsc_index++ == index) - return r_table->offset[i]; - } - } - return 0; -} diff --git a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/CMakeLists.txt b/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/CMakeLists.txt deleted file mode 100644 index e2bd8d8051..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -collect (PROJECT_LIB_SOURCES rpmsg.c) -collect (PROJECT_LIB_SOURCES rpmsg_virtio.c) diff --git a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg.c b/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg.c deleted file mode 100644 index 9268889e07..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg.c +++ /dev/null @@ -1,271 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * Copyright (c) 2018 Linaro, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include - -#include "rpmsg_internal.h" - -/** - * rpmsg_get_address - * - * This function provides unique 32 bit address. - * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * - * return - a unique address - */ -static uint32_t rpmsg_get_address(unsigned long *bitmap, int size) -{ - unsigned int addr = RPMSG_ADDR_ANY; - unsigned int nextbit; - - nextbit = metal_bitmap_next_clear_bit(bitmap, 0, size); - if (nextbit < (uint32_t)size) { - addr = nextbit; - metal_bitmap_set_bit(bitmap, nextbit); - } - - return addr; -} - -/** - * rpmsg_release_address - * - * Frees the given address. - * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * @param addr - address to free - */ -static void rpmsg_release_address(unsigned long *bitmap, int size, - int addr) -{ - if (addr < size) - metal_bitmap_clear_bit(bitmap, addr); -} - -/** - * rpmsg_is_address_set - * - * Checks whether address is used or free. - * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * @param addr - address to free - * - * return - TRUE/FALSE - */ -static int rpmsg_is_address_set(unsigned long *bitmap, int size, int addr) -{ - if (addr < size) - return metal_bitmap_is_bit_set(bitmap, addr); - else - return RPMSG_ERR_PARAM; -} - -/** - * rpmsg_set_address - * - * Marks the address as consumed. - * - * @param bitmap - bit map for addresses - * @param size - size of bitmap - * @param addr - address to free - * - * return - none - */ -static int rpmsg_set_address(unsigned long *bitmap, int size, int addr) -{ - if (addr < size) { - metal_bitmap_set_bit(bitmap, addr); - return RPMSG_SUCCESS; - } else { - return RPMSG_ERR_PARAM; - } -} - -/** - * This function sends rpmsg "message" to remote device. - * - * @param ept - pointer to end point - * @param src - source address of channel - * @param dst - destination address of channel - * @param data - data to transmit - * @param size - size of data - * @param wait - boolean, wait or not for buffer to become - * available - * - * @return - size of data sent or negative value for failure. - * - */ -int rpmsg_send_offchannel_raw(struct rpmsg_endpoint *ept, uint32_t src, - uint32_t dst, const void *data, int size, - int wait) -{ - struct rpmsg_device *rdev; - - if (!ept || !ept->rdev || !data || dst == RPMSG_ADDR_ANY) - return RPMSG_ERR_PARAM; - - rdev = ept->rdev; - - if (rdev->ops.send_offchannel_raw) - return rdev->ops.send_offchannel_raw(rdev, src, dst, data, - size, wait); - - return RPMSG_ERR_PARAM; -} - -int rpmsg_send_ns_message(struct rpmsg_endpoint *ept, unsigned long flags) -{ - struct rpmsg_ns_msg ns_msg; - int ret; - - ns_msg.flags = flags; - ns_msg.addr = ept->addr; - strncpy(ns_msg.name, ept->name, sizeof(ns_msg.name)); - ret = rpmsg_send_offchannel_raw(ept, ept->addr, - RPMSG_NS_EPT_ADDR, - &ns_msg, sizeof(ns_msg), true); - if (ret < 0) - return ret; - else - return RPMSG_SUCCESS; -} - -struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rdev, - const char *name, uint32_t addr, - uint32_t dest_addr) -{ - struct metal_list *node; - struct rpmsg_endpoint *ept; - - metal_list_for_each(&rdev->endpoints, node) { - int name_match = 0; - - ept = metal_container_of(node, struct rpmsg_endpoint, node); - /* try to get by local address only */ - if (addr != RPMSG_ADDR_ANY && ept->addr == addr) - return ept; - /* try to find match on local end remote address */ - if (addr == ept->addr && dest_addr == ept->dest_addr) - return ept; - /* else use name service and destination address */ - if (name) - name_match = !strncmp(ept->name, name, - sizeof(ept->name)); - if (!name || !name_match) - continue; - /* destination address is known, equal to ept remote address*/ - if (dest_addr != RPMSG_ADDR_ANY && ept->dest_addr == dest_addr) - return ept; - /* ept is registered but not associated to remote ept*/ - if (addr == RPMSG_ADDR_ANY && ept->dest_addr == RPMSG_ADDR_ANY) - return ept; - } - return NULL; -} - -static void rpmsg_unregister_endpoint(struct rpmsg_endpoint *ept) -{ - struct rpmsg_device *rdev; - - if (!ept) - return; - - rdev = ept->rdev; - - if (ept->addr != RPMSG_ADDR_ANY) - rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, - ept->addr); - metal_list_del(&ept->node); -} - -int rpmsg_register_endpoint(struct rpmsg_device *rdev, - struct rpmsg_endpoint *ept) -{ - ept->rdev = rdev; - - metal_list_add_tail(&rdev->endpoints, &ept->node); - return RPMSG_SUCCESS; -} - -int rpmsg_create_ept(struct rpmsg_endpoint *ept, struct rpmsg_device *rdev, - const char *name, uint32_t src, uint32_t dest, - rpmsg_ept_cb cb, rpmsg_ns_unbind_cb unbind_cb) -{ - int status; - uint32_t addr = src; - - if (!ept) - return RPMSG_ERR_PARAM; - - metal_mutex_acquire(&rdev->lock); - if (src != RPMSG_ADDR_ANY) { - status = rpmsg_is_address_set(rdev->bitmap, - RPMSG_ADDR_BMP_SIZE, src); - if (!status) { - /* Mark the address as used in the address bitmap. */ - rpmsg_set_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, - src); - } else if (status > 0) { - status = RPMSG_SUCCESS; - goto ret_status; - } else { - goto ret_status; - } - } else { - addr = rpmsg_get_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE); - } - - rpmsg_init_ept(ept, name, addr, dest, cb, unbind_cb); - - status = rpmsg_register_endpoint(rdev, ept); - if (status < 0) - rpmsg_release_address(rdev->bitmap, RPMSG_ADDR_BMP_SIZE, addr); - - if (!status && ept->dest_addr == RPMSG_ADDR_ANY) { - /* Send NS announcement to remote processor */ - metal_mutex_release(&rdev->lock); - status = rpmsg_send_ns_message(ept, RPMSG_NS_CREATE); - metal_mutex_acquire(&rdev->lock); - if (status) - rpmsg_unregister_endpoint(ept); - } - -ret_status: - metal_mutex_release(&rdev->lock); - return status; -} - -/** - * rpmsg_destroy_ept - * - * This function deletes rpmsg endpoint and performs cleanup. - * - * @param ept - pointer to endpoint to destroy - * - */ -void rpmsg_destroy_ept(struct rpmsg_endpoint *ept) -{ - struct rpmsg_device *rdev; - - if (!ept) - return; - - rdev = ept->rdev; - if (ept->addr != RPMSG_NS_EPT_ADDR) - (void)rpmsg_send_ns_message(ept, RPMSG_NS_DESTROY); - metal_mutex_acquire(&rdev->lock); - rpmsg_unregister_endpoint(ept); - metal_mutex_release(&rdev->lock); -} diff --git a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg_internal.h b/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg_internal.h deleted file mode 100644 index e1b82086c9..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg_internal.h +++ /dev/null @@ -1,105 +0,0 @@ -/* - * SPDX-License-Identifier: BSD-3-Clause - * - * $FreeBSD$ - */ - -#ifndef _RPMSG_INTERNAL_H_ -#define _RPMSG_INTERNAL_H_ - -#include -#include - -#if defined __cplusplus -extern "C" { -#endif - -#ifdef RPMSG_DEBUG -#define RPMSG_ASSERT(_exp, _msg) do { \ - if (!(_exp)) { \ - openamp_print("FATAL: %s - _msg", __func__); \ - while (1) { \ - ; \ - } \ - } \ - } while (0) -#else -#define RPMSG_ASSERT(_exp, _msg) do { \ - if (!(_exp)) \ - while (1) { \ - ; \ - } \ - } while (0) -#endif - -#define RPMSG_LOCATE_DATA(p) ((unsigned char *)(p) + sizeof(struct rpmsg_hdr)) -/** - * enum rpmsg_ns_flags - dynamic name service announcement flags - * - * @RPMSG_NS_CREATE: a new remote service was just created - * @RPMSG_NS_DESTROY: a known remote service was just destroyed - * @RPMSG_NS_CREATE_WITH_ACK: a new remote service was just created waiting - * acknowledgment. - */ -enum rpmsg_ns_flags { - RPMSG_NS_CREATE = 0, - RPMSG_NS_DESTROY = 1, -}; - -/** - * struct rpmsg_hdr - common header for all rpmsg messages - * @src: source address - * @dst: destination address - * @reserved: reserved for future use - * @len: length of payload (in bytes) - * @flags: message flags - * - * Every message sent(/received) on the rpmsg bus begins with this header. - */ -OPENAMP_PACKED_BEGIN -struct rpmsg_hdr { - uint32_t src; - uint32_t dst; - uint32_t reserved; - uint16_t len; - uint16_t flags; -} OPENAMP_PACKED_END; - -/** - * struct rpmsg_ns_msg - dynamic name service announcement message - * @name: name of remote service that is published - * @addr: address of remote service that is published - * @flags: indicates whether service is created or destroyed - * - * This message is sent across to publish a new service, or announce - * about its removal. When we receive these messages, an appropriate - * rpmsg channel (i.e device) is created/destroyed. In turn, the ->probe() - * or ->remove() handler of the appropriate rpmsg driver will be invoked - * (if/as-soon-as one is registered). - */ -OPENAMP_PACKED_BEGIN -struct rpmsg_ns_msg { - char name[RPMSG_NAME_SIZE]; - uint32_t addr; - uint32_t flags; -} OPENAMP_PACKED_END; - -int rpmsg_send_ns_message(struct rpmsg_endpoint *ept, unsigned long flags); - -struct rpmsg_endpoint *rpmsg_get_endpoint(struct rpmsg_device *rvdev, - const char *name, uint32_t addr, - uint32_t dest_addr); -int rpmsg_register_endpoint(struct rpmsg_device *rdev, - struct rpmsg_endpoint *ept); - -static inline struct rpmsg_endpoint * -rpmsg_get_ept_from_addr(struct rpmsg_device *rdev, uint32_t addr) -{ - return rpmsg_get_endpoint(rdev, NULL, addr, RPMSG_ADDR_ANY); -} - -#if defined __cplusplus -} -#endif - -#endif /* _RPMSG_INTERNAL_H_ */ diff --git a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg_virtio.c b/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg_virtio.c deleted file mode 100644 index c7ef1b5a05..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/rpmsg/rpmsg_virtio.c +++ /dev/null @@ -1,679 +0,0 @@ -/* - * Copyright (c) 2014, Mentor Graphics Corporation - * All rights reserved. - * Copyright (c) 2016 Freescale Semiconductor, Inc. All rights reserved. - * Copyright (c) 2018 Linaro, Inc. All rights reserved. - * - * SPDX-License-Identifier: BSD-3-Clause - */ - -#include -#include -#include -#include -#include -#include - -#include "rpmsg_internal.h" - -#define RPMSG_NUM_VRINGS (2) - -/* Total tick count for 15secs - 1msec tick. */ -#define RPMSG_TICK_COUNT 15000 - -/* Time to wait - In multiple of 10 msecs. */ -#define RPMSG_TICKS_PER_INTERVAL 10 - -#define WORD_SIZE sizeof(unsigned long) -#define WORD_ALIGN(a) ((((a) & (WORD_SIZE - 1)) != 0) ? \ - (((a) & (~(WORD_SIZE - 1))) + WORD_SIZE) : (a)) - -#ifndef VIRTIO_SLAVE_ONLY -metal_weak void * -rpmsg_virtio_shm_pool_get_buffer(struct rpmsg_virtio_shm_pool *shpool, - size_t size) -{ - void *buffer; - - if (shpool->avail < size) - return NULL; - buffer = (void *)((char *)shpool->base + shpool->size - shpool->avail); - shpool->avail -= size; - - return buffer; -} -#endif /*!VIRTIO_SLAVE_ONLY*/ - -void rpmsg_virtio_init_shm_pool(struct rpmsg_virtio_shm_pool *shpool, - void *shb, size_t size) -{ - if (!shpool) - return; - shpool->base = shb; - shpool->size = WORD_ALIGN(size); - shpool->avail = WORD_ALIGN(size); -} - -/** - * rpmsg_virtio_return_buffer - * - * Places the used buffer back on the virtqueue. - * - * @param rvdev - pointer to remote core - * @param buffer - buffer pointer - * @param len - buffer length - * @param idx - buffer index - * - */ -static void rpmsg_virtio_return_buffer(struct rpmsg_virtio_device *rvdev, - void *buffer, unsigned long len, - unsigned short idx) -{ - unsigned int role = rpmsg_virtio_get_role(rvdev); -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - struct virtqueue_buf vqbuf; - - (void)idx; - /* Initialize buffer node */ - vqbuf.buf = buffer; - vqbuf.len = len; - virtqueue_add_buffer(rvdev->rvq, &vqbuf, 0, 1, buffer); - } -#endif /*VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - (void)buffer; - virtqueue_add_consumed_buffer(rvdev->rvq, idx, len); - } -#endif /*VIRTIO_MASTER_ONLY*/ -} - -/** - * rpmsg_virtio_enqueue_buffer - * - * Places buffer on the virtqueue for consumption by the other side. - * - * @param rvdev - pointer to rpmsg virtio - * @param buffer - buffer pointer - * @param len - buffer length - * @param idx - buffer index - * - * @return - status of function execution - */ -static int rpmsg_virtio_enqueue_buffer(struct rpmsg_virtio_device *rvdev, - void *buffer, unsigned long len, - unsigned short idx) -{ - unsigned int role = rpmsg_virtio_get_role(rvdev); -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - struct virtqueue_buf vqbuf; - (void)idx; - - /* Initialize buffer node */ - vqbuf.buf = buffer; - vqbuf.len = len; - return virtqueue_add_buffer(rvdev->svq, &vqbuf, 0, 1, buffer); - } -#endif /*!VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - (void)buffer; - return virtqueue_add_consumed_buffer(rvdev->svq, idx, len); - } -#endif /*!VIRTIO_MASTER_ONLY*/ - return 0; -} - -/** - * rpmsg_virtio_get_tx_buffer - * - * Provides buffer to transmit messages. - * - * @param rvdev - pointer to rpmsg device - * @param len - length of returned buffer - * @param idx - buffer index - * - * return - pointer to buffer. - */ -static void *rpmsg_virtio_get_tx_buffer(struct rpmsg_virtio_device *rvdev, - unsigned long *len, - unsigned short *idx) -{ - unsigned int role = rpmsg_virtio_get_role(rvdev); - void *data = NULL; - -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - data = virtqueue_get_buffer(rvdev->svq, (uint32_t *)len, idx); - if (data == NULL) { - data = rpmsg_virtio_shm_pool_get_buffer(rvdev->shpool, - RPMSG_BUFFER_SIZE); - *len = RPMSG_BUFFER_SIZE; - } - } -#endif /*!VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - data = virtqueue_get_available_buffer(rvdev->svq, idx, - (uint32_t *)len); - } -#endif /*!VIRTIO_MASTER_ONLY*/ - - return data; -} - -/** - * rpmsg_virtio_get_rx_buffer - * - * Retrieves the received buffer from the virtqueue. - * - * @param rvdev - pointer to rpmsg device - * @param len - size of received buffer - * @param idx - index of buffer - * - * @return - pointer to received buffer - * - */ -static void *rpmsg_virtio_get_rx_buffer(struct rpmsg_virtio_device *rvdev, - unsigned long *len, - unsigned short *idx) -{ - unsigned int role = rpmsg_virtio_get_role(rvdev); - void *data = NULL; - -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - data = virtqueue_get_buffer(rvdev->rvq, (uint32_t *)len, idx); - } -#endif /*!VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - data = - virtqueue_get_available_buffer(rvdev->rvq, idx, - (uint32_t *)len); - } -#endif /*!VIRTIO_MASTER_ONLY*/ - - if (data) { - /* FIX ME: library should not worry about if it needs - * to flush/invalidate cache, it is shared memory. - * The shared memory should be mapped properly before - * using it. - */ - metal_cache_invalidate(data, (unsigned int)(*len)); - } - - return data; -} - -#ifndef VIRTIO_MASTER_ONLY -/** - * check if the remote is ready to start RPMsg communication - */ -static int rpmsg_virtio_wait_remote_ready(struct rpmsg_virtio_device *rvdev) -{ - uint8_t status; - - while (1) { - status = rpmsg_virtio_get_status(rvdev); - /* Busy wait until the remote is ready */ - if (status & VIRTIO_CONFIG_STATUS_NEEDS_RESET) { - rpmsg_virtio_set_status(rvdev, 0); - /* TODO notify remote processor */ - } else if (status & VIRTIO_CONFIG_STATUS_DRIVER_OK) { - return true; - } - /* TODO: clarify metal_cpu_yield usage*/ - metal_cpu_yield(); - } - - return false; -} -#endif /*!VIRTIO_MASTER_ONLY*/ - -/** - * _rpmsg_virtio_get_buffer_size - * - * Returns buffer size available for sending messages. - * - * @param channel - pointer to rpmsg channel - * - * @return - buffer size - * - */ -static int _rpmsg_virtio_get_buffer_size(struct rpmsg_virtio_device *rvdev) -{ - unsigned int role = rpmsg_virtio_get_role(rvdev); - int length = 0; - -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - /* - * If device role is Remote then buffers are provided by us - * (RPMSG Master), so just provide the macro. - */ - length = RPMSG_BUFFER_SIZE - sizeof(struct rpmsg_hdr); - } -#endif /*!VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - /* - * If other core is Master then buffers are provided by it, - * so get the buffer size from the virtqueue. - */ - length = - (int)virtqueue_get_desc_size(rvdev->svq) - - sizeof(struct rpmsg_hdr); - } -#endif /*!VIRTIO_MASTER_ONLY*/ - - return length; -} - -/** - * This function sends rpmsg "message" to remote device. - * - * @param rdev - pointer to rpmsg device - * @param src - source address of channel - * @param dst - destination address of channel - * @param data - data to transmit - * @param size - size of data - * @param wait - boolean, wait or not for buffer to become - * available - * - * @return - size of data sent or negative value for failure. - * - */ -static int rpmsg_virtio_send_offchannel_raw(struct rpmsg_device *rdev, - uint32_t src, uint32_t dst, - const void *data, - int size, int wait) -{ - struct rpmsg_virtio_device *rvdev; - struct rpmsg_hdr rp_hdr; - void *buffer = NULL; - unsigned short idx; - int tick_count = 0; - unsigned long buff_len; - int status; - struct metal_io_region *io; - - /* Get the associated remote device for channel. */ - rvdev = metal_container_of(rdev, struct rpmsg_virtio_device, rdev); - - status = rpmsg_virtio_get_status(rvdev); - /* Validate device state */ - if (!(status & VIRTIO_CONFIG_STATUS_DRIVER_OK)) { - return RPMSG_ERR_DEV_STATE; - } - - if (wait) - tick_count = RPMSG_TICK_COUNT / RPMSG_TICKS_PER_INTERVAL; - else - tick_count = 0; - - while (1) { - int avail_size; - - /* Lock the device to enable exclusive access to virtqueues */ - metal_mutex_acquire(&rdev->lock); - avail_size = _rpmsg_virtio_get_buffer_size(rvdev); - if (size <= avail_size) - buffer = rpmsg_virtio_get_tx_buffer(rvdev, &buff_len, - &idx); - metal_mutex_release(&rdev->lock); - if (buffer || !tick_count) - break; - if (avail_size != 0) - return RPMSG_ERR_BUFF_SIZE; - metal_sleep_usec(RPMSG_TICKS_PER_INTERVAL); - tick_count--; - } - if (!buffer) - return RPMSG_ERR_NO_BUFF; - - /* Initialize RPMSG header. */ - rp_hdr.dst = dst; - rp_hdr.src = src; - rp_hdr.len = size; - rp_hdr.reserved = 0; - - /* Copy data to rpmsg buffer. */ - io = rvdev->shbuf_io; - status = metal_io_block_write(io, metal_io_virt_to_offset(io, buffer), - &rp_hdr, sizeof(rp_hdr)); - RPMSG_ASSERT(status == sizeof(rp_hdr), "failed to write header\n"); - - status = metal_io_block_write(io, - metal_io_virt_to_offset(io, - RPMSG_LOCATE_DATA(buffer)), - data, size); - RPMSG_ASSERT(status == size, "failed to write buffer\n"); - metal_mutex_acquire(&rdev->lock); - - /* Enqueue buffer on virtqueue. */ - status = rpmsg_virtio_enqueue_buffer(rvdev, buffer, buff_len, idx); - RPMSG_ASSERT(status == VQUEUE_SUCCESS, "failed to enqueue buffer\n"); - /* Let the other side know that there is a job to process. */ - virtqueue_kick(rvdev->svq); - - metal_mutex_release(&rdev->lock); - - return size; -} - -/** - * rpmsg_virtio_tx_callback - * - * Tx callback function. - * - * @param vq - pointer to virtqueue on which Tx is has been - * completed. - * - */ -static void rpmsg_virtio_tx_callback(struct virtqueue *vq) -{ - (void)vq; -} - -/** - * rpmsg_virtio_rx_callback - * - * Rx callback function. - * - * @param vq - pointer to virtqueue on which messages is received - * - */ -static void rpmsg_virtio_rx_callback(struct virtqueue *vq) -{ - struct virtio_device *vdev = vq->vq_dev; - struct rpmsg_virtio_device *rvdev = vdev->priv; - struct rpmsg_device *rdev = &rvdev->rdev; - struct rpmsg_endpoint *ept; - struct rpmsg_hdr *rp_hdr; - unsigned long len; - unsigned short idx; - int status; - - metal_mutex_acquire(&rdev->lock); - - /* Process the received data from remote node */ - rp_hdr = (struct rpmsg_hdr *)rpmsg_virtio_get_rx_buffer(rvdev, - &len, &idx); - - metal_mutex_release(&rdev->lock); - - while (rp_hdr) { - /* Get the channel node from the remote device channels list. */ - metal_mutex_acquire(&rdev->lock); - ept = rpmsg_get_ept_from_addr(rdev, rp_hdr->dst); - metal_mutex_release(&rdev->lock); - - if (!ept) - /* Fatal error no endpoint for the given dst addr. */ - return; - - if (ept->dest_addr == RPMSG_ADDR_ANY) { - /* - * First message received from the remote side, - * update channel destination address - */ - ept->dest_addr = rp_hdr->src; - } - status = ept->cb(ept, (void *)RPMSG_LOCATE_DATA(rp_hdr), - rp_hdr->len, ept->addr, ept->priv); - - RPMSG_ASSERT(status == RPMSG_SUCCESS, - "unexpected callback status\n"); - metal_mutex_acquire(&rdev->lock); - - /* Return used buffers. */ - rpmsg_virtio_return_buffer(rvdev, rp_hdr, len, idx); - - rp_hdr = (struct rpmsg_hdr *) - rpmsg_virtio_get_rx_buffer(rvdev, &len, &idx); - metal_mutex_release(&rdev->lock); - } -} - -/** - * rpmsg_virtio_ns_callback - * - * This callback handles name service announcement from the remote device - * and creates/deletes rpmsg channels. - * - * @param server_chnl - pointer to server channel control block. - * @param data - pointer to received messages - * @param len - length of received data - * @param priv - any private data - * @param src - source address - * - * @return - rpmag endpoint callback handled - */ -static int rpmsg_virtio_ns_callback(struct rpmsg_endpoint *ept, void *data, - size_t len, uint32_t src, void *priv) -{ - struct rpmsg_device *rdev = ept->rdev; - struct rpmsg_virtio_device *rvdev = (struct rpmsg_virtio_device *)rdev; - struct metal_io_region *io = rvdev->shbuf_io; - struct rpmsg_endpoint *_ept; - struct rpmsg_ns_msg *ns_msg; - uint32_t dest; - char name[RPMSG_NAME_SIZE]; - - (void)priv; - (void)src; - - ns_msg = (struct rpmsg_ns_msg *)data; - if (len != sizeof(*ns_msg)) - /* Returns as the message is corrupted */ - return RPMSG_SUCCESS; - metal_io_block_read(io, - metal_io_virt_to_offset(io, ns_msg->name), - &name, sizeof(name)); - dest = ns_msg->addr; - - /* check if a Ept has been locally registered */ - metal_mutex_acquire(&rdev->lock); - _ept = rpmsg_get_endpoint(rdev, name, RPMSG_ADDR_ANY, dest); - - if (ns_msg->flags & RPMSG_NS_DESTROY) { - if (_ept) - _ept->dest_addr = RPMSG_ADDR_ANY; - metal_mutex_release(&rdev->lock); - if (_ept && _ept->ns_unbind_cb) - _ept->ns_unbind_cb(ept); - } else { - if (!_ept) { - /* - * send callback to application, that can - * - create the associated endpoints. - * - store information for future use. - * - just ignore the request as service not supported. - */ - metal_mutex_release(&rdev->lock); - if (rdev->ns_bind_cb) - rdev->ns_bind_cb(rdev, name, dest); - } else { - _ept->dest_addr = dest; - metal_mutex_release(&rdev->lock); - } - } - - return RPMSG_SUCCESS; -} - -int rpmsg_virtio_get_buffer_size(struct rpmsg_device *rdev) -{ - int size; - struct rpmsg_virtio_device *rvdev; - - if (!rdev) - return RPMSG_ERR_PARAM; - metal_mutex_acquire(&rdev->lock); - rvdev = (struct rpmsg_virtio_device *)rdev; - size = _rpmsg_virtio_get_buffer_size(rvdev); - metal_mutex_release(&rdev->lock); - return size; -} - -int rpmsg_init_vdev(struct rpmsg_virtio_device *rvdev, - struct virtio_device *vdev, - rpmsg_ns_bind_cb ns_bind_cb, - struct metal_io_region *shm_io, - struct rpmsg_virtio_shm_pool *shpool) -{ - struct rpmsg_device *rdev; - const char *vq_names[RPMSG_NUM_VRINGS]; - typedef void (*vqcallback)(struct virtqueue *vq); - vqcallback callback[RPMSG_NUM_VRINGS]; - unsigned long dev_features; - int status; - unsigned int i, role; - - rdev = &rvdev->rdev; - memset(rdev, 0, sizeof(*rdev)); - metal_mutex_init(&rdev->lock); - rvdev->vdev = vdev; - rdev->ns_bind_cb = ns_bind_cb; - vdev->priv = rvdev; - rdev->ops.send_offchannel_raw = rpmsg_virtio_send_offchannel_raw; - role = rpmsg_virtio_get_role(rvdev); - -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - /* - * Since device is RPMSG Remote so we need to manage the - * shared buffers. Create shared memory pool to handle buffers. - */ - if (!shpool) - return RPMSG_ERR_PARAM; - if (!shpool->size) - return RPMSG_ERR_NO_BUFF; - rvdev->shpool = shpool; - - vq_names[0] = "rx_vq"; - vq_names[1] = "tx_vq"; - callback[0] = rpmsg_virtio_rx_callback; - callback[1] = rpmsg_virtio_tx_callback; - rvdev->rvq = vdev->vrings_info[0].vq; - rvdev->svq = vdev->vrings_info[1].vq; - } -#endif /*!VIRTIO_SLAVE_ONLY*/ - -#ifndef VIRTIO_MASTER_ONLY - (void)shpool; - if (role == RPMSG_REMOTE) { - vq_names[0] = "tx_vq"; - vq_names[1] = "rx_vq"; - callback[0] = rpmsg_virtio_tx_callback; - callback[1] = rpmsg_virtio_rx_callback; - rvdev->rvq = vdev->vrings_info[1].vq; - rvdev->svq = vdev->vrings_info[0].vq; - } -#endif /*!VIRTIO_MASTER_ONLY*/ - rvdev->shbuf_io = shm_io; - -#ifndef VIRTIO_MASTER_ONLY - if (role == RPMSG_REMOTE) { - /* wait synchro with the master */ - rpmsg_virtio_wait_remote_ready(rvdev); - } -#endif /*!VIRTIO_MASTER_ONLY*/ - - /* Create virtqueues for remote device */ - status = rpmsg_virtio_create_virtqueues(rvdev, 0, RPMSG_NUM_VRINGS, - vq_names, callback); - if (status != RPMSG_SUCCESS) - return status; - - /* TODO: can have a virtio function to set the shared memory I/O */ - for (i = 0; i < RPMSG_NUM_VRINGS; i++) { - struct virtqueue *vq; - - vq = vdev->vrings_info[i].vq; - vq->shm_io = shm_io; - } - -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) { - struct virtqueue_buf vqbuf; - unsigned int idx; - void *buffer; - - vqbuf.len = RPMSG_BUFFER_SIZE; - for (idx = 0; idx < rvdev->rvq->vq_nentries; idx++) { - /* Initialize TX virtqueue buffers for remote device */ - buffer = rpmsg_virtio_shm_pool_get_buffer(shpool, - RPMSG_BUFFER_SIZE); - - if (!buffer) { - return RPMSG_ERR_NO_BUFF; - } - - vqbuf.buf = buffer; - - metal_io_block_set(shm_io, - metal_io_virt_to_offset(shm_io, - buffer), - 0x00, RPMSG_BUFFER_SIZE); - status = - virtqueue_add_buffer(rvdev->rvq, &vqbuf, 0, 1, - buffer); - - if (status != RPMSG_SUCCESS) { - return status; - } - } - } -#endif /*!VIRTIO_SLAVE_ONLY*/ - - /* Initialize channels and endpoints list */ - metal_list_init(&rdev->endpoints); - - dev_features = rpmsg_virtio_get_features(rvdev); - - /* - * Create name service announcement endpoint if device supports name - * service announcement feature. - */ - if ((dev_features & (1 << VIRTIO_RPMSG_F_NS))) { - rpmsg_init_ept(&rdev->ns_ept, "NS", - RPMSG_NS_EPT_ADDR, RPMSG_NS_EPT_ADDR, - rpmsg_virtio_ns_callback, NULL); - (void)rpmsg_register_endpoint(rdev, &rdev->ns_ept); - } - -#ifndef VIRTIO_SLAVE_ONLY - if (role == RPMSG_MASTER) - rpmsg_virtio_set_status(rvdev, VIRTIO_CONFIG_STATUS_DRIVER_OK); -#endif /*!VIRTIO_SLAVE_ONLY*/ - - return status; -} - -void rpmsg_deinit_vdev(struct rpmsg_virtio_device *rvdev) -{ - struct metal_list *node; - struct rpmsg_device *rdev; - struct rpmsg_endpoint *ept; - - rdev = &rvdev->rdev; - while (!metal_list_is_empty(&rdev->endpoints)) { - node = rdev->endpoints.next; - ept = metal_container_of(node, struct rpmsg_endpoint, node); - rpmsg_destroy_ept(ept); - } - - rvdev->rvq = 0; - rvdev->svq = 0; - - metal_mutex_deinit(&rdev->lock); -} diff --git a/ext/lib/ipc/open-amp/open-amp/lib/virtio/CMakeLists.txt b/ext/lib/ipc/open-amp/open-amp/lib/virtio/CMakeLists.txt deleted file mode 100644 index 0497514b90..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/virtio/CMakeLists.txt +++ /dev/null @@ -1,2 +0,0 @@ -collect (PROJECT_LIB_SOURCES virtio.c) -collect (PROJECT_LIB_SOURCES virtqueue.c) diff --git a/ext/lib/ipc/open-amp/open-amp/lib/virtio/virtio.c b/ext/lib/ipc/open-amp/open-amp/lib/virtio/virtio.c deleted file mode 100644 index 5cf87222b6..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/virtio/virtio.c +++ /dev/null @@ -1,121 +0,0 @@ -/*- - * Copyright (c) 2011, Bryan Venteicher - * All rights reserved. - * - * SPDX-License-Identifier: BSD-2-Clause - */ -#include - -static const char *virtio_feature_name(unsigned long feature, - const struct virtio_feature_desc *); - -//TODO : This structure may change depending on the types of devices we support. -static const struct virtio_ident { - unsigned short devid; - const char *name; -} virtio_ident_table[] = { - { - VIRTIO_ID_NETWORK, "Network"}, { - VIRTIO_ID_BLOCK, "Block"}, { - VIRTIO_ID_CONSOLE, "Console"}, { - VIRTIO_ID_ENTROPY, "Entropy"}, { - VIRTIO_ID_BALLOON, "Balloon"}, { - VIRTIO_ID_IOMEMORY, "IOMemory"}, { - VIRTIO_ID_SCSI, "SCSI"}, { - VIRTIO_ID_9P, "9P Transport"}, { - 0, NULL} -}; - -/* Device independent features. */ -static const struct virtio_feature_desc virtio_common_feature_desc[] = { - {VIRTIO_F_NOTIFY_ON_EMPTY, "NotifyOnEmpty"}, - {VIRTIO_RING_F_INDIRECT_DESC, "RingIndirect"}, - {VIRTIO_RING_F_EVENT_IDX, "EventIdx"}, - {VIRTIO_F_BAD_FEATURE, "BadFeature"}, - - {0, NULL} -}; - -const char *virtio_dev_name(unsigned short devid) -{ - const struct virtio_ident *ident; - - for (ident = virtio_ident_table; ident->name != NULL; ident++) { - if (ident->devid == devid) - return (ident->name); - } - - return (NULL); -} - -static const char *virtio_feature_name(unsigned long val, - const struct virtio_feature_desc *desc) -{ - int i, j; - const struct virtio_feature_desc *descs[2] = { desc, - virtio_common_feature_desc - }; - - for (i = 0; i < 2; i++) { - if (!descs[i]) - continue; - - for (j = 0; descs[i][j].vfd_val != 0; j++) { - if (val == descs[i][j].vfd_val) - return (descs[i][j].vfd_str); - } - } - - return (NULL); -} - -void virtio_describe(struct virtio_device *dev, const char *msg, - uint32_t features, struct virtio_feature_desc *desc) -{ - (void)dev; - (void)msg; - (void)features; - - // TODO: Not used currently - keeping it for future use - virtio_feature_name(0, desc); -} - -int virtio_create_virtqueues(struct virtio_device *vdev, unsigned int flags, - unsigned int nvqs, const char *names[], - vq_callback *callbacks[]) -{ - struct virtio_vring_info *vring_info; - struct vring_alloc_info *vring_alloc; - unsigned int num_vrings, i; - int ret; - (void)flags; - - num_vrings = vdev->vrings_num; - if (nvqs > num_vrings) - return -ERROR_VQUEUE_INVLD_PARAM; - /* Initialize virtqueue for each vring */ - for (i = 0; i < nvqs; i++) { - vring_info = &vdev->vrings_info[i]; - - vring_alloc = &vring_info->info; -#ifndef VIRTIO_SLAVE_ONLY - if (vdev->role == VIRTIO_DEV_MASTER) { - size_t offset; - struct metal_io_region *io = vring_info->io; - - offset = metal_io_virt_to_offset(io, - vring_alloc->vaddr); - metal_io_block_set(io, offset, 0, - vring_size(vring_alloc->num_descs, - vring_alloc->align)); - } -#endif - ret = virtqueue_create(vdev, i, names[i], vring_alloc, - callbacks[i], vdev->func->notify, - vring_info->vq); - if (ret) - return ret; - } - return 0; -} - diff --git a/ext/lib/ipc/open-amp/open-amp/lib/virtio/virtqueue.c b/ext/lib/ipc/open-amp/open-amp/lib/virtio/virtqueue.c deleted file mode 100644 index e90a6940b0..0000000000 --- a/ext/lib/ipc/open-amp/open-amp/lib/virtio/virtqueue.c +++ /dev/null @@ -1,618 +0,0 @@ -/*- - * Copyright (c) 2011, Bryan Venteicher - * All rights reserved. - * - * SPDX-License-Identifier: BSD-2-Clause - */ - -#include -#include -#include -#include -#include - -/* Prototype for internal functions. */ -static void vq_ring_init(struct virtqueue *, void *, int); -static void vq_ring_update_avail(struct virtqueue *, uint16_t); -static uint16_t vq_ring_add_buffer(struct virtqueue *, struct vring_desc *, - uint16_t, struct virtqueue_buf *, int, int); -static int vq_ring_enable_interrupt(struct virtqueue *, uint16_t); -static void vq_ring_free_chain(struct virtqueue *, uint16_t); -static int vq_ring_must_notify_host(struct virtqueue *vq); -static void vq_ring_notify_host(struct virtqueue *vq); -static int virtqueue_nused(struct virtqueue *vq); - -/* Default implementation of P2V based on libmetal */ -static inline void *virtqueue_phys_to_virt(struct virtqueue *vq, - metal_phys_addr_t phys) -{ - struct metal_io_region *io = vq->shm_io; - - return metal_io_phys_to_virt(io, phys); -} - -/* Default implementation of V2P based on libmetal */ -static inline metal_phys_addr_t virtqueue_virt_to_phys(struct virtqueue *vq, - void *buf) -{ - struct metal_io_region *io = vq->shm_io; - - return metal_io_virt_to_phys(io, buf); -} - -/** - * virtqueue_create - Creates new VirtIO queue - * - * @param device - Pointer to VirtIO device - * @param id - VirtIO queue ID , must be unique - * @param name - Name of VirtIO queue - * @param ring - Pointer to vring_alloc_info control block - * @param callback - Pointer to callback function, invoked - * when message is available on VirtIO queue - * @param notify - Pointer to notify function, used to notify - * other side that there is job available for it - * @param vq - Created VirtIO queue. - * - * @return - Function status - */ -int virtqueue_create(struct virtio_device *virt_dev, unsigned short id, - const char *name, struct vring_alloc_info *ring, - void (*callback)(struct virtqueue *vq), - void (*notify)(struct virtqueue *vq), - struct virtqueue *vq) -{ - int status = VQUEUE_SUCCESS; - - VQ_PARAM_CHK(ring == NULL, status, ERROR_VQUEUE_INVLD_PARAM); - VQ_PARAM_CHK(ring->num_descs == 0, status, ERROR_VQUEUE_INVLD_PARAM); - VQ_PARAM_CHK(ring->num_descs & (ring->num_descs - 1), status, - ERROR_VRING_ALIGN); - VQ_PARAM_CHK(vq == NULL, status, ERROR_NO_MEM); - - if (status == VQUEUE_SUCCESS) { - vq->vq_dev = virt_dev; - vq->vq_name = name; - vq->vq_queue_index = id; - vq->vq_nentries = ring->num_descs; - vq->vq_free_cnt = vq->vq_nentries; - vq->callback = callback; - vq->notify = notify; - - /* Initialize vring control block in virtqueue. */ - vq_ring_init(vq, (void *)ring->vaddr, ring->align); - - /* Disable callbacks - will be enabled by the application - * once initialization is completed. - */ - virtqueue_disable_cb(vq); - } - - return (status); -} - -/** - * virtqueue_add_buffer() - Enqueues new buffer in vring for consumption - * by other side. Readable buffers are always - * inserted before writable buffers - * - * @param vq - Pointer to VirtIO queue control block. - * @param buf_list - Pointer to a list of virtqueue buffers. - * @param readable - Number of readable buffers - * @param writable - Number of writable buffers - * @param cookie - Pointer to hold call back data - * - * @return - Function status - */ -int virtqueue_add_buffer(struct virtqueue *vq, struct virtqueue_buf *buf_list, - int readable, int writable, void *cookie) -{ - struct vq_desc_extra *dxp = NULL; - int status = VQUEUE_SUCCESS; - uint16_t head_idx; - uint16_t idx; - int needed; - - needed = readable + writable; - - VQ_PARAM_CHK(vq == NULL, status, ERROR_VQUEUE_INVLD_PARAM); - VQ_PARAM_CHK(needed < 1, status, ERROR_VQUEUE_INVLD_PARAM); - VQ_PARAM_CHK(vq->vq_free_cnt == 0, status, ERROR_VRING_FULL); - - VQUEUE_BUSY(vq); - - if (status == VQUEUE_SUCCESS) { - VQASSERT(vq, cookie != NULL, "enqueuing with no cookie"); - - head_idx = vq->vq_desc_head_idx; - VQ_RING_ASSERT_VALID_IDX(vq, head_idx); - dxp = &vq->vq_descx[head_idx]; - - VQASSERT(vq, dxp->cookie == NULL, - "cookie already exists for index"); - - dxp->cookie = cookie; - dxp->ndescs = needed; - - /* Enqueue buffer onto the ring. */ - idx = vq_ring_add_buffer(vq, vq->vq_ring.desc, head_idx, - buf_list, readable, writable); - - vq->vq_desc_head_idx = idx; - vq->vq_free_cnt -= needed; - - if (vq->vq_free_cnt == 0) { - VQ_RING_ASSERT_CHAIN_TERM(vq); - } else { - VQ_RING_ASSERT_VALID_IDX(vq, idx); - } - - /* - * Update vring_avail control block fields so that other - * side can get buffer using it. - */ - vq_ring_update_avail(vq, head_idx); - } - - VQUEUE_IDLE(vq); - - return status; -} - -/** - * virtqueue_get_buffer - Returns used buffers from VirtIO queue - * - * @param vq - Pointer to VirtIO queue control block - * @param len - Length of conumed buffer - * @param idx - index of the buffer - * - * @return - Pointer to used buffer - */ -void *virtqueue_get_buffer(struct virtqueue *vq, uint32_t *len, uint16_t *idx) -{ - struct vring_used_elem *uep; - void *cookie; - uint16_t used_idx, desc_idx; - - if (!vq || vq->vq_used_cons_idx == vq->vq_ring.used->idx) - return (NULL); - - VQUEUE_BUSY(vq); - - used_idx = vq->vq_used_cons_idx++ & (vq->vq_nentries - 1); - uep = &vq->vq_ring.used->ring[used_idx]; - - atomic_thread_fence(memory_order_seq_cst); - - desc_idx = (uint16_t)uep->id; - if (len) - *len = uep->len; - - vq_ring_free_chain(vq, desc_idx); - - cookie = vq->vq_descx[desc_idx].cookie; - vq->vq_descx[desc_idx].cookie = NULL; - - if (idx) - *idx = used_idx; - VQUEUE_IDLE(vq); - - return cookie; -} - -uint32_t virtqueue_get_buffer_length(struct virtqueue *vq, uint16_t idx) -{ - return vq->vq_ring.desc[idx].len; -} - -/** - * virtqueue_free - Frees VirtIO queue resources - * - * @param vq - Pointer to VirtIO queue control block - * - */ -void virtqueue_free(struct virtqueue *vq) -{ - if (vq) { - if (vq->vq_free_cnt != vq->vq_nentries) { - metal_log(METAL_LOG_WARNING, - "%s: freeing non-empty virtqueue\r\n", - vq->vq_name); - } - - metal_free_memory(vq); - } -} - -/** - * virtqueue_get_available_buffer - Returns buffer available for use in the - * VirtIO queue - * - * @param vq - Pointer to VirtIO queue control block - * @param avail_idx - Pointer to index used in vring desc table - * @param len - Length of buffer - * - * @return - Pointer to available buffer - */ -void *virtqueue_get_available_buffer(struct virtqueue *vq, uint16_t *avail_idx, - uint32_t *len) -{ - uint16_t head_idx = 0; - void *buffer; - - atomic_thread_fence(memory_order_seq_cst); - if (vq->vq_available_idx == vq->vq_ring.avail->idx) { - return NULL; - } - - VQUEUE_BUSY(vq); - - head_idx = vq->vq_available_idx++ & (vq->vq_nentries - 1); - *avail_idx = vq->vq_ring.avail->ring[head_idx]; - - buffer = virtqueue_phys_to_virt(vq, vq->vq_ring.desc[*avail_idx].addr); - *len = vq->vq_ring.desc[*avail_idx].len; - - VQUEUE_IDLE(vq); - - return buffer; -} - -/** - * virtqueue_add_consumed_buffer - Returns consumed buffer back to VirtIO queue - * - * @param vq - Pointer to VirtIO queue control block - * @param head_idx - Index of vring desc containing used buffer - * @param len - Length of buffer - * - * @return - Function status - */ -int virtqueue_add_consumed_buffer(struct virtqueue *vq, uint16_t head_idx, - uint32_t len) -{ - struct vring_used_elem *used_desc = NULL; - uint16_t used_idx; - - if (head_idx > vq->vq_nentries) { - return ERROR_VRING_NO_BUFF; - } - - VQUEUE_BUSY(vq); - - used_idx = vq->vq_ring.used->idx & (vq->vq_nentries - 1); - used_desc = &vq->vq_ring.used->ring[used_idx]; - used_desc->id = head_idx; - used_desc->len = len; - - atomic_thread_fence(memory_order_seq_cst); - - vq->vq_ring.used->idx++; - - VQUEUE_IDLE(vq); - - return VQUEUE_SUCCESS; -} - -/** - * virtqueue_enable_cb - Enables callback generation - * - * @param vq - Pointer to VirtIO queue control block - * - * @return - Function status - */ -int virtqueue_enable_cb(struct virtqueue *vq) -{ - return vq_ring_enable_interrupt(vq, 0); -} - -/** - * virtqueue_enable_cb - Disables callback generation - * - * @param vq - Pointer to VirtIO queue control block - * - */ -void virtqueue_disable_cb(struct virtqueue *vq) -{ - VQUEUE_BUSY(vq); - - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) { - vring_used_event(&vq->vq_ring) = - vq->vq_used_cons_idx - vq->vq_nentries - 1; - } else { - vq->vq_ring.avail->flags |= VRING_AVAIL_F_NO_INTERRUPT; - } - - VQUEUE_IDLE(vq); -} - -/** - * virtqueue_kick - Notifies other side that there is buffer available for it. - * - * @param vq - Pointer to VirtIO queue control block - */ -void virtqueue_kick(struct virtqueue *vq) -{ - VQUEUE_BUSY(vq); - - /* Ensure updated avail->idx is visible to host. */ - atomic_thread_fence(memory_order_seq_cst); - - if (vq_ring_must_notify_host(vq)) - vq_ring_notify_host(vq); - - vq->vq_queued_cnt = 0; - - VQUEUE_IDLE(vq); -} - -/** - * virtqueue_dump Dumps important virtqueue fields , use for debugging purposes - * - * @param vq - Pointer to VirtIO queue control block - */ -void virtqueue_dump(struct virtqueue *vq) -{ - if (!vq) - return; - - metal_log(METAL_LOG_DEBUG, - "VQ: %s - size=%d; free=%d; used=%d; queued=%d; " - "desc_head_idx=%d; avail.idx=%d; used_cons_idx=%d; " - "used.idx=%d; avail.flags=0x%x; used.flags=0x%x\r\n", - vq->vq_name, vq->vq_nentries, vq->vq_free_cnt, - virtqueue_nused(vq), vq->vq_queued_cnt, vq->vq_desc_head_idx, - vq->vq_ring.avail->idx, vq->vq_used_cons_idx, - vq->vq_ring.used->idx, vq->vq_ring.avail->flags, - vq->vq_ring.used->flags); -} - -/** - * virtqueue_get_desc_size - Returns vring descriptor size - * - * @param vq - Pointer to VirtIO queue control block - * - * @return - Descriptor length - */ -uint32_t virtqueue_get_desc_size(struct virtqueue *vq) -{ - uint16_t head_idx = 0; - uint16_t avail_idx = 0; - uint32_t len = 0; - - if (vq->vq_available_idx == vq->vq_ring.avail->idx) { - return 0; - } - - VQUEUE_BUSY(vq); - - head_idx = vq->vq_available_idx & (vq->vq_nentries - 1); - avail_idx = vq->vq_ring.avail->ring[head_idx]; - len = vq->vq_ring.desc[avail_idx].len; - - VQUEUE_IDLE(vq); - - return len; -} - -/************************************************************************** - * Helper Functions * - **************************************************************************/ - -/** - * - * vq_ring_add_buffer - * - */ -static uint16_t vq_ring_add_buffer(struct virtqueue *vq, - struct vring_desc *desc, uint16_t head_idx, - struct virtqueue_buf *buf_list, int readable, - int writable) -{ - struct vring_desc *dp; - int i, needed; - uint16_t idx; - - (void)vq; - - needed = readable + writable; - - for (i = 0, idx = head_idx; i < needed; i++, idx = dp->next) { - VQASSERT(vq, idx != VQ_RING_DESC_CHAIN_END, - "premature end of free desc chain"); - - dp = &desc[idx]; - dp->addr = virtqueue_virt_to_phys(vq, buf_list[i].buf); - dp->len = buf_list[i].len; - dp->flags = 0; - - if (i < needed - 1) - dp->flags |= VRING_DESC_F_NEXT; - - /* - * Readable buffers are inserted into vring before the - * writable buffers. - */ - if (i >= readable) - dp->flags |= VRING_DESC_F_WRITE; - } - - return (idx); -} - -/** - * - * vq_ring_free_chain - * - */ -static void vq_ring_free_chain(struct virtqueue *vq, uint16_t desc_idx) -{ - struct vring_desc *dp; - struct vq_desc_extra *dxp; - - VQ_RING_ASSERT_VALID_IDX(vq, desc_idx); - dp = &vq->vq_ring.desc[desc_idx]; - dxp = &vq->vq_descx[desc_idx]; - - if (vq->vq_free_cnt == 0) { - VQ_RING_ASSERT_CHAIN_TERM(vq); - } - - vq->vq_free_cnt += dxp->ndescs; - dxp->ndescs--; - - if ((dp->flags & VRING_DESC_F_INDIRECT) == 0) { - while (dp->flags & VRING_DESC_F_NEXT) { - VQ_RING_ASSERT_VALID_IDX(vq, dp->next); - dp = &vq->vq_ring.desc[dp->next]; - dxp->ndescs--; - } - } - - VQASSERT(vq, (dxp->ndescs == 0), - "failed to free entire desc chain, remaining"); - - /* - * We must append the existing free chain, if any, to the end of - * newly freed chain. If the virtqueue was completely used, then - * head would be VQ_RING_DESC_CHAIN_END (ASSERTed above). - */ - dp->next = vq->vq_desc_head_idx; - vq->vq_desc_head_idx = desc_idx; -} - -/** - * - * vq_ring_init - * - */ -static void vq_ring_init(struct virtqueue *vq, void *ring_mem, int alignment) -{ - struct vring *vr; - int i, size; - - size = vq->vq_nentries; - vr = &vq->vq_ring; - - vring_init(vr, size, (unsigned char *)ring_mem, alignment); - - for (i = 0; i < size - 1; i++) - vr->desc[i].next = i + 1; - vr->desc[i].next = VQ_RING_DESC_CHAIN_END; -} - -/** - * - * vq_ring_update_avail - * - */ -static void vq_ring_update_avail(struct virtqueue *vq, uint16_t desc_idx) -{ - uint16_t avail_idx; - - /* - * Place the head of the descriptor chain into the next slot and make - * it usable to the host. The chain is made available now rather than - * deferring to virtqueue_notify() in the hopes that if the host is - * currently running on another CPU, we can keep it processing the new - * descriptor. - */ - avail_idx = vq->vq_ring.avail->idx & (vq->vq_nentries - 1); - vq->vq_ring.avail->ring[avail_idx] = desc_idx; - - atomic_thread_fence(memory_order_seq_cst); - - vq->vq_ring.avail->idx++; - - /* Keep pending count until virtqueue_notify(). */ - vq->vq_queued_cnt++; -} - -/** - * - * vq_ring_enable_interrupt - * - */ -static int vq_ring_enable_interrupt(struct virtqueue *vq, uint16_t ndesc) -{ - /* - * Enable interrupts, making sure we get the latest index of - * what's already been consumed. - */ - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) { - vring_used_event(&vq->vq_ring) = vq->vq_used_cons_idx + ndesc; - } else { - vq->vq_ring.avail->flags &= ~VRING_AVAIL_F_NO_INTERRUPT; - } - - atomic_thread_fence(memory_order_seq_cst); - - /* - * Enough items may have already been consumed to meet our threshold - * since we last checked. Let our caller know so it processes the new - * entries. - */ - if (virtqueue_nused(vq) > ndesc) { - return 1; - } - - return 0; -} - -/** - * - * virtqueue_interrupt - * - */ -void virtqueue_notification(struct virtqueue *vq) -{ - atomic_thread_fence(memory_order_seq_cst); - if (vq->callback) - vq->callback(vq); -} - -/** - * - * vq_ring_must_notify_host - * - */ -static int vq_ring_must_notify_host(struct virtqueue *vq) -{ - uint16_t new_idx, prev_idx, event_idx; - - if (vq->vq_flags & VIRTQUEUE_FLAG_EVENT_IDX) { - new_idx = vq->vq_ring.avail->idx; - prev_idx = new_idx - vq->vq_queued_cnt; - event_idx = vring_avail_event(&vq->vq_ring); - - return (vring_need_event(event_idx, new_idx, prev_idx) != 0); - } - - return ((vq->vq_ring.used->flags & VRING_USED_F_NO_NOTIFY) == 0); -} - -/** - * - * vq_ring_notify_host - * - */ -static void vq_ring_notify_host(struct virtqueue *vq) -{ - if (vq->notify) - vq->notify(vq); -} - -/** - * - * virtqueue_nused - * - */ -static int virtqueue_nused(struct virtqueue *vq) -{ - uint16_t used_idx, nused; - - used_idx = vq->vq_ring.used->idx; - - nused = (uint16_t)(used_idx - vq->vq_used_cons_idx); - VQASSERT(vq, nused <= vq->vq_nentries, "used more than available"); - - return nused; -} diff --git a/west.yml b/west.yml index ad13cc4b56..1ce523029e 100644 --- a/west.yml +++ b/west.yml @@ -62,6 +62,9 @@ manifest: - name: nffs revision: bc62a2fa9d98ddb5d633c932ea199bc68e10f194 path: modules/fs/nffs + - name: open-amp + revision: 893b2a57e629cccb81282cec04b0385f3d49d871 + path: modules/lib/open-amp - name: segger revision: 6fcf61606d6012d2c44129edc033f59331e268bc path: modules/debug/segger