blob: dfe0fea75f10a26bd228bd68717029b6451c4882 [file] [log] [blame]
.. SPDX-License-Identifier: BSD-3-Clause
.. SPDX-FileCopyrightText: Copyright TF-RMM Contributors.
.. Custom color scheme for this document
.. raw:: html
<style> .comp {color:DarkMagenta} </style>
.. role:: comp
#####################################
RMM Folder and Component organization
#####################################
**********************************
Root Level Folders and Components
**********************************
The root level folder structure of the RMM project is as given below.
::
┌── cmake
├── configs
├── docs
├── drivers
├── ext
├── lib
├── plat
├── runtime
├── toolchains
└── tools
The RMM functionality is implemented by files in :comp:`lib`, :comp:`ext`,
:comp:`drivers`, :comp:`plat` and :comp:`runtime`. Each of these folders
corresponds to a :comp:`component` in the project. Every component has a
defined role in implementing the RMM functionality and can in-turn be
composed of sub-components of the same role. The components have
their own CMakelists.txt file and a defined public API which is
exported via the public interface of the component to its dependent
users. The :comp:`runtime` component is an exception as it does not
have a public API.
The dependency relationship between the top level components is shown
below :
|Dependency Diagram|
Each component and its role is described below :
* **lib** : This component is a library of re-usable and architectural
code which needs to be used by other components.
The :comp:`lib` component is composed of several sub-components
and every sub-component has a public API which is exported via its
public interface. The functionality implemented by the sub-component
is not platform specific although there could be specific static
configuration or platform specific data provided via defined public
interface. All of the sub-components in :comp:`lib` are combined into
a single archive file which is then included in the build.
The :comp:`lib` component depends on :comp:`ext` and :comp:`plat`
components. All other components in the project depend on :comp:`lib`.
* **ext** : This component is meant for external source dependencies of
the project. The sub folders are external open source projects configured
as git submodules. The :comp:`ext` component is only allowed to depend on
libc implementation in :comp:`lib` component.
* **plat** : This component implements the platform abstraction layer or
platform layer for short. The platform layer has the following
responsibilities:
#. Implement the platform porting API as defined in platform_api.h.
#. Do any necessary platform specific initialization in the platform layer.
#. Initialize :comp:`lib` sub-components with platform specific data.
#. Include any platform specific drivers from the :comp:`drivers` folder
and initialize them as necessary.
Every platform or a family of related platforms is expected to have a
folder in :comp:`plat` and only one such folder corresponding to the
platform will be included in the build. The :comp:`plat` component depends
on :comp:`lib` and any platform specific drivers in :comp:`drivers`.
* **drivers** : The platform specific drivers are implemented in this
component. Only the `plat` component is allowed to access these drivers
via its public interface.
* **runtime** : This component implements generic RMM functionality which
does not need to be shared across different components. The :comp:`runtime`
component does not have a public interface and is not a dependency for any
other component. The :comp:`runtime` is compiled into the binary
``rmm.img`` after linking with other components in the build.
**********************************
Component File and Cmake Structure
**********************************
The below figure shows the folder organization of a typical
component (or sub-component)
::
component x
├── include
| └── public.h
├── src
| ├── private_a.h
| └── src_a.c
├── tests
| └── test.cpp
└── CMakeLists.txt
The ``include`` folder contains the headers exposing the public API of the
component. The ``src`` contains the private headers and implementation
of the intended functionality. The ``tests`` contains the tests for the
component and the ``CMakeLists.txt`` defines the build and
inheritance rules.
A typical component ``CMakeLists.txt`` has the following structure :
.. code-block:: CMake
add_library(comp-x)
# Define any static config option for this component.
arm_config_option()
# Pass the config option to the source files as a compile
# option.
target_compile_definitions()
# Specify any private dependencies of the component. These are not
# inherited by child dependencies.
target_link_libraries(comp-x
PRIVATE xxx)
# Specify any private dependencies of the component. These are
# inherited by child dependencies and are usually included in
# public API header of the component.
target_link_libraries(comp-x
PUBLIC yyy)
# Export public API via public interface of this component
target_include_directories(comp-x
PUBLIC "include")
# Specify any private headers to be included for compilation
# of this component.
target_include_directories(comp-x
PRIVATE "src")
# Specify source files for component
target_sources(comp-x
PRIVATE xxx)
.. |Dependency Diagram| image:: ./diagrams/root_component_dependency.drawio.png